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