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