/* * decapi.c * * API entry points. */ #define ALLOC_VARS #include "decoder.h" #include #include #pragma intrinsic(memcpy) bool __stdcall LZX_DecodeInit( t_decoder_context **dec_context, long compression_window_size, PFNALLOC pfnma, HANDLE hAllocator ) { t_decoder_context *context= pfnma( hAllocator, sizeof( t_decoder_context )); if ( context == NULL ) { return false; } *dec_context = context; context->dec_malloc = pfnma; context->dec_mallochandle = hAllocator; context->dec_window_size = compression_window_size; context->dec_window_mask = context->dec_window_size - 1; /* * Window size must be a power of 2 */ if (context->dec_window_size & context->dec_window_mask) return false; if (allocate_decompression_memory(context) == false) return false; LZX_DecodeNewGroup(context); return true; } void __fastcall LZX_DecodeNewGroup(t_decoder_context *context) { reset_decoder_trees(context); decoder_misc_init(context); init_decoder_translation(context); context->dec_num_cfdata_frames = 0; } int __stdcall LZX_Decode( t_decoder_context *context, long bytes_to_decode, byte * compressed_input_buffer, long compressed_input_size, byte * uncompressed_output_buffer, long uncompressed_output_size, long * bytes_decoded ) { long result; context->dec_input_curpos = compressed_input_buffer; context->dec_end_input_pos = (compressed_input_buffer + compressed_input_size + 4); context->dec_output_buffer = uncompressed_output_buffer; init_decoder_input(context); result = decode_data(context, bytes_to_decode); context->dec_num_cfdata_frames++; if (result < 0) { *bytes_decoded = 0; return 1; /* failure */ } else { *bytes_decoded = result; context->dec_position_at_start += result; return 0; /* success */ } } // // Warning, this dictionary is inserted verbatim, and is not E8 // translated. If the encoder did E8 translation on its preloaded // dictionary, this won't work. // #ifdef TRACING ulong TracingOldDataSize; #endif #define ROUNDUP2( x, n ) ((((ULONG)(x)) + (((ULONG)(n)) - 1 )) & ~(((ULONG)(n)) - 1 )) bool __fastcall LZX_DecodeInsertDictionary( t_decoder_context * context, const byte * data, unsigned long data_size ) { if (data_size > context->dec_window_size) return false; #ifdef TRACING TracingOldDataSize = context->dec_window_size + ROUNDUP2( data_size, CHUNK_SIZE ); #endif memcpy( &context->dec_mem_window[context->dec_window_size - data_size], data, data_size ); return true; } #ifdef TRACING void __stdcall TracingMatch( ulong BufPos, ulong MatchPos, ulong WindowSize, ulong MatchLength, ulong MatchPosSlot ) { printf( "MATCH: At %08X, From %08X, Length %5d\n", BufPos + TracingOldDataSize, MatchPos + TracingOldDataSize, MatchLength ); } void __stdcall TracingLiteral( ulong BufPos, ulong ch ) { printf( "LITER: At %08X, 0x%02X\n", BufPos + TracingOldDataSize, ch ); } #endif /* TRACING */