19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* zutil.c -- target dependent utility functions for the compression library 209eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. 39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * For conditions of distribution and use, see copyright notice in zlib.h 49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */ 59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* @(#) $Id$ */ 79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zutil.h" 909eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes#ifndef Z_SOLO 1009eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# include "gzguts.h" 1109eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes#endif 129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef NO_DUMMY_DECL 149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectstruct internal_state {int dummy;}; /* for buggy compilers */ 159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst char * const z_errmsg[10] = { 189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"need dictionary", /* Z_NEED_DICT 2 */ 199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"stream end", /* Z_STREAM_END 1 */ 209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"", /* Z_OK 0 */ 219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"file error", /* Z_ERRNO (-1) */ 229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"stream error", /* Z_STREAM_ERROR (-2) */ 239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"data error", /* Z_DATA_ERROR (-3) */ 249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"insufficient memory", /* Z_MEM_ERROR (-4) */ 259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"buffer error", /* Z_BUF_ERROR (-5) */ 269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project"incompatible version",/* Z_VERSION_ERROR (-6) */ 279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project""}; 289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst char * ZEXPORT zlibVersion() 319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ZLIB_VERSION; 339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source ProjectuLong ZEXPORT zlibCompileFlags() 369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uLong flags; 389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags = 0; 40381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes switch ((int)(sizeof(uInt))) { 419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 2: break; 429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 4: flags += 1; break; 439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 8: flags += 2; break; 449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project default: flags += 3; 459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 46381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes switch ((int)(sizeof(uLong))) { 479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 2: break; 489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 4: flags += 1 << 2; break; 499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 8: flags += 2 << 2; break; 509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project default: flags += 3 << 2; 519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 52381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes switch ((int)(sizeof(voidpf))) { 539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 2: break; 549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 4: flags += 1 << 4; break; 559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 8: flags += 2 << 4; break; 569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project default: flags += 3 << 4; 579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 58381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes switch ((int)(sizeof(z_off_t))) { 599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 2: break; 609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 4: flags += 1 << 6; break; 619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project case 8: flags += 2 << 6; break; 629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project default: flags += 3 << 6; 639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef DEBUG 659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags += 1 << 8; 669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#if defined(ASMV) || defined(ASMINF) 689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags += 1 << 9; 699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef ZLIB_WINAPI 719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags += 1 << 10; 729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef BUILDFIXED 749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags += 1 << 12; 759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef DYNAMIC_CRC_TABLE 779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags += 1 << 13; 789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef NO_GZCOMPRESS 809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags += 1L << 16; 819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef NO_GZIP 839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags += 1L << 17; 849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef PKZIP_BUG_WORKAROUND 869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags += 1L << 20; 879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef FASTEST 899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project flags += 1L << 21; 909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 9109eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes#if defined(STDC) || defined(Z_HAVE_STDARG_H) 9209eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# ifdef NO_vsnprintf 9309eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes flags += 1L << 25; 9409eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# ifdef HAS_vsprintf_void 9509eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes flags += 1L << 26; 9609eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# endif 9709eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# else 9809eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# ifdef HAS_vsnprintf_void 9909eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes flags += 1L << 26; 10009eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# endif 10109eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# endif 1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#else 10309eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes flags += 1L << 24; 10409eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# ifdef NO_snprintf 10509eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes flags += 1L << 25; 10609eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# ifdef HAS_sprintf_void 10709eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes flags += 1L << 26; 10809eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# endif 10909eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# else 11009eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# ifdef HAS_snprintf_void 11109eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes flags += 1L << 26; 11209eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# endif 11309eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes# endif 1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 11509eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes return flags; 1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef DEBUG 1199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# ifndef verbose 1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define verbose 0 1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# endif 123381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesint ZLIB_INTERNAL z_verbose = verbose; 1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 125381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL z_error (m) 1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project char *m; 1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project fprintf(stderr, "%s\n", m); 1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project exit(1); 1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* exported to allow conversion of error code to string for compress() and 1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * uncompress() 1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */ 1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectconst char * ZEXPORT zError(err) 1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int err; 1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return ERR_MSG(err); 1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#if defined(_WIN32_WCE) 1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* The Microsoft C Run-Time Library for Windows CE doesn't have 1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * errno. We define it as a global variable to simplify porting. 1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Its value is always 0 and should not be used. 1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */ 1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int errno = 0; 1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef HAVE_MEMCPY 1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 152381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL zmemcpy(dest, source, len) 1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Bytef* dest; 1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const Bytef* source; 1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt len; 1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (len == 0) return; 1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do { 1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *dest++ = *source++; /* ??? to be unrolled */ 1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } while (--len != 0); 1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 163381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesint ZLIB_INTERNAL zmemcmp(s1, s2, len) 1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const Bytef* s1; 1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project const Bytef* s2; 1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt len; 1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt j; 1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (j = 0; j < len; j++) { 1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; 1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return 0; 1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 176381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL zmemzero(dest, len) 1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Bytef* dest; 1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project uInt len; 1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (len == 0) return; 1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project do { 1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *dest++ = 0; /* ??? to be unrolled */ 1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } while (--len != 0); 1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 187ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#ifndef Z_SOLO 1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef SYS16BIT 1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef __TURBOC__ 1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Turbo C in 16-bit mode */ 1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define MY_ZCALLOC 1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Turbo C malloc() does not allow dynamic allocation of 64K bytes 1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * and farmalloc(64K) returns a pointer with an offset of 8, so we 1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * must fix the pointer. Warning: the pointer must be put back to its 1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * original form in order to free it, use zcfree(). 2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */ 2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define MAX_PTR 10 2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* 10*64K = 640K */ 2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal int next_ptr = 0; 2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projecttypedef struct ptr_table_s { 2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf org_ptr; 2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf new_ptr; 2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} ptr_table; 2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectlocal ptr_table table[MAX_PTR]; 2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* This table is used to remember the original form of pointers 2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * to large buffers (64K). Such pointers are normalized with a zero offset. 2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Since MSDOS is not a preemptive multitasking OS, this table is not 2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * protected from concurrent access. This hack doesn't work anyway on 2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * a protected system like OS/2. Use Microsoft C instead. 2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */ 2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 220381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) 2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 2229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf buf = opaque; /* just to make some compilers happy */ 2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ulg bsize = (ulg)items*size; 2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* If we allocate less than 65520 bytes, we assume that farmalloc 2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * will return a usable pointer which doesn't have to be normalized. 2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */ 2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (bsize < 65520L) { 2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buf = farmalloc(bsize); 2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (*(ush*)&buf != 0) return buf; 2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } else { 2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project buf = farmalloc(bsize + 16L); 2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (buf == NULL || next_ptr >= MAX_PTR) return NULL; 2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project table[next_ptr].org_ptr = buf; 2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* Normalize the pointer to seg:0 */ 2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; 2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *(ush*)&buf = 0; 2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project table[next_ptr++].new_ptr = buf; 2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return buf; 2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 244381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) 2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project int n; 2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (*(ush*)&ptr != 0) { /* object < 64K */ 2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project farfree(ptr); 2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return; 2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project /* Find the original pointer */ 2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project for (n = 0; n < next_ptr; n++) { 2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (ptr != table[n].new_ptr) continue; 2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project farfree(table[n].org_ptr); 2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project while (++n < next_ptr) { 2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project table[n-1] = table[n]; 2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project next_ptr--; 2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return; 2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project } 2629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project ptr = opaque; /* just to make some compilers happy */ 2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project Assert(0, "zcfree: ptr not found"); 2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif /* __TURBOC__ */ 2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifdef M_I86 2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* Microsoft C in 16-bit mode */ 2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define MY_ZCALLOC 2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) 2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define _halloc halloc 2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project# define _hfree hfree 2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 279381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) 2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 2819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (opaque) opaque = 0; /* to make compiler happy */ 2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return _halloc((long)items, size); 2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 285381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) 2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 2879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (opaque) opaque = 0; /* to make compiler happy */ 2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project _hfree(ptr); 2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif /* M_I86 */ 2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif /* SYS16BIT */ 2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef MY_ZCALLOC /* Any system without a special alloc function */ 2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#ifndef STDC 2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern voidp malloc OF((uInt size)); 3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern voidp calloc OF((uInt items, uInt size)); 3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectextern void free OF((voidpf ptr)); 3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif 3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 304381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoidpf ZLIB_INTERNAL zcalloc (opaque, items, size) 3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf opaque; 3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned items; 3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project unsigned size; 3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 3099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (opaque) items += size - size; /* make compiler happy */ 3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : 3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project (voidpf)calloc(items, size); 3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 314381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesvoid ZLIB_INTERNAL zcfree (opaque, ptr) 3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf opaque; 3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project voidpf ptr; 3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{ 3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project free(ptr); 3199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project if (opaque) return; /* make compiler happy */ 3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project} 3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project 3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#endif /* MY_ZCALLOC */ 323ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes 324ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes#endif /* !Z_SOLO */ 325