From 6cd965ffbef79eeb64276b91f34706f9c3014d35 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Tue, 24 Nov 2020 17:36:43 -0800 Subject: [PATCH] Finished first pass of config -> variables --- custom/4coder_config.cpp | 217 ++++++++++++++++++++++------ custom/4coder_config.h | 8 +- custom/generated/command_metadata.h | 2 +- 3 files changed, 179 insertions(+), 48 deletions(-) diff --git a/custom/4coder_config.cpp b/custom/4coder_config.cpp index 245807b1..3e520b6d 100644 --- a/custom/4coder_config.cpp +++ b/custom/4coder_config.cpp @@ -583,6 +583,29 @@ struct Config{ String_Const_u8 data; }; +typedef i32 Config_Layout_Type; +enum{ + ConfigLayoutType_Unset = 0, + ConfigLayoutType_Identifier = 1, + ConfigLayoutType_Integer = 2, + ConfigLayoutType_COUNT = 3, +}; +struct Config_Layout{ + Config_Layout_Type type; + u8 *pos; + union{ + String_Const_u8 identifier; + i32 integer; + }; +}; + +struct Config_Compound_Element{ + Config_Compound_Element *next; + Config_Compound_Element *prev; + + Config_Layout l; + Config_RValue *r; +}; struct Config_Compound{ struct Config_Compound_Element *first; @@ -590,8 +613,153 @@ struct Config_Compound{ i32 count; }; +struct Config_Get_Result{ + b32 success; + Config_RValue_Type type; + u8 *pos; + union{ + b32 boolean; + i32 integer; + u32 uinteger; + String_Const_u8 string; + char character; + Config_Compound *compound; + }; +}; + #endif +function Config_Get_Result +config_var(Config *config, String_Const_u8 var_name, i32 subscript); + +function void +def_var_dump_rvalue(Application_Links *app, Config *config, Variable_Handle dst, String_ID l_value, Config_RValue *r){ + Scratch_Block scratch(app); + + b32 *boolean = 0; + i32 *integer = 0; + String_Const_u8 *string = 0; + Config_Compound *compound = 0; + + Config_Get_Result get_result = {}; + + switch (r->type){ + case ConfigRValueType_LValue: + { + Config_LValue *l = r->lvalue; + if (l != 0){ + get_result = config_var(config, l->identifier, l->index); + if (get_result.success){ + switch (get_result.type){ + case ConfigRValueType_Boolean: + { + boolean = &get_result.boolean; + }break; + + case ConfigRValueType_Integer: + { + integer = &get_result.integer; + }break; + + case ConfigRValueType_String: + { + string = &get_result.string; + }break; + + case ConfigRValueType_Compound: + { + compound = get_result.compound; + }break; + } + } + } + }break; + + case ConfigRValueType_Boolean: + { + boolean = &r->boolean; + }break; + + case ConfigRValueType_Integer: + { + integer = &r->integer; + }break; + + case ConfigRValueType_String: + { + string = &r->string; + }break; + + case ConfigRValueType_Compound: + { + compound = r->compound; + }break; + } + + if (boolean != 0){ + String_ID val = 0; + if (*boolean){ + val = vars_save_string(string_litinit("true")); + } + else{ + val = vars_save_string(string_litinit("false")); + } + vars_new_variable(dst, l_value, val); + } + else if (integer != 0){ + // TODO(allen): signed/unsigned problem + String_ID val = vars_save_string(push_stringf(scratch, "%d", *integer)); + vars_new_variable(dst, l_value, val); + } + else if (string != 0){ + String_ID val = vars_save_string(*string); + vars_new_variable(dst, l_value, val); + } + else if (compound != 0){ + Variable_Handle sub_var = vars_new_variable(dst, l_value); + + i32 implicit_index = 0; + b32 implicit_allowed = true; + + Config_Compound_Element *node = 0; + if (compound != 0){ + node = compound->first; + } + for (; node != 0; + node = node->next, implicit_index += 1){ + String_ID sub_l_value = 0; + + switch (node->l.type){ + case ConfigLayoutType_Unset: + { + if (implicit_allowed){ + sub_l_value = vars_save_string(push_stringf(scratch, "%d", implicit_index)); + } + }break; + + case ConfigLayoutType_Identifier: + { + implicit_allowed = false; + sub_l_value = vars_save_string(node->l.identifier); + }break; + + case ConfigLayoutType_Integer: + { + implicit_allowed = false; + sub_l_value = vars_save_string(push_stringf(scratch, "%d", node->l.integer)); + }break; + } + + if (sub_l_value != 0){ + Config_RValue *r = node->r; + if (r != 0){ + def_var_dump_rvalue(app, config, sub_var, sub_l_value, r); + } + } + } + } +} + function Variable_Handle def_var_from_config(Application_Links *app, Variable_Handle parent, String_Const_u8 key, Config *config){ Variable_Handle result = vars_get_nil(); @@ -619,46 +787,8 @@ def_var_from_config(Application_Links *app, Variable_Handle parent, String_Const if (l_value != 0){ Config_RValue *r = node->r; - if (r != 0){ - switch (r->type){ - case ConfigRValueType_LValue: - { - // TODO(allen): - }break; - - case ConfigRValueType_Boolean: - { - String_ID val = 0; - if (r->boolean){ - val = vars_save_string(string_litinit("true")); - } - else{ - val = vars_save_string(string_litinit("false")); - } - vars_new_variable(var, l_value, val); - }break; - - case ConfigRValueType_Integer: - { - // TODO(allen): signed/unsigned problem - String_Const_u8 string = push_stringf(scratch, "%d", r->integer); - String_ID val = vars_save_string(string); - vars_new_variable(var, l_value, val); - }break; - - case ConfigRValueType_String: - { - String_ID val = vars_save_string(r->string); - vars_new_variable(var, l_value, val); - }break; - - case ConfigRValueType_Compound: - { - Variable_Handle sub_var = vars_new_variable(var, l_value); - - }break; - } + def_var_dump_rvalue(app, config, var, l_value, r); } } } @@ -669,7 +799,7 @@ def_var_from_config(Application_Links *app, Variable_Handle parent, String_Const //////////////////////////////// -// NOTE(allen): Nonsense from the old system +// NOTE(allen): Eval function Config_Assignment* config_lookup_assignment(Config *config, String_Const_u8 var_name, i32 subscript){ @@ -685,9 +815,6 @@ config_lookup_assignment(Config *config, String_Const_u8 var_name, i32 subscript return(assignment); } -function Config_Get_Result -config_var(Config *config, String_Const_u8 var_name, i32 subscript); - function Config_Get_Result config_evaluate_rvalue(Config *config, Config_Assignment *assignment, Config_RValue *r){ Config_Get_Result result = {}; @@ -738,6 +865,10 @@ config_var(Config *config, String_Const_u8 var_name, i32 subscript){ return(result); } + +//////////////////////////////// +// NOTE(allen): Nonsense from the old system + function Config_Get_Result config_compound_member(Config *config, Config_Compound *compound, String_Const_u8 var_name, i32 index){ Config_Get_Result result = {}; diff --git a/custom/4coder_config.h b/custom/4coder_config.h index 2698b954..c09c0dff 100644 --- a/custom/4coder_config.h +++ b/custom/4coder_config.h @@ -88,10 +88,10 @@ struct Config_Integer{ typedef i32 Config_Layout_Type; enum{ - ConfigLayoutType_Unset = 0, - ConfigLayoutType_Identifier = 1, - ConfigLayoutType_Integer = 2, - ConfigLayoutType_COUNT = 3, + ConfigLayoutType_Unset, + ConfigLayoutType_Identifier, + ConfigLayoutType_Integer, + ConfigLayoutType_COUNT, }; struct Config_Layout{ Config_Layout_Type type; diff --git a/custom/generated/command_metadata.h b/custom/generated/command_metadata.h index 550bec6c..8abb116a 100644 --- a/custom/generated/command_metadata.h +++ b/custom/generated/command_metadata.h @@ -372,7 +372,7 @@ static Command_Metadata fcoder_metacmd_table[250] = { { PROC_LINKS(list_all_substring_locations, 0), false, "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 174 }, { PROC_LINKS(list_all_substring_locations_case_insensitive, 0), false, "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "W:\\4ed\\code\\custom\\4coder_search.cpp", 36, 186 }, { PROC_LINKS(load_project, 0), false, "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "W:\\4ed\\code\\custom\\4coder_project_commands.cpp", 46, 867 }, -{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "W:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1667 }, +{ PROC_LINKS(load_theme_current_buffer, 0), false, "load_theme_current_buffer", 25, "Parse the current buffer as a theme file and add the theme to the theme list. If the buffer has a .4coder postfix in it's name, it is removed when the name is saved.", 165, "W:\\4ed\\code\\custom\\4coder_config.cpp", 36, 1797 }, { PROC_LINKS(load_themes_default_folder, 0), false, "load_themes_default_folder", 26, "Loads all the theme files in the default theme folder.", 54, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 533 }, { PROC_LINKS(load_themes_hot_directory, 0), false, "load_themes_hot_directory", 25, "Loads all the theme files in the current hot directory.", 55, "W:\\4ed\\code\\custom\\4coder_default_framework.cpp", 47, 545 }, { PROC_LINKS(make_directory_query, 0), false, "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "W:\\4ed\\code\\custom\\4coder_base_commands.cpp", 43, 1493 },