1221b1638SMasahiro Yamada /* zutil.c -- target dependent utility functions for the compression library 2221b1638SMasahiro Yamada * Copyright (C) 1995-2017 Jean-loup Gailly 3221b1638SMasahiro Yamada * For conditions of distribution and use, see copyright notice in zlib.h 4221b1638SMasahiro Yamada */ 5221b1638SMasahiro Yamada 6221b1638SMasahiro Yamada /* @(#) $Id$ */ 7221b1638SMasahiro Yamada 8221b1638SMasahiro Yamada #include "zutil.h" 9221b1638SMasahiro Yamada #ifndef Z_SOLO 10221b1638SMasahiro Yamada # include "gzguts.h" 11221b1638SMasahiro Yamada #endif 12221b1638SMasahiro Yamada 13221b1638SMasahiro Yamada z_const char * const z_errmsg[10] = { 14221b1638SMasahiro Yamada (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ 15221b1638SMasahiro Yamada (z_const char *)"stream end", /* Z_STREAM_END 1 */ 16221b1638SMasahiro Yamada (z_const char *)"", /* Z_OK 0 */ 17221b1638SMasahiro Yamada (z_const char *)"file error", /* Z_ERRNO (-1) */ 18221b1638SMasahiro Yamada (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ 19221b1638SMasahiro Yamada (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ 20221b1638SMasahiro Yamada (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ 21221b1638SMasahiro Yamada (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ 22221b1638SMasahiro Yamada (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ 23221b1638SMasahiro Yamada (z_const char *)"" 24221b1638SMasahiro Yamada }; 25221b1638SMasahiro Yamada 26221b1638SMasahiro Yamada 27221b1638SMasahiro Yamada const char * ZEXPORT zlibVersion() 28221b1638SMasahiro Yamada { 29221b1638SMasahiro Yamada return ZLIB_VERSION; 30221b1638SMasahiro Yamada } 31221b1638SMasahiro Yamada 32221b1638SMasahiro Yamada uLong ZEXPORT zlibCompileFlags() 33221b1638SMasahiro Yamada { 34221b1638SMasahiro Yamada uLong flags; 35221b1638SMasahiro Yamada 36221b1638SMasahiro Yamada flags = 0; 37221b1638SMasahiro Yamada switch ((int)(sizeof(uInt))) { 38221b1638SMasahiro Yamada case 2: break; 39221b1638SMasahiro Yamada case 4: flags += 1; break; 40221b1638SMasahiro Yamada case 8: flags += 2; break; 41221b1638SMasahiro Yamada default: flags += 3; 42221b1638SMasahiro Yamada } 43221b1638SMasahiro Yamada switch ((int)(sizeof(uLong))) { 44221b1638SMasahiro Yamada case 2: break; 45221b1638SMasahiro Yamada case 4: flags += 1 << 2; break; 46221b1638SMasahiro Yamada case 8: flags += 2 << 2; break; 47221b1638SMasahiro Yamada default: flags += 3 << 2; 48221b1638SMasahiro Yamada } 49221b1638SMasahiro Yamada switch ((int)(sizeof(voidpf))) { 50221b1638SMasahiro Yamada case 2: break; 51221b1638SMasahiro Yamada case 4: flags += 1 << 4; break; 52221b1638SMasahiro Yamada case 8: flags += 2 << 4; break; 53221b1638SMasahiro Yamada default: flags += 3 << 4; 54221b1638SMasahiro Yamada } 55221b1638SMasahiro Yamada switch ((int)(sizeof(z_off_t))) { 56221b1638SMasahiro Yamada case 2: break; 57221b1638SMasahiro Yamada case 4: flags += 1 << 6; break; 58221b1638SMasahiro Yamada case 8: flags += 2 << 6; break; 59221b1638SMasahiro Yamada default: flags += 3 << 6; 60221b1638SMasahiro Yamada } 61221b1638SMasahiro Yamada #ifdef ZLIB_DEBUG 62221b1638SMasahiro Yamada flags += 1 << 8; 63221b1638SMasahiro Yamada #endif 64*a194255dSDaniel Boulby /* 65221b1638SMasahiro Yamada #if defined(ASMV) || defined(ASMINF) 66221b1638SMasahiro Yamada flags += 1 << 9; 67221b1638SMasahiro Yamada #endif 68*a194255dSDaniel Boulby */ 69221b1638SMasahiro Yamada #ifdef ZLIB_WINAPI 70221b1638SMasahiro Yamada flags += 1 << 10; 71221b1638SMasahiro Yamada #endif 72221b1638SMasahiro Yamada #ifdef BUILDFIXED 73221b1638SMasahiro Yamada flags += 1 << 12; 74221b1638SMasahiro Yamada #endif 75221b1638SMasahiro Yamada #ifdef DYNAMIC_CRC_TABLE 76221b1638SMasahiro Yamada flags += 1 << 13; 77221b1638SMasahiro Yamada #endif 78221b1638SMasahiro Yamada #ifdef NO_GZCOMPRESS 79221b1638SMasahiro Yamada flags += 1L << 16; 80221b1638SMasahiro Yamada #endif 81221b1638SMasahiro Yamada #ifdef NO_GZIP 82221b1638SMasahiro Yamada flags += 1L << 17; 83221b1638SMasahiro Yamada #endif 84221b1638SMasahiro Yamada #ifdef PKZIP_BUG_WORKAROUND 85221b1638SMasahiro Yamada flags += 1L << 20; 86221b1638SMasahiro Yamada #endif 87221b1638SMasahiro Yamada #ifdef FASTEST 88221b1638SMasahiro Yamada flags += 1L << 21; 89221b1638SMasahiro Yamada #endif 90221b1638SMasahiro Yamada #if defined(STDC) || defined(Z_HAVE_STDARG_H) 91221b1638SMasahiro Yamada # ifdef NO_vsnprintf 92221b1638SMasahiro Yamada flags += 1L << 25; 93221b1638SMasahiro Yamada # ifdef HAS_vsprintf_void 94221b1638SMasahiro Yamada flags += 1L << 26; 95221b1638SMasahiro Yamada # endif 96221b1638SMasahiro Yamada # else 97221b1638SMasahiro Yamada # ifdef HAS_vsnprintf_void 98221b1638SMasahiro Yamada flags += 1L << 26; 99221b1638SMasahiro Yamada # endif 100221b1638SMasahiro Yamada # endif 101221b1638SMasahiro Yamada #else 102221b1638SMasahiro Yamada flags += 1L << 24; 103221b1638SMasahiro Yamada # ifdef NO_snprintf 104221b1638SMasahiro Yamada flags += 1L << 25; 105221b1638SMasahiro Yamada # ifdef HAS_sprintf_void 106221b1638SMasahiro Yamada flags += 1L << 26; 107221b1638SMasahiro Yamada # endif 108221b1638SMasahiro Yamada # else 109221b1638SMasahiro Yamada # ifdef HAS_snprintf_void 110221b1638SMasahiro Yamada flags += 1L << 26; 111221b1638SMasahiro Yamada # endif 112221b1638SMasahiro Yamada # endif 113221b1638SMasahiro Yamada #endif 114221b1638SMasahiro Yamada return flags; 115221b1638SMasahiro Yamada } 116221b1638SMasahiro Yamada 117221b1638SMasahiro Yamada #ifdef ZLIB_DEBUG 118221b1638SMasahiro Yamada #include <stdlib.h> 119221b1638SMasahiro Yamada # ifndef verbose 120221b1638SMasahiro Yamada # define verbose 0 121221b1638SMasahiro Yamada # endif 122221b1638SMasahiro Yamada int ZLIB_INTERNAL z_verbose = verbose; 123221b1638SMasahiro Yamada 124221b1638SMasahiro Yamada void ZLIB_INTERNAL z_error(m) 125221b1638SMasahiro Yamada char *m; 126221b1638SMasahiro Yamada { 127221b1638SMasahiro Yamada fprintf(stderr, "%s\n", m); 128221b1638SMasahiro Yamada exit(1); 129221b1638SMasahiro Yamada } 130221b1638SMasahiro Yamada #endif 131221b1638SMasahiro Yamada 132221b1638SMasahiro Yamada /* exported to allow conversion of error code to string for compress() and 133221b1638SMasahiro Yamada * uncompress() 134221b1638SMasahiro Yamada */ 135221b1638SMasahiro Yamada const char * ZEXPORT zError(err) 136221b1638SMasahiro Yamada int err; 137221b1638SMasahiro Yamada { 138221b1638SMasahiro Yamada return ERR_MSG(err); 139221b1638SMasahiro Yamada } 140221b1638SMasahiro Yamada 141*a194255dSDaniel Boulby #if defined(_WIN32_WCE) && _WIN32_WCE < 0x800 142*a194255dSDaniel Boulby /* The older Microsoft C Run-Time Library for Windows CE doesn't have 143221b1638SMasahiro Yamada * errno. We define it as a global variable to simplify porting. 144221b1638SMasahiro Yamada * Its value is always 0 and should not be used. 145221b1638SMasahiro Yamada */ 146221b1638SMasahiro Yamada int errno = 0; 147221b1638SMasahiro Yamada #endif 148221b1638SMasahiro Yamada 149221b1638SMasahiro Yamada #ifndef HAVE_MEMCPY 150221b1638SMasahiro Yamada 151221b1638SMasahiro Yamada void ZLIB_INTERNAL zmemcpy(dest, source, len) 152221b1638SMasahiro Yamada Bytef* dest; 153221b1638SMasahiro Yamada const Bytef* source; 154221b1638SMasahiro Yamada uInt len; 155221b1638SMasahiro Yamada { 156221b1638SMasahiro Yamada if (len == 0) return; 157221b1638SMasahiro Yamada do { 158221b1638SMasahiro Yamada *dest++ = *source++; /* ??? to be unrolled */ 159221b1638SMasahiro Yamada } while (--len != 0); 160221b1638SMasahiro Yamada } 161221b1638SMasahiro Yamada 162221b1638SMasahiro Yamada int ZLIB_INTERNAL zmemcmp(s1, s2, len) 163221b1638SMasahiro Yamada const Bytef* s1; 164221b1638SMasahiro Yamada const Bytef* s2; 165221b1638SMasahiro Yamada uInt len; 166221b1638SMasahiro Yamada { 167221b1638SMasahiro Yamada uInt j; 168221b1638SMasahiro Yamada 169221b1638SMasahiro Yamada for (j = 0; j < len; j++) { 170221b1638SMasahiro Yamada if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; 171221b1638SMasahiro Yamada } 172221b1638SMasahiro Yamada return 0; 173221b1638SMasahiro Yamada } 174221b1638SMasahiro Yamada 175221b1638SMasahiro Yamada void ZLIB_INTERNAL zmemzero(dest, len) 176221b1638SMasahiro Yamada Bytef* dest; 177221b1638SMasahiro Yamada uInt len; 178221b1638SMasahiro Yamada { 179221b1638SMasahiro Yamada if (len == 0) return; 180221b1638SMasahiro Yamada do { 181221b1638SMasahiro Yamada *dest++ = 0; /* ??? to be unrolled */ 182221b1638SMasahiro Yamada } while (--len != 0); 183221b1638SMasahiro Yamada } 184221b1638SMasahiro Yamada #endif 185221b1638SMasahiro Yamada 186221b1638SMasahiro Yamada #ifndef Z_SOLO 187221b1638SMasahiro Yamada 188221b1638SMasahiro Yamada #ifdef SYS16BIT 189221b1638SMasahiro Yamada 190221b1638SMasahiro Yamada #ifdef __TURBOC__ 191221b1638SMasahiro Yamada /* Turbo C in 16-bit mode */ 192221b1638SMasahiro Yamada 193221b1638SMasahiro Yamada # define MY_ZCALLOC 194221b1638SMasahiro Yamada 195221b1638SMasahiro Yamada /* Turbo C malloc() does not allow dynamic allocation of 64K bytes 196221b1638SMasahiro Yamada * and farmalloc(64K) returns a pointer with an offset of 8, so we 197221b1638SMasahiro Yamada * must fix the pointer. Warning: the pointer must be put back to its 198221b1638SMasahiro Yamada * original form in order to free it, use zcfree(). 199221b1638SMasahiro Yamada */ 200221b1638SMasahiro Yamada 201221b1638SMasahiro Yamada #define MAX_PTR 10 202221b1638SMasahiro Yamada /* 10*64K = 640K */ 203221b1638SMasahiro Yamada 204221b1638SMasahiro Yamada local int next_ptr = 0; 205221b1638SMasahiro Yamada 206221b1638SMasahiro Yamada typedef struct ptr_table_s { 207221b1638SMasahiro Yamada voidpf org_ptr; 208221b1638SMasahiro Yamada voidpf new_ptr; 209221b1638SMasahiro Yamada } ptr_table; 210221b1638SMasahiro Yamada 211221b1638SMasahiro Yamada local ptr_table table[MAX_PTR]; 212221b1638SMasahiro Yamada /* This table is used to remember the original form of pointers 213221b1638SMasahiro Yamada * to large buffers (64K). Such pointers are normalized with a zero offset. 214221b1638SMasahiro Yamada * Since MSDOS is not a preemptive multitasking OS, this table is not 215221b1638SMasahiro Yamada * protected from concurrent access. This hack doesn't work anyway on 216221b1638SMasahiro Yamada * a protected system like OS/2. Use Microsoft C instead. 217221b1638SMasahiro Yamada */ 218221b1638SMasahiro Yamada 219221b1638SMasahiro Yamada voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) 220221b1638SMasahiro Yamada { 221221b1638SMasahiro Yamada voidpf buf; 222221b1638SMasahiro Yamada ulg bsize = (ulg)items*size; 223221b1638SMasahiro Yamada 224221b1638SMasahiro Yamada (void)opaque; 225221b1638SMasahiro Yamada 226221b1638SMasahiro Yamada /* If we allocate less than 65520 bytes, we assume that farmalloc 227221b1638SMasahiro Yamada * will return a usable pointer which doesn't have to be normalized. 228221b1638SMasahiro Yamada */ 229221b1638SMasahiro Yamada if (bsize < 65520L) { 230221b1638SMasahiro Yamada buf = farmalloc(bsize); 231221b1638SMasahiro Yamada if (*(ush*)&buf != 0) return buf; 232221b1638SMasahiro Yamada } else { 233221b1638SMasahiro Yamada buf = farmalloc(bsize + 16L); 234221b1638SMasahiro Yamada } 235221b1638SMasahiro Yamada if (buf == NULL || next_ptr >= MAX_PTR) return NULL; 236221b1638SMasahiro Yamada table[next_ptr].org_ptr = buf; 237221b1638SMasahiro Yamada 238221b1638SMasahiro Yamada /* Normalize the pointer to seg:0 */ 239221b1638SMasahiro Yamada *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; 240221b1638SMasahiro Yamada *(ush*)&buf = 0; 241221b1638SMasahiro Yamada table[next_ptr++].new_ptr = buf; 242221b1638SMasahiro Yamada return buf; 243221b1638SMasahiro Yamada } 244221b1638SMasahiro Yamada 245221b1638SMasahiro Yamada void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) 246221b1638SMasahiro Yamada { 247221b1638SMasahiro Yamada int n; 248221b1638SMasahiro Yamada 249221b1638SMasahiro Yamada (void)opaque; 250221b1638SMasahiro Yamada 251221b1638SMasahiro Yamada if (*(ush*)&ptr != 0) { /* object < 64K */ 252221b1638SMasahiro Yamada farfree(ptr); 253221b1638SMasahiro Yamada return; 254221b1638SMasahiro Yamada } 255221b1638SMasahiro Yamada /* Find the original pointer */ 256221b1638SMasahiro Yamada for (n = 0; n < next_ptr; n++) { 257221b1638SMasahiro Yamada if (ptr != table[n].new_ptr) continue; 258221b1638SMasahiro Yamada 259221b1638SMasahiro Yamada farfree(table[n].org_ptr); 260221b1638SMasahiro Yamada while (++n < next_ptr) { 261221b1638SMasahiro Yamada table[n-1] = table[n]; 262221b1638SMasahiro Yamada } 263221b1638SMasahiro Yamada next_ptr--; 264221b1638SMasahiro Yamada return; 265221b1638SMasahiro Yamada } 266221b1638SMasahiro Yamada Assert(0, "zcfree: ptr not found"); 267221b1638SMasahiro Yamada } 268221b1638SMasahiro Yamada 269221b1638SMasahiro Yamada #endif /* __TURBOC__ */ 270221b1638SMasahiro Yamada 271221b1638SMasahiro Yamada 272221b1638SMasahiro Yamada #ifdef M_I86 273221b1638SMasahiro Yamada /* Microsoft C in 16-bit mode */ 274221b1638SMasahiro Yamada 275221b1638SMasahiro Yamada # define MY_ZCALLOC 276221b1638SMasahiro Yamada 277221b1638SMasahiro Yamada #if (!defined(_MSC_VER) || (_MSC_VER <= 600)) 278221b1638SMasahiro Yamada # define _halloc halloc 279221b1638SMasahiro Yamada # define _hfree hfree 280221b1638SMasahiro Yamada #endif 281221b1638SMasahiro Yamada 282221b1638SMasahiro Yamada voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) 283221b1638SMasahiro Yamada { 284221b1638SMasahiro Yamada (void)opaque; 285221b1638SMasahiro Yamada return _halloc((long)items, size); 286221b1638SMasahiro Yamada } 287221b1638SMasahiro Yamada 288221b1638SMasahiro Yamada void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) 289221b1638SMasahiro Yamada { 290221b1638SMasahiro Yamada (void)opaque; 291221b1638SMasahiro Yamada _hfree(ptr); 292221b1638SMasahiro Yamada } 293221b1638SMasahiro Yamada 294221b1638SMasahiro Yamada #endif /* M_I86 */ 295221b1638SMasahiro Yamada 296221b1638SMasahiro Yamada #endif /* SYS16BIT */ 297221b1638SMasahiro Yamada 298221b1638SMasahiro Yamada 299221b1638SMasahiro Yamada #ifndef MY_ZCALLOC /* Any system without a special alloc function */ 300221b1638SMasahiro Yamada 301221b1638SMasahiro Yamada #ifndef STDC 302221b1638SMasahiro Yamada extern voidp malloc OF((uInt size)); 303221b1638SMasahiro Yamada extern voidp calloc OF((uInt items, uInt size)); 304221b1638SMasahiro Yamada extern void free OF((voidpf ptr)); 305221b1638SMasahiro Yamada #endif 306221b1638SMasahiro Yamada 307221b1638SMasahiro Yamada voidpf ZLIB_INTERNAL zcalloc(opaque, items, size) 308221b1638SMasahiro Yamada voidpf opaque; 309221b1638SMasahiro Yamada unsigned items; 310221b1638SMasahiro Yamada unsigned size; 311221b1638SMasahiro Yamada { 312221b1638SMasahiro Yamada (void)opaque; 313221b1638SMasahiro Yamada return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : 314221b1638SMasahiro Yamada (voidpf)calloc(items, size); 315221b1638SMasahiro Yamada } 316221b1638SMasahiro Yamada 317221b1638SMasahiro Yamada void ZLIB_INTERNAL zcfree(opaque, ptr) 318221b1638SMasahiro Yamada voidpf opaque; 319221b1638SMasahiro Yamada voidpf ptr; 320221b1638SMasahiro Yamada { 321221b1638SMasahiro Yamada (void)opaque; 322221b1638SMasahiro Yamada free(ptr); 323221b1638SMasahiro Yamada } 324221b1638SMasahiro Yamada 325221b1638SMasahiro Yamada #endif /* MY_ZCALLOC */ 326221b1638SMasahiro Yamada 327221b1638SMasahiro Yamada #endif /* !Z_SOLO */ 328