diff options
-rw-r--r-- | strcon.c | 45 | ||||
-rw-r--r-- | strcon.h | 11 |
2 files changed, 56 insertions, 0 deletions
diff --git a/strcon.c b/strcon.c new file mode 100644 index 0000000..0e8c5b2 --- /dev/null +++ b/strcon.c @@ -0,0 +1,45 @@ +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include "strcon.h" + +char *strcon(char *dest, ...) +{ + va_list ap; + va_start(ap, dest); + + const char *src; + while ((src = va_arg(ap, const char*))) { + strcat(dest, src); + } + + va_end(ap); + return dest; +} + +char *astrcon(const char *src1, ...) +{ + va_list ap; + va_start(ap, src1); + + va_list aq; // copy so we can iterate twice + va_copy(aq, ap); + + const char *src2; + size_t size = 1 + strlen(src1); + while ((src2 = va_arg(aq, const char*))) { + size += strlen(src2); + } + + va_end(aq); + + char *dest = malloc(size); + strcat(dest, src1); + + while ((src2 = va_arg(ap, const char*))) { + strcat(dest, src2); + } + + va_end(ap); + return dest; +} diff --git a/strcon.h b/strcon.h new file mode 100644 index 0000000..9fd535a --- /dev/null +++ b/strcon.h @@ -0,0 +1,11 @@ +#ifndef _STRCON_H_ +#define _STRCON_H_ + +/* + * The functions below should only be called with string arguments. + * The last argument has to be NULL. + */ +char *strcon(char *dest, ...); +char *astrcon(const char *src, ...); + +#endif |