/*
Copyright (C) 1997 by Warren R. Gish.  All Rights Reserved.
*/
#include <ncbi.h>
#include <sys/lock.h>
#include <gish.h>
#include <gishlib.h>
#include "nrdb.h"

#define DNABET	"ACGTRYMKWSBDHVN-"
void
initalpha()
{
	int	i;
	char	*cp, *cp0 = DNABET;

	for (i = 1; i < DIM(xltab); ++i)
		if (!isspace(i) && i != '\n' && i != '\r') {
			xltab[i] = i;
			/* make case-independent sequence comparisons */
			if (islower(i))
				xltab[i] = toupper(i);
		}

	MemSet(nt_atob, (1<<CHAR_BIT)-1, sizeof(nt_atob));

	for (cp = cp0; *cp != NULLB; ++cp) {
		nt_atob[*cp] = cp - cp0;
		nt_btoa[cp - cp0] = *cp;
	}

	return;
}

static size_t	totalloc;

size_t
totalloced()
{
	return totalloc;
}

VoidPtr
ckalloc(size)
	size_t	size;
{
	register char	*cp;

	if (size == 0)
		++size;
	cp = myalloc(size);
	if (cp == NULL)
		fatal(1, "Out of memory");
	return cp;
}


VoidPtr
ckalloc0(size)
	size_t	size;
{
	register char	*cp;

	if (size == 0)
		++size;
	cp = myalloc(size);
	if (cp == NULL)
		fatal(1, "Out of memory");
	Nlm_MemSet(cp, 0, size);
	return cp;
}

VoidPtr
my_dup(old, size)
	VoidPtr	old;
	size_t	size;
{
	VoidPtr	new;

	new = myalloc(size);
	Nlm_MemCpy(new, old, size);
	return new;
}

VoidPtr
myalloc(sz)
	size_t	sz;
{
	static size_t	remains;
	static void *cp;
	register void *newcp, *cp0;
	register size_t	allocsz;

	if (sz%8 != 0)
		sz += (8 - (sz%8));
	if (remains < sz) {
		allocsz = MAX(256*KBYTE, sz);
		newcp = mem_malloc(allocsz);
		if (newcp == NULL)
			fatal(1, "Out of memory (%lu Kbytes requested, %lu Kbytes have been obtained)", (unsigned long)allocsz/KBYTE, (unsigned long)totalloc/KBYTE);
		totalloc += allocsz;
		if (allocsz == sz)
			return newcp;
		remains = allocsz;
		cp = newcp;
	}
	cp0 = cp;
	cp = (char *)cp + sz;
	remains -= sz;
	return cp0;
}

