Advertisement
Tkap1

Untitled

Dec 16th, 2024
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.79 KB | None | 0 0
  1. #include <type_traits>
  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 <int N>
  8. // func void format_text2_(s_str_builder<16384>* builder, s_str_builder<N>* in_builder)
  9. // {
  10. //  s_len_str temp = in_builder->to_len_str();
  11. //  builder->add("%.*s", expand_str(temp));
  12. // }
  13.  
  14. template <typename t0, typename... targs>
  15. func void format_text2_(s_str_builder<16384>* builder, s_len_str format, t0 val, targs... args)
  16. {
  17.     #define get_next_char(mi) ((mi) < format.count - 1) ? format[mi + 1] : 0;
  18.  
  19.     for(int i = 0; i < format.count; i += 1) {
  20.         char float_fmt[32] = zero;
  21.         float_fmt[0] = '%';
  22.         float_fmt[1] = 'f';
  23.         char c = format[i];
  24.         char next_c = get_next_char(i);
  25.         if(c == '{') {
  26.             if(is_number(next_c)) {
  27.                 i += 1;
  28.                 char n = next_c;
  29.                 next_c = get_next_char(i);
  30.                 if(next_c == 'f') {
  31.                     i += 1;
  32.                     float_fmt[0] = '%';
  33.                     float_fmt[1] = '.';
  34.                     float_fmt[2] = n;
  35.                     float_fmt[3] = 'f';
  36.                     next_c = get_next_char(i);
  37.                 }
  38.                 else {
  39.                     assert(false);
  40.                 }
  41.             }
  42.             if(next_c == '}') {
  43.                 if constexpr(is_same<t0, s32>) {
  44.                     builder->add("%i", val);
  45.                 }
  46.                 else if constexpr(is_same<t0, s_len_str>) {
  47.                     builder->add("%.*s", expand_str(val));
  48.                 }
  49.                 else if constexpr(is_same<t0, const char*>) {
  50.                     builder->add("%s", val);
  51.                 }
  52.                 else if constexpr(is_same<t0, char*>) {
  53.                     builder->add("%s", val);
  54.                 }
  55.                 else if constexpr(is_same<t0, char>) {
  56.                     builder->add("%c", val);
  57.                 }
  58.                 else if constexpr(is_same<t0, float>) {
  59.                     builder->add(float_fmt, val);
  60.                 }
  61.                 else if constexpr(is_same<t0, s_v2>) {
  62.                     builder->add("%f, %f", val);
  63.                 }
  64.                 else if constexpr(is_same<t0, s_v3>) {
  65.                     builder->add("%f, %f, %f", val);
  66.                 }
  67.                 else if constexpr(is_same<t0, s_v4>) {
  68.                     builder->add("%f, %f, %f, %f", val);
  69.                 }
  70.                 // nocheckin how to handle str_builder since it has an N template argument??
  71.                 else {
  72.                     static_assert(!"Parameter type not handled");
  73.                 }
  74.  
  75.                 s_len_str temp_format = str_advance(format, i + 2);
  76.                 format_text2_(builder, temp_format, args...);
  77.                 return;
  78.             }
  79.         }
  80.  
  81.         builder->add_char(c);
  82.     }
  83.     #undef get_next_char
  84. }
  85.  
  86. template <typename... targs>
  87. func s_len_str format_text2(char* format, targs... args)
  88. {
  89.     la_push(&g_string_arena);
  90.     typedef s_str_builder<16384> temp;
  91.     temp* builder = (temp*)la_get(&g_string_arena, sizeof(temp));
  92.     builder->len = 0;
  93.     builder->current_pad = 0;
  94.     builder->num_tabs = 0;
  95.     format_text2_(builder, S(format), args...);
  96.     la_pop(&g_string_arena);
  97.     return builder->to_len_str_alloc(&g_string_arena);
  98. }
  99.  
  100. template <typename... targs>
  101. func void printf2(char* format, targs... args)
  102. {
  103.     s_len_str str = format_text2(format, args...);
  104.     printf("%.*s\n", expand_str(str));
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement