| 77 | } |
| 78 | |
| 79 | char *cbm_arena_sprintf(CBMArena *a, const char *fmt, ...) { |
| 80 | // First pass: compute length |
| 81 | va_list args; |
| 82 | va_start(args, fmt); |
| 83 | int needed = vsnprintf(NULL, 0, fmt, args); |
| 84 | va_end(args); |
| 85 | |
| 86 | if (needed < 0) { |
| 87 | return NULL; |
| 88 | } |
| 89 | |
| 90 | char *dst = (char *)cbm_arena_alloc(a, (size_t)needed + SKIP_ONE); |
| 91 | if (!dst) { |
| 92 | return NULL; |
| 93 | } |
| 94 | |
| 95 | va_start(args, fmt); |
| 96 | vsnprintf(dst, (size_t)needed + SKIP_ONE, fmt, args); |
| 97 | va_end(args); |
| 98 | |
| 99 | return dst; |
| 100 | } |
| 101 | |
| 102 | void cbm_arena_destroy(CBMArena *a) { |
| 103 | for (int i = 0; i < a->nblocks; i++) { |
no test coverage detected