#include <ncbi.h>
#include <gishlib.h>

Link1BlkPtr LIBCALL
Link1New(size)
	size_t	size;
{
	Link1BlkPtr	lp;

	lp = Nlm_Malloc(sizeof(*lp) + size);
	if (lp == NULL)
		return NULL;
	lp->next = NULL;
	if (size == 0)
		lp->cp = NULL;
	else
		lp->cp = (CharPtr)lp + sizeof(*lp);

	return lp;
}

void LIBCALL
Link1Destruct(lp)
	register Link1BlkPtr	lp;
{
	register Link1BlkPtr	lp2;

	while (lp != NULL) {
		lp2 = lp->next;
		lp->next = NULL;
		lp->cp = NULL;
		Nlm_Free(lp);
		lp = lp2;
	}
}

/* Link1Count -- return the count of items in a linked list */
size_t LIBCALL
Link1Count(lp)
	register Link1BlkPtr	lp;
{
	register size_t	n = 0;

	while (lp != NULL) {
		++n;
		lp = lp->next;
	}
	return n;
}

/* append lp1 to lp0 and return the head of the list; lp0 may be empty(NULL) */
Link1BlkPtr LIBCALL
Link1Append(lp0, lp1)
	Link1BlkPtr	lp0, lp1;
{
	register Link1BlkPtr	lp = lp0;

	if (lp0 == NULL)
		return lp1;

	while (lp->next != NULL)
		lp = lp->next;

	lp->next = lp1;

	return lp0;
}

Link1BlkPtr LIBCALL
Link1Save(buf, buflen)
	Nlm_VoidPtr	buf;
	size_t	buflen;
{
	Link1BlkPtr	lp;

	lp = Link1New(buflen);
	if (lp == NULL)
		return NULL;

	Nlm_MemCpy(lp->cp, buf, buflen);
	return lp;
}
