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;
}
|