1ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* zutil.c -- target dependent utility functions for the compression library 2ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * Copyright (C) 1995-2002 Jean-loup Gailly. 3ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * For conditions of distribution and use, see copyright notice in zlib.h 4ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 5ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 6ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* @(#) $Id$ */ 7ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 8ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#include "zutil.h" 9ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 10ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifndef STDC 11ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseextern void exit OF((int)); 12ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 13ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 14ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 15ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifndef HAVE_MEMCPY 16ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 17ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasevoid zmemcpy(dest, source, len) 18ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Bytef* dest; 19ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease const Bytef* source; 20ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt len; 21ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 22ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (len == 0) return; 23ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease do { 24ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *dest++ = *source++; /* ??? to be unrolled */ 25ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } while (--len != 0); 26ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 27ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 28ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseint zmemcmp(s1, s2, len) 29ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease const Bytef* s1; 30ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease const Bytef* s2; 31ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt len; 32ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 33ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt j; 34ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 35ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (j = 0; j < len; j++) { 36ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; 37ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 38ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return 0; 39ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 40ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 41ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasevoid zmemzero(dest, len) 42ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Bytef* dest; 43ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease uInt len; 44ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 45ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (len == 0) return; 46ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease do { 47ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *dest++ = 0; /* ??? to be unrolled */ 48ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } while (--len != 0); 49ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 50ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 51ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 52ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if defined( MSDOS ) && defined( __TURBOC__ ) && !defined( MY_ZCALLOC ) 53ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__) 54ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* Small and medium model in Turbo C are for now limited to near allocation 55ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * with reduced MAX_WBITS and MAX_MEM_LEVEL 56ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 57ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease# define MY_ZCALLOC 58ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 59ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* Turbo C malloc() does not allow dynamic allocation of 64K bytes 60ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * and farmalloc(64K) returns a pointer with an offset of 8, so we 61ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * must fix the pointer. Warning: the pointer must be put back to its 62ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * original form in order to free it, use zcfree(). 63ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 64ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 65ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#define MAX_PTR 10 66ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* 10*64K = 640K */ 67ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 68ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal int next_ptr = 0; 69ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 70ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasetypedef struct ptr_table_s { 71ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease voidpf org_ptr; 72ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease voidpf new_ptr; 73ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} ptr_table; 74ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 75ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaselocal ptr_table table[MAX_PTR]; 76ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* This table is used to remember the original form of pointers 77ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * to large buffers (64K). Such pointers are normalized with a zero offset. 78ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * Since MSDOS is not a preemptive multitasking OS, this table is not 79ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * protected from concurrent access. This hack doesn't work anyway on 80ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * a protected system like OS/2. Use Microsoft C instead. 81ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 82ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 83ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasevoidpf zcalloc (voidpf opaque, unsigned items, unsigned size) 84ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 85ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease voidpf buf = opaque; /* just to make some compilers happy */ 86ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ulg bsize = (ulg)items*size; 87ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 88ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* If we allocate less than 65520 bytes, we assume that farmalloc 89ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease * will return a usable pointer which doesn't have to be normalized. 90ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease */ 91ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (bsize < 65520L) { 92ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease buf = farmalloc(bsize); 93ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (*(ush*)&buf != 0) return buf; 94ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } else { 95ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease buf = farmalloc(bsize + 16L); 96ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 97ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (buf == NULL || next_ptr >= MAX_PTR) return NULL; 98ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease table[next_ptr].org_ptr = buf; 99ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 100ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Normalize the pointer to seg:0 */ 101ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; 102ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease *(ush*)&buf = 0; 103ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease table[next_ptr++].new_ptr = buf; 104ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return buf; 105ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 106ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 107ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasevoid zcfree (voidpf opaque, voidpf ptr) 108ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 109ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease int n; 110ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (*(ush*)&ptr != 0) { /* object < 64K */ 111ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease farfree(ptr); 112ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return; 113ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 114ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease /* Find the original pointer */ 115ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease for (n = 0; n < next_ptr; n++) { 116ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (ptr != table[n].new_ptr) continue; 117ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 118ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease farfree(table[n].org_ptr); 119ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease while (++n < next_ptr) { 120ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease table[n-1] = table[n]; 121ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 122ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease next_ptr--; 123ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return; 124ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease } 125ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ptr = opaque; /* just to make some compilers happy */ 126ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease Assert(0, "zcfree: ptr not found"); 127ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 128ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 129ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* MSDOS && __TURBOC__ */ 130ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 131ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 132ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if defined(M_I86) && !defined(__32BIT__) && !defined( MY_ZCALLOC ) 133ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease/* Microsoft C in 16-bit mode */ 134ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 135ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease# define MY_ZCALLOC 136ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 137ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) 138ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease# define _halloc halloc 139ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease# define _hfree hfree 140ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 141ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 142ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasevoidpf zcalloc (voidpf opaque, unsigned items, unsigned size) 143ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 144ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (opaque) opaque = 0; /* to make compiler happy */ 145ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return _halloc((long)items, size); 146ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 147ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 148ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasevoid zcfree (voidpf opaque, voidpf ptr) 149ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 150ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (opaque) opaque = 0; /* to make compiler happy */ 151ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease _hfree(ptr); 152ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 153ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 154ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* MSC */ 155ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 156ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 157ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifndef MY_ZCALLOC /* Any system without a special alloc function */ 158ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 159ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#ifndef STDC 160ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseextern voidp ft_scalloc OF((uInt items, uInt size)); 161ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leaseextern void ft_sfree OF((voidpf ptr)); 162ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif 163ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 164ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasevoidpf zcalloc (opaque, items, size) 165ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease voidpf opaque; 166ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease unsigned items; 167ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease unsigned size; 168ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 169ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (opaque) items += size - size; /* make compiler happy */ 170ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease return (voidpf)ft_scalloc(items, size); 171ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 172ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 173ec0bab5697bb31ba980810145f62e3799946ec60Victoria Leasevoid zcfree (opaque, ptr) 174ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease voidpf opaque; 175ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease voidpf ptr; 176ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease{ 177ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease ft_sfree(ptr); 178ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease if (opaque) return; /* make compiler happy */ 179ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease} 180ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 181ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease#endif /* MY_ZCALLOC */ 182