From 86f852cd76cf92a4b08b59b127cc954420f95744 Mon Sep 17 00:00:00 2001 From: Matthew Sotoudeh Date: Mon, 31 Jul 2023 13:53:16 -0700 Subject: share more code between the C examples --- c/string_helpers.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 c/string_helpers.c (limited to 'c/string_helpers.c') 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 +#include + +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; +} -- cgit v1.2.3