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