18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* zutil.c -- target dependent utility functions for the compression library 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (C) 1995-2005 Jean-loup Gailly. 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in zlib.h 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* @(#) $Id$ */ 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "zutil.h" 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef NO_DUMMY_DECL 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct internal_state {int dummy;}; /* for buggy compilers */ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char * const z_errmsg[10] = { 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project"need dictionary", /* Z_NEED_DICT 2 */ 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project"stream end", /* Z_STREAM_END 1 */ 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project"", /* Z_OK 0 */ 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project"file error", /* Z_ERRNO (-1) */ 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project"stream error", /* Z_STREAM_ERROR (-2) */ 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project"data error", /* Z_DATA_ERROR (-3) */ 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project"insufficient memory", /* Z_MEM_ERROR (-4) */ 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project"buffer error", /* Z_BUF_ERROR (-5) */ 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project"incompatible version",/* Z_VERSION_ERROR (-6) */ 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project""}; 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char * ZEXPORT zlibVersion() 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ZLIB_VERSION; 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectuLong ZEXPORT zlibCompileFlags() 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uLong flags; 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags = 0; 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (sizeof(uInt)) { 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: break; 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 4: flags += 1; break; 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 8: flags += 2; break; 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: flags += 3; 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (sizeof(uLong)) { 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: break; 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 4: flags += 1 << 2; break; 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 8: flags += 2 << 2; break; 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: flags += 3 << 2; 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (sizeof(voidpf)) { 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: break; 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 4: flags += 1 << 4; break; 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 8: flags += 2 << 4; break; 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: flags += 3 << 4; 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (sizeof(z_off_t)) { 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: break; 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 4: flags += 1 << 6; break; 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 8: flags += 2 << 6; break; 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: flags += 3 << 6; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1 << 8; 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(ASMV) || defined(ASMINF) 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1 << 9; 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef ZLIB_WINAPI 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1 << 10; 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef BUILDFIXED 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1 << 12; 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DYNAMIC_CRC_TABLE 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1 << 13; 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef NO_GZCOMPRESS 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 16; 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef NO_GZIP 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 17; 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef PKZIP_BUG_WORKAROUND 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 20; 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef FASTEST 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 21; 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef STDC 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifdef NO_vsnprintf 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 25; 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifdef HAS_vsprintf_void 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 26; 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifdef HAS_vsnprintf_void 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 26; 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 24; 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifdef NO_snprintf 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 25; 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifdef HAS_sprintf_void 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 26; 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# else 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifdef HAS_snprintf_void 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project flags += 1L << 26; 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return flags; 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef DEBUG 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# ifndef verbose 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define verbose 0 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# endif 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint z_verbose = verbose; 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid z_error (m) 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char *m; 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "%s\n", m); 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project exit(1); 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* exported to allow conversion of error code to string for compress() and 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * uncompress() 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char * ZEXPORT zError(err) 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int err; 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ERR_MSG(err); 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if defined(_WIN32_WCE) 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* The Microsoft C Run-Time Library for Windows CE doesn't have 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * errno. We define it as a global variable to simplify porting. 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Its value is always 0 and should not be used. 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int errno = 0; 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef HAVE_MEMCPY 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid zmemcpy(dest, source, len) 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Bytef* dest; 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const Bytef* source; 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uInt len; 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len == 0) return; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dest++ = *source++; /* ??? to be unrolled */ 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (--len != 0); 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint zmemcmp(s1, s2, len) 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const Bytef* s1; 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const Bytef* s2; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uInt len; 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uInt j; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (j = 0; j < len; j++) { 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid zmemzero(dest, len) 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Bytef* dest; 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uInt len; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (len == 0) return; 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project do { 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *dest++ = 0; /* ??? to be unrolled */ 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } while (--len != 0); 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef SYS16BIT 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef __TURBOC__ 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Turbo C in 16-bit mode */ 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define MY_ZCALLOC 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Turbo C malloc() does not allow dynamic allocation of 64K bytes 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * and farmalloc(64K) returns a pointer with an offset of 8, so we 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * must fix the pointer. Warning: the pointer must be put back to its 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * original form in order to free it, use zcfree(). 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define MAX_PTR 10 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 10*64K = 640K */ 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectlocal int next_ptr = 0; 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct ptr_table_s { 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project voidpf org_ptr; 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project voidpf new_ptr; 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} ptr_table; 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectlocal ptr_table table[MAX_PTR]; 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* This table is used to remember the original form of pointers 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to large buffers (64K). Such pointers are normalized with a zero offset. 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Since MSDOS is not a preemptive multitasking OS, this table is not 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * protected from concurrent access. This hack doesn't work anyway on 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * a protected system like OS/2. Use Microsoft C instead. 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoidpf zcalloc (voidpf opaque, unsigned items, unsigned size) 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project voidpf buf = opaque; /* just to make some compilers happy */ 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ulg bsize = (ulg)items*size; 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* If we allocate less than 65520 bytes, we assume that farmalloc 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * will return a usable pointer which doesn't have to be normalized. 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (bsize < 65520L) { 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project buf = farmalloc(bsize); 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*(ush*)&buf != 0) return buf; 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project buf = farmalloc(bsize + 16L); 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (buf == NULL || next_ptr >= MAX_PTR) return NULL; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project table[next_ptr].org_ptr = buf; 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Normalize the pointer to seg:0 */ 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(ush*)&buf = 0; 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project table[next_ptr++].new_ptr = buf; 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return buf; 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid zcfree (voidpf opaque, voidpf ptr) 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (*(ush*)&ptr != 0) { /* object < 64K */ 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project farfree(ptr); 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* Find the original pointer */ 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (n = 0; n < next_ptr; n++) { 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ptr != table[n].new_ptr) continue; 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project farfree(table[n].org_ptr); 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (++n < next_ptr) { 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project table[n-1] = table[n]; 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project next_ptr--; 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptr = opaque; /* just to make some compilers happy */ 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Assert(0, "zcfree: ptr not found"); 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* __TURBOC__ */ 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef M_I86 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Microsoft C in 16-bit mode */ 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define MY_ZCALLOC 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define _halloc halloc 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define _hfree hfree 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoidpf zcalloc (voidpf opaque, unsigned items, unsigned size) 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opaque) opaque = 0; /* to make compiler happy */ 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _halloc((long)items, size); 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid zcfree (voidpf opaque, voidpf ptr) 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opaque) opaque = 0; /* to make compiler happy */ 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _hfree(ptr); 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* M_I86 */ 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* SYS16BIT */ 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef MY_ZCALLOC /* Any system without a special alloc function */ 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef STDC 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern voidp malloc OF((uInt size)); 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern voidp calloc OF((uInt items, uInt size)); 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void free OF((voidpf ptr)); 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoidpf zcalloc (opaque, items, size) 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project voidpf opaque; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned items; 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned size; 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opaque) items += size - size; /* make compiler happy */ 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (voidpf)calloc(items, size); 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid zcfree (opaque, ptr) 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project voidpf opaque; 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project voidpf ptr; 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free(ptr); 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (opaque) return; /* make compiler happy */ 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* MY_ZCALLOC */ 319