diff --git a/TODO.txt b/TODO.txt index 29bc438..16ade87 100644 --- a/TODO.txt +++ b/TODO.txt @@ -17,7 +17,8 @@ Milestone: v0.2.0 [ ] Document UserInteractiveAuth (move docs from Matrix) [ ] Document MemoryHexDump [ ] Move String functions to a new String.h? -[ ] Make UtilStringConcat use varargs +[~] Make UtilStringConcat use varargs + [ ] Update documentation [x] Look into seeding random strings (possibly create Random.h?) [~] User registration [x] Username validation diff --git a/src/Db.c b/src/Db.c index 4255dfb..4e7c27d 100644 --- a/src/Db.c +++ b/src/Db.c @@ -200,7 +200,7 @@ DbHashKey(Array * args) for (i = 0; i < ArraySize(args); i++) { - char *tmp = UtilStringConcat(str, ArrayGet(args, i)); + char *tmp = UtilStringConcat(2, str, ArrayGet(args, i)); Free(str); str = tmp; @@ -213,19 +213,17 @@ static char * DbDirName(Db * db, Array * args) { size_t i; - char *str = UtilStringConcat(db->dir, "/"); + char *str = UtilStringConcat(2, db->dir, "/"); for (i = 0; i < ArraySize(args) - 1; i++) { - char *tmp, *tmp2; + char *tmp; - tmp = UtilStringConcat(str, ArrayGet(args, i)); - tmp2 = UtilStringConcat(tmp, "/"); + tmp = UtilStringConcat(3, str, ArrayGet(args, i), "/"); Free(str); - Free(tmp); - str = tmp2; + str = tmp; } return str; @@ -235,11 +233,11 @@ static char * DbFileName(Db * db, Array * args) { size_t i; - char *str = UtilStringConcat(db->dir, "/"); + char *str = UtilStringConcat(2, db->dir, "/"); for (i = 0; i < ArraySize(args); i++) { - char *tmp, *tmp2; + char *tmp; char *arg = UtilStringDuplicate(ArrayGet(args, i)); size_t j = 0; @@ -260,15 +258,13 @@ DbFileName(Db * db, Array * args) j++; } - tmp = UtilStringConcat(str, arg); - tmp2 = UtilStringConcat(tmp, + tmp = UtilStringConcat(3, str, arg, (i < ArraySize(args) - 1) ? "/" : ".json"); Free(arg); Free(str); - Free(tmp); - str = tmp2; + str = tmp; } return str; diff --git a/src/Util.c b/src/Util.c index 1986d43..ecb438f 100644 --- a/src/Util.c +++ b/src/Util.c @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -211,43 +212,53 @@ UtilStringDuplicate(char *inStr) } char * -UtilStringConcat(char *str1, char *str2) +UtilStringConcat(size_t nStr,...) { - char *ret; - size_t str1Len, str2Len; + va_list argp; + char *str; + char *strp; + size_t strLen = 0; + size_t i; - str1Len = str1 ? strlen(str1) : 0; - str2Len = str2 ? strlen(str2) : 0; - - ret = Malloc(str1Len + str2Len + 1); - - if (!ret) + va_start(argp, nStr); + for (i = 0; i < nStr; i++) { - return NULL; - } + char *argStr = va_arg(argp, char *); - if (str1 && str2) - { - strcpy(ret, str1); - strcpy(ret + str1Len, str2); - } - else - { - if (str1) + if (argStr) { - strcpy(ret, str1); + strLen += strlen(argStr); } - else if (str2) + } + va_end(argp); + + str = Malloc(strLen + 1); + strp = str; + + va_start(argp, nStr); + + for (i = 0; i < nStr; i++) + { + /* Manually copy chars instead of using strcopy() so we don't + * have to call strlen() on the strings again, and we aren't + * writing useless null chars. */ + + char *argStr = va_arg(argp, char *); + + if (argStr) { - strcpy(ret, str2); - } - else - { - strcpy(ret, ""); + while (*argStr) + { + *strp = *argStr; + strp++; + argStr++; + } } } - return ret; + va_end(argp); + str[strLen] = '\0'; + return str; } int diff --git a/src/include/Util.h b/src/include/Util.h index 12443ab..a163b52 100644 --- a/src/include/Util.h +++ b/src/include/Util.h @@ -45,7 +45,7 @@ extern char * UtilStringDuplicate(char *); extern char * - UtilStringConcat(char *, char *); + UtilStringConcat(size_t,...); extern int UtilSleepMillis(long);