diff options
Diffstat (limited to 'c/string_helpers.c')
-rw-r--r-- | c/string_helpers.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/c/string_helpers.c b/c/string_helpers.c new file mode 100644 index 0000000..636bad3 --- /dev/null +++ b/c/string_helpers.c @@ -0,0 +1,48 @@ +#include <stdio.h> +#include <stdarg.h> + +static char *sbuild(char *format, ...) { + // (1) overapproximate the length of the string. adapted from man va_start + unsigned long max_len = 1; + char *s; + va_list ap; + va_start(ap, format); + for (char *c = format; *c; c++) { + if (*c != '%') { + max_len++; + continue; + } + + switch (*(++c)) { + case 's': + s = va_arg(ap, char*); + max_len += strlen(s); + break; + case 'l': // not quite accurate + va_arg(ap, unsigned long); + max_len += 64; + break; + case 'd': + va_arg(ap, int); + max_len += 32; + break; + case 'u': + va_arg(ap, unsigned); + max_len += 32; + break; + case 'f': + va_arg(ap, double); + max_len += 64; + break; + default: assert(0); + } + } + va_end(ap); + + char *str = calloc(max_len, sizeof(char)); + va_list ap_; + va_start(ap_, format); + vsprintf(str, format, ap_); + va_end(ap_); + return str; +} |