1*221b1638SMasahiro Yamada /* zutil.c -- target dependent utility functions for the compression library 2*221b1638SMasahiro Yamada * Copyright (C) 1995-2017 Jean-loup Gailly 3*221b1638SMasahiro Yamada * For conditions of distribution and use, see copyright notice in zlib.h 4*221b1638SMasahiro Yamada */ 5*221b1638SMasahiro Yamada 6*221b1638SMasahiro Yamada /* @(#) $Id$ */ 7*221b1638SMasahiro Yamada 8*221b1638SMasahiro Yamada #include "zutil.h" 9*221b1638SMasahiro Yamada #ifndef Z_SOLO 10*221b1638SMasahiro Yamada # include "gzguts.h" 11*221b1638SMasahiro Yamada #endif 12*221b1638SMasahiro Yamada 13*221b1638SMasahiro Yamada z_const char * const z_errmsg[10] = { 14*221b1638SMasahiro Yamada (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ 15*221b1638SMasahiro Yamada (z_const char *)"stream end", /* Z_STREAM_END 1 */ 16*221b1638SMasahiro Yamada (z_const char *)"", /* Z_OK 0 */ 17*221b1638SMasahiro Yamada (z_const char *)"file error", /* Z_ERRNO (-1) */ 18*221b1638SMasahiro Yamada (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ 19*221b1638SMasahiro Yamada (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ 20*221b1638SMasahiro Yamada (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ 21*221b1638SMasahiro Yamada (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ 22*221b1638SMasahiro Yamada (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ 23*221b1638SMasahiro Yamada (z_const char *)"" 24*221b1638SMasahiro Yamada }; 25*221b1638SMasahiro Yamada 26*221b1638SMasahiro Yamada 27*221b1638SMasahiro Yamada const char * ZEXPORT zlibVersion() 28*221b1638SMasahiro Yamada { 29*221b1638SMasahiro Yamada return ZLIB_VERSION; 30*221b1638SMasahiro Yamada } 31*221b1638SMasahiro Yamada 32*221b1638SMasahiro Yamada uLong ZEXPORT zlibCompileFlags() 33*221b1638SMasahiro Yamada { 34*221b1638SMasahiro Yamada uLong flags; 35*221b1638SMasahiro Yamada 36*221b1638SMasahiro Yamada flags = 0; 37*221b1638SMasahiro Yamada switch ((int)(sizeof(uInt))) { 38*221b1638SMasahiro Yamada case 2: break; 39*221b1638SMasahiro Yamada case 4: flags += 1; break; 40*221b1638SMasahiro Yamada case 8: flags += 2; break; 41*221b1638SMasahiro Yamada default: flags += 3; 42*221b1638SMasahiro Yamada } 43*221b1638SMasahiro Yamada switch ((int)(sizeof(uLong))) { 44*221b1638SMasahiro Yamada case 2: break; 45*221b1638SMasahiro Yamada case 4: flags += 1 << 2; break; 46*221b1638SMasahiro Yamada case 8: flags += 2 << 2; break; 47*221b1638SMasahiro Yamada default: flags += 3 << 2; 48*221b1638SMasahiro Yamada } 49*221b1638SMasahiro Yamada switch ((int)(sizeof(voidpf))) { 50*221b1638SMasahiro Yamada case 2: break; 51*221b1638SMasahiro Yamada case 4: flags += 1 << 4; break; 52*221b1638SMasahiro Yamada case 8: flags += 2 << 4; break; 53*221b1638SMasahiro Yamada default: flags += 3 << 4; 54*221b1638SMasahiro Yamada } 55*221b1638SMasahiro Yamada switch ((int)(sizeof(z_off_t))) { 56*221b1638SMasahiro Yamada case 2: break; 57*221b1638SMasahiro Yamada case 4: flags += 1 << 6; break; 58*221b1638SMasahiro Yamada case 8: flags += 2 << 6; break; 59*221b1638SMasahiro Yamada default: flags += 3 << 6; 60*221b1638SMasahiro Yamada } 61*221b1638SMasahiro Yamada #ifdef ZLIB_DEBUG 62*221b1638SMasahiro Yamada flags += 1 << 8; 63*221b1638SMasahiro Yamada #endif 64*221b1638SMasahiro Yamada #if defined(ASMV) || defined(ASMINF) 65*221b1638SMasahiro Yamada flags += 1 << 9; 66*221b1638SMasahiro Yamada #endif 67*221b1638SMasahiro Yamada #ifdef ZLIB_WINAPI 68*221b1638SMasahiro Yamada flags += 1 << 10; 69*221b1638SMasahiro Yamada #endif 70*221b1638SMasahiro Yamada #ifdef BUILDFIXED 71*221b1638SMasahiro Yamada flags += 1 << 12; 72*221b1638SMasahiro Yamada #endif 73*221b1638SMasahiro Yamada #ifdef DYNAMIC_CRC_TABLE 74*221b1638SMasahiro Yamada flags += 1 << 13; 75*221b1638SMasahiro Yamada #endif 76*221b1638SMasahiro Yamada #ifdef NO_GZCOMPRESS 77*221b1638SMasahiro Yamada flags += 1L << 16; 78*221b1638SMasahiro Yamada #endif 79*221b1638SMasahiro Yamada #ifdef NO_GZIP 80*221b1638SMasahiro Yamada flags += 1L << 17; 81*221b1638SMasahiro Yamada #endif 82*221b1638SMasahiro Yamada #ifdef PKZIP_BUG_WORKAROUND 83*221b1638SMasahiro Yamada flags += 1L << 20; 84*221b1638SMasahiro Yamada #endif 85*221b1638SMasahiro Yamada #ifdef FASTEST 86*221b1638SMasahiro Yamada flags += 1L << 21; 87*221b1638SMasahiro Yamada #endif 88*221b1638SMasahiro Yamada #if defined(STDC) || defined(Z_HAVE_STDARG_H) 89*221b1638SMasahiro Yamada # ifdef NO_vsnprintf 90*221b1638SMasahiro Yamada flags += 1L << 25; 91*221b1638SMasahiro Yamada # ifdef HAS_vsprintf_void 92*221b1638SMasahiro Yamada flags += 1L << 26; 93*221b1638SMasahiro Yamada # endif 94*221b1638SMasahiro Yamada # else 95*221b1638SMasahiro Yamada # ifdef HAS_vsnprintf_void 96*221b1638SMasahiro Yamada flags += 1L << 26; 97*221b1638SMasahiro Yamada # endif 98*221b1638SMasahiro Yamada # endif 99*221b1638SMasahiro Yamada #else 100*221b1638SMasahiro Yamada flags += 1L << 24; 101*221b1638SMasahiro Yamada # ifdef NO_snprintf 102*221b1638SMasahiro Yamada flags += 1L << 25; 103*221b1638SMasahiro Yamada # ifdef HAS_sprintf_void 104*221b1638SMasahiro Yamada flags += 1L << 26; 105*221b1638SMasahiro Yamada # endif 106*221b1638SMasahiro Yamada # else 107*221b1638SMasahiro Yamada # ifdef HAS_snprintf_void 108*221b1638SMasahiro Yamada flags += 1L << 26; 109*221b1638SMasahiro Yamada # endif 110*221b1638SMasahiro Yamada # endif 111*221b1638SMasahiro Yamada #endif 112*221b1638SMasahiro Yamada return flags; 113*221b1638SMasahiro Yamada } 114*221b1638SMasahiro Yamada 115*221b1638SMasahiro Yamada #ifdef ZLIB_DEBUG 116*221b1638SMasahiro Yamada #include <stdlib.h> 117*221b1638SMasahiro Yamada # ifndef verbose 118*221b1638SMasahiro Yamada # define verbose 0 119*221b1638SMasahiro Yamada # endif 120*221b1638SMasahiro Yamada int ZLIB_INTERNAL z_verbose = verbose; 121*221b1638SMasahiro Yamada 122*221b1638SMasahiro Yamada void ZLIB_INTERNAL z_error (m) 123*221b1638SMasahiro Yamada char *m; 124*221b1638SMasahiro Yamada { 125*221b1638SMasahiro Yamada fprintf(stderr, "%s\n", m); 126*221b1638SMasahiro Yamada exit(1); 127*221b1638SMasahiro Yamada } 128*221b1638SMasahiro Yamada #endif 129*221b1638SMasahiro Yamada 130*221b1638SMasahiro Yamada /* exported to allow conversion of error code to string for compress() and 131*221b1638SMasahiro Yamada * uncompress() 132*221b1638SMasahiro Yamada */ 133*221b1638SMasahiro Yamada const char * ZEXPORT zError(err) 134*221b1638SMasahiro Yamada int err; 135*221b1638SMasahiro Yamada { 136*221b1638SMasahiro Yamada return ERR_MSG(err); 137*221b1638SMasahiro Yamada } 138*221b1638SMasahiro Yamada 139*221b1638SMasahiro Yamada #if defined(_WIN32_WCE) 140*221b1638SMasahiro Yamada /* The Microsoft C Run-Time Library for Windows CE doesn't have 141*221b1638SMasahiro Yamada * errno. We define it as a global variable to simplify porting. 142*221b1638SMasahiro Yamada * Its value is always 0 and should not be used. 143*221b1638SMasahiro Yamada */ 144*221b1638SMasahiro Yamada int errno = 0; 145*221b1638SMasahiro Yamada #endif 146*221b1638SMasahiro Yamada 147*221b1638SMasahiro Yamada #ifndef HAVE_MEMCPY 148*221b1638SMasahiro Yamada 149*221b1638SMasahiro Yamada void ZLIB_INTERNAL zmemcpy(dest, source, len) 150*221b1638SMasahiro Yamada Bytef* dest; 151*221b1638SMasahiro Yamada const Bytef* source; 152*221b1638SMasahiro Yamada uInt len; 153*221b1638SMasahiro Yamada { 154*221b1638SMasahiro Yamada if (len == 0) return; 155*221b1638SMasahiro Yamada do { 156*221b1638SMasahiro Yamada *dest++ = *source++; /* ??? to be unrolled */ 157*221b1638SMasahiro Yamada } while (--len != 0); 158*221b1638SMasahiro Yamada } 159*221b1638SMasahiro Yamada 160*221b1638SMasahiro Yamada int ZLIB_INTERNAL zmemcmp(s1, s2, len) 161*221b1638SMasahiro Yamada const Bytef* s1; 162*221b1638SMasahiro Yamada const Bytef* s2; 163*221b1638SMasahiro Yamada uInt len; 164*221b1638SMasahiro Yamada { 165*221b1638SMasahiro Yamada uInt j; 166*221b1638SMasahiro Yamada 167*221b1638SMasahiro Yamada for (j = 0; j < len; j++) { 168*221b1638SMasahiro Yamada if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; 169*221b1638SMasahiro Yamada } 170*221b1638SMasahiro Yamada return 0; 171*221b1638SMasahiro Yamada } 172*221b1638SMasahiro Yamada 173*221b1638SMasahiro Yamada void ZLIB_INTERNAL zmemzero(dest, len) 174*221b1638SMasahiro Yamada Bytef* dest; 175*221b1638SMasahiro Yamada uInt len; 176*221b1638SMasahiro Yamada { 177*221b1638SMasahiro Yamada if (len == 0) return; 178*221b1638SMasahiro Yamada do { 179*221b1638SMasahiro Yamada *dest++ = 0; /* ??? to be unrolled */ 180*221b1638SMasahiro Yamada } while (--len != 0); 181*221b1638SMasahiro Yamada } 182*221b1638SMasahiro Yamada #endif 183*221b1638SMasahiro Yamada 184*221b1638SMasahiro Yamada #ifndef Z_SOLO 185*221b1638SMasahiro Yamada 186*221b1638SMasahiro Yamada #ifdef SYS16BIT 187*221b1638SMasahiro Yamada 188*221b1638SMasahiro Yamada #ifdef __TURBOC__ 189*221b1638SMasahiro Yamada /* Turbo C in 16-bit mode */ 190*221b1638SMasahiro Yamada 191*221b1638SMasahiro Yamada # define MY_ZCALLOC 192*221b1638SMasahiro Yamada 193*221b1638SMasahiro Yamada /* Turbo C malloc() does not allow dynamic allocation of 64K bytes 194*221b1638SMasahiro Yamada * and farmalloc(64K) returns a pointer with an offset of 8, so we 195*221b1638SMasahiro Yamada * must fix the pointer. Warning: the pointer must be put back to its 196*221b1638SMasahiro Yamada * original form in order to free it, use zcfree(). 197*221b1638SMasahiro Yamada */ 198*221b1638SMasahiro Yamada 199*221b1638SMasahiro Yamada #define MAX_PTR 10 200*221b1638SMasahiro Yamada /* 10*64K = 640K */ 201*221b1638SMasahiro Yamada 202*221b1638SMasahiro Yamada local int next_ptr = 0; 203*221b1638SMasahiro Yamada 204*221b1638SMasahiro Yamada typedef struct ptr_table_s { 205*221b1638SMasahiro Yamada voidpf org_ptr; 206*221b1638SMasahiro Yamada voidpf new_ptr; 207*221b1638SMasahiro Yamada } ptr_table; 208*221b1638SMasahiro Yamada 209*221b1638SMasahiro Yamada local ptr_table table[MAX_PTR]; 210*221b1638SMasahiro Yamada /* This table is used to remember the original form of pointers 211*221b1638SMasahiro Yamada * to large buffers (64K). Such pointers are normalized with a zero offset. 212*221b1638SMasahiro Yamada * Since MSDOS is not a preemptive multitasking OS, this table is not 213*221b1638SMasahiro Yamada * protected from concurrent access. This hack doesn't work anyway on 214*221b1638SMasahiro Yamada * a protected system like OS/2. Use Microsoft C instead. 215*221b1638SMasahiro Yamada */ 216*221b1638SMasahiro Yamada 217*221b1638SMasahiro Yamada voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) 218*221b1638SMasahiro Yamada { 219*221b1638SMasahiro Yamada voidpf buf; 220*221b1638SMasahiro Yamada ulg bsize = (ulg)items*size; 221*221b1638SMasahiro Yamada 222*221b1638SMasahiro Yamada (void)opaque; 223*221b1638SMasahiro Yamada 224*221b1638SMasahiro Yamada /* If we allocate less than 65520 bytes, we assume that farmalloc 225*221b1638SMasahiro Yamada * will return a usable pointer which doesn't have to be normalized. 226*221b1638SMasahiro Yamada */ 227*221b1638SMasahiro Yamada if (bsize < 65520L) { 228*221b1638SMasahiro Yamada buf = farmalloc(bsize); 229*221b1638SMasahiro Yamada if (*(ush*)&buf != 0) return buf; 230*221b1638SMasahiro Yamada } else { 231*221b1638SMasahiro Yamada buf = farmalloc(bsize + 16L); 232*221b1638SMasahiro Yamada } 233*221b1638SMasahiro Yamada if (buf == NULL || next_ptr >= MAX_PTR) return NULL; 234*221b1638SMasahiro Yamada table[next_ptr].org_ptr = buf; 235*221b1638SMasahiro Yamada 236*221b1638SMasahiro Yamada /* Normalize the pointer to seg:0 */ 237*221b1638SMasahiro Yamada *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; 238*221b1638SMasahiro Yamada *(ush*)&buf = 0; 239*221b1638SMasahiro Yamada table[next_ptr++].new_ptr = buf; 240*221b1638SMasahiro Yamada return buf; 241*221b1638SMasahiro Yamada } 242*221b1638SMasahiro Yamada 243*221b1638SMasahiro Yamada void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) 244*221b1638SMasahiro Yamada { 245*221b1638SMasahiro Yamada int n; 246*221b1638SMasahiro Yamada 247*221b1638SMasahiro Yamada (void)opaque; 248*221b1638SMasahiro Yamada 249*221b1638SMasahiro Yamada if (*(ush*)&ptr != 0) { /* object < 64K */ 250*221b1638SMasahiro Yamada farfree(ptr); 251*221b1638SMasahiro Yamada return; 252*221b1638SMasahiro Yamada } 253*221b1638SMasahiro Yamada /* Find the original pointer */ 254*221b1638SMasahiro Yamada for (n = 0; n < next_ptr; n++) { 255*221b1638SMasahiro Yamada if (ptr != table[n].new_ptr) continue; 256*221b1638SMasahiro Yamada 257*221b1638SMasahiro Yamada farfree(table[n].org_ptr); 258*221b1638SMasahiro Yamada while (++n < next_ptr) { 259*221b1638SMasahiro Yamada table[n-1] = table[n]; 260*221b1638SMasahiro Yamada } 261*221b1638SMasahiro Yamada next_ptr--; 262*221b1638SMasahiro Yamada return; 263*221b1638SMasahiro Yamada } 264*221b1638SMasahiro Yamada Assert(0, "zcfree: ptr not found"); 265*221b1638SMasahiro Yamada } 266*221b1638SMasahiro Yamada 267*221b1638SMasahiro Yamada #endif /* __TURBOC__ */ 268*221b1638SMasahiro Yamada 269*221b1638SMasahiro Yamada 270*221b1638SMasahiro Yamada #ifdef M_I86 271*221b1638SMasahiro Yamada /* Microsoft C in 16-bit mode */ 272*221b1638SMasahiro Yamada 273*221b1638SMasahiro Yamada # define MY_ZCALLOC 274*221b1638SMasahiro Yamada 275*221b1638SMasahiro Yamada #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) 276*221b1638SMasahiro Yamada # define _halloc halloc 277*221b1638SMasahiro Yamada # define _hfree hfree 278*221b1638SMasahiro Yamada #endif 279*221b1638SMasahiro Yamada 280*221b1638SMasahiro Yamada voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) 281*221b1638SMasahiro Yamada { 282*221b1638SMasahiro Yamada (void)opaque; 283*221b1638SMasahiro Yamada return _halloc((long)items, size); 284*221b1638SMasahiro Yamada } 285*221b1638SMasahiro Yamada 286*221b1638SMasahiro Yamada void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) 287*221b1638SMasahiro Yamada { 288*221b1638SMasahiro Yamada (void)opaque; 289*221b1638SMasahiro Yamada _hfree(ptr); 290*221b1638SMasahiro Yamada } 291*221b1638SMasahiro Yamada 292*221b1638SMasahiro Yamada #endif /* M_I86 */ 293*221b1638SMasahiro Yamada 294*221b1638SMasahiro Yamada #endif /* SYS16BIT */ 295*221b1638SMasahiro Yamada 296*221b1638SMasahiro Yamada 297*221b1638SMasahiro Yamada #ifndef MY_ZCALLOC /* Any system without a special alloc function */ 298*221b1638SMasahiro Yamada 299*221b1638SMasahiro Yamada #ifndef STDC 300*221b1638SMasahiro Yamada extern voidp malloc OF((uInt size)); 301*221b1638SMasahiro Yamada extern voidp calloc OF((uInt items, uInt size)); 302*221b1638SMasahiro Yamada extern void free OF((voidpf ptr)); 303*221b1638SMasahiro Yamada #endif 304*221b1638SMasahiro Yamada 305*221b1638SMasahiro Yamada voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) 306*221b1638SMasahiro Yamada voidpf opaque; 307*221b1638SMasahiro Yamada unsigned items; 308*221b1638SMasahiro Yamada unsigned size; 309*221b1638SMasahiro Yamada { 310*221b1638SMasahiro Yamada (void)opaque; 311*221b1638SMasahiro Yamada return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : 312*221b1638SMasahiro Yamada (voidpf)calloc(items, size); 313*221b1638SMasahiro Yamada } 314*221b1638SMasahiro Yamada 315*221b1638SMasahiro Yamada void ZLIB_INTERNAL zcfree (opaque, ptr) 316*221b1638SMasahiro Yamada voidpf opaque; 317*221b1638SMasahiro Yamada voidpf ptr; 318*221b1638SMasahiro Yamada { 319*221b1638SMasahiro Yamada (void)opaque; 320*221b1638SMasahiro Yamada free(ptr); 321*221b1638SMasahiro Yamada } 322*221b1638SMasahiro Yamada 323*221b1638SMasahiro Yamada #endif /* MY_ZCALLOC */ 324*221b1638SMasahiro Yamada 325*221b1638SMasahiro Yamada #endif /* !Z_SOLO */ 326