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