#include "syshdrs.h"
#ifdef PRAGMA_HDRSTOP
#	pragma hdrstop
#endif

/* Use Dynscpy when you want to manage free'ing the created pointer
 * yourself; Dynsrecpy will try to free an existing pointer if needed
 * before creating the new string, but you have to be sure to be sure
 * initialize the pointer to NULL the first time you use it..
 *
 * Example:
 *
 * {
 *     char *p;                            -* p contains garbage *-
 *     Dynscpy(&p, "foo", "bar", 0);       -* no need to initialize p *-
 *     free(p);                            -* must free p to avoid leak *-
 *     Dynscpy(&p, "hello", "world", 0);   -* p can now be reused *-
 *     free(p);                            -* must free p to avoid leak *-
 *     Dynscpy(&p, "test", "123", 0);      -* p can now be reused *-
 *     free(p);                            -* free p when finished *-
 * }
 *
 * {
 *     char *p;
 *     p = NULL;  -* Must init p to NULL, else free() will get garbage *-
 *     Dynsrecpy(&p, "foo", "bar", 0);     -* on this call to Dynsrecpy *-
 *     Dynsrecpy(&p, "hello", "world", 0); -* p will be freed *-
 *     Dynsrecpy(&p, "test", "123", 0);    -* p will be freed *-
 *     free(p);                            -* free p when finished *-
 * }
 */

/*VARARGS*/
char *
Dynscpy(char **dst, ...)
{
	va_list ap;
	const char *src;
	char *newdst, *dcp;
	size_t curLen, catLen, srcLen;

	if (dst == (char **) 0)
		return NULL;

	catLen = 0;
	va_start(ap, dst);
	src = va_arg(ap, char *);
	while (src != NULL) {
		catLen += strlen(src);
		src = va_arg(ap, char *);
	}
	va_end(ap);

	curLen = 0;

	newdst = malloc(curLen + catLen + 2);
	if (newdst == NULL) {
		*dst = NULL;
		return NULL;
	}

	dcp = newdst + curLen;
	va_start(ap, dst);
	src = va_arg(ap, char *);
	while (src != NULL) {
		srcLen = strlen(src);
		memcpy(dcp, src, srcLen);
		dcp += srcLen;
		src = va_arg(ap, char *);
	}
	va_end(ap);
	*dcp = '\0';

	*dst = newdst;
	return (newdst);
}	/* Dynscpy */


syntax highlighted by Code2HTML, v. 0.9.1