16141cf33Sderaadt /* zutil.c -- target dependent utility functions for the compression library
236f395ceStb * Copyright (C) 1995-2017 Jean-loup Gailly
36141cf33Sderaadt * For conditions of distribution and use, see copyright notice in zlib.h
46141cf33Sderaadt */
56141cf33Sderaadt
66141cf33Sderaadt #include "zutil.h"
76141cf33Sderaadt
836f395ceStb #ifndef _KERNEL
936f395ceStb #ifndef Z_SOLO
1036f395ceStb # include "gzguts.h"
1136f395ceStb #endif
126141cf33Sderaadt #endif
136141cf33Sderaadt
1436f395ceStb z_const char * const z_errmsg[10] = {
1536f395ceStb (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */
1636f395ceStb (z_const char *)"stream end", /* Z_STREAM_END 1 */
1736f395ceStb (z_const char *)"", /* Z_OK 0 */
1836f395ceStb (z_const char *)"file error", /* Z_ERRNO (-1) */
1936f395ceStb (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */
2036f395ceStb (z_const char *)"data error", /* Z_DATA_ERROR (-3) */
2136f395ceStb (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */
2236f395ceStb (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */
2336f395ceStb (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */
2436f395ceStb (z_const char *)""
2536f395ceStb };
266141cf33Sderaadt
276141cf33Sderaadt
zlibVersion(void)28*cfac609cStb const char * ZEXPORT zlibVersion(void) {
296141cf33Sderaadt return ZLIB_VERSION;
306141cf33Sderaadt }
316141cf33Sderaadt
zlibCompileFlags(void)32*cfac609cStb uLong ZEXPORT zlibCompileFlags(void) {
336141cf33Sderaadt uLong flags;
346141cf33Sderaadt
356141cf33Sderaadt flags = 0;
3636f395ceStb switch ((int)(sizeof(uInt))) {
376141cf33Sderaadt case 2: break;
386141cf33Sderaadt case 4: flags += 1; break;
396141cf33Sderaadt case 8: flags += 2; break;
406141cf33Sderaadt default: flags += 3;
416141cf33Sderaadt }
4236f395ceStb switch ((int)(sizeof(uLong))) {
436141cf33Sderaadt case 2: break;
446141cf33Sderaadt case 4: flags += 1 << 2; break;
456141cf33Sderaadt case 8: flags += 2 << 2; break;
466141cf33Sderaadt default: flags += 3 << 2;
476141cf33Sderaadt }
4836f395ceStb switch ((int)(sizeof(voidpf))) {
496141cf33Sderaadt case 2: break;
506141cf33Sderaadt case 4: flags += 1 << 4; break;
516141cf33Sderaadt case 8: flags += 2 << 4; break;
526141cf33Sderaadt default: flags += 3 << 4;
536141cf33Sderaadt }
5436f395ceStb switch ((int)(sizeof(z_off_t))) {
556141cf33Sderaadt case 2: break;
566141cf33Sderaadt case 4: flags += 1 << 6; break;
576141cf33Sderaadt case 8: flags += 2 << 6; break;
586141cf33Sderaadt default: flags += 3 << 6;
596141cf33Sderaadt }
6036f395ceStb #ifdef ZLIB_DEBUG
616141cf33Sderaadt flags += 1 << 8;
626141cf33Sderaadt #endif
63ddf65acdStb /*
646141cf33Sderaadt #if defined(ASMV) || defined(ASMINF)
656141cf33Sderaadt flags += 1 << 9;
666141cf33Sderaadt #endif
67ddf65acdStb */
686141cf33Sderaadt #ifdef ZLIB_WINAPI
696141cf33Sderaadt flags += 1 << 10;
706141cf33Sderaadt #endif
716141cf33Sderaadt #ifdef BUILDFIXED
726141cf33Sderaadt flags += 1 << 12;
736141cf33Sderaadt #endif
746141cf33Sderaadt #ifdef DYNAMIC_CRC_TABLE
756141cf33Sderaadt flags += 1 << 13;
766141cf33Sderaadt #endif
776141cf33Sderaadt #ifdef NO_GZCOMPRESS
786141cf33Sderaadt flags += 1L << 16;
796141cf33Sderaadt #endif
806141cf33Sderaadt #ifdef NO_GZIP
816141cf33Sderaadt flags += 1L << 17;
826141cf33Sderaadt #endif
836141cf33Sderaadt #ifdef PKZIP_BUG_WORKAROUND
846141cf33Sderaadt flags += 1L << 20;
856141cf33Sderaadt #endif
866141cf33Sderaadt #ifdef FASTEST
876141cf33Sderaadt flags += 1L << 21;
886141cf33Sderaadt #endif
8936f395ceStb #if defined(STDC) || defined(Z_HAVE_STDARG_H)
906141cf33Sderaadt # ifdef NO_vsnprintf
916141cf33Sderaadt flags += 1L << 25;
926141cf33Sderaadt # ifdef HAS_vsprintf_void
936141cf33Sderaadt flags += 1L << 26;
946141cf33Sderaadt # endif
956141cf33Sderaadt # else
966141cf33Sderaadt # ifdef HAS_vsnprintf_void
976141cf33Sderaadt flags += 1L << 26;
986141cf33Sderaadt # endif
996141cf33Sderaadt # endif
1006141cf33Sderaadt #else
1016141cf33Sderaadt flags += 1L << 24;
1026141cf33Sderaadt # ifdef NO_snprintf
1036141cf33Sderaadt flags += 1L << 25;
1046141cf33Sderaadt # ifdef HAS_sprintf_void
1056141cf33Sderaadt flags += 1L << 26;
1066141cf33Sderaadt # endif
1076141cf33Sderaadt # else
1086141cf33Sderaadt # ifdef HAS_snprintf_void
1096141cf33Sderaadt flags += 1L << 26;
1106141cf33Sderaadt # endif
1116141cf33Sderaadt # endif
1126141cf33Sderaadt #endif
1136141cf33Sderaadt return flags;
1146141cf33Sderaadt }
1156141cf33Sderaadt
11636f395ceStb #ifdef ZLIB_DEBUG
11736f395ceStb #include <stdlib.h>
1186141cf33Sderaadt # ifndef verbose
1196141cf33Sderaadt # define verbose 0
1206141cf33Sderaadt # endif
12136f395ceStb int ZLIB_INTERNAL z_verbose = verbose;
1226141cf33Sderaadt
z_error(char * m)123*cfac609cStb void ZLIB_INTERNAL z_error(char *m) {
1246141cf33Sderaadt fprintf(stderr, "%s\n", m);
1256141cf33Sderaadt exit(1);
1266141cf33Sderaadt }
1276141cf33Sderaadt #endif
1286141cf33Sderaadt
1296141cf33Sderaadt /* exported to allow conversion of error code to string for compress() and
1306141cf33Sderaadt * uncompress()
1316141cf33Sderaadt */
zError(int err)132*cfac609cStb const char * ZEXPORT zError(int err) {
1336141cf33Sderaadt return ERR_MSG(err);
1346141cf33Sderaadt }
1356141cf33Sderaadt
136a6530658Stb #if defined(_WIN32_WCE) && _WIN32_WCE < 0x800
137a6530658Stb /* The older Microsoft C Run-Time Library for Windows CE doesn't have
1386141cf33Sderaadt * errno. We define it as a global variable to simplify porting.
1396141cf33Sderaadt * Its value is always 0 and should not be used.
1406141cf33Sderaadt */
1416141cf33Sderaadt int errno = 0;
1426141cf33Sderaadt #endif
1436141cf33Sderaadt
1446141cf33Sderaadt #ifndef HAVE_MEMCPY
1456141cf33Sderaadt
zmemcpy(Bytef * dest,const Bytef * source,uInt len)146*cfac609cStb void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) {
1476141cf33Sderaadt if (len == 0) return;
1486141cf33Sderaadt do {
1496141cf33Sderaadt *dest++ = *source++; /* ??? to be unrolled */
1506141cf33Sderaadt } while (--len != 0);
1516141cf33Sderaadt }
1526141cf33Sderaadt
zmemcmp(const Bytef * s1,const Bytef * s2,uInt len)153*cfac609cStb int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) {
1546141cf33Sderaadt uInt j;
1556141cf33Sderaadt
1566141cf33Sderaadt for (j = 0; j < len; j++) {
1576141cf33Sderaadt if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
1586141cf33Sderaadt }
1596141cf33Sderaadt return 0;
1606141cf33Sderaadt }
1616141cf33Sderaadt
zmemzero(Bytef * dest,uInt len)162*cfac609cStb void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) {
1636141cf33Sderaadt if (len == 0) return;
1646141cf33Sderaadt do {
1656141cf33Sderaadt *dest++ = 0; /* ??? to be unrolled */
1666141cf33Sderaadt } while (--len != 0);
1676141cf33Sderaadt }
1686141cf33Sderaadt #endif
1696141cf33Sderaadt
17036f395ceStb #ifndef Z_SOLO
1716141cf33Sderaadt
1726141cf33Sderaadt #ifdef SYS16BIT
1736141cf33Sderaadt
1746141cf33Sderaadt #ifdef __TURBOC__
1756141cf33Sderaadt /* Turbo C in 16-bit mode */
1766141cf33Sderaadt
1776141cf33Sderaadt # define MY_ZCALLOC
1786141cf33Sderaadt
1796141cf33Sderaadt /* Turbo C malloc() does not allow dynamic allocation of 64K bytes
1806141cf33Sderaadt * and farmalloc(64K) returns a pointer with an offset of 8, so we
1816141cf33Sderaadt * must fix the pointer. Warning: the pointer must be put back to its
1826141cf33Sderaadt * original form in order to free it, use zcfree().
1836141cf33Sderaadt */
1846141cf33Sderaadt
1856141cf33Sderaadt #define MAX_PTR 10
1866141cf33Sderaadt /* 10*64K = 640K */
1876141cf33Sderaadt
1886141cf33Sderaadt local int next_ptr = 0;
1896141cf33Sderaadt
1906141cf33Sderaadt typedef struct ptr_table_s {
1916141cf33Sderaadt voidpf org_ptr;
1926141cf33Sderaadt voidpf new_ptr;
1936141cf33Sderaadt } ptr_table;
1946141cf33Sderaadt
1956141cf33Sderaadt local ptr_table table[MAX_PTR];
1966141cf33Sderaadt /* This table is used to remember the original form of pointers
1976141cf33Sderaadt * to large buffers (64K). Such pointers are normalized with a zero offset.
1986141cf33Sderaadt * Since MSDOS is not a preemptive multitasking OS, this table is not
1996141cf33Sderaadt * protected from concurrent access. This hack doesn't work anyway on
2006141cf33Sderaadt * a protected system like OS/2. Use Microsoft C instead.
2016141cf33Sderaadt */
2026141cf33Sderaadt
zcalloc(voidpf opaque,unsigned items,unsigned size)203*cfac609cStb voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
20436f395ceStb voidpf buf;
2056141cf33Sderaadt ulg bsize = (ulg)items*size;
2066141cf33Sderaadt
20736f395ceStb (void)opaque;
20836f395ceStb
2096141cf33Sderaadt /* If we allocate less than 65520 bytes, we assume that farmalloc
2106141cf33Sderaadt * will return a usable pointer which doesn't have to be normalized.
2116141cf33Sderaadt */
2126141cf33Sderaadt if (bsize < 65520L) {
2136141cf33Sderaadt buf = farmalloc(bsize);
2146141cf33Sderaadt if (*(ush*)&buf != 0) return buf;
2156141cf33Sderaadt } else {
2166141cf33Sderaadt buf = farmalloc(bsize + 16L);
2176141cf33Sderaadt }
2186141cf33Sderaadt if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
2196141cf33Sderaadt table[next_ptr].org_ptr = buf;
2206141cf33Sderaadt
2216141cf33Sderaadt /* Normalize the pointer to seg:0 */
2226141cf33Sderaadt *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
2236141cf33Sderaadt *(ush*)&buf = 0;
2246141cf33Sderaadt table[next_ptr++].new_ptr = buf;
2256141cf33Sderaadt return buf;
2266141cf33Sderaadt }
2276141cf33Sderaadt
zcfree(voidpf opaque,voidpf ptr)228*cfac609cStb void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
2296141cf33Sderaadt int n;
23036f395ceStb
23136f395ceStb (void)opaque;
23236f395ceStb
2336141cf33Sderaadt if (*(ush*)&ptr != 0) { /* object < 64K */
2346141cf33Sderaadt farfree(ptr);
2356141cf33Sderaadt return;
2366141cf33Sderaadt }
2376141cf33Sderaadt /* Find the original pointer */
2386141cf33Sderaadt for (n = 0; n < next_ptr; n++) {
2396141cf33Sderaadt if (ptr != table[n].new_ptr) continue;
2406141cf33Sderaadt
2416141cf33Sderaadt farfree(table[n].org_ptr);
2426141cf33Sderaadt while (++n < next_ptr) {
2436141cf33Sderaadt table[n-1] = table[n];
2446141cf33Sderaadt }
2456141cf33Sderaadt next_ptr--;
2466141cf33Sderaadt return;
2476141cf33Sderaadt }
2486141cf33Sderaadt Assert(0, "zcfree: ptr not found");
2496141cf33Sderaadt }
2506141cf33Sderaadt
2516141cf33Sderaadt #endif /* __TURBOC__ */
2526141cf33Sderaadt
2536141cf33Sderaadt
2546141cf33Sderaadt #ifdef M_I86
2556141cf33Sderaadt /* Microsoft C in 16-bit mode */
2566141cf33Sderaadt
2576141cf33Sderaadt # define MY_ZCALLOC
2586141cf33Sderaadt
2596141cf33Sderaadt #if (!defined(_MSC_VER) || (_MSC_VER <= 600))
2606141cf33Sderaadt # define _halloc halloc
2616141cf33Sderaadt # define _hfree hfree
2626141cf33Sderaadt #endif
2636141cf33Sderaadt
zcalloc(voidpf opaque,uInt items,uInt size)264*cfac609cStb voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) {
26536f395ceStb (void)opaque;
2666141cf33Sderaadt return _halloc((long)items, size);
2676141cf33Sderaadt }
2686141cf33Sderaadt
zcfree(voidpf opaque,voidpf ptr)269*cfac609cStb void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
27036f395ceStb (void)opaque;
2716141cf33Sderaadt _hfree(ptr);
2726141cf33Sderaadt }
2736141cf33Sderaadt
2746141cf33Sderaadt #endif /* M_I86 */
2756141cf33Sderaadt
2766141cf33Sderaadt #endif /* SYS16BIT */
2776141cf33Sderaadt
2786141cf33Sderaadt
2796141cf33Sderaadt #ifndef MY_ZCALLOC /* Any system without a special alloc function */
2806141cf33Sderaadt
2816141cf33Sderaadt #ifndef STDC
282*cfac609cStb extern voidp malloc(uInt size);
283*cfac609cStb extern voidp calloc(uInt items, uInt size);
284*cfac609cStb extern void free(voidpf ptr);
2856141cf33Sderaadt #endif
2866141cf33Sderaadt
zcalloc(voidpf opaque,unsigned items,unsigned size)287*cfac609cStb voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
28836f395ceStb (void)opaque;
28936f395ceStb if (items == 0 || size == 0)
2906141cf33Sderaadt return (NULL);
29136f395ceStb return reallocarray(NULL, items, size);
2926141cf33Sderaadt }
2936141cf33Sderaadt
zcfree(voidpf opaque,voidpf ptr)294*cfac609cStb void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
29536f395ceStb (void)opaque;
2966141cf33Sderaadt free(ptr);
2976141cf33Sderaadt }
2986141cf33Sderaadt
2996141cf33Sderaadt #endif /* MY_ZCALLOC */
30036f395ceStb
30136f395ceStb #endif /* !Z_SOLO */
302