Moved the entire project system over to the new config parsing base
This commit is contained in:
parent
b4607ec3ad
commit
cb1273d4cb
|
@ -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;
|
||||
success = config_evaluate_rvalue(config, assignment, assignment->r, type, var_out);
|
||||
}
|
||||
return(success);
|
||||
}
|
||||
|
||||
case ConfigRValueType_Integer:
|
||||
{
|
||||
*(int32_t*)out = r->integer;
|
||||
}break;
|
||||
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));
|
||||
}
|
||||
|
||||
case ConfigRValueType_String:
|
||||
{
|
||||
*(String*)out = r->string;
|
||||
}break;
|
||||
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));
|
||||
}
|
||||
|
||||
case ConfigRValueType_Character:
|
||||
{
|
||||
*(char*)out = r->character;
|
||||
}break;
|
||||
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));
|
||||
}
|
||||
|
||||
case ConfigRValueType_Compound:
|
||||
{
|
||||
*(Config_Compound**)out = r->compound;
|
||||
}break;
|
||||
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;
|
||||
|
||||
|
@ -852,64 +1059,6 @@ config_parse__data(Partition *scratch,
|
|||
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);
|
||||
|
||||
if (!success){
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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},
|
||||
};
|
||||
|
|
|
@ -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 <stdio.h>
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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 <stdio.h>
|
||||
|
||||
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;
|
||||
|
|
|
@ -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));
|
||||
|
||||
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);
|
||||
// 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;
|
||||
}
|
||||
|
||||
Cpp_Keyword_Table kw_table = {0};
|
||||
Cpp_Keyword_Table pp_table = {0};
|
||||
lexer_keywords_default_init(scratch, &kw_table, &pp_table);
|
||||
// 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_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);
|
||||
bool32 open_recursively = false;
|
||||
if (config_bool_var(parsed, "open_recursively", 0, &open_recursively)){
|
||||
project->open_recursively = open_recursively;
|
||||
}
|
||||
|
||||
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)
|
||||
|
@ -211,138 +186,133 @@ load_project_from_data(Application_Links *app, Partition *scratch,
|
|||
# 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;
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue