X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Flizard.h;h=aa616515b21ad0d418a1d66de3015b5b104d346e;hb=bbcbba14a32658a09d7cd44cee40c8369065822f;hp=25ba4bcee29fc946a6b41e9c265b4b02770e0d46;hpb=2c6f7d0fdea90d70ed9d7d10b766e775c0e2f790;p=libucw.git diff --git a/lib/lizard.h b/lib/lizard.h index 25ba4bce..aa616515 100644 --- a/lib/lizard.h +++ b/lib/lizard.h @@ -1,27 +1,49 @@ /* - * LiZzaRd -- Fast compression method based on Lempel-Ziv 77 + * LiZaRd -- Fast compression method based on Lempel-Ziv 77 * * (c) 2004, Robert Spalek * - * The file format is based on LZO1X and - * the compression method is based on zlib. + * This software may be freely distributed and used according to the terms + * of the GNU Lesser General Public License. */ -#define LIZZARD_NEEDS_CHARS 8 +#ifndef _UCW_LIZARD_H +#define _UCW_LIZARD_H + +#define LIZARD_NEEDS_CHARS 8 /* The compression routine needs input buffer 8 characters longer, because it * does not check the input bounds all the time. */ -#define LIZZARD_MAX_MULTIPLY 65LL/64 -#define LIZZARD_MAX_ADD 4 +#define LIZARD_MAX_MULTIPLY 23./22 +#define LIZARD_MAX_ADD 4 /* In the worst case, the compressed file will not be longer than its - * original length * 65/64 + 4. + * original length * 23/22 + 4. * * The additive constant is for EOF and the header of the file. * - * The multiplicative constant 129/128 comes from an incompressible string of - * length 256 that requires a 2-byte header. However, if longer strings get - * interrupted by a sequence of length 3 compressed into 2 characters, the - * overlap is sligtly bigger. - * TODO: check */ - -int lizzard_compress(byte *in, uns in_len, byte *out); -int lizzard_decompress(byte *in, byte *out); + * The multiplicative constant comes from 19-byte incompressible string + * followed by a 3-sequence that can be compressed into 2-byte link. This + * breaks the copy-mode and it needs to be restarted with a new header. The + * total length is 2(header) + 19(string) + 2(link) = 23. + */ + +/* lizard.c */ +int lizard_compress(byte *in, uns in_len, byte *out); +int lizard_decompress(byte *in, byte *out); + +/* lizard-safe.c */ +struct lizard_buffer; + +struct lizard_buffer *lizard_alloc(void); +void lizard_free(struct lizard_buffer *buf); +byte *lizard_decompress_safe(byte *in, struct lizard_buffer *buf, uns expected_length); + +/* adler32.c */ +uns update_adler32(uns adler, byte *ptr, uns len); + +static inline uns +adler32(byte *buf, uns len) +{ + return update_adler32(1, buf, len); +} + +#endif