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

CharPtr LIBCALL
vstr_cpy(base, maxlenp, dst, src)
	CharPtr	PNTR base, dst, src;
	size_t	PNTR maxlenp;
{
	register size_t	maxlen, remains, srclen, off;
	register CharPtr	tmpbase;

	off = dst - (tmpbase = *base);
	remains = (maxlen = *maxlenp) - off;
	srclen = strlen(src);
	if (srclen < remains) {
		Nlm_MemCpy(dst, src, srclen+1);
		return dst+srclen;
	}
	++srclen;
	if (tmpbase == NULL)
		tmpbase = mem_malloc(srclen);
	else
		tmpbase = mem_realloc(tmpbase, maxlen + (srclen - remains));
	if (tmpbase == NULL)
		return NULL;
	*base = tmpbase;
	*maxlenp = maxlen + srclen - remains;
	Nlm_MemCpy(dst = tmpbase + off, src, srclen);
	return dst+srclen-1;
}

/* Avoid calling vstr_cat() -- it will be slow! */
int LIBCALL
vstr_cat(dstp, maxlenp, src)
	register CharPtr	PNTR dstp, src;
	register size_t	PNTR maxlenp;
{
	register size_t	len, dlen;
	register CharPtr	new;

	dlen= 0;
	if (*dstp != NULL)
		dlen = strlen(*dstp);
	len = strlen(src) + 1;
	if (dlen + len <= *maxlenp) {
		Nlm_MemCpy(*dstp + dlen, src, len);
		return 0;
	}
	new = mem_realloc(*dstp, dlen + len);
	if (new == NULL)
		return 1;
	Nlm_MemCpy((*dstp = new) + dlen, src, *maxlenp = len);
	return 0;
}
