new table format, templating mt_printf

This commit is contained in:
Krzosa Karol
2025-01-21 13:44:41 +01:00
parent 4679f0da48
commit 2b4d641857
10 changed files with 151 additions and 130 deletions

View File

@@ -1,5 +1,70 @@
void mt_test_replace(ma_arena_t *arena) {
ast_t *keys = mtt_parse(arena, __FILE__, S8_CODE(
fn ast_t *mt_ast_string(ma_arena_t *arena, s8_t string) {
ast_t *n = mt_create_ast(arena, &lex_null, set_bit(ast_flag_string));
n->string = string;
return n;
}
fn ast_t *mt_kv(ma_arena_t *arena, s8_t key, s8_t value) {
ast_t *n = mt_ast_string(arena, key);
mt_ast_append(n, mt_ast_string(arena, value));
return n;
}
fn s8_t mt_templatize_string(ma_arena_t *arena, s8_t string, lex_array_t tokens, ast_t *n) {
ma_temp_t scratch = ma_begin_scratch1(arena);
sb8_t *sb = sb8_serial_begin(scratch.arena);
parser_t *par = parser_make(arena, tokens.data);
for (i64 i = 0; i < string.len;) {
if (par->at->str != string.str + i) {
sb8_append(sb, s8(string.str + i, 1));
i += 1;
continue;
}
lex_t *token = parser_next(par); i += token->len;
if (token->kind == lex_kind_tag && char_is_alphanumeric(string.str[i])) {
lex_t *ident = parser_expect(par, lex_kind_ident); i += ident->len;
sb8_append(sb, mtt_gets(n, ident->string));
} else {
sb8_append(sb, token->string);
}
}
s8_t result = sb8_serial_end(arena, sb);
ma_end_scratch(scratch);
return result;
}
fn s8_t mt_print(ma_arena_t *arena, ast_t *n, s8_t string) {
ma_temp_t scratch = ma_begin_scratch1(arena);
lex_array_t tokens = lex_tokens(scratch.arena, "mt_print", string);
string = mt_templatize_string(arena, string, tokens, n);
ma_end_scratch(scratch);
return string;
}
fn s8_t mt_printf(ma_arena_t *arena, ast_t *n, char *str, ...) {
ma_temp_t scratch = ma_begin_scratch1(arena);
S8_FMT(scratch.arena, str, string);
s8_t result = mt_print(arena, n, string);
ma_end_scratch(scratch);
return result;
}
fn s8_t mt_sbprintf(sb8_t *sb, char *str, ...) {
assert(sb->user_data);
ma_temp_t scratch = ma_begin_scratch1(sb->arena);
S8_FMT(scratch.arena, str, string);
s8_t result = mt_print(sb->arena, (ast_t *)sb->user_data, string);
sb8_append(sb, result);
ma_end_scratch(scratch);
return result;
}
fn void mt_test_replace(ma_arena_t *arena) {
ast_t *table = mtt_parse(arena, __FILE__, S8_CODE(
// javascript filter out
{ name js1 js2 jf windows1 windows2 }
{ null XXX XXX 1 XXX XXX }
@@ -72,7 +137,12 @@ void mt_test_replace(ma_arena_t *arena) {
{ page_up PageUp XXX 1 VK_INSERT XXX }
{ page_down PageDown XXX 1 VK_PRIOR XXX }
));
sb8_t *sb = sb8_serial_begin(arena);
for (ast_t *it = table->first; it; it = it->next) {
sb->user_data = it;
mt_sbprintf(sb, "@name = @windows1 @windows2\n");
}
debugf("%S", sb8_serial_end(arena, sb));
}
void mt_ui(ma_arena_t *arena) {
@@ -169,7 +239,7 @@ void mt_ui(ma_arena_t *arena) {
///
variables_t vars = serial_vars_from_struct(it, type(mt_ui_stacks_t));
sb8_tmplf(h, "typedef struct node_type node_type; struct node_type { value_type value; node_type *next; };", vars);
sb8_tmplf(h, "typedef struct $node_type $node_type; struct $node_type { value_type value; $node_type *next; };", vars);
////