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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 diff --git a/compiler/amxxpc/zlib.lib b/compiler/amxxpc/zlib.lib deleted file mode 100755 index 6a5dc7599508ede5337716f0b81eb53f8d5c3761..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103248 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 V#g379Ed@i2#!;#hS|;Ib=6?qjhot}j diff --git a/compiler/amxxpc/zlib/adler32.c b/compiler/amxxpc/zlib/adler32.c new file mode 100644 index 00000000..f201d670 --- /dev/null +++ b/compiler/amxxpc/zlib/adler32.c @@ -0,0 +1,149 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +#define BASE 65521UL /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware */ +#ifdef NO_DIVIDE +# define MOD(a) \ + do { \ + if (a >= (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 */