From 1c513033cd0cfd3a851252581870d62d39b3b6f5 Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Sat, 3 Sep 2016 14:57:42 -0400 Subject: [PATCH] most systems now relying on parse context --- 4coder_API.html | 2 +- 4coder_types.h | 5 +- 4ed_metagen.cpp | 346 ++++++++++++++--------------------- TODO.txt | 1 + power/4coder_experiments.cpp | 2 +- 5 files changed, 145 insertions(+), 211 deletions(-) diff --git a/4coder_API.html b/4coder_API.html index 34327fca..7c2b7611 100644 --- a/4coder_API.html +++ b/4coder_API.html @@ -2208,7 +2208,7 @@ GUI_Scroll_Vars scroll_vars;
buffer_id
-
If this is not a null summary, and this view looks at a buffer, this is the id of the buffer.
+
If this is not a null summary, then this is the id of the buffer this view currently sees.
lock_flags
diff --git a/4coder_types.h b/4coder_types.h index 3033b9b5..e2d88aac 100644 --- a/4coder_types.h +++ b/4coder_types.h @@ -614,8 +614,7 @@ struct Buffer_Summary{ /* DOC(View_Summary acts as a handle to a view and describes the state of the view.) DOC_SEE(Access_Flag) -DOC_SEE(Full_Cursor) -*/ +DOC_SEE(Full_Cursor) */ struct View_Summary{ /* DOC( This field indicates whether the View_Summary describes a view that is open in 4coder. @@ -627,7 +626,7 @@ struct View_Summary{ If this is a null summary then view_id is 0. ) */ int32_t view_id; - /* DOC(If this is not a null summary, and this view looks at a buffer, this is the id of the buffer.) */ + /* DOC(If this is not a null summary, then this is the id of the buffer this view currently sees.) */ int32_t buffer_id; /* DOC(If this is not a null summary, this field contains flags describing the protection status of the view.) diff --git a/4ed_metagen.cpp b/4ed_metagen.cpp index f9e2cc8f..e5f5df21 100644 --- a/4ed_metagen.cpp +++ b/4ed_metagen.cpp @@ -28,6 +28,11 @@ typedef struct Out_Context{ String *str; } Out_Context; +static String +get_string(char *data, int32_t start, int32_t end){ + return(make_string(data + start, end - start)); +} + static int32_t begin_file_out(Out_Context *out_context, char *filename, String *out){ int32_t r = 0; @@ -355,6 +360,7 @@ typedef enum Item_Type{ Item_Typedef, Item_Struct, Item_Union, + Item_Enum, } Item_Type; typedef struct Item_Node{ @@ -688,24 +694,6 @@ get_lexeme(Cpp_Token token, char *code){ return(str); } -static int32_t -get_type_doc_string(char *data, Cpp_Token *tokens, Cpp_Token *token, - String *doc_string){ - int32_t result = false; - - if (token > tokens){ - Cpp_Token *prev_token = token - 1; - if (prev_token->type == CPP_TOKEN_COMMENT){ - *doc_string = get_lexeme(*prev_token, data); - if (check_and_fix_docs(doc_string)){ - result = true; - } - } - } - - return(result); -} - static Item_Set allocate_item_set(Partition *part, int32_t count){ Item_Set item_set = {0}; @@ -720,14 +708,16 @@ typedef struct Parse_Context{ Cpp_Token *token_s; Cpp_Token *token_e; Cpp_Token *token; + char *data; } Parse_Context; static Parse_Context -setup_parse_context(Cpp_Token_Stack stack){ +setup_parse_context(char *data, Cpp_Token_Stack stack){ Parse_Context context; context.token_s = stack.tokens; context.token_e = stack.tokens + stack.count; context.token = context.token_s; + context.data = data; return(context); } @@ -782,69 +772,57 @@ set_token(Parse_Context *context, Cpp_Token *token){ return(result); } -// NOTE(allen): This should not be here any more. It was written -// simply to transition the system to the Parse_Context. -static int32_t TRANSITIONAL_INDEX; -static int32_t* -get_index(Parse_Context *context, Cpp_Token *token){ - if (token) set_token(context, token); - TRANSITIONAL_INDEX = (int32_t)(context->token - context->token_s); - return(&TRANSITIONAL_INDEX); -} - -static Cpp_Token** -get_ptr(Parse_Context *context){ - Cpp_Token **result = &context->token; +static int32_t +get_doc_string_from_prev(Parse_Context *context, String *doc_string){ + int32_t result = false; + + if (can_back_step(context)){ + Cpp_Token *prev_token = get_token(context) - 1; + if (prev_token->type == CPP_TOKEN_COMMENT){ + *doc_string = get_lexeme(*prev_token, context->data); + if (check_and_fix_docs(doc_string)){ + result = true; + } + } + } + return(result); } static int32_t -get_count(Parse_Context *context){ - int32_t result = (int32_t)(context->token_e - context->token_s); - return(result); -} +struct_parse(Partition *part, int32_t is_struct, + Parse_Context *context, Item_Node *top_member); static int32_t -parse_struct(Partition *part, int32_t is_struct, - char *data, Cpp_Token *tokens, int32_t count, - Cpp_Token **token_ptr, - Item_Node *top_member); - -static int32_t -parse_struct_member(Partition *part, - char *data, Cpp_Token *tokens, int32_t count, - Cpp_Token **token_ptr, - Item_Node *member){ +struct_parse_member(Partition *part, Parse_Context *context, Item_Node *member){ int32_t result = false; - Cpp_Token *token = *token_ptr; - int32_t i = (int32_t)(token - tokens); + Cpp_Token *token = get_token(context); String doc_string = {0}; - get_type_doc_string(data, tokens, token, &doc_string); + get_doc_string_from_prev(context, &doc_string); - int32_t start_i = i; Cpp_Token *start_token = token; - for (; i < count; ++i, ++token){ + for (; (token = get_token(context)) != 0; get_next_token(context)){ if (token->type == CPP_TOKEN_SEMICOLON){ break; } } - if (i < count){ - Cpp_Token *token_j = token; - + if (token){ + String name = {0}; + Cpp_Token *token_j = 0; int32_t nest_level = 0; - for (int32_t j = i; j > start_i; --j, --token_j){ + + for (; (token_j = get_token(context)) > start_token; get_prev_token(context)){ if (token_j->type == CPP_TOKEN_BRACKET_CLOSE){ ++nest_level; } else if (token_j->type == CPP_TOKEN_BRACKET_OPEN){ --nest_level; if (nest_level < 0){ - j = start_i; break; } } @@ -856,21 +834,14 @@ parse_struct_member(Partition *part, } } - String name = make_string(data + token_j->start, token_j->size); - name = skip_chop_whitespace(name); + name = skip_chop_whitespace(get_lexeme(*token_j, context->data)); - int32_t type_start = start_token->start; - int32_t type_end = token_j->start; - String type = make_string(data + type_start, type_end - type_start); - type = skip_chop_whitespace(type); + String type = skip_chop_whitespace(get_string(context->data, start_token->start, token_j->start)); - type_start = token_j->start + token_j->size; - type_end = token->start; + String type_postfix = + skip_chop_whitespace(get_string(context->data, token_j->start + token_j->size, token->start)); - String type_postfix = make_string(data + type_start, type_end - type_start); - type_postfix = skip_chop_whitespace(type_postfix); - - ++token; + set_token(context, token+1); result = true; member->name = name; @@ -881,28 +852,23 @@ parse_struct_member(Partition *part, member->next_sibling = 0; } - *token_ptr = token; - return(result); } static Item_Node* -parse_struct_next_member(Partition *part, - char *data, Cpp_Token *tokens, int32_t count, - Cpp_Token **token_ptr){ +struct_parse_next_member(Partition *part, Parse_Context *context){ Item_Node *result = 0; - Cpp_Token *token = *token_ptr; - int32_t i = (int32_t)(token - tokens); + Cpp_Token *token = 0; - for (; i < count; ++i, ++token){ + for (; (token = get_token(context)) != 0; get_next_token(context)){ if (token->type == CPP_TOKEN_IDENTIFIER || (token->flags & CPP_TFLAG_IS_KEYWORD)){ - String lexeme = make_string(data + token->start, token->size); + String lexeme = get_lexeme(*token, context->data); if (match_ss(lexeme, make_lit_string("struct"))){ Item_Node *member = push_struct(part, Item_Node); - if (parse_struct(part, true, data, tokens, count, &token, member)){ + if (struct_parse(part, true, context, member)){ result = member; break; } @@ -912,7 +878,7 @@ parse_struct_next_member(Partition *part, } else if (match_ss(lexeme, make_lit_string("union"))){ Item_Node *member = push_struct(part, Item_Node); - if (parse_struct(part, false, data, tokens, count, &token, member)){ + if (struct_parse(part, false, context, member)){ result = member; break; } @@ -922,7 +888,7 @@ parse_struct_next_member(Partition *part, } else{ Item_Node *member = push_struct(part, Item_Node); - if (parse_struct_member(part, data, tokens, count, &token, member)){ + if (struct_parse_member(part, context, member)){ result = member; break; } @@ -936,48 +902,39 @@ parse_struct_next_member(Partition *part, } } - *token_ptr = token; - return(result); } static int32_t -parse_struct(Partition *part, int32_t is_struct, - char *data, Cpp_Token *tokens, int32_t count, - Cpp_Token **token_ptr, - Item_Node *top_member){ +struct_parse(Partition *part, int32_t is_struct, + Parse_Context *context, Item_Node *top_member){ int32_t result = false; - Cpp_Token *token = *token_ptr; - int32_t i = (int32_t)(token - tokens); + Cpp_Token *start_token = get_token(context); + Cpp_Token *token = 0; String doc_string = {0}; - get_type_doc_string(data, tokens, token, &doc_string); + get_doc_string_from_prev(context, &doc_string); - int32_t start_i = i; - - for (; i < count; ++i, ++token){ + for (; (token = get_token(context)) != 0; get_next_token(context)){ if (token->type == CPP_TOKEN_BRACE_OPEN){ break; } } - if (i < count){ + if (token){ Cpp_Token *token_j = token; - int32_t j = i; - for (; j > start_i; --j, --token_j){ + for (; (token_j = get_token(context)) > start_token; get_prev_token(context)){ if (token_j->type == CPP_TOKEN_IDENTIFIER){ break; } } String name = {0}; - - if (j != start_i){ - name = make_string(data + token_j->start, token_j->size); - name = skip_chop_whitespace(name); + if (token_j != start_token){ + name = skip_chop_whitespace(get_lexeme(*token_j, context->data)); } String type = {0}; @@ -988,17 +945,15 @@ parse_struct(Partition *part, int32_t is_struct, type = make_lit_string("union"); } - ++token; - Item_Node *new_member = - parse_struct_next_member(part, data, tokens, count, &token); + set_token(context, token+1); + Item_Node *new_member = struct_parse_next_member(part, context); if (new_member){ top_member->first_child = new_member; Item_Node *head_member = new_member; for(;;){ - new_member = - parse_struct_next_member(part, data, tokens, count, &token); + new_member = struct_parse_next_member(part, context); if (new_member){ head_member->next_sibling = new_member; head_member = new_member; @@ -1009,14 +964,19 @@ parse_struct(Partition *part, int32_t is_struct, } } - i = (int32_t)(token - tokens); - for (; i < count; ++i, ++token){ + for (; (token = get_token(context)) != 0; get_next_token(context)){ if (token->type == CPP_TOKEN_SEMICOLON){ break; } } ++token; + if (is_struct){ + top_member->t = Item_Struct; + } + else{ + top_member->t = Item_Union; + } top_member->name = name; top_member->type = type; top_member->doc_string = doc_string; @@ -1025,140 +985,127 @@ parse_struct(Partition *part, int32_t is_struct, result = true; } - *token_ptr = token; - return(result); } static int32_t -parse_typedef(char *data, Cpp_Token *tokens, int32_t count, - Cpp_Token **token_ptr, Item_Set item_set, int32_t item_index){ +typedef_parse(Parse_Context *context, Item_Set item_set, int32_t item_index){ int32_t result = false; - Cpp_Token *token = *token_ptr; - int32_t i = (int32_t)(token - tokens); + Cpp_Token *token = get_token(context); String doc_string = {0}; - get_type_doc_string(data, tokens, token, &doc_string); + get_doc_string_from_prev(context, &doc_string); - int32_t start_i = i; Cpp_Token *start_token = token; - for (; i < count; ++i, ++token){ + for (; (token = get_token(context)) != 0; get_next_token(context)){ if (token->type == CPP_TOKEN_SEMICOLON){ break; } } - if (i < count){ + if (token){ Cpp_Token *token_j = token; - for (int32_t j = i; j > start_i; --j, --token_j){ + for (; (token_j = get_token(context)) > start_token; get_prev_token(context)){ if (token_j->type == CPP_TOKEN_IDENTIFIER){ break; } } - String name = make_string(data + token_j->start, token_j->size); - name = skip_chop_whitespace(name); + String name = get_lexeme(*token_j, context->data); - int32_t type_start = start_token->start + start_token->size; - int32_t type_end = token_j->start; - String type = make_string(data + type_start, type_end - type_start); - type = skip_chop_whitespace(type); + String type = skip_chop_whitespace( + get_string(context->data, start_token->start + start_token->size, token_j->start) + ); - result = true; + item_set.items[item_index].t = Item_Typedef; item_set.items[item_index].type = type; item_set.items[item_index].name = name; item_set.items[item_index].doc_string = doc_string; + result = true; } - *token_ptr = token; + set_token(context, token); return(result); } static int32_t -parse_enum(Partition *part, char *data, - Cpp_Token *tokens, int32_t count, - Cpp_Token **token_ptr, +enum_parse(Partition *part, Parse_Context *context, Item_Set item_set, int32_t item_index){ int32_t result = false; - Cpp_Token *token = *token_ptr; - int32_t i = (int32_t)(token - tokens); - String doc_string = {0}; - get_type_doc_string(data, tokens, token, &doc_string); + get_doc_string_from_prev(context, &doc_string); - int32_t start_i = i; + Cpp_Token *start_token = get_token(context); + Cpp_Token *token = 0; - for (; i < count; ++i, ++token){ + for (; (token = get_token(context)) != 0; get_next_token(context)){ if (token->type == CPP_TOKEN_BRACE_OPEN){ break; } } - if (i < count){ - Cpp_Token *token_j = token; + if (token){ + String name = {0}; + Cpp_Token *token_j = 0; - for (int32_t j = i; j > start_i; --j, --token_j){ + for (; (token_j = get_token(context)) != 0; get_prev_token(context)){ if (token_j->type == CPP_TOKEN_IDENTIFIER){ break; } } - String name = make_string(data + token_j->start, token_j->size); - name = skip_chop_whitespace(name); + name = get_lexeme(*token_j, context->data); - for (; i < count; ++i, ++token){ + set_token(context, token); + for (; (token = get_token(context)) > start_token; get_next_token(context)){ if (token->type == CPP_TOKEN_BRACE_OPEN){ break; } } - if (i < count){ + if (token){ Item_Node *first_member = 0; Item_Node *head_member = 0; - for (; i < count; ++i, ++token){ + for (; (token = get_token(context)) != 0; get_next_token(context)){ if (token->type == CPP_TOKEN_BRACE_CLOSE){ break; } else if (token->type == CPP_TOKEN_IDENTIFIER){ String doc_string = {0}; - get_type_doc_string(data, tokens, token, &doc_string); - - String name = make_string(data + token->start, token->size); - name = skip_chop_whitespace(name); - + String name = {0}; String value = {0}; + get_doc_string_from_prev(context, &doc_string); - ++i; - ++token; + name = get_lexeme(*token, context->data); - if (token->type == CPP_TOKEN_EQ){ - Cpp_Token *start_token = token; - - for (; i < count; ++i, ++token){ - if (token->type == CPP_TOKEN_COMMA || - token->type == CPP_TOKEN_BRACE_CLOSE){ - break; + token = get_next_token(context); + + if (token){ + if (token->type == CPP_TOKEN_EQ){ + Cpp_Token *start_token = token; + + for (; (token = get_token(context)) != 0; get_next_token(context)){ + if (token->type == CPP_TOKEN_COMMA || + token->type == CPP_TOKEN_BRACE_CLOSE){ + break; + } } + + value = skip_chop_whitespace( + get_string(context->data, start_token->start + start_token->size, token->start) + ); + + get_prev_token(context); + } + else{ + get_prev_token(context); } - - int32_t val_start = start_token->start + start_token->size; - int32_t val_end = token->start; - - value = make_string(data + val_start, val_end - val_start); - value = skip_chop_whitespace(value); - - --i; - --token; - } - else{ - --i; - --token; } Item_Node *new_member = push_struct(part, Item_Node); @@ -1178,25 +1125,23 @@ parse_enum(Partition *part, char *data, } } - if (i < count){ - for (; i < count; ++i, ++token){ + if ((token = get_token(context)) != 0){ + for (; (token = get_token(context)) != 0; get_next_token(context)){ if (token->type == CPP_TOKEN_BRACE_CLOSE){ break; } } - ++i; - ++token; + get_next_token(context); - result = true; + item_set.items[item_index].t = Item_Enum; item_set.items[item_index].name = name; item_set.items[item_index].doc_string = doc_string; item_set.items[item_index].first_child = first_member; + result = true; } } } - *token_ptr = token; - return(result); } @@ -1735,11 +1680,6 @@ string_function_marker_check(String lexeme){ return(result); } -static String -get_string(char *data, int32_t start, int32_t end){ - return(make_string(data + start, end - start)); -} - static void print_str(FILE *file, String str){ if (str.size > 0){ @@ -1897,7 +1837,7 @@ generate_custom_headers(){ Cpp_Token *token = 0; - Parse_Context context_ = setup_parse_context(string_parse.tokens); + Parse_Context context_ = setup_parse_context(data, string_parse.tokens); Parse_Context *context = &context_; for (; (token = get_token(context)) != 0; get_next_token(context)){ @@ -1930,7 +1870,7 @@ generate_custom_headers(){ char *data = code->str; - Parse_Context context_ = setup_parse_context(*token_stack); + Parse_Context context_ = setup_parse_context(data, *token_stack); Parse_Context *context = &context_; String cpp_name = {0}; @@ -1992,7 +1932,7 @@ generate_custom_headers(){ Cpp_Token *tokens = parse->tokens.tokens; Cpp_Token *token = tokens; - Parse_Context context_ = setup_parse_context(parse->tokens); + Parse_Context context_ = setup_parse_context(data, parse->tokens); Parse_Context *context = &context_; for (int32_t i = 0; i < count; ++i, ++token){ @@ -2019,7 +1959,7 @@ generate_custom_headers(){ char *data = parse->code.str; - Parse_Context context_ = setup_parse_context(parse->tokens); + Parse_Context context_ = setup_parse_context(data, parse->tokens); Parse_Context *context = &context_; // NOTE(allen): Header Parse @@ -2235,58 +2175,52 @@ generate_custom_headers(){ char *data = type_parse[J].code.str; Cpp_Token_Stack types_tokens = type_parse[J].tokens; - int32_t count = types_tokens.count; - Cpp_Token *tokens = types_tokens.tokens; - Cpp_Token *token = tokens; + Cpp_Token *token = types_tokens.tokens; - for (int32_t i = 0; i < count; ++i, ++token){ - Assert(i == (int32_t)(token - tokens)); + Parse_Context context_ = setup_parse_context(data, types_tokens); + Parse_Context *context = &context_; + + for (; (token = get_token(context)) != 0; get_next_token(context)){ if (!(token->flags & CPP_TFLAG_PP_BODY) && (token->type == CPP_TOKEN_KEY_TYPE_DECLARATION || token->type == CPP_TOKEN_IDENTIFIER)){ - String lexeme = make_string(data + token->start, token->size); + String lexeme = get_lexeme(*token, data); int32_t match_index = 0; if (string_set_match(type_spec_keys, ArrayCount(type_spec_keys), lexeme, &match_index)){ switch (match_index){ case 0: //typedef { - if (parse_typedef(data, tokens, count, &token, - typedef_set, typedef_index)){ + set_token(context, token); + if (typedef_parse(context, typedef_set, typedef_index)){ ++typedef_index; } - i = (int32_t)(token - tokens); }break; case 1: case 2: //struct/union { - if (parse_struct(part, (match_index == 1), - data, tokens, count, &token, - struct_set.items + struct_index)){ + set_token(context, token); + if (struct_parse(part, (match_index == 1), + context, struct_set.items + struct_index)){ ++struct_index; } - i = (int32_t)(token - tokens); }break; case 3: //ENUM { - if (parse_enum(part, data, - tokens, count, &token, - enum_set, enum_index)){ + set_token(context, token); + if (enum_parse(part, context, enum_set, enum_index)){ ++enum_index; } - i = (int32_t)(token - tokens); }break; case 4: //FLAGENUM { - if (parse_enum(part, data, - tokens, count, &token, - flag_set, flag_index)){ + set_token(context, token); + if (enum_parse(part, context, flag_set, flag_index)){ ++flag_index; } - i = (int32_t)(token - tokens); }break; } } diff --git a/TODO.txt b/TODO.txt index 2de1b1f6..100b6ec5 100644 --- a/TODO.txt +++ b/TODO.txt @@ -96,6 +96,7 @@ ; [] hook on exit ; [] read only files ; [] occasionally missing the (!) mark on files on windows +; [] don't execute frames on events dealing only with ctrl/alt/shift ; ; TODOS diff --git a/power/4coder_experiments.cpp b/power/4coder_experiments.cpp index 4e0640d9..cc9e68d5 100644 --- a/power/4coder_experiments.cpp +++ b/power/4coder_experiments.cpp @@ -259,7 +259,7 @@ CUSTOM_COMMAND_SIG(mark_matching_brace){ finished: if (found_result){ - app->view_set_mark(app, &view, seek_pos(result)); + app->view_set_mark(app, &view, seek_pos(result+1)); } }