218 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //
 | |
| // ZUTIL.CPP
 | |
| //
 | |
| //  Source file for ArchiveLib 2.0
 | |
| //
 | |
| //  No Copyright claimed by Greenleaf Software!
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This is one of the ZLIB source files, with as few changes as possible.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| #include "arclib.h"
 | |
| #if !defined( AL_IBM )
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| #if defined( AL_BORLAND )
 | |
| #pragma option -w-
 | |
| #endif
 | |
| 
 | |
| /* zutil.c -- target dependent utility functions for the compression library
 | |
|  * Copyright (C) 1995 Jean-loup Gailly.
 | |
|  * For conditions of distribution and use, see copyright notice in zlib.h
 | |
|  */
 | |
| 
 | |
| /* $Id: zutil.cpp,v 1.1.1.1 1997-10-09 16:08:45 alex Exp $ */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #include "zutil.h"
 | |
| 
 | |
| //
 | |
| // Everyone supports exit()
 | |
| //
 | |
| //#ifndef __GO32__
 | |
| //extern void exit __P((int));
 | |
| //#endif
 | |
| 
 | |
| char *zlib_version = ZLIB_VERSION;
 | |
| 
 | |
| char *z_errmsg[8] = {
 | |
| "stream end",          /* Z_STREAM_END    1 */
 | |
| "",                    /* Z_OK            0 */
 | |
| "file error",          /* Z_ERRNO        (-1) */
 | |
| "stream error",        /* Z_STREAM_ERROR (-2) */
 | |
| "data error",          /* Z_DATA_ERROR   (-3) */
 | |
| "insufficient memory", /* Z_MEM_ERROR    (-4) */
 | |
| "buffer error",        /* Z_BUF_ERROR    (-5) */
 | |
| ""};
 | |
| 
 | |
| 
 | |
| void z_error (char *)
 | |
| {
 | |
| //    fprintf(stderr, "%s\n", m);
 | |
| //    exit(1);
 | |
| }
 | |
| 
 | |
| #ifndef HAVE_MEMCPY
 | |
| 
 | |
| void zmemcpy(dest, source, len)
 | |
|     Byte* dest;
 | |
|     Byte* source;
 | |
|     uInt  len;
 | |
| {
 | |
|     if (len == 0) return;
 | |
|     do {
 | |
|         *dest++ = *source++; /* ??? to be unrolled */
 | |
|     } while (--len != 0);
 | |
| }
 | |
| 
 | |
| void zmemzero(dest, len)
 | |
|     Byte* dest;
 | |
|     uInt  len;
 | |
