refactor meta tables
This commit is contained in:
@@ -3,128 +3,120 @@ void mt_app(ma_arena_t *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
|
||||
| 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 |
|
||||
{ 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 }
|
||||
));
|
||||
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");
|
||||
i32 js2_idx = mt_table_find_rowi(keys->first, "js2");
|
||||
i32 filter_out_idx = mt_table_find_rowi(keys->first, "jf");
|
||||
|
||||
|
||||
///////////////////////////////
|
||||
// javascript
|
||||
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, "wasm_key_map_t wasm_map_key_string_to_app_key(s8_t key) {");
|
||||
c->indent += 1;
|
||||
sb8_stmtf(c, "if (0) {}");
|
||||
for (ast_t *row = keys->first->next; row; row = row->next) {
|
||||
s8_t name = mt_table_get_rowi(row, name_idx)->string;
|
||||
i64 filter_out = mt_table_get_rowi(row, filter_out_idx)->integer;
|
||||
assert(filter_out == 0 || filter_out == 1);
|
||||
|
||||
s8_t js[] = {mt_table_get_rowi(row, js1_idx)->string, mt_table_get_rowi(row, js2_idx)->string};
|
||||
for (i32 i = 0; i < lengthof(js); i += 1) {
|
||||
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, "if (0) {}");
|
||||
for (mtt_iter_t it = mtt_iterate(c->arena, keys); mtt_is_valid(it); mtt_advance(&it)) {
|
||||
assert(mtt(it, "jf")->integer == 0 || mtt(it, "jf")->integer == 1);
|
||||
s8_t js[] = {mtts(it, "js1"), mtts(it, "js2")};
|
||||
for (i32 i = 0; i < lengthof(js); i += 1) {
|
||||
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], mtts(it, "name"), (int)mtt(it, "jf")->integer);
|
||||
}
|
||||
}
|
||||
sb8_stmtf(c, "return (wasm_key_map_t){0};");
|
||||
}
|
||||
sb8_stmtf(c, "return (wasm_key_map_t){0};");
|
||||
c->indent -= 1;
|
||||
sb8_stmtf(c, "}");
|
||||
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, "app_key_t w32_map_wparam_to_app_key(WPARAM wparam) {");
|
||||
c->indent += 1;
|
||||
sb8_stmtf(c, "switch(wparam) {");
|
||||
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;
|
||||
s8_t w[] = {mt_table_get_rowi(row, w1i)->string, mt_table_get_rowi(row, w2i)->string};
|
||||
for (i32 i = 0; i < lengthof(w); i += 1) {
|
||||
if (s8_are_equal(w[i], s8_lit("XXX"))) continue;
|
||||
sb8_stmtf(c, "case %S: return app_key_%S; break;", w[i], name);
|
||||
{
|
||||
for (mtt_iter_t it = mtt_iterate(c->arena, keys); mtt_is_valid(it); mtt_advance(&it)) {
|
||||
s8_t w[] = {mtts(it, "windows1"), mtts(it, "windows2")};
|
||||
for (i32 i = 0; i < lengthof(w); i += 1) {
|
||||
if (s8_are_equal(w[i], s8_lit("XXX"))) continue;
|
||||
sb8_stmtf(c, "case %S: return app_key_%S; break;", w[i], mtts(it, "name"));
|
||||
}
|
||||
}
|
||||
}
|
||||
sb8_stmtf(c, "default: {return app_key_null;} break;");
|
||||
@@ -135,6 +127,8 @@ void mt_app(ma_arena_t *arena) {
|
||||
sb8_stmtf(c, "#endif");
|
||||
}
|
||||
|
||||
///////////////////////////////
|
||||
// declaring app structures and generating type info
|
||||
{
|
||||
ast_t *decls = mt_parse_decls(arena, __FILE__, S8_CODE(
|
||||
typedef enum {
|
||||
|
||||
Reference in New Issue
Block a user