Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- func void format_text2_(s_str_builder<16384>* builder, s_len_str format)
- {
- builder->add("%.*s", expand_str(format));
- }
- template <typename t0, typename... targs>
- func void format_text2_(s_str_builder<16384>* builder, s_len_str format, t0 val, targs... args)
- {
- #define get_next_char(mi) ((mi) < format.count - 1) ? format[mi + 1] : 0;
- assert(format.count > 0);
- for(int i = 0; i < format.count; i += 1) {
- char float_fmt[32] = zero;
- float_fmt[0] = '%';
- float_fmt[1] = 'f';
- char c = format[i];
- char next_c = get_next_char(i);
- // @Fixme(tkap, 22/12/2024): will fail an assert with "!{2,3}" (sprite in text syntax)
- if(c == '{') {
- if(is_number(next_c)) {
- i += 1;
- char n = next_c;
- next_c = get_next_char(i);
- if(next_c == 'f') {
- i += 1;
- float_fmt[0] = '%';
- float_fmt[1] = '.';
- float_fmt[2] = n;
- float_fmt[3] = 'f';
- next_c = get_next_char(i);
- }
- else {
- assert(false);
- }
- }
- if(next_c == '}') {
- if constexpr(is_same<t0, s32> || is_same<t0, int>) {
- builder->add("%i", val);
- }
- else if constexpr(is_same<t0, b8>) {
- if(val) {
- builder->add("true");
- }
- else {
- builder->add("false");
- }
- }
- else if constexpr(is_same<t0, u16>) {
- builder->add("%u", val);
- }
- else if constexpr(is_same<t0, s_len_str>) {
- if(val.count > 0) {
- builder->add("%.*s", expand_str(val));
- }
- }
- else if constexpr(is_same<t0, const char*>) {
- builder->add("%s", val);
- }
- else if constexpr(is_same<t0, char*>) {
- builder->add("%s", val);
- }
- else if constexpr(is_same<t0, char>) {
- builder->add("%c", val);
- }
- else if constexpr(is_same<t0, float> || is_same<t0, double>) {
- builder->add(float_fmt, val);
- }
- else if constexpr(is_same<t0, s_v2>) {
- builder->add("{%f, %f}", val.x, val.y);
- }
- else if constexpr(is_same<t0, s_v3>) {
- builder->add("{%f, %f, %f}", val.x, val.y, val.z);
- }
- else if constexpr(is_same<t0, s_v4>) {
- builder->add("{%f, %f, %f, %f}", val.x, val.y, val.z, val.w);
- }
- else if constexpr(is_same<t0, s_v2i>) {
- builder->add("{%i, %i}", val.x, val.y);
- }
- else if constexpr(is_same<t0, s_token>) {
- builder->add("%.*s", val.str.count, val.str.str);
- }
- else {
- static_assert(!"Parameter type not handled");
- }
- s_len_str temp_format = str_advance(format, i + 2);
- if(temp_format.count > 0) {
- format_text2_(builder, temp_format, args...);
- }
- return;
- }
- }
- builder->add_char(c);
- }
- #undef get_next_char
- }
- template <typename... targs>
- func s_len_str format_text2(char* format, targs... args)
- {
- s_len_str result = format_text2_with_arena(&g_string_arena, format, args...);
- return result;
- }
- template <typename... targs>
- func s_len_str format_text2_with_arena(s_lin_arena* arena, char* format, targs... args)
- {
- la_push(arena);
- typedef s_str_builder<16384> temp;
- temp* builder = (temp*)la_get(arena, sizeof(temp));
- builder->count = 0;
- builder->current_pad = 0;
- builder->num_tabs = 0;
- format_text2_(builder, S(format), args...);
- la_pop(arena);
- (void)la_get(arena, sizeof(s_str_builder<1>) + builder->count);
- s_len_str result = builder->to_len_str_alloc(arena);
- return result;
- }
- template <typename... targs>
- func void printf2(char* format, targs... args)
- {
- s_len_str str = format_text2(format, args...);
- printf("%.*s", expand_str(str));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement