strbuf.c (1067B)
1 /* Tiny bounded text builder — numeric formatters. 2 * 3 * Char-by-char appends live inline in core/strbuf.h; the dec/hex 4 * formatters live here so we don't pull <stdio.h> into every TU that 5 * includes the header. */ 6 7 #include "core/strbuf.h" 8 9 void strbuf_put_u64(StrBuf* sb, u64 v) { 10 char tmp[24]; 11 u32 n = 0; 12 if (v == 0) { 13 strbuf_putc(sb, '0'); 14 return; 15 } 16 while (v) { 17 tmp[n++] = (char)('0' + (u32)(v % 10u)); 18 v /= 10u; 19 } 20 while (n--) strbuf_putc(sb, tmp[n]); 21 } 22 23 void strbuf_put_i64(StrBuf* sb, i64 v) { 24 u64 u; 25 if (v < 0) { 26 strbuf_putc(sb, '-'); 27 /* Negate into u64 to handle INT64_MIN without UB. */ 28 u = (u64)(-(v + 1)) + 1u; 29 } else { 30 u = (u64)v; 31 } 32 strbuf_put_u64(sb, u); 33 } 34 35 void strbuf_put_hex_u64(StrBuf* sb, u64 v) { 36 static const char digits[] = "0123456789abcdef"; 37 char tmp[16]; 38 u32 n = 0; 39 strbuf_putc(sb, '0'); 40 strbuf_putc(sb, 'x'); 41 if (v == 0) { 42 strbuf_putc(sb, '0'); 43 return; 44 } 45 while (v) { 46 tmp[n++] = digits[v & 0xfu]; 47 v >>= 4; 48 } 49 while (n--) strbuf_putc(sb, tmp[n]); 50 }