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