From 8d24600968fe0dc2306e3f92e598ffc0d9d4d6af Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 3 Jun 2009 22:30:45 +0000 Subject: Single-pass slv2_strjoin. git-svn-id: http://svn.drobilla.net/lad/trunk/slv2@2088 a436a847-0d15-0410-975c-d299462d15a1 --- src/util.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/util.c b/src/util.c index a58b5d1..5fa10c8 100644 --- a/src/util.c +++ b/src/util.c @@ -28,35 +28,27 @@ char* slv2_strjoin(const char* first, ...) { - /* FIXME: This is, in fact, as stupid as it looks */ - size_t len = strlen(first); - char* result = NULL; - va_list args; - - va_start(args, first); - while (1) { - const char* const s = va_arg(args, const char *); - if (s == NULL) - break; - len += strlen(s); - } - va_end(args); + char* result = malloc(len + 1); - result = malloc(len + 1); - if (!result) - return NULL; + memcpy(result, first, len); - strcpy(result, first); + va_list args; va_start(args, first); while (1) { const char* const s = va_arg(args, const char *); if (s == NULL) break; - strcat(result, s); + + const size_t this_len = strlen(s); + result = realloc(result, len + this_len + 1); + memcpy(result + len, s, this_len); + len += this_len; } va_end(args); + result[len] = '\0'; + return result; } -- cgit v1.2.1