| {
 | |
|     if (len == 0) return;
 | |
|     do {
 | |
|         *dest++ = 0;  /* ??? to be unrolled */
 | |
|     } while (--len != 0);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #if defined(__TURBOC__) && !defined( AL_FLAT_MODEL )
 | |
| 
 | |
| #  define MY_ZCALLOC
 | |
| 
 | |
| /* Turbo C malloc() does not allow dynamic allocation of 64K bytes
 | |
|  * and farmalloc(64K) returns a pointer with an offset of 8, so we
 | |
|  * must fix the pointer. Warning: the pointer must be put back to its
 | |
|  * original form in order to free it, use zcfree().
 | |
|  */
 | |
| 
 | |
| #define MAX_PTR 10
 | |
| /* 10*64K = 640K */
 | |
| 
 | |
| local int next_ptr = 0;
 | |
| 
 | |
| typedef struct ptr_table_s {
 | |
|     voidp org_ptr;
 | |
|     voidp new_ptr;
 | |
| } ptr_table;
 | |
| 
 | |
| local ptr_table table[MAX_PTR];
 | |
| /* This table is used to remember the original form of pointers
 | |
|  * to large buffers (64K). Such pointers are normalized with a zero offset.
 | |
|  * Since MSDOS is not a preemptive multitasking OS, this table is not
 | |
|  * protected from concurrent access. This hack doesn't work anyway on
 | |
|  * a protected system like OS/2. Use Microsoft C instead.
 | |
|  */
 | |
| 
 | |
| voidp zcalloc (voidp opaque, unsigned items, unsigned size)
 | |
| {
 | |
|     voidp buf = opaque; /* just to make some compilers happy */
 | |
|     ulg bsize = (ulg)items*size;
 | |
| 
 | |
|     if (bsize < 65536L) {
 | |
|         buf = farmalloc(bsize);
 | |
| #if 0
 | |
|     cout << "farmalloc( " << items << "," << size << " = " << (void _far *) buf  << endl;
 | |
| #endif
 | |
|         if (*(ush*)&buf != 0) return buf;
 | |
|     } else {
 | |
|         buf = farmalloc(bsize + 16L);
 | |
|     }
 | |
|     if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
 | |
|     table[next_ptr].org_ptr = buf;
 | |
| 
 | |
|     /* Normalize the pointer to seg:0 */
 | |
|     *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
 | |
|     *(ush*)&buf = 0;
 | |
|     table[next_ptr++].new_ptr = buf;
 | |
| #if 0
 | |
|     cout << "farmalloc( " << items << "," << size << " = " << (void _far *) buf  << endl;
 | |
| #endif
 | |
|     return buf;
 | |
| }
 | |
| 
 | |
| void  zcfree (voidp opaque, voidp ptr)
 | |
| {
 | |
|     int n;
 | |
|     if (*(ush*)&ptr != 0) { /* object < 64K */
 | |
|         farfree(ptr);
 | |
|         return;
 | |
|     }
 | |
|     /* Find the original pointer */
 | |
|     for (n = 0; n < next_ptr; n++) {
 | |
|         if (ptr != table[n].new_ptr) continue;
 | |
| 
 | |
|         farfree(table[n].org_ptr);
 | |
|         while (++n < next_ptr) {
 | |
|             table[n-1] = table[n];
 | |
|         }
 | |
|         next_ptr--;
 | |
|         return;
 | |
|     }
 | |
|     ptr = opaque; /* just to make some compilers happy */
 | |
|     z_error("zcfree: ptr not found");
 | |
| }
 | |
| #endif /* __TURBOC__ */
 | |
| 
 | |
| //#if defined(M_I86CM) || defined(M_I86LM) /* MSC compact or large model */
 | |
| #if !defined( AL_FLAT_MODEL )
 | |
| #if defined( AL_MICROSOFT ) || defined( AL_SYMANTEC ) || defined( AL_WATCOM )
 | |
| #  define MY_ZCALLOC
 | |
| 
 | |
| //#if (!defined(_MSC_VER) || (_MSC_VER < 600))
 | |
| //#  define _halloc  halloc
 | |
| //#  define _hfree   hfree
 | |
| //#endif
 | |
| 
 | |
| #if defined( AL_WATCOM )
 | |
| #  define _halloc  halloc
 | |
| #  define _hfree   hfree
 | |
| #endif
 | |
| 
 | |
| 
 | |
| voidp zcalloc (voidp opaque, unsigned items, unsigned size)
 | |
| {
 | |
|     if (opaque) opaque = 0; /* to make compiler happy */
 | |
|     void _huge *h = _halloc((long)items, size);
 | |
| #if 0
 | |
|     cout << "halloc( " << items << "," << size << " = " << h << endl;
 | |
| #endif
 | |
|     return h;
 | |
| }
 | |
| 
 | |
| void  zcfree (voidp opaque, voidp ptr)
 | |
| {
 | |
|     if (opaque) opaque = 0; /* to make compiler happy */
 | |
|     _hfree(ptr);
 | |
| }
 | |
| 
 | |
| #endif /* defined(M_I86CM) || defined(M_I86LM) */
 | |
| #endif
 | |
| 
 | |
| #ifndef MY_ZCALLOC /* Any system without a special alloc function */
 | |
| 
 | |
| #if 0
 | |
| #ifndef __GO32__
 | |
| extern voidp calloc __P((uInt items, uInt size));
 | |
| extern void  free   __P((voidp ptr));
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| voidp zcalloc (voidp, unsigned items, unsigned size)
 | |
| {
 | |
|     return calloc(items, size);
 | |
| }
 | |
| 
 | |
| void  zcfree (voidp, voidp ptr)
 | |
| {
 | |
|     free(ptr);
 | |
| }
 | |
| 
 | |
| #endif /* MY_ZCALLOC */
 |