xref: /openbsd/sys/lib/libz/zutil.c (revision cfac609c)
16141cf33Sderaadt /* zutil.c -- target dependent utility functions for the compression library
236f395ceStb  * Copyright (C) 1995-2017 Jean-loup Gailly
36141cf33Sderaadt  * For conditions of distribution and use, see copyright notice in zlib.h
46141cf33Sderaadt  */
56141cf33Sderaadt 
66141cf33Sderaadt #include "zutil.h"
76141cf33Sderaadt 
836f395ceStb #ifndef _KERNEL
936f395ceStb #ifndef Z_SOLO
1036f395ceStb #  include "gzguts.h"
1136f395ceStb #endif
126141cf33Sderaadt #endif
136141cf33Sderaadt 
1436f395ceStb z_const char * const z_errmsg[10] = {
1536f395ceStb     (z_const char *)"need dictionary",     /* Z_NEED_DICT       2  */
1636f395ceStb     (z_const char *)"stream end",          /* Z_STREAM_END      1  */
1736f395ceStb     (z_const char *)"",                    /* Z_OK              0  */
1836f395ceStb     (z_const char *)"file error",          /* Z_ERRNO         (-1) */
1936f395ceStb     (z_const char *)"stream error",        /* Z_STREAM_ERROR  (-2) */
2036f395ceStb     (z_const char *)"data error",          /* Z_DATA_ERROR    (-3) */
2136f395ceStb     (z_const char *)"insufficient memory", /* Z_MEM_ERROR     (-4) */
2236f395ceStb     (z_const char *)"buffer error",        /* Z_BUF_ERROR     (-5) */
2336f395ceStb     (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */
2436f395ceStb     (z_const char *)""
2536f395ceStb };
266141cf33Sderaadt 
276141cf33Sderaadt 
zlibVersion(void)28*cfac609cStb const char * ZEXPORT zlibVersion(void) {
296141cf33Sderaadt     return ZLIB_VERSION;
306141cf33Sderaadt }
316141cf33Sderaadt 
zlibCompileFlags(void)32*cfac609cStb uLong ZEXPORT zlibCompileFlags(void) {
336141cf33Sderaadt     uLong flags;
346141cf33Sderaadt 
356141cf33Sderaadt     flags = 0;
3636f395ceStb     switch ((int)(sizeof(uInt))) {
376141cf33Sderaadt     case 2:     break;
386141cf33Sderaadt     case 4:     flags += 1;     break;
396141cf33Sderaadt     case 8:     flags += 2;     break;
406141cf33Sderaadt     default:    flags += 3;
416141cf33Sderaadt     }
4236f395ceStb     switch ((int)(sizeof(uLong))) {
436141cf33Sderaadt     case 2:     break;
446141cf33Sderaadt     case 4:     flags += 1 << 2;        break;
456141cf33Sderaadt     case 8:     flags += 2 << 2;        break;
466141cf33Sderaadt     default:    flags += 3 << 2;
476141cf33Sderaadt     }
4836f395ceStb     switch ((int)(sizeof(voidpf))) {
496141cf33Sderaadt     case 2:     break;
506141cf33Sderaadt     case 4:     flags += 1 << 4;        break;
516141cf33Sderaadt     case 8:     flags += 2 << 4;        break;
526141cf33Sderaadt     default:    flags += 3 << 4;
536141cf33Sderaadt     }
5436f395ceStb     switch ((int)(sizeof(z_off_t))) {
556141cf33Sderaadt     case 2:     break;
566141cf33Sderaadt     case 4:     flags += 1 << 6;        break;
576141cf33Sderaadt     case 8:     flags += 2 << 6;        break;
586141cf33Sderaadt     default:    flags += 3 << 6;
596141cf33Sderaadt     }
6036f395ceStb #ifdef ZLIB_DEBUG
616141cf33Sderaadt     flags += 1 << 8;
626141cf33Sderaadt #endif
63ddf65acdStb     /*
646141cf33Sderaadt #if defined(ASMV) || defined(ASMINF)
656141cf33Sderaadt     flags += 1 << 9;
666141cf33Sderaadt #endif
67ddf65acdStb      */
686141cf33Sderaadt #ifdef ZLIB_WINAPI
696141cf33Sderaadt     flags += 1 << 10;
706141cf33Sderaadt #endif
716141cf33Sderaadt #ifdef BUILDFIXED
726141cf33Sderaadt     flags += 1 << 12;
736141cf33Sderaadt #endif
746141cf33Sderaadt #ifdef DYNAMIC_CRC_TABLE
756141cf33Sderaadt     flags += 1 << 13;
766141cf33Sderaadt #endif
776141cf33Sderaadt #ifdef NO_GZCOMPRESS
786141cf33Sderaadt     flags += 1L << 16;
796141cf33Sderaadt #endif
806141cf33Sderaadt #ifdef NO_GZIP
816141cf33Sderaadt     flags += 1L << 17;
826141cf33Sderaadt #endif
836141cf33Sderaadt #ifdef PKZIP_BUG_WORKAROUND
846141cf33Sderaadt     flags += 1L << 20;
856141cf33Sderaadt #endif
866141cf33Sderaadt #ifdef FASTEST
876141cf33Sderaadt     flags += 1L << 21;
886141cf33Sderaadt #endif
8936f395ceStb #if defined(STDC) || defined(Z_HAVE_STDARG_H)
906141cf33Sderaadt #  ifdef NO_vsnprintf
916141cf33Sderaadt     flags += 1L << 25;
926141cf33Sderaadt #    ifdef HAS_vsprintf_void
936141cf33Sderaadt     flags += 1L << 26;
946141cf33Sderaadt #    endif
956141cf33Sderaadt #  else
966141cf33Sderaadt #    ifdef HAS_vsnprintf_void
976141cf33Sderaadt     flags += 1L << 26;
986141cf33Sderaadt #    endif
996141cf33Sderaadt #  endif
1006141cf33Sderaadt #else
1016141cf33Sderaadt     flags += 1L << 24;
1026141cf33Sderaadt #  ifdef NO_snprintf
1036141cf33Sderaadt     flags += 1L << 25;
1046141cf33Sderaadt #    ifdef HAS_sprintf_void
1056141cf33Sderaadt     flags += 1L << 26;
1066141cf33Sderaadt #    endif
1076141cf33Sderaadt #  else
1086141cf33Sderaadt #    ifdef HAS_snprintf_void
1096141cf33Sderaadt     flags += 1L << 26;
1106141cf33Sderaadt #    endif
1116141cf33Sderaadt #  endif
1126141cf33Sderaadt #endif
1136141cf33Sderaadt     return flags;
1146141cf33Sderaadt }
1156141cf33Sderaadt 
11636f395ceStb #ifdef ZLIB_DEBUG
11736f395ceStb #include <stdlib.h>
1186141cf33Sderaadt #  ifndef verbose
1196141cf33Sderaadt #    define verbose 0
1206141cf33Sderaadt #  endif
12136f395ceStb int ZLIB_INTERNAL z_verbose = verbose;
1226141cf33Sderaadt 
z_error(char * m)123*cfac609cStb void ZLIB_INTERNAL z_error(char *m) {
1246141cf33Sderaadt     fprintf(stderr, "%s\n", m);
1256141cf33Sderaadt     exit(1);
1266141cf33Sderaadt }
1276141cf33Sderaadt #endif
1286141cf33Sderaadt 
1296141cf33Sderaadt /* exported to allow conversion of error code to string for compress() and
1306141cf33Sderaadt  * uncompress()
1316141cf33Sderaadt  */
zError(int err)132*cfac609cStb const char * ZEXPORT zError(int err) {
1336141cf33Sderaadt     return ERR_MSG(err);
1346141cf33Sderaadt }
1356141cf33Sderaadt 
136a6530658Stb #if defined(_WIN32_WCE) && _WIN32_WCE < 0x800
137a6530658Stb     /* The older Microsoft C Run-Time Library for Windows CE doesn't have
1386141cf33Sderaadt      * errno.  We define it as a global variable to simplify porting.
1396141cf33Sderaadt      * Its value is always 0 and should not be used.
1406141cf33Sderaadt      */
1416141cf33Sderaadt     int errno = 0;
1426141cf33Sderaadt #endif
1436141cf33Sderaadt 
1446141cf33Sderaadt #ifndef HAVE_MEMCPY
1456141cf33Sderaadt 
zmemcpy(Bytef * dest,const Bytef * source,uInt len)146*cfac609cStb void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) {
1476141cf33Sderaadt     if (len == 0) return;
1486141cf33Sderaadt     do {
1496141cf33Sderaadt         *dest++ = *source++; /* ??? to be unrolled */
1506141cf33Sderaadt     } while (--len != 0);
1516141cf33Sderaadt }
1526141cf33Sderaadt 
zmemcmp(const Bytef * s1,const Bytef * s2,uInt len)153*cfac609cStb int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) {
1546141cf33Sderaadt     uInt j;
1556141cf33Sderaadt 
1566141cf33Sderaadt     for (j = 0; j < len; j++) {
1576141cf33Sderaadt         if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
1586141cf33Sderaadt     }
1596141cf33Sderaadt     return 0;
1606141cf33Sderaadt }
1616141cf33Sderaadt 
zmemzero(Bytef * dest,uInt len)162*cfac609cStb void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) {
1636141cf33Sderaadt     if (len == 0) return;
1646141cf33Sderaadt     do {
1656141cf33Sderaadt         *dest++ = 0;  /* ??? to be unrolled */
1666141cf33Sderaadt     } while (--len != 0);
1676141cf33Sderaadt }
1686141cf33Sderaadt #endif
1696141cf33Sderaadt 
17036f395ceStb #ifndef Z_SOLO
1716141cf33Sderaadt 
1726141cf33Sderaadt #ifdef SYS16BIT
1736141cf33Sderaadt 
1746141cf33Sderaadt #ifdef __TURBOC__
1756141cf33Sderaadt /* Turbo C in 16-bit mode */
1766141cf33Sderaadt 
1776141cf33Sderaadt #  define MY_ZCALLOC
1786141cf33Sderaadt 
1796141cf33Sderaadt /* Turbo C malloc() does not allow dynamic allocation of 64K bytes
1806141cf33Sderaadt  * and farmalloc(64K) returns a pointer with an offset of 8, so we
1816141cf33Sderaadt  * must fix the pointer. Warning: the pointer must be put back to its
1826141cf33Sderaadt  * original form in order to free it, use zcfree().
1836141cf33Sderaadt  */
1846141cf33Sderaadt 
1856141cf33Sderaadt #define MAX_PTR 10
1866141cf33Sderaadt /* 10*64K = 640K */
1876141cf33Sderaadt 
1886141cf33Sderaadt local int next_ptr = 0;
1896141cf33Sderaadt 
1906141cf33Sderaadt typedef struct ptr_table_s {
1916141cf33Sderaadt     voidpf org_ptr;
1926141cf33Sderaadt     voidpf new_ptr;
1936141cf33Sderaadt } ptr_table;
1946141cf33Sderaadt 
1956141cf33Sderaadt local ptr_table table[MAX_PTR];
1966141cf33Sderaadt /* This table is used to remember the original form of pointers
1976141cf33Sderaadt  * to large buffers (64K). Such pointers are normalized with a zero offset.
1986141cf33Sderaadt  * Since MSDOS is not a preemptive multitasking OS, this table is not
1996141cf33Sderaadt  * protected from concurrent access. This hack doesn't work anyway on
2006141cf33Sderaadt  * a protected system like OS/2. Use Microsoft C instead.
2016141cf33Sderaadt  */
2026141cf33Sderaadt 
zcalloc(voidpf opaque,unsigned items,unsigned size)203*cfac609cStb voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
20436f395ceStb     voidpf buf;
2056141cf33Sderaadt     ulg bsize = (ulg)items*size;
2066141cf33Sderaadt 
20736f395ceStb     (void)opaque;
20836f395ceStb 
2096141cf33Sderaadt     /* If we allocate less than 65520 bytes, we assume that farmalloc
2106141cf33Sderaadt      * will return a usable pointer which doesn't have to be normalized.
2116141cf33Sderaadt      */
2126141cf33Sderaadt     if (bsize < 65520L) {
2136141cf33Sderaadt         buf = farmalloc(bsize);
2146141cf33Sderaadt         if (*(ush*)&buf != 0) return buf;
2156141cf33Sderaadt     } else {
2166141cf33Sderaadt         buf = farmalloc(bsize + 16L);
2176141cf33Sderaadt     }
2186141cf33Sderaadt     if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
2196141cf33Sderaadt     table[next_ptr].org_ptr = buf;
2206141cf33Sderaadt 
2216141cf33Sderaadt     /* Normalize the pointer to seg:0 */
2226141cf33Sderaadt     *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
2236141cf33Sderaadt     *(ush*)&buf = 0;
2246141cf33Sderaadt     table[next_ptr++].new_ptr = buf;
2256141cf33Sderaadt     return buf;
2266141cf33Sderaadt }
2276141cf33Sderaadt 
zcfree(voidpf opaque,voidpf ptr)228*cfac609cStb void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
2296141cf33Sderaadt     int n;
23036f395ceStb 
23136f395ceStb     (void)opaque;
23236f395ceStb 
2336141cf33Sderaadt     if (*(ush*)&ptr != 0) { /* object < 64K */
2346141cf33Sderaadt         farfree(ptr);
2356141cf33Sderaadt         return;
2366141cf33Sderaadt     }
2376141cf33Sderaadt     /* Find the original pointer */
2386141cf33Sderaadt     for (n = 0; n < next_ptr; n++) {
2396141cf33Sderaadt         if (ptr != table[n].new_ptr) continue;
2406141cf33Sderaadt 
2416141cf33Sderaadt         farfree(table[n].org_ptr);
2426141cf33Sderaadt         while (++n < next_ptr) {
2436141cf33Sderaadt             table[n-1] = table[n];
2446141cf33Sderaadt         }
2456141cf33Sderaadt         next_ptr--;
2466141cf33Sderaadt         return;
2476141cf33Sderaadt     }
2486141cf33Sderaadt     Assert(0, "zcfree: ptr not found");
2496141cf33Sderaadt }
2506141cf33Sderaadt 
2516141cf33Sderaadt #endif /* __TURBOC__ */
2526141cf33Sderaadt 
2536141cf33Sderaadt 
2546141cf33Sderaadt #ifdef M_I86
2556141cf33Sderaadt /* Microsoft C in 16-bit mode */
2566141cf33Sderaadt 
2576141cf33Sderaadt #  define MY_ZCALLOC
2586141cf33Sderaadt 
2596141cf33Sderaadt #if (!defined(_MSC_VER) || (_MSC_VER <= 600))
2606141cf33Sderaadt #  define _halloc  halloc
2616141cf33Sderaadt #  define _hfree   hfree
2626141cf33Sderaadt #endif
2636141cf33Sderaadt 
zcalloc(voidpf opaque,uInt items,uInt size)264*cfac609cStb voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) {
26536f395ceStb     (void)opaque;
2666141cf33Sderaadt     return _halloc((long)items, size);
2676141cf33Sderaadt }
2686141cf33Sderaadt 
zcfree(voidpf opaque,voidpf ptr)269*cfac609cStb void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
27036f395ceStb     (void)opaque;
2716141cf33Sderaadt     _hfree(ptr);
2726141cf33Sderaadt }
2736141cf33Sderaadt 
2746141cf33Sderaadt #endif /* M_I86 */
2756141cf33Sderaadt 
2766141cf33Sderaadt #endif /* SYS16BIT */
2776141cf33Sderaadt 
2786141cf33Sderaadt 
2796141cf33Sderaadt #ifndef MY_ZCALLOC /* Any system without a special alloc function */
2806141cf33Sderaadt 
2816141cf33Sderaadt #ifndef STDC
282*cfac609cStb extern voidp malloc(uInt size);
283*cfac609cStb extern voidp calloc(uInt items, uInt size);
284*cfac609cStb extern void free(voidpf ptr);
2856141cf33Sderaadt #endif
2866141cf33Sderaadt 
zcalloc(voidpf opaque,unsigned items,unsigned size)287*cfac609cStb voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) {
28836f395ceStb     (void)opaque;
28936f395ceStb     if (items == 0 || size == 0)
2906141cf33Sderaadt         return (NULL);
29136f395ceStb     return reallocarray(NULL, items, size);
2926141cf33Sderaadt }
2936141cf33Sderaadt 
zcfree(voidpf opaque,voidpf ptr)294*cfac609cStb void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) {
29536f395ceStb     (void)opaque;
2966141cf33Sderaadt     free(ptr);
2976141cf33Sderaadt }
2986141cf33Sderaadt 
2996141cf33Sderaadt #endif /* MY_ZCALLOC */
30036f395ceStb 
30136f395ceStb #endif /* !Z_SOLO */
302