kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }