diff --git a/build_file.c b/build_file.c index 6016bca..a53a68b 100644 --- a/build_file.c +++ b/build_file.c @@ -18,14 +18,12 @@ int main(int argc, char **argv) { int ok = 0; ma_arena_t *arena = ma_create(ma_default_reserve_size); - if (cache_code_modified(s8_lit("../src/core/core_math_gen.py"), s8_null)) { os_set_working_dir("../src/core"); os_systemf("py core_math_gen.py"); os_set_working_dir("../../build"); } - - meta_app(arena); + mt_app(arena); mt_wasm_app(arena); b32 run_server = false; diff --git a/src/app/app.meta.c b/src/app/app.meta.c index af5752c..979f58c 100644 --- a/src/app/app.meta.c +++ b/src/app/app.meta.c @@ -1,4 +1,4 @@ -void meta_app(ma_arena_t *arena) { +void mt_app(ma_arena_t *arena) { sb8_t *h = sb8_serial_begin(arena); sb8_t *c = sb8_serial_begin(arena); diff --git a/src/core/core_lexer.c b/src/core/core_lexer.c index 0d13366..674fc33 100644 --- a/src/core/core_lexer.c +++ b/src/core/core_lexer.c @@ -326,17 +326,22 @@ fn void lex_token_ex(lexer_t *lex, lex_t *token) { token->len = (i32)(lex->at - token->str); - if (token->kind == lex_kind_integer || token->kind == lex_kind_real) { + if (token->kind == lex_kind_integer) { + s8_t string_to_lex = token->string; if (token->suffix != lex_suffix_none) { s8_t string_value = ti_enum_value_to_name(token->suffix, type(lex_suffix_t)); s8_t prefix = s8_lit("lex_suffix_"); - token->len -= string_value.len - prefix.len; + string_to_lex.len -= string_value.len - prefix.len; } - } - if (token->kind == lex_kind_integer) { - token->integer = u64_from_s8(token->string, 10); + token->integer = u64_from_s8(string_to_lex, 10); } else if (token->kind == lex_kind_real) { - token->real = f64_from_s8(token->string); + s8_t string_to_lex = token->string; + if (token->suffix != lex_suffix_none) { + s8_t string_value = ti_enum_value_to_name(token->suffix, type(lex_suffix_t)); + s8_t prefix = s8_lit("lex_suffix_"); + string_to_lex.len -= string_value.len - prefix.len; + } + token->real = f64_from_s8(string_to_lex); } else if (token->kind == lex_kind_string) { token->str += 1; token->len -= 2; diff --git a/src/core/core_type_info.h b/src/core/core_type_info.h index b325cbc..db60d6f 100644 --- a/src/core/core_type_info.h +++ b/src/core/core_type_info.h @@ -50,6 +50,17 @@ struct type_member_t { b8 dont_serialize; }; +typedef struct mt_tweak_t mt_tweak_t; +struct mt_tweak_t { + type_t *type; + s8_t name; + void *ptr; + f32 min, max; +}; +#define mt_embed_file(name, path) +#define mt_tweak_f32(name, default, min, max) +#define mt_tweak_b32(name, default) + // // serialization to string #define ti_deserial_data(ARENA, DATA, TYPE) (TYPE *)ti__deserial_data(ARENA, DATA, type(TYPE)) diff --git a/src/wasm_app/main.c b/src/wasm_app/main.c index 39a6799..41c7a8e 100644 --- a/src/wasm_app/main.c +++ b/src/wasm_app/main.c @@ -24,18 +24,19 @@ // #include "render/backup_font.c" #include "render/font.c" #include "render/render_opengl.c" + #include "wasm_app.gen.c" #include "ui_iter.c" #include "ui.c" -#define mt_embed_file(variable, path) - fn void app_init(f32 dpr) { ma_arena_t *perm = &tcx._perm; mt_embed_file(font_liberation_mono, "package/liberation-mono.ttf"); rn_init(perm, s8_array(font_liberation_mono), 50 * dpr); ui_demo_init(perm); + mt_tweak_b32(memes, true); + mt_tweak_f32(scrollasdasd, 32.0f, 0, 100.f); } fn b32 app_update(app_frame_t *frame) { diff --git a/src/wasm_app/wasm_app.gen.c b/src/wasm_app/wasm_app.gen.c index bfebd2c..10edba3 100644 --- a/src/wasm_app/wasm_app.gen.c +++ b/src/wasm_app/wasm_app.gen.c @@ -1691,3 +1691,10 @@ u8 font_liberation_mono[] = { 255,255,0,3,0,1,0,0,0,14,0,0,0,24,0,32,0,0,0,2,0,1,0,1,2,160,0,1,0,4,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,201,137,111,49,0,0,0,0,189,118,137,36, 0,0,0,0,202,159,29,99, }; +gb b32 memes = true; +gb f32 scrollasdasd = 32.0f; +mt_tweak_t tweak_table[] = { +{type(b32), s8_const_lit("memes"), &memes, 0, 0}, +{type(f32), s8_const_lit("scrollasdasd"), &scrollasdasd, 0, 100.f}, + +}; diff --git a/src/wasm_app/wasm_app.meta.c b/src/wasm_app/wasm_app.meta.c index a8a70fe..7004b77 100644 --- a/src/wasm_app/wasm_app.meta.c +++ b/src/wasm_app/wasm_app.meta.c @@ -1,12 +1,26 @@ +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) { sb8_t *include_paths = sb8(arena); sb8_append(include_paths, OS_GetAbsolutePath(&Perm, s8_lit("../src"))); cg_files_t files = cg_lex_files(arena, s8_lit("../src/wasm_app/main.c"), include_paths); + cg_tweak_t *first_tweak = NULL; + cg_tweak_t *last_tweak = NULL; + sb8_t *sb_embeds = sb8_serial_begin(arena); for (cg_file_t *it = files.first; it; it = it->next) { parser_t *par = parser_make(arena, it->tokens.data); for (;par->at->kind != lex_kind_eof;) { + b32 matched = false; + if (par->at->inside_macro == false && parser_matchi(par, s8_lit("mt_embed_file"))) { parser_expect(par, lex_kind_open_paren); lex_t *var_name = parser_expect(par, lex_kind_ident); @@ -16,11 +30,52 @@ void mt_wasm_app(ma_arena_t *arena) { s8_t relpath = s8_printf(arena, "../%S", path->string); s8_t content = OS_ReadFile(&Perm, relpath); cg_byte_array_from_data_ex(sb_embeds, content, var_name->string); - } else { + matched = true; + } + + if (par->at->inside_macro == false && parser_matchi(par, s8_lit("mt_tweak_b32"))) { + cg_tweak_t *tweak = ma_push_type(arena, cg_tweak_t); + tweak->type = type(b32); + tweak->min = tweak->max = s8_lit("0"); + parser_expect(par, lex_kind_open_paren); + tweak->name = parser_expect(par, lex_kind_ident)->string; + parser_expect(par, lex_kind_comma); + tweak->value = parser_next(par)->string; + parser_expect(par, lex_kind_close_paren); + SLLQ_APPEND(first_tweak, last_tweak, tweak); + } + + if (par->at->inside_macro == false && parser_matchi(par, s8_lit("mt_tweak_f32"))) { + cg_tweak_t *tweak = ma_push_type(arena, cg_tweak_t); + tweak->type = type(f32); + parser_expect(par, lex_kind_open_paren); + tweak->name = parser_expect(par, lex_kind_ident)->string; + parser_expect(par, lex_kind_comma); + tweak->value = parser_next(par)->string; + parser_expect(par, lex_kind_comma); + tweak->min = parser_next(par)->string; + parser_expect(par, lex_kind_comma); + tweak->max = parser_next(par)->string; + parser_expect(par, lex_kind_close_paren); + SLLQ_APPEND(first_tweak, last_tweak, tweak); + } + + if (!matched) { parser_next(par); } } } + + for (cg_tweak_t *it = first_tweak; it; it = it->next) { + sb8_printf(sb_embeds, "gb %S %S = %S;\n", it->type->name, it->name, it->value); + } + sb8_printf(sb_embeds, "mt_tweak_t tweak_table[] = {\n"); + for (cg_tweak_t *it = first_tweak; it; it = it->next) { + sb8_printf(sb_embeds, "{type(%S), s8_const_lit(\"%S\"), &%S, %S, %S},\n", it->type->name, it->name, it->name, it->min, it->max); + } + sb8_printf(sb_embeds, "\n};\n"); + + s8_t embeds = sb8_serial_end(arena, sb_embeds); os_write_file(cg_cpath(arena), embeds); } \ No newline at end of file