summaryrefslogtreecommitdiff
path: root/c/string_helpers.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/string_helpers.c')
-rw-r--r--c/string_helpers.c48
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;
+}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback