summaryrefslogtreecommitdiff
path: root/c/string_helpers.c
blob: 636bad3976aea3414f15eb80696479094323b584 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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