From 62f6b25b63a8eafa1ece3a9a0e5510bd96713f2e Mon Sep 17 00:00:00 2001 From: Asher Baker Date: Sat, 16 Aug 2014 00:33:33 +0100 Subject: [PATCH] Remove pre-compiled zlib from the tree. --- compiler/amxxpc/AMBuilder | 16 +- compiler/amxxpc/amxxpc.cpp | 2 +- compiler/amxxpc/amxxpc.h | 2 +- compiler/amxxpc/libz-darwin.a | Bin 87176 -> 0 bytes compiler/amxxpc/libz.a | Bin 74810 -> 0 bytes compiler/amxxpc/zlib.lib | Bin 103248 -> 0 bytes compiler/amxxpc/zlib/adler32.c | 149 ++ compiler/amxxpc/zlib/compress.c | 79 + compiler/amxxpc/zlib/crc32.c | 424 +++++ compiler/amxxpc/zlib/crc32.h | 441 +++++ compiler/amxxpc/zlib/deflate.c | 1737 ++++++++++++++++++ compiler/amxxpc/zlib/deflate.h | 331 ++++ compiler/amxxpc/zlib/gzio.c | 1026 +++++++++++ compiler/amxxpc/zlib/infback.c | 624 +++++++ compiler/amxxpc/zlib/inffast.c | 319 ++++ compiler/amxxpc/zlib/inffast.h | 11 + compiler/amxxpc/zlib/inffixed.h | 94 + compiler/amxxpc/zlib/inflate.c | 1369 ++++++++++++++ compiler/amxxpc/zlib/inflate.h | 115 ++ compiler/amxxpc/zlib/inftrees.c | 330 ++++ compiler/amxxpc/zlib/inftrees.h | 55 + compiler/amxxpc/zlib/trees.c | 1220 +++++++++++++ compiler/amxxpc/zlib/trees.h | 128 ++ compiler/amxxpc/zlib/uncompr.c | 61 + compiler/amxxpc/{ => zlib}/zconf.h | 611 +++---- compiler/amxxpc/{ => zlib}/zlib.h | 2714 ++++++++++++++-------------- compiler/amxxpc/zlib/zutil.c | 319 ++++ compiler/amxxpc/zlib/zutil.h | 269 +++ 28 files changed, 10753 insertions(+), 1693 deletions(-) delete mode 100644 compiler/amxxpc/libz-darwin.a delete mode 100755 compiler/amxxpc/libz.a delete mode 100755 compiler/amxxpc/zlib.lib create mode 100644 compiler/amxxpc/zlib/adler32.c create mode 100644 compiler/amxxpc/zlib/compress.c create mode 100644 compiler/amxxpc/zlib/crc32.c create mode 100644 compiler/amxxpc/zlib/crc32.h create mode 100644 compiler/amxxpc/zlib/deflate.c create mode 100644 compiler/amxxpc/zlib/deflate.h create mode 100644 compiler/amxxpc/zlib/gzio.c create mode 100644 compiler/amxxpc/zlib/infback.c create mode 100644 compiler/amxxpc/zlib/inffast.c create mode 100644 compiler/amxxpc/zlib/inffast.h create mode 100644 compiler/amxxpc/zlib/inffixed.h create mode 100644 compiler/amxxpc/zlib/inflate.c create mode 100644 compiler/amxxpc/zlib/inflate.h create mode 100644 compiler/amxxpc/zlib/inftrees.c create mode 100644 compiler/amxxpc/zlib/inftrees.h create mode 100644 compiler/amxxpc/zlib/trees.c create mode 100644 compiler/amxxpc/zlib/trees.h create mode 100644 compiler/amxxpc/zlib/uncompr.c rename compiler/amxxpc/{ => zlib}/zconf.h (77%) mode change 100755 => 100644 rename compiler/amxxpc/{ => zlib}/zlib.h (97%) mode change 100755 => 100644 create mode 100644 compiler/amxxpc/zlib/zutil.c create mode 100644 compiler/amxxpc/zlib/zutil.h diff --git a/compiler/amxxpc/AMBuilder b/compiler/amxxpc/AMBuilder index da5911a3..e2659e1a 100644 --- a/compiler/amxxpc/AMBuilder +++ b/compiler/amxxpc/AMBuilder @@ -13,14 +13,10 @@ if builder.compiler.like('gcc'): if builder.target_platform == 'linux': binary.compiler.postlink += [ '-ldl', - binary.Dep('libz.a'), binary.Dep(AMXX.stdcxx_path), ] -elif builder.target_platform == 'mac': - binary.compiler.postlink += [binary.Dep('libz-darwin.a')] elif builder.target_platform == 'windows': binary.compiler.defines += ['_MBCS'] - binary.compiler.linkflags += [binary.Dep('zlib.lib')] binary.compiler.linkflags.remove('/SUBSYSTEM:WINDOWS') binary.compiler.linkflags.append('/SUBSYSTEM:CONSOLE') @@ -28,6 +24,18 @@ binary.sources = [ 'amx.cpp', 'amxxpc.cpp', 'Binary.cpp', + 'zlib/adler32.c', + 'zlib/compress.c', + 'zlib/crc32.c', + 'zlib/deflate.c', + 'zlib/gzio.c', + 'zlib/infback.c', + 'zlib/inffast.c', + 'zlib/inflate.c', + 'zlib/inftrees.c', + 'zlib/trees.c', + 'zlib/uncompr.c', + 'zlib/zutil.c', ] if builder.target_platform == 'windows': diff --git a/compiler/amxxpc/amxxpc.cpp b/compiler/amxxpc/amxxpc.cpp index c5734db9..21590990 100755 --- a/compiler/amxxpc/amxxpc.cpp +++ b/compiler/amxxpc/amxxpc.cpp @@ -15,7 +15,7 @@ #include #endif #include -#include "zlib.h" +#include "zlib/zlib.h" #include "amx.h" #include "amxdbg.h" #include "amxxpc.h" diff --git a/compiler/amxxpc/amxxpc.h b/compiler/amxxpc/amxxpc.h index 9ebfce16..38488ea6 100755 --- a/compiler/amxxpc/amxxpc.h +++ b/compiler/amxxpc/amxxpc.h @@ -34,7 +34,7 @@ # define dlclose(x) FreeLibrary(x) #endif -#include "zlib.h" +#include "zlib/zlib.h" #include "Binary.h" typedef int (*COMPILER)(int argc, char **argv); diff --git a/compiler/amxxpc/libz-darwin.a b/compiler/amxxpc/libz-darwin.a deleted file mode 100644 index 03964e8e745100720d199fbdcfabe399f3aafdaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87176 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�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 C;I*&- diff --git a/compiler/amxxpc/libz.a b/compiler/amxxpc/libz.a deleted file mode 100755 index 2e7361e4fa9a9bb66327e6807868cd1e1929bcfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74810 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 (BASE << 16)) a -= (BASE << 16); \ + if (a >= (BASE << 15)) a -= (BASE << 15); \ + if (a >= (BASE << 14)) a -= (BASE << 14); \ + if (a >= (BASE << 13)) a -= (BASE << 13); \ + if (a >= (BASE << 12)) a -= (BASE << 12); \ + if (a >= (BASE << 11)) a -= (BASE << 11); \ + if (a >= (BASE << 10)) a -= (BASE << 10); \ + if (a >= (BASE << 9)) a -= (BASE << 9); \ + if (a >= (BASE << 8)) a -= (BASE << 8); \ + if (a >= (BASE << 7)) a -= (BASE << 7); \ + if (a >= (BASE << 6)) a -= (BASE << 6); \ + if (a >= (BASE << 5)) a -= (BASE << 5); \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD4(a) \ + do { \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD4(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD4(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* the derivation of this formula is left as an exercise for the reader */ + rem = (unsigned)(len2 % BASE); + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 > BASE) sum1 -= BASE; + if (sum1 > BASE) sum1 -= BASE; + if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 > BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} diff --git a/compiler/amxxpc/zlib/compress.c b/compiler/amxxpc/zlib/compress.c new file mode 100644 index 00000000..d37e84f5 --- /dev/null +++ b/compiler/amxxpc/zlib/compress.c @@ -0,0 +1,79 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; +} diff --git a/compiler/amxxpc/zlib/crc32.c b/compiler/amxxpc/zlib/crc32.c new file mode 100644 index 00000000..5e8c44be --- /dev/null +++ b/compiler/amxxpc/zlib/crc32.c @@ -0,0 +1,424 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id$ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + */ + +#include +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local unsigned long FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const unsigned long FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + unsigned long c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const unsigned long FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const unsigned long FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case */ + if (len2 == 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} diff --git a/compiler/amxxpc/zlib/crc32.h b/compiler/amxxpc/zlib/crc32.h new file mode 100644 index 00000000..5de49bc9 --- /dev/null +++ b/compiler/amxxpc/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/compiler/amxxpc/zlib/deflate.c b/compiler/amxxpc/zlib/deflate.c new file mode 100644 index 00000000..f58dee25 --- /dev/null +++ b/compiler/amxxpc/zlib/deflate.c @@ -0,0 +1,1737 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://www.ietf.org/rfc/rfc1951.txt + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id$ */ + +#include +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifndef FASTEST +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif +#endif +local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt length = dictLength; + uInt n; + IPos hash_head = 0; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || + strm->state->wrap == 2 || + (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + return Z_STREAM_ERROR; + + s = strm->state; + if (s->wrap) + strm->adler = adler32(strm->adler, dictionary, dictLength); + + if (length < MIN_MATCH) return Z_OK; + if (length > MAX_DIST(s)) { + length = MAX_DIST(s); + dictionary += dictLength - length; /* use the tail of the dictionary */ + } + zmemcpy(s->window, dictionary, length); + s->strstart = length; + s->block_start = (long)length; + + /* Insert all strings in the hash table (except for the last two bytes). + * s->lookahead stays null, so s->ins_h will be recomputed at the next + * call of fill_window. + */ + s->ins_h = s->window[0]; + UPDATE_HASH(s, s->ins_h, s->window[1]); + for (n = 0; n <= length - MIN_MATCH; n++) { + INSERT_STRING(s, n, hash_head); + } + if (hash_head) hash_head = 0; /* to make compiler happy */ + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + lm_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + strm->state->bi_valid = bits; + strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if (func != configuration_table[level].func && strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_PARTIAL_FLUSH); + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds + * for every combination of windowBits and memLevel, as well as wrap. + * But even the conservative upper bound of about 14% expansion does not + * seem onerous for output buffer allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong destLen; + + /* conservative upper bound */ + destLen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + + /* if can't get parameters, return conservative bound */ + if (strm == Z_NULL || strm->state == Z_NULL) + return destLen; + + /* if not default parameters, return conservative bound */ + s = strm->state; + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return destLen; + + /* default settings: return tight bound for that case */ + return compressBound(sourceLen); +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len = strm->state->pending; + + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, strm->state->pending_out, len); + strm->next_out += len; + strm->state->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + strm->state->pending -= len; + if (strm->state->pending == 0) { + strm->state->pending_out = strm->state->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_FINISH || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && flush <= old_flush && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy(dest, source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy(ds, ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, strm->next_in, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, strm->next_in, len); + } +#endif + zmemcpy(buf, strm->next_in, len); + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ +#endif /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for level == 1 or strategy == Z_RLE only + */ +local uInt longest_match_fast(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + /* %%% avoid this when Z_RLE */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) return; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead >= MIN_MATCH) { + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, eof) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (eof)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, eof) { \ + FLUSH_BLOCK_ONLY(s, eof); \ + if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ +#ifdef FASTEST + if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || + (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { + s->match_length = longest_match_fast (s, hash_head); + } +#else + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } +#endif + /* longest_match() or longest_match_fast() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } + /* longest_match() or longest_match_fast() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif /* FASTEST */ + +#if 0 +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt run; /* length of run */ + uInt max; /* maximum length of run */ + uInt prev; /* byte at distance one to match */ + Bytef *scan; /* scan for end of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest encodable run. + */ + if (s->lookahead < MAX_MATCH) { + fill_window(s); + if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + run = 0; + if (s->strstart > 0) { /* if there is a previous byte, that is */ + max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; + scan = s->window + s->strstart - 1; + prev = *scan++; + do { + if (*scan++ != prev) + break; + } while (++run < max); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (run >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, run); + _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); + s->lookahead -= run; + s->strstart += run; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif diff --git a/compiler/amxxpc/zlib/deflate.h b/compiler/amxxpc/zlib/deflate.h new file mode 100644 index 00000000..222c53e0 --- /dev/null +++ b/compiler/amxxpc/zlib/deflate.h @@ -0,0 +1,331 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2004 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* STORED (for zip only) or DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to supress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + int last_eob_len; /* bit length of EOB code for last block */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + + /* in trees.c */ +void _tr_init OF((deflate_state *s)); +int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); +void _tr_align OF((deflate_state *s)); +void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch _length_code[]; + extern uch _dist_code[]; +#else + extern const uch _length_code[]; + extern const uch _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/compiler/amxxpc/zlib/gzio.c b/compiler/amxxpc/zlib/gzio.c new file mode 100644 index 00000000..5e20a4aa --- /dev/null +++ b/compiler/amxxpc/zlib/gzio.c @@ -0,0 +1,1026 @@ +/* gzio.c -- IO on .gz files + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. + */ + +/* @(#) $Id$ */ + +#include + +#include "zutil.h" + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +#ifndef Z_BUFSIZE +# ifdef MAXSEG_64K +# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ +# else +# define Z_BUFSIZE 16384 +# endif +#endif +#ifndef Z_PRINTF_BUFSIZE +# define Z_PRINTF_BUFSIZE 4096 +#endif + +#ifdef __MVS__ +# pragma map (fdopen , "\174\174FDOPEN") + FILE *fdopen(int, const char *); +#endif + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern void free OF((voidpf ptr)); +#endif + +#define ALLOC(size) malloc(size) +#define TRYFREE(p) {if (p) free(p);} + +static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ + +/* gzip flag byte */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define RESERVED 0xE0 /* bits 5..7: reserved */ + +typedef struct gz_stream { + z_stream stream; + int z_err; /* error code for last stream operation */ + int z_eof; /* set if end of input file */ + FILE *file; /* .gz file */ + Byte *inbuf; /* input buffer */ + Byte *outbuf; /* output buffer */ + uLong crc; /* crc32 of uncompressed data */ + char *msg; /* error message */ + char *path; /* path name for debugging only */ + int transparent; /* 1 if input file is not a .gz file */ + char mode; /* 'w' or 'r' */ + z_off_t start; /* start of compressed data in file (header skipped) */ + z_off_t in; /* bytes into deflate or inflate */ + z_off_t out; /* bytes out of deflate or inflate */ + int back; /* one character push-back */ + int last; /* true if push-back is last character */ +} gz_stream; + + +local gzFile gz_open OF((const char *path, const char *mode, int fd)); +local int do_flush OF((gzFile file, int flush)); +local int get_byte OF((gz_stream *s)); +local void check_header OF((gz_stream *s)); +local int destroy OF((gz_stream *s)); +local void putLong OF((FILE *file, uLong x)); +local uLong getLong OF((gz_stream *s)); + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb"). The file is given either by file descriptor + or path name (if fd == -1). + gz_open returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). +*/ +local gzFile gz_open (path, mode, fd) + const char *path; + const char *mode; + int fd; +{ + int err; + int level = Z_DEFAULT_COMPRESSION; /* compression level */ + int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ + char *p = (char*)mode; + gz_stream *s; + char fmode[80]; /* copy of mode, without the compression level */ + char *m = fmode; + + if (!path || !mode) return Z_NULL; + + s = (gz_stream *)ALLOC(sizeof(gz_stream)); + if (!s) return Z_NULL; + + s->stream.zalloc = (alloc_func)0; + s->stream.zfree = (free_func)0; + s->stream.opaque = (voidpf)0; + s->stream.next_in = s->inbuf = Z_NULL; + s->stream.next_out = s->outbuf = Z_NULL; + s->stream.avail_in = s->stream.avail_out = 0; + s->file = NULL; + s->z_err = Z_OK; + s->z_eof = 0; + s->in = 0; + s->out = 0; + s->back = EOF; + s->crc = crc32(0L, Z_NULL, 0); + s->msg = NULL; + s->transparent = 0; + + s->path = (char*)ALLOC(strlen(path)+1); + if (s->path == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + strcpy(s->path, path); /* do this early for debugging */ + + s->mode = '\0'; + do { + if (*p == 'r') s->mode = 'r'; + if (*p == 'w' || *p == 'a') s->mode = 'w'; + if (*p >= '0' && *p <= '9') { + level = *p - '0'; + } else if (*p == 'f') { + strategy = Z_FILTERED; + } else if (*p == 'h') { + strategy = Z_HUFFMAN_ONLY; + } else if (*p == 'R') { + strategy = Z_RLE; + } else { + *m++ = *p; /* copy the mode */ + } + } while (*p++ && m != fmode + sizeof(fmode)); + if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateInit2(&(s->stream), level, + Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); + /* windowBits is passed < 0 to suppress zlib header */ + + s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); +#endif + if (err != Z_OK || s->outbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } else { + s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); + + err = inflateInit2(&(s->stream), -MAX_WBITS); + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are + * present after the compressed stream. + */ + if (err != Z_OK || s->inbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } + s->stream.avail_out = Z_BUFSIZE; + + errno = 0; + s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); + + if (s->file == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + if (s->mode == 'w') { + /* Write a very simple .gz header: + */ + fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], + Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); + s->start = 10L; + /* We use 10L instead of ftell(s->file) to because ftell causes an + * fflush on some systems. This version of the library doesn't use + * start anyway in write mode, so this initialization is not + * necessary. + */ + } else { + check_header(s); /* skip the .gz header */ + s->start = ftell(s->file) - s->stream.avail_in; + } + + return (gzFile)s; +} + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. +*/ +gzFile ZEXPORT gzopen (path, mode) + const char *path; + const char *mode; +{ + return gz_open (path, mode, -1); +} + +/* =========================================================================== + Associate a gzFile with the file descriptor fd. fd is not dup'ed here + to mimic the behavio(u)r of fdopen. +*/ +gzFile ZEXPORT gzdopen (fd, mode) + int fd; + const char *mode; +{ + char name[46]; /* allow for up to 128-bit integers */ + + if (fd < 0) return (gzFile)Z_NULL; + sprintf(name, "", fd); /* for debugging */ + + return gz_open (name, mode, fd); +} + +/* =========================================================================== + * Update the compression level and strategy + */ +int ZEXPORT gzsetparams (file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + /* Make room to allow flushing */ + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + } + s->stream.avail_out = Z_BUFSIZE; + } + + return deflateParams (&(s->stream), level, strategy); +} + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ +local int get_byte(s) + gz_stream *s; +{ + if (s->z_eof) return EOF; + if (s->stream.avail_in == 0) { + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) s->z_err = Z_ERRNO; + return EOF; + } + s->stream.next_in = s->inbuf; + } + s->stream.avail_in--; + return *(s->stream.next_in)++; +} + +/* =========================================================================== + Check the gzip header of a gz_stream opened for reading. Set the stream + mode to transparent if the gzip magic header is not present; set s->err + to Z_DATA_ERROR if the magic header is present but the rest of the header + is incorrect. + IN assertion: the stream s has already been created sucessfully; + s->stream.avail_in is zero for the first time, but may be non-zero + for concatenated .gz files. +*/ +local void check_header(s) + gz_stream *s; +{ + int method; /* method byte */ + int flags; /* flags byte */ + uInt len; + int c; + + /* Assure two bytes in the buffer so we can peek ahead -- handle case + where first byte of header is at the end of the buffer after the last + gzip segment */ + len = s->stream.avail_in; + if (len < 2) { + if (len) s->inbuf[0] = s->stream.next_in[0]; + errno = 0; + len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); + if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; + s->stream.avail_in += len; + s->stream.next_in = s->inbuf; + if (s->stream.avail_in < 2) { + s->transparent = s->stream.avail_in; + return; + } + } + + /* Peek ahead to check the gzip magic header */ + if (s->stream.next_in[0] != gz_magic[0] || + s->stream.next_in[1] != gz_magic[1]) { + s->transparent = 1; + return; + } + s->stream.avail_in -= 2; + s->stream.next_in += 2; + + /* Check the rest of the gzip header */ + method = get_byte(s); + flags = get_byte(s); + if (method != Z_DEFLATED || (flags & RESERVED) != 0) { + s->z_err = Z_DATA_ERROR; + return; + } + + /* Discard time, xflags and OS code: */ + for (len = 0; len < 6; len++) (void)get_byte(s); + + if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ + len = (uInt)get_byte(s); + len += ((uInt)get_byte(s))<<8; + /* len is garbage if EOF but the loop below will quit anyway */ + while (len-- != 0 && get_byte(s) != EOF) ; + } + if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ + for (len = 0; len < 2; len++) (void)get_byte(s); + } + s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; +} + + /* =========================================================================== + * Cleanup then free the given gz_stream. Return a zlib error code. + Try freeing in the reverse order of allocations. + */ +local int destroy (s) + gz_stream *s; +{ + int err = Z_OK; + + if (!s) return Z_STREAM_ERROR; + + TRYFREE(s->msg); + + if (s->stream.state != NULL) { + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateEnd(&(s->stream)); +#endif + } else if (s->mode == 'r') { + err = inflateEnd(&(s->stream)); + } + } + if (s->file != NULL && fclose(s->file)) { +#ifdef ESPIPE + if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ +#endif + err = Z_ERRNO; + } + if (s->z_err < 0) err = s->z_err; + + TRYFREE(s->inbuf); + TRYFREE(s->outbuf); + TRYFREE(s->path); + TRYFREE(s); + return err; +} + +/* =========================================================================== + Reads the given number of uncompressed bytes from the compressed file. + gzread returns the number of bytes actually read (0 for end of file). +*/ +int ZEXPORT gzread (file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + Bytef *start = (Bytef*)buf; /* starting point for crc computation */ + Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ + + if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; + + if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; + if (s->z_err == Z_STREAM_END) return 0; /* EOF */ + + next_out = (Byte*)buf; + s->stream.next_out = (Bytef*)buf; + s->stream.avail_out = len; + + if (s->stream.avail_out && s->back != EOF) { + *next_out++ = s->back; + s->stream.next_out++; + s->stream.avail_out--; + s->back = EOF; + s->out++; + start++; + if (s->last) { + s->z_err = Z_STREAM_END; + return 1; + } + } + + while (s->stream.avail_out != 0) { + + if (s->transparent) { + /* Copy first the lookahead bytes: */ + uInt n = s->stream.avail_in; + if (n > s->stream.avail_out) n = s->stream.avail_out; + if (n > 0) { + zmemcpy(s->stream.next_out, s->stream.next_in, n); + next_out += n; + s->stream.next_out = next_out; + s->stream.next_in += n; + s->stream.avail_out -= n; + s->stream.avail_in -= n; + } + if (s->stream.avail_out > 0) { + s->stream.avail_out -= + (uInt)fread(next_out, 1, s->stream.avail_out, s->file); + } + len -= s->stream.avail_out; + s->in += len; + s->out += len; + if (len == 0) s->z_eof = 1; + return (int)len; + } + if (s->stream.avail_in == 0 && !s->z_eof) { + + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) { + s->z_err = Z_ERRNO; + break; + } + } + s->stream.next_in = s->inbuf; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = inflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + + if (s->z_err == Z_STREAM_END) { + /* Check CRC and original size */ + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + start = s->stream.next_out; + + if (getLong(s) != s->crc) { + s->z_err = Z_DATA_ERROR; + } else { + (void)getLong(s); + /* The uncompressed length returned by above getlong() may be + * different from s->out in case of concatenated .gz files. + * Check for such files: + */ + check_header(s); + if (s->z_err == Z_OK) { + inflateReset(&(s->stream)); + s->crc = crc32(0L, Z_NULL, 0); + } + } + } + if (s->z_err != Z_OK || s->z_eof) break; + } + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + + if (len == s->stream.avail_out && + (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) + return -1; + return (int)(len - s->stream.avail_out); +} + + +/* =========================================================================== + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ +int ZEXPORT gzgetc(file) + gzFile file; +{ + unsigned char c; + + return gzread(file, &c, 1) == 1 ? c : -1; +} + + +/* =========================================================================== + Push one byte back onto the stream. +*/ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; + s->back = c; + s->out--; + s->last = (s->z_err == Z_STREAM_END); + if (s->last) s->z_err = Z_OK; + s->z_eof = 0; + return c; +} + + +/* =========================================================================== + Reads bytes from the compressed file until len-1 characters are + read, or a newline character is read and transferred to buf, or an + end-of-file condition is encountered. The string is then terminated + with a null character. + gzgets returns buf, or Z_NULL in case of error. + + The current implementation is not optimized at all. +*/ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + char *b = buf; + if (buf == Z_NULL || len <= 0) return Z_NULL; + + while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; + *buf = '\0'; + return b == buf && len > 0 ? Z_NULL : b; +} + + +#ifndef NO_GZCOMPRESS +/* =========================================================================== + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of bytes actually written (0 in case of error). +*/ +int ZEXPORT gzwrite (file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.next_in = (Bytef*)buf; + s->stream.avail_in = len; + + while (s->stream.avail_in != 0) { + + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + break; + } + s->stream.avail_out = Z_BUFSIZE; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + if (s->z_err != Z_OK) break; + } + s->crc = crc32(s->crc, (const Bytef *)buf, len); + + return (int)(len - s->stream.avail_in); +} + + +/* =========================================================================== + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +*/ +#ifdef STDC +#include + +int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) +{ + char buf[Z_PRINTF_BUFSIZE]; + va_list va; + int len; + + buf[sizeof(buf) - 1] = 0; + va_start(va, format); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(buf, format, va); + va_end(va); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = vsprintf(buf, format, va); + va_end(va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(buf, sizeof(buf), format, va); + va_end(va); + len = strlen(buf); +# else + len = vsnprintf(buf, sizeof(buf), format, va); + va_end(va); +# endif +#endif + if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, (unsigned)len); +} +#else /* not ANSI C */ + +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + char buf[Z_PRINTF_BUFSIZE]; + int len; + + buf[sizeof(buf) - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(buf); +# else + len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, len); +} +#endif + +/* =========================================================================== + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned char cc = (unsigned char) c; /* required for big endian systems */ + + return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; +} + + +/* =========================================================================== + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ +int ZEXPORT gzputs(file, s) + gzFile file; + const char *s; +{ + return gzwrite(file, (char*)s, (unsigned)strlen(s)); +} + + +/* =========================================================================== + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. +*/ +local int do_flush (file, flush) + gzFile file; + int flush; +{ + uInt len; + int done = 0; + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.avail_in = 0; /* should be zero already anyway */ + + for (;;) { + len = Z_BUFSIZE - s->stream.avail_out; + + if (len != 0) { + if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { + s->z_err = Z_ERRNO; + return Z_ERRNO; + } + s->stream.next_out = s->outbuf; + s->stream.avail_out = Z_BUFSIZE; + } + if (done) break; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), flush); + s->out -= s->stream.avail_out; + + /* Ignore the second of two consecutive flushes: */ + if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; + + /* deflate has finished flushing only when it hasn't used up + * all the available space in the output buffer: + */ + done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); + + if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; + } + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} + +int ZEXPORT gzflush (file, flush) + gzFile file; + int flush; +{ + gz_stream *s = (gz_stream*)file; + int err = do_flush (file, flush); + + if (err) return err; + fflush(s->file); + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} +#endif /* NO_GZCOMPRESS */ + +/* =========================================================================== + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error. + SEEK_END is not implemented, returns error. + In this version of the library, gzseek can be extremely slow. +*/ +z_off_t ZEXPORT gzseek (file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || whence == SEEK_END || + s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { + return -1L; + } + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return -1L; +#else + if (whence == SEEK_SET) { + offset -= s->in; + } + if (offset < 0) return -1L; + + /* At this point, offset is the number of zero bytes to write. */ + if (s->inbuf == Z_NULL) { + s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ + if (s->inbuf == Z_NULL) return -1L; + zmemzero(s->inbuf, Z_BUFSIZE); + } + while (offset > 0) { + uInt size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (uInt)offset; + + size = gzwrite(file, s->inbuf, size); + if (size == 0) return -1L; + + offset -= size; + } + return s->in; +#endif + } + /* Rest of function is for reading only */ + + /* compute absolute position */ + if (whence == SEEK_CUR) { + offset += s->out; + } + if (offset < 0) return -1L; + + if (s->transparent) { + /* map to fseek */ + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; + + s->in = s->out = offset; + return offset; + } + + /* For a negative seek, rewind and use positive seek */ + if (offset >= s->out) { + offset -= s->out; + } else if (gzrewind(file) < 0) { + return -1L; + } + /* offset is now the number of bytes to skip. */ + + if (offset != 0 && s->outbuf == Z_NULL) { + s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); + if (s->outbuf == Z_NULL) return -1L; + } + if (offset && s->back != EOF) { + s->back = EOF; + s->out++; + offset--; + if (s->last) s->z_err = Z_STREAM_END; + } + while (offset > 0) { + int size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (int)offset; + + size = gzread(file, s->outbuf, (uInt)size); + if (size <= 0) return -1L; + offset -= size; + } + return s->out; +} + +/* =========================================================================== + Rewinds input file. +*/ +int ZEXPORT gzrewind (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return -1; + + s->z_err = Z_OK; + s->z_eof = 0; + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + s->crc = crc32(0L, Z_NULL, 0); + if (!s->transparent) (void)inflateReset(&s->stream); + s->in = 0; + s->out = 0; + return fseek(s->file, s->start, SEEK_SET); +} + +/* =========================================================================== + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. +*/ +z_off_t ZEXPORT gztell (file) + gzFile file; +{ + return gzseek(file, 0L, SEEK_CUR); +} + +/* =========================================================================== + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ +int ZEXPORT gzeof (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + /* With concatenated compressed files that can have embedded + * crc trailers, z_eof is no longer the only/best indicator of EOF + * on a gz_stream. Handle end-of-stream error explicitly here. + */ + if (s == NULL || s->mode != 'r') return 0; + if (s->z_eof) return 1; + return s->z_err == Z_STREAM_END; +} + +/* =========================================================================== + Returns 1 if reading and doing so transparently, otherwise zero. +*/ +int ZEXPORT gzdirect (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return 0; + return s->transparent; +} + +/* =========================================================================== + Outputs a long in LSB order to the given file +*/ +local void putLong (file, x) + FILE *file; + uLong x; +{ + int n; + for (n = 0; n < 4; n++) { + fputc((int)(x & 0xff), file); + x >>= 8; + } +} + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets z_err in case + of error. +*/ +local uLong getLong (s) + gz_stream *s; +{ + uLong x = (uLong)get_byte(s); + int c; + + x += ((uLong)get_byte(s))<<8; + x += ((uLong)get_byte(s))<<16; + c = get_byte(s); + if (c == EOF) s->z_err = Z_DATA_ERROR; + x += ((uLong)c)<<24; + return x; +} + +/* =========================================================================== + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. +*/ +int ZEXPORT gzclose (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return Z_STREAM_ERROR; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return Z_STREAM_ERROR; +#else + if (do_flush (file, Z_FINISH) != Z_OK) + return destroy((gz_stream*)file); + + putLong (s->file, s->crc); + putLong (s->file, (uLong)(s->in & 0xffffffff)); +#endif + } + return destroy((gz_stream*)file); +} + +#ifdef STDC +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +/* =========================================================================== + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ +const char * ZEXPORT gzerror (file, errnum) + gzFile file; + int *errnum; +{ + char *m; + gz_stream *s = (gz_stream*)file; + + if (s == NULL) { + *errnum = Z_STREAM_ERROR; + return (const char*)ERR_MSG(Z_STREAM_ERROR); + } + *errnum = s->z_err; + if (*errnum == Z_OK) return (const char*)""; + + m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); + + if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); + + TRYFREE(s->msg); + s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); + if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); + strcpy(s->msg, s->path); + strcat(s->msg, ": "); + strcat(s->msg, m); + return (const char*)s->msg; +} + +/* =========================================================================== + Clear the error and end-of-file flags, and do the same for the real file. +*/ +void ZEXPORT gzclearerr (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return; + if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; + s->z_eof = 0; + clearerr(s->file); +} diff --git a/compiler/amxxpc/zlib/infback.c b/compiler/amxxpc/zlib/infback.c new file mode 100644 index 00000000..0056928e --- /dev/null +++ b/compiler/amxxpc/zlib/infback.c @@ -0,0 +1,624 @@ +/* infback.c -- inflate using a call-back interface + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + This code is largely copied from inflate.c. Normally either infback.o or + inflate.o would be linked into an application--not both. The interface + with inffast.c is retained so that optimized assembler-coded versions of + inflate_fast() can be used with either inflate.c or infback.c. + */ + +#include +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); + +/* + strm provides memory allocation functions in zalloc and zfree, or + Z_NULL to use the library memory allocation functions. + + windowBits is in the range 8..15, and window is a user-supplied + window and output buffer that is 2**windowBits bytes. + */ +int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) +z_streamp strm; +int windowBits; +unsigned char FAR *window; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL || window == Z_NULL || + windowBits < 8 || windowBits > 15) + return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *)ZALLOC(strm, 1, + sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + state->dmax = 32768U; + state->wbits = windowBits; + state->wsize = 1U << windowBits; + state->window = window; + state->write = 0; + state->whave = 0; + return Z_OK; +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +/* Macros for inflateBack(): */ + +/* Load returned state from inflate_fast() */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Set state from registers for inflate_fast() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Assure that some input is available. If input is requested, but denied, + then return a Z_BUF_ERROR from inflateBack(). */ +#define PULL() \ + do { \ + if (have == 0) { \ + have = in(in_desc, &next); \ + if (have == 0) { \ + next = Z_NULL; \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflateBack() + with an error if there is no input available. */ +#define PULLBYTE() \ + do { \ + PULL(); \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflateBack() with + an error. */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Assure that some output space is available, by writing out the window + if it's full. If the write fails, return from inflateBack() with a + Z_BUF_ERROR. */ +#define ROOM() \ + do { \ + if (left == 0) { \ + put = state->window; \ + left = state->wsize; \ + state->whave = left; \ + if (out(out_desc, put, left)) { \ + ret = Z_BUF_ERROR; \ + goto inf_leave; \ + } \ + } \ + } while (0) + +/* + strm provides the memory allocation functions and window buffer on input, + and provides information on the unused input on return. For Z_DATA_ERROR + returns, strm will also provide an error message. + + in() and out() are the call-back input and output functions. When + inflateBack() needs more input, it calls in(). When inflateBack() has + filled the window with output, or when it completes with data in the + window, it calls out() to write out the data. The application must not + change the provided input until in() is called again or inflateBack() + returns. The application must not change the window/output buffer until + inflateBack() returns. + + in() and out() are called with a descriptor parameter provided in the + inflateBack() call. This parameter can be a structure that provides the + information required to do the read or write, as well as accumulated + information on the input and output such as totals and check values. + + in() should return zero on failure. out() should return non-zero on + failure. If either in() or out() fails, than inflateBack() returns a + Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it + was in() or out() that caused in the error. Otherwise, inflateBack() + returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format + error, or Z_MEM_ERROR if it could not allocate memory for the state. + inflateBack() can also return Z_STREAM_ERROR if the input parameters + are not correct, i.e. strm is Z_NULL or the state was not initialized. + */ +int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) +z_streamp strm; +in_func in; +void FAR *in_desc; +out_func out; +void FAR *out_desc; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + /* Check that the strm exists and that the state was initialized */ + if (strm == Z_NULL || strm->state == Z_NULL) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + + /* Reset the state */ + strm->msg = Z_NULL; + state->mode = TYPE; + state->last = 0; + state->whave = 0; + next = strm->next_in; + have = next != Z_NULL ? strm->avail_in : 0; + hold = 0; + bits = 0; + put = state->window; + left = state->wsize; + + /* Inflate until end of block marked as last */ + for (;;) + switch (state->mode) { + case TYPE: + /* determine and dispatch block type */ + if (state->last) { + BYTEBITS(); + state->mode = DONE; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + + case STORED: + /* get and verify stored block length */ + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + + /* copy stored block from input to output */ + while (state->length != 0) { + copy = state->length; + PULL(); + ROOM(); + if (copy > have) copy = have; + if (copy > left) copy = left; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + + case TABLE: + /* get dynamic table entries descriptor */ + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + + /* get code length code lengths (not a typo) */ + state->have = 0; + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + + /* get length and distance code code lengths */ + state->have = 0; + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = (unsigned)(state->lens[state->have - 1]); + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + + case LEN: + /* use inflate_fast() if we have enough input and output */ + if (have >= 6 && left >= 258) { + RESTORE(); + if (state->whave < state->wsize) + state->whave = state->wsize - left; + inflate_fast(strm, state->wsize); + LOAD(); + break; + } + + /* get a literal, length, or end-of-block code */ + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + + /* process literal */ + if (this.op == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + ROOM(); + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + } + + /* process end of block */ + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + + /* invalid code */ + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + + /* length code -- get extra bits, if any */ + state->extra = (unsigned)(this.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + + /* get distance code */ + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + + /* get distance extra bits, if any */ + state->extra = (unsigned)(this.op) & 15; + if (state->extra != 0) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } + if (state->offset > state->wsize - (state->whave < state->wsize ? + left : 0)) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + + /* copy match from window to output */ + do { + ROOM(); + copy = state->wsize - state->offset; + if (copy < left) { + from = put + copy; + copy = left - copy; + } + else { + from = put - state->offset; + copy = left; + } + if (copy > state->length) copy = state->length; + state->length -= copy; + left -= copy; + do { + *put++ = *from++; + } while (--copy); + } while (state->length != 0); + break; + + case DONE: + /* inflate stream terminated properly -- write leftover output */ + ret = Z_STREAM_END; + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left)) + ret = Z_BUF_ERROR; + } + goto inf_leave; + + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + + default: /* can't happen, but makes compilers happy */ + ret = Z_STREAM_ERROR; + goto inf_leave; + } + + /* Return unused input */ + inf_leave: + strm->next_in = next; + strm->avail_in = have; + return ret; +} + +int ZEXPORT inflateBackEnd(strm) +z_streamp strm; +{ + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} diff --git a/compiler/amxxpc/zlib/inffast.c b/compiler/amxxpc/zlib/inffast.c new file mode 100644 index 00000000..20ef523d --- /dev/null +++ b/compiler/amxxpc/zlib/inffast.c @@ -0,0 +1,319 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code this; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = lcode[hold & lmask]; + dolen: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + PUP(out) = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = dcode[hold & dmask]; + dodist: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + this = dcode[this.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + this = lcode[this.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/compiler/amxxpc/zlib/inffast.h b/compiler/amxxpc/zlib/inffast.h new file mode 100644 index 00000000..614fa787 --- /dev/null +++ b/compiler/amxxpc/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/compiler/amxxpc/zlib/inffixed.h b/compiler/amxxpc/zlib/inffixed.h new file mode 100644 index 00000000..423d5c5b --- /dev/null +++ b/compiler/amxxpc/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/compiler/amxxpc/zlib/inflate.c b/compiler/amxxpc/zlib/inflate.c new file mode 100644 index 00000000..f4606b62 --- /dev/null +++ b/compiler/amxxpc/zlib/inflate.c @@ -0,0 +1,1369 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common write == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->wsize = 0; + state->whave = 0; + state->write = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) windowBits &= 15; +#endif + } + if (windowBits < 8 || windowBits > 15) { + ZFREE(strm, state); + strm->state = Z_NULL; + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = Z_NULL; + return inflateReset(strm); +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, + state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + if ((int)(this.op) == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + state->mode = LIT; + break; + } + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(this.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->mode = DIST; + case DIST: + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + state->extra = (unsigned)(this.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy(copy, state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} diff --git a/compiler/amxxpc/zlib/inflate.h b/compiler/amxxpc/zlib/inflate.h new file mode 100644 index 00000000..fbbc8714 --- /dev/null +++ b/compiler/amxxpc/zlib/inflate.h @@ -0,0 +1,115 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN, /* i: waiting for length/lit code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD or MEM mode -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME + NAME -> COMMENT -> HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or CHECK + STORED -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/compiler/amxxpc/zlib/inftrees.c b/compiler/amxxpc/zlib/inftrees.c new file mode 100644 index 00000000..a1406443 --- /dev/null +++ b/compiler/amxxpc/zlib/inftrees.c @@ -0,0 +1,330 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)1; + this.val = (unsigned short)0; + *(*table)++ = this; /* make a table to force an error */ + *(*table)++ = this; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/compiler/amxxpc/zlib/inftrees.h b/compiler/amxxpc/zlib/inftrees.h new file mode 100644 index 00000000..dc0fd567 --- /dev/null +++ b/compiler/amxxpc/zlib/inftrees.h @@ -0,0 +1,55 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/compiler/amxxpc/zlib/trees.c b/compiler/amxxpc/zlib/trees.c new file mode 100644 index 00000000..6ca02864 --- /dev/null +++ b/compiler/amxxpc/zlib/trees.c @@ -0,0 +1,1220 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2005 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id$ */ + +/* #define GEN_TREES_H */ + +#include +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +#define Buf_size (8 * 2*sizeof(char)) +/* Number of bits used within bi_buf. (bi_buf might be implemented on + * more than 16 bits on some systems.) + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, ct_data *ltree, + ct_data *dtree)); +local void set_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (value << s->bi_valid); + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (val << s->bi_valid);\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; + s->last_eob_len = 8; /* enough lookahead for inflate */ +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void _tr_stored_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + * The current inflate code requires 9 bits of lookahead. If the + * last two codes for the previous block (real code plus EOB) were coded + * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + * the last real code. In this case we send two empty static blocks instead + * of one. (There are no problems if the previous block is stored or fixed.) + * To simplify the code, we assume the worst case of last real code encoded + * on one bit only. + */ +void _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); + /* Of the 10 bits for the empty block, we have already sent + * (10 - bi_valid) bits. The lookahead for the last real code (before + * the EOB of the previous block) was thus at least one plus the length + * of the EOB plus what we have just sent of the empty static block. + */ + if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; +#endif + bi_flush(s); + } + s->last_eob_len = 7; +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void _tr_flush_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) + set_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, eof); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+eof, 3); + compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+eof, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (eof) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*eof)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + ct_data *ltree; /* literal tree */ + ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); + s->last_eob_len = ltree[END_BLOCK].Len; +} + +/* =========================================================================== + * Set the data type to BINARY or TEXT, using a crude approximation: + * set it to Z_TEXT if all symbols are either printable characters (33 to 255) + * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local void set_data_type(s) + deflate_state *s; +{ + int n; + + for (n = 0; n < 9; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + if (n == 9) + for (n = 14; n < 32; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + s->last_eob_len = 8; /* enough lookahead for inflate */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/compiler/amxxpc/zlib/trees.h b/compiler/amxxpc/zlib/trees.h new file mode 100644 index 00000000..1ca868b8 --- /dev/null +++ b/compiler/amxxpc/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/compiler/amxxpc/zlib/uncompr.c b/compiler/amxxpc/zlib/uncompr.c new file mode 100644 index 00000000..ad6db0a6 --- /dev/null +++ b/compiler/amxxpc/zlib/uncompr.c @@ -0,0 +1,61 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/compiler/amxxpc/zconf.h b/compiler/amxxpc/zlib/zconf.h old mode 100755 new mode 100644 similarity index 77% rename from compiler/amxxpc/zconf.h rename to compiler/amxxpc/zlib/zconf.h index 1731ebff..59b5e7a6 --- a/compiler/amxxpc/zconf.h +++ b/compiler/amxxpc/zlib/zconf.h @@ -1,330 +1,281 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/compiler/amxxpc/zlib.h b/compiler/amxxpc/zlib/zlib.h old mode 100755 new mode 100644 similarity index 97% rename from compiler/amxxpc/zlib.h rename to compiler/amxxpc/zlib/zlib.h index 02281792..62d0e467 --- a/compiler/amxxpc/zlib.h +++ b/compiler/amxxpc/zlib/zlib.h @@ -1,1357 +1,1357 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.3, July 18th, 2005 - - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.2.3" -#define ZLIB_VERNUM 0x1230 - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumualte before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - the value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, - Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() stop - if and when it gets to the next deflate block boundary. When decoding the - zlib or gzip format, this will cause inflate() to return immediately after - the header and before the first block. When doing a raw inflate, inflate() - will go ahead and process the first block, and will return when it gets to - the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 - if inflate() is currently decoding the last block in the deflate stream, - plus 128 if inflate() returned immediately after decoding an end-of-block - code or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to strm->next_out. The - number of unused bits may in general be greater than seven, except when - bit 7 of data_type is set, in which case the number of unused bits will be - less than eight. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster approach - may be used for the single inflate() call. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() will decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically. Any information - contained in the gzip header is not retained, so applications that need that - information should instead use raw inflate, see inflateInit2() below, or - inflateBack() and perform their own processing of the gzip header and - trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may then - call inflateSync() to look for a good compression block if a partial recovery - of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as - Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy - parameter only affects the compression ratio but not the correctness of the - compressed output even if it is not set appropriately. Z_FIXED prevents the - use of dynamic Huffman codes, allowing for a simpler decoder for special - applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. In addition, the - current implementation of deflate will use at most the window size minus - 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() - or deflateInit2(). This would be used to allocate an output buffer - for deflation in a single pass, and so would be called before deflate(). -*/ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the - bits leftover from a previous deflate stream when appending to it. As such, - this function can only be used for raw deflate, and must be used before the - first deflate() call after a deflateInit2() or deflateReset(). bits must be - less than or equal to 16, and that many of the least significant bits of - value will be inserted in the output. - - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is - a crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg - is set to null if there is no error message. inflateInit2 does not perform - any decompression apart from reading the zlib header if present: this will - be done by inflate(). (So next_in and avail_in may be modified, but next_out - and avail_out are unchanged.) -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK can be used to - force inflate() to return immediately after header processing is complete - and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When - any of extra, name, or comment are not Z_NULL and the respective field is - not present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not - be allocated, or Z_VERSION_ERROR if the version of the library does not - match the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free - the allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects - only the raw deflate stream to decompress. This is different from the - normal behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format - error in the deflate stream (in which case strm->msg is set to indicate the - nature of the error), or Z_STREAM_ERROR if the stream was not properly - initialized. In the case of Z_BUF_ERROR, an input or output error can be - distinguished using strm->next_in which will be Z_NULL only if in() returned - an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to - out() returning non-zero. (in() will always be called before out(), so - strm->next_in is assured to be defined if out() returns non-zero.) Note - that inflateBack() cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least the value returned - by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before - a compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. -*/ - - -typedef voidp gzFile; - -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); -/* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h", or 'R' for run-length encoding - as in "wb1R". (See the description of deflateInit2 for more information - about the strategy parameter.) - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). The number of - uncompressed bytes written is limited to 4095. The caller should assure that - this limit is not exceeded. If it is exceeded, then gzprintf() will return - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read again later. - Only one character of push-back is allowed. gzungetc() returns the - character pushed, or -1 on failure. gzungetc() will fail if a - character has been pushed but not read yet, or if c is -1. The pushed - character will be discarded if the stream is repositioned with gzseek() - or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. -*/ - -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); -/* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); -/* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns 1 if file is being read directly without decompression, otherwise - zero. -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); -/* - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is NULL, this function returns the required initial - value for the for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - -/* - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) - - -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ -#endif - -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/compiler/amxxpc/zlib/zutil.c b/compiler/amxxpc/zlib/zutil.c new file mode 100644 index 00000000..56e552f4 --- /dev/null +++ b/compiler/amxxpc/zlib/zutil.c @@ -0,0 +1,319 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#include +#include "zutil.h" + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch (sizeof(uInt)) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch (sizeof(uLong)) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch (sizeof(voidpf)) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch (sizeof(z_off_t)) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#ifdef STDC +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int z_verbose = verbose; + +void z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/compiler/amxxpc/zlib/zutil.h b/compiler/amxxpc/zlib/zutil.h new file mode 100644 index 00000000..0ba6e020 --- /dev/null +++ b/compiler/amxxpc/zlib/zutil.h @@ -0,0 +1,269 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id$ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#define ZLIB_INTERNAL +#include "zlib.h" + +#ifdef STDC +# ifndef _WIN32_WCE +# include +# endif +# include +# include +#endif +#ifdef NO_ERRNO_H +# ifdef _WIN32_WCE + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. We rename it to + * avoid conflict with other libraries that use the same workaround. + */ +# define errno z_errno +# endif + extern int errno; +#else +# ifndef _WIN32_WCE +# include +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# ifdef M_I86 + #include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# define vsnprintf _vsnprintf +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* ZUTIL_H */