| iMatix home page | << | < | > | >> |
SFL Version 2.11 |
#include "sflcomp.h" word compress_block ( const byte *src, byte *dst, word src_size)
Takes up to 64Kb of uncompressed data in Source, compresses it using a fast LZ/RLE algorithm and places the result in Dest. The compression technique is comparable to that used by Zip and such tools, but less agressive. It is, however, fast enough to use in realtime. Returns the size of the compressed data. To decompress the data, use the expand block() function.
{ static short Hash [4096]; short SymbolAddress; word Key; word Size; byte Bit = 0; word Command = 0; word src_index = 0; word dst_size = 3; word HeaderIndex = 1; dst [0] = FLAG_COMPRESS; for (Key = 0; Key < 4096; Key++) Hash [Key] = -1; while ((src_index < src_size) && (dst_size <= src_size)) { if (Bit > 15) { dst [HeaderIndex] = (byte) ((Command >> 8) & 0x00ff); dst [HeaderIndex + 1] = (byte) ( Command & 0x00ff); HeaderIndex = dst_size; dst_size += 2; Bit = 0; } for (Size = 1;; Size++) if ((word) (src_index + Size) >= src_size || (src [src_index] != src [src_index + Size]) || (Size >= 0x0fff)) break; if (Size >= 16) { dst [dst_size++] = 0; dst [dst_size++] = (byte) (((word) (Size - 16) >> 8) & 0x00ff); dst [dst_size++] = (byte) ((Size - 16) & 0x00ff); dst [dst_size++] = src [src_index]; src_index += Size; Command = (Command << 1) + 1; } else if (get_match (src, src_index, src_size, Hash, &Size, &SymbolAddress) != 0) { Key = ((src_index - SymbolAddress) << 4) + (Size - 3); dst [dst_size++] = (byte) ((Key >> 8) & 0x00ff); dst [dst_size++] = (byte) (Key & 0x00ff); src_index += Size; Command = (Command << 1) + 1; } else { dst [dst_size++] = src [src_index++]; Command = (Command << 1); } Bit++; } Command <<= (16 - Bit); dst [HeaderIndex] = (byte) ((Command >> 8) & 0x00ff); dst [HeaderIndex + 1] = (byte) ( Command & 0x00ff); if (dst_size > src_size) { for (dst_size = 0; dst_size < src_size; dst_size++) dst [dst_size + 1] = src [dst_size]; dst [0] = FLAG_COPY; return (src_size + 1); } return (dst_size); }
| << | < | > | >> | Copyright © 1996-2000 iMatix Corporation |