/* 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.c,v 1.6 1995/04/29 14:54:02 jloup Exp $ */

#include <stdio.h>

#include "zutil.h"

extern void exit __P((int));

char *zlib_version = ZLIB_VERSION;

char *z_errmsg[] = {
"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 (m)
    char *m;
{
    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(MSDOS) && !defined(__SMALL__) && !defined(M_I86SM)
#  ifdef __TURBOC__

/* 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 (*(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;
    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");
}

#  else /* MSC */

#if (!defined(_MSC_VER) || (_MSC_VER < 600))
#  define _halloc  halloc
#  define _hfree   hfree
#endif

voidp zcalloc (voidp opaque, unsigned items, unsigned size)
{
    if (opaque) opaque = 0; /* to make compiler happy */
    return _halloc((long)items, size);
}

void  zcfree (voidp opaque, voidp ptr)
{
    if (opaque) opaque = 0; /* to make compiler happy */
    _hfree(ptr);
}

#  endif /* __TURBOC__ ? */

#else /* !MSDOS */

extern voidp calloc __P((uInt items, uInt size));
extern void  free   __P((voidp ptr));

voidp zcalloc (opaque, items, size)
    voidp opaque;
    unsigned items;
    unsigned size;
{
    return calloc(items, size);
}

void  zcfree (opaque, ptr)
    voidp opaque;
    voidp ptr;
{
    free(ptr);
}

#endif /* MSDOS */
