117651Speter/* zutil.c -- target dependent utility functions for the compression library 2237410Sdelphij * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. 3131380Stjr * For conditions of distribution and use, see copyright notice in zlib.h 417651Speter */ 517651Speter 6146081Skientzle/* @(#) $Id$ */ 717651Speter 817651Speter#include "zutil.h" 9237410Sdelphij#ifndef Z_SOLO 10237410Sdelphij# include "gzguts.h" 11237410Sdelphij#endif 1217651Speter 13131380Stjr#ifndef NO_DUMMY_DECL 1417651Speterstruct internal_state {int dummy;}; /* for buggy compilers */ 15131380Stjr#endif 1617651Speter 17250261Sdelphijz_const char * const z_errmsg[10] = { 1817651Speter"need dictionary", /* Z_NEED_DICT 2 */ 1917651Speter"stream end", /* Z_STREAM_END 1 */ 2017651Speter"", /* Z_OK 0 */ 2117651Speter"file error", /* Z_ERRNO (-1) */ 2217651Speter"stream error", /* Z_STREAM_ERROR (-2) */ 2317651Speter"data error", /* Z_DATA_ERROR (-3) */ 2417651Speter"insufficient memory", /* Z_MEM_ERROR (-4) */ 2517651Speter"buffer error", /* Z_BUF_ERROR (-5) */ 2617651Speter"incompatible version",/* Z_VERSION_ERROR (-6) */ 2717651Speter""}; 2817651Speter 2917651Speter 3033908Ssteveconst char * ZEXPORT zlibVersion() 3117651Speter{ 3217651Speter return ZLIB_VERSION; 3317651Speter} 3417651Speter 35131380StjruLong ZEXPORT zlibCompileFlags() 36131380Stjr{ 37131380Stjr uLong flags; 38131380Stjr 39131380Stjr flags = 0; 40205471Sdelphij switch ((int)(sizeof(uInt))) { 41131380Stjr case 2: break; 42131380Stjr case 4: flags += 1; break; 43131380Stjr case 8: flags += 2; break; 44131380Stjr default: flags += 3; 45131380Stjr } 46205471Sdelphij switch ((int)(sizeof(uLong))) { 47131380Stjr case 2: break; 48131380Stjr case 4: flags += 1 << 2; break; 49131380Stjr case 8: flags += 2 << 2; break; 50131380Stjr default: flags += 3 << 2; 51131380Stjr } 52205471Sdelphij switch ((int)(sizeof(voidpf))) { 53131380Stjr case 2: break; 54131380Stjr case 4: flags += 1 << 4; break; 55131380Stjr case 8: flags += 2 << 4; break; 56131380Stjr default: flags += 3 << 4; 57131380Stjr } 58205471Sdelphij switch ((int)(sizeof(z_off_t))) { 59131380Stjr case 2: break; 60131380Stjr case 4: flags += 1 << 6; break; 61131380Stjr case 8: flags += 2 << 6; break; 62131380Stjr default: flags += 3 << 6; 63131380Stjr } 6417651Speter#ifdef DEBUG 65131380Stjr flags += 1 << 8; 66131380Stjr#endif 67131380Stjr#if defined(ASMV) || defined(ASMINF) 68131380Stjr flags += 1 << 9; 69131380Stjr#endif 70131380Stjr#ifdef ZLIB_WINAPI 71131380Stjr flags += 1 << 10; 72131380Stjr#endif 73131380Stjr#ifdef BUILDFIXED 74131380Stjr flags += 1 << 12; 75131380Stjr#endif 76131380Stjr#ifdef DYNAMIC_CRC_TABLE 77131380Stjr flags += 1 << 13; 78131380Stjr#endif 79131380Stjr#ifdef NO_GZCOMPRESS 80157046Sdes flags += 1L << 16; 81131380Stjr#endif 82131380Stjr#ifdef NO_GZIP 83157046Sdes flags += 1L << 17; 84131380Stjr#endif 85131380Stjr#ifdef PKZIP_BUG_WORKAROUND 86157046Sdes flags += 1L << 20; 87131380Stjr#endif 88131380Stjr#ifdef FASTEST 89157046Sdes flags += 1L << 21; 90131380Stjr#endif 91237410Sdelphij#if defined(STDC) || defined(Z_HAVE_STDARG_H) 92131380Stjr# ifdef NO_vsnprintf 93237410Sdelphij flags += 1L << 25; 94131380Stjr# ifdef HAS_vsprintf_void 95237410Sdelphij flags += 1L << 26; 96131380Stjr# endif 97131380Stjr# else 98131380Stjr# ifdef HAS_vsnprintf_void 99237410Sdelphij flags += 1L << 26; 100131380Stjr# endif 101131380Stjr# endif 102131380Stjr#else 103237410Sdelphij flags += 1L << 24; 104131380Stjr# ifdef NO_snprintf 105237410Sdelphij flags += 1L << 25; 106131380Stjr# ifdef HAS_sprintf_void 107237410Sdelphij flags += 1L << 26; 108131380Stjr# endif 109131380Stjr# else 110131380Stjr# ifdef HAS_snprintf_void 111237410Sdelphij flags += 1L << 26; 112131380Stjr# endif 113131380Stjr# endif 114131380Stjr#endif 115131380Stjr return flags; 116131380Stjr} 11733908Ssteve 118131380Stjr#ifdef DEBUG 119131380Stjr 12033908Ssteve# ifndef verbose 12133908Ssteve# define verbose 0 12233908Ssteve# endif 123206924Sdelphijint ZLIB_INTERNAL z_verbose = verbose; 12433908Ssteve 125206924Sdelphijvoid ZLIB_INTERNAL z_error (m) 12617651Speter char *m; 12717651Speter{ 12817651Speter fprintf(stderr, "%s\n", m); 12917651Speter exit(1); 13017651Speter} 13117651Speter#endif 13217651Speter 13333908Ssteve/* exported to allow conversion of error code to string for compress() and 13433908Ssteve * uncompress() 13533908Ssteve */ 13633908Ssteveconst char * ZEXPORT zError(err) 13733908Ssteve int err; 13833908Ssteve{ 13933908Ssteve return ERR_MSG(err); 14033908Ssteve} 14133908Ssteve 142131380Stjr#if defined(_WIN32_WCE) 143157046Sdes /* The Microsoft C Run-Time Library for Windows CE doesn't have 144157046Sdes * errno. We define it as a global variable to simplify porting. 145157046Sdes * Its value is always 0 and should not be used. 146157046Sdes */ 147131380Stjr int errno = 0; 148131380Stjr#endif 14933908Ssteve 15017651Speter#ifndef HAVE_MEMCPY 15117651Speter 152206924Sdelphijvoid ZLIB_INTERNAL zmemcpy(dest, source, len) 15317651Speter Bytef* dest; 15442471Speter const Bytef* source; 15517651Speter uInt len; 15617651Speter{ 15717651Speter if (len == 0) return; 15817651Speter do { 15917651Speter *dest++ = *source++; /* ??? to be unrolled */ 16017651Speter } while (--len != 0); 16117651Speter} 16217651Speter 163206924Sdelphijint ZLIB_INTERNAL zmemcmp(s1, s2, len) 16442471Speter const Bytef* s1; 16542471Speter const Bytef* s2; 16617651Speter uInt len; 16717651Speter{ 16817651Speter uInt j; 16917651Speter 17017651Speter for (j = 0; j < len; j++) { 17117651Speter if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; 17217651Speter } 17317651Speter return 0; 17417651Speter} 17517651Speter 176206924Sdelphijvoid ZLIB_INTERNAL zmemzero(dest, len) 17717651Speter Bytef* dest; 17817651Speter uInt len; 17917651Speter{ 18017651Speter if (len == 0) return; 18117651Speter do { 18217651Speter *dest++ = 0; /* ??? to be unrolled */ 18317651Speter } while (--len != 0); 18417651Speter} 18517651Speter#endif 18617651Speter 187237410Sdelphij#ifndef Z_SOLO 188131380Stjr 189131380Stjr#ifdef SYS16BIT 190131380Stjr 19117651Speter#ifdef __TURBOC__ 192131380Stjr/* Turbo C in 16-bit mode */ 193131380Stjr 19417651Speter# define MY_ZCALLOC 19517651Speter 19617651Speter/* Turbo C malloc() does not allow dynamic allocation of 64K bytes 19717651Speter * and farmalloc(64K) returns a pointer with an offset of 8, so we 19817651Speter * must fix the pointer. Warning: the pointer must be put back to its 19917651Speter * original form in order to free it, use zcfree(). 20017651Speter */ 20117651Speter 20217651Speter#define MAX_PTR 10 20317651Speter/* 10*64K = 640K */ 20417651Speter 20517651Speterlocal int next_ptr = 0; 20617651Speter 20717651Spetertypedef struct ptr_table_s { 20817651Speter voidpf org_ptr; 20917651Speter voidpf new_ptr; 21017651Speter} ptr_table; 21117651Speter 21217651Speterlocal ptr_table table[MAX_PTR]; 21317651Speter/* This table is used to remember the original form of pointers 21417651Speter * to large buffers (64K). Such pointers are normalized with a zero offset. 21517651Speter * Since MSDOS is not a preemptive multitasking OS, this table is not 21617651Speter * protected from concurrent access. This hack doesn't work anyway on 21717651Speter * a protected system like OS/2. Use Microsoft C instead. 21817651Speter */ 21917651Speter 220206924Sdelphijvoidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) 22117651Speter{ 22217651Speter voidpf buf = opaque; /* just to make some compilers happy */ 22317651Speter ulg bsize = (ulg)items*size; 22417651Speter 22517651Speter /* If we allocate less than 65520 bytes, we assume that farmalloc 22617651Speter * will return a usable pointer which doesn't have to be normalized. 22717651Speter */ 22817651Speter if (bsize < 65520L) { 22917651Speter buf = farmalloc(bsize); 23017651Speter if (*(ush*)&buf != 0) return buf; 23117651Speter } else { 23217651Speter buf = farmalloc(bsize + 16L); 23317651Speter } 23417651Speter if (buf == NULL || next_ptr >= MAX_PTR) return NULL; 23517651Speter table[next_ptr].org_ptr = buf; 23617651Speter 23717651Speter /* Normalize the pointer to seg:0 */ 23817651Speter *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; 23917651Speter *(ush*)&buf = 0; 24017651Speter table[next_ptr++].new_ptr = buf; 24117651Speter return buf; 24217651Speter} 24317651Speter 244206924Sdelphijvoid ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) 24517651Speter{ 24617651Speter int n; 24717651Speter if (*(ush*)&ptr != 0) { /* object < 64K */ 24817651Speter farfree(ptr); 24917651Speter return; 25017651Speter } 25117651Speter /* Find the original pointer */ 25217651Speter for (n = 0; n < next_ptr; n++) { 25317651Speter if (ptr != table[n].new_ptr) continue; 25417651Speter 25517651Speter farfree(table[n].org_ptr); 25617651Speter while (++n < next_ptr) { 25717651Speter table[n-1] = table[n]; 25817651Speter } 25917651Speter next_ptr--; 26017651Speter return; 26117651Speter } 26217651Speter ptr = opaque; /* just to make some compilers happy */ 26317651Speter Assert(0, "zcfree: ptr not found"); 26417651Speter} 265131380Stjr 26617651Speter#endif /* __TURBOC__ */ 26717651Speter 26817651Speter 269131380Stjr#ifdef M_I86 27017651Speter/* Microsoft C in 16-bit mode */ 27117651Speter 27217651Speter# define MY_ZCALLOC 27317651Speter 27442471Speter#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) 27517651Speter# define _halloc halloc 27617651Speter# define _hfree hfree 27717651Speter#endif 27817651Speter 279206924Sdelphijvoidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) 28017651Speter{ 28117651Speter if (opaque) opaque = 0; /* to make compiler happy */ 28217651Speter return _halloc((long)items, size); 28317651Speter} 28417651Speter 285206924Sdelphijvoid ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) 28617651Speter{ 28717651Speter if (opaque) opaque = 0; /* to make compiler happy */ 28817651Speter _hfree(ptr); 28917651Speter} 29017651Speter 291131380Stjr#endif /* M_I86 */ 29217651Speter 293131380Stjr#endif /* SYS16BIT */ 29417651Speter 295131380Stjr 29617651Speter#ifndef MY_ZCALLOC /* Any system without a special alloc function */ 29717651Speter 29817651Speter#ifndef STDC 299131380Stjrextern voidp malloc OF((uInt size)); 30017651Speterextern voidp calloc OF((uInt items, uInt size)); 30117651Speterextern void free OF((voidpf ptr)); 30217651Speter#endif 30317651Speter 304206924Sdelphijvoidpf ZLIB_INTERNAL zcalloc (opaque, items, size) 30517651Speter voidpf opaque; 30617651Speter unsigned items; 30717651Speter unsigned size; 30817651Speter{ 30917651Speter if (opaque) items += size - size; /* make compiler happy */ 310131380Stjr return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : 311131380Stjr (voidpf)calloc(items, size); 31217651Speter} 31317651Speter 314206924Sdelphijvoid ZLIB_INTERNAL zcfree (opaque, ptr) 31517651Speter voidpf opaque; 31617651Speter voidpf ptr; 31717651Speter{ 31817651Speter free(ptr); 31917651Speter if (opaque) return; /* make compiler happy */ 32017651Speter} 32117651Speter 32217651Speter#endif /* MY_ZCALLOC */ 323237410Sdelphij 324237410Sdelphij#endif /* !Z_SOLO */ 325