xref: /plan9/sys/src/cmd/gs/zlib/zutil.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
17dd7cddfSDavid du Colombier /* zutil.c -- target dependent utility functions for the compression library
2*593dc095SDavid du Colombier  * Copyright (C) 1995-2003 Jean-loup Gailly.
37dd7cddfSDavid du Colombier  * For conditions of distribution and use, see copyright notice in zlib.h
47dd7cddfSDavid du Colombier  */
57dd7cddfSDavid du Colombier 
6*593dc095SDavid du Colombier /* @(#) $Id: zutil.c,v 1.1.1.1 2005/04/24 21:39:38 giles Exp $ */
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier #include "zutil.h"
97dd7cddfSDavid du Colombier 
10*593dc095SDavid du Colombier #ifndef NO_DUMMY_DECL
117dd7cddfSDavid du Colombier struct internal_state      {int dummy;}; /* for buggy compilers */
12*593dc095SDavid du Colombier #endif
137dd7cddfSDavid du Colombier 
147dd7cddfSDavid du Colombier #ifndef STDC
157dd7cddfSDavid du Colombier extern void exit OF((int));
167dd7cddfSDavid du Colombier #endif
177dd7cddfSDavid du Colombier 
18*593dc095SDavid du Colombier const char * const z_errmsg[10] = {
197dd7cddfSDavid du Colombier "need dictionary",     /* Z_NEED_DICT       2  */
207dd7cddfSDavid du Colombier "stream end",          /* Z_STREAM_END      1  */
217dd7cddfSDavid du Colombier "",                    /* Z_OK              0  */
227dd7cddfSDavid du Colombier "file error",          /* Z_ERRNO         (-1) */
237dd7cddfSDavid du Colombier "stream error",        /* Z_STREAM_ERROR  (-2) */
247dd7cddfSDavid du Colombier "data error",          /* Z_DATA_ERROR    (-3) */
257dd7cddfSDavid du Colombier "insufficient memory", /* Z_MEM_ERROR     (-4) */
267dd7cddfSDavid du Colombier "buffer error",        /* Z_BUF_ERROR     (-5) */
277dd7cddfSDavid du Colombier "incompatible version",/* Z_VERSION_ERROR (-6) */
287dd7cddfSDavid du Colombier ""};
297dd7cddfSDavid du Colombier 
307dd7cddfSDavid du Colombier 
zlibVersion()31*593dc095SDavid du Colombier const char * ZEXPORT zlibVersion()
327dd7cddfSDavid du Colombier {
337dd7cddfSDavid du Colombier     return ZLIB_VERSION;
347dd7cddfSDavid du Colombier }
357dd7cddfSDavid du Colombier 
zlibCompileFlags()36*593dc095SDavid du Colombier uLong ZEXPORT zlibCompileFlags()
37*593dc095SDavid du Colombier {
38*593dc095SDavid du Colombier     uLong flags;
39*593dc095SDavid du Colombier 
40*593dc095SDavid du Colombier     flags = 0;
41*593dc095SDavid du Colombier     switch (sizeof(uInt)) {
42*593dc095SDavid du Colombier     case 2:     break;
43*593dc095SDavid du Colombier     case 4:     flags += 1;     break;
44*593dc095SDavid du Colombier     case 8:     flags += 2;     break;
45*593dc095SDavid du Colombier     default:    flags += 3;
46*593dc095SDavid du Colombier     }
47*593dc095SDavid du Colombier     switch (sizeof(uLong)) {
48*593dc095SDavid du Colombier     case 2:     break;
49*593dc095SDavid du Colombier     case 4:     flags += 1 << 2;        break;
50*593dc095SDavid du Colombier     case 8:     flags += 2 << 2;        break;
51*593dc095SDavid du Colombier     default:    flags += 3 << 2;
52*593dc095SDavid du Colombier     }
53*593dc095SDavid du Colombier     switch (sizeof(voidpf)) {
54*593dc095SDavid du Colombier     case 2:     break;
55*593dc095SDavid du Colombier     case 4:     flags += 1 << 4;        break;
56*593dc095SDavid du Colombier     case 8:     flags += 2 << 4;        break;
57*593dc095SDavid du Colombier     default:    flags += 3 << 4;
58*593dc095SDavid du Colombier     }
59*593dc095SDavid du Colombier     switch (sizeof(z_off_t)) {
60*593dc095SDavid du Colombier     case 2:     break;
61*593dc095SDavid du Colombier     case 4:     flags += 1 << 6;        break;
62*593dc095SDavid du Colombier     case 8:     flags += 2 << 6;        break;
63*593dc095SDavid du Colombier     default:    flags += 3 << 6;
64*593dc095SDavid du Colombier     }
657dd7cddfSDavid du Colombier #ifdef DEBUG
66*593dc095SDavid du Colombier     flags += 1 << 8;
67*593dc095SDavid du Colombier #endif
68*593dc095SDavid du Colombier #if defined(ASMV) || defined(ASMINF)
69*593dc095SDavid du Colombier     flags += 1 << 9;
70*593dc095SDavid du Colombier #endif
71*593dc095SDavid du Colombier #ifdef ZLIB_WINAPI
72*593dc095SDavid du Colombier     flags += 1 << 10;
73*593dc095SDavid du Colombier #endif
74*593dc095SDavid du Colombier #ifdef BUILDFIXED
75*593dc095SDavid du Colombier     flags += 1 << 12;
76*593dc095SDavid du Colombier #endif
77*593dc095SDavid du Colombier #ifdef DYNAMIC_CRC_TABLE
78*593dc095SDavid du Colombier     flags += 1 << 13;
79*593dc095SDavid du Colombier #endif
80*593dc095SDavid du Colombier #ifdef NO_GZCOMPRESS
81*593dc095SDavid du Colombier     flags += 1 << 16;
82*593dc095SDavid du Colombier #endif
83*593dc095SDavid du Colombier #ifdef NO_GZIP
84*593dc095SDavid du Colombier     flags += 1 << 17;
85*593dc095SDavid du Colombier #endif
86*593dc095SDavid du Colombier #ifdef PKZIP_BUG_WORKAROUND
87*593dc095SDavid du Colombier     flags += 1 << 20;
88*593dc095SDavid du Colombier #endif
89*593dc095SDavid du Colombier #ifdef FASTEST
90*593dc095SDavid du Colombier     flags += 1 << 21;
91*593dc095SDavid du Colombier #endif
92*593dc095SDavid du Colombier #ifdef STDC
93*593dc095SDavid du Colombier #  ifdef NO_vsnprintf
94*593dc095SDavid du Colombier         flags += 1 << 25;
95*593dc095SDavid du Colombier #    ifdef HAS_vsprintf_void
96*593dc095SDavid du Colombier         flags += 1 << 26;
97*593dc095SDavid du Colombier #    endif
98*593dc095SDavid du Colombier #  else
99*593dc095SDavid du Colombier #    ifdef HAS_vsnprintf_void
100*593dc095SDavid du Colombier         flags += 1 << 26;
101*593dc095SDavid du Colombier #    endif
102*593dc095SDavid du Colombier #  endif
103*593dc095SDavid du Colombier #else
104*593dc095SDavid du Colombier         flags += 1 << 24;
105*593dc095SDavid du Colombier #  ifdef NO_snprintf
106*593dc095SDavid du Colombier         flags += 1 << 25;
107*593dc095SDavid du Colombier #    ifdef HAS_sprintf_void
108*593dc095SDavid du Colombier         flags += 1 << 26;
109*593dc095SDavid du Colombier #    endif
110*593dc095SDavid du Colombier #  else
111*593dc095SDavid du Colombier #    ifdef HAS_snprintf_void
112*593dc095SDavid du Colombier         flags += 1 << 26;
113*593dc095SDavid du Colombier #    endif
114*593dc095SDavid du Colombier #  endif
115*593dc095SDavid du Colombier #endif
116*593dc095SDavid du Colombier     return flags;
117*593dc095SDavid du Colombier }
118*593dc095SDavid du Colombier 
119*593dc095SDavid du Colombier #ifdef DEBUG
120*593dc095SDavid du Colombier 
121*593dc095SDavid du Colombier #  ifndef verbose
122*593dc095SDavid du Colombier #    define verbose 0
123*593dc095SDavid du Colombier #  endif
124*593dc095SDavid du Colombier int z_verbose = verbose;
125*593dc095SDavid du Colombier 
z_error(m)1267dd7cddfSDavid du Colombier void z_error (m)
1277dd7cddfSDavid du Colombier     char *m;
1287dd7cddfSDavid du Colombier {
1297dd7cddfSDavid du Colombier     fprintf(stderr, "%s\n", m);
1307dd7cddfSDavid du Colombier     exit(1);
1317dd7cddfSDavid du Colombier }
1327dd7cddfSDavid du Colombier #endif
1337dd7cddfSDavid du Colombier 
134*593dc095SDavid du Colombier /* exported to allow conversion of error code to string for compress() and
135*593dc095SDavid du Colombier  * uncompress()
136*593dc095SDavid du Colombier  */
zError(err)137*593dc095SDavid du Colombier const char * ZEXPORT zError(err)
138*593dc095SDavid du Colombier     int err;
139*593dc095SDavid du Colombier {
140*593dc095SDavid du Colombier     return ERR_MSG(err);
141*593dc095SDavid du Colombier }
142*593dc095SDavid du Colombier 
143*593dc095SDavid du Colombier #if defined(_WIN32_WCE)
144*593dc095SDavid du Colombier     /* does not exist on WCE */
145*593dc095SDavid du Colombier     int errno = 0;
146*593dc095SDavid du Colombier #endif
147*593dc095SDavid du Colombier 
1487dd7cddfSDavid du Colombier #ifndef HAVE_MEMCPY
1497dd7cddfSDavid du Colombier 
zmemcpy(dest,source,len)1507dd7cddfSDavid du Colombier void zmemcpy(dest, source, len)
1517dd7cddfSDavid du Colombier     Bytef* dest;
152*593dc095SDavid du Colombier     const Bytef* source;
1537dd7cddfSDavid du Colombier     uInt  len;
1547dd7cddfSDavid du Colombier {
1557dd7cddfSDavid du Colombier     if (len == 0) return;
1567dd7cddfSDavid du Colombier     do {
1577dd7cddfSDavid du Colombier         *dest++ = *source++; /* ??? to be unrolled */
1587dd7cddfSDavid du Colombier     } while (--len != 0);
1597dd7cddfSDavid du Colombier }
1607dd7cddfSDavid du Colombier 
zmemcmp(s1,s2,len)1617dd7cddfSDavid du Colombier int zmemcmp(s1, s2, len)
162*593dc095SDavid du Colombier     const Bytef* s1;
163*593dc095SDavid du Colombier     const Bytef* s2;
1647dd7cddfSDavid du Colombier     uInt  len;
1657dd7cddfSDavid du Colombier {
1667dd7cddfSDavid du Colombier     uInt j;
1677dd7cddfSDavid du Colombier 
1687dd7cddfSDavid du Colombier     for (j = 0; j < len; j++) {
1697dd7cddfSDavid du Colombier         if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
1707dd7cddfSDavid du Colombier     }
1717dd7cddfSDavid du Colombier     return 0;
1727dd7cddfSDavid du Colombier }
1737dd7cddfSDavid du Colombier 
zmemzero(dest,len)1747dd7cddfSDavid du Colombier void zmemzero(dest, len)
1757dd7cddfSDavid du Colombier     Bytef* dest;
1767dd7cddfSDavid du Colombier     uInt  len;
1777dd7cddfSDavid du Colombier {
1787dd7cddfSDavid du Colombier     if (len == 0) return;
1797dd7cddfSDavid du Colombier     do {
1807dd7cddfSDavid du Colombier         *dest++ = 0;  /* ??? to be unrolled */
1817dd7cddfSDavid du Colombier     } while (--len != 0);
1827dd7cddfSDavid du Colombier }
1837dd7cddfSDavid du Colombier #endif
1847dd7cddfSDavid du Colombier 
185*593dc095SDavid du Colombier 
186*593dc095SDavid du Colombier #ifdef SYS16BIT
187*593dc095SDavid du Colombier 
1887dd7cddfSDavid du Colombier #ifdef __TURBOC__
189*593dc095SDavid du Colombier /* Turbo C in 16-bit mode */
190*593dc095SDavid du Colombier 
1917dd7cddfSDavid du Colombier #  define MY_ZCALLOC
1927dd7cddfSDavid du Colombier 
1937dd7cddfSDavid du Colombier /* Turbo C malloc() does not allow dynamic allocation of 64K bytes
1947dd7cddfSDavid du Colombier  * and farmalloc(64K) returns a pointer with an offset of 8, so we
1957dd7cddfSDavid du Colombier  * must fix the pointer. Warning: the pointer must be put back to its
1967dd7cddfSDavid du Colombier  * original form in order to free it, use zcfree().
1977dd7cddfSDavid du Colombier  */
1987dd7cddfSDavid du Colombier 
1997dd7cddfSDavid du Colombier #define MAX_PTR 10
2007dd7cddfSDavid du Colombier /* 10*64K = 640K */
2017dd7cddfSDavid du Colombier 
2027dd7cddfSDavid du Colombier local int next_ptr = 0;
2037dd7cddfSDavid du Colombier 
2047dd7cddfSDavid du Colombier typedef struct ptr_table_s {
2057dd7cddfSDavid du Colombier     voidpf org_ptr;
2067dd7cddfSDavid du Colombier     voidpf new_ptr;
2077dd7cddfSDavid du Colombier } ptr_table;
2087dd7cddfSDavid du Colombier 
2097dd7cddfSDavid du Colombier local ptr_table table[MAX_PTR];
2107dd7cddfSDavid du Colombier /* This table is used to remember the original form of pointers
2117dd7cddfSDavid du Colombier  * to large buffers (64K). Such pointers are normalized with a zero offset.
2127dd7cddfSDavid du Colombier  * Since MSDOS is not a preemptive multitasking OS, this table is not
2137dd7cddfSDavid du Colombier  * protected from concurrent access. This hack doesn't work anyway on
2147dd7cddfSDavid du Colombier  * a protected system like OS/2. Use Microsoft C instead.
2157dd7cddfSDavid du Colombier  */
2167dd7cddfSDavid du Colombier 
zcalloc(voidpf opaque,unsigned items,unsigned size)2177dd7cddfSDavid du Colombier voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
2187dd7cddfSDavid du Colombier {
2197dd7cddfSDavid du Colombier     voidpf buf = opaque; /* just to make some compilers happy */
2207dd7cddfSDavid du Colombier     ulg bsize = (ulg)items*size;
2217dd7cddfSDavid du Colombier 
2227dd7cddfSDavid du Colombier     /* If we allocate less than 65520 bytes, we assume that farmalloc
2237dd7cddfSDavid du Colombier      * will return a usable pointer which doesn't have to be normalized.
2247dd7cddfSDavid du Colombier      */
2257dd7cddfSDavid du Colombier     if (bsize < 65520L) {
2267dd7cddfSDavid du Colombier         buf = farmalloc(bsize);
2277dd7cddfSDavid du Colombier         if (*(ush*)&buf != 0) return buf;
2287dd7cddfSDavid du Colombier     } else {
2297dd7cddfSDavid du Colombier         buf = farmalloc(bsize + 16L);
2307dd7cddfSDavid du Colombier     }
2317dd7cddfSDavid du Colombier     if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
2327dd7cddfSDavid du Colombier     table[next_ptr].org_ptr = buf;
2337dd7cddfSDavid du Colombier 
2347dd7cddfSDavid du Colombier     /* Normalize the pointer to seg:0 */
2357dd7cddfSDavid du Colombier     *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
2367dd7cddfSDavid du Colombier     *(ush*)&buf = 0;
2377dd7cddfSDavid du Colombier     table[next_ptr++].new_ptr = buf;
2387dd7cddfSDavid du Colombier     return buf;
2397dd7cddfSDavid du Colombier }
2407dd7cddfSDavid du Colombier 
zcfree(voidpf opaque,voidpf ptr)2417dd7cddfSDavid du Colombier void  zcfree (voidpf opaque, voidpf ptr)
2427dd7cddfSDavid du Colombier {
2437dd7cddfSDavid du Colombier     int n;
2447dd7cddfSDavid du Colombier     if (*(ush*)&ptr != 0) { /* object < 64K */
2457dd7cddfSDavid du Colombier         farfree(ptr);
2467dd7cddfSDavid du Colombier         return;
2477dd7cddfSDavid du Colombier     }
2487dd7cddfSDavid du Colombier     /* Find the original pointer */
2497dd7cddfSDavid du Colombier     for (n = 0; n < next_ptr; n++) {
2507dd7cddfSDavid du Colombier         if (ptr != table[n].new_ptr) continue;
2517dd7cddfSDavid du Colombier 
2527dd7cddfSDavid du Colombier         farfree(table[n].org_ptr);
2537dd7cddfSDavid du Colombier         while (++n < next_ptr) {
2547dd7cddfSDavid du Colombier             table[n-1] = table[n];
2557dd7cddfSDavid du Colombier         }
2567dd7cddfSDavid du Colombier         next_ptr--;
2577dd7cddfSDavid du Colombier         return;
2587dd7cddfSDavid du Colombier     }
2597dd7cddfSDavid du Colombier     ptr = opaque; /* just to make some compilers happy */
2607dd7cddfSDavid du Colombier     Assert(0, "zcfree: ptr not found");
2617dd7cddfSDavid du Colombier }
262*593dc095SDavid du Colombier 
2637dd7cddfSDavid du Colombier #endif /* __TURBOC__ */
2647dd7cddfSDavid du Colombier 
2657dd7cddfSDavid du Colombier 
266*593dc095SDavid du Colombier #ifdef M_I86
2677dd7cddfSDavid du Colombier /* Microsoft C in 16-bit mode */
2687dd7cddfSDavid du Colombier 
2697dd7cddfSDavid du Colombier #  define MY_ZCALLOC
2707dd7cddfSDavid du Colombier 
271*593dc095SDavid du Colombier #if (!defined(_MSC_VER) || (_MSC_VER <= 600))
2727dd7cddfSDavid du Colombier #  define _halloc  halloc
2737dd7cddfSDavid du Colombier #  define _hfree   hfree
2747dd7cddfSDavid du Colombier #endif
2757dd7cddfSDavid du Colombier 
zcalloc(voidpf opaque,unsigned items,unsigned size)2767dd7cddfSDavid du Colombier voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
2777dd7cddfSDavid du Colombier {
2787dd7cddfSDavid du Colombier     if (opaque) opaque = 0; /* to make compiler happy */
2797dd7cddfSDavid du Colombier     return _halloc((long)items, size);
2807dd7cddfSDavid du Colombier }
2817dd7cddfSDavid du Colombier 
zcfree(voidpf opaque,voidpf ptr)2827dd7cddfSDavid du Colombier void  zcfree (voidpf opaque, voidpf ptr)
2837dd7cddfSDavid du Colombier {
2847dd7cddfSDavid du Colombier     if (opaque) opaque = 0; /* to make compiler happy */
2857dd7cddfSDavid du Colombier     _hfree(ptr);
2867dd7cddfSDavid du Colombier }
2877dd7cddfSDavid du Colombier 
288*593dc095SDavid du Colombier #endif /* M_I86 */
289*593dc095SDavid du Colombier 
290*593dc095SDavid du Colombier #endif /* SYS16BIT */
2917dd7cddfSDavid du Colombier 
2927dd7cddfSDavid du Colombier 
2937dd7cddfSDavid du Colombier #ifndef MY_ZCALLOC /* Any system without a special alloc function */
2947dd7cddfSDavid du Colombier 
2957dd7cddfSDavid du Colombier #ifndef STDC
296*593dc095SDavid du Colombier extern voidp  malloc OF((uInt size));
2977dd7cddfSDavid du Colombier extern voidp  calloc OF((uInt items, uInt size));
2987dd7cddfSDavid du Colombier extern void   free   OF((voidpf ptr));
2997dd7cddfSDavid du Colombier #endif
3007dd7cddfSDavid du Colombier 
zcalloc(opaque,items,size)3017dd7cddfSDavid du Colombier voidpf zcalloc (opaque, items, size)
3027dd7cddfSDavid du Colombier     voidpf opaque;
3037dd7cddfSDavid du Colombier     unsigned items;
3047dd7cddfSDavid du Colombier     unsigned size;
3057dd7cddfSDavid du Colombier {
3067dd7cddfSDavid du Colombier     if (opaque) items += size - size; /* make compiler happy */
307*593dc095SDavid du Colombier     return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
308*593dc095SDavid du Colombier                               (voidpf)calloc(items, size);
3097dd7cddfSDavid du Colombier }
3107dd7cddfSDavid du Colombier 
zcfree(opaque,ptr)3117dd7cddfSDavid du Colombier void  zcfree (opaque, ptr)
3127dd7cddfSDavid du Colombier     voidpf opaque;
3137dd7cddfSDavid du Colombier     voidpf ptr;
3147dd7cddfSDavid du Colombier {
3157dd7cddfSDavid du Colombier     free(ptr);
3167dd7cddfSDavid du Colombier     if (opaque) return; /* make compiler happy */
3177dd7cddfSDavid du Colombier }
3187dd7cddfSDavid du Colombier 
3197dd7cddfSDavid du Colombier #endif /* MY_ZCALLOC */
320