diff --git a/4coder_config.cpp b/4coder_config.cpp index 929622db..55aaa488 100644 --- a/4coder_config.cpp +++ b/4coder_config.cpp @@ -63,10 +63,10 @@ config_parser__advance_to_next(Config_Parser *ctx){ } static Config_Parser -make_config_parser(Partition *arena, char *file_name, String data, Cpp_Token_Array array){ +make_config_parser(Partition *arena, String file_name, String data, Cpp_Token_Array array){ Config_Parser ctx = {0}; ctx.start = array.tokens; - ctx.token = ctx.start; + ctx.token = ctx.start - 1; ctx.end = ctx.start + array.count; ctx.file_name = file_name; ctx.data = data; @@ -96,10 +96,19 @@ config_parser__get_lexeme(Config_Parser *ctx){ return(lexeme); } -static int32_t -config_parser__get_integer(Config_Parser *ctx){ +static Config_Integer +config_parser__get_int(Config_Parser *ctx){ + Config_Integer config_integer = {0}; String str = config_parser__get_lexeme(ctx); - return(str_to_int(str)); + if (match(substr(str, 0, 2), "0x")){ + config_integer.is_signed = false; + config_integer.uinteger = hexstr_to_int(substr_tail(str, 2)); + } + else{ + config_integer.is_signed = true; + config_integer.integer = str_to_int(str); + } + return(config_integer); } static bool32 @@ -145,7 +154,7 @@ static Config_Compound *config_parser__compound(Config_Parser *ctx); static Config_Compound_Element *config_parser__element(Config_Parser *ctx); static Config* -config_parse(Partition *arena, char *file_name, String data, Cpp_Token_Array array){ +text_data_and_token_array_to_parse_data(Partition *arena, String file_name, String data, Cpp_Token_Array array){ Temp_Memory restore_point = begin_temp_memory(arena); Config_Parser ctx = make_config_parser(arena, file_name, data, array); Config *config = config_parser__config(&ctx); @@ -170,6 +179,7 @@ config_parser__config(Config_Parser *ctx){ } Config *config = push_array(ctx->arena, Config, 1); + memset(config, 0, sizeof(*config)); config->version = version; config->first = first; config->last = last; @@ -182,11 +192,11 @@ config_parser__version(Config_Parser *ctx){ require(config_parser__match_text(ctx, make_lit_string("version"))); require(config_parser__match_token(ctx, CPP_TOKEN_PARENTHESE_OPEN)); require(config_parser__recognize_token(ctx, CPP_TOKEN_INTEGER_CONSTANT)); - int32_t value = config_parser__get_integer(ctx); + Config_Integer value = config_parser__get_int(ctx); config_parser__advance_to_next(ctx); require(config_parser__match_token(ctx, CPP_TOKEN_PARENTHESE_CLOSE)); int32_t *ptr = push_array(ctx->arena, int32_t, 1); - *ptr = value; + *ptr = value.integer; return(ptr); } @@ -200,6 +210,7 @@ config_parser__assignment(Config_Parser *ctx){ require(config_parser__match_token(ctx, CPP_TOKEN_SEMICOLON)); Config_Assignment *assignment = push_array(ctx->arena, Config_Assignment, 1); + memset(assignment, 0, sizeof(*assignment)); assignment->l = l; assignment->r = r; return(assignment); @@ -214,12 +225,14 @@ config_parser__lvalue(Config_Parser *ctx){ int32_t index = 0; if (config_parser__match_token(ctx, CPP_TOKEN_BRACKET_OPEN)){ require(config_parser__recognize_token(ctx, CPP_TOKEN_INTEGER_CONSTANT)); - index = config_parser__get_integer(ctx); + Config_Integer value = config_parser__get_int(ctx); + index = value.integer; config_parser__advance_to_next(ctx); require(config_parser__match_token(ctx, CPP_TOKEN_BRACKET_CLOSE)); } Config_LValue *lvalue = push_array(ctx->arena, Config_LValue, 1); + memset(lvalue, 0, sizeof(*lvalue)); lvalue->identifier = identifier; lvalue->index = index; return(lvalue); @@ -231,6 +244,7 @@ config_parser__rvalue(Config_Parser *ctx){ Config_LValue *l = config_parser__lvalue(ctx); require(l != 0); Config_RValue *rvalue = push_array(ctx->arena, Config_RValue, 1); + memset(rvalue, 0, sizeof(*rvalue)); rvalue->type = ConfigRValueType_LValue; rvalue->lvalue = l; return(rvalue); @@ -240,6 +254,7 @@ config_parser__rvalue(Config_Parser *ctx){ Config_Compound *compound = config_parser__compound(ctx); require(compound != 0); Config_RValue *rvalue = push_array(ctx->arena, Config_RValue, 1); + memset(rvalue, 0, sizeof(*rvalue)); rvalue->type = ConfigRValueType_Compound; rvalue->compound = compound; return(rvalue); @@ -248,16 +263,23 @@ config_parser__rvalue(Config_Parser *ctx){ bool32 b = config_parser__get_boolean(ctx); config_parser__advance_to_next(ctx); Config_RValue *rvalue = push_array(ctx->arena, Config_RValue, 1); + memset(rvalue, 0, sizeof(*rvalue)); rvalue->type = ConfigRValueType_Boolean; rvalue->boolean = b; return(rvalue); } else if (config_parser__recognize_token(ctx, CPP_TOKEN_INTEGER_CONSTANT)){ - int32_t v = config_parser__get_integer(ctx); + Config_Integer value = config_parser__get_int(ctx); config_parser__advance_to_next(ctx); Config_RValue *rvalue = push_array(ctx->arena, Config_RValue, 1); + memset(rvalue, 0, sizeof(*rvalue)); rvalue->type = ConfigRValueType_Integer; - rvalue->integer = v; + if (value.is_signed){ + rvalue->integer = value.integer; +} + else{ + rvalue->uinteger = value.uinteger; + } return(rvalue); } else if (config_parser__recognize_token(ctx, CPP_TOKEN_STRING_CONSTANT)){ @@ -268,6 +290,7 @@ config_parser__rvalue(Config_Parser *ctx){ s = substr(s, 1, s.size - 2); string_interpret_escapes(s, space); Config_RValue *rvalue = push_array(ctx->arena, Config_RValue, 1); + memset(rvalue, 0, sizeof(*rvalue)); rvalue->type = ConfigRValueType_String; rvalue->string = make_string_slowly(space); return(rvalue); @@ -280,6 +303,7 @@ config_parser__rvalue(Config_Parser *ctx){ s = substr(s, 1, s.size - 2); string_interpret_escapes(s, space); Config_RValue *rvalue = push_array(ctx->arena, Config_RValue, 1); + memset(rvalue, 0, sizeof(*rvalue)); rvalue->type = ConfigRValueType_Character; rvalue->character = space[0]; return(rvalue); @@ -311,6 +335,7 @@ config_parser__compound(Config_Parser *ctx){ require(config_parser__match_token(ctx, CPP_TOKEN_BRACE_CLOSE)); Config_Compound *compound = push_array(ctx->arena, Config_Compound, 1); + memset(compound, 0, sizeof(*compound)); compound->first = first; compound->last = last; compound->count = count; @@ -321,14 +346,15 @@ static Config_Compound_Element* config_parser__element(Config_Parser *ctx){ Config_Layout layout = {0}; if (config_parser__match_token(ctx, CPP_TOKEN_DOT)){ - if (config_parser__recognize_token(ctx, CPP_TOKEN_INTEGER_CONSTANT)){ + if (config_parser__recognize_token(ctx, CPP_TOKEN_IDENTIFIER)){ layout.type = ConfigLayoutType_Identifier; layout.identifier = config_parser__get_lexeme(ctx); config_parser__advance_to_next(ctx); } - else if (config_parser__recognize_token(ctx, CPP_TOKEN_IDENTIFIER)){ + else if (config_parser__recognize_token(ctx, CPP_TOKEN_INTEGER_CONSTANT)){ layout.type = ConfigLayoutType_Integer; - layout.integer = config_parser__get_integer(ctx); + Config_Integer value = config_parser__get_int(ctx); + layout.integer = value.integer; config_parser__advance_to_next(ctx); } else{ @@ -337,8 +363,9 @@ config_parser__element(Config_Parser *ctx){ require(config_parser__match_token(ctx, CPP_TOKEN_EQ)); } Config_RValue *rvalue = config_parser__rvalue(ctx); - require(rvalue); + require(rvalue != 0); Config_Compound_Element *element = push_array(ctx->arena, Config_Compound_Element, 1); + memset(element, 0, sizeof(*element)); element->l = layout; element->r = rvalue; return(element); @@ -347,7 +374,7 @@ config_parser__element(Config_Parser *ctx){ //////////////////////////////// static Config_Assignment* -config_lookup_assignment(Config *config, char *var_name, int32_t subscript){ +config_lookup_assignment(Config *config, String var_name, int32_t subscript){ Config_Assignment *assignment; for (assignment = config->first; assignment != 0; @@ -361,81 +388,235 @@ config_lookup_assignment(Config *config, char *var_name, int32_t subscript){ } static bool32 -config_var(Config *config, char *var_name, int32_t subscript, Config_RValue_Type type, void *out){ +config_var(Config *config, String var_name, int32_t subscript, Config_RValue_Type type, void *out); + +static bool32 +config_evaluate_rvalue(Config *config, Config_Assignment *assignment, Config_RValue *r, + Config_RValue_Type type, void *out){ + bool32 success = false; + if (r != 0 && !assignment->visited){ + if (r->type == ConfigRValueType_LValue){ + assignment->visited = true; + Config_LValue *l = r->lvalue; + success = config_var(config, l->identifier, l->index, type, out); + assignment->visited = false; + } + else if (r->type == type){ + success = true; + switch (type){ + case ConfigRValueType_Boolean: + { + *(bool32*)out = r->boolean; + }break; + + case ConfigRValueType_Integer: + { + *(int32_t*)out = r->integer; + }break; + + case ConfigRValueType_String: + { + *(String*)out = r->string; + }break; + + case ConfigRValueType_Character: + { + *(char*)out = r->character; + }break; + + case ConfigRValueType_Compound: + { + *(Config_Compound**)out = r->compound; + }break; + } + } +} + return(success); +} + +static bool32 +config_var(Config *config, String var_name, int32_t subscript, Config_RValue_Type type, void *var_out){ Config_Assignment *assignment = config_lookup_assignment(config, var_name, subscript); bool32 success = false; if (assignment != 0){ - Config_RValue *r = assignment->r; - if (r != 0 && !assignment->visited){ - if (r->type == ConfigRValueType_LValue){ - assignment->visited = true; - success = config_var(config, var_name, subscript, type, out); - assignment->visited = false; - } - else if (r->type == type){ - success = true; - switch (type){ - case ConfigRValueType_Boolean: - { - *(bool32*)out = r->boolean; - }break; - - case ConfigRValueType_Integer: - { - *(int32_t*)out = r->integer; - }break; - - case ConfigRValueType_String: - { - *(String*)out = r->string; - }break; - - case ConfigRValueType_Character: - { - *(char*)out = r->character; - }break; - - case ConfigRValueType_Compound: - { - *(Config_Compound**)out = r->compound; - }break; + success = config_evaluate_rvalue(config, assignment, assignment->r, type, var_out); + } + return(success); +} + +static bool32 +config_bool_var(Config *config, String var_name, int32_t subscript, bool32 *var_out){ + return(config_var(config, var_name, subscript, ConfigRValueType_Boolean, var_out)); +} + +static bool32 +config_bool_var(Config *config, char *var_name, int32_t subscript, bool32 *var_out){ + return(config_var(config, make_string_slowly(var_name), subscript, ConfigRValueType_Boolean, var_out)); +} + +static bool32 +config_int_var(Config *config, String var_name, int32_t subscript, int32_t *var_out){ + return(config_var(config, var_name, subscript, ConfigRValueType_Integer, var_out)); +} + +static bool32 +config_int_var(Config *config, char *var_name, int32_t subscript, int32_t *var_out){ + return(config_var(config, make_string_slowly(var_name), subscript, ConfigRValueType_Integer, var_out)); +} + +static bool32 +config_uint_var(Config *config, String var_name, int32_t subscript, uint32_t *var_out){ + return(config_var(config, var_name, subscript, ConfigRValueType_Integer, var_out)); +} + +static bool32 +config_uint_var(Config *config, char *var_name, int32_t subscript, uint32_t *var_out){ + return(config_var(config, make_string_slowly(var_name), subscript, ConfigRValueType_Integer, var_out)); +} + +static bool32 +config_string_var(Config *config, String var_name, int32_t subscript, String *var_out){ + return(config_var(config, var_name, subscript, ConfigRValueType_String, var_out)); +} + +static bool32 +config_string_var(Config *config, char *var_name, int32_t subscript, String *var_out){ + return(config_var(config, make_string_slowly(var_name), subscript, ConfigRValueType_String, var_out)); +} + +static bool32 +config_char_var(Config *config, String var_name, int32_t subscript, char *var_out){ + return(config_var(config, var_name, subscript, ConfigRValueType_Character, var_out)); +} + +static bool32 +config_char_var(Config *config, char *var_name, int32_t subscript, char *var_out){ + return(config_var(config, make_string_slowly(var_name), subscript, ConfigRValueType_Character, var_out)); +} + +static bool32 +config_compound_var(Config *config, String var_name, int32_t subscript, Config_Compound **var_out){ + return(config_var(config, var_name, subscript, ConfigRValueType_Compound, var_out)); +} + +static bool32 +config_compound_var(Config *config, char *var_name, int32_t subscript, Config_Compound **var_out){ + return(config_var(config, make_string_slowly(var_name), subscript, ConfigRValueType_Compound, var_out)); +} + +static bool32 +config_compound_member(Config *config, Config_Compound *compound, String var_name, int32_t index, + Config_RValue_Type type, void *var_out){ + bool32 success = false; + int32_t implicit_index = 0; + bool32 implicit_index_is_valid = true; + for (Config_Compound_Element *element = compound->first; + element != 0; + element = element->next, implicit_index += 1){ + bool32 element_matches_query = false; + switch (element->l.type){ + case ConfigLayoutType_Unset: + { + if (implicit_index_is_valid && index == implicit_index){ + element_matches_query = true; } - } + }break; + + case ConfigLayoutType_Identifier: + { + implicit_index_is_valid = false; + if (match(element->l.identifier, var_name)){ + element_matches_query = true; + } + }break; + + case ConfigLayoutType_Integer: + { + implicit_index_is_valid = false; + if (element->l.integer == index){ + element_matches_query = true; + } + }break; + } + if (element_matches_query){ + Config_Assignment dummy_assignment = {0}; + success = config_evaluate_rvalue(config, &dummy_assignment, element->r, type, var_out); } } return(success); } static bool32 -config_bool_var(Config *config, char *var_name, int32_t subscript, bool32 *var_out){ - return(config_var(config, var_name, subscript, ConfigRValueType_Boolean, var_out)); +config_compound_bool_member(Config *config, Config_Compound *compound, + String var_name, int32_t index, bool32 *var_out){ + return(config_compound_member(config, compound, var_name, index, ConfigRValueType_Boolean, var_out)); } static bool32 -config_int_var(Config *config, char *var_name, int32_t subscript, int32_t *var_out){ - return(config_var(config, var_name, subscript, ConfigRValueType_Integer, var_out)); +config_compound_bool_member(Config *config, Config_Compound *compound, + char *var_name, int32_t index, bool32 *var_out){ + return(config_compound_member(config, compound, make_string_slowly(var_name), index, ConfigRValueType_Boolean, var_out)); } static bool32 -config_uint_var(Config *config, char *var_name, int32_t subscript, uint32_t *var_out){ - return(config_var(config, var_name, subscript, ConfigRValueType_Integer, var_out)); +config_compound_int_member(Config *config, Config_Compound *compound, + String var_name, int32_t index, int32_t *var_out){ + return(config_compound_member(config, compound, var_name, index, ConfigRValueType_Integer, var_out)); } static bool32 -config_string_var(Config *config, char *var_name, int32_t subscript, String *var_out){ - return(config_var(config, var_name, subscript, ConfigRValueType_String, var_out)); +config_compound_int_member(Config *config, Config_Compound *compound, + char *var_name, int32_t index, int32_t *var_out){ + return(config_compound_member(config, compound, make_string_slowly(var_name), index, ConfigRValueType_Integer, var_out)); } static bool32 -config_char_var(Config *config, char *var_name, int32_t subscript, char *var_out){ - return(config_var(config, var_name, subscript, ConfigRValueType_Character, var_out)); +config_compound_uint_member(Config *config, Config_Compound *compound, + String var_name, int32_t index, uint32_t *var_out){ + return(config_compound_member(config, compound, var_name, index, ConfigRValueType_Integer, var_out)); } static bool32 -config_compound_var(Config *config, char *var_name, int32_t subscript, Config_Compound **var_out){ - return(config_var(config, var_name, subscript, ConfigRValueType_Compound, var_out)); +config_compound_uint_member(Config *config, Config_Compound *compound, + char *var_name, int32_t index, uint32_t *var_out){ + return(config_compound_member(config, compound, make_string_slowly(var_name), index, ConfigRValueType_Integer, var_out)); } +static bool32 +config_compound_string_member(Config *config, Config_Compound *compound, + String var_name, int32_t index, String *var_out){ + return(config_compound_member(config, compound, var_name, index, ConfigRValueType_String, var_out)); +} + +static bool32 +config_compound_string_member(Config *config, Config_Compound *compound, + char *var_name, int32_t index, String *var_out){ + return(config_compound_member(config, compound, make_string_slowly(var_name), index, ConfigRValueType_String, var_out)); +} + +static bool32 +config_compound_char_member(Config *config, Config_Compound *compound, + String var_name, int32_t index, char *var_out){ + return(config_compound_member(config, compound, var_name, index, ConfigRValueType_Character, var_out)); +} + +static bool32 +config_compound_char_member(Config *config, Config_Compound *compound, + char *var_name, int32_t index, char *var_out){ + return(config_compound_member(config, compound, make_string_slowly(var_name), index, ConfigRValueType_Character, var_out)); +} + +static bool32 +config_compound_compound_member(Config *config, Config_Compound *compound, + String var_name, int32_t index, Config_Compound **var_out){ + return(config_compound_member(config, compound, var_name, index, ConfigRValueType_Compound, var_out)); +} + +static bool32 +config_compound_compound_member(Config *config, Config_Compound *compound, + char *var_name, int32_t index, Config_Compound **var_out){ + return(config_compound_member(config, compound, make_string_slowly(var_name), index, ConfigRValueType_Compound, var_out)); +} //////////////////////////////// @@ -757,6 +938,48 @@ change_mapping(Application_Links *app, String mapping){ //////////////////////////////// +static Cpp_Token_Array +text_data_to_token_array(Partition *arena, String data){ + bool32 success = false; + int32_t max_count = (1 << 20)/sizeof(Cpp_Token); + Temp_Memory restore_point = begin_temp_memory(arena); + Cpp_Token_Array array = {0}; + array.tokens = push_array(arena, Cpp_Token, max_count); + if (array.tokens != 0){ + array.max_count = max_count; + Cpp_Keyword_Table kw_table = {0}; + Cpp_Keyword_Table pp_table = {0}; + if (lexer_keywords_default_init(arena, &kw_table, &pp_table)){ + Cpp_Lex_Data S = cpp_lex_data_init(false, kw_table, pp_table); + Cpp_Lex_Result result = cpp_lex_step(&S, data.str, data.size + 1, HAS_NULL_TERM, &array, NO_OUT_LIMIT); + if (result == LexResult_Finished){ + success = true; + } + } + } + if (!success){ + memset(&array, 0, sizeof(array)); + end_temp_memory(restore_point); + } + return(array); +} + +static Config* +text_data_to_parsed_data(Partition *arena, String file_name, String data){ + Config *parsed = 0; + Temp_Memory restore_point = begin_temp_memory(arena); + Cpp_Token_Array array = text_data_to_token_array(arena, data); + if (array.tokens != 0){ + parsed = text_data_and_token_array_to_parse_data(arena, file_name, data, array); +if (parsed == 0){ + end_temp_memory(restore_point); + } +} + return(parsed); +} + +//////////////////////////////// + static void config_init_default(Config_Data *config){ config->default_wrap_width = 672; @@ -797,29 +1020,13 @@ config_init_default(Config_Data *config){ } static void -config_parse__data(Partition *scratch, - char *file_name, String data, Config_Data *config){ +config_parse__data(Partition *scratch, String file_name, String data, Config_Data *config){ config_init_default(config); bool32 success = false; Temp_Memory temp = begin_temp_memory(scratch); - Cpp_Token_Array array = {0}; - array.count = 0; - array.max_count = (1 << 20)/sizeof(Cpp_Token); - array.tokens = push_array(scratch, Cpp_Token, array.max_count); - - if (array.tokens != 0){ - Cpp_Keyword_Table kw_table = {0}; - Cpp_Keyword_Table pp_table = {0}; - lexer_keywords_default_init(scratch, &kw_table, &pp_table); - - Cpp_Lex_Data S = cpp_lex_data_init(false, kw_table, pp_table); - Cpp_Lex_Result result = cpp_lex_step(&S, data.str, data.size + 1, HAS_NULL_TERM, &array, NO_OUT_LIMIT); - - if (result == LexResult_Finished){ -#if 1 - Config *parsed = config_parse(scratch, file_name, data, array); + Config *parsed = text_data_to_parsed_data(scratch, file_name, data); if (parsed != 0){ success = true; @@ -851,64 +1058,6 @@ config_parse__data(Partition *scratch, config_bool_var(parsed, "automatically_load_project", 0, &config->automatically_load_project); config_bool_var(parsed, "lalt_lctrl_is_altgr", 0, &config->lalt_lctrl_is_altgr); } - -#else - success = true; - for (int32_t i = 0; i < array.count; ++i){ - Config_Line config_line = read_config_line(array, &i, data.str); - - if (config_line.read_success){ - Config_Item item = get_config_item(config_line, data.str, array); - - config_bool_var(item, "enable_code_wrapping", 0, - &config->enable_code_wrapping); - config_bool_var(item, "automatically_adjust_wrapping", 0, - &config->automatically_adjust_wrapping); - config_bool_var(item, "automatically_indent_text_on_save", 0, - &config->automatically_indent_text_on_save); - config_bool_var(item, "automatically_save_changes_on_build", 0, - &config->automatically_save_changes_on_build); - - config_int_var(item, "default_wrap_width", 0, - &config->default_wrap_width); - config_int_var(item, "default_min_base_width", 0, - &config->default_min_base_width); - - config_string_var(item, "default_theme_name", 0, - &config->default_theme_name); - config_string_var(item, "default_font_name", 0, - &config->default_font_name); - config_string_var(item, "user_name", 0, - &config->user_name); - - config_string_var(item, "default_compiler_bat", 0, - &config->default_compiler_bat); - config_string_var(item, "default_flags_bat", 0, - &config->default_flags_bat); - config_string_var(item, "default_compiler_sh", 0, - &config->default_compiler_sh); - config_string_var(item, "default_flags_sh", 0, - &config->default_flags_sh); - - config_string_var(item, "mapping", 0, - &config->current_mapping); - - char space[512]; - String str = make_fixed_width_string(space); - if (config_string_var(item, "treat_as_code", 0, &str)){ - parse_extension_line_to_extension_list(str, &config->code_exts); - } - - config_bool_var(item, "automatically_load_project", 0, - &config->automatically_load_project); - - config_bool_var(item, "lalt_lctrl_is_altgr", 0, - &config->lalt_lctrl_is_altgr); - } - } -#endif - } - } end_temp_memory(temp); @@ -919,7 +1068,7 @@ config_parse__data(Partition *scratch, static void config_parse__file_handle(Partition *scratch, - char *file_name, FILE *file, Config_Data *config){ + String file_name, FILE *file, Config_Data *config){ Temp_Memory temp = begin_temp_memory(scratch); String data = dump_file_handle(scratch, file); if (data.str != 0){ @@ -934,81 +1083,70 @@ config_parse__file_handle(Partition *scratch, static void config_parse__file_name(Application_Links *app, Partition *scratch, char *file_name, Config_Data *config){ + bool32 success = false; FILE *file = open_file_try_current_path_then_binary_path(app, file_name); if (file != 0){ - config_parse__file_handle(scratch, file_name, file, config); + Temp_Memory temp = begin_temp_memory(scratch); + String data = dump_file_handle(scratch, file); fclose(file); - } - else{ - print_message(app, literal("Did not find config file, using default settings\n")); + if (data.str != 0){ + config_parse__data(scratch, make_string_slowly(file_name), data, config); + } + end_temp_memory(temp); + } + + if (!success){ config_init_default(config); } } -static bool32 -theme_parse__data(Partition *scratch, String data, Theme_Data *theme){ - bool32 success = false; - - Cpp_Token_Array array; - array.count = 0; - array.max_count = (1 << 20)/sizeof(Cpp_Token); - array.tokens = push_array(scratch, Cpp_Token, array.max_count); - - Cpp_Keyword_Table kw_table = {0}; - Cpp_Keyword_Table pp_table = {0}; - lexer_keywords_default_init(scratch, &kw_table, &pp_table); - - Cpp_Lex_Data S = cpp_lex_data_init(false, kw_table, pp_table); - Cpp_Lex_Result result = cpp_lex_step(&S, data.str, data.size + 1, HAS_NULL_TERM, &array, NO_OUT_LIMIT); - - if (result == LexResult_Finished){ - success = true; - - theme->name = make_fixed_width_string(theme->space); - copy(&theme->name, "unnamed"); - init_theme_zero(&theme->theme); - - for (int32_t i = 0; i < array.count; ++i){ - Config_Line config_line = read_config_line(array, &i, data.str); - if (config_line.read_success){ - Config_Item item = get_config_item(config_line, data.str, array); - config_string_var(item, "name", 0, &theme->name); - - for (int32_t tag = 0; tag < ArrayCount(style_tag_names); ++tag){ - char *name = style_tag_names[tag]; - int_color color = 0; - if (config_uint_var(item, name, 0, &color)){ - int_color *color_slot = &theme->theme.colors[tag]; - *color_slot = color; - } - else{ - char var_space[512]; - String var_str = make_fixed_width_string(var_space); - if (config_identifier_var(item, name, 0, &var_str)){ - for (int32_t eq_tag = 0; eq_tag < ArrayCount(style_tag_names); ++eq_tag){ - if (match(var_str, style_tag_names[eq_tag])){ - int_color *color_slot = &theme->theme.colors[tag]; - *color_slot = theme->theme.colors[eq_tag]; - break; - } - } - } - } - } - } - } +static void +init_theme_zero(Theme *theme){ + for (int32_t i = 0; i < Stag_COUNT; ++i){ + theme->colors[i] = 0; } +} + +static bool32 +theme_parse__data(Partition *scratch, String file_name, String data, Theme_Data *theme){ + theme->name = make_fixed_width_string(theme->space); + copy(&theme->name, "unnamed"); + init_theme_zero(&theme->theme); + + bool32 success = false; + Temp_Memory temp = begin_temp_memory(scratch); + + Config *parsed = text_data_to_parsed_data(scratch, file_name, data); + if (parsed != 0){ + success = true; + + String theme_name = {0}; + if (config_string_var(parsed, "name", 0, &theme_name)){ + copy(&theme->name, theme_name); + } + + for (int32_t i = 0; i < Stag_COUNT; ++i){ + char *name = style_tag_names[i]; + uint32_t color = 0; + if (!config_uint_var(parsed, name, 0, &color)){ + color = 0xFFFF00FF; + } + theme->theme.colors[i] = color; + } + } + + end_temp_memory(temp); return(success); } static bool32 -theme_parse__file_handle(Partition *scratch, FILE *file, Theme_Data *theme){ +theme_parse__file_handle(Partition *scratch, String file_name, FILE *file, Theme_Data *theme){ Temp_Memory temp = begin_temp_memory(scratch); String data = dump_file_handle(scratch, file); bool32 success = false; if (data.str != 0){ - success = theme_parse__data(scratch, data, theme); + success = theme_parse__data(scratch, file_name, data, theme); } end_temp_memory(temp); return(success); @@ -1020,10 +1158,13 @@ theme_parse__file_name(Application_Links *app, Partition *scratch, bool32 success = false; FILE *file = open_file_try_current_path_then_binary_path(app, file_name); if (file != 0){ - success = theme_parse__file_handle(scratch, file, theme); + Temp_Memory temp = begin_temp_memory(scratch); + String data = dump_file_handle(scratch, file); fclose(file); + success = theme_parse__data(scratch, make_string_slowly(file_name), data, theme); + end_temp_memory(temp); } - else{ + if (!success){ char space[256]; String str = make_fixed_width_string(space); append(&str, "Did not find "); @@ -1031,7 +1172,6 @@ theme_parse__file_name(Application_Links *app, Partition *scratch, append(&str, ", color scheme not loaded"); print_message(app, str.str, str.size); } - return(success); } diff --git a/4coder_config.h b/4coder_config.h index d4118fbd..545b420e 100644 --- a/4coder_config.h +++ b/4coder_config.h @@ -12,7 +12,7 @@ struct Config_Parser{ Cpp_Token *token; Cpp_Token *end; - char *file_name; + String file_name; String data; Partition *arena; @@ -47,12 +47,21 @@ struct Config_RValue{ Config_LValue *lvalue; bool32 boolean; int32_t integer; + uint32_t uinteger; String string; char character; Config_Compound *compound; }; }; +struct Config_Integer{ + bool32 is_signed; + union{ + int32_t integer; + uint32_t uinteger; + }; +}; + typedef int32_t Config_Layout_Type; enum{ ConfigLayoutType_Unset = 0, diff --git a/4coder_generated/command_metadata.h b/4coder_generated/command_metadata.h index b525b594..0a331b42 100644 --- a/4coder_generated/command_metadata.h +++ b/4coder_generated/command_metadata.h @@ -1,7 +1,7 @@ #define command_id(c) (fcoder_metacmd_ID_##c) #define command_metadata(c) (&fcoder_metacmd_table[command_id(c)]) #define command_metadata_by_id(id) (&fcoder_metacmd_table[id]) -#define command_one_past_last_id 194 +#define command_one_past_last_id 193 #if defined(CUSTOM_COMMAND_SIG) #define PROC_LINKS(x,y) x #else @@ -136,7 +136,6 @@ CUSTOM_COMMAND_SIG(query_replace); CUSTOM_COMMAND_SIG(query_replace_identifier); CUSTOM_COMMAND_SIG(query_replace_selection); CUSTOM_COMMAND_SIG(redo); -CUSTOM_COMMAND_SIG(reload_current_project); CUSTOM_COMMAND_SIG(remap_interactive); CUSTOM_COMMAND_SIG(rename_file_query); CUSTOM_COMMAND_SIG(rename_parameter); @@ -213,7 +212,7 @@ char *source_name; int32_t source_name_len; int32_t line_number; }; -static Command_Metadata fcoder_metacmd_table[194] = { +static Command_Metadata fcoder_metacmd_table[193] = { { PROC_LINKS(allow_mouse, 0), "allow_mouse", 11, "Shows the mouse and causes all mouse input to be processed normally.", 68, "C:\\work\\4ed\\code\\4coder_default_framework.cpp", 49, 203 }, { PROC_LINKS(auto_tab_line_at_cursor, 0), "auto_tab_line_at_cursor", 23, "Auto-indents the line on which the cursor sits.", 47, "C:\\work\\4ed\\code\\4coder_auto_indent.cpp", 43, 722 }, { PROC_LINKS(auto_tab_range, 0), "auto_tab_range", 14, "Auto-indents the range between the cursor and the mark.", 55, "C:\\work\\4ed\\code\\4coder_auto_indent.cpp", 43, 733 }, @@ -230,7 +229,7 @@ static Command_Metadata fcoder_metacmd_table[194] = { { PROC_LINKS(clean_all_lines, 0), "clean_all_lines", 15, "Removes trailing whitespace from all lines in the current buffer.", 65, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 368 }, { PROC_LINKS(click_set_cursor, 0), "click_set_cursor", 16, "Sets the cursor position to the mouse position.", 47, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 174 }, { PROC_LINKS(click_set_mark, 0), "click_set_mark", 14, "Sets the mark position to the mouse position.", 45, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 187 }, -{ PROC_LINKS(close_all_code, 0), "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 403 }, +{ PROC_LINKS(close_all_code, 0), "close_all_code", 14, "Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.", 107, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 373 }, { PROC_LINKS(close_build_panel, 0), "close_build_panel", 17, "If the special build panel is open, closes it.", 46, "C:\\work\\4ed\\code\\4coder_build_commands.cpp", 46, 205 }, { PROC_LINKS(close_panel, 0), "close_panel", 11, "Closes the currently active panel if it is not the only panel open.", 67, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 441 }, { PROC_LINKS(copy, 0), "copy", 4, "Copy the text in the range from the cursor to the mark onto the clipboard.", 74, "C:\\work\\4ed\\code\\4coder_clipboard.cpp", 41, 26 }, @@ -296,7 +295,7 @@ static Command_Metadata fcoder_metacmd_table[194] = { { PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 800 }, { PROC_LINKS(list_all_substring_locations, 0), "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 747 }, { PROC_LINKS(list_all_substring_locations_case_insensitive, 0), "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, "C:\\work\\4ed\\code\\4coder_search.cpp", 38, 759 }, -{ PROC_LINKS(load_project, 0), "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, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 426 }, +{ PROC_LINKS(load_project, 0), "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, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 396 }, { PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1101 }, { PROC_LINKS(miblo_decrement_basic, 0), "miblo_decrement_basic", 21, "Decrement an integer under the cursor by one.", 45, "C:\\work\\4ed\\code\\4coder_miblo_numbers.cpp", 45, 110 }, { PROC_LINKS(miblo_decrement_time_stamp, 0), "miblo_decrement_time_stamp", 26, "Decrement a time stamp under the cursor by one second. (format [m]m:ss or h:mm:ss", 81, "C:\\work\\4ed\\code\\4coder_miblo_numbers.cpp", 45, 383 }, @@ -318,8 +317,8 @@ static Command_Metadata fcoder_metacmd_table[194] = { { PROC_LINKS(newline_or_goto_position_same_panel_direct, 0), "newline_or_goto_position_same_panel_direct", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "C:\\work\\4ed\\code\\4coder_jump_direct.cpp", 43, 116 }, { PROC_LINKS(newline_or_goto_position_same_panel_sticky, 0), "newline_or_goto_position_same_panel_sticky", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 571 }, { PROC_LINKS(newline_or_goto_position_sticky, 0), "newline_or_goto_position_sticky", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "C:\\work\\4ed\\code\\4coder_jump_sticky.cpp", 43, 556 }, -{ PROC_LINKS(open_all_code, 0), "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 410 }, -{ PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 417 }, +{ PROC_LINKS(open_all_code, 0), "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 380 }, +{ PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 387 }, { PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder colors and fonts selector menu.", 48, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1457 }, { PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1320 }, { PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Switches to the next active panel and begins an open file dialogue.", 67, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1465 }, @@ -336,13 +335,12 @@ static Command_Metadata fcoder_metacmd_table[194] = { { PROC_LINKS(paste_next, 0), "paste_next", 10, "If the previous command was paste or paste_next, replaces the paste range with the next text down on the clipboard, otherwise operates as the paste command.", 156, "C:\\work\\4ed\\code\\4coder_clipboard.cpp", 41, 84 }, { PROC_LINKS(paste_next_and_indent, 0), "paste_next_and_indent", 21, "Paste the next item on the clipboard and run auto-indent on the newly pasted text.", 82, "C:\\work\\4ed\\code\\4coder_clipboard.cpp", 41, 135 }, { PROC_LINKS(place_in_scope, 0), "place_in_scope", 14, "Wraps the code contained in the range between cursor and mark with a new curly brace scope.", 91, "C:\\work\\4ed\\code\\4coder_scope_commands.cpp", 46, 481 }, -{ PROC_LINKS(project_fkey_command, 0), "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 497 }, -{ PROC_LINKS(project_go_to_root_directory, 0), "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 522 }, +{ PROC_LINKS(project_fkey_command, 0), "project_fkey_command", 20, "Run an 'fkey command' configured in a project.4coder file. Determines the index of the 'fkey command' by which function key or numeric key was pressed to trigger the command.", 175, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 403 }, +{ PROC_LINKS(project_go_to_root_directory, 0), "project_go_to_root_directory", 28, "Changes 4coder's hot directory to the root directory of the currently loaded project. With no loaded project nothing hapepns.", 125, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 428 }, { PROC_LINKS(query_replace, 0), "query_replace", 13, "Queries the user for two strings, and incrementally replaces every occurence of the first string with the second string.", 120, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 893 }, { PROC_LINKS(query_replace_identifier, 0), "query_replace_identifier", 24, "Queries the user for a string, and incrementally replace every occurence of the word or token found at the cursor with the specified string.", 140, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 913 }, { PROC_LINKS(query_replace_selection, 0), "query_replace_selection", 23, "Queries the user for a string, and incrementally replace every occurence of the string found in the selected range with the specified string.", 141, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 931 }, { PROC_LINKS(redo, 0), "redo", 4, "Advances forewards through the undo history.", 44, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1403 }, -{ PROC_LINKS(reload_current_project, 0), "reload_current_project", 22, "If a project file has already been loaded, reloads the same file. Useful for when the project configuration is changed.", 120, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 465 }, { PROC_LINKS(remap_interactive, 0), "remap_interactive", 17, "Switch to a named key binding map.", 34, "C:\\work\\4ed\\code\\4coder_default_framework.cpp", 49, 223 }, { PROC_LINKS(rename_file_query, 0), "rename_file_query", 17, "Queries the user for a new name and renames the file of the current buffer, altering the buffer's name too.", 107, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 1059 }, { PROC_LINKS(rename_parameter, 0), "rename_parameter", 16, "If the cursor is found to be on the name of a function parameter in the signature of a function definition, all occurences within the scope of the function will be replaced with a new provided string.", 200, "C:\\work\\4ed\\code\\4coder_experiments.cpp", 43, 385 }, @@ -380,7 +378,7 @@ static Command_Metadata fcoder_metacmd_table[194] = { { PROC_LINKS(set_bindings_default, 0), "set_bindings_default", 20, "Remap keybindings using the 'default' mapping rule.", 51, "C:\\work\\4ed\\code\\4coder_remapping_commands.cpp", 50, 61 }, { PROC_LINKS(set_bindings_mac_default, 0), "set_bindings_mac_default", 24, "Remap keybindings using the 'mac-default' mapping rule.", 55, "C:\\work\\4ed\\code\\4coder_remapping_commands.cpp", 50, 75 }, { PROC_LINKS(set_mark, 0), "set_mark", 8, "Sets the mark to the current position of the cursor.", 52, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 86 }, -{ PROC_LINKS(setup_new_project, 0), "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 569 }, +{ PROC_LINKS(setup_new_project, 0), "setup_new_project", 17, "Queries the user for several configuration options and initializes a new 4coder project with build scripts for every OS.", 120, "C:\\work\\4ed\\code\\4coder_project_commands.cpp", 48, 475 }, { PROC_LINKS(show_filebar, 0), "show_filebar", 12, "Sets the current view to show it's filebar.", 43, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 464 }, { PROC_LINKS(show_scrollbar, 0), "show_scrollbar", 14, "Sets the current view to show it's scrollbar.", 45, "C:\\work\\4ed\\code\\4coder_base_commands.cpp", 45, 450 }, { PROC_LINKS(snipe_token_or_word, 0), "snipe_token_or_word", 19, "Delete a single, whole token on or to the left of the cursor and post it to the clipboard.", 90, "C:\\work\\4ed\\code\\4coder_seek.cpp", 36, 1259 }, @@ -537,69 +535,68 @@ static int32_t fcoder_metacmd_ID_query_replace = 124; static int32_t fcoder_metacmd_ID_query_replace_identifier = 125; static int32_t fcoder_metacmd_ID_query_replace_selection = 126; static int32_t fcoder_metacmd_ID_redo = 127; -static int32_t fcoder_metacmd_ID_reload_current_project = 128; -static int32_t fcoder_metacmd_ID_remap_interactive = 129; -static int32_t fcoder_metacmd_ID_rename_file_query = 130; -static int32_t fcoder_metacmd_ID_rename_parameter = 131; -static int32_t fcoder_metacmd_ID_reopen = 132; -static int32_t fcoder_metacmd_ID_replace_all_occurrences = 133; -static int32_t fcoder_metacmd_ID_replace_in_range = 134; -static int32_t fcoder_metacmd_ID_reverse_search = 135; -static int32_t fcoder_metacmd_ID_reverse_search_identifier = 136; -static int32_t fcoder_metacmd_ID_save = 137; -static int32_t fcoder_metacmd_ID_save_all_dirty_buffers = 138; -static int32_t fcoder_metacmd_ID_save_to_query = 139; -static int32_t fcoder_metacmd_ID_scope_absorb_down = 140; -static int32_t fcoder_metacmd_ID_search = 141; -static int32_t fcoder_metacmd_ID_search_identifier = 142; -static int32_t fcoder_metacmd_ID_seek_alphanumeric_left = 143; -static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_left = 144; -static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_right = 145; -static int32_t fcoder_metacmd_ID_seek_alphanumeric_right = 146; -static int32_t fcoder_metacmd_ID_seek_beginning_of_line = 147; -static int32_t fcoder_metacmd_ID_seek_beginning_of_textual_line = 148; -static int32_t fcoder_metacmd_ID_seek_end_of_line = 149; -static int32_t fcoder_metacmd_ID_seek_end_of_textual_line = 150; -static int32_t fcoder_metacmd_ID_seek_token_left = 151; -static int32_t fcoder_metacmd_ID_seek_token_right = 152; -static int32_t fcoder_metacmd_ID_seek_white_or_token_left = 153; -static int32_t fcoder_metacmd_ID_seek_white_or_token_right = 154; -static int32_t fcoder_metacmd_ID_seek_whitespace_down = 155; -static int32_t fcoder_metacmd_ID_seek_whitespace_down_end_line = 156; -static int32_t fcoder_metacmd_ID_seek_whitespace_left = 157; -static int32_t fcoder_metacmd_ID_seek_whitespace_right = 158; -static int32_t fcoder_metacmd_ID_seek_whitespace_up = 159; -static int32_t fcoder_metacmd_ID_seek_whitespace_up_end_line = 160; -static int32_t fcoder_metacmd_ID_select_all = 161; -static int32_t fcoder_metacmd_ID_set_bindings_choose = 162; -static int32_t fcoder_metacmd_ID_set_bindings_default = 163; -static int32_t fcoder_metacmd_ID_set_bindings_mac_default = 164; -static int32_t fcoder_metacmd_ID_set_mark = 165; -static int32_t fcoder_metacmd_ID_setup_new_project = 166; -static int32_t fcoder_metacmd_ID_show_filebar = 167; -static int32_t fcoder_metacmd_ID_show_scrollbar = 168; -static int32_t fcoder_metacmd_ID_snipe_token_or_word = 169; -static int32_t fcoder_metacmd_ID_snipe_token_or_word_right = 170; -static int32_t fcoder_metacmd_ID_suppress_mouse = 171; -static int32_t fcoder_metacmd_ID_swap_buffers_between_panels = 172; -static int32_t fcoder_metacmd_ID_to_lowercase = 173; -static int32_t fcoder_metacmd_ID_to_uppercase = 174; -static int32_t fcoder_metacmd_ID_toggle_filebar = 175; -static int32_t fcoder_metacmd_ID_toggle_fullscreen = 176; -static int32_t fcoder_metacmd_ID_toggle_line_wrap = 177; -static int32_t fcoder_metacmd_ID_toggle_mouse = 178; -static int32_t fcoder_metacmd_ID_toggle_show_whitespace = 179; -static int32_t fcoder_metacmd_ID_toggle_virtual_whitespace = 180; -static int32_t fcoder_metacmd_ID_undo = 181; -static int32_t fcoder_metacmd_ID_view_buffer_other_panel = 182; -static int32_t fcoder_metacmd_ID_word_complete = 183; -static int32_t fcoder_metacmd_ID_write_and_auto_tab = 184; -static int32_t fcoder_metacmd_ID_write_block = 185; -static int32_t fcoder_metacmd_ID_write_character = 186; -static int32_t fcoder_metacmd_ID_write_explicit_enum_flags = 187; -static int32_t fcoder_metacmd_ID_write_explicit_enum_values = 188; -static int32_t fcoder_metacmd_ID_write_hack = 189; -static int32_t fcoder_metacmd_ID_write_note = 190; -static int32_t fcoder_metacmd_ID_write_todo = 191; -static int32_t fcoder_metacmd_ID_write_underscore = 192; -static int32_t fcoder_metacmd_ID_write_zero_struct = 193; +static int32_t fcoder_metacmd_ID_remap_interactive = 128; +static int32_t fcoder_metacmd_ID_rename_file_query = 129; +static int32_t fcoder_metacmd_ID_rename_parameter = 130; +static int32_t fcoder_metacmd_ID_reopen = 131; +static int32_t fcoder_metacmd_ID_replace_all_occurrences = 132; +static int32_t fcoder_metacmd_ID_replace_in_range = 133; +static int32_t fcoder_metacmd_ID_reverse_search = 134; +static int32_t fcoder_metacmd_ID_reverse_search_identifier = 135; +static int32_t fcoder_metacmd_ID_save = 136; +static int32_t fcoder_metacmd_ID_save_all_dirty_buffers = 137; +static int32_t fcoder_metacmd_ID_save_to_query = 138; +static int32_t fcoder_metacmd_ID_scope_absorb_down = 139; +static int32_t fcoder_metacmd_ID_search = 140; +static int32_t fcoder_metacmd_ID_search_identifier = 141; +static int32_t fcoder_metacmd_ID_seek_alphanumeric_left = 142; +static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_left = 143; +static int32_t fcoder_metacmd_ID_seek_alphanumeric_or_camel_right = 144; +static int32_t fcoder_metacmd_ID_seek_alphanumeric_right = 145; +static int32_t fcoder_metacmd_ID_seek_beginning_of_line = 146; +static int32_t fcoder_metacmd_ID_seek_beginning_of_textual_line = 147; +static int32_t fcoder_metacmd_ID_seek_end_of_line = 148; +static int32_t fcoder_metacmd_ID_seek_end_of_textual_line = 149; +static int32_t fcoder_metacmd_ID_seek_token_left = 150; +static int32_t fcoder_metacmd_ID_seek_token_right = 151; +static int32_t fcoder_metacmd_ID_seek_white_or_token_left = 152; +static int32_t fcoder_metacmd_ID_seek_white_or_token_right = 153; +static int32_t fcoder_metacmd_ID_seek_whitespace_down = 154; +static int32_t fcoder_metacmd_ID_seek_whitespace_down_end_line = 155; +static int32_t fcoder_metacmd_ID_seek_whitespace_left = 156; +static int32_t fcoder_metacmd_ID_seek_whitespace_right = 157; +static int32_t fcoder_metacmd_ID_seek_whitespace_up = 158; +static int32_t fcoder_metacmd_ID_seek_whitespace_up_end_line = 159; +static int32_t fcoder_metacmd_ID_select_all = 160; +static int32_t fcoder_metacmd_ID_set_bindings_choose = 161; +static int32_t fcoder_metacmd_ID_set_bindings_default = 162; +static int32_t fcoder_metacmd_ID_set_bindings_mac_default = 163; +static int32_t fcoder_metacmd_ID_set_mark = 164; +static int32_t fcoder_metacmd_ID_setup_new_project = 165; +static int32_t fcoder_metacmd_ID_show_filebar = 166; +static int32_t fcoder_metacmd_ID_show_scrollbar = 167; +static int32_t fcoder_metacmd_ID_snipe_token_or_word = 168; +static int32_t fcoder_metacmd_ID_snipe_token_or_word_right = 169; +static int32_t fcoder_metacmd_ID_suppress_mouse = 170; +static int32_t fcoder_metacmd_ID_swap_buffers_between_panels = 171; +static int32_t fcoder_metacmd_ID_to_lowercase = 172; +static int32_t fcoder_metacmd_ID_to_uppercase = 173; +static int32_t fcoder_metacmd_ID_toggle_filebar = 174; +static int32_t fcoder_metacmd_ID_toggle_fullscreen = 175; +static int32_t fcoder_metacmd_ID_toggle_line_wrap = 176; +static int32_t fcoder_metacmd_ID_toggle_mouse = 177; +static int32_t fcoder_metacmd_ID_toggle_show_whitespace = 178; +static int32_t fcoder_metacmd_ID_toggle_virtual_whitespace = 179; +static int32_t fcoder_metacmd_ID_undo = 180; +static int32_t fcoder_metacmd_ID_view_buffer_other_panel = 181; +static int32_t fcoder_metacmd_ID_word_complete = 182; +static int32_t fcoder_metacmd_ID_write_and_auto_tab = 183; +static int32_t fcoder_metacmd_ID_write_block = 184; +static int32_t fcoder_metacmd_ID_write_character = 185; +static int32_t fcoder_metacmd_ID_write_explicit_enum_flags = 186; +static int32_t fcoder_metacmd_ID_write_explicit_enum_values = 187; +static int32_t fcoder_metacmd_ID_write_hack = 188; +static int32_t fcoder_metacmd_ID_write_note = 189; +static int32_t fcoder_metacmd_ID_write_todo = 190; +static int32_t fcoder_metacmd_ID_write_underscore = 191; +static int32_t fcoder_metacmd_ID_write_zero_struct = 192; diff --git a/4coder_generated/remapping.h b/4coder_generated/remapping.h index fc4d1d74..fd3422b2 100644 --- a/4coder_generated/remapping.h +++ b/4coder_generated/remapping.h @@ -12,7 +12,6 @@ bind(context, 'o', MDFR_ALT, open_in_other); bind(context, 'k', MDFR_CTRL, interactive_kill_buffer); bind(context, 'i', MDFR_CTRL, interactive_switch_buffer); bind(context, 'h', MDFR_CTRL, project_go_to_root_directory); -bind(context, 'H', MDFR_CTRL, reload_current_project); bind(context, 'S', MDFR_CTRL, save_all_dirty_buffers); bind(context, 'c', MDFR_ALT, open_color_tweaker); bind(context, '.', MDFR_ALT, change_to_build_panel); @@ -165,7 +164,6 @@ bind(context, 'o', MDFR_CTRL, open_in_other); bind(context, 'k', MDFR_CMND, interactive_kill_buffer); bind(context, 'i', MDFR_CMND, interactive_switch_buffer); bind(context, 'h', MDFR_CMND, project_go_to_root_directory); -bind(context, 'H', MDFR_CMND, reload_current_project); bind(context, 'S', MDFR_CMND, save_all_dirty_buffers); bind(context, 'c', MDFR_CTRL, open_color_tweaker); bind(context, '.', MDFR_CTRL, change_to_build_panel); @@ -336,7 +334,7 @@ Meta_Sub_Map *sub_maps; int32_t sub_map_count; LINK_PROCS(void (*fill_keys_proc)(Bind_Helper *context);) }; -static Meta_Key_Bind fcoder_binds_for_default_mapid_global[46] = { +static Meta_Key_Bind fcoder_binds_for_default_mapid_global[45] = { {0, 112, 1, "open_panel_vsplit", 17, LINK_PROCS(open_panel_vsplit)}, {0, 95, 1, "open_panel_hsplit", 17, LINK_PROCS(open_panel_hsplit)}, {0, 80, 1, "close_panel", 11, LINK_PROCS(close_panel)}, @@ -348,7 +346,6 @@ static Meta_Key_Bind fcoder_binds_for_default_mapid_global[46] = { {0, 107, 1, "interactive_kill_buffer", 23, LINK_PROCS(interactive_kill_buffer)}, {0, 105, 1, "interactive_switch_buffer", 25, LINK_PROCS(interactive_switch_buffer)}, {0, 104, 1, "project_go_to_root_directory", 28, LINK_PROCS(project_go_to_root_directory)}, -{0, 72, 1, "reload_current_project", 22, LINK_PROCS(reload_current_project)}, {0, 83, 1, "save_all_dirty_buffers", 22, LINK_PROCS(save_all_dirty_buffers)}, {0, 99, 2, "open_color_tweaker", 18, LINK_PROCS(open_color_tweaker)}, {0, 46, 2, "change_to_build_panel", 21, LINK_PROCS(change_to_build_panel)}, @@ -487,11 +484,11 @@ static Meta_Key_Bind fcoder_binds_for_default_default_code_map[32] = { {0, 73, 1, "list_all_functions_current_buffer", 33, LINK_PROCS(list_all_functions_current_buffer)}, }; static Meta_Sub_Map fcoder_submaps_for_default[3] = { -{"mapid_global", 12, "The following bindings apply in all situations.", 47, 0, 0, fcoder_binds_for_default_mapid_global, 46}, +{"mapid_global", 12, "The following bindings apply in all situations.", 47, 0, 0, fcoder_binds_for_default_mapid_global, 45}, {"mapid_file", 10, "The following bindings apply in general text files and most apply in code files, but some are overriden by other commands specific to code files.", 145, 0, 0, fcoder_binds_for_default_mapid_file, 66}, {"default_code_map", 16, "The following commands only apply in files where the lexer (syntax highlighting) is turned on.", 94, "mapid_file", 10, fcoder_binds_for_default_default_code_map, 32}, }; -static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_global[46] = { +static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_global[45] = { {0, 112, 4, "open_panel_vsplit", 17, LINK_PROCS(open_panel_vsplit)}, {0, 95, 4, "open_panel_hsplit", 17, LINK_PROCS(open_panel_hsplit)}, {0, 80, 4, "close_panel", 11, LINK_PROCS(close_panel)}, @@ -503,7 +500,6 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_mapid_global[46] = { {0, 107, 4, "interactive_kill_buffer", 23, LINK_PROCS(interactive_kill_buffer)}, {0, 105, 4, "interactive_switch_buffer", 25, LINK_PROCS(interactive_switch_buffer)}, {0, 104, 4, "project_go_to_root_directory", 28, LINK_PROCS(project_go_to_root_directory)}, -{0, 72, 4, "reload_current_project", 22, LINK_PROCS(reload_current_project)}, {0, 83, 4, "save_all_dirty_buffers", 22, LINK_PROCS(save_all_dirty_buffers)}, {0, 99, 1, "open_color_tweaker", 18, LINK_PROCS(open_color_tweaker)}, {0, 46, 1, "change_to_build_panel", 21, LINK_PROCS(change_to_build_panel)}, @@ -640,7 +636,7 @@ static Meta_Key_Bind fcoder_binds_for_mac_default_default_code_map[32] = { {0, 73, 4, "list_all_functions_current_buffer", 33, LINK_PROCS(list_all_functions_current_buffer)}, }; static Meta_Sub_Map fcoder_submaps_for_mac_default[3] = { -{"mapid_global", 12, "The following bindings apply in all situations.", 47, 0, 0, fcoder_binds_for_mac_default_mapid_global, 46}, +{"mapid_global", 12, "The following bindings apply in all situations.", 47, 0, 0, fcoder_binds_for_mac_default_mapid_global, 45}, {"mapid_file", 10, "The following bindings apply in general text files and most apply in code files, but some are overriden by other commands specific to code files.", 145, 0, 0, fcoder_binds_for_mac_default_mapid_file, 64}, {"default_code_map", 16, "The following commands only apply in files where the lexer (syntax highlighting) is turned on.", 94, "mapid_file", 10, fcoder_binds_for_mac_default_default_code_map, 32}, }; diff --git a/4coder_helper.cpp b/4coder_helper.cpp index 04a63753..7f122a1f 100644 --- a/4coder_helper.cpp +++ b/4coder_helper.cpp @@ -395,13 +395,6 @@ query_user_number(Application_Links *app, Query_Bar *bar){ return(query_user_general(app, bar, true)); } -static void -init_theme_zero(Theme *theme){ - for (int32_t i = 0; i < Stag_COUNT; ++i){ - theme->colors[i] = 0; - } -} - static char buffer_get_char(Application_Links *app, Buffer_Summary *buffer, int32_t pos){ char result = ' '; @@ -1120,22 +1113,23 @@ build_string(Partition *part, String s0, String s1, String s2){ return(sr); } -static void -lexer_keywords_default_init(Partition *part, Cpp_Keyword_Table *kw_out, Cpp_Keyword_Table *pp_out){ +static bool32 +lexer_keywords_default_init(Partition *arena, Cpp_Keyword_Table *kw_out, Cpp_Keyword_Table *pp_out){ + bool32 success = false; umem_4tech kw_size = cpp_get_table_memory_size_default(CPP_TABLE_KEYWORDS); umem_4tech pp_size = cpp_get_table_memory_size_default(CPP_TABLE_PREPROCESSOR_DIRECTIVES); - void *kw_mem = push_array(part, char, (i32_4tech)kw_size); - void *pp_mem = push_array(part, char, (i32_4tech)pp_size); + void *kw_mem = push_array(arena, char, (i32_4tech)kw_size); + void *pp_mem = push_array(arena, char, (i32_4tech)pp_size); + if (kw_mem != 0 && pp_mem != 0){ *kw_out = cpp_make_table_default(CPP_TABLE_KEYWORDS, kw_mem, kw_size); - *pp_out = cpp_make_table_default(CPP_TABLE_PREPROCESSOR_DIRECTIVES, pp_mem, pp_size); +*pp_out = cpp_make_table_default(CPP_TABLE_PREPROCESSOR_DIRECTIVES, pp_mem, pp_size); + success = true; +} + return(success); } //////////////////////////////// -// TODO(allen): Stop handling files this way! My own API should be able to do this!!?!?!?!!?!?!!!!? -// NOTE(allen): Actually need binary buffers for some stuff to work, but not this parsing thing here. -#include - static String dump_file_handle(Partition *arena, FILE *file){ String str = {0}; @@ -1154,25 +1148,26 @@ dump_file_handle(Partition *arena, FILE *file){ return(str); } -static FILE* -open_file_search_up_path(Partition *scratch, String path, String file_name){ - Temp_Memory temp = begin_temp_memory(scratch); +static File_Handle_Path +open_file_search_up_path(Partition *arena, String path, String file_name){ + File_Handle_Path result = {0}; int32_t cap = path.size + file_name.size + 2; - char *space = push_array(scratch, char, cap); + char *space = push_array(arena, char, cap); + push_align(arena, 8); String name_str = make_string_cap(space, 0, cap); append(&name_str, path); if (name_str.size == 0 || !char_is_slash(name_str.str[name_str.size - 1])){ append(&name_str, "/"); } - FILE *file = 0; for (;;){ int32_t base_size = name_str.size; append(&name_str, file_name); terminate_with_null(&name_str); - file = fopen(name_str.str, "rb"); - if (file != 0){ + result.file = fopen(name_str.str, "rb"); + if (result.file != 0){ + result.path = name_str; break; } @@ -1183,8 +1178,7 @@ open_file_search_up_path(Partition *scratch, String path, String file_name){ } } - end_temp_memory(temp); - return(file); + return(result); } static FILE* @@ -1232,24 +1226,27 @@ open_file(Partition *scratch, String name){ return(file); } -static String -dump_file(Partition *arena, String name){ - String result = {0}; - FILE *file = open_file(arena, name); +static File_Name_Data +dump_file(Partition *arena, String file_name){ + File_Name_Data result = {0}; + FILE *file = open_file(arena, file_name); if (file != 0){ - result = dump_file_handle(arena, file); + result.file_name = file_name; + result.data = dump_file_handle(arena, file); fclose(file); } return(result); } -static String +static File_Name_Path_Data dump_file_search_up_path(Partition *arena, String path, String file_name){ - String result = {0}; - FILE *file = open_file_search_up_path(arena, path, file_name); - if (file != 0){ - result = dump_file_handle(arena, file); - fclose(file); + File_Name_Path_Data result = {0}; + File_Handle_Path file = open_file_search_up_path(arena, path, file_name); + if (file.file != 0){ + result.file_name = file_name; + result.path = file.path; + result.data = dump_file_handle(arena, file.file); + fclose(file.file); } return(result); } diff --git a/4coder_helper.h b/4coder_helper.h index a0624684..a348098f 100644 --- a/4coder_helper.h +++ b/4coder_helper.h @@ -7,6 +7,10 @@ #if !defined(FCODER_HELPER_H) #define FCODER_HELPER_H +// TODO(allen): Stop handling files this way! My own API should be able to do this!!?!?!?!!?!?!!!!? +// NOTE(allen): Actually need binary buffers for some stuff to work, but not this parsing thing here. +#include + struct Bind_Helper{ Binding_Unit *cursor, *start, *end; Binding_Unit *header, *group; @@ -69,6 +73,24 @@ max_f32_proc(void){ //////////////////////////////// +struct File_Handle_Path{ + FILE *file; + String path; +}; + +struct File_Name_Data{ + String file_name; + String data; +}; + +struct File_Name_Path_Data{ + String file_name; + String path; +String data; + }; + +//////////////////////////////// + struct Buffer_Rect{ int32_t char0; int32_t line0; diff --git a/4coder_project_commands.cpp b/4coder_project_commands.cpp index 20a3d15e..6e794111 100644 --- a/4coder_project_commands.cpp +++ b/4coder_project_commands.cpp @@ -9,7 +9,7 @@ static Project current_project = {0}; /////////////////////////////// static CString_Array -get_project_extensions(Project *project){ +project_get_extensions(Project *project){ CString_Array array = {0}; array.strings = default_extensions; array.count = ArrayCount(default_extensions); @@ -74,21 +74,21 @@ close_all_files_with_extension(Application_Links *app, Partition *scratch_part, } static void -open_all_files_in_directory_with_extension(Application_Links *app, String dir, +open_all_files_in_directory_with_extension__inner(Application_Links *app, String space, CString_Array extension_array, - uint32_t flags){ - File_List list = get_file_list(app, dir.str, dir.size); - int32_t dir_size = dir.size; + uint32_t flags){ + File_List list = get_file_list(app, space.str, space.size); + int32_t dir_size = space.size; for (uint32_t i = 0; i < list.count; ++i){ File_Info *info = list.infos + i; - if (info->folder){ - if (((flags&OpenAllFilesFlag_Recursive) != 0) && info->filename[0] != '.'){ - dir.size = dir_size; - append(&dir, info->filename); - append(&dir, "/"); - open_all_files_in_directory_with_extension(app, dir, extension_array, flags); - } + if (info->folder && + ((flags & OpenAllFilesFlag_Recursive) != 0) && + info->filename[0] != '.'){ + space.size = dir_size; + append(&space, info->filename); + append(&space, "/"); + open_all_files_in_directory_with_extension__inner(app, space, extension_array, flags); } else{ bool32 is_match = true; @@ -105,9 +105,9 @@ open_all_files_in_directory_with_extension(Application_Links *app, String dir, } if (is_match){ - dir.size = dir_size; - append(&dir, info->filename); - create_buffer(app, dir.str, dir.size, 0); + space.size = dir_size; + append(&space, info->filename); + create_buffer(app, space.str, space.size, 0); } } } @@ -116,91 +116,66 @@ open_all_files_in_directory_with_extension(Application_Links *app, String dir, } static void -open_all_files_with_extension_in_hot(Application_Links *app, Partition *scratch, - CString_Array extensions_array, - uint32_t flags){ +open_all_files_in_directory_with_extension(Application_Links *app, Partition *scratch, + String dir, + CString_Array extension_array, + uint32_t flags){ Temp_Memory temp = begin_temp_memory(scratch); - int32_t max_size = 4096; - char *memory = push_array(scratch, char, max_size); - String dir = make_string_cap(memory, 0, max_size); - dir.size = directory_get_hot(app, dir.str, dir.memory_size); - open_all_files_in_directory_with_extension(app, dir, extensions_array, flags); + int32_t size = 32 << 10; + char *mem = push_array(scratch, char, size); + String space = make_string_cap(mem, 0, size); + append(&space, dir); + open_all_files_in_directory_with_extension__inner(app, space, extension_array, flags); end_temp_memory(temp); } static void -open_all_code_with_project_extensions_in_directory(Application_Links *app, String dir, uint32_t flags){ - CString_Array array = get_project_extensions(¤t_project); - open_all_files_in_directory_with_extension(app, dir, array, flags); +open_all_files_in_hot_with_extension(Application_Links *app, Partition *scratch, + CString_Array extensions_array, + uint32_t flags){ + Temp_Memory temp = begin_temp_memory(scratch); + int32_t size = 32 << 10; + char *mem = push_array(scratch, char, size); + String space = make_string_cap(mem, 0, size); + space.size = directory_get_hot(app, space.str, space.memory_size); + open_all_files_in_directory_with_extension__inner(app, space, extensions_array, flags); + end_temp_memory(temp); } /////////////////////////////// -static void -load_project_from_data(Application_Links *app, Partition *scratch, - char *config_data, int32_t config_data_size, - String project_dir){ - Temp_Memory temp = begin_temp_memory(scratch); +static bool32 +parse_project__data(Partition *scratch, String file_name, String data, String file_dir, + Project *project){ + bool32 success = false; - char *mem = config_data; - int32_t size = config_data_size; + Cpp_Token_Array array = text_data_to_token_array(scratch, data); + if (array.tokens != 0){ + Config *parsed = text_data_and_token_array_to_parse_data(scratch, file_name, data, array); + if (parsed != 0){ + success = true; + memset(project, 0, sizeof(*project)); + + // Set new project directory +{ + project->dir = project->dir_space; + String str = make_fixed_width_string(project->dir_space); + copy(&str, file_dir); + terminate_with_null(&str); + project->dir_len = str.size; +} + + // Read the settings from project.4coder + String str = {0}; + if (config_string_var(parsed, "extensions", 0, &str)){ + parse_extension_line_to_extension_list(str, &project->extension_list); + } - Cpp_Token_Array array; - array.count = 0; - array.max_count = (1 << 20)/sizeof(Cpp_Token); - array.tokens = push_array(scratch, Cpp_Token, array.max_count); + bool32 open_recursively = false; + if (config_bool_var(parsed, "open_recursively", 0, &open_recursively)){ + project->open_recursively = open_recursively; + } - Cpp_Keyword_Table kw_table = {0}; - Cpp_Keyword_Table pp_table = {0}; - lexer_keywords_default_init(scratch, &kw_table, &pp_table); - - Cpp_Lex_Data S = cpp_lex_data_init(false, kw_table, pp_table); - Cpp_Lex_Result result = cpp_lex_step(&S, mem, size + 1, HAS_NULL_TERM, &array, NO_OUT_LIMIT); - - if (result == LexResult_Finished){ - // Clear out current project - if (current_project.close_all_code_when_this_project_closes){ - close_all_files_with_extension(app, scratch, get_project_extensions(¤t_project)); - } - memset(¤t_project, 0, sizeof(current_project)); - current_project.loaded = true; - - // Set new project directory - { - current_project.dir = current_project.dir_space; - String str = make_fixed_width_string(current_project.dir_space); - copy(&str, project_dir); - terminate_with_null(&str); - current_project.dir_len = str.size; - } - - // Read the settings from project.4coder - for (int32_t i = 0; i < array.count; ++i){ - Config_Line config_line = read_config_line(array, &i, mem); - if (config_line.read_success){ - Config_Item item = get_config_item(config_line, mem, array); - - { - char str_space[512]; - String str = make_fixed_width_string(str_space); - if (config_string_var(item, "extensions", 0, &str)){ - if (str.size < sizeof(current_project.extension_list.space)){ - parse_extension_line_to_extension_list(str, ¤t_project.extension_list); - print_message(app, str.str, str.size); - print_message(app, "\n", 1); - } - else{ - print_message(app, literal("STRING TOO LONG!\n")); - } - } - } - - bool32 open_recursively = false; - if (config_bool_var(item, "open_recursively", 0, &open_recursively)){ - current_project.open_recursively = open_recursively; - } - - { #if defined(IS_WINDOWS) # define FKEY_COMMAND "fkey_command_win" #elif defined(IS_LINUX) @@ -210,139 +185,134 @@ load_project_from_data(Application_Links *app, Partition *scratch, #else # error no project configuration names for this platform #endif - - int32_t index = 0; - Config_Array_Reader array_reader = {0}; - if (config_array_var(item, FKEY_COMMAND, &index, &array_reader)){ - if (index >= 1 && index <= 16){ - Config_Item array_item = {0}; - int32_t item_index = 0; - - char space[256]; - String msg = make_fixed_width_string(space); - append(&msg, FKEY_COMMAND"["); - append_int_to_str(&msg, index); - append(&msg, "] = {"); - - for (config_array_next_item(&array_reader, &array_item); - config_array_good(&array_reader); - config_array_next_item(&array_reader, &array_item)){ - - if (item_index >= 4){ - break; - } - - append(&msg, "["); - append_int_to_str(&msg, item_index); - append(&msg, "] = "); - - bool32 read_string = false; - bool32 read_bool = false; - - char *dest_str = 0; - int32_t dest_str_size = 0; - - bool32 *dest_bool = 0; - - switch (item_index){ - case 0: - { - dest_str = current_project.fkey_commands[index-1].command; - dest_str_size = sizeof(current_project.fkey_commands[index-1].command); - read_string = true; - }break; - - case 1: - { - dest_str = current_project.fkey_commands[index-1].out; - dest_str_size = sizeof(current_project.fkey_commands[index-1].out); - read_string = true; - }break; - - case 2: - { - dest_bool = ¤t_project.fkey_commands[index-1].use_build_panel; - read_bool = true; - }break; - - case 3: - { - dest_bool = ¤t_project.fkey_commands[index-1].save_dirty_buffers; - read_bool = true; - }break; - } - - if (read_string){ - if (config_int_var(array_item, 0, 0, 0)){ - append(&msg, "NULL, "); - dest_str[0] = 0; - } - - char str_space[512]; - String str = make_fixed_width_string(str_space); - if (config_string_var(array_item, 0, 0, &str)){ - if (str.size < dest_str_size){ - string_interpret_escapes(str, dest_str); - append(&msg, dest_str); - append(&msg, ", "); - } - else{ - append(&msg, "STRING TOO LONG!, "); - } - } - } - - if (read_bool){ - if (config_bool_var(array_item, 0, 0, dest_bool)){ - if (*dest_bool){ - append(&msg, "true, "); - } - else{ - append(&msg, "false, "); - } - } - } - - item_index++; - } - - append(&msg, "}\n"); - print_message(app, msg.str, msg.size); - } - } - } + + for (int32_t i = 1; i <= 16; ++i){ + Config_Compound *compound = 0; + if (config_compound_var(parsed, FKEY_COMMAND, i, &compound)){ + Fkey_Command *command = &project->fkey_commands[i - 1]; + command->command[0] = 0; + command->out[0] = 0; + command->use_build_panel = false; + command->save_dirty_buffers = false; + + String cmd = {0}; + if (config_compound_string_member(parsed, compound, "cmd", 0, &cmd)){ + String dst = make_fixed_width_string(command->command); + append(&dst, cmd); + terminate_with_null(&dst); } - else if (config_line.error_str.str != 0){ - char space[2048]; - String str = make_fixed_width_string(space); - copy(&str, "WARNING: bad syntax in 4coder.config at "); - append(&str, config_line.error_str); - append(&str, "\n"); - print_message(app, str.str, str.size); + + String out = {0}; + if (config_compound_string_member(parsed, compound, "out", 1, &out)){ + String dst = make_fixed_width_string(command->out); + append(&dst, out); + terminate_with_null(&out); + } + + bool32 footer_panel = false; + if (config_compound_bool_member(parsed, compound, "footer_panel", 2, &footer_panel)){ + command->use_build_panel = footer_panel; + } + + bool32 save_dirty_buffers = false; + if (config_compound_bool_member(parsed, compound, "save_dirty_files", 3, &footer_panel)){ + command->save_dirty_buffers = save_dirty_buffers; } } - - if (current_project.close_all_files_when_project_opens){ - CString_Array extension_array = {0}; - close_all_files_with_extension(app, scratch, extension_array); - } - - // Open all project files - uint32_t flags = 0; - if (current_project.open_recursively){ - flags |= OpenAllFilesFlag_Recursive; - } - open_all_code_with_project_extensions_in_directory(app, project_dir, flags); - - // Set window title - char space[1024]; - String builder = make_fixed_width_string(space); - append(&builder, "4coder: "); - append(&builder, project_dir); - terminate_with_null(&builder); - set_window_title(app, builder.str); + } +} } + return(success); +} + +static bool32 +parse_project__nearest_file(Application_Links *app, Partition *arena, Project *project){ + bool32 success = false; + + String project_path = {0}; + Temp_Memory temp = begin_temp_memory(arena); + int32_t size = 32 << 10; + char *space = push_array(arena, char, size); + if (space != 0){ + project_path = make_string_cap(space, 0, size); + project_path.size = directory_get_hot(app, project_path.str, project_path.memory_size); + end_temp_memory(temp); + push_array(arena, char, project_path.size); + project_path.memory_size = project_path.size; + if (project_path.size == 0){ + print_message(app, literal("The hot directory is empty, cannot search for a project.\n")); + } + else{ + File_Name_Path_Data dump = dump_file_search_up_path(arena, project_path, make_lit_string("project.4coder")); + if (dump.data.str != 0){ + String project_root = dump.path; + remove_last_folder(&project_root); + success = parse_project__data(arena, dump.file_name, dump.data, project_root, project); + } + else{ + char message_space[512]; + String message = make_fixed_width_string(message_space); + append(&message, "Did not find project.4coder. "); + if (current_project.dir != 0){ + append(&message, "Continuing with: "); + append(&message, current_project.dir); + } + else{ + append(&message, "Continuing without a project"); + } + append(&message, '\n'); + print_message(app, message.str, message.size); + } + } + } + end_temp_memory(temp); + + return(success); +} + +static void +set_current_project(Application_Links *app, Partition *scratch, Project *project){ + memcpy(¤t_project, &project, sizeof(current_project)); + + String file_dir = make_string(project->dir_space, project->dir_len); + + // Open all project files + uint32_t flags = 0; + if (current_project.open_recursively){ + flags |= OpenAllFilesFlag_Recursive; + } + CString_Array array = project_get_extensions(¤t_project); + open_all_files_in_directory_with_extension(app, scratch, file_dir, array, flags); + + // Set window title + char space[1024]; + String builder = make_fixed_width_string(space); + append(&builder, "4coder: "); + append(&builder, file_dir); + terminate_with_null(&builder); + set_window_title(app, builder.str); +} + +static void +set_current_project_from_data(Application_Links *app, Partition *scratch, + String file_name, String data, String file_dir){ + Temp_Memory temp = begin_temp_memory(scratch); + Project project = {0}; + if (parse_project__data(scratch, file_name, data, file_dir, + &project)){ + set_current_project(app, scratch, &project); + } + end_temp_memory(temp); +} + +static void +set_project_from_nearest_project_file(Application_Links *app, Partition *scratch){ + Temp_Memory temp = begin_temp_memory(scratch); + Project project = {0}; + if (parse_project__nearest_file(app, scratch, &project)){ + set_current_project(app, scratch, &project); + } end_temp_memory(temp); } @@ -403,22 +373,22 @@ exec_project_fkey_command(Application_Links *app, int32_t command_ind){ CUSTOM_COMMAND_SIG(close_all_code) CUSTOM_DOC("Closes any buffer with a filename ending with an extension configured to be recognized as a code file type.") { - CString_Array extensions = get_project_extensions(¤t_project); + CString_Array extensions = project_get_extensions(¤t_project); close_all_files_with_extension(app, &global_part, extensions); } CUSTOM_COMMAND_SIG(open_all_code) CUSTOM_DOC("Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.") { - CString_Array extensions = get_project_extensions(¤t_project); - open_all_files_with_extension_in_hot(app, &global_part, extensions, 0); + CString_Array extensions = project_get_extensions(¤t_project); + open_all_files_in_hot_with_extension(app, &global_part, extensions, 0); } CUSTOM_COMMAND_SIG(open_all_code_recursive) CUSTOM_DOC("Works as open_all_code but also runs in all subdirectories.") { - CString_Array extensions = get_project_extensions(¤t_project); - open_all_files_with_extension_in_hot(app, &global_part, extensions, OpenAllFilesFlag_Recursive); + CString_Array extensions = project_get_extensions(¤t_project); + open_all_files_in_hot_with_extension(app, &global_part, extensions, OpenAllFilesFlag_Recursive); } /////////////////////////////// @@ -426,72 +396,8 @@ CUSTOM_DOC("Works as open_all_code but also runs in all subdirectories.") CUSTOM_COMMAND_SIG(load_project) CUSTOM_DOC("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.") { - Partition *part = &global_part; - - Temp_Memory temp = begin_temp_memory(part); save_all_dirty_buffers(app); - char space[512]; - String project_path = make_fixed_width_string(space); - project_path.size = directory_get_hot(app, project_path.str, project_path.memory_size); - if (project_path.size >= project_path.memory_size){ - print_message(app, literal("Hot directory longer than hard coded path buffer.\n")); - } - else if (project_path.size == 0){ - print_message(app, literal("The hot directory is empty, cannot search for a project.\n")); - } - else{ - String data = dump_file_search_up_path(part, project_path, make_lit_string("project.4coder")); - if (data.str != 0){ - load_project_from_data(app, part, data.str, data.size, project_path); - } - else{ - char message_space[512]; - String message = make_fixed_width_string(message_space); - append(&message, "Did not find project.4coder. "); - if (current_project.dir != 0){ - append(&message, "Continuing with: "); - append(&message, current_project.dir); - } - else{ - append(&message, "Continuing without a project"); - } - append(&message, '\n'); - print_message(app, message.str, message.size); - } - } - end_temp_memory(temp); -} - -CUSTOM_COMMAND_SIG(reload_current_project) -CUSTOM_DOC("If a project file has already been loaded, reloads the same file. Useful for when the project configuration is changed.") -{ - Partition *part = &global_part; - - if (current_project.loaded){ - save_all_dirty_buffers(app); - char space[512]; - String project_path = make_fixed_width_string(space); - append(&project_path, make_string(current_project.dir, current_project.dir_len)); - if (project_path.size == 0 || !char_is_slash(project_path.str[project_path.size - 1])){ - append(&project_path, "/"); - } - append(&project_path, "project.4coder"); - terminate_with_null(&project_path); - - FILE *file = fopen(project_path.str, "rb"); - if (file != 0){ - Temp_Memory temp = begin_temp_memory(part); - String data = dump_file_handle(part, file); - if (data.str != 0){ - load_project_from_data(app, part, data.str, data.size, project_path); - } - end_temp_memory(temp); - fclose(file); - } - else{ - print_message(app, literal("project.4coder file not found. Project configuration unchanged.")); - } - } + set_project_from_nearest_project_file(app, &global_part); } CUSTOM_COMMAND_SIG(project_fkey_command) diff --git a/4coder_project_commands.h b/4coder_project_commands.h index bf7794dd..3b486110 100644 --- a/4coder_project_commands.h +++ b/4coder_project_commands.h @@ -30,9 +30,6 @@ struct Project{ Extension_List extension_list; Fkey_Command fkey_commands[16]; - bool32 close_all_code_when_this_project_closes; - bool32 close_all_files_when_project_opens; - bool32 open_recursively; bool32 loaded; diff --git a/meta/4ed_metagen.cpp b/meta/4ed_metagen.cpp index 371dacb3..74d71db4 100644 --- a/meta/4ed_metagen.cpp +++ b/meta/4ed_metagen.cpp @@ -186,7 +186,7 @@ generate_style(){ char filename_4coder[] = STYLE_FILE; char filename_4ed[] = "4ed_generated_style.h"; - String out = str_alloc(10 << 20);; + String out = str_alloc(10 << 20); enum_begin(&out, "Style_Tag"); { @@ -684,7 +684,6 @@ generate_remapping_code_and_data(){ bind(mappings, 'k', MDFR_CTRL, interactive_kill_buffer); bind(mappings, 'i', MDFR_CTRL, interactive_switch_buffer); bind(mappings, 'h', MDFR_CTRL, project_go_to_root_directory); - bind(mappings, 'H', MDFR_CTRL, reload_current_project); bind(mappings, 'S', MDFR_CTRL, save_all_dirty_buffers); bind(mappings, 'c', MDFR_ALT, open_color_tweaker); @@ -880,7 +879,6 @@ generate_remapping_code_and_data(){ bind(mappings, 'k', MDFR_CMND, interactive_kill_buffer); bind(mappings, 'i', MDFR_CMND, interactive_switch_buffer); bind(mappings, 'h', MDFR_CMND, project_go_to_root_directory); - bind(mappings, 'H', MDFR_CMND, reload_current_project); bind(mappings, 'S', MDFR_CMND, save_all_dirty_buffers); bind(mappings, 'c', MDFR_CTRL, open_color_tweaker);