Advertisement
Tkap1

Untitled

Jul 6th, 2025
369
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.47 KB | None | 0 0
  1.  
  2. func void format_text2_(s_str_builder<16384>* builder, s_len_str format)
  3. {
  4.     builder->add("%.*s", expand_str(format));
  5. }
  6.  
  7. template <typename t0, typename... targs>
  8. func void format_text2_(s_str_builder<16384>* builder, s_len_str format, t0 val, targs... args)
  9. {
  10.     #define get_next_char(mi) ((mi) < format.count - 1) ? format[mi + 1] : 0;
  11.  
  12.     assert(format.count > 0);
  13.  
  14.     for(int i = 0; i < format.count; i += 1) {
  15.         char float_fmt[32] = zero;
  16.         float_fmt[0] = '%';
  17.         float_fmt[1] = 'f';
  18.         char c = format[i];
  19.         char next_c = get_next_char(i);
  20.         // @Fixme(tkap, 22/12/2024): will fail an assert with "!{2,3}" (sprite in text syntax)
  21.         if(c == '{') {
  22.             if(is_number(next_c)) {
  23.                 i += 1;
  24.                 char n = next_c;
  25.                 next_c = get_next_char(i);
  26.                 if(next_c == 'f') {
  27.                     i += 1;
  28.                     float_fmt[0] = '%';
  29.                     float_fmt[1] = '.';
  30.                     float_fmt[2] = n;
  31.                     float_fmt[3] = 'f';
  32.                     next_c = get_next_char(i);
  33.                 }
  34.                 else {
  35.                     assert(false);
  36.                 }
  37.             }
  38.             if(next_c == '}') {
  39.                 if constexpr(is_same<t0, s32> || is_same<t0, int>) {
  40.                     builder->add("%i", val);
  41.                 }
  42.                 else if constexpr(is_same<t0, b8>) {
  43.                     if(val) {
  44.                         builder->add("true");
  45.                     }
  46.                     else {
  47.                         builder->add("false");
  48.                     }
  49.                 }
  50.                 else if constexpr(is_same<t0, u16>) {
  51.                     builder->add("%u", val);
  52.                 }
  53.                 else if constexpr(is_same<t0, s_len_str>) {
  54.                     if(val.count > 0) {
  55.                         builder->add("%.*s", expand_str(val));
  56.                     }
  57.                 }
  58.                 else if constexpr(is_same<t0, const char*>) {
  59.                     builder->add("%s", val);
  60.                 }
  61.                 else if constexpr(is_same<t0, char*>) {
  62.                     builder->add("%s", val);
  63.                 }
  64.                 else if constexpr(is_same<t0, char>) {
  65.                     builder->add("%c", val);
  66.                 }
  67.                 else if constexpr(is_same<t0, float> || is_same<t0, double>) {
  68.                     builder->add(float_fmt, val);
  69.                 }
  70.                 else if constexpr(is_same<t0, s_v2>) {
  71.                     builder->add("{%f, %f}", val.x, val.y);
  72.                 }
  73.                 else if constexpr(is_same<t0, s_v3>) {
  74.                     builder->add("{%f, %f, %f}", val.x, val.y, val.z);
  75.                 }
  76.                 else if constexpr(is_same<t0, s_v4>) {
  77.                     builder->add("{%f, %f, %f, %f}", val.x, val.y, val.z, val.w);
  78.                 }
  79.                 else if constexpr(is_same<t0, s_v2i>) {
  80.                     builder->add("{%i, %i}", val.x, val.y);
  81.                 }
  82.                 else if constexpr(is_same<t0, s_token>) {
  83.                     builder->add("%.*s", val.str.count, val.str.str);
  84.                 }
  85.                 else {
  86.                     static_assert(!"Parameter type not handled");
  87.                 }
  88.  
  89.                 s_len_str temp_format = str_advance(format, i + 2);
  90.                 if(temp_format.count > 0) {
  91.                     format_text2_(builder, temp_format, args...);
  92.                 }
  93.                 return;
  94.             }
  95.         }
  96.  
  97.         builder->add_char(c);
  98.     }
  99.     #undef get_next_char
  100. }
  101.  
  102. template <typename... targs>
  103. func s_len_str format_text2(char* format, targs... args)
  104. {
  105.     s_len_str result = format_text2_with_arena(&g_string_arena, format, args...);
  106.     return result;
  107. }
  108.  
  109. template <typename... targs>
  110. func s_len_str format_text2_with_arena(s_lin_arena* arena, char* format, targs... args)
  111. {
  112.     la_push(arena);
  113.     typedef s_str_builder<16384> temp;
  114.     temp* builder = (temp*)la_get(arena, sizeof(temp));
  115.     builder->count = 0;
  116.     builder->current_pad = 0;
  117.     builder->num_tabs = 0;
  118.     format_text2_(builder, S(format), args...);
  119.     la_pop(arena);
  120.     (void)la_get(arena, sizeof(s_str_builder<1>) + builder->count);
  121.     s_len_str result = builder->to_len_str_alloc(arena);
  122.     return result;
  123. }
  124.  
  125. template <typename... targs>
  126. func void printf2(char* format, targs... args)
  127. {
  128.     s_len_str str = format_text2(format, args...);
  129.     printf("%.*s", expand_str(str));
  130. }
  131.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement