This is an 'ambiguous' token type because it requires
diff --git a/4cpp_lexer_types.h b/4cpp_lexer_types.h
index 30ba13f9..2abf182e 100644
--- a/4cpp_lexer_types.h
+++ b/4cpp_lexer_types.h
@@ -16,9 +16,7 @@
#define struct_internal struct
#endif
-/* DOC(A Cpp_Token_Type classifies a token to make parsing easier. Some types are not
-actually output by the lexer, but exist because parsers will also make use of token
-types in their own output.) */
+/* DOC(A Cpp_Token_Type classifies a token to make parsing easier. Some types are not actually output by the lexer, but exist because parsers will also make use of token types in their own output.) */
ENUM(uint32_t, Cpp_Token_Type){
CPP_TOKEN_JUNK = 0,
diff --git a/4ed.cpp b/4ed.cpp
index 8e61daa4..7ad73be3 100644
--- a/4ed.cpp
+++ b/4ed.cpp
@@ -12,7 +12,7 @@
// App Structs
#define DEFAULT_DISPLAY_WIDTH 672
-#define DEFAULT_MINIMUM_BASE_DISPLAY_WIDTH 450
+#define DEFAULT_MINIMUM_BASE_DISPLAY_WIDTH 550
typedef enum App_State{
APP_STATE_EDIT,
diff --git a/4ed_file_view.cpp b/4ed_file_view.cpp
index b58c4204..4a359957 100644
--- a/4ed_file_view.cpp
+++ b/4ed_file_view.cpp
@@ -975,15 +975,23 @@ file_allocate_wrap_positions_as_needed(System_Functions *system, General_Memory
file_allocate_metadata_as_needed(system, general, &file->state.buffer, (void**)&file->state.wrap_positions, &file->state.wrap_position_max, min_amount, sizeof(f32));
}
+struct Code_Wrap_X{
+ f32 base_x;
+ f32 paren_nesting[32];
+ i32 paren_safe_top;
+ i32 paren_top;
+};
+globalvar Code_Wrap_X null_wrap_x = {0};
+
struct Code_Wrap_State{
Cpp_Token_Array token_array;
Cpp_Token *token_ptr;
Cpp_Token *end_token;
- f32 base_x;
- f32 paren_nesting[32];
- i32 paren_safe_top;
- i32 paren_top;
+ Code_Wrap_X wrap_x;
+
+ b32 in_pp_body;
+ Code_Wrap_X plane_wrap_x;
i32 *line_starts;
i32 line_index;
@@ -1028,8 +1036,8 @@ wrap_state_set_i(Code_Wrap_State *state, i32 i){
internal void
wrap_state_set_top(Code_Wrap_State *state, f32 line_shift){
- if (state->paren_nesting[state->paren_safe_top] > line_shift){
- state->paren_nesting[state->paren_safe_top] = line_shift;
+ if (state->wrap_x.paren_nesting[state->wrap_x.paren_safe_top] > line_shift){
+ state->wrap_x.paren_nesting[state->wrap_x.paren_safe_top] = line_shift;
}
}
@@ -1056,9 +1064,24 @@ wrap_state_consume_token(Code_Wrap_State *state, i32 fixed_end_point){
state->consume_newline = 0;
}
+ if (state->in_pp_body){
+ if (!(state->token_ptr->flags & CPP_TFLAG_PP_BODY)){
+ state->in_pp_body = 0;
+ state->wrap_x = state->plane_wrap_x;
+ }
+ }
+
+ if (!state->in_pp_body){
+ if (state->token_ptr->flags & CPP_TFLAG_PP_DIRECTIVE){
+ state->in_pp_body = 1;
+ state->plane_wrap_x = state->wrap_x;
+ state->wrap_x = null_wrap_x;
+ }
+ }
+
b32 skipping_whitespace = 0;
if (i >= state->next_line_start){
- state->x = state->paren_nesting[state->paren_safe_top];
+ state->x = state->wrap_x.paren_nesting[state->wrap_x.paren_safe_top];
skipping_whitespace = 1;
}
@@ -1128,42 +1151,42 @@ wrap_state_consume_token(Code_Wrap_State *state, i32 fixed_end_point){
switch (state->token_ptr->type){
case CPP_TOKEN_BRACE_OPEN:
{
- state->paren_nesting[state->paren_safe_top] += state->tab_indent_amount;
+ state->wrap_x.paren_nesting[state->wrap_x.paren_safe_top] += state->tab_indent_amount;
}break;
case CPP_TOKEN_BRACE_CLOSE:
{
- state->paren_nesting[state->paren_safe_top] -= state->tab_indent_amount;
+ state->wrap_x.paren_nesting[state->wrap_x.paren_safe_top] -= state->tab_indent_amount;
}break;
case CPP_TOKEN_PARENTHESE_OPEN:
case CPP_TOKEN_BRACKET_OPEN:
{
- ++state->paren_top;
+ ++state->wrap_x.paren_top;
- i32 top = state->paren_top;
- if (top >= ArrayCount(state->paren_nesting)){
- top = ArrayCount(state->paren_nesting) - 1;
+ i32 top = state->wrap_x.paren_top;
+ if (top >= ArrayCount(state->wrap_x.paren_nesting)){
+ top = ArrayCount(state->wrap_x.paren_nesting) - 1;
}
- state->paren_safe_top = top;
+ state->wrap_x.paren_safe_top = top;
- state->paren_nesting[top] = state->x;
+ state->wrap_x.paren_nesting[top] = state->x;
}break;
case CPP_TOKEN_PARENTHESE_CLOSE:
case CPP_TOKEN_BRACKET_CLOSE:
{
- --state->paren_top;
+ --state->wrap_x.paren_top;
- if (state->paren_top < 0){
- state->paren_top = 0;
+ if (state->wrap_x.paren_top < 0){
+ state->wrap_x.paren_top = 0;
}
- i32 top = state->paren_top;
- if (top >= ArrayCount(state->paren_nesting)){
- top = ArrayCount(state->paren_nesting) - 1;
+ i32 top = state->wrap_x.paren_top;
+ if (top >= ArrayCount(state->wrap_x.paren_nesting)){
+ top = ArrayCount(state->wrap_x.paren_nesting) - 1;
}
- state->paren_safe_top = top;
+ state->wrap_x.paren_safe_top = top;
}break;
}
@@ -1332,20 +1355,20 @@ stickieness_guess(Cpp_Token_Type type, Cpp_Token_Type other_type, u16 flags, u16
internal f32
get_current_shift(Code_Wrap_State *wrap_state, i32 next_line_start, b32 *adjust_top_to_this){
- f32 current_shift = wrap_state->paren_nesting[wrap_state->paren_safe_top];
+ f32 current_shift = wrap_state->wrap_x.paren_nesting[wrap_state->wrap_x.paren_safe_top];
Assert(adjust_top_to_this != 0);
if (wrap_state->token_ptr > wrap_state->token_array.tokens){
Cpp_Token prev_token = *(wrap_state->token_ptr-1);
- if (wrap_state->paren_safe_top != 0 && prev_token.type == CPP_TOKEN_PARENTHESE_OPEN){
- current_shift = wrap_state->paren_nesting[wrap_state->paren_safe_top-1] + wrap_state->tab_indent_amount;
+ if (wrap_state->wrap_x.paren_safe_top != 0 && prev_token.type == CPP_TOKEN_PARENTHESE_OPEN){
+ current_shift = wrap_state->wrap_x.paren_nesting[wrap_state->wrap_x.paren_safe_top-1] + wrap_state->tab_indent_amount;
*adjust_top_to_this = 1;
}
f32 statement_continuation_indent = 0.f;
- if (current_shift != 0.f && wrap_state->paren_safe_top == 0){
+ if (current_shift != 0.f && wrap_state->wrap_x.paren_safe_top == 0){
if (!(prev_token.flags & CPP_TFLAG_PP_BODY) && !(prev_token.flags & CPP_TFLAG_PP_DIRECTIVE)){
switch (prev_token.type){
@@ -1375,7 +1398,7 @@ get_current_shift(Code_Wrap_State *wrap_state, i32 next_line_start, b32 *adjust_
switch (wrap_state->token_ptr->type){
case CPP_TOKEN_BRACE_CLOSE:
{
- if (wrap_state->paren_safe_top == 0){
+ if (wrap_state->wrap_x.paren_safe_top == 0){
current_shift -= wrap_state->tab_indent_amount;
}
}break;
@@ -1526,7 +1549,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file,
Code_Wrap_State original_wrap_state = wrap_state;
i32 next_line_start = params.buffer->line_starts[stop.line_index+1];
- f32 base_adjusted_width = wrap_state.base_x + minimum_base_width;
+ f32 base_adjusted_width = wrap_state.wrap_x.base_x + minimum_base_width;
if (minimum_base_width != 0 && current_width < base_adjusted_width){
current_width = base_adjusted_width;
@@ -1548,7 +1571,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file,
wrap_indent_marks[real_count].line_shift = clamp_bottom(0.f, current_shift);
++real_count;
- wrap_state.base_x = wrap_state.paren_nesting[0];
+ wrap_state.wrap_x.base_x = wrap_state.wrap_x.paren_nesting[0];
for (; wrap_state.token_ptr < wrap_state.end_token; ){
Code_Wrap_Step step = {0};
@@ -1696,7 +1719,7 @@ file_measure_wraps(System_Functions *system, Models *models, Editing_File *file,
}
wrappable_score = 64*50;
- wrappable_score += 101 - general_stickieness - wrap_state.paren_safe_top*80;
+ wrappable_score += 101 - general_stickieness - wrap_state.wrap_x.paren_safe_top*80;
potential_marks[potential_count].wrap_position = wrap_position;
potential_marks[potential_count].line_shift = current_shift;
diff --git a/TODO.txt b/TODO.txt
index d957a6f6..6c3b6694 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -176,9 +176,10 @@
; [X] smarter wrap rule
; [X] handle unclosed statements
; [X] wrapped line indication
+; [X] additional width for nesting?
+; [X] handle comments
+; [] solve the comment lead whitespace problem
; [] special indent rules in preprocessor body
-; [] handle comments
-; [] additional width for nesting?
; [] fix issues when relexing happens in parallel
; [] remeasure version of measure_wraps