#include "syshdrs.h"
#ifdef PRAGMA_HDRSTOP
# pragma hdrstop
#endif
/* Based on Dynscpy, but not the same! */
/* 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 *-
* }
*
* You can also do stuff like this:
*
* p = NULL;
* Dynsrecpy(&p, "cruel", 0);
* Dynsrecpy(&p, "hello, ", p, " world!", 0);
* -* p now contains "hello, cruel world!" *-
*/
/*VARARGS*/
char *
Dynsrecpy(char **dst, ...)
{
va_list ap;
const char *src;
char *newdst, *dcp;
size_t catLen, srcLen;
int recursive;
if (dst == (char **) 0)
return NULL;
recursive = 0;
catLen = 0;
va_start(ap, dst);
src = va_arg(ap, char *);
while (src != NULL) {
if (src == *dst) {
recursive = 1;
}
catLen += strlen(src);
src = va_arg(ap, char *);
}
va_end(ap);
if (recursive == 0) {
if (*dst == NULL) {
newdst = malloc(catLen + 2);
} else if ((catLen + 2) > (strlen(*dst) + 1)) {
newdst = realloc(*dst, catLen + 2);
} else {
/* Don't need to make it bigger */
newdst = *dst;
}
if (newdst == NULL)
return NULL;
dcp = newdst;
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';
} else {
newdst = malloc(catLen + 2);
if (newdst == NULL)
return NULL;
dcp = newdst;
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';
if (*dst != NULL)
free(*dst);
}
*dst = newdst;
return (newdst);
} /* Dynsrecpy */
syntax highlighted by Code2HTML, v. 0.9.1