4.0.18 ~ pre-optimizations

This commit is contained in:
Allen Webster 2017-03-29 12:32:06 -04:00
parent 25df080f7b
commit 6c1ebcf06e
24 changed files with 654 additions and 608 deletions

View File

@ -562,13 +562,11 @@ STRUCT Buffer_Edit{
DOC_SEE(Access_Flag)
DOC_SEE(Dirty_State) */
STRUCT Buffer_Summary{
/* DOC(This field indicates whether the Buffer_Summary describes a buffer that is open in 4coder.
When this field is false the summary is referred to as a "null summary".) */
/* DOC(This field indicates whether the Buffer_Summary describes a buffer that is open in 4coder. When this field is false the summary is referred to as a "null summary".) */
bool32 exists;
/* DOC(If this is not a null summary, this field indicates whether the buffer has finished loading.) */
bool32 ready;
/* DOC(If this is not a null summary this field is the id of the associated buffer.
If this is a null summary then buffer_id is 0.) */
/* DOC(If this is not a null summary this field is the id of the associated buffer. If this is a null summary then buffer_id is 0.) */
int32_t buffer_id;
/*DOC(If this is not a null summary, this field contains flags describing the protection status of the buffer.)*/
Access_Flag lock_flags;
@ -593,10 +591,7 @@ STRUCT Buffer_Summary{
/* DOC(If this is not a null summary, this field indicates whether the buffer is set to lex tokens.) */
bool32 is_lexed;
/* DOC(If this is not a null summary, this field indicates whether the buffer has up to date tokens available.
If this field is false, it may simply mean the tokens are still being generated in a background task and will
be available later. If that is the case, is_lexed will be true to indicate that the buffer is trying to get
it's tokens up to date.) */
/* DOC(If this is not a null summary, this field indicates whether the buffer has up to date tokens available. If this field is false, it may simply mean the tokens are still being generated in a background task and will be available later. If that is the case, is_lexed will be true to indicate that the buffer is trying to get it's tokens up to date.) */
bool32 tokens_are_ready;
/* DOC(If this is not a null summary, this field specifies the id of the command map for this buffer.) */
int32_t map_id;

View File

@ -575,7 +575,7 @@ CUSTOM_COMMAND_SIG(search);
CUSTOM_COMMAND_SIG(reverse_search);
static void
isearch(Application_Links *app, int32_t start_reversed){
isearch(Application_Links *app, int32_t start_reversed, String query_init){
uint32_t access = AccessProtected;
View_Summary view = get_active_view(app, access);
@ -586,98 +586,123 @@ isearch(Application_Links *app, int32_t start_reversed){
Query_Bar bar = {0};
if (start_query_bar(app, &bar, 0) == 0) return;
int32_t reverse = start_reversed;
int32_t pos = view.cursor.pos;
bool32 reverse = start_reversed;
int32_t first_pos = view.cursor.pos;
int32_t pos = first_pos;
if (query_init.size != 0){
pos += 2;
}
int32_t start_pos = pos;
int32_t first_pos = pos;
Range match = make_range(pos, pos);
char bar_string_space[256];
bar.string = make_fixed_width_string(bar_string_space);
copy_ss(&bar.string, query_init);
String isearch_str = make_lit_string("I-Search: ");
String rsearch_str = make_lit_string("Reverse-I-Search: ");
bool32 first_step = true;
User_Input in = {0};
for (;;){
view_set_highlight(app, &view, match.start, match.end, true);
// NOTE(allen): Change the bar's prompt to match the current direction.
if (reverse) bar.prompt = rsearch_str;
else bar.prompt = isearch_str;
in = get_user_input(app, EventOnAnyKey, EventOnEsc | EventOnButton);
if (in.abort) break;
// NOTE(allen): If we're getting mouse events here it's a 4coder bug, because we
// only asked to intercept key events.
Assert(in.type == UserInputKey);
char character = to_writable_char(in.key.character);
int32_t made_change = 0;
if (in.key.keycode == '\n' || in.key.keycode == '\t'){
break;
if (reverse){
bar.prompt = rsearch_str;
}
else if (character && key_is_unmodified(&in.key)){
append_s_char(&bar.string, character);
made_change = 1;
else{
bar.prompt = isearch_str;
}
else if (in.key.keycode == key_back){
if (bar.string.size > 0){
--bar.string.size;
made_change = 1;
bool32 step_forward = false;
bool32 step_backward = false;
bool32 backspace = false;
if (!first_step){
in = get_user_input(app, EventOnAnyKey, EventOnEsc | EventOnButton);
if (in.abort) break;
// NOTE(allen): If we're getting mouse events here it's a 4coder bug, because we only asked to intercept key events.
Assert(in.type == UserInputKey);
char character = to_writable_char(in.key.character);
bool32 made_change = false;
if (in.key.keycode == '\n' || in.key.keycode == '\t'){
break;
}
else if (character && key_is_unmodified(&in.key)){
append_s_char(&bar.string, character);
made_change = true;
}
else if (in.key.keycode == key_back){
if (bar.string.size > 0){
--bar.string.size;
made_change = true;
}
backspace = true;
}
if ((in.command.command == search) || in.key.keycode == key_page_down || in.key.keycode == key_down){
step_forward = true;
}
if ((in.command.command == reverse_search) || in.key.keycode == key_page_up || in.key.keycode == key_up){
step_backward = true;
}
}
int32_t step_forward = 0;
int32_t step_backward = 0;
if ((in.command.command == search) ||
in.key.keycode == key_page_down || in.key.keycode == key_down) step_forward = 1;
if ((in.command.command == reverse_search) ||
in.key.keycode == key_page_up || in.key.keycode == key_up) step_backward = 1;
else{
if (bar.string.size != 0){
step_backward = true;
}
first_step = false;
}
start_pos = pos;
if (step_forward && reverse){
start_pos = match.start + 1;
pos = start_pos;
reverse = 0;
step_forward = 0;
reverse = false;
step_forward = false;
}
if (step_backward && !reverse){
start_pos = match.start - 1;
pos = start_pos;
reverse = 1;
step_backward = 0;
reverse = true;
step_backward = false;
}
if (in.key.keycode != key_back){
int32_t new_pos;
if (!backspace){
if (reverse){
buffer_seek_string_insensitive_backward(app, &buffer, start_pos - 1, 0,
bar.string.str, bar.string.size, &new_pos);
int32_t new_pos = 0;
buffer_seek_string_insensitive_backward(app, &buffer, start_pos - 1, 0, bar.string.str, bar.string.size, &new_pos);
if (new_pos >= 0){
if (step_backward){
pos = new_pos;
start_pos = new_pos;
buffer_seek_string_insensitive_backward(app, &buffer, start_pos - 1, 0,
bar.string.str, bar.string.size, &new_pos);
if (new_pos < 0) new_pos = start_pos;
buffer_seek_string_insensitive_backward(app, &buffer, start_pos - 1, 0, bar.string.str, bar.string.size, &new_pos);
if (new_pos < 0){
new_pos = start_pos;
}
}
match.start = new_pos;
match.end = match.start + bar.string.size;
}
}
else{
buffer_seek_string_insensitive_forward(app, &buffer, start_pos + 1, 0,
bar.string.str, bar.string.size, &new_pos);
int32_t new_pos = 0;
buffer_seek_string_insensitive_forward(app, &buffer, start_pos + 1, 0, bar.string.str, bar.string.size, &new_pos);
if (new_pos < buffer.size){
if (step_forward){
pos = new_pos;
start_pos = new_pos;
buffer_seek_string_insensitive_forward(app, &buffer, start_pos + 1, 0,
bar.string.str, bar.string.size, &new_pos);
if (new_pos >= buffer.size) new_pos = start_pos;
buffer_seek_string_insensitive_forward(app, &buffer, start_pos + 1, 0, bar.string.str, bar.string.size, &new_pos);
if (new_pos >= buffer.size){
new_pos = start_pos;
}
}
match.start = new_pos;
match.end = match.start + bar.string.size;
@ -690,6 +715,7 @@ isearch(Application_Links *app, int32_t start_reversed){
}
}
}
view_set_highlight(app, &view, 0, 0, false);
if (in.abort){
view_set_cursor(app, &view, seek_pos(first_pos), true);
@ -700,11 +726,31 @@ isearch(Application_Links *app, int32_t start_reversed){
}
CUSTOM_COMMAND_SIG(search){
isearch(app, false);
String query = {0};
isearch(app, false, query);
}
CUSTOM_COMMAND_SIG(reverse_search){
isearch(app, true);
String query = {0};
isearch(app, true, query);
}
CUSTOM_COMMAND_SIG(search_identifier){
View_Summary view = get_active_view(app, AccessProtected);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessProtected);
char space[256];
String query = read_identifier_at_pos(app, &buffer, view.cursor.pos, space, sizeof(space), 0);
isearch(app, false, query);
}
CUSTOM_COMMAND_SIG(reverse_search_identifier){
View_Summary view = get_active_view(app, AccessProtected);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessProtected);
char space[256];
String query = read_identifier_at_pos(app, &buffer, view.cursor.pos, space, sizeof(space), 0);
isearch(app, true, query);
}
CUSTOM_COMMAND_SIG(replace_in_range){
@ -745,6 +791,36 @@ CUSTOM_COMMAND_SIG(replace_in_range){
}
}
static void
query_replace(Application_Links *app, View_Summary *view, Buffer_Summary *buffer, int32_t pos, String r, String w){
int32_t new_pos = 0;
buffer_seek_string_forward(app, buffer, pos, 0, r.str, r.size, &new_pos);
User_Input in = {0};
while (new_pos < buffer->size){
Range match = make_range(new_pos, new_pos + r.size);
view_set_highlight(app, view, match.min, match.max, 1);
in = get_user_input(app, EventOnAnyKey, EventOnButton);
if (in.abort || in.key.keycode == key_esc || !key_is_unmodified(&in.key)) break;
if (in.key.character == 'y' || in.key.character == 'Y' || in.key.character == '\n' || in.key.character == '\t'){
buffer_replace_range(app, buffer, match.min, match.max, w.str, w.size);
pos = match.start + w.size;
}
else{
pos = match.max;
}
buffer_seek_string_forward(app, buffer, pos, 0, r.str, r.size, &new_pos);
}
view_set_highlight(app, view, 0, 0, 0);
if (in.abort) return;
view_set_cursor(app, view, seek_pos(pos), true);
}
CUSTOM_COMMAND_SIG(query_replace){
Query_Bar replace;
char replace_space[1024];
@ -761,55 +837,57 @@ CUSTOM_COMMAND_SIG(query_replace){
if (!query_user_string(app, &with)) return;
String r, w;
r = replace.string;
w = with.string;
String r = replace.string;
String w = with.string;
View_Summary view = get_active_view(app, AccessOpen);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen);
int32_t pos = view.cursor.pos;
Query_Bar bar;
Buffer_Summary buffer;
View_Summary view;
int32_t pos, new_pos;
bar.prompt = make_lit_string("Replace? (y)es, (n)ext, (esc)\n");
bar.string = null_string;
start_query_bar(app, &bar, 0);
uint32_t access = AccessOpen;
view = get_active_view(app, access);
buffer = get_buffer(app, view.buffer_id, access);
pos = view.cursor.pos;
buffer_seek_string_forward(app, &buffer, pos, 0, r.str, r.size, &new_pos);
User_Input in = {0};
while (new_pos < buffer.size){
Range match = make_range(new_pos, new_pos + r.size);
view_set_highlight(app, &view, match.min, match.max, 1);
in = get_user_input(app, EventOnAnyKey, EventOnButton);
if (in.abort || in.key.keycode == key_esc || !key_is_unmodified(&in.key)) break;
if (in.key.character == 'y' ||
in.key.character == 'Y' ||
in.key.character == '\n' ||
in.key.character == '\t'){
buffer_replace_range(app, &buffer, match.min, match.max, w.str, w.size);
pos = match.start + w.size;
}
else{
pos = match.max;
}
buffer_seek_string_forward(app, &buffer, pos, 0, r.str, r.size, &new_pos);
}
view_set_highlight(app, &view, 0, 0, 0);
if (in.abort) return;
view_set_cursor(app, &view, seek_pos(pos), 1);
query_replace(app, &view, &buffer, pos, r, w);
}
CUSTOM_COMMAND_SIG(query_replace_identifier){
View_Summary view = get_active_view(app, AccessProtected);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessProtected);
Range range = {0};
char space[256];
String query = read_identifier_at_pos(app, &buffer, view.cursor.pos, space, sizeof(space), &range);
if (query.size != 0){
Query_Bar replace;
replace.prompt = make_lit_string("Replace: ");
replace.string = query;
if (start_query_bar(app, &replace, 0) == 0) return;
Query_Bar with;
char with_space[1024];
with.prompt = make_lit_string("With: ");
with.string = make_fixed_width_string(with_space);
if (!query_user_string(app, &with)) return;
String r = replace.string;
String w = with.string;
View_Summary view = get_active_view(app, AccessOpen);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessOpen);
int32_t pos = range.start;
Query_Bar bar;
bar.prompt = make_lit_string("Replace? (y)es, (n)ext, (esc)\n");
bar.string = null_string;
start_query_bar(app, &bar, 0);
query_replace(app, &view, &buffer, pos, r, w);
}
}
//
// File Handling Commands

View File

@ -177,8 +177,10 @@ default_keys(Bind_Helper *context){
bind(context, 'm', MDFR_CTRL, cursor_mark_swap);
bind(context, 'O', MDFR_CTRL, reopen);
bind(context, 'q', MDFR_CTRL, query_replace);
bind(context, 'Q', MDFR_CTRL, query_replace_identifier);
bind(context, 'r', MDFR_CTRL, reverse_search);
bind(context, 's', MDFR_CTRL, save);
bind(context, 't', MDFR_CTRL, search_identifier);
bind(context, 'T', MDFR_CTRL, list_all_locations_of_identifier);
bind(context, 'u', MDFR_CTRL, to_uppercase);
bind(context, 'v', MDFR_CTRL, paste_and_indent);
@ -194,7 +196,7 @@ default_keys(Bind_Helper *context){
bind(context, '?', MDFR_CTRL, toggle_show_whitespace);
bind(context, '~', MDFR_CTRL, clean_all_lines);
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position_same_panel);
bind(context, ' ', MDFR_SHIFT, write_character);
end_map(context);

View File

@ -36,6 +36,12 @@ static General_Memory global_general;
// Jump Buffer Locking
//
#if !defined(AUTO_CENTER_AFTER_JUMPS)
static bool32 auto_center_after_jumps = true;
#else
static bool32 auto_center_after_jumps = AUTO_CENTER_AFTER_JUMPS;
#endif
static char locked_buffer_space[256];
static String locked_buffer = make_fixed_width_string(locked_buffer_space);
@ -361,9 +367,9 @@ read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
if (i < array.count){
Cpp_Token token = read_config_token(array, &i);
bool32 subscript_success = 1;
bool32 subscript_success = true;
if (token.type == CPP_TOKEN_BRACKET_OPEN){
subscript_success = 0;
subscript_success = false;
++i;
if (i < array.count){
config_line.subscript_token = read_config_token(array, &i);
@ -375,7 +381,7 @@ read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
++i;
if (i < array.count){
token = read_config_token(array, &i);
subscript_success = 1;
subscript_success = true;
}
}
}
@ -390,9 +396,9 @@ read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
if (i < array.count){
Cpp_Token val_token = read_config_token(array, &i);
bool32 array_success = 1;
bool32 array_success = true;
if (val_token.type == CPP_TOKEN_BRACE_OPEN){
array_success = 0;
array_success = false;
++i;
if (i < array.count){
config_line.val_array_start = i;
@ -405,13 +411,13 @@ read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
}
if (array_token.type == CPP_TOKEN_BRACE_CLOSE){
config_line.val_array_end = i;
array_success = 1;
array_success = true;
break;
}
else{
if (array_token.type == CPP_TOKEN_COMMA){
if (!expecting_array_item){
expecting_array_item = 1;
expecting_array_item = true;
}
else{
break;
@ -419,7 +425,7 @@ read_config_line(Cpp_Token_Array array, int32_t *i_ptr){
}
else{
if (expecting_array_item){
expecting_array_item = 0;
expecting_array_item = false;
++config_line.val_array_count;
}
}

View File

@ -75,12 +75,11 @@ OPEN_FILE_HOOK_SIG(default_file_settings){
// NOTE(allen|a4.0.8): The get_parameter_buffer was eliminated
// and instead the buffer is passed as an explicit parameter through
// the function call. That is where buffer_id comes from here.
uint32_t access = AccessAll;
Buffer_Summary buffer = get_buffer(app, buffer_id, access);
Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll);
Assert(buffer.exists);
int32_t treat_as_code = false;
int32_t wrap_lines = true;
bool32 treat_as_code = false;
bool32 wrap_lines = true;
int32_t extension_count = 0;
char **extension_list = get_current_code_extensions(&extension_count);
@ -102,9 +101,11 @@ OPEN_FILE_HOOK_SIG(default_file_settings){
wrap_lines = false;
}
int32_t map_id = (treat_as_code)?((int32_t)default_code_map):((int32_t)mapid_file);
buffer_set_setting(app, &buffer, BufferSetting_WrapPosition, default_wrap_width);
buffer_set_setting(app, &buffer, BufferSetting_MinimumBaseWrapPosition, default_min_base_width);
buffer_set_setting(app, &buffer, BufferSetting_MapID, (treat_as_code)?((int32_t)default_code_map):((int32_t)mapid_file));
buffer_set_setting(app, &buffer, BufferSetting_MapID, map_id);
if (treat_as_code && enable_code_wrapping && buffer.size < (1 << 18)){
// NOTE(allen|a4.0.12): There is a little bit of grossness going on here.

View File

@ -49,11 +49,10 @@ buffer_boundary_seek(Application_Links *app, Buffer_Summary *buffer, int32_t sta
}
static void
basic_seek(Application_Links *app, int32_t seek_type, uint32_t flags){
uint32_t access = AccessProtected;
View_Summary view = get_active_view(app, access);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, access);
int32_t pos = buffer_boundary_seek(app, &buffer, view.cursor.pos, seek_type, flags);
basic_seek(Application_Links *app, bool32 seek_forward, uint32_t flags){
View_Summary view = get_active_view(app, AccessProtected);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessProtected);
int32_t pos = buffer_boundary_seek(app, &buffer, view.cursor.pos, seek_forward, flags);
view_set_cursor(app, &view, seek_pos(pos), true);
}

View File

@ -31,45 +31,27 @@ TYPE: 'drop-in-command-pack'
// Declaration list
//
static void
list_all_functions(Application_Links *app, Partition *part, Buffer_Summary *buffer){
String search_name = make_lit_string("*decls*");
Buffer_Summary decls_buffer = get_buffer_by_name(app, search_name.str, search_name.size, AccessAll);
if (!decls_buffer.exists){
decls_buffer = create_buffer(app, search_name.str, search_name.size, BufferCreate_AlwaysNew);
buffer_set_setting(app, &decls_buffer, BufferSetting_Unimportant, true);
buffer_set_setting(app, &decls_buffer, BufferSetting_ReadOnly, true);
buffer_set_setting(app, &decls_buffer, BufferSetting_WrapLine, false);
}
else{
buffer_replace_range(app, &decls_buffer, 0, decls_buffer.size, 0, 0);
}
Temp_Memory temp = begin_temp_memory(part);
struct Function_Positions{
int32_t sig_start_index;
int32_t sig_end_index;
int32_t open_paren_pos;
};
Function_Positions *positions_array = push_array(part, Function_Positions, (4<<10)/sizeof(Function_Positions));
int32_t positions_count = 0;
Partition extra_memory_ = partition_sub_part(part, (4<<10));
Partition *extra_memory = &extra_memory_;
char *str = (char*)partition_current(part);
int32_t part_size = 0;
int32_t size = 0;
struct Function_Positions{
int32_t sig_start_index;
int32_t sig_end_index;
int32_t open_paren_pos;
};
struct Get_Positions_Results{
int32_t positions_count;
int32_t next_token_index;
bool32 still_looping;
};
static Get_Positions_Results
get_function_positions(Application_Links *app, Buffer_Summary *buffer, int32_t token_index, Function_Positions *positions_array, int32_t positions_max){
Get_Positions_Results result = {0};
static const int32_t token_chunk_size = 512;
Cpp_Token token_chunk[token_chunk_size];
Stream_Tokens token_stream = {0};
if (init_stream_tokens(&token_stream, app, buffer, 0, token_chunk, token_chunk_size)){
Stream_Tokens start_position_stream_temp = begin_temp_stream_token(&token_stream);
int32_t token_index = 0;
if (init_stream_tokens(&token_stream, app, buffer, token_index, token_chunk, token_chunk_size)){
int32_t nest_level = 0;
int32_t paren_nest_level = 0;
@ -80,7 +62,14 @@ list_all_functions(Application_Links *app, Partition *part, Buffer_Summary *buff
bool32 still_looping = false;
// Look for the next token at global scope that might need to be printed.
mode1: do{
mode1:
Assert(nest_level == 0);
Assert(paren_nest_level == 0);
first_paren_index = 0;
first_paren_position = 0;
last_paren_index = 0;
do{
for (; token_index < token_stream.end; ++token_index){
Cpp_Token *token = &token_stream.tokens[token_index];
@ -168,76 +157,110 @@ list_all_functions(Application_Links *app, Partition *part, Buffer_Summary *buff
positions.sig_start_index = signature_start_index;
positions.sig_end_index = last_paren_index;
positions.open_paren_pos = first_paren_position;
positions_array[positions_count++] = positions;
positions_array[result.positions_count++] = positions;
}
end_temp_stream_token(&token_stream, backward_stream_temp);
if (result.positions_count >= positions_max){
result.next_token_index = token_index;
result.still_looping = true;
goto end;
}
goto mode1;
}
end:;
end_temp_stream_token(&token_stream, start_position_stream_temp);
// Print the results
String buffer_name = make_string(buffer->buffer_name, buffer->buffer_name_len);
for (int32_t i = 0; i < positions_count; ++i){
Function_Positions *positions = &positions_array[i];
Temp_Memory extra_temp = begin_temp_memory(extra_memory);
int32_t local_index = positions->sig_start_index;
int32_t end_index = positions->sig_end_index;
int32_t open_paren_pos = positions->open_paren_pos;
}
return(result);
}
static void
print_positions(Application_Links *app, Buffer_Summary *buffer, Function_Positions *positions_array, int32_t positions_count, Buffer_Summary *output_buffer, Partition *part){
Temp_Memory temp = begin_temp_memory(part);
Partition extra_memory_ = partition_sub_part(part, (4<<10));
Partition *extra_memory = &extra_memory_;
char *str_ptr = (char*)partition_current(part);
int32_t part_size = 0;
String buffer_name = make_string(buffer->buffer_name, buffer->buffer_name_len);
int32_t size = output_buffer->size;
for (int32_t i = 0; i < positions_count; ++i){
Function_Positions *positions = &positions_array[i];
Temp_Memory extra_temp = begin_temp_memory(extra_memory);
int32_t local_index = positions->sig_start_index;
int32_t end_index = positions->sig_end_index;
int32_t open_paren_pos = positions->open_paren_pos;
Assert(end_index > local_index);
static const int32_t sig_chunk_size = 64;
Cpp_Token sig_chunk[sig_chunk_size];
Stream_Tokens sig_stream = {0};
if (init_stream_tokens(&sig_stream, app, buffer, local_index, sig_chunk, sig_chunk_size)){
bool32 still_looping = false;
do{
for (; local_index < token_stream.end; ++local_index){
Cpp_Token *token = &token_stream.tokens[local_index];
if (!(token->flags & CPP_TFLAG_PP_BODY)){
if (token->type != CPP_TOKEN_COMMENT){
bool32 delete_space_before = false;
bool32 space_after = false;
for (; local_index < sig_stream.end; ++local_index){
Cpp_Token *token = &sig_stream.tokens[local_index];
if (!(token->flags & CPP_TFLAG_PP_BODY) && token->type != CPP_TOKEN_COMMENT){
bool32 delete_space_before = false;
bool32 space_after = false;
switch (token->type){
case CPP_TOKEN_PARENTHESE_OPEN:
case CPP_TOKEN_PARENTHESE_CLOSE:
{
delete_space_before = true;
}break;
switch (token->type){
case CPP_TOKEN_COMMA:
case CPP_TOKEN_PARENTHESE_OPEN:
case CPP_TOKEN_PARENTHESE_CLOSE:
{
delete_space_before = true;
}break;
}
switch (token->type){
case CPP_TOKEN_IDENTIFIER:
case CPP_TOKEN_COMMA:
case CPP_TOKEN_STAR:
{
space_after = true;
}break;
}
if (token->flags & CPP_TFLAG_IS_KEYWORD){
case CPP_TOKEN_IDENTIFIER:
case CPP_TOKEN_STAR:
{
space_after = true;
}break;
case CPP_TOKEN_COMMA:
{
delete_space_before = true;
space_after = true;
}break;
}
if (token->flags & CPP_TFLAG_IS_KEYWORD){
space_after = true;
}
if (delete_space_before){
int32_t pos = extra_memory->pos - 1;
char *base = ((char*)(extra_memory->base));
if (pos >= 0 && base[pos] == ' '){
extra_memory->pos = pos;
}
if (delete_space_before){
int32_t pos = extra_memory->pos - 1;
char *base = ((char*)(extra_memory->base));
if (pos >= 0 && base[pos] == ' '){
extra_memory->pos = pos;
}
}
char *token_str = push_array(extra_memory, char, token->size + space_after);
}
char *token_str = push_array(extra_memory, char, token->size + space_after);
if (token_str != 0){
buffer_read_range(app, buffer, token->start, token->start + token->size, token_str);
if (space_after){
token_str[token->size] = ' ';
}
}
else{
goto finish_print;
}
}
if (local_index == end_index){
goto finish_print;
}
}
still_looping = forward_stream_tokens(&token_stream);
still_looping = forward_stream_tokens(&sig_stream);
}while(still_looping);
finish_print:;
@ -252,7 +275,7 @@ list_all_functions(Application_Links *app, Partition *part, Buffer_Summary *buff
char *out_space = push_array(part, char, append_len);
if (out_space == 0){
buffer_replace_range(app, &decls_buffer, size, size, str, part_size);
buffer_replace_range(app, output_buffer, size, size, str_ptr, part_size);
size += part_size;
end_temp_memory(temp);
@ -272,19 +295,53 @@ list_all_functions(Application_Links *app, Partition *part, Buffer_Summary *buff
append(&out, sig);
append(&out, '\n');
}
end_temp_memory(extra_temp);
}
buffer_replace_range(app, &decls_buffer, size, size, str, part_size);
View_Summary view = get_active_view(app, AccessAll);
view_set_buffer(app, &view, decls_buffer.buffer_id, 0);
lock_jump_buffer(search_name.str, search_name.size);
end_temp_memory(temp);
end_temp_memory(extra_temp);
}
buffer_replace_range(app, output_buffer, size, size, str_ptr, part_size);
end_temp_memory(temp);
}
static void
list_all_functions(Application_Links *app, Partition *part, Buffer_Summary *buffer){
String search_name = make_lit_string("*decls*");
Buffer_Summary decls_buffer = get_buffer_by_name(app, search_name.str, search_name.size, AccessAll);
if (!decls_buffer.exists){
decls_buffer = create_buffer(app, search_name.str, search_name.size, BufferCreate_AlwaysNew);
buffer_set_setting(app, &decls_buffer, BufferSetting_Unimportant, true);
buffer_set_setting(app, &decls_buffer, BufferSetting_ReadOnly, true);
buffer_set_setting(app, &decls_buffer, BufferSetting_WrapLine, false);
}
else{
buffer_replace_range(app, &decls_buffer, 0, decls_buffer.size, 0, 0);
}
Temp_Memory temp = begin_temp_memory(part);
int32_t positions_max = (4<<10)/sizeof(Function_Positions);
Function_Positions *positions_array = push_array(part, Function_Positions, positions_max);
int32_t token_index = 0;
bool32 still_looping = false;
do{
Get_Positions_Results get_positions_results = get_function_positions(app, buffer, token_index, positions_array, positions_max);
int32_t positions_count = get_positions_results.positions_count;
token_index = get_positions_results.next_token_index;
still_looping = get_positions_results.still_looping;
print_positions(app, buffer, positions_array, positions_count, &decls_buffer, part);
}while(still_looping);
View_Summary view = get_active_view(app, AccessAll);
view_set_buffer(app, &view, decls_buffer.buffer_id, 0);
lock_jump_buffer(search_name.str, search_name.size);
end_temp_memory(temp);
}
CUSTOM_COMMAND_SIG(list_all_functions_current_buffer){

View File

@ -22,29 +22,6 @@ exec_command(Application_Links *app, Generic_Command cmd){
}
}
static View_Summary
get_first_view_with_buffer(Application_Links *app, int32_t buffer_id){
View_Summary result = {};
View_Summary test = {};
if (buffer_id != 0){
uint32_t access = AccessAll;
for(test = get_view_first(app, access);
test.exists;
get_view_next(app, &test, access)){
Buffer_Summary buffer = get_buffer(app, test.buffer_id, access);
if(buffer.buffer_id == buffer_id){
result = test;
break;
}
}
}
return(result);
}
static int32_t
key_is_unmodified(Key_Event_Data *key){
char *mods = key->modifiers;
@ -69,10 +46,9 @@ to_writable_char(Key_Code long_character){
return(character);
}
static int32_t
static bool32
query_user_general(Application_Links *app, Query_Bar *bar, bool32 force_number){
User_Input in;
int32_t success = 1;
bool32 success = true;
// NOTE(allen|a3.4.4): It will not cause an *error* if we continue on after failing to.
// start a query bar, but it will be unusual behavior from the point of view of the
@ -86,12 +62,12 @@ query_user_general(Application_Links *app, Query_Bar *bar, bool32 force_number){
// types specified in the flags. The first set of flags are inputs you'd like to intercept
// that you don't want to abort on. The second set are inputs that you'd like to cause
// the command to abort. If an event satisfies both flags, it is treated as an abort.
in = get_user_input(app, EventOnAnyKey, EventOnEsc | EventOnButton);
User_Input in = get_user_input(app, EventOnAnyKey, EventOnEsc | EventOnButton);
// NOTE(allen|a3.4.4): The responsible thing to do on abort is to end the command
// without waiting on get_user_input again.
if (in.abort){
success = 0;
success = false;
break;
}
@ -276,13 +252,38 @@ get_line_x_rect(View_Summary *view){
return(rect);
}
static View_Summary
get_first_view_with_buffer(Application_Links *app, int32_t buffer_id){
View_Summary result = {0};
View_Summary test = {0};
if (buffer_id != 0){
uint32_t access = AccessAll;
for(test = get_view_first(app, access);
test.exists;
get_view_next(app, &test, access)){
Buffer_Summary buffer = get_buffer(app, test.buffer_id, access);
if(buffer.buffer_id == buffer_id){
result = test;
break;
}
}
}
return(result);
}
static bool32
open_file(Application_Links *app, Buffer_Summary *buffer_out, char *filename, int32_t filename_len, bool32 background, bool32 never_new){
bool32 result = false;
Buffer_Summary buffer = get_buffer_by_name(app, filename, filename_len, AccessProtected|AccessHidden);
if (buffer.exists){
if (buffer_out) *buffer_out = buffer;
if (buffer_out){
*buffer_out = buffer;
}
result = true;
}
else{
@ -295,7 +296,9 @@ open_file(Application_Links *app, Buffer_Summary *buffer_out, char *filename, in
}
buffer = create_buffer(app, filename, filename_len, flags);
if (buffer.exists){
if (buffer_out) *buffer_out = buffer;
if (buffer_out){
*buffer_out = buffer;
}
result = true;
}
}
@ -303,15 +306,15 @@ open_file(Application_Links *app, Buffer_Summary *buffer_out, char *filename, in
return(result);
}
static int32_t
view_open_file(Application_Links *app, View_Summary *view, char *filename, int32_t filename_len, int32_t never_new){
int32_t result = 0;
static bool32
view_open_file(Application_Links *app, View_Summary *view, char *filename, int32_t filename_len, bool32 never_new){
bool32 result = false;
if (view){
if (view != 0){
Buffer_Summary buffer = {0};
if (open_file(app, &buffer, filename, filename_len, false, never_new)){
view_set_buffer(app, view, buffer.buffer_id, 0);
result = 1;
result = true;
}
}

View File

@ -20,15 +20,27 @@ struct Name_Based_Jump_Location{
static void
jump_to_location(Application_Links *app, View_Summary *view, Name_Based_Jump_Location *l){
Buffer_Summary buffer = {0};
if (open_file(app, &buffer, l->file.str, l->file.size, false, true)){
View_Summary target_view = get_first_view_with_buffer(app, buffer.buffer_id);
if (!target_view.exists){
view_set_buffer(app, view, buffer.buffer_id, 0);
target_view = *view;
}
view_set_cursor(app, &target_view, seek_line_char(l->line, l->column), true);
}
}
static void
jump_to_location_always_use_view(Application_Links *app, View_Summary *view, Name_Based_Jump_Location *l){
if (view_open_file(app, view, l->file.str, l->file.size, true)){
view_set_cursor(app, view, seek_line_char(l->line, l->column), true);
}
}
static int32_t
static bool32
ms_style_verify(String line, int32_t paren_pos){
int32_t result = false;
String line_part = substr_tail(line, paren_pos);
if (match_part_sc(line_part, ") : ")){
result = true;
@ -36,7 +48,6 @@ ms_style_verify(String line, int32_t paren_pos){
else if (match_part_sc(line_part, "): ")){
result = true;
}
return(result);
}

View File

@ -170,18 +170,13 @@ buffer_seek_whitespace_down(Application_Links *app, Buffer_Summary *buffer, int3
int32_t chunk_size = sizeof(chunk);
Stream_Chunk stream = {0};
int32_t no_hard;
int32_t prev_endline;
int32_t still_looping;
char at_pos;
if (init_stream_chunk(&stream, app, buffer, pos, chunk, chunk_size)){
// step 1: find the first non-whitespace character
// ahead of the current position.
still_looping = true;
bool32 still_looping = true;
do{
for (; pos < stream.end; ++pos){
at_pos = stream.data[pos];
char at_pos = stream.data[pos];
if (!char_is_whitespace(at_pos)){
goto double_break_1;
}
@ -195,11 +190,11 @@ buffer_seek_whitespace_down(Application_Links *app, Buffer_Summary *buffer, int3
// the prev_endline value. if another '\n' is found
// with non-whitespace then the previous line was
// all whitespace.
no_hard = false;
prev_endline = -1;
bool32 no_hard = false;
int32_t prev_endline = -1;
while(still_looping){
for (; pos < stream.end; ++pos){
at_pos = stream.data[pos];
char at_pos = stream.data[pos];
if (at_pos == '\n'){
if (no_hard){
goto double_break_2;
@ -232,10 +227,9 @@ buffer_seek_whitespace_right(Application_Links *app, Buffer_Summary *buffer, int
char data_chunk[1024];
Stream_Chunk stream = {0};
if (init_stream_chunk(&stream, app, buffer,
pos, data_chunk, sizeof(data_chunk))){
if (init_stream_chunk(&stream, app, buffer, pos, data_chunk, sizeof(data_chunk))){
bool32 still_looping = 1;
bool32 still_looping = true;
do{
for (; pos < stream.end; ++pos){
if (!char_is_whitespace(stream.data[pos])){
@ -246,7 +240,7 @@ buffer_seek_whitespace_right(Application_Links *app, Buffer_Summary *buffer, int
}while(still_looping);
double_break1:;
still_looping = 1;
still_looping = true;
do{
for (; pos < stream.end; ++pos){
if (char_is_whitespace(stream.data[pos])){
@ -311,10 +305,9 @@ buffer_seek_alphanumeric_right(Application_Links *app, Buffer_Summary *buffer, i
char data_chunk[1024];
Stream_Chunk stream = {0};
if (init_stream_chunk(&stream, app, buffer,
pos, data_chunk, sizeof(data_chunk))){
if (init_stream_chunk(&stream, app, buffer, pos, data_chunk, sizeof(data_chunk))){
bool32 still_looping = 1;
bool32 still_looping = true;
do{
for (; pos < stream.end; ++pos){
if (char_is_alpha_numeric_true_utf8(stream.data[pos])){
@ -325,7 +318,7 @@ buffer_seek_alphanumeric_right(Application_Links *app, Buffer_Summary *buffer, i
}while(still_looping);
double_break1:;
still_looping = 1;
still_looping = true;
do{
for (; pos < stream.end; ++pos){
if (!char_is_alpha_numeric_true_utf8(stream.data[pos])){
@ -348,8 +341,7 @@ buffer_seek_alphanumeric_left(Application_Links *app, Buffer_Summary *buffer, in
--pos;
if (pos > 0){
if (init_stream_chunk(&stream, app, buffer, pos, data_chunk, sizeof(data_chunk))){
bool32 still_looping = 1;
bool32 still_looping = true;
do{
for (; pos >= stream.start; --pos){
if (char_is_alpha_numeric_true_utf8(stream.data[pos])){
@ -360,7 +352,7 @@ buffer_seek_alphanumeric_left(Application_Links *app, Buffer_Summary *buffer, in
}while(still_looping);
double_break1:;
still_looping = 1;
still_looping = true;
do{
for (; pos >= stream.start; --pos){
if (!char_is_alpha_numeric_true_utf8(stream.data[pos])){
@ -380,6 +372,78 @@ buffer_seek_alphanumeric_left(Application_Links *app, Buffer_Summary *buffer, in
return(pos);
}
static int32_t
buffer_seek_alphanumeric_or_underscore_right(Application_Links *app, Buffer_Summary *buffer, int32_t pos){
char data_chunk[1024];
Stream_Chunk stream = {0};
if (init_stream_chunk(&stream, app, buffer, pos, data_chunk, sizeof(data_chunk))){
bool32 still_looping = true;
do{
for (; pos < stream.end; ++pos){
if (char_is_alpha_numeric_utf8(stream.data[pos])){
goto double_break1;
}
}
still_looping = forward_stream_chunk(&stream);
}while(still_looping);
double_break1:;
still_looping = true;
do{
for (; pos < stream.end; ++pos){
if (!char_is_alpha_numeric_utf8(stream.data[pos])){
goto double_break2;
}
}
still_looping = forward_stream_chunk(&stream);
}while(still_looping);
double_break2:;
}
return(pos);
}
static int32_t
buffer_seek_alphanumeric_or_underscore_left(Application_Links *app, Buffer_Summary *buffer, int32_t pos){
char data_chunk[1024];
Stream_Chunk stream = {0};
--pos;
if (pos > 0){
if (init_stream_chunk(&stream, app, buffer, pos, data_chunk, sizeof(data_chunk))){
bool32 still_looping = true;
do{
for (; pos >= stream.start; --pos){
if (char_is_alpha_numeric_utf8(stream.data[pos])){
goto double_break1;
}
}
still_looping = backward_stream_chunk(&stream);
}while(still_looping);
double_break1:;
still_looping = true;
do{
for (; pos >= stream.start; --pos){
if (!char_is_alpha_numeric_utf8(stream.data[pos])){
++pos;
goto double_break2;
}
}
still_looping = backward_stream_chunk(&stream);
}while(still_looping);
double_break2:;
}
}
else{
pos = 0;
}
return(pos);
}
static int32_t
buffer_seek_range_camel_right(Application_Links *app, Buffer_Summary *buffer, int32_t pos, int32_t an_pos){
char data_chunk[1024];
@ -982,6 +1046,31 @@ get_first_token_at_line(Application_Links *app, Buffer_Summary *buffer, Cpp_Toke
return(result);
}
static String
read_identifier_at_pos(Application_Links *app, Buffer_Summary *buffer, int32_t pos, char *space, int32_t max, Range *range_out){
String query = {0};
int32_t start = buffer_seek_alphanumeric_or_underscore_left(app, buffer, pos);
int32_t end = buffer_seek_alphanumeric_or_underscore_right(app, buffer, start);
if (!(start <= pos && pos < end)){
end = buffer_seek_alphanumeric_or_underscore_right(app, buffer, pos);
start = buffer_seek_alphanumeric_or_underscore_left(app, buffer, end);
}
if (start <= pos && pos < end){
int32_t size = end - start;
if (size <= max){
if (range_out != 0){
*range_out = make_range(start, end);
}
buffer_read_range(app, buffer, start, end, space);
query = make_string_cap(space, size, max);
}
}
return(query);
}
#endif

View File

@ -22,29 +22,44 @@ CUSTOM_COMMAND_SIG(goto_jump_at_cursor){
View_Summary view = get_active_view(app, AccessProtected);
Name_Based_Jump_Location location = {0};
if (parse_jump_from_buffer_line(app, &global_part,
view.buffer_id, view.cursor.line, false,
&location)){
if (parse_jump_from_buffer_line(app, &global_part, view.buffer_id, view.cursor.line, false, &location)){
exec_command(app, change_active_panel);
view = get_active_view(app, AccessAll);
jump_to_location(app, &view, &location);
if (auto_center_after_jumps){
center_view(app);
}
}
end_temp_memory(temp);
}
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel){
Temp_Memory temp = begin_temp_memory(&global_part);
View_Summary view = get_active_view(app, AccessProtected);
Name_Based_Jump_Location location = {0};
if (parse_jump_from_buffer_line(app, &global_part, view.buffer_id, view.cursor.line, false, &location)){
view = get_active_view(app, AccessAll);
jump_to_location(app, &view, &location);
if (auto_center_after_jumps){
center_view(app);
}
}
end_temp_memory(temp);
}
//
// Error Jumping
//
static int32_t
static bool32
seek_next_jump_in_buffer(Application_Links *app, Partition *part, int32_t buffer_id, int32_t first_line, bool32 skip_sub_errors, int32_t direction, int32_t *line_out, int32_t *colon_index_out, Name_Based_Jump_Location *location_out){
Assert(direction == 1 || direction == -1);
int32_t result = false;
bool32 result = false;
int32_t line = first_line;
String line_str = {0};
Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll);
@ -146,23 +161,22 @@ advance_cursor_in_jump_view(Application_Links *app, Partition *part, View_Summar
return(result);
}
static int32_t
seek_jump(Application_Links *app, Partition *part, int32_t skip_repeats, int32_t skip_sub_errors, int32_t direction){
int32_t result = 0;
static bool32
seek_jump(Application_Links *app, Partition *part, bool32 skip_repeats, bool32 skip_sub_errors, int32_t direction){
bool32 result = false;
View_Summary view = get_view_for_locked_jump_buffer(app);
if (view.exists){
Name_Based_Jump_Location location = {0};
if (advance_cursor_in_jump_view(app, &global_part, &view, skip_repeats, skip_sub_errors, direction, &location)){
View_Summary active_view = get_active_view(app, AccessAll);
if (active_view.view_id == view.view_id){
exec_command(app, change_active_panel);
change_active_panel(app);
active_view = get_active_view(app, AccessAll);
}
jump_to_location(app, &active_view, &location);
result = 1;
result = true;
}
}
@ -171,29 +185,29 @@ seek_jump(Application_Links *app, Partition *part, int32_t skip_repeats, int32_t
CUSTOM_COMMAND_SIG(goto_next_jump){
int32_t skip_repeats = true;
int32_t skip_sub_errors = true;
bool32 skip_repeats = true;
bool32 skip_sub_errors = true;
int32_t dir = 1;
seek_jump(app, &global_part, skip_repeats, skip_sub_errors, dir);
}
CUSTOM_COMMAND_SIG(goto_prev_jump){
int32_t skip_repeats = true;
int32_t skip_sub_errors = true;
bool32 skip_repeats = true;
bool32 skip_sub_errors = true;
int32_t dir = -1;
seek_jump(app, &global_part, skip_repeats, skip_sub_errors, dir);
}
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips){
int32_t skip_repeats = false;
int32_t skip_sub_errors = true;
bool32 skip_repeats = false;
bool32 skip_sub_errors = true;
int32_t dir = 1;
seek_jump(app, &global_part, skip_repeats, skip_sub_errors, dir);
}
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips){
int32_t skip_repeats = false;
int32_t skip_sub_errors = true;
bool32 skip_repeats = false;
bool32 skip_sub_errors = true;
int32_t dir = -1;
seek_jump(app, &global_part, skip_repeats, skip_sub_errors, dir);
}
@ -218,11 +232,24 @@ CUSTOM_COMMAND_SIG(newline_or_goto_position){
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessProtected);
if (buffer.lock_flags & AccessProtected){
exec_command(app, goto_jump_at_cursor);
goto_jump_at_cursor(app);
lock_jump_buffer(buffer);
}
else{
exec_command(app, write_character);
write_character(app);
}
}
CUSTOM_COMMAND_SIG(newline_or_goto_position_same_panel){
View_Summary view = get_active_view(app, AccessProtected);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessProtected);
if (buffer.lock_flags & AccessProtected){
goto_jump_at_cursor_same_panel(app);
lock_jump_buffer(buffer);
}
else{
write_character(app);
}
}

View File

@ -684,14 +684,14 @@ list_all_locations_of_identifier_parameters(Application_Links *app, bool32 subst
bool32 success = buffer_get_token_index(app, &buffer, view.cursor.pos, &get_result);
if (success && !get_result.in_whitespace){
char space[128];
char space[256];
int32_t size = get_result.token_end - get_result.token_start;
if (size > 0 && size <= sizeof(space)){
success = buffer_read_range(app, &buffer, get_result.token_start, get_result.token_end, space);
if (success){
String str = make_string(space, size);
exec_command(app, change_active_panel);
change_active_panel(app);
uint32_t flags = 0;
if (substrings){

View File

@ -1,198 +0,0 @@
/*
4coder_windows_bindings.cpp - Supplies bindings very similar to the bindings in modern style editors like notepad.
TYPE: 'build-target'
*/
// TOP
#if !defined(FCODER_WINDOWS_BINDINGS_CPP)
#define FCODER_WINDOWS_BINDINGS_CPP
#include "4coder_default_include.cpp"
void
default_keys(Bind_Helper *context){
begin_map(context, mapid_global);
bind(context, 't', MDFR_CTRL, open_panel_vsplit);
bind(context, 'T', MDFR_CTRL, open_panel_hsplit);
bind(context, 'w', MDFR_CTRL, close_panel);
bind(context, '\t', MDFR_CTRL, change_active_panel);
bind(context, '\t', MDFR_CTRL | MDFR_SHIFT, change_active_panel_backwards);
bind(context, 'n', MDFR_CTRL, interactive_new);
bind(context, 'n', MDFR_ALT, new_in_other);
bind(context, 'o', MDFR_CTRL, interactive_open);
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, 'S', MDFR_CTRL, save_all_dirty_buffers);
bind(context, 'c', MDFR_ALT, open_color_tweaker);
bind(context, 'd', MDFR_ALT, open_debug);
bind(context, '\\', MDFR_CTRL, change_to_build_panel);
bind(context, '|', MDFR_CTRL, close_build_panel);
bind(context, key_down, MDFR_ALT, goto_next_error);
bind(context, key_up, MDFR_ALT, goto_prev_error);
bind(context, key_up, MDFR_ALT | MDFR_SHIFT, goto_first_error);
bind(context, 'z', MDFR_ALT, execute_any_cli);
bind(context, 'Z', MDFR_ALT, execute_previous_cli);
bind(context, 'x', MDFR_ALT, execute_arbitrary_command);
bind(context, 's', MDFR_ALT, show_scrollbar);
bind(context, 'w', MDFR_ALT, hide_scrollbar);
bind(context, '@', MDFR_ALT, toggle_mouse);
bind(context, key_page_up, MDFR_CTRL, toggle_fullscreen);
bind(context, 'W', MDFR_CTRL, exit_4coder);
bind(context, key_f4, MDFR_ALT, exit_4coder);
bind(context, key_f1, MDFR_NONE, project_fkey_command);
bind(context, key_f2, MDFR_NONE, project_fkey_command);
bind(context, key_f3, MDFR_NONE, project_fkey_command);
bind(context, key_f4, MDFR_NONE, project_fkey_command);
bind(context, key_f5, MDFR_NONE, project_fkey_command);
bind(context, key_f6, MDFR_NONE, project_fkey_command);
bind(context, key_f7, MDFR_NONE, project_fkey_command);
bind(context, key_f8, MDFR_NONE, project_fkey_command);
bind(context, key_f9, MDFR_NONE, project_fkey_command);
bind(context, key_f10, MDFR_NONE, project_fkey_command);
bind(context, key_f11, MDFR_NONE, project_fkey_command);
bind(context, key_f12, MDFR_NONE, project_fkey_command);
bind(context, key_f13, MDFR_NONE, project_fkey_command);
bind(context, key_f14, MDFR_NONE, project_fkey_command);
bind(context, key_f15, MDFR_NONE, project_fkey_command);
bind(context, key_f16, MDFR_NONE, project_fkey_command);
end_map(context);
begin_map(context, default_code_map);
inherit_map(context, mapid_file);
bind(context, key_right, MDFR_CTRL, seek_alphanumeric_or_camel_right);
bind(context, key_left, MDFR_CTRL, seek_alphanumeric_or_camel_left);
bind(context, key_right, MDFR_ALT, seek_whitespace_right);
bind(context, key_left, MDFR_ALT, seek_whitespace_left);
bind(context, '\n', MDFR_NONE, write_and_auto_tab);
bind(context, '\n', MDFR_SHIFT, write_and_auto_tab);
bind(context, '}', MDFR_NONE, write_and_auto_tab);
bind(context, ')', MDFR_NONE, write_and_auto_tab);
bind(context, ']', MDFR_NONE, write_and_auto_tab);
bind(context, ';', MDFR_NONE, write_and_auto_tab);
bind(context, '#', MDFR_NONE, write_and_auto_tab);
bind(context, ' ', MDFR_ALT, word_complete);
bind(context, '\t', MDFR_NONE, auto_tab_line_at_cursor);
bind(context, '\t', MDFR_SHIFT, auto_tab_range);
bind(context, 't', MDFR_ALT, write_todo);
bind(context, 'y', MDFR_ALT, write_note);
bind(context, 'r', MDFR_ALT, write_block);
bind(context, '[', MDFR_CTRL, open_long_braces);
bind(context, '{', MDFR_CTRL, open_long_braces_semicolon);
bind(context, '}', MDFR_CTRL, open_long_braces_break);
bind(context, 'i', MDFR_ALT, if0_off);
bind(context, '1', MDFR_ALT, open_file_in_quotes);
bind(context, '2', MDFR_ALT, open_matching_file_cpp);
bind(context, '0', MDFR_CTRL, write_zero_struct);
bind(context, 'I', MDFR_CTRL, list_all_functions_current_buffer);
end_map(context);
begin_map(context, mapid_file);
bind_vanilla_keys(context, write_character);
bind(context, key_mouse_left, MDFR_NONE, click_set_cursor);
bind(context, key_mouse_left_release, MDFR_NONE, click_set_mark);
bind(context, key_mouse_right, MDFR_NONE, click_set_mark);
bind(context, key_left, MDFR_NONE, move_left);
bind(context, key_right, MDFR_NONE, move_right);
bind(context, key_del, MDFR_NONE, delete_char);
bind(context, key_del, MDFR_SHIFT, delete_char);
bind(context, key_back, MDFR_NONE, backspace_char);
bind(context, key_back, MDFR_SHIFT, backspace_char);
bind(context, key_up, MDFR_NONE, move_up);
bind(context, key_down, MDFR_NONE, move_down);
bind(context, key_end, MDFR_NONE, seek_end_of_line);
bind(context, key_home, MDFR_NONE, seek_beginning_of_line);
bind(context, key_page_up, MDFR_NONE, page_up);
bind(context, key_page_down, MDFR_NONE, page_down);
bind(context, key_right, MDFR_CTRL, seek_alphanumeric_or_camel_right);
bind(context, key_left, MDFR_CTRL, seek_alphanumeric_or_camel_left);
bind(context, key_right, MDFR_ALT, seek_whitespace_right);
bind(context, key_left, MDFR_ALT, seek_whitespace_left);
bind(context, key_up, MDFR_CTRL, seek_whitespace_up_end_line);
bind(context, key_down, MDFR_CTRL, seek_whitespace_down_end_line);
bind(context, key_back, MDFR_CTRL, backspace_word);
bind(context, key_del, MDFR_CTRL, delete_word);
bind(context, key_back, MDFR_ALT, snipe_token_or_word);
bind(context, ' ', MDFR_CTRL, set_mark);
bind(context, 'a', MDFR_CTRL, select_all);
bind(context, 'c', MDFR_CTRL, copy);
bind(context, 'd', MDFR_CTRL, duplicate_line);
bind(context, 'f', MDFR_ALT, list_all_locations);
bind(context, 'f', MDFR_CTRL, list_all_substring_locations_case_insensitive);
bind(context, 'F', MDFR_CTRL, list_all_locations_of_identifier);
bind(context, 'F', MDFR_ALT, list_all_locations_of_identifier_case_insensitive);
bind(context, 'e', MDFR_CTRL, center_view);
bind(context, 'E', MDFR_CTRL, left_adjust_view);
bind(context, 'g', MDFR_CTRL, goto_line);
bind(context, 'h', MDFR_CTRL, query_replace);
bind(context, 'H', MDFR_CTRL, replace_in_range);
bind(context, 'i', MDFR_CTRL, search);
bind(context, 'I', MDFR_CTRL, reverse_search);
bind(context, 'K', MDFR_CTRL, kill_buffer);
bind(context, 'l', MDFR_CTRL, delete_line);
bind(context, 'L', MDFR_ALT, toggle_line_wrap);
bind(context, 'O', MDFR_CTRL, reopen);
bind(context, 's', MDFR_CTRL, save);
bind(context, 'S', MDFR_ALT, save_as);
bind(context, 'v', MDFR_CTRL, paste_and_indent);
bind(context, 'v', MDFR_ALT, toggle_virtual_whitespace);
bind(context, 'V', MDFR_CTRL, paste_next_and_indent);
bind(context, 'x', MDFR_CTRL, cut);
bind(context, 'y', MDFR_CTRL, redo);
bind(context, 'z', MDFR_CTRL, undo);
bind(context, '2', MDFR_CTRL, decrease_line_wrap);
bind(context, '3', MDFR_CTRL, increase_line_wrap);
bind(context, '?', MDFR_CTRL, toggle_show_whitespace);
bind(context, '~', MDFR_CTRL, clean_all_lines);
bind(context, '\n', MDFR_NONE, newline_or_goto_position);
bind(context, '\n', MDFR_SHIFT, newline_or_goto_position);
bind(context, ' ', MDFR_SHIFT, write_character);
end_map(context);
}
#ifndef NO_BINDING
extern "C" int32_t
get_bindings(void *data, int32_t size){
Bind_Helper context_ = begin_bind_helper(data, size);
Bind_Helper *context = &context_;
set_all_default_hooks(context);
default_keys(context);
int32_t result = end_bind_helper(context);
return(result);
}
#endif //NO_BINDING
#endif
// BOTTOM

57
4ed.cpp
View File

@ -275,7 +275,7 @@ panel_make_empty(System_Functions *system, App_Vars *vars, Panel *panel){
Assert(panel->view == 0);
new_view = live_set_alloc_view(&vars->live_set, panel, models);
view_set_file(system, new_view.view, models->scratch_buffer, models);
new_view.view->map = get_map(models, mapid_file);
new_view.view->map = get_map(models, models->scratch_buffer->settings.base_map_id);
return(new_view.view);
}
@ -965,7 +965,7 @@ enum Command_Line_Action{
CLAct_WindowFullscreen,
CLAct_WindowStreamMode,
CLAct_FontSize,
CLAct_FontStartHinting,
CLAct_FontUseHinting,
CLAct_Count
};
@ -1010,9 +1010,6 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
if (arg[0] == '-'){
action = CLAct_Ignore;
switch (arg[1]){
case 'u': action = CLAct_UserFile; strict = 0; break;
case 'U': action = CLAct_UserFile; strict = 1; break;
case 'd': action = CLAct_CustomDLL; strict = 0; break;
case 'D': action = CLAct_CustomDLL; strict = 1; break;
@ -1025,7 +1022,7 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
case 'S': action = CLAct_WindowStreamMode; break;
case 'f': action = CLAct_FontSize; break;
case 'h': action = CLAct_FontStartHinting; --i; break;
case 'h': action = CLAct_FontUseHinting; --i; break;
}
}
else if (arg[0] != 0){
@ -1036,18 +1033,9 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
}
}break;
case CLAct_UserFile:
{
settings->user_file_is_strict = strict;
if (i < clparams.argc){
settings->user_file = clparams.argv[i];
}
action = CLAct_Nothing;
}break;
case CLAct_CustomDLL:
{
plat_settings->custom_dll_is_strict = strict;
plat_settings->custom_dll_is_strict = (b8)strict;
if (i < clparams.argc){
plat_settings->custom_dll = clparams.argv[i];
}
@ -1065,7 +1053,7 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
case CLAct_WindowSize:
{
if (i + 1 < clparams.argc){
plat_settings->set_window_size = 1;
plat_settings->set_window_size = true;
plat_settings->window_w = str_to_int_c(clparams.argv[i]);
plat_settings->window_h = str_to_int_c(clparams.argv[i+1]);
@ -1077,14 +1065,14 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
case CLAct_WindowMaximize:
{
--i;
plat_settings->maximize_window = 1;
plat_settings->maximize_window = true;
action = CLAct_Nothing;
}break;
case CLAct_WindowPosition:
{
if (i + 1 < clparams.argc){
plat_settings->set_window_pos = 1;
plat_settings->set_window_pos = true;
plat_settings->window_x = str_to_int_c(clparams.argv[i]);
plat_settings->window_y = str_to_int_c(clparams.argv[i+1]);
@ -1096,29 +1084,29 @@ init_command_line_settings(App_Settings *settings, Plat_Settings *plat_settings,
case CLAct_WindowFullscreen:
{
--i;
plat_settings->fullscreen_window = 1;
plat_settings->stream_mode = 1;
plat_settings->fullscreen_window = true;
plat_settings->stream_mode = true;
action = CLAct_Nothing;
}break;
case CLAct_WindowStreamMode:
{
--i;
plat_settings->stream_mode = 1;
plat_settings->stream_mode = true;
action = CLAct_Nothing;
}break;
case CLAct_FontSize:
{
if (i < clparams.argc){
settings->font_size = str_to_int_c(clparams.argv[i]);
plat_settings->font_size = str_to_int_c(clparams.argv[i]);
}
action = CLAct_Nothing;
}break;
case CLAct_FontStartHinting:
case CLAct_FontUseHinting:
{
plat_settings->use_hinting = 1;
plat_settings->use_hinting = true;
action = CLAct_Nothing;
}break;
}
@ -1155,7 +1143,7 @@ App_Read_Command_Line_Sig(app_read_command_line){
App_Settings *settings = &vars->models.settings;
*settings = null_app_settings;
settings->font_size = 16;
plat_settings->font_size = 16;
if (clparams.argc > 1){
init_command_line_settings(&vars->models.settings, plat_settings, clparams);
@ -1480,7 +1468,7 @@ App_Init_Sig(app_init){
struct File_Init{
String name;
Editing_File **ptr;
i32 type;
b32 read_only;
};
File_Init init_files[] = {
@ -1492,16 +1480,11 @@ App_Init_Sig(app_init){
Editing_File *file = working_set_alloc_always(&models->working_set, general);
buffer_bind_name(general, &models->working_set, file, init_files[i].name);
switch (init_files[i].type){
case 0:
{
init_normal_file(system, models, file, 0, 0);
}break;
case 1:
{
init_read_only_file(system, models, file);
}break;
if (init_files[i].read_only){
init_read_only_file(system, models, file);
}
else{
init_normal_file(system, models, file, 0, 0);
}
file->settings.never_kill = true;

20
4ed.h
View File

@ -38,30 +38,32 @@ get_single_key(Key_Input_Data *data, i32 index){
return(key);
}
typedef struct Input_Summary{
struct Input_Summary{
Mouse_State mouse;
Key_Input_Data keys;
f32 dt;
} Input_Summary;
};
typedef struct Command_Line_Parameters{
struct Command_Line_Parameters{
char **argv;
int32_t argc;
} Command_Line_Parameters;
};
typedef struct Plat_Settings{
struct Plat_Settings{
char *custom_dll;
b32 custom_dll_is_strict;
b32 fullscreen_window;
b32 stream_mode;
b8 custom_dll_is_strict;
b8 fullscreen_window;
b8 stream_mode;
i32 window_w, window_h;
i32 window_x, window_y;
b8 set_window_pos;
b8 set_window_size;
b8 maximize_window;
b8 use_hinting;
} Plat_Settings;
i32 font_size;
};
#define App_Read_Command_Line_Sig(name) \
i32 name(System_Functions *system, Application_Memory *memory, String current_directory, Plat_Settings *plat_settings, char ***files, i32 **file_count, Command_Line_Parameters clparams)

View File

@ -900,13 +900,7 @@ DOC_SEE(Buffer_Setting_ID)
case BufferSetting_MapID:
{
if (value == mapid_global){
file->settings.base_map_id = mapid_global;
}
else if (value == mapid_file){
file->settings.base_map_id = mapid_file;
}
else if (value < mapid_global){
if (value < mapid_global){
new_mapid = get_map_index(models, value);
if (new_mapid < models->user_map_count){
file->settings.base_map_id = value;
@ -915,6 +909,9 @@ DOC_SEE(Buffer_Setting_ID)
file->settings.base_map_id = mapid_file;
}
}
else if (value <= mapid_nomap){
file->settings.base_map_id = value;
}
for (View_Iter iter = file_view_iter_init(&models->layout, file, 0);
file_view_iter_good(iter);
@ -2076,11 +2073,9 @@ DOC(This call changes 4coder's color pallet to one of the built in themes.)
Style_Library *styles = &cmd->models->styles;
String theme_name = make_string(name, len);
i32 i = 0;
i32 count = styles->count;
Style *s = styles->styles;
for (i = 0; i < count; ++i, ++s){
for (i32 i = 0; i < count; ++i, ++s){
if (match_ss(s->name, theme_name)){
style_copy(main_style(cmd->models), s);
break;
@ -2093,29 +2088,22 @@ Change_Font(Application_Links *app, char *name, int32_t len, bool32 apply_to_all
/*
DOC_PARAM(name, The name parameter specifies the name of the font to begin using; it need not be null terminated.)
DOC_PARAM(len, The len parameter specifies the length of the name string.)
DOC_PARAM(apply_to_all_files, If this is set all open files change to this font. Usually this should be true
durring the start hook because several files already exist at that time.)
DOC_PARAM(apply_to_all_files, If this is set all open files change to this font. Usually this should be true durring the start hook because several files already exist at that time.)
DOC(This call changes 4coder's default font to one of the built in fonts.)
*/{
#if 0
Command_Data *cmd = (Command_Data*)app->cmd_context;
Font_Set *set = cmd->models->font_set;
Models *models = cmd->models;
System_Functions *system = cmd->system;
Style_Font *global_font = &cmd->models->global_font;
String font_name = make_string(name, len);
i16 font_id = 0;
Font_ID font_id = font_get_id_by_name(system, font_name);
if (font_set_extract(set, font_name, &font_id)){
if (apply_to_all_files){
global_set_font(cmd->models, font_id);
}
else{
global_font->font_id = font_id;
}
if (apply_to_all_files){
global_set_font(system, models, font_id);
}
else{
models->global_font_id = font_id;
}
#endif
}
API_EXPORT void
@ -2127,22 +2115,16 @@ DOC_PARAM(len, The len parameter specifies the length of the name string.)
DOC(This call sets the display font of a particular buffer.)
*/{
#if 0
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
System_Functions *system = cmd->system;
Editing_File *file = imp_get_file(cmd, buffer);
if (file){
Font_Set *set = models->font_set;
if (file != 0){
String font_name = make_string(name, len);
i16 font_id = 0;
if (font_set_extract(set, font_name, &font_id)){
file_set_font(models, file, font_id);
}
Font_ID font_id = font_get_id_by_name(system, font_name);
file_set_font(system, models, file, font_id);
}
#endif
}
API_EXPORT bool32
@ -2152,23 +2134,21 @@ DOC_PARAM(buffer, the buffer from which to get the font name)
DOC_PARAM(name_out, a character array in which to write the name of the font)
DOC_PARAM(name_max, the capacity of name_out)
DOC_RETURN(returns non-zero on success)
*/
{
bool32 result = false;
#if 0
*/{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
System_Functions *system = cmd->system;
Editing_File *file = imp_get_file(cmd, buffer);
if (file){
Font_Set *set = models->font_set;
bool32 result = false;
if (file != 0){
String name = make_string_cap(name_out, 0, name_max);
if (font_set_get_name(set, file->settings.font_id, &name)){
result = (name.size > 0);
Font_ID font_id = file->settings.font_id;
name.size = system->font.get_name_by_id(font_id, name_out, name_max);
if (name.size > 0){
result = true;
}
}
#endif
return(result);
}
@ -2178,8 +2158,7 @@ Set_Theme_Colors(Application_Links *app, Theme_Color *colors, int32_t count)
/*
DOC_PARAM(colors, The colors pointer provides an array of color structs pairing differet style tags to color codes.)
DOC_PARAM(count, The count parameter specifies the number of Theme_Color structs in the colors array.)
DOC(
For each struct in the array, the slot in the main color pallet specified by the struct's tag is set to the color code in the struct. If the tag value is invalid no change is made to the color pallet.)
DOC(For each struct in the array, the slot in the main color pallet specified by the struct's tag is set to the color code in the struct. If the tag value is invalid no change is made to the color pallet.)
DOC_SEE(Theme_Color)
*/{
Command_Data *cmd = (Command_Data*)app->cmd_context;

View File

@ -10,9 +10,6 @@
// TOP
struct App_Settings{
char *user_file;
b32 user_file_is_strict;
char *init_files[8];
i32 init_files_count;
i32 init_files_max;
@ -20,8 +17,6 @@ struct App_Settings{
i32 initial_line;
b32 lctrl_lalt_is_altgr;
i32 font_size;
char *custom_font_file;
char *custom_font_name;
i32 custom_font_size;

View File

@ -1966,7 +1966,6 @@ file_set_min_base_width(System_Functions *system, Models *models, Editing_File *
internal void
file_create_from_string(System_Functions *system, Models *models, Editing_File *file, String val, b8 read_only = 0){
//Font_Set *font_set = models->font_set;
General_Memory *general = &models->mem.general;
Partition *part = &models->mem.part;
Open_File_Hook_Function *hook_open_file = models->hook_open_file;
@ -2037,7 +2036,7 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File *
if (hook_open_file){
hook_open_file(app_links, file->id.id);
}
file->settings.is_initialized = 1;
file->settings.is_initialized = true;
}
internal void
@ -5437,9 +5436,7 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
SHOW_GUI_BLANK(0);
{
Command_Map *map = view_ptr->map;
#define MAP_LABEL "command map"
if (map == &models->map_top){
SHOW_GUI_STRING(1, h_align, MAP_LABEL, "global");
}
@ -5449,10 +5446,12 @@ step_file_view(System_Functions *system, View *view, View *active_view, Input_Su
else if (map == &models->map_ui){
SHOW_GUI_STRING(1, h_align, MAP_LABEL, "gui");
}
else{
else if (map == 0){
SHOW_GUI_STRING(1, h_align, MAP_LABEL, "nomap");
}
else if (map >= models->user_maps){
i32 map_index = (i32)(view_ptr->map - models->user_maps);
i32 map_id = models->map_id_table[map_index];
SHOW_GUI_STRING(1, h_align, MAP_LABEL, "user");
SHOW_GUI_INT(2, h_align, "custom map id", map_id);
}

View File

@ -20,16 +20,16 @@ struct Glyph_Page;
#define Sys_Font_Get_Count_Sig(name_) u32 (name_)(void)
typedef Sys_Font_Get_Count_Sig(Font_Get_Count_Function);
#define Sys_Font_Get_IDs_By_Index_Sig(name_) b32 (name_)(u32 first_index, u32 index_count, u32 *id_out)
#define Sys_Font_Get_IDs_By_Index_Sig(name_) b32 (name_)(Font_ID first_index, u32 index_count, u32 *id_out)
typedef Sys_Font_Get_IDs_By_Index_Sig(Font_Get_IDs_By_Index_Function);
#define Sys_Font_Get_Name_By_Index_Sig(name_) u32 (name_)(u32 font_index, char *str_out, u32 str_out_cap)
typedef Sys_Font_Get_Name_By_Index_Sig(Font_Get_Name_By_Index_Function);
#define Sys_Font_Get_Name_By_ID_Sig(name_) u32 (name_)(u32 font_id, char *str_out, u32 str_out_cap)
#define Sys_Font_Get_Name_By_ID_Sig(name_) u32 (name_)(Font_ID font_id, char *str_out, u32 str_out_cap)
typedef Sys_Font_Get_Name_By_ID_Sig(Font_Get_Name_By_ID_Function);
#define Sys_Font_Get_Render_Data_By_ID_Sig(name_) Render_Font* (name_)(u32 font_id)
#define Sys_Font_Get_Render_Data_By_ID_Sig(name_) Render_Font* (name_)(Font_ID font_id)
typedef Sys_Font_Get_Render_Data_By_ID_Sig(Font_Get_Render_Data_By_ID_Function);
#define Sys_Font_Load_Page_Sig(name_) void (name_)(Render_Font *font, Glyph_Page *page, u32 page_number)
@ -53,6 +53,8 @@ struct Font_Functions{
Font_Free_Function *free;
};
internal u32 font_get_id_by_name(struct System_Functions *system, String name);
internal f32 font_get_byte_advance(Render_Font *font);
internal f32*font_get_byte_sub_advances(Render_Font *font);
internal i32 font_get_height(Render_Font *font);

View File

@ -11,6 +11,22 @@
#include "4ed_font_data.h"
internal u32
font_get_id_by_name(System_Functions *system, String name){
u32 id = 0;
u32 count = system->font.get_count();
for (u32 index = 0; index < count; ++index){
char str[256];
u32 str_len = system->font.get_name_by_index(index, str, sizeof(str));
String font_name = make_string(str, str_len);
if (match_ss(font_name, name)){
system->font.get_ids_by_index(index, 1, &id);
break;
}
}
return(id);
}
internal f32
font_get_byte_advance(Render_Font *font){
return(font->byte_advance);

View File

@ -3162,7 +3162,7 @@ main(int argc, char **argv)
// Font System Init
//
system_font_init(&linuxvars.system.font, 0, 0, 16, true);
system_font_init(&linuxvars.system.font, 0, 0, linuxvars.settings.font_size, linuxvars.settings.use_hinting);
//
// Epoll init

View File

@ -71,7 +71,7 @@ Sys_Font_Get_Render_Data_By_ID_Sig(system_font_get_render_data_by_id){
internal
Sys_Font_Load_Page_Sig(system_font_load_page){
system_set_page(&linuxvars.system, &linux_fonts.part, font, page, page_number, 16, true);
system_set_page(&linuxvars.system, &linux_fonts.part, font, page, page_number, linuxvars.settings.font_size, linuxvars.settings.use_hinting);
}
internal

View File

@ -2197,7 +2197,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
// Font System Init
//
system_font_init(&win32vars.system.font, 0, 0, 16, true);
system_font_init(&win32vars.system.font, 0, 0, win32vars.settings.font_size, win32vars.settings.use_hinting);
//
// Misc System Initializations

View File

@ -71,7 +71,7 @@ Sys_Font_Get_Render_Data_By_ID_Sig(system_font_get_render_data_by_id){
internal
Sys_Font_Load_Page_Sig(system_font_load_page){
system_set_page(&win32vars.system, &win32_fonts.part, font, page, page_number, 16, true);
system_set_page(&win32vars.system, &win32_fonts.part, font, page, page_number, win32vars.settings.font_size, win32vars.settings.use_hinting);
}
internal