refactor meta tables

This commit is contained in:
Krzosa Karol
2025-01-21 10:07:18 +01:00
parent f221ccfcf9
commit 4679f0da48
6 changed files with 352 additions and 212 deletions

View File

@@ -3,128 +3,120 @@ void mt_app(ma_arena_t *arena) {
sb8_t *c = sb8_serial_begin(arena); sb8_t *c = sb8_serial_begin(arena);
ast_t *keys = mt_table_parse(arena, __FILE__, S8_CODE( ast_t *keys = mtt_parse(arena, __FILE__, S8_CODE(
// javascript filter out // javascript filter out
| name | js1 | js2 | jf | windows1 | windows2 | { name js1 js2 jf windows1 windows2 }
| null | XXX | XXX | 1 | XXX | XXX | { null XXX XXX 1 XXX XXX }
| 1 | 1 | XXX | 0 | `'1'` | XXX | { 1 1 XXX 0 `'1'` XXX }
| 2 | 2 | XXX | 0 | `'2'` | XXX | { 2 2 XXX 0 `'2'` XXX }
| 3 | 3 | XXX | 0 | `'3'` | XXX | { 3 3 XXX 0 `'3'` XXX }
| 4 | 4 | XXX | 0 | `'4'` | XXX | { 4 4 XXX 0 `'4'` XXX }
| 5 | 5 | XXX | 0 | `'5'` | XXX | { 5 5 XXX 0 `'5'` XXX }
| 6 | 6 | XXX | 0 | `'6'` | XXX | { 6 6 XXX 0 `'6'` XXX }
| 7 | 7 | XXX | 0 | `'7'` | XXX | { 7 7 XXX 0 `'7'` XXX }
| 8 | 8 | XXX | 0 | `'8'` | XXX | { 8 8 XXX 0 `'8'` XXX }
| 9 | 9 | XXX | 0 | `'9'` | XXX | { 9 9 XXX 0 `'9'` XXX }
| 0 | 0 | XXX | 0 | `'0'` | XXX | { 0 0 XXX 0 `'0'` XXX }
| f1 | F1 | XXX | 1 | VK_F1 | XXX | { f1 F1 XXX 1 VK_F1 XXX }
| f2 | F2 | XXX | 1 | VK_F2 | XXX | { f2 F2 XXX 1 VK_F2 XXX }
| f3 | F3 | XXX | 1 | VK_F3 | XXX | { f3 F3 XXX 1 VK_F3 XXX }
| f4 | F4 | XXX | 1 | VK_F4 | XXX | { f4 F4 XXX 1 VK_F4 XXX }
| f5 | F5 | XXX | 1 | VK_F5 | XXX | { f5 F5 XXX 1 VK_F5 XXX }
| f6 | F6 | XXX | 1 | VK_F6 | XXX | { f6 F6 XXX 1 VK_F6 XXX }
| f7 | F7 | XXX | 1 | VK_F7 | XXX | { f7 F7 XXX 1 VK_F7 XXX }
| f8 | F8 | XXX | 1 | VK_F8 | XXX | { f8 F8 XXX 1 VK_F8 XXX }
| f9 | F9 | XXX | 1 | VK_F9 | XXX | { f9 F9 XXX 1 VK_F9 XXX }
| f10 | F10 | XXX | 1 | VK_F10 | XXX | { f10 F10 XXX 1 VK_F10 XXX }
| f11 | F11 | XXX | 1 | VK_F11 | XXX | { f11 F11 XXX 1 VK_F11 XXX }
| f12 | F12 | XXX | 1 | VK_F12 | XXX | { f12 F12 XXX 1 VK_F12 XXX }
| a | a | XXX | 0 | `'A'` | XXX | { a a XXX 0 `'A'` XXX }
| b | b | XXX | 0 | `'B'` | XXX | { b b XXX 0 `'B'` XXX }
| c | c | XXX | 0 | `'C'` | XXX | { c c XXX 0 `'C'` XXX }
| d | d | XXX | 0 | `'D'` | XXX | { d d XXX 0 `'D'` XXX }
| e | e | XXX | 0 | `'E'` | XXX | { e e XXX 0 `'E'` XXX }
| f | f | XXX | 0 | `'F'` | XXX | { f f XXX 0 `'F'` XXX }
| g | g | XXX | 0 | `'G'` | XXX | { g g XXX 0 `'G'` XXX }
| h | h | XXX | 0 | `'H'` | XXX | { h h XXX 0 `'H'` XXX }
| i | i | XXX | 0 | `'I'` | XXX | { i i XXX 0 `'I'` XXX }
| j | j | XXX | 0 | `'J'` | XXX | { j j XXX 0 `'J'` XXX }
| k | k | XXX | 0 | `'K'` | XXX | { k k XXX 0 `'K'` XXX }
| l | l | XXX | 0 | `'L'` | XXX | { l l XXX 0 `'L'` XXX }
| m | m | XXX | 0 | `'M'` | XXX | { m m XXX 0 `'M'` XXX }
| n | n | XXX | 0 | `'N'` | XXX | { n n XXX 0 `'N'` XXX }
| o | o | XXX | 0 | `'O'` | XXX | { o o XXX 0 `'O'` XXX }
| p | p | XXX | 0 | `'P'` | XXX | { p p XXX 0 `'P'` XXX }
| q | q | XXX | 0 | `'Q'` | XXX | { q q XXX 0 `'Q'` XXX }
| r | r | XXX | 0 | `'R'` | XXX | { r r XXX 0 `'R'` XXX }
| s | s | XXX | 0 | `'S'` | XXX | { s s XXX 0 `'S'` XXX }
| _t | t | XXX | 0 | `'T'` | XXX | { _t t XXX 0 `'T'` XXX }
| u | u | XXX | 0 | `'U'` | XXX | { u u XXX 0 `'U'` XXX }
| v | v | XXX | 0 | `'V'` | XXX | { v v XXX 0 `'V'` XXX }
| w | w | XXX | 0 | `'W'` | XXX | { w w XXX 0 `'W'` XXX }
| x | x | XXX | 0 | `'X'` | XXX | { x x XXX 0 `'X'` XXX }
| y | y | XXX | 0 | `'Y'` | XXX | { y y XXX 0 `'Y'` XXX }
| z | z | XXX | 0 | `'Z'` | XXX | { z z XXX 0 `'Z'` XXX }
| space | ` ` | XXX | 0 | VK_SPACE | XXX | { space ` ` XXX 0 VK_SPACE XXX }
| enter | Enter | XXX | 1 | VK_RETURN | XXX | { enter Enter XXX 1 VK_RETURN XXX }
| escape | Escape | XXX | 1 | VK_ESCAPE | XXX | { escape Escape XXX 1 VK_ESCAPE XXX }
| left | ArrowLeft | XXX | 1 | VK_LEFT | XXX | { left ArrowLeft XXX 1 VK_LEFT XXX }
| up | ArrowUp | XXX | 1 | VK_UP | XXX | { up ArrowUp XXX 1 VK_UP XXX }
| right | ArrowRight | XXX | 1 | VK_RIGHT | XXX | { right ArrowRight XXX 1 VK_RIGHT XXX }
| down | ArrowDown | XXX | 1 | VK_DOWN | XXX | { down ArrowDown XXX 1 VK_DOWN XXX }
| tab | Tab | XXX | 1 | VK_TAB | XXX | { tab Tab XXX 1 VK_TAB XXX }
| backspace | Backspace | XXX | 1 | VK_BACK | XXX | { backspace Backspace XXX 1 VK_BACK XXX }
| control | Control | XXX | 1 | VK_CONTROL | XXX | { control Control XXX 1 VK_CONTROL XXX }
| shift | Shift | XXX | 1 | VK_SHIFT | XXX | { shift Shift XXX 1 VK_SHIFT XXX }
| alt | Alt | AltGraph | 1 | VK_LMENU | VK_RMENU | { alt Alt AltGraph 1 VK_LMENU VK_RMENU }
| meta | Meta | XXX | 1 | VK_LWIN | VK_RWIN | { meta Meta XXX 1 VK_LWIN VK_RWIN }
| caps_lock | CapsLock | XXX | 1 | VK_CAPITAL | XXX | { caps_lock CapsLock XXX 1 VK_CAPITAL XXX }
| delete | Delete | XXX | 1 | VK_DELETE | XXX | { delete Delete XXX 1 VK_DELETE XXX }
| home | Home | XXX | 1 | VK_HOME | XXX | { home Home XXX 1 VK_HOME XXX }
| end | End | XXX | 1 | VK_END | XXX | { end End XXX 1 VK_END XXX }
| insert | Insert | XXX | 1 | VK_NEXT | XXX | { insert Insert XXX 1 VK_NEXT XXX }
| page_up | PageUp | XXX | 1 | VK_INSERT | XXX | { page_up PageUp XXX 1 VK_INSERT XXX }
| page_down | PageDown | XXX | 1 | VK_PRIOR | XXX | { page_down PageDown XXX 1 VK_PRIOR XXX }
)); ));
mt_table_serial(c, h, keys, s8_lit("app_key")); mtt_serialb(c, h, keys, s8_lit("app_key"));
// Javascript ///////////////////////////////
// generate mappings
{ {
i32 name_idx = mt_table_find_rowi(keys->first, "name"); ///////////////////////////////
i32 js1_idx = mt_table_find_rowi(keys->first, "js1"); // javascript
i32 js2_idx = mt_table_find_rowi(keys->first, "js2");
i32 filter_out_idx = mt_table_find_rowi(keys->first, "jf");
sb8_stmtf(c, "\n#if PLATFORM_WASM"); sb8_stmtf(c, "\n#if PLATFORM_WASM");
sb8_stmtf(c, "typedef struct { app_key_t key; b32 filter_out; } wasm_key_map_t;"); sb8_stmtf(c, "typedef struct { app_key_t key; b32 filter_out; } wasm_key_map_t;");
sb8_stmtf(c, "wasm_key_map_t wasm_map_key_string_to_app_key(s8_t key) {"); sb8_stmtf(c, "wasm_key_map_t wasm_map_key_string_to_app_key(s8_t key) {");
c->indent += 1; c->indent += 1;
sb8_stmtf(c, "if (0) {}"); {
for (ast_t *row = keys->first->next; row; row = row->next) { sb8_stmtf(c, "if (0) {}");
s8_t name = mt_table_get_rowi(row, name_idx)->string; for (mtt_iter_t it = mtt_iterate(c->arena, keys); mtt_is_valid(it); mtt_advance(&it)) {
i64 filter_out = mt_table_get_rowi(row, filter_out_idx)->integer; assert(mtt(it, "jf")->integer == 0 || mtt(it, "jf")->integer == 1);
assert(filter_out == 0 || filter_out == 1); s8_t js[] = {mtts(it, "js1"), mtts(it, "js2")};
for (i32 i = 0; i < lengthof(js); i += 1) {
s8_t js[] = {mt_table_get_rowi(row, js1_idx)->string, mt_table_get_rowi(row, js2_idx)->string}; if (s8_are_equal(js[i], s8_lit("XXX"))) continue;
for (i32 i = 0; i < lengthof(js); i += 1) { sb8_stmtf(c, "else if (s8_are_equal_ex(key, s8_lit(\"%S\"), s8_ignore_case)) return (wasm_key_map_t){app_key_%S, %d};", js[i], mtts(it, "name"), (int)mtt(it, "jf")->integer);
if (s8_are_equal(js[i], s8_lit("XXX"))) continue; }
sb8_stmtf(c, "else if (s8_are_equal_ex(key, s8_lit(\"%S\"), s8_ignore_case)) return (wasm_key_map_t){app_key_%S, %d};", js[i], name, (i32)filter_out);
} }
sb8_stmtf(c, "return (wasm_key_map_t){0};");
} }
sb8_stmtf(c, "return (wasm_key_map_t){0};");
c->indent -= 1; c->indent -= 1;
sb8_stmtf(c, "}"); sb8_stmtf(c, "}");
sb8_stmtf(c, "#endif"); sb8_stmtf(c, "#endif");
}
// Windows
{
i32 name_idx = mt_table_find_rowi(keys->first, "name");
i32 w1i = mt_table_find_rowi(keys->first, "windows1");
i32 w2i = mt_table_find_rowi(keys->first, "windows2");
///////////////////////////////
// windows
sb8_stmtf(c, "\n#if PLATFORM_WINDOWS"); sb8_stmtf(c, "\n#if PLATFORM_WINDOWS");
sb8_stmtf(c, "app_key_t w32_map_wparam_to_app_key(WPARAM wparam) {"); sb8_stmtf(c, "app_key_t w32_map_wparam_to_app_key(WPARAM wparam) {");
c->indent += 1; c->indent += 1;
sb8_stmtf(c, "switch(wparam) {"); sb8_stmtf(c, "switch(wparam) {");
c->indent += 1; c->indent += 1;
for (ast_t *row = keys->first->next; row; row = row->next) { {
s8_t name = mt_table_get_rowi(row, name_idx)->string; for (mtt_iter_t it = mtt_iterate(c->arena, keys); mtt_is_valid(it); mtt_advance(&it)) {
s8_t w[] = {mt_table_get_rowi(row, w1i)->string, mt_table_get_rowi(row, w2i)->string}; s8_t w[] = {mtts(it, "windows1"), mtts(it, "windows2")};
for (i32 i = 0; i < lengthof(w); i += 1) { for (i32 i = 0; i < lengthof(w); i += 1) {
if (s8_are_equal(w[i], s8_lit("XXX"))) continue; if (s8_are_equal(w[i], s8_lit("XXX"))) continue;
sb8_stmtf(c, "case %S: return app_key_%S; break;", w[i], name); sb8_stmtf(c, "case %S: return app_key_%S; break;", w[i], mtts(it, "name"));
}
} }
} }
sb8_stmtf(c, "default: {return app_key_null;} break;"); sb8_stmtf(c, "default: {return app_key_null;} break;");
@@ -135,6 +127,8 @@ void mt_app(ma_arena_t *arena) {
sb8_stmtf(c, "#endif"); sb8_stmtf(c, "#endif");
} }
///////////////////////////////
// declaring app structures and generating type info
{ {
ast_t *decls = mt_parse_decls(arena, __FILE__, S8_CODE( ast_t *decls = mt_parse_decls(arena, __FILE__, S8_CODE(
typedef enum { typedef enum {

View File

@@ -49,8 +49,8 @@ fn s8_t s8_serial_ast_flag_t(ma_arena_t *arena, ast_flag_t flag) {
return result; return result;
} }
fn ast_t *mt_create_ast(parser_t *par, lex_t *pos, ast_flag_t flags) { fn ast_t *mt_create_ast(ma_arena_t *arena, lex_t *pos, ast_flag_t flags) {
ast_t *result = ma_push_type(par->arena, ast_t); ast_t *result = ma_push_type(arena, ast_t);
memset(result, 0, sizeof(ast_t)); memset(result, 0, sizeof(ast_t));
result->flags = flags; result->flags = flags;
result->pos = pos; result->pos = pos;
@@ -62,8 +62,8 @@ fn void mt_ast_append(ast_t *parent, ast_t *node) {
parent->len += 1; parent->len += 1;
} }
fn ast_t *mt_create_ast_binary(parser_t *par, lex_t *pos, ast_t *left, lex_kind_t op, ast_t *right) { fn ast_t *mt_create_ast_binary(ma_arena_t *arena, lex_t *pos, ast_t *left, lex_kind_t op, ast_t *right) {
ast_t *result = mt_create_ast(par, pos, set_bit(ast_flag_string) | set_bit(ast_flag_binary) | set_bit(ast_flag_integer)); ast_t *result = mt_create_ast(arena, pos, set_bit(ast_flag_string) | set_bit(ast_flag_binary) | set_bit(ast_flag_integer));
mt_ast_append(result, left); mt_ast_append(result, left);
mt_ast_append(result, right); mt_ast_append(result, right);
result->integer = op; result->integer = op;
@@ -75,12 +75,12 @@ fn ast_t *mt_parse_expr(parser_t *par);
fn ast_t *mt_parse_lit_expr(parser_t *par) { fn ast_t *mt_parse_lit_expr(parser_t *par) {
lex_t *token = parser_next(par); lex_t *token = parser_next(par);
if (token->kind == lex_kind_integer) { if (token->kind == lex_kind_integer) {
ast_t *result = mt_create_ast(par, token, set_bit(ast_flag_integer) | set_bit(ast_flag_string)); ast_t *result = mt_create_ast(par->arena, token, set_bit(ast_flag_integer) | set_bit(ast_flag_string));
result->integer = token->integer; result->integer = token->integer;
result->string = token->string; result->string = token->string;
return result; return result;
} else if (token->kind == lex_kind_real) { } else if (token->kind == lex_kind_real) {
ast_t *result = mt_create_ast(par, token, set_bit(ast_flag_real) | set_bit(ast_flag_string)); ast_t *result = mt_create_ast(par->arena, token, set_bit(ast_flag_real) | set_bit(ast_flag_string));
result->real = (double)token->real; result->real = (double)token->real;
result->string = token->string; result->string = token->string;
return result; return result;
@@ -98,7 +98,7 @@ fn ast_t *mt_parse_mul_expr(parser_t *par) {
ast_t *left = mt_parse_lit_expr(par); ast_t *left = mt_parse_lit_expr(par);
while (par->at->kind == lex_kind_multiply || par->at->kind == lex_kind_divide || par->at->kind == lex_kind_modulo) { while (par->at->kind == lex_kind_multiply || par->at->kind == lex_kind_divide || par->at->kind == lex_kind_modulo) {
lex_t *op = parser_next(par); lex_t *op = parser_next(par);
left = mt_create_ast_binary(par, op, left, op->kind, mt_parse_lit_expr(par)); left = mt_create_ast_binary(par->arena, op, left, op->kind, mt_parse_lit_expr(par));
} }
return left; return left;
} }
@@ -107,7 +107,7 @@ fn ast_t *mt_parse_add_expr(parser_t *par) {
ast_t *left = mt_parse_mul_expr(par); ast_t *left = mt_parse_mul_expr(par);
while (par->at->kind == lex_kind_plus || par->at->kind == lex_kind_minus) { while (par->at->kind == lex_kind_plus || par->at->kind == lex_kind_minus) {
lex_t *op = parser_next(par); lex_t *op = parser_next(par);
left = mt_create_ast_binary(par, op, left, op->kind, mt_parse_lit_expr(par)); left = mt_create_ast_binary(par->arena, op, left, op->kind, mt_parse_lit_expr(par));
} }
return left; return left;
} }
@@ -116,7 +116,7 @@ fn ast_t *mt_parse_logical_and_expr(parser_t *par) {
ast_t *left = mt_parse_add_expr(par); ast_t *left = mt_parse_add_expr(par);
while (par->at->kind == lex_kind_or) { while (par->at->kind == lex_kind_or) {
lex_t *op = parser_next(par); lex_t *op = parser_next(par);
left = mt_create_ast_binary(par, op, left, op->kind, mt_parse_lit_expr(par)); left = mt_create_ast_binary(par->arena, op, left, op->kind, mt_parse_lit_expr(par));
} }
return left; return left;
} }
@@ -125,7 +125,7 @@ fn ast_t *parse_logical_or_expr(parser_t *par) {
ast_t *left = mt_parse_logical_and_expr(par); ast_t *left = mt_parse_logical_and_expr(par);
while (par->at->kind == lex_kind_or) { while (par->at->kind == lex_kind_or) {
lex_t *op = parser_next(par); lex_t *op = parser_next(par);
left = mt_create_ast_binary(par, op, left, op->kind, mt_parse_lit_expr(par)); left = mt_create_ast_binary(par->arena, op, left, op->kind, mt_parse_lit_expr(par));
} }
return left; return left;
} }
@@ -193,11 +193,11 @@ fn void run_parser_test() {
fn ast_t *mt_parse_struct_mem(parser_t *par, s8_t *name) { fn ast_t *mt_parse_struct_mem(parser_t *par, s8_t *name) {
lex_t *type_name = parser_expect(par, lex_kind_ident); lex_t *type_name = parser_expect(par, lex_kind_ident);
ast_t *type = mt_create_ast(par, type_name, set_bit(ast_flag_type_name) | set_bit(ast_flag_string)); ast_t *type = mt_create_ast(par->arena, type_name, set_bit(ast_flag_type_name) | set_bit(ast_flag_string));
type->string = type_name->string; type->string = type_name->string;
while (parser_match(par, lex_kind_multiply)) { while (parser_match(par, lex_kind_multiply)) {
ast_t *pointer = mt_create_ast(par, par->at, set_bit(ast_flag_type_pointer) | set_bit(ast_flag_string)); ast_t *pointer = mt_create_ast(par->arena, par->at, set_bit(ast_flag_type_pointer) | set_bit(ast_flag_string));
mt_ast_append(pointer, type); mt_ast_append(pointer, type);
pointer->string = s8_printf(par->arena, "%S*", type->string); pointer->string = s8_printf(par->arena, "%S*", type->string);
type = pointer; type = pointer;
@@ -206,7 +206,7 @@ fn ast_t *mt_parse_struct_mem(parser_t *par, s8_t *name) {
*name = parser_expect(par, lex_kind_ident)->string; *name = parser_expect(par, lex_kind_ident)->string;
while (parser_match(par, lex_kind_open_bracket)) { while (parser_match(par, lex_kind_open_bracket)) {
ast_t *array = mt_create_ast(par, par->at, set_bit(ast_flag_type_array) | set_bit(ast_flag_string)); ast_t *array = mt_create_ast(par->arena, par->at, set_bit(ast_flag_type_array) | set_bit(ast_flag_string));
mt_ast_append(array, type); mt_ast_append(array, type);
lex_t *num = parser_match(par, lex_kind_integer); lex_t *num = parser_match(par, lex_kind_integer);
if (num) { if (num) {
@@ -226,7 +226,7 @@ fn ast_t *mt_parse_struct_mem(parser_t *par, s8_t *name) {
fn ast_t *mt_parse_decls(ma_arena_t *arena, char *file, s8_t code) { fn ast_t *mt_parse_decls(ma_arena_t *arena, char *file, s8_t code) {
lex_array_t tokens = lex_tokens(arena, file, code); lex_array_t tokens = lex_tokens(arena, file, code);
parser_t *par = parser_make(arena, tokens.data); parser_t *par = parser_make(arena, tokens.data);
ast_t *result = mt_create_ast(par, par->at, set_bit(ast_flag_string)); ast_t *result = mt_create_ast(arena, par->at, set_bit(ast_flag_string));
result->string = s8_copy_char(arena, file); result->string = s8_copy_char(arena, file);
for (;par->at->kind != lex_kind_eof;) { for (;par->at->kind != lex_kind_eof;) {
lex_t *pos = par->at; lex_t *pos = par->at;
@@ -235,13 +235,13 @@ fn ast_t *mt_parse_decls(ma_arena_t *arena, char *file, s8_t code) {
b32 is_typedef = !!parser_matchi(par, s8_lit("typedef")); b32 is_typedef = !!parser_matchi(par, s8_lit("typedef"));
if (is_typedef && parser_matchi(par, s8_lit("enum"))) { if (is_typedef && parser_matchi(par, s8_lit("enum"))) {
ast_t *n = mt_create_ast(par, pos, set_bit(ast_flag_string) | set_bit(ast_flag_enum)); ast_t *n = mt_create_ast(arena, pos, set_bit(ast_flag_string) | set_bit(ast_flag_enum));
mt_ast_append(result, n); mt_ast_append(result, n);
parser_expect(par, lex_kind_open_brace); parser_expect(par, lex_kind_open_brace);
while (par->at->kind == lex_kind_ident) { while (par->at->kind == lex_kind_ident) {
lex_t *val = parser_expect(par, lex_kind_ident); lex_t *val = parser_expect(par, lex_kind_ident);
ast_t *mem = mt_create_ast(par, val, set_bit(ast_flag_enum_member) | set_bit(ast_flag_string)); ast_t *mem = mt_create_ast(arena, val, set_bit(ast_flag_enum_member) | set_bit(ast_flag_string));
mem->string = val->string; mem->string = val->string;
mt_ast_append(n, mem); mt_ast_append(n, mem);
@@ -273,13 +273,13 @@ fn ast_t *mt_parse_decls(ma_arena_t *arena, char *file, s8_t code) {
} }
if (parser_matchi(par, s8_lit("struct"))) { if (parser_matchi(par, s8_lit("struct"))) {
ast_t *n = mt_create_ast(par, pos, set_bit(ast_flag_string) | set_bit(ast_flag_struct)); ast_t *n = mt_create_ast(arena, pos, set_bit(ast_flag_string) | set_bit(ast_flag_struct));
mt_ast_append(result, n); mt_ast_append(result, n);
n->string = parser_expect(par, lex_kind_ident)->string; n->string = parser_expect(par, lex_kind_ident)->string;
parser_expect(par, lex_kind_open_brace); parser_expect(par, lex_kind_open_brace);
while (par->at->kind != lex_kind_close_brace) { while (par->at->kind != lex_kind_close_brace) {
ast_t *mem = mt_create_ast(par, par->at, set_bit(ast_flag_struct_member) | set_bit(ast_flag_var) | set_bit(ast_flag_string)); ast_t *mem = mt_create_ast(arena, par->at, set_bit(ast_flag_struct_member) | set_bit(ast_flag_var) | set_bit(ast_flag_string));
mt_ast_append(n, mem); mt_ast_append(n, mem);
ast_t *type = mt_parse_struct_mem(par, &mem->string); ast_t *type = mt_parse_struct_mem(par, &mem->string);

View File

@@ -1,93 +1,130 @@
fn ast_t *mt_table_parse(ma_arena_t *arena, char *file, s8_t code) { fn void mtt__parse_row(parser_t *par, ast_t *parent) {
parser_match(par, lex_kind_open_brace);
while (par->at->kind != lex_kind_eof) {
lex_t *token = par->at;
if (parser_match(par, lex_kind_ident) || parser_match(par, lex_kind_string)) {
ast_t *col = mt_create_ast(par->arena, par->at, set_bit(ast_flag_string));
mt_ast_append(parent, col);
col->string = token->string;
} else if (parser_match(par, lex_kind_integer)) {
ast_t *col = mt_create_ast(par->arena, par->at, set_bit(ast_flag_string) | set_bit(ast_flag_integer));
mt_ast_append(parent, col);
col->string = token->string;
col->integer = token->integer;
} else if (parser_match(par, lex_kind_real)) {
ast_t *col = mt_create_ast(par->arena, par->at, set_bit(ast_flag_string) | set_bit(ast_flag_real));
mt_ast_append(parent, col);
col->string = token->string;
col->real = token->real;
} else if (parser_match(par, lex_kind_close_brace) || parser_match(par, lex_kind_eof)) {
break;
} else {
parser_panicf(par->at, "invalid token: %S", lex_kind_to_s8(par->at->kind));
}
if (parent->next) parent = parent->next;
}
}
fn ast_t *mtt_parse(ma_arena_t *arena, char *file, s8_t code) {
lex_array_t tokens = lex_tokens(arena, file, code); lex_array_t tokens = lex_tokens(arena, file, code);
parser_t *par = parser_make(arena, tokens.data); parser_t *par = parser_make(arena, tokens.data);
ast_t *table = mt_create_ast(par, par->at, 0); ast_t *table = mt_create_ast(arena, par->at, 0);
mtt__parse_row(par, table);
while (par->at->kind != lex_kind_eof) { while (par->at->kind != lex_kind_eof) {
ast_t *row = mt_create_ast(par, par->at, 0); mtt__parse_row(par, table->first);
mt_ast_append(table, row);
while (par->at->kind != lex_kind_eof) {
parser_match(par, lex_kind_bit_or);
lex_t *token = par->at;
if (parser_match(par, lex_kind_ident) || parser_match(par, lex_kind_string)) {
ast_t *col = mt_create_ast(par, par->at, set_bit(ast_flag_string));
mt_ast_append(row, col);
col->string = token->string;
} else if (parser_match(par, lex_kind_integer)) {
ast_t *col = mt_create_ast(par, par->at, set_bit(ast_flag_string) | set_bit(ast_flag_integer));
mt_ast_append(row, col);
col->string = token->string;
col->integer = token->integer;
} else if (parser_match(par, lex_kind_real)) {
ast_t *col = mt_create_ast(par, par->at, set_bit(ast_flag_string) | set_bit(ast_flag_real));
mt_ast_append(row, col);
col->string = token->string;
col->real = token->real;
} else if (parser_match(par, lex_kind_bit_or) || parser_match(par, lex_kind_eof)) {
break;
} else {
parser_panicf(par->at, "invalid token: %S", lex_kind_to_s8(par->at->kind));
}
}
} }
return table; return table;
} }
fn int mt_table_find_rowi(ast_t *row, char *name) { fn ast_t *mtt_find_row(ast_t *table, char *name) {
s8_t s = s8_from_char(name); s8_t name_string = s8_from_char(name);
int i = 0; for (ast_t *it = table->first; it; it = it->next) {
for (ast_t *col = row->first; col; col = col->next) { if (s8_are_equal(it->string, name_string)) return it;
if (s8_are_equal(col->string, s)) { }
return i; return NULL;
} }
typedef struct mtt_iter_t mtt_iter_t;
struct mtt_iter_t {
ma_arena_t *arena;
ast_t **first_row;
ast_t **it;
i32 len;
};
fn mtt_iter_t mtt_iterate(ma_arena_t *arena, ast_t *table) {
mtt_iter_t iter = {arena};
iter.len = table->len;
iter.first_row = ma_push_array(arena, ast_t *, iter.len);
iter.it = ma_push_array(arena, ast_t *, iter.len);
i32 i = 0;
for (ast_t *it = table->first; it; it = it->next) {
iter.it[i] = it->first;
iter.first_row[i] = it;
i += 1; i += 1;
} }
return -1; return iter;
} }
fn ast_t *mt_table_get_rowi(ast_t *row, int idx) { fn s8_t mttsi(mtt_iter_t iter, i32 idx) {
if (idx == -1) return NULL; assert(idx >= 0 && idx < iter.len);
return iter.it[idx]->string;
}
int i = 0; fn ast_t *mtt(mtt_iter_t iter, char *name) {
for (ast_t *col = row->first; col; col = col->next, i+=1) { s8_t name_string = s8_from_char(name);
if (i == idx) return col; for (i32 i = 0; i < iter.len; i += 1) {
if (s8_are_equal(iter.first_row[i]->string, name_string)) return iter.it[i];
} }
return false; return NULL;
} }
fn void mt_table_serial(sb8_t *c, sb8_t *h, ast_t *table, s8_t decl) { fn s8_t mtts(mtt_iter_t iter, char *name) {
int name_idx = mt_table_find_rowi(table->first, "name"); return mtt(iter, name)->string;
int value_idx = mt_table_find_rowi(table->first, "value"); }
fn void mtt_advance(mtt_iter_t *iter) {
for (i32 i = 0; i < iter->len; i += 1) {
iter->it[i] = iter->it[i]->next;
}
}
fn b32 mtt_is_valid(mtt_iter_t iter) {
b32 result = iter.it[0] != NULL;
return result;
}
fn void mtt_serialb(sb8_t *c, sb8_t *h, ast_t *table, s8_t decl) {
s8_t name_t = s8_printf(c->arena, "%S_t", decl); s8_t name_t = s8_printf(c->arena, "%S_t", decl);
///////////////////////////////
// enum typedef
sb8_printf(h, "typedef enum {\n"); sb8_printf(h, "typedef enum {\n");
for (ast_t *row = table->first->next; row; row = row->next) { for (mtt_iter_t it = mtt_iterate(c->arena, table); mtt_is_valid(it); mtt_advance(&it)) {
s8_t name = mt_table_get_rowi(row, name_idx)->string; sb8_printf(h, "%S_%S", decl, mtts(it, "name"));
ast_t *value = mt_table_get_rowi(row, value_idx);
sb8_printf(h, "%S_%S", decl, name);
if (value) sb8_printf(h, " = %S", value->string);
sb8_printf(h, ",\n"); sb8_printf(h, ",\n");
} }
sb8_printf(h, "%S_count,\n", decl); sb8_printf(h, "%S_count,\n", decl);
sb8_printf(h, "} %S;\n", name_t); sb8_printf(h, "} %S;\n", name_t);
///////////////////////////////
// type info
sb8_stmtf(c, "type_t type__%S = { type_kind_enum, s8_const_lit(\"%S\"), sizeof(%S),", name_t, name_t, name_t); sb8_stmtf(c, "type_t type__%S = { type_kind_enum, s8_const_lit(\"%S\"), sizeof(%S),", name_t, name_t, name_t);
c->indent += 1; c->indent += 1;
{
sb8_stmtf(c, ".members = (type_member_t[]){");
c->indent += 1;
{
for (mtt_iter_t it = mtt_iterate(c->arena, table); mtt_is_valid(it); mtt_advance(&it)) {
sb8_stmtf(c, "{.name = s8_const_lit(\"%S_%S\"), .value = %S_%S},", decl, mtts(it, "name"), decl, mtts(it, "name"));
}
}
c->indent -= 1;
sb8_stmtf(c, "},");
sb8_stmtf(c, ".members = (type_member_t[]){"); sb8_stmtf(c, ".count = %d,", mtt_find_row(table, "name")->len);
c->indent += 1;
int item_count = 0;
for (ast_t *row = table->first->next; row; row = row->next) {
s8_t name = mt_table_get_rowi(row, name_idx)->string;
ast_t *value = mt_table_get_rowi(row, value_idx);
sb8_stmtf(c, "{.name = s8_const_lit(\"%S_%S\"), .value = %S_%S},", decl, name, decl, name);
item_count += 1;
} }
c->indent -= 1; c->indent -= 1;
sb8_stmtf(c, "},");
sb8_stmtf(c, ".count = %d,", item_count);
c->indent -= 1;
sb8_stmtf(c, "};"); sb8_stmtf(c, "};");
} }

View File

@@ -1,4 +1,82 @@
void mt_test_replace(ma_arena_t *arena) {
ast_t *keys = mtt_parse(arena, __FILE__, S8_CODE(
// javascript filter out
{ name js1 js2 jf windows1 windows2 }
{ null XXX XXX 1 XXX XXX }
{ 1 1 XXX 0 `'1'` XXX }
{ 2 2 XXX 0 `'2'` XXX }
{ 3 3 XXX 0 `'3'` XXX }
{ 4 4 XXX 0 `'4'` XXX }
{ 5 5 XXX 0 `'5'` XXX }
{ 6 6 XXX 0 `'6'` XXX }
{ 7 7 XXX 0 `'7'` XXX }
{ 8 8 XXX 0 `'8'` XXX }
{ 9 9 XXX 0 `'9'` XXX }
{ 0 0 XXX 0 `'0'` XXX }
{ f1 F1 XXX 1 VK_F1 XXX }
{ f2 F2 XXX 1 VK_F2 XXX }
{ f3 F3 XXX 1 VK_F3 XXX }
{ f4 F4 XXX 1 VK_F4 XXX }
{ f5 F5 XXX 1 VK_F5 XXX }
{ f6 F6 XXX 1 VK_F6 XXX }
{ f7 F7 XXX 1 VK_F7 XXX }
{ f8 F8 XXX 1 VK_F8 XXX }
{ f9 F9 XXX 1 VK_F9 XXX }
{ f10 F10 XXX 1 VK_F10 XXX }
{ f11 F11 XXX 1 VK_F11 XXX }
{ f12 F12 XXX 1 VK_F12 XXX }
{ a a XXX 0 `'A'` XXX }
{ b b XXX 0 `'B'` XXX }
{ c c XXX 0 `'C'` XXX }
{ d d XXX 0 `'D'` XXX }
{ e e XXX 0 `'E'` XXX }
{ f f XXX 0 `'F'` XXX }
{ g g XXX 0 `'G'` XXX }
{ h h XXX 0 `'H'` XXX }
{ i i XXX 0 `'I'` XXX }
{ j j XXX 0 `'J'` XXX }
{ k k XXX 0 `'K'` XXX }
{ l l XXX 0 `'L'` XXX }
{ m m XXX 0 `'M'` XXX }
{ n n XXX 0 `'N'` XXX }
{ o o XXX 0 `'O'` XXX }
{ p p XXX 0 `'P'` XXX }
{ q q XXX 0 `'Q'` XXX }
{ r r XXX 0 `'R'` XXX }
{ s s XXX 0 `'S'` XXX }
{ _t t XXX 0 `'T'` XXX }
{ u u XXX 0 `'U'` XXX }
{ v v XXX 0 `'V'` XXX }
{ w w XXX 0 `'W'` XXX }
{ x x XXX 0 `'X'` XXX }
{ y y XXX 0 `'Y'` XXX }
{ z z XXX 0 `'Z'` XXX }
{ space ` ` XXX 0 VK_SPACE XXX }
{ enter Enter XXX 1 VK_RETURN XXX }
{ escape Escape XXX 1 VK_ESCAPE XXX }
{ left ArrowLeft XXX 1 VK_LEFT XXX }
{ up ArrowUp XXX 1 VK_UP XXX }
{ right ArrowRight XXX 1 VK_RIGHT XXX }
{ down ArrowDown XXX 1 VK_DOWN XXX }
{ tab Tab XXX 1 VK_TAB XXX }
{ backspace Backspace XXX 1 VK_BACK XXX }
{ control Control XXX 1 VK_CONTROL XXX }
{ shift Shift XXX 1 VK_SHIFT XXX }
{ alt Alt AltGraph 1 VK_LMENU VK_RMENU }
{ meta Meta XXX 1 VK_LWIN VK_RWIN }
{ caps_lock CapsLock XXX 1 VK_CAPITAL XXX }
{ delete Delete XXX 1 VK_DELETE XXX }
{ home Home XXX 1 VK_HOME XXX }
{ end End XXX 1 VK_END XXX }
{ insert Insert XXX 1 VK_NEXT XXX }
{ page_up PageUp XXX 1 VK_INSERT XXX }
{ page_down PageDown XXX 1 VK_PRIOR XXX }
));
}
void mt_ui(ma_arena_t *arena) { void mt_ui(ma_arena_t *arena) {
mt_test_replace(arena);
typedef struct mt_ui_stacks_t mt_ui_stacks_t; typedef struct mt_ui_stacks_t mt_ui_stacks_t;
struct mt_ui_stacks_t { struct mt_ui_stacks_t {
s8_t type; s8_t type;
@@ -30,49 +108,72 @@ void mt_ui(ma_arena_t *arena) {
if (!s8_starts_with(it->node, s8_lit("ui_"), false)) it->node = s8_printf(arena, "ui_%S", it->node); if (!s8_starts_with(it->node, s8_lit("ui_"), false)) it->node = s8_printf(arena, "ui_%S", it->node);
} }
sb8_t *h_sb = sb8_serial_begin(arena); sb8_t *h = sb8_serial_begin(arena);
sb8_t *c_sb = sb8_serial_begin(arena); sb8_t *c = sb8_serial_begin(arena);
/////////////////////////////// ///////////////////////////////
// generate types // generate types
for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) { for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) {
for (mt_ui_stacks_t *jt = it - 1; jt >= stacks; jt -= 1) if (s8_are_equal(it->type, jt->type)) goto type_already_gened; for (mt_ui_stacks_t *jt = it - 1; jt >= stacks; jt -= 1) if (s8_are_equal(it->type, jt->type)) goto type_already_gened;
sb8_stmtf(h_sb, "typedef struct %S %S; struct %S { %S value; %S *next; };", it->node, it->node, it->node, it->type, it->node); sb8_stmtf(h, "typedef struct %S %S; struct %S { %S value; %S *next; };", it->node, it->node, it->node, it->type, it->node);
type_already_gened:; type_already_gened:;
} }
sb8_printf(h_sb, "\n"); sb8_printf(h, "\n");
/////////////////////////////// ///////////////////////////////
// generate field embeds // generate field embeds
sb8_stmtf(h_sb, "#define UI_DECL_BOX_MEMBERS \\"); sb8_stmtf(h, "#define UI_DECL_BOX_MEMBERS \\");
for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) { for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) {
if (it->skip_box_member) continue; if (it->skip_box_member) continue;
sb8_stmtf(h_sb, "%S %S;\\", it->type, it->name); sb8_stmtf(h, "%S %S;\\", it->type, it->name);
} }
sb8_printf(h_sb, "\n"); sb8_printf(h, "\n");
sb8_stmtf(h_sb, "#define UI_DECL_STACKS \\"); sb8_stmtf(h, "#define UI_DECL_STACKS \\");
for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) { for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) {
sb8_stmtf(h_sb, "%S *%S;\\", it->node, it->stack); sb8_stmtf(h, "%S *%S;\\", it->node, it->stack);
} }
sb8_printf(h_sb, "\n"); sb8_printf(h, "\n");
/////////////////////////////// ///////////////////////////////
// generate stack functions // generate stack functions
for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) { for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) {
sb8_stmtf(c_sb, "fn void ui_push_%S(%S v) { %S *n = ma_push_type(tcx.temp, %S); n->value = v; SLLS_PUSH(ui->%S, n); }", it->name, it->type, it->node, it->node, it->stack); sb8_stmtf(c, "fn void ui_push_%S(%S v) { %S *n = ma_push_type(tcx.temp, %S); n->value = v; SLLS_PUSH(ui->%S, n); }", it->name, it->type, it->node, it->node, it->stack);
sb8_stmtf(c_sb, "fn void ui_pop_%S(void) { SLLS_POP(ui->%S); }", it->name, it->stack); sb8_stmtf(c, "fn void ui_pop_%S(void) { SLLS_POP(ui->%S); }", it->name, it->stack);
sb8_stmtf(c_sb, "#define ui_set_%S(x) defer_block(ui_push_%S(x), ui_pop_%S())", it->name, it->name, it->name); sb8_stmtf(c, "#define ui_set_%S(x) defer_block(ui_push_%S(x), ui_pop_%S())", it->name, it->name, it->name);
} }
sb8_stmtf(c_sb, "fn void ui_assert_stacks_are_null(void) {"); sb8_stmtf(c, "fn void ui_assert_stacks_are_null(void) {");
for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) { for (mt_ui_stacks_t *it = stacks; it < stacks + lengthof(stacks); it += 1) {
sb8_stmtf(c_sb, "assert(ui->%S == NULL);", it->stack); sb8_stmtf(c, "assert(ui->%S == NULL);", it->stack);
} }
sb8_stmtf(c_sb, "}"); sb8_stmtf(c, "}");
/////////////////////////////// ///////////////////////////////
// write to disk // write to disk
os_write_file(mt_cpath(arena), sb8_serial_end(arena, c_sb)); os_write_file(mt_cpath(arena), sb8_serial_end(arena, c));
os_write_file(mt_hpath(arena), sb8_serial_end(arena, h_sb)); os_write_file(mt_hpath(arena), sb8_serial_end(arena, h));
///////////////////////////////
// idea
#if 0
sb8_t *h = sb8_serial_begin(arena);
sb8_stmtf(h, "typedef struct node_type node_type; struct node_type { value_type value; node_type *next; };");
sb8_serial_end_use_template(arena, h, (variables_t){
{"node_type", node_type_name},
{"value_type", value_type_name},
{0}.
});
///
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_stmtf(h, "typedef struct node_type node_type; struct node_type { value_type value; node_type *next; };", vars);
#endif
} }

View File

@@ -1,17 +1,17 @@
typedef struct cg_tweak_t cg_tweak_t;
struct cg_tweak_t {
cg_tweak_t *next;
type_t *type;
s8_t name;
s8_t value;
s8_t min, max;
};
void mt_wasm_app(ma_arena_t *arena) { void mt_wasm_app(ma_arena_t *arena) {
sb8_t *include_paths = sb8(arena); sb8_t *include_paths = sb8(arena);
sb8_append(include_paths, OS_GetAbsolutePath(&Perm, s8_lit("../src"))); sb8_append(include_paths, OS_GetAbsolutePath(&Perm, s8_lit("../src")));
mt_files_t files = mt_lex_files(arena, s8_lit("../src/wasm_app/main.c"), include_paths); mt_files_t files = mt_lex_files(arena, s8_lit("../src/wasm_app/main.c"), include_paths);
typedef struct cg_tweak_t cg_tweak_t;
struct cg_tweak_t {
cg_tweak_t *next;
type_t *type;
s8_t name;
s8_t value;
s8_t min, max;
};
cg_tweak_t *first_tweak = NULL; cg_tweak_t *first_tweak = NULL;
cg_tweak_t *last_tweak = NULL; cg_tweak_t *last_tweak = NULL;

View File

@@ -1,8 +1,7 @@
[ ] app [ ] app
[ ] ui
[ ] event playback [ ] event playback
[ ] win32 [ ] win32
[ ] sleep [x] sleep
[ ] hot reload / plugins [ ] hot reload / plugins
[ ] tests using yield [ ] tests using yield
[ ] touchpad gestures: https://learn.microsoft.com/en-us/windows/win32/wintouch/windows-touch-gestures-overview [ ] touchpad gestures: https://learn.microsoft.com/en-us/windows/win32/wintouch/windows-touch-gestures-overview
@@ -19,9 +18,18 @@
[ ] revisit api [ ] revisit api
[x] change name, hard to type [x] change name, hard to type
[ ] ui
[ ] text input
[ ] color picker
[ ] slider
[ ] custom image as part of design
[ ] demo with different buttons and controls, headings
[ ] core [ ] core
[x] remove dates and time from core [x] remove dates and time from core
[ ] meta [ ] meta
[ ] prototype something like templates, readable string generation
[x] search for python snippets and execute meta.py script on that file [x] search for python snippets and execute meta.py script on that file
[x] simplify logging!!!! [x] simplify logging!!!!
[x] somehow index properly the meta files and ignore generated files [x] somehow index properly the meta files and ignore generated files