New heap up and running.

This commit is contained in:
Allen Webster 2018-08-18 01:16:52 -07:00
parent ace76a2d3f
commit a339c9fc9e
37 changed files with 1258 additions and 1191 deletions

View File

@ -6,7 +6,7 @@
// TOP // TOP
static Partition global_part; static Partition global_part;
static General_Memory global_general; static Heap global_heap;
static void static void
unlock_jump_buffer(void){ unlock_jump_buffer(void){
@ -226,13 +226,14 @@ CUSTOM_DOC("Switch to a named key binding map.")
static void static void
default_4coder_initialize(Application_Links *app, int32_t override_font_size, bool32 override_hinting){ default_4coder_initialize(Application_Links *app, int32_t override_font_size, bool32 override_hinting){
int32_t part_size = (32 << 20); int32_t part_size = (32 << 20);
int32_t general_size = (4 << 20); int32_t heap_size = ( 4 << 20);
void *part_mem = memory_allocate(app, part_size); void *part_mem = memory_allocate(app, part_size);
global_part = make_part(part_mem, part_size); global_part = make_part(part_mem, part_size);
void *general_mem = memory_allocate(app, general_size); void *heap_mem = memory_allocate(app, heap_size);
general_memory_open(&global_general, general_mem, general_size); heap_init(&global_heap);
heap_extend(&global_heap, heap_mem, heap_size);
static const char message[] = "" static const char message[] = ""
"Welcome to " VERSION "\n" "Welcome to " VERSION "\n"

View File

@ -18,10 +18,14 @@
#define FSTRING_IMPLEMENTATION #define FSTRING_IMPLEMENTATION
#include "4coder_lib/4coder_string.h" #include "4coder_lib/4coder_string.h"
#include "4coder_lib/4coder_table.h" #include "4coder_lib/4coder_table.h"
#include "4coder_lib/4coder_mem.h" #include "4coder_lib/4coder_arena.h"
#include "4coder_lib/4coder_heap.h"
#include "4coder_lib/4coder_utf8.h" #include "4coder_lib/4coder_utf8.h"
#include "4coder_lib/4cpp_lexer.h" #include "4coder_lib/4cpp_lexer.h"
#include "4coder_lib/4coder_arena.cpp"
#include "4coder_lib/4coder_heap.cpp"
#include "4coder_ui_helper.h" #include "4coder_ui_helper.h"
#include "4coder_helper.h" #include "4coder_helper.h"
#include "4coder_default_framework.h" #include "4coder_default_framework.h"

View File

@ -7,7 +7,9 @@
#if !defined(FCODER_FILE_ENUMERATOR_CPP) #if !defined(FCODER_FILE_ENUMERATOR_CPP)
#define FCODER_FILE_ENUMERATOR_CPP #define FCODER_FILE_ENUMERATOR_CPP
#include "4coder_lib/4coder_mem.h" #include "4coder_lib/4coder_arena.h"
#include "4coder_lib/4coder_arena.cpp"
#include "4coder_os_comp_cracking.h" #include "4coder_os_comp_cracking.h"
#define FSTRING_IMPLEMENTATION #define FSTRING_IMPLEMENTATION
#include "4coder_lib/4coder_string.h" #include "4coder_lib/4coder_string.h"

View File

@ -21,7 +21,7 @@ struct Application_Links;
#define GET_BUFFER_BY_MARKER_HANDLE_SIG(n) Buffer_Summary n(Application_Links *app, Managed_Object marker_object, Access_Flag access) #define GET_BUFFER_BY_MARKER_HANDLE_SIG(n) Buffer_Summary n(Application_Links *app, Managed_Object marker_object, Access_Flag access)
#define BUFFER_SET_MARKERS_SIG(n) bool32 n(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers) #define BUFFER_SET_MARKERS_SIG(n) bool32 n(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers)
#define BUFFER_GET_MARKERS_SIG(n) bool32 n(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out) #define BUFFER_GET_MARKERS_SIG(n) bool32 n(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out)
#define BUFFER_REMOVE_MARKERS_SIG(n) bool32 n(Application_Links *app, Managed_Object marker) #define BUFFER_REMOVE_MARKERS_SIG(n) bool32 n(Application_Links *app, Managed_Object marker_object)
#define BUFFER_GET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out) #define BUFFER_GET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out)
#define BUFFER_SET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value) #define BUFFER_SET_SETTING_SIG(n) bool32 n(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value)
#define BUFFER_GET_DYNAMIC_SCOPE_SIG(n) Dynamic_Scope n(Application_Links *app, Buffer_ID buffer_id) #define BUFFER_GET_DYNAMIC_SCOPE_SIG(n) Dynamic_Scope n(Application_Links *app, Buffer_ID buffer_id)
@ -61,6 +61,9 @@ struct Application_Links;
#define MANAGED_VARIABLE_CREATE_OR_GET_ID_SIG(n) int32_t n(Application_Links *app, char *null_terminated_name, uint64_t default_value) #define MANAGED_VARIABLE_CREATE_OR_GET_ID_SIG(n) int32_t n(Application_Links *app, char *null_terminated_name, uint64_t default_value)
#define MANAGED_VARIABLE_SET_SIG(n) bool32 n(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value) #define MANAGED_VARIABLE_SET_SIG(n) bool32 n(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value)
#define MANAGED_VARIABLE_GET_SIG(n) bool32 n(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out) #define MANAGED_VARIABLE_GET_SIG(n) bool32 n(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out)
#define MANAGED_MEMORY_ALLOC_SIG(n) Managed_Object n(Application_Links *app, Dynamic_Scope scope, int32_t size)
#define MANAGED_MEMORY_SET_SIG(n) bool32 n(Application_Links *app, Managed_Object object, uint32_t start, uint32_t size, void *mem)
#define MANAGED_MEMORY_GET_SIG(n) bool32 n(Application_Links *app, Managed_Object object, uint32_t start, uint32_t size, void *mem_out)
#define GET_USER_INPUT_SIG(n) User_Input n(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type) #define GET_USER_INPUT_SIG(n) User_Input n(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type)
#define GET_COMMAND_INPUT_SIG(n) User_Input n(Application_Links *app) #define GET_COMMAND_INPUT_SIG(n) User_Input n(Application_Links *app)
#define GET_MOUSE_STATE_SIG(n) Mouse_State n(Application_Links *app) #define GET_MOUSE_STATE_SIG(n) Mouse_State n(Application_Links *app)
@ -162,6 +165,9 @@ typedef MANAGED_VARIABLE_GET_ID_SIG(Managed_Variable_Get_ID_Function);
typedef MANAGED_VARIABLE_CREATE_OR_GET_ID_SIG(Managed_Variable_Create_Or_Get_ID_Function); typedef MANAGED_VARIABLE_CREATE_OR_GET_ID_SIG(Managed_Variable_Create_Or_Get_ID_Function);
typedef MANAGED_VARIABLE_SET_SIG(Managed_Variable_Set_Function); typedef MANAGED_VARIABLE_SET_SIG(Managed_Variable_Set_Function);
typedef MANAGED_VARIABLE_GET_SIG(Managed_Variable_Get_Function); typedef MANAGED_VARIABLE_GET_SIG(Managed_Variable_Get_Function);
typedef MANAGED_MEMORY_ALLOC_SIG(Managed_Memory_Alloc_Function);
typedef MANAGED_MEMORY_SET_SIG(Managed_Memory_Set_Function);
typedef MANAGED_MEMORY_GET_SIG(Managed_Memory_Get_Function);
typedef GET_USER_INPUT_SIG(Get_User_Input_Function); typedef GET_USER_INPUT_SIG(Get_User_Input_Function);
typedef GET_COMMAND_INPUT_SIG(Get_Command_Input_Function); typedef GET_COMMAND_INPUT_SIG(Get_Command_Input_Function);
typedef GET_MOUSE_STATE_SIG(Get_Mouse_State_Function); typedef GET_MOUSE_STATE_SIG(Get_Mouse_State_Function);
@ -265,6 +271,9 @@ Managed_Variable_Get_ID_Function *managed_variable_get_id;
Managed_Variable_Create_Or_Get_ID_Function *managed_variable_create_or_get_id; Managed_Variable_Create_Or_Get_ID_Function *managed_variable_create_or_get_id;
Managed_Variable_Set_Function *managed_variable_set; Managed_Variable_Set_Function *managed_variable_set;
Managed_Variable_Get_Function *managed_variable_get; Managed_Variable_Get_Function *managed_variable_get;
Managed_Memory_Alloc_Function *managed_memory_alloc;
Managed_Memory_Set_Function *managed_memory_set;
Managed_Memory_Get_Function *managed_memory_get;
Get_User_Input_Function *get_user_input; Get_User_Input_Function *get_user_input;
Get_Command_Input_Function *get_command_input; Get_Command_Input_Function *get_command_input;
Get_Mouse_State_Function *get_mouse_state; Get_Mouse_State_Function *get_mouse_state;
@ -367,6 +376,9 @@ Managed_Variable_Get_ID_Function *managed_variable_get_id_;
Managed_Variable_Create_Or_Get_ID_Function *managed_variable_create_or_get_id_; Managed_Variable_Create_Or_Get_ID_Function *managed_variable_create_or_get_id_;
Managed_Variable_Set_Function *managed_variable_set_; Managed_Variable_Set_Function *managed_variable_set_;
Managed_Variable_Get_Function *managed_variable_get_; Managed_Variable_Get_Function *managed_variable_get_;
Managed_Memory_Alloc_Function *managed_memory_alloc_;
Managed_Memory_Set_Function *managed_memory_set_;
Managed_Memory_Get_Function *managed_memory_get_;
Get_User_Input_Function *get_user_input_; Get_User_Input_Function *get_user_input_;
Get_Command_Input_Function *get_command_input_; Get_Command_Input_Function *get_command_input_;
Get_Mouse_State_Function *get_mouse_state_; Get_Mouse_State_Function *get_mouse_state_;
@ -477,6 +489,9 @@ app_links->managed_variable_get_id_ = Managed_Variable_Get_ID;\
app_links->managed_variable_create_or_get_id_ = Managed_Variable_Create_Or_Get_ID;\ app_links->managed_variable_create_or_get_id_ = Managed_Variable_Create_Or_Get_ID;\
app_links->managed_variable_set_ = Managed_Variable_Set;\ app_links->managed_variable_set_ = Managed_Variable_Set;\
app_links->managed_variable_get_ = Managed_Variable_Get;\ app_links->managed_variable_get_ = Managed_Variable_Get;\
app_links->managed_memory_alloc_ = Managed_Memory_Alloc;\
app_links->managed_memory_set_ = Managed_Memory_Set;\
app_links->managed_memory_get_ = Managed_Memory_Get;\
app_links->get_user_input_ = Get_User_Input;\ app_links->get_user_input_ = Get_User_Input;\
app_links->get_command_input_ = Get_Command_Input;\ app_links->get_command_input_ = Get_Command_Input;\
app_links->get_mouse_state_ = Get_Mouse_State;\ app_links->get_mouse_state_ = Get_Mouse_State;\
@ -539,7 +554,7 @@ static inline Managed_Object buffer_add_markers(Application_Links *app, Buffer_I
static inline Buffer_Summary get_buffer_by_marker_handle(Application_Links *app, Managed_Object marker_object, Access_Flag access){return(app->get_buffer_by_marker_handle(app, marker_object, access));} static inline Buffer_Summary get_buffer_by_marker_handle(Application_Links *app, Managed_Object marker_object, Access_Flag access){return(app->get_buffer_by_marker_handle(app, marker_object, access));}
static inline bool32 buffer_set_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers(app, marker_object, first_marker_index, marker_count, source_markers));} static inline bool32 buffer_set_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers(app, marker_object, first_marker_index, marker_count, source_markers));}
static inline bool32 buffer_get_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers(app, marker_object, first_marker_index, marker_count, markers_out));} static inline bool32 buffer_get_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers(app, marker_object, first_marker_index, marker_count, markers_out));}
static inline bool32 buffer_remove_markers(Application_Links *app, Managed_Object marker){return(app->buffer_remove_markers(app, marker));} static inline bool32 buffer_remove_markers(Application_Links *app, Managed_Object marker_object){return(app->buffer_remove_markers(app, marker_object));}
static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting(app, buffer, setting, value_out));} static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting(app, buffer, setting, value_out));}
static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting(app, buffer, setting, value));} static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting(app, buffer, setting, value));}
static inline Dynamic_Scope buffer_get_dynamic_scope(Application_Links *app, Buffer_ID buffer_id){return(app->buffer_get_dynamic_scope(app, buffer_id));} static inline Dynamic_Scope buffer_get_dynamic_scope(Application_Links *app, Buffer_ID buffer_id){return(app->buffer_get_dynamic_scope(app, buffer_id));}
@ -579,6 +594,9 @@ static inline Managed_Variable_ID managed_variable_get_id(Application_Links *app
static inline int32_t managed_variable_create_or_get_id(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create_or_get_id(app, null_terminated_name, default_value));} static inline int32_t managed_variable_create_or_get_id(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create_or_get_id(app, null_terminated_name, default_value));}
static inline bool32 managed_variable_set(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value){return(app->managed_variable_set(app, scope, location, value));} static inline bool32 managed_variable_set(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value){return(app->managed_variable_set(app, scope, location, value));}
static inline bool32 managed_variable_get(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out){return(app->managed_variable_get(app, scope, location, value_out));} static inline bool32 managed_variable_get(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out){return(app->managed_variable_get(app, scope, location, value_out));}
static inline Managed_Object managed_memory_alloc(Application_Links *app, Dynamic_Scope scope, int32_t size){return(app->managed_memory_alloc(app, scope, size));}
static inline bool32 managed_memory_set(Application_Links *app, Managed_Object object, uint32_t start, uint32_t size, void *mem){return(app->managed_memory_set(app, object, start, size, mem));}
static inline bool32 managed_memory_get(Application_Links *app, Managed_Object object, uint32_t start, uint32_t size, void *mem_out){return(app->managed_memory_get(app, object, start, size, mem_out));}
static inline User_Input get_user_input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type){return(app->get_user_input(app, get_type, abort_type));} static inline User_Input get_user_input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type){return(app->get_user_input(app, get_type, abort_type));}
static inline User_Input get_command_input(Application_Links *app){return(app->get_command_input(app));} static inline User_Input get_command_input(Application_Links *app){return(app->get_command_input(app));}
static inline Mouse_State get_mouse_state(Application_Links *app){return(app->get_mouse_state(app));} static inline Mouse_State get_mouse_state(Application_Links *app){return(app->get_mouse_state(app));}
@ -641,7 +659,7 @@ static inline Managed_Object buffer_add_markers(Application_Links *app, Buffer_I
static inline Buffer_Summary get_buffer_by_marker_handle(Application_Links *app, Managed_Object marker_object, Access_Flag access){return(app->get_buffer_by_marker_handle_(app, marker_object, access));} static inline Buffer_Summary get_buffer_by_marker_handle(Application_Links *app, Managed_Object marker_object, Access_Flag access){return(app->get_buffer_by_marker_handle_(app, marker_object, access));}
static inline bool32 buffer_set_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers_(app, marker_object, first_marker_index, marker_count, source_markers));} static inline bool32 buffer_set_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *source_markers){return(app->buffer_set_markers_(app, marker_object, first_marker_index, marker_count, source_markers));}
static inline bool32 buffer_get_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers_(app, marker_object, first_marker_index, marker_count, markers_out));} static inline bool32 buffer_get_markers(Application_Links *app, Managed_Object marker_object, uint32_t first_marker_index, uint32_t marker_count, Marker *markers_out){return(app->buffer_get_markers_(app, marker_object, first_marker_index, marker_count, markers_out));}
static inline bool32 buffer_remove_markers(Application_Links *app, Managed_Object marker){return(app->buffer_remove_markers_(app, marker));} static inline bool32 buffer_remove_markers(Application_Links *app, Managed_Object marker_object){return(app->buffer_remove_markers_(app, marker_object));}
static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting_(app, buffer, setting, value_out));} static inline bool32 buffer_get_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t *value_out){return(app->buffer_get_setting_(app, buffer, setting, value_out));}
static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting_(app, buffer, setting, value));} static inline bool32 buffer_set_setting(Application_Links *app, Buffer_Summary *buffer, Buffer_Setting_ID setting, int32_t value){return(app->buffer_set_setting_(app, buffer, setting, value));}
static inline Dynamic_Scope buffer_get_dynamic_scope(Application_Links *app, Buffer_ID buffer_id){return(app->buffer_get_dynamic_scope_(app, buffer_id));} static inline Dynamic_Scope buffer_get_dynamic_scope(Application_Links *app, Buffer_ID buffer_id){return(app->buffer_get_dynamic_scope_(app, buffer_id));}
@ -681,6 +699,9 @@ static inline Managed_Variable_ID managed_variable_get_id(Application_Links *app
static inline int32_t managed_variable_create_or_get_id(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create_or_get_id_(app, null_terminated_name, default_value));} static inline int32_t managed_variable_create_or_get_id(Application_Links *app, char *null_terminated_name, uint64_t default_value){return(app->managed_variable_create_or_get_id_(app, null_terminated_name, default_value));}
static inline bool32 managed_variable_set(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value){return(app->managed_variable_set_(app, scope, location, value));} static inline bool32 managed_variable_set(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t value){return(app->managed_variable_set_(app, scope, location, value));}
static inline bool32 managed_variable_get(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out){return(app->managed_variable_get_(app, scope, location, value_out));} static inline bool32 managed_variable_get(Application_Links *app, Dynamic_Scope scope, Managed_Variable_ID location, uint64_t *value_out){return(app->managed_variable_get_(app, scope, location, value_out));}
static inline Managed_Object managed_memory_alloc(Application_Links *app, Dynamic_Scope scope, int32_t size){return(app->managed_memory_alloc_(app, scope, size));}
static inline bool32 managed_memory_set(Application_Links *app, Managed_Object object, uint32_t start, uint32_t size, void *mem){return(app->managed_memory_set_(app, object, start, size, mem));}
static inline bool32 managed_memory_get(Application_Links *app, Managed_Object object, uint32_t start, uint32_t size, void *mem_out){return(app->managed_memory_get_(app, object, start, size, mem_out));}
static inline User_Input get_user_input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type){return(app->get_user_input_(app, get_type, abort_type));} static inline User_Input get_user_input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type){return(app->get_user_input_(app, get_type, abort_type));}
static inline User_Input get_command_input(Application_Links *app){return(app->get_command_input_(app));} static inline User_Input get_command_input(Application_Links *app){return(app->get_command_input_(app));}
static inline Mouse_State get_mouse_state(Application_Links *app){return(app->get_mouse_state_(app));} static inline Mouse_State get_mouse_state(Application_Links *app){return(app->get_mouse_state_(app));}

View File

@ -263,21 +263,21 @@ static Command_Metadata fcoder_metacmd_table[202] = {
{ PROC_LINKS(goto_beginning_of_file, 0), "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1168 }, { PROC_LINKS(goto_beginning_of_file, 0), "goto_beginning_of_file", 22, "Sets the cursor to the beginning of the file.", 45, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1168 },
{ PROC_LINKS(goto_end_of_file, 0), "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1175 }, { PROC_LINKS(goto_end_of_file, 0), "goto_end_of_file", 16, "Sets the cursor to the end of the file.", 39, "w:\\4ed\\code\\4coder_seek.cpp", 30, 1175 },
{ PROC_LINKS(goto_first_jump_direct, 0), "goto_first_jump_direct", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 84 }, { PROC_LINKS(goto_first_jump_direct, 0), "goto_first_jump_direct", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 84 },
{ PROC_LINKS(goto_first_jump_same_panel_sticky, 0), "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 532 }, { PROC_LINKS(goto_first_jump_same_panel_sticky, 0), "goto_first_jump_same_panel_sticky", 33, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.", 153, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 517 },
{ PROC_LINKS(goto_first_jump_sticky, 0), "goto_first_jump_sticky", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 514 }, { PROC_LINKS(goto_first_jump_sticky, 0), "goto_first_jump_sticky", 22, "If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.", 95, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 499 },
{ PROC_LINKS(goto_jump_at_cursor_direct, 0), "goto_jump_at_cursor_direct", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 8 }, { PROC_LINKS(goto_jump_at_cursor_direct, 0), "goto_jump_at_cursor_direct", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 8 },
{ PROC_LINKS(goto_jump_at_cursor_same_panel_direct, 0), "goto_jump_at_cursor_same_panel_direct", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list..", 168, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 29 }, { PROC_LINKS(goto_jump_at_cursor_same_panel_direct, 0), "goto_jump_at_cursor_same_panel_direct", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list..", 168, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 29 },
{ PROC_LINKS(goto_jump_at_cursor_same_panel_sticky, 0), "goto_jump_at_cursor_same_panel_sticky", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 360 }, { PROC_LINKS(goto_jump_at_cursor_same_panel_sticky, 0), "goto_jump_at_cursor_same_panel_sticky", 37, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.", 167, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 345 },
{ PROC_LINKS(goto_jump_at_cursor_sticky, 0), "goto_jump_at_cursor_sticky", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 332 }, { PROC_LINKS(goto_jump_at_cursor_sticky, 0), "goto_jump_at_cursor_sticky", 26, "If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.", 187, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 317 },
{ PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 585 }, { PROC_LINKS(goto_line, 0), "goto_line", 9, "Queries the user for a number, and jumps the cursor to the corresponding line.", 78, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 585 },
{ PROC_LINKS(goto_next_jump_direct, 0), "goto_next_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 48 }, { PROC_LINKS(goto_next_jump_direct, 0), "goto_next_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 48 },
{ PROC_LINKS(goto_next_jump_no_skips_direct, 0), "goto_next_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 66 }, { PROC_LINKS(goto_next_jump_no_skips_direct, 0), "goto_next_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 66 },
{ PROC_LINKS(goto_next_jump_no_skips_sticky, 0), "goto_next_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 483 }, { PROC_LINKS(goto_next_jump_no_skips_sticky, 0), "goto_next_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.", 132, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 468 },
{ PROC_LINKS(goto_next_jump_sticky, 0), "goto_next_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 453 }, { PROC_LINKS(goto_next_jump_sticky, 0), "goto_next_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.", 123, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 438 },
{ PROC_LINKS(goto_prev_jump_direct, 0), "goto_prev_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 57 }, { PROC_LINKS(goto_prev_jump_direct, 0), "goto_prev_jump_direct", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 57 },
{ PROC_LINKS(goto_prev_jump_no_skips_direct, 0), "goto_prev_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 75 }, { PROC_LINKS(goto_prev_jump_no_skips_direct, 0), "goto_prev_jump_no_skips_direct", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 75 },
{ PROC_LINKS(goto_prev_jump_no_skips_sticky, 0), "goto_prev_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 499 }, { PROC_LINKS(goto_prev_jump_no_skips_sticky, 0), "goto_prev_jump_no_skips_sticky", 30, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.", 136, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 484 },
{ PROC_LINKS(goto_prev_jump_sticky, 0), "goto_prev_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 469 }, { PROC_LINKS(goto_prev_jump_sticky, 0), "goto_prev_jump_sticky", 21, "If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations.", 127, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 454 },
{ PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 471 }, { PROC_LINKS(hide_filebar, 0), "hide_filebar", 12, "Sets the current view to hide it's filebar.", 43, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 471 },
{ PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 457 }, { PROC_LINKS(hide_scrollbar, 0), "hide_scrollbar", 14, "Sets the current view to hide it's scrollbar.", 45, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 457 },
{ PROC_LINKS(highlight_next_scope_absolute, 0), "highlight_next_scope_absolute", 29, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 363 }, { PROC_LINKS(highlight_next_scope_absolute, 0), "highlight_next_scope_absolute", 29, "Finds the first scope started by '{' after the cursor and puts the cursor and mark on the '{' and '}'.", 102, "w:\\4ed\\code\\4coder_scope_commands.cpp", 40, 363 },
@ -286,41 +286,41 @@ static Command_Metadata fcoder_metacmd_table[202] = {
{ PROC_LINKS(if0_off, 0), "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 82 }, { PROC_LINKS(if0_off, 0), "if0_off", 7, "Surround the range between the cursor and mark with an '#if 0' and an '#endif'", 78, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 82 },
{ PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 519 }, { PROC_LINKS(increase_face_size, 0), "increase_face_size", 18, "Increase the size of the face used by the current buffer.", 57, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 519 },
{ PROC_LINKS(increase_line_wrap, 0), "increase_line_wrap", 18, "Increases the current buffer's width for line wrapping.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 497 }, { PROC_LINKS(increase_line_wrap, 0), "increase_line_wrap", 18, "Increases the current buffer's width for line wrapping.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 497 },
{ PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\4coder_lists.cpp", 31, 647 }, { PROC_LINKS(interactive_kill_buffer, 0), "interactive_kill_buffer", 23, "Interactively kill an open buffer.", 34, "w:\\4ed\\code\\4coder_lists.cpp", 31, 646 },
{ PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 31, 749 }, { PROC_LINKS(interactive_new, 0), "interactive_new", 15, "Interactively creates a new file.", 33, "w:\\4ed\\code\\4coder_lists.cpp", 31, 748 },
{ PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\4coder_lists.cpp", 31, 776 }, { PROC_LINKS(interactive_open, 0), "interactive_open", 16, "Interactively opens a file.", 27, "w:\\4ed\\code\\4coder_lists.cpp", 31, 775 },
{ PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "w:\\4ed\\code\\4coder_lists.cpp", 31, 716 }, { PROC_LINKS(interactive_open_or_new, 0), "interactive_open_or_new", 23, "Interactively open a file out of the file system.", 49, "w:\\4ed\\code\\4coder_lists.cpp", 31, 715 },
{ PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\4coder_lists.cpp", 31, 629 }, { PROC_LINKS(interactive_switch_buffer, 0), "interactive_switch_buffer", 25, "Interactively switch to an open buffer.", 39, "w:\\4ed\\code\\4coder_lists.cpp", 31, 628 },
{ PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1444 }, { PROC_LINKS(kill_buffer, 0), "kill_buffer", 11, "Kills the current buffer.", 25, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1444 },
{ PROC_LINKS(left_adjust_view, 0), "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 135 }, { PROC_LINKS(left_adjust_view, 0), "left_adjust_view", 16, "Sets the left size of the view near the x position of the cursor.", 65, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 135 },
{ PROC_LINKS(list_all_functions_current_buffer, 0), "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "w:\\4ed\\code\\4coder_function_list.cpp", 39, 318 }, { PROC_LINKS(list_all_functions_current_buffer, 0), "list_all_functions_current_buffer", 33, "Creates a jump list of lines of the current buffer that appear to define or declare functions.", 94, "w:\\4ed\\code\\4coder_function_list.cpp", 39, 318 },
{ PROC_LINKS(list_all_locations, 0), "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "w:\\4ed\\code\\4coder_search.cpp", 32, 741 }, { PROC_LINKS(list_all_locations, 0), "list_all_locations", 18, "Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.", 99, "w:\\4ed\\code\\4coder_search.cpp", 32, 747 },
{ PROC_LINKS(list_all_locations_case_insensitive, 0), "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "w:\\4ed\\code\\4coder_search.cpp", 32, 753 }, { PROC_LINKS(list_all_locations_case_insensitive, 0), "list_all_locations_case_insensitive", 35, "Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.", 101, "w:\\4ed\\code\\4coder_search.cpp", 32, 759 },
{ PROC_LINKS(list_all_locations_of_identifier, 0), "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "w:\\4ed\\code\\4coder_search.cpp", 32, 765 }, { PROC_LINKS(list_all_locations_of_identifier, 0), "list_all_locations_of_identifier", 32, "Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.", 102, "w:\\4ed\\code\\4coder_search.cpp", 32, 771 },
{ PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "w:\\4ed\\code\\4coder_search.cpp", 32, 771 }, { PROC_LINKS(list_all_locations_of_identifier_case_insensitive, 0), "list_all_locations_of_identifier_case_insensitive", 49, "Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.", 104, "w:\\4ed\\code\\4coder_search.cpp", 32, 777 },
{ PROC_LINKS(list_all_locations_of_selection, 0), "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "w:\\4ed\\code\\4coder_search.cpp", 32, 777 }, { PROC_LINKS(list_all_locations_of_selection, 0), "list_all_locations_of_selection", 31, "Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.", 102, "w:\\4ed\\code\\4coder_search.cpp", 32, 783 },
{ PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "w:\\4ed\\code\\4coder_search.cpp", 32, 783 }, { PROC_LINKS(list_all_locations_of_selection_case_insensitive, 0), "list_all_locations_of_selection_case_insensitive", 48, "Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.", 104, "w:\\4ed\\code\\4coder_search.cpp", 32, 789 },
{ PROC_LINKS(list_all_locations_of_type_definition, 0), "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "w:\\4ed\\code\\4coder_search.cpp", 32, 789 }, { PROC_LINKS(list_all_locations_of_type_definition, 0), "list_all_locations_of_type_definition", 37, "Queries user for string, lists all locations of strings that appear to define a type whose name matches the input string.", 121, "w:\\4ed\\code\\4coder_search.cpp", 32, 795 },
{ PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "w:\\4ed\\code\\4coder_search.cpp", 32, 800 }, { PROC_LINKS(list_all_locations_of_type_definition_of_identifier, 0), "list_all_locations_of_type_definition_of_identifier", 51, "Reads a token or word under the cursor and lists all locations of strings that appear to define a type whose name matches it.", 125, "w:\\4ed\\code\\4coder_search.cpp", 32, 806 },
{ PROC_LINKS(list_all_substring_locations, 0), "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "w:\\4ed\\code\\4coder_search.cpp", 32, 747 }, { PROC_LINKS(list_all_substring_locations, 0), "list_all_substring_locations", 28, "Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.", 103, "w:\\4ed\\code\\4coder_search.cpp", 32, 753 },
{ PROC_LINKS(list_all_substring_locations_case_insensitive, 0), "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "w:\\4ed\\code\\4coder_search.cpp", 32, 759 }, { PROC_LINKS(list_all_substring_locations_case_insensitive, 0), "list_all_substring_locations_case_insensitive", 45, "Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.", 105, "w:\\4ed\\code\\4coder_search.cpp", 32, 765 },
{ PROC_LINKS(lister__activate, 0), "lister__activate", 16, "A lister mode command that activates the list's action on the highlighted item.", 79, "w:\\4ed\\code\\4coder_lists.cpp", 31, 17 }, { PROC_LINKS(lister__activate, 0), "lister__activate", 16, "A lister mode command that activates the list's action on the highlighted item.", 79, "w:\\4ed\\code\\4coder_lists.cpp", 31, 17 },
{ PROC_LINKS(lister__backspace_text_field, 0), "lister__backspace_text_field", 28, "A lister mode command that dispatches to the lister's backspace text field handler.", 83, "w:\\4ed\\code\\4coder_lists.cpp", 31, 44 }, { PROC_LINKS(lister__backspace_text_field, 0), "lister__backspace_text_field", 28, "A lister mode command that dispatches to the lister's backspace text field handler.", 83, "w:\\4ed\\code\\4coder_lists.cpp", 31, 43 },
{ PROC_LINKS(lister__backspace_text_field__default, 0), "lister__backspace_text_field__default", 37, "A lister mode command that backspaces one character from the text field.", 72, "w:\\4ed\\code\\4coder_lists.cpp", 31, 149 }, { PROC_LINKS(lister__backspace_text_field__default, 0), "lister__backspace_text_field__default", 37, "A lister mode command that backspaces one character from the text field.", 72, "w:\\4ed\\code\\4coder_lists.cpp", 31, 148 },
{ PROC_LINKS(lister__backspace_text_field__file_path, 0), "lister__backspace_text_field__file_path", 39, "A lister mode command that backspaces one character from the text field of a file system list.", 94, "w:\\4ed\\code\\4coder_lists.cpp", 31, 221 }, { PROC_LINKS(lister__backspace_text_field__file_path, 0), "lister__backspace_text_field__file_path", 39, "A lister mode command that backspaces one character from the text field of a file system list.", 94, "w:\\4ed\\code\\4coder_lists.cpp", 31, 220 },
{ PROC_LINKS(lister__mouse_press, 0), "lister__mouse_press", 19, "A lister mode command that beings a click interaction with a list item under the mouse.", 87, "w:\\4ed\\code\\4coder_lists.cpp", 31, 89 }, { PROC_LINKS(lister__mouse_press, 0), "lister__mouse_press", 19, "A lister mode command that beings a click interaction with a list item under the mouse.", 87, "w:\\4ed\\code\\4coder_lists.cpp", 31, 88 },
{ PROC_LINKS(lister__mouse_release, 0), "lister__mouse_release", 21, "A lister mode command that ends a click interaction with a list item under the mouse, possibly activating it.", 109, "w:\\4ed\\code\\4coder_lists.cpp", 31, 101 }, { PROC_LINKS(lister__mouse_release, 0), "lister__mouse_release", 21, "A lister mode command that ends a click interaction with a list item under the mouse, possibly activating it.", 109, "w:\\4ed\\code\\4coder_lists.cpp", 31, 100 },
{ PROC_LINKS(lister__move_down, 0), "lister__move_down", 17, "A lister mode command that dispatches to the lister's navigate down handler.", 76, "w:\\4ed\\code\\4coder_lists.cpp", 31, 64 }, { PROC_LINKS(lister__move_down, 0), "lister__move_down", 17, "A lister mode command that dispatches to the lister's navigate down handler.", 76, "w:\\4ed\\code\\4coder_lists.cpp", 31, 63 },
{ PROC_LINKS(lister__move_down__default, 0), "lister__move_down__default", 26, "A lister mode command that moves the highlighted item one down in the list.", 75, "w:\\4ed\\code\\4coder_lists.cpp", 31, 180 }, { PROC_LINKS(lister__move_down__default, 0), "lister__move_down__default", 26, "A lister mode command that moves the highlighted item one down in the list.", 75, "w:\\4ed\\code\\4coder_lists.cpp", 31, 179 },
{ PROC_LINKS(lister__move_up, 0), "lister__move_up", 15, "A lister mode command that dispatches to the lister's navigate up handler.", 74, "w:\\4ed\\code\\4coder_lists.cpp", 31, 54 }, { PROC_LINKS(lister__move_up, 0), "lister__move_up", 15, "A lister mode command that dispatches to the lister's navigate up handler.", 74, "w:\\4ed\\code\\4coder_lists.cpp", 31, 53 },
{ PROC_LINKS(lister__move_up__default, 0), "lister__move_up__default", 24, "A lister mode command that moves the highlighted item one up in the list.", 73, "w:\\4ed\\code\\4coder_lists.cpp", 31, 164 }, { PROC_LINKS(lister__move_up__default, 0), "lister__move_up__default", 24, "A lister mode command that moves the highlighted item one up in the list.", 73, "w:\\4ed\\code\\4coder_lists.cpp", 31, 163 },
{ PROC_LINKS(lister__quit, 0), "lister__quit", 12, "A lister mode command that quits the list without executing any actions.", 72, "w:\\4ed\\code\\4coder_lists.cpp", 31, 8 }, { PROC_LINKS(lister__quit, 0), "lister__quit", 12, "A lister mode command that quits the list without executing any actions.", 72, "w:\\4ed\\code\\4coder_lists.cpp", 31, 8 },
{ PROC_LINKS(lister__repaint, 0), "lister__repaint", 15, "A lister mode command that updates the lists UI data.", 53, "w:\\4ed\\code\\4coder_lists.cpp", 31, 118 }, { PROC_LINKS(lister__repaint, 0), "lister__repaint", 15, "A lister mode command that updates the lists UI data.", 53, "w:\\4ed\\code\\4coder_lists.cpp", 31, 117 },
{ PROC_LINKS(lister__wheel_scroll, 0), "lister__wheel_scroll", 20, "A lister mode command that scrolls the list in response to the mouse wheel.", 75, "w:\\4ed\\code\\4coder_lists.cpp", 31, 74 }, { PROC_LINKS(lister__wheel_scroll, 0), "lister__wheel_scroll", 20, "A lister mode command that scrolls the list in response to the mouse wheel.", 75, "w:\\4ed\\code\\4coder_lists.cpp", 31, 73 },
{ PROC_LINKS(lister__write_character, 0), "lister__write_character", 23, "A lister mode command that dispatches to the lister's write character handler.", 78, "w:\\4ed\\code\\4coder_lists.cpp", 31, 34 }, { PROC_LINKS(lister__write_character, 0), "lister__write_character", 23, "A lister mode command that dispatches to the lister's write character handler.", 78, "w:\\4ed\\code\\4coder_lists.cpp", 31, 33 },
{ PROC_LINKS(lister__write_character__default, 0), "lister__write_character__default", 32, "A lister mode command that inserts a new character to the text field.", 69, "w:\\4ed\\code\\4coder_lists.cpp", 31, 129 }, { PROC_LINKS(lister__write_character__default, 0), "lister__write_character__default", 32, "A lister mode command that inserts a new character to the text field.", 69, "w:\\4ed\\code\\4coder_lists.cpp", 31, 128 },
{ PROC_LINKS(lister__write_character__file_path, 0), "lister__write_character__file_path", 34, "A lister mode command that inserts a character into the text field of a file system list.", 89, "w:\\4ed\\code\\4coder_lists.cpp", 31, 196 }, { PROC_LINKS(lister__write_character__file_path, 0), "lister__write_character__file_path", 34, "A lister mode command that inserts a character into the text field of a file system list.", 89, "w:\\4ed\\code\\4coder_lists.cpp", 31, 195 },
{ PROC_LINKS(lister__write_character__fixed_list, 0), "lister__write_character__fixed_list", 35, "A lister mode command that handles input for the fixed sure to kill list.", 73, "w:\\4ed\\code\\4coder_lists.cpp", 31, 256 }, { PROC_LINKS(lister__write_character__fixed_list, 0), "lister__write_character__fixed_list", 35, "A lister mode command that handles input for the fixed sure to kill list.", 73, "w:\\4ed\\code\\4coder_lists.cpp", 31, 255 },
{ PROC_LINKS(load_project, 0), "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1071 }, { PROC_LINKS(load_project, 0), "load_project", 12, "Looks for a project.4coder file in the current directory and tries to load it. Looks in parent directories until a project file is found or there are no more parents.", 167, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1071 },
{ PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1132 }, { PROC_LINKS(make_directory_query, 0), "make_directory_query", 20, "Queries the user for a name and creates a new directory with the given name.", 76, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1132 },
{ PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 250 }, { PROC_LINKS(move_down, 0), "move_down", 9, "Moves the cursor down one line.", 31, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 250 },
@ -334,11 +334,11 @@ static Command_Metadata fcoder_metacmd_table[202] = {
{ PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 256 }, { PROC_LINKS(move_up_10, 0), "move_up_10", 10, "Moves the cursor up ten lines.", 30, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 256 },
{ PROC_LINKS(newline_or_goto_position_direct, 0), "newline_or_goto_position_direct", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 101 }, { PROC_LINKS(newline_or_goto_position_direct, 0), "newline_or_goto_position_direct", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 101 },
{ PROC_LINKS(newline_or_goto_position_same_panel_direct, 0), "newline_or_goto_position_same_panel_direct", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 116 }, { PROC_LINKS(newline_or_goto_position_same_panel_direct, 0), "newline_or_goto_position_same_panel_direct", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_direct.cpp", 37, 116 },
{ PROC_LINKS(newline_or_goto_position_same_panel_sticky, 0), "newline_or_goto_position_same_panel_sticky", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 570 }, { PROC_LINKS(newline_or_goto_position_same_panel_sticky, 0), "newline_or_goto_position_same_panel_sticky", 42, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor_same_panel.", 117, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 555 },
{ PROC_LINKS(newline_or_goto_position_sticky, 0), "newline_or_goto_position_sticky", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 555 }, { PROC_LINKS(newline_or_goto_position_sticky, 0), "newline_or_goto_position_sticky", 31, "If the buffer in the active view is writable, inserts a character, otherwise performs goto_jump_at_cursor.", 106, "w:\\4ed\\code\\4coder_jump_sticky.cpp", 37, 540 },
{ PROC_LINKS(open_all_code, 0), "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1055 }, { PROC_LINKS(open_all_code, 0), "open_all_code", 13, "Open all code in the current directory. File types are determined by extensions. An extension is considered code based on the extensions specified in 4coder.config.", 164, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1055 },
{ PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1062 }, { PROC_LINKS(open_all_code_recursive, 0), "open_all_code_recursive", 23, "Works as open_all_code but also runs in all subdirectories.", 59, "w:\\4ed\\code\\4coder_project_commands.cpp", 42, 1062 },
{ PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder theme selector list.", 37, "w:\\4ed\\code\\4coder_lists.cpp", 31, 792 }, { PROC_LINKS(open_color_tweaker, 0), "open_color_tweaker", 18, "Opens the 4coder theme selector list.", 37, "w:\\4ed\\code\\4coder_lists.cpp", 31, 791 },
{ PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1351 }, { PROC_LINKS(open_file_in_quotes, 0), "open_file_in_quotes", 19, "Reads a filename from surrounding '\"' characters and attempts to open the corresponding file.", 94, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1351 },
{ PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1502 }, { PROC_LINKS(open_in_other, 0), "open_in_other", 13, "Interactively opens a file in the other panel.", 46, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1502 },
{ PROC_LINKS(open_long_braces, 0), "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 58 }, { PROC_LINKS(open_long_braces, 0), "open_long_braces", 16, "At the cursor, insert a '{' and '}' separated by a blank line.", 62, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 58 },
@ -416,7 +416,7 @@ static Command_Metadata fcoder_metacmd_table[202] = {
{ PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 543 }, { PROC_LINKS(toggle_virtual_whitespace, 0), "toggle_virtual_whitespace", 25, "Toggles the current buffer's virtual whitespace status.", 55, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 543 },
{ PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1453 }, { PROC_LINKS(undo, 0), "undo", 4, "Advances backwards through the undo history.", 44, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1453 },
{ PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1401 }, { PROC_LINKS(view_buffer_other_panel, 0), "view_buffer_other_panel", 23, "Set the other non-active panel to view the buffer that the active panel views, and switch to that panel.", 104, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 1401 },
{ PROC_LINKS(word_complete, 0), "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "w:\\4ed\\code\\4coder_search.cpp", 32, 820 }, { PROC_LINKS(word_complete, 0), "word_complete", 13, "Iteratively tries completing the word to the left of the cursor with other words in open buffers that have the same prefix string.", 130, "w:\\4ed\\code\\4coder_search.cpp", 32, 826 },
{ PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 745 }, { PROC_LINKS(write_and_auto_tab, 0), "write_and_auto_tab", 18, "Inserts a character and auto-indents the line on which the cursor sits.", 71, "w:\\4ed\\code\\4coder_auto_indent.cpp", 37, 745 },
{ PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 106 }, { PROC_LINKS(write_block, 0), "write_block", 11, "At the cursor, insert a block comment.", 38, "w:\\4ed\\code\\4coder_combined_write_commands.cpp", 49, 106 },
{ PROC_LINKS(write_character, 0), "write_character", 15, "Inserts whatever character was used to trigger this command.", 60, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 33 }, { PROC_LINKS(write_character, 0), "write_character", 15, "Inserts whatever character was used to trigger this command.", 60, "w:\\4ed\\code\\4coder_base_commands.cpp", 39, 33 },

View File

@ -1333,5 +1333,66 @@ push_string_copy(Partition *arena, char *str){
return(push_string_copy(arena, make_string_slowly(str))); return(push_string_copy(arena, make_string_slowly(str)));
} }
static void
sort_pairs_by_key__quick(Sort_Pair_i32 *pairs, int32_t first, int32_t one_past_last){
int32_t dif = one_past_last - first;
if (dif >= 2){
int32_t pivot = one_past_last - 1;
int32_t pivot_key = pairs[pivot].key;
int32_t j = first;
bool32 interleave = false;
for (int32_t i = first; i < pivot; i += 1){
int32_t key = pairs[i].key;
if (key < pivot_key){
pairs[i].key = pairs[j].key;
pairs[j].key = key;
j += 1;
}
else if (key == pivot_key){
if (interleave){
pairs[i].key = pairs[j].key;
pairs[j].key = key;
j += 1;
}
interleave = !interleave;
}
}
pairs[pivot].key = pairs[j].key;
pairs[j].key = pivot_key;
sort_pairs_by_key__quick(pairs, first, j);
sort_pairs_by_key__quick(pairs, j + 1, one_past_last);
}
}
static void
sort_pairs_by_key(Sort_Pair_i32 *pairs, int32_t count){
sort_pairs_by_key__quick(pairs, 0, count);
}
static Range_Array
get_ranges_of_duplicate_keys(Partition *arena, int32_t *keys, int32_t stride, int32_t count){
Range_Array result = {0};
result.ranges = push_array(arena, Range, 0);
uint8_t *ptr = (uint8_t*)keys;
int32_t start_i = 0;
for (int32_t i = 1; i <= count; i += 1){
bool32 is_end = false;
if (i == count){
is_end = true;
}
else if (*(int32_t*)(ptr + i*stride) != *(int32_t*)(ptr + start_i*stride)){
is_end = true;
}
if (is_end){
Range *new_range = push_array(arena, Range, 1);
new_range->first = start_i;
new_range->one_past_last = i;
start_i = i;
}
}
result.count = (int32_t)(push_array(arena, Range, 0) - result.ranges);
return(result);
}
// BOTTOM // BOTTOM

View File

@ -125,6 +125,13 @@ struct Stream_Tokens{
int32_t count, token_count; int32_t count, token_count;
}; };
////////////////////////////////
struct Sort_Pair_i32{
int32_t index;
int32_t key;
};
#endif #endif
// BOTTOM // BOTTOM

View File

@ -90,148 +90,84 @@ parse_buffer_to_jump_array(Application_Links *app, Partition *arena, Buffer_Summ
return(result); return(result);
} }
static Range_Array static char sticky_jump_marker_handle_var[] = "DEFAULT.sticky_jump_marker_handle";
jump_array_mark_buffer_ranges(Partition *arena, Sticky_Jump_Array jumps){ static int32_t sticky_jump_marker_handle_loc;
Range_Array result = {0};
result.ranges = push_array(arena, Range, 0);
int32_t start_i = 0;
for (int32_t i = 1; i <= jumps.count; i += 1){
bool32 is_end = false;
if (i == jumps.count){
is_end = true;
}
else if (jumps.jumps[i].jump_buffer_id != jumps.jumps[start_i].jump_buffer_id){
is_end = true;
}
if (is_end){
Range *new_range = push_array(arena, Range, 1);
new_range->first = start_i;
new_range->one_past_last = i;
start_i = i;
}
}
result.count = (int32_t)(push_array(arena, Range, 0) - result.ranges);
return(result);
}
#if 1
static void static void
init_marker_list(Application_Links *app, Partition *part, General_Memory *general, Buffer_ID buffer_id, init_marker_list(Application_Links *app, Partition *scratch, Heap *heap, Buffer_ID buffer_id,
Marker_List *list){ Marker_List *list){
Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll); Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll);
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(scratch);
Sticky_Jump_Array jumps = parse_buffer_to_jump_array(app, part, buffer); Sticky_Jump_Array jumps = parse_buffer_to_jump_array(app, scratch, buffer);
Range_Array buffer_ranges = jump_array_mark_buffer_ranges(part, jumps); Range_Array buffer_ranges = get_ranges_of_duplicate_keys(scratch,
&jumps.jumps->jump_buffer_id, sizeof(*jumps.jumps),
jumps.count);
Sort_Pair_i32 *range_index_buffer_id_pairs = push_array(scratch, Sort_Pair_i32, buffer_ranges.count);
for (int32_t i = 0; i < buffer_ranges.count; i += 1){
range_index_buffer_id_pairs[i].index = i;
range_index_buffer_id_pairs[i].key = jumps.jumps[buffer_ranges.ranges[i].first].jump_buffer_id;
}
sort_pairs_by_key(range_index_buffer_id_pairs, buffer_ranges.count);
Range_Array grouped_buffer_ranges = get_ranges_of_duplicate_keys(scratch,
&range_index_buffer_id_pairs->key,
sizeof(*range_index_buffer_id_pairs),
buffer_ranges.count);
Dynamic_Scope scope_array[2]; Sticky_Jump_Stored *stored = push_array(scratch, Sticky_Jump_Stored, jumps.count);
Dynamic_Scope scope_array[2] = {0};
scope_array[0] = buffer_get_dynamic_scope(app, buffer_id); scope_array[0] = buffer_get_dynamic_scope(app, buffer_id);
Managed_Object list_sentinel = managed_list_node_alloc(app, scope_array[0]); for (int32_t i = 0; i < grouped_buffer_ranges.count; i += 1){
Range buffer_range_indices = grouped_buffer_ranges.ranges[i];
for (int32_t i = 0; i < buffer_ranges.count; i += 1){
Range range = buffer_ranges.ranges[i]; Temp_Memory marker_temp = begin_temp_memory(scratch);
Buffer_ID target_buffer_id = jumps.jumps[range.first].jump_buffer_id; Marker *markers = push_array(scratch, Marker, 0);
int32_t jump_count = range.one_past_last - range.first; int32_t total_jump_count = 0;
Buffer_ID target_buffer_id = 0;
for (int32_t j = buffer_range_indices.first;
j < buffer_range_indices.one_past_last;
j += 1){
int32_t range_index = range_index_buffer_id_pairs[j].index;
Range range = buffer_ranges.ranges[range_index];
total_jump_count += range.one_past_last - range.first;
if (target_buffer_id == 0){
target_buffer_id = jumps.jumps[range.first].jump_buffer_id;
}
for (int32_t k = range.first; k < range.one_past_last; k += 1){
Marker *new_marker = push_array(scratch, Marker, 1);
new_marker->pos = jumps.jumps[k].jump_pos;
new_marker->lean_right = false;
stored[k].list_line = jumps.jumps[k].list_line;
stored[k].list_colon_index = jumps.jumps[k].list_colon_index;
stored[k].is_sub_error = jumps.jumps[k].is_sub_error;
stored[k].jump_buffer_id = jumps.jumps[k].jump_buffer_id;
stored[k].index_into_marker_array = total_jump_count;
total_jump_count += 1;
}
}
scope_array[1] = buffer_get_dynamic_scope(app, target_buffer_id); scope_array[1] = buffer_get_dynamic_scope(app, target_buffer_id);
Dynamic_Scope scope = get_intersected_dynamic_scope(app, scope_array, ArrayCount(scope_array)); Dynamic_Scope scope = get_intersected_dynamic_scope(app, scope_array, ArrayCount(scope_array));
Managed_Object marker_handle = buffer_add_markers(app, target_buffer_id, total_jump_count, &scope);
Managed_Object marker_handle = buffer_add_markers(app, target_buffer_id, jump_count, &scope); buffer_set_markers(app, marker_handle, 0, total_jump_count, markers);
Temp_Memory marker_temp = begin_temp_memory(part);
Marker *markers = push_array(part, Marker, jump_count);
for (int32_t j = 0; j < jump_count; j += 1){
markers[j].pos = jumps.jumps[j + range.first].jump_pos;
markers[j].lean_right = false;
}
buffer_set_markers(app, marker_handle, 0, jump_count, markers);
end_temp_memory(marker_temp); end_temp_memory(marker_temp);
int32_t line_details_mem_size = sizeof(Sticky_Jump_Line_Details)*jump_count; sticky_jump_marker_handle_loc = managed_variable_create_or_get_id(app, sticky_jump_marker_handle_var, 0);
Managed_Object memory = managed_memory_alloc(app, scope, line_details_mem_size); managed_variable_set(app, scope, sticky_jump_marker_handle_loc, marker_handle);
Temp_Memory details_temp = begin_temp_memory(part);
Sticky_Jump_Line_Details *details = push_array(part, Sticky_Jump_Line_Details, jump_count);
for (int32_t j = 0; j < jump_count; j += 1){
details[j].list_line = jumps.jumps[j + range.first].list_line;
details[j].list_colon_index = jumps.jumps[j + range.first].list_colon_index;
details[j].is_sub_error = jumps.jumps[j + range.first].is_sub_error;
}
managed_memory_set(app, memory, 0, details, line_details_mem_size);
end_temp_memory(details_temp);
Managed_Object node_handle = managed_list_node_alloc(app, scope, sizeof(Sticky_Jump_Node_Header));
managed_list_node_insert(app, list_sentinel, node_handle, ListInsert_Back);
Sticky_Jump_Node_Header node_header = {0};
node_header.memory = memory;
node_header.markers = marker_handle;
node_header.count = jump_count;
managed_memory_set(app, node_handle, 0, &node_header, sizeof(node_header));
} }
Managed_Object stored_jump_array = managed_memory_alloc(app, scope_array[0], sizeof(Sticky_Jump_Stored)*jumps.count);
managed_memory_set(app, stored_jump_array, 0, sizeof(Sticky_Jump_Stored)*jumps.count, stored);
end_temp_memory(temp); end_temp_memory(temp);
}
#else
static void
init_marker_list(Application_Links *app, Partition *part, General_Memory *general, Buffer_ID buffer_id,
Marker_List *list){
Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll);
Temp_Memory temp = begin_temp_memory(part);
Sticky_Jump_Array jumps = parse_buffer_to_jump_array(app, part, buffer);
Range_Array buffer_ranges = jump_array_mark_buffer_ranges(part, jumps);
list->dst_max = 64;
list->dst = gen_array(general, Sticky_Jump_Destination_Array, list->dst_max);
list->jump_max = 64;
list->jumps = gen_array(general, Sticky_Jump_Source, list->jump_max);
list->jump_array = stored_jump_array;
list->jump_count = jumps.count;
list->previous_size = buffer.size; list->previous_size = buffer.size;
list->buffer_id = buffer_id;
uint32_t prev_jump_count = 0;
for (int32_t i = 0; i < buffer_ranges.count; i += 1){
Range range = buffer_ranges.ranges[i];
Buffer_ID target_buffer_id = jumps.jumps[range.first].jump_buffer_id;
int32_t jump_count = range.one_past_last - range.first;
if (list->dst_count >= list->dst_max){
double_dst_max(general, list);
}
Buffer_Summary location_buffer = get_buffer(app, target_buffer_id, AccessAll);
Marker_Handle new_handle = buffer_add_markers(app, &location_buffer, jump_count,
sticky_jump_markers_cleanup, &list, sizeof(list));
list->dst[list->dst_count] = make_sticky_jump_destination_array(prev_jump_count, new_handle);
++list->dst_count;
prev_jump_count = list->jump_count;
Temp_Memory marker_temp = begin_temp_memory(part);
Marker *markers = push_array(part, Marker, jump_count);
for (int32_t j = 0; j < jump_count; j += 1){
markers[j].pos = jumps.jumps[j + range.first].jump_pos;
markers[j].lean_right = false;
}
buffer_set_markers(app, &location_buffer, new_handle, 0, jump_count, markers);
end_temp_memory(marker_temp);
for (int32_t j = range.first; j < range.one_past_last; j += 1){
if (list->jump_count >= list->jump_max){
double_jump_max(general, list);
}
uint32_t flags = 0;
if (jumps.jumps[j].is_sub_error){
flags |= JumpFlag_IsSubJump;
}
list->jumps[list->jump_count] = make_sticky_jump_source(jumps.jumps[j].list_line, flags);
++list->jump_count;
}
}
end_temp_memory(temp);
} }
#endif
static void static void
delete_marker_list(Marker_List_Node *node){ delete_marker_list(Marker_List_Node *node){
@ -244,8 +180,8 @@ delete_marker_list(Marker_List *list){
} }
static Marker_List* static Marker_List*
make_new_marker_list_for_buffer(General_Memory *general, int32_t buffer_id){ make_new_marker_list_for_buffer(Heap *heap, int32_t buffer_id){
Marker_List_Node *new_node = gen_array(general, Marker_List_Node, 1); Marker_List_Node *new_node = heap_array(heap, Marker_List_Node, 1);
zdll_push_back(marker_list_first, marker_list_last, new_node); zdll_push_back(marker_list_first, marker_list_last, new_node);
new_node->buffer_id = buffer_id; new_node->buffer_id = buffer_id;
memset(&new_node->list, 0, sizeof(new_node->list)); memset(&new_node->list, 0, sizeof(new_node->list));
@ -254,22 +190,20 @@ make_new_marker_list_for_buffer(General_Memory *general, int32_t buffer_id){
} }
static Marker_List* static Marker_List*
get_marker_list_for_buffer(General_Memory *general, int32_t buffer_id){ get_marker_list_for_buffer(Buffer_ID buffer_id){
Marker_List *result = 0;
for (Marker_List_Node *node = marker_list_first; for (Marker_List_Node *node = marker_list_first;
node != 0; node != 0;
node = node->next){ node = node->next){
if (buffer_id == node->buffer_id){ if (buffer_id == node->buffer_id){
result = &node->list; return(&node->list);
break;
} }
} }
return(result); return(0);
} }
static Marker_List* static Marker_List*
get_or_make_list_for_buffer(Application_Links *app, Partition *part, General_Memory *general, int32_t buffer_id){ get_or_make_list_for_buffer(Application_Links *app, Partition *part, Heap *heap, int32_t buffer_id){
Marker_List *result = get_marker_list_for_buffer(general, buffer_id); Marker_List *result = get_marker_list_for_buffer(buffer_id);
if (result != 0){ if (result != 0){
Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll); Buffer_Summary buffer = get_buffer(app, buffer_id, AccessAll);
// TODO(allen): When buffers get an "edit sequence number" use that instead. // TODO(allen): When buffers get an "edit sequence number" use that instead.
@ -279,67 +213,118 @@ get_or_make_list_for_buffer(Application_Links *app, Partition *part, General_Mem
} }
} }
if (result == 0){ if (result == 0){
result = make_new_marker_list_for_buffer(general, buffer_id); result = make_new_marker_list_for_buffer(heap, buffer_id);
init_marker_list(app, part, general, buffer_id, result); init_marker_list(app, part, heap, buffer_id, result);
} }
return(result); return(result);
} }
static bool32 static bool32
get_jump_from_list(Application_Links *app, Marker_List *list, int32_t index, ID_Pos_Jump_Location *location){ get_stored_jump_from_list(Application_Links *app, Marker_List *list, int32_t index,
bool32 result = false; Sticky_Jump_Stored *stored_out){
if (index >= 0 && index < list->jump_count){ Sticky_Jump_Stored stored = {0};
uint32_t handle_index = binary_search(&list->dst->first_jump_index, sizeof(*list->dst), list->dst_count, index); if (managed_memory_get(app, list->jump_array, index*sizeof(stored), sizeof(stored), &stored)){
Sticky_Jump_Destination_Array destinations = list->dst[handle_index]; *stored_out = stored;
uint32_t marker_index = index - destinations.first_jump_index; return(true);
Buffer_Summary buffer = get_buffer_by_marker_handle(app, destinations.handle, AccessAll); }
if (buffer.exists){ return(false);
Marker marker; }
buffer_get_markers(app, &buffer, destinations.handle, marker_index, 1, &marker);
location->buffer_id = buffer.buffer_id; static Sticky_Jump_Stored*
location->pos = marker.pos; get_all_stored_jumps_from_list(Application_Links *app, Partition *arena, Marker_List *list){
result = true; Temp_Memory restore_point = begin_temp_memory(arena);
Sticky_Jump_Stored *stored = push_array(arena, Sticky_Jump_Stored, list->jump_count);
if (stored != 0){
if (!managed_memory_get(app, list->jump_array, 0, sizeof(*stored)*list->jump_count, stored)){
stored = 0;
end_temp_memory(restore_point);
} }
} }
return(result); return(stored);
} }
static int32_t static bool32
get_index_exact_from_list(Marker_List *list, int32_t line){ get_jump_from_list(Application_Links *app, Marker_List *list, int32_t index, ID_Pos_Jump_Location *location){
int32_t result = -1; Sticky_Jump_Stored stored = {0};
uint32_t jump_index = binary_search(&list->jumps->line_number, sizeof(*list->jumps), list->jump_count, line); if (get_stored_jump_from_list(app, list, index, &stored)){
if (list->jumps[jump_index].line_number == (uint32_t)line){ Buffer_ID target_buffer_id = stored.jump_buffer_id;
result = jump_index;
Dynamic_Scope scope_array[2] = {0};
scope_array[0] = buffer_get_dynamic_scope(app, list->buffer_id);
scope_array[1] = buffer_get_dynamic_scope(app, target_buffer_id);
Dynamic_Scope scope = get_intersected_dynamic_scope(app, scope_array, ArrayCount(scope_array));
sticky_jump_marker_handle_loc = managed_variable_create_or_get_id(app, sticky_jump_marker_handle_var, 0);
Managed_Object marker_array = 0;
if (managed_variable_get(app, scope, sticky_jump_marker_handle_loc, &marker_array)){
Marker marker = {0};
buffer_get_markers(app, marker_array, stored.index_into_marker_array, 1, &marker);
location->buffer_id = target_buffer_id;
location->pos = marker.pos;
return(true);
}
} }
return(result); return(false);
} }
static int32_t static int32_t
get_index_nearest_from_list(Marker_List *list, int32_t line){ get_line_from_list(Application_Links *app, Marker_List *list, int32_t index){
int32_t result = binary_search(&list->jumps->line_number, sizeof(*list->jumps), list->jump_count, line);
return(result);
}
static int32_t
get_line_from_list(Marker_List *list, int32_t index){
int32_t result = 0; int32_t result = 0;
if (0 <= index && index < list->jump_count){ Sticky_Jump_Stored stored = {0};
result = list->jumps[index].line_number; if (get_stored_jump_from_list(app, list, index, &stored)){
result = stored.list_line;
} }
return(result); return(result);
} }
static bool32
get_is_sub_error_from_list(Application_Links *app, Marker_List *list, int32_t index){
bool32 result = false;
Sticky_Jump_Stored stored = {0};
if (get_stored_jump_from_list(app, list, index, &stored)){
result = stored.is_sub_error;
}
return(result);
}
static int32_t
get_index_nearest_from_list(Application_Links *app, Partition *scratch, Marker_List *list, int32_t line){
int32_t result = -1;
Temp_Memory temp = begin_temp_memory(scratch);
Sticky_Jump_Stored *stored = get_all_stored_jumps_from_list(app, scratch, list);
if (stored != 0){
result = binary_search((uint32_t*)&stored->list_line, sizeof(*stored), list->jump_count, line);
}
end_temp_memory(temp);
return(result);
}
static int32_t
get_index_exact_from_list(Application_Links *app, Partition *scratch, Marker_List *list, int32_t line){
int32_t result = -1;
Temp_Memory temp = begin_temp_memory(scratch);
Sticky_Jump_Stored *stored = get_all_stored_jumps_from_list(app, scratch, list);
if (stored != 0){
int32_t index = binary_search((uint32_t*)&stored->list_line, sizeof(*stored), list->jump_count, line);
if (stored[index].list_line == line){
result = index;
}
}
end_temp_memory(temp);
return(result);
}
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_sticky) CUSTOM_COMMAND_SIG(goto_jump_at_cursor_sticky)
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.") CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in another view and changes the active panel to the view containing the jump.")
{ {
General_Memory *general = &global_general; Heap *heap = &global_heap;
Partition *part = &global_part; Partition *part = &global_part;
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(part);
View_Summary view = get_active_view(app, AccessProtected); View_Summary view = get_active_view(app, AccessProtected);
Marker_List *list = get_or_make_list_for_buffer(app, part, general, view.buffer_id); Marker_List *list = get_or_make_list_for_buffer(app, part, heap, view.buffer_id);
int32_t list_index = get_index_exact_from_list(list, view.cursor.line); int32_t list_index = get_index_exact_from_list(app, part, list, view.cursor.line);
if (list_index >= 0){ if (list_index >= 0){
ID_Pos_Jump_Location location = {0}; ID_Pos_Jump_Location location = {0};
@ -360,13 +345,13 @@ CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump loc
CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel_sticky) CUSTOM_COMMAND_SIG(goto_jump_at_cursor_same_panel_sticky)
CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.") CUSTOM_DOC("If the cursor is found to be on a jump location, parses the jump location and brings up the file and position in this view, losing the compilation output or jump list.")
{ {
General_Memory *general = &global_general; Heap *heap = &global_heap;
Partition *part = &global_part; Partition *part = &global_part;
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(part);
View_Summary view = get_active_view(app, AccessProtected); View_Summary view = get_active_view(app, AccessProtected);
Marker_List *list = get_or_make_list_for_buffer(app, part, general, view.buffer_id); Marker_List *list = get_or_make_list_for_buffer(app, part, heap, view.buffer_id);
int32_t list_index = get_index_exact_from_list(list, view.cursor.line); int32_t list_index = get_index_exact_from_list(app, part, list, view.cursor.line);
if (list_index >= 0){ if (list_index >= 0){
ID_Pos_Jump_Location location = {0}; ID_Pos_Jump_Location location = {0};
@ -423,13 +408,13 @@ goto_next_filtered_jump(Application_Links *app, Marker_List *list, View_Summary
if (skip_repeats && jump_is_repeat(prev_location, location)){ if (skip_repeats && jump_is_repeat(prev_location, location)){
skip_this = true; skip_this = true;
} }
else if (skip_sub_errors && (list->jumps[list_index].flags & JumpFlag_IsSubJump)){ else if (skip_sub_errors && get_is_sub_error_from_list(app, list, list_index)){
skip_this = true; skip_this = true;
} }
if (!skip_this){ if (!skip_this){
goto_jump_in_order(app, list, jump_view, location); goto_jump_in_order(app, list, jump_view, location);
int32_t updated_line = get_line_from_list(list, list_index); int32_t updated_line = get_line_from_list(app, list, list_index);
view_set_cursor(app, jump_view, seek_line_char(updated_line, 1), true); view_set_cursor(app, jump_view, seek_line_char(updated_line, 1), true);
break; break;
} }
@ -440,12 +425,12 @@ goto_next_filtered_jump(Application_Links *app, Marker_List *list, View_Summary
} }
static Locked_Jump_State static Locked_Jump_State
get_locked_jump_state(Application_Links *app, Partition *part, General_Memory *general){ get_locked_jump_state(Application_Links *app, Partition *part, Heap *heap){
Locked_Jump_State result = {0}; Locked_Jump_State result = {0};
result.view = get_view_for_locked_jump_buffer(app); result.view = get_view_for_locked_jump_buffer(app);
if (result.view.exists){ if (result.view.exists){
result.list = get_or_make_list_for_buffer(app, part, general, result.view.buffer_id); result.list = get_or_make_list_for_buffer(app, part, heap, result.view.buffer_id);
result.list_index = get_index_nearest_from_list(result.list, result.view.cursor.line); result.list_index = get_index_nearest_from_list(app, part, result.list, result.view.cursor.line);
} }
return(result); return(result);
} }
@ -453,12 +438,12 @@ get_locked_jump_state(Application_Links *app, Partition *part, General_Memory *g
CUSTOM_COMMAND_SIG(goto_next_jump_sticky) CUSTOM_COMMAND_SIG(goto_next_jump_sticky)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.") CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, skipping sub jump locations.")
{ {
General_Memory *general = &global_general; Heap *heap = &global_heap;
Partition *part = &global_part; Partition *part = &global_part;
Locked_Jump_State jump_state = get_locked_jump_state(app, part, general); Locked_Jump_State jump_state = get_locked_jump_state(app, part, heap);
if (jump_state.view.exists){ if (jump_state.view.exists){
int32_t line = get_line_from_list(jump_state.list, jump_state.list_index); int32_t line = get_line_from_list(app, jump_state.list, jump_state.list_index);
if (line <= jump_state.view.cursor.line){ if (line <= jump_state.view.cursor.line){
++jump_state.list_index; ++jump_state.list_index;
} }
@ -468,10 +453,10 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
CUSTOM_COMMAND_SIG(goto_prev_jump_sticky) CUSTOM_COMMAND_SIG(goto_prev_jump_sticky)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations."){ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, skipping sub jump locations."){
General_Memory *general = &global_general; Heap *heap = &global_heap;
Partition *part = &global_part; Partition *part = &global_part;
Locked_Jump_State jump_state = get_locked_jump_state(app, part, general); Locked_Jump_State jump_state = get_locked_jump_state(app, part, heap);
if (jump_state.view.exists){ if (jump_state.view.exists){
if (jump_state.list_index > 0){ if (jump_state.list_index > 0){
--jump_state.list_index; --jump_state.list_index;
@ -483,12 +468,12 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
CUSTOM_COMMAND_SIG(goto_next_jump_no_skips_sticky) CUSTOM_COMMAND_SIG(goto_next_jump_no_skips_sticky)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.") CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the next jump in the buffer, and does not skip sub jump locations.")
{ {
General_Memory *general = &global_general; Heap *heap = &global_heap;
Partition *part = &global_part; Partition *part = &global_part;
Locked_Jump_State jump_state = get_locked_jump_state(app, part, general); Locked_Jump_State jump_state = get_locked_jump_state(app, part, heap);
if (jump_state.view.exists){ if (jump_state.view.exists){
int32_t line = get_line_from_list(jump_state.list, jump_state.list_index); int32_t line = get_line_from_list(app, jump_state.list, jump_state.list_index);
if (line <= jump_state.view.cursor.line){ if (line <= jump_state.view.cursor.line){
++jump_state.list_index; ++jump_state.list_index;
} }
@ -499,10 +484,10 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips_sticky) CUSTOM_COMMAND_SIG(goto_prev_jump_no_skips_sticky)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.") CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the previous jump in the buffer, and does not skip sub jump locations.")
{ {
General_Memory *general = &global_general; Heap *heap = &global_heap;
Partition *part = &global_part; Partition *part = &global_part;
Locked_Jump_State jump_state = get_locked_jump_state(app, part, general); Locked_Jump_State jump_state = get_locked_jump_state(app, part, heap);
if (jump_state.view.exists){ if (jump_state.view.exists){
if (jump_state.list_index > 0){ if (jump_state.list_index > 0){
--jump_state.list_index; --jump_state.list_index;
@ -514,16 +499,16 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
CUSTOM_COMMAND_SIG(goto_first_jump_sticky) CUSTOM_COMMAND_SIG(goto_first_jump_sticky)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.") CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the first jump in the buffer.")
{ {
General_Memory *general = &global_general; Heap *heap = &global_heap;
Partition *part = &global_part; Partition *part = &global_part;
Locked_Jump_State jump_state = get_locked_jump_state(app, part, general); Locked_Jump_State jump_state = get_locked_jump_state(app, part, heap);
if (jump_state.view.exists){ if (jump_state.view.exists){
int32_t list_index = 0; int32_t list_index = 0;
ID_Pos_Jump_Location location = {0}; ID_Pos_Jump_Location location = {0};
if (get_jump_from_list(app, jump_state.list, list_index, &location)){ if (get_jump_from_list(app, jump_state.list, list_index, &location)){
goto_jump_in_order(app, jump_state.list, &jump_state.view, location); goto_jump_in_order(app, jump_state.list, &jump_state.view, location);
int32_t updated_line = get_line_from_list(jump_state.list, list_index); int32_t updated_line = get_line_from_list(app, jump_state.list, list_index);
view_set_cursor(app, &jump_state.view, seek_line_char(updated_line, 1), true); view_set_cursor(app, &jump_state.view, seek_line_char(updated_line, 1), true);
} }
} }
@ -532,10 +517,10 @@ CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to th
CUSTOM_COMMAND_SIG(goto_first_jump_same_panel_sticky) CUSTOM_COMMAND_SIG(goto_first_jump_same_panel_sticky)
CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.") CUSTOM_DOC("If a buffer containing jump locations has been locked in, goes to the first jump in the buffer and views the buffer in the panel where the jump list was.")
{ {
General_Memory *general = &global_general; Heap *heap = &global_heap;
Partition *part = &global_part; Partition *part = &global_part;
Locked_Jump_State jump_state = get_locked_jump_state(app, part, general); Locked_Jump_State jump_state = get_locked_jump_state(app, part, heap);
if (jump_state.view.exists){ if (jump_state.view.exists){
int32_t list_index = 0; int32_t list_index = 0;
ID_Pos_Jump_Location location = {0}; ID_Pos_Jump_Location location = {0};
@ -588,10 +573,8 @@ CUSTOM_DOC("If the buffer in the active view is writable, inserts a character, o
OPEN_FILE_HOOK_SIG(default_end_file); OPEN_FILE_HOOK_SIG(default_end_file);
OPEN_FILE_HOOK_SIG(end_file_close_jump_list){ OPEN_FILE_HOOK_SIG(end_file_close_jump_list){
General_Memory *general = &global_general; Marker_List *list = get_marker_list_for_buffer(buffer_id);
Marker_List *list = get_marker_list_for_buffer(general, buffer_id);
if (list != 0){ if (list != 0){
free_marker_list(general, *list);
delete_marker_list(list); delete_marker_list(list);
} }
default_end_file(app, buffer_id); default_end_file(app, buffer_id);

View File

@ -7,12 +7,6 @@
#if !defined(FCODER_JUMP_STICKY_H) #if !defined(FCODER_JUMP_STICKY_H)
#define FCODER_JUMP_STICKY_H #define FCODER_JUMP_STICKY_H
struct Sticky_Jump_Line_Details{
int32_t list_line;
int32_t list_colon_index;
bool32 is_sub_error;
};
struct Sticky_Jump{ struct Sticky_Jump{
int32_t list_line; int32_t list_line;
int32_t list_colon_index; int32_t list_colon_index;
@ -21,6 +15,14 @@ struct Sticky_Jump{
int32_t jump_pos; int32_t jump_pos;
}; };
struct Sticky_Jump_Stored{
int32_t list_line;
int32_t list_colon_index;
bool32 is_sub_error;
Buffer_ID jump_buffer_id;
int32_t index_into_marker_array;
};
struct Sticky_Jump_Array{ struct Sticky_Jump_Array{
struct Sticky_Jump *jumps; struct Sticky_Jump *jumps;
int32_t count; int32_t count;
@ -38,14 +40,17 @@ enum Jump_Location_Flag{
}; };
struct Marker_List{ struct Marker_List{
Managed_Object jump_array;
int32_t jump_count;
int32_t previous_size; int32_t previous_size;
Buffer_ID buffer_id;
}; };
struct Marker_List_Node{ struct Marker_List_Node{
Marker_List_Node *next; Marker_List_Node *next;
Marker_List_Node *prev; Marker_List_Node *prev;
Marker_List list; Marker_List list;
int32_t buffer_id; Buffer_ID buffer_id;
}; };
struct Locked_Jump_State{ struct Locked_Jump_State{

109
4coder_lib/4coder_arena.cpp Normal file
View File

@ -0,0 +1,109 @@
/*
4coder_arena.cpp - Preversioning
no warranty implied; use at your own risk
This software is in the public domain. Where that dedication is not
recognized, you are granted a perpetual, irrevocable license to copy,
distribute, and modify this file as you see fit.
*/
// TOP
inline Partition
make_part(void *memory, i32_4tech size){
Partition partition = {0};
partition.base = (char*)memory;
partition.pos = 0;
partition.max = size;
return partition;
}
inline void*
partition_allocate(Partition *data, i32_4tech size){
void *ret = 0;
if (size < 0){
size = 0;
}
if (data->pos + size <= data->max){
ret = data->base + data->pos;
data->pos += size;
}
return(ret);
}
inline void
partition_reduce(Partition *data, i32_4tech size){
if (size > 0 && size <= data->pos){
data->pos -= size;
}
}
inline void*
partition_align(Partition *data, u32_4tech boundary){
--boundary;
data->pos = (data->pos + boundary) & (~boundary);
return(data->base + data->pos);
}
inline void*
partition_current(Partition *data){
return(data->base + data->pos);
}
inline i32_4tech
partition_remaining(Partition *data){
return(data->max - data->pos);
}
inline Partition
partition_sub_part(Partition *data, i32_4tech size){
Partition result = {};
void *d = partition_allocate(data, size);
if (d != 0){
result = make_part(d, size);
}
return(result);
}
#define push_struct(part, T) (T*)partition_allocate(part, sizeof(T))
#define push_array(part, T, size) (T*)partition_allocate(part, sizeof(T)*(size))
#define push_block(part, size) partition_allocate(part, size)
#define push_align(part, b) partition_align(part, b)
inline Temp_Memory
begin_temp_memory(Partition *data){
Temp_Memory result;
result.handle = data;
result.pos = data->pos;
return(result);
}
inline void
end_temp_memory(Temp_Memory temp){
((Partition*)temp.handle)->pos = temp.pos;
}
inline Tail_Temp_Partition
begin_tail_part(Partition *data, i32_4tech size){
Tail_Temp_Partition result = {0};
if (data->pos + size <= data->max){
result.handle = data;
result.old_max = data->max;
data->max -= size;
result.part = make_part(data->base + data->max, size);
}
return(result);
}
inline void
end_tail_part(Tail_Temp_Partition temp){
if (temp.handle){
Partition *part = (Partition*)temp.handle;
part->max = temp.old_max;
}
}
#define reset_temp_memory end_temp_memory
// BOTTOM

67
4coder_lib/4coder_arena.h Normal file
View File

@ -0,0 +1,67 @@
/*
4coder_arena.h - Preversioning
no warranty implied; use at your own risk
This software is in the public domain. Where that dedication is not
recognized, you are granted a perpetual, irrevocable license to copy,
distribute, and modify this file as you see fit.
*/
// TOP
#if !defined(FCODER_ARENA_H)
#define FCODER_ARENA_H
// 4tech_standard_preamble.h
#if !defined(FTECH_INTEGERS)
#define FTECH_INTEGERS
#include <stdint.h>
typedef int8_t i8_4tech;
typedef int16_t i16_4tech;
typedef int32_t i32_4tech;
typedef int64_t i64_4tech;
typedef uint8_t u8_4tech;
typedef uint16_t u16_4tech;
typedef uint32_t u32_4tech;
typedef uint64_t u64_4tech;
#if defined(FTECH_32_BIT)
typedef u32_4tech umem_4tech;
#else
typedef u64_4tech umem_4tech;
#endif
typedef float f32_4tech;
typedef double f64_4tech;
typedef int8_t b8_4tech;
typedef int32_t b32_4tech;
#endif
#if !defined(Assert)
# define Assert(n) do{ if (!(n)) *(int*)0 = 0xA11E; }while(0)
#endif
// standard preamble end
struct Partition{
char *base;
i32_4tech pos;
i32_4tech max;
};
struct Temp_Memory{
void *handle;
i32_4tech pos;
};
struct Tail_Temp_Partition{
Partition part;
void *handle;
i32_4tech old_max;
};
#endif
// BOTTOM

View File

@ -0,0 +1,93 @@
/*
4coder_heap.cpp - Preversioning
no warranty implied; use at your own risk
This software is in the public domain. Where that dedication is not
recognized, you are granted a perpetual, irrevocable license to copy,
distribute, and modify this file as you see fit.
*/
// TOP
#define heap__sent_init(s) (s)->next=(s)->prev=(s)
#define heap__insert_next(p,n) ((n)->next=(p)->next,(n)->prev=(p),(n)->next->prev=(n),(p)->next=(n))
#define heap__insert_prev(p,n) ((n)->prev=(p)->prev,(n)->next=(p),(n)->prev->next=(n),(p)->prev=(n))
#define heap__remove(n) ((n)->next->prev=(n)->prev,(n)->prev->next=(n)->next)
static void
heap_init(Heap *heap){
heap__sent_init(&heap->in_order);
heap__sent_init(&heap->free_nodes);
}
static void
heap_extend(Heap *heap, void *memory, i32_4tech size){
if (size >= sizeof(Heap_Node)){
Heap_Node *new_node = (Heap_Node*)memory;
heap__insert_prev(&heap->in_order, &new_node->order);
heap__insert_next(&heap->free_nodes, &new_node->alloc);
new_node->size = size - sizeof(*new_node);
}
}
static void*
heap__reserve_chunk(Heap_Node *node, i32_4tech size){
u8_4tech *ptr = (u8_4tech*)(node + 1);
i32_4tech left_over_size = node->size - size;
if (left_over_size > sizeof(*node)){
i32_4tech new_node_size = left_over_size - sizeof(*node);
Heap_Node *new_node = (Heap_Node*)(ptr + size);
heap__insert_next(&node->order, &new_node->order);
heap__insert_next(&node->alloc, &new_node->alloc);
new_node->size = new_node_size;
heap__remove(&node->alloc);
node->alloc.next = 0;
node->alloc.prev = 0;
node->size = size;
}
return(ptr);
}
static void*
heap_allocate(Heap *heap, i32_4tech size){
i32_4tech aligned_size = (size + sizeof(Heap_Node) - 1);
aligned_size = aligned_size - (aligned_size%sizeof(Heap_Node));
for (Heap_Basic_Node *n = heap->free_nodes.next;
n != &heap->free_nodes;
n = n->next){
Heap_Node *node = CastFromMember(Heap_Node, alloc, n);
if (node->size >= aligned_size){
return(heap__reserve_chunk(node, aligned_size));
}
}
return(0);
}
static void
heap__merge(Heap *heap, Heap_Node *l, Heap_Node *r){
if (&l->order != &heap->in_order && &r->order != &heap->in_order &&
l->alloc.next != 0 && l->alloc.prev != 0 &&
r->alloc.next != 0 && r->alloc.prev != 0){
u8_4tech *ptr = (u8_4tech*)(l + 1) + l->size;
if (PtrDif(ptr, r) == 0){
heap__remove(&r->order);
heap__remove(&r->alloc);
heap__remove(&l->alloc);
l->size += r->size + sizeof(*r);
heap__insert_next(&heap->free_nodes, &l->alloc);
}
}
}
static void
heap_free(Heap *heap, void *memory){
Heap_Node *node = ((Heap_Node*)memory) - 1;
heap__insert_next(&heap->free_nodes, &node->alloc);
heap__merge(heap, node, CastFromMember(Heap_Node, order, node->order.next));
heap__merge(heap, CastFromMember(Heap_Node, order, node->order.prev), node);
}
#define heap_array(g, T, size) (T*)heap_allocate(g, sizeof(T)*(size))
// BOTTOM

91
4coder_lib/4coder_heap.h Normal file
View File

@ -0,0 +1,91 @@
/*
4coder_heap.h - Preversioning
no warranty implied; use at your own risk
This software is in the public domain. Where that dedication is not
recognized, you are granted a perpetual, irrevocable license to copy,
distribute, and modify this file as you see fit.
*/
// TOP
#if !defined(FCODER_HEAP_H)
#define FCODER_HEAP_H
// 4tech_standard_preamble.h
#if !defined(FTECH_INTEGERS)
#define FTECH_INTEGERS
#include <stdint.h>
typedef int8_t i8_4tech;
typedef int16_t i16_4tech;
typedef int32_t i32_4tech;
typedef int64_t i64_4tech;
typedef uint8_t u8_4tech;
typedef uint16_t u16_4tech;
typedef uint32_t u32_4tech;
typedef uint64_t u64_4tech;
#if defined(FTECH_32_BIT)
typedef u32_4tech umem_4tech;
#else
typedef u64_4tech umem_4tech;
#endif
typedef float f32_4tech;
typedef double f64_4tech;
typedef int8_t b8_4tech;
typedef int32_t b32_4tech;
#endif
#if !defined(Assert)
# define Assert(n) do{ if (!(n)) *(int*)0 = 0xA11E; }while(0)
#endif
#if !defined(Member)
# define Member(T, m) (((T*)0)->m)
#endif
#if !defined(PtrDif)
#define PtrDif(a,b) ((uint8_t*)(a) - (uint8_t*)(b))
#endif
#if !defined(PtrAsInt)
#define PtrAsInt(a) PtrDif(a,0)
#endif
#if !defined(OffsetOfMember)
#define OffsetOfMember(S,m) PtrAsInt(&Member(S,m))
#endif
#if !defined(CastFromMember)
#define CastFromMember(S,m,ptr) (S*)( (uint8_t*)(ptr) - OffsetOfMember(S,m) )
#endif
// standard preamble end
struct Heap_Basic_Node{
Heap_Basic_Node *next;
Heap_Basic_Node *prev;
};
struct Heap_Node{
union{
struct{
Heap_Basic_Node order;
Heap_Basic_Node alloc;
i32_4tech size;
};
u8_4tech force_size__[64];
};
};
struct Heap{
Heap_Basic_Node in_order;
Heap_Basic_Node free_nodes;
};
#endif
// BOTTOM

View File

@ -1,375 +0,0 @@
/*
4coder_mem.h - Preversioning
no warranty implied; use at your own risk
This software is in the public domain. Where that dedication is not
recognized, you are granted a perpetual, irrevocable license to copy,
distribute, and modify this file as you see fit.
*/
// TOP
#if !defined(FCODER_MEM_H)
#define FCODER_MEM_H
// 4tech_standard_preamble.h
#if !defined(FTECH_INTEGERS)
#define FTECH_INTEGERS
#include <stdint.h>
typedef int8_t i8_4tech;
typedef int16_t i16_4tech;
typedef int32_t i32_4tech;
typedef int64_t i64_4tech;
typedef uint8_t u8_4tech;
typedef uint16_t u16_4tech;
typedef uint32_t u32_4tech;
typedef uint64_t u64_4tech;
#if defined(FTECH_32_BIT)
typedef u32_4tech umem_4tech;
#else
typedef u64_4tech umem_4tech;
#endif
typedef float f32_4tech;
typedef double f64_4tech;
typedef int8_t b8_4tech;
typedef int32_t b32_4tech;
#endif
#if !defined(Assert)
# define Assert(n) do{ if (!(n)) *(int*)0 = 0xA11E; }while(0)
#endif
// standard preamble end
#include <string.h>
struct Partition{
char *base;
i32_4tech pos;
i32_4tech max;
};
struct Temp_Memory{
void *handle;
i32_4tech pos;
};
struct Tail_Temp_Partition{
Partition part;
void *handle;
i32_4tech old_max;
};
inline Partition
make_part(void *memory, i32_4tech size){
Partition partition = {0};
partition.base = (char*)memory;
partition.pos = 0;
partition.max = size;
return partition;
}
inline void*
partition_allocate(Partition *data, i32_4tech size){
void *ret = 0;
if (size < 0){
size = 0;
}
if (data->pos + size <= data->max){
ret = data->base + data->pos;
data->pos += size;
}
return(ret);
}
inline void
partition_reduce(Partition *data, i32_4tech size){
if (size > 0 && size <= data->pos){
data->pos -= size;
}
}
inline void*
partition_align(Partition *data, u32_4tech boundary){
--boundary;
data->pos = (data->pos + boundary) & (~boundary);
return(data->base + data->pos);
}
inline void*
partition_current(Partition *data){
return(data->base + data->pos);
}
inline i32_4tech
partition_remaining(Partition *data){
return(data->max - data->pos);
}
inline Partition
partition_sub_part(Partition *data, i32_4tech size){
Partition result = {};
void *d = partition_allocate(data, size);
if (d != 0){
result = make_part(d, size);
}
return(result);
}
#define push_struct(part, T) (T*)partition_allocate(part, sizeof(T))
#define push_array(part, T, size) (T*)partition_allocate(part, sizeof(T)*(size))
#define push_block(part, size) partition_allocate(part, size)
#define push_align(part, b) partition_align(part, b)
inline Temp_Memory
begin_temp_memory(Partition *data){
Temp_Memory result;
result.handle = data;
result.pos = data->pos;
return(result);
}
inline void
end_temp_memory(Temp_Memory temp){
((Partition*)temp.handle)->pos = temp.pos;
}
inline Tail_Temp_Partition
begin_tail_part(Partition *data, i32_4tech size){
Tail_Temp_Partition result = {0};
if (data->pos + size <= data->max){
result.handle = data;
result.old_max = data->max;
data->max -= size;
result.part = make_part(data->base + data->max, size);
}
return(result);
}
inline void
end_tail_part(Tail_Temp_Partition temp){
if (temp.handle){
Partition *part = (Partition*)temp.handle;
part->max = temp.old_max;
}
}
#define reset_temp_memory end_temp_memory
/*
NOTE(allen):
This is a very week general purpose allocator system.
It should only be used for infrequent large allocations (4K+).
*/
enum{
MEM_BUBBLE_FLAG_INIT = 0x0,
MEM_BUBBLE_USED = 0x1,
};
struct Bubble{
Bubble *prev;
Bubble *next;
Bubble *prev2;
Bubble *next2;
i32_4tech size;
u32_4tech flags;
u32_4tech _unused_[4];
};
struct General_Memory{
Bubble sentinel;
Bubble free_sentinel;
Bubble used_sentinel;
};
struct Mem_Options{
Partition part;
General_Memory general;
};
inline void
insert_bubble(Bubble *prev, Bubble *bubble){
bubble->prev = prev;
bubble->next = prev->next;
bubble->prev->next = bubble;
bubble->next->prev = bubble;
}
inline void
remove_bubble(Bubble *bubble){
bubble->prev->next = bubble->next;
bubble->next->prev = bubble->prev;
}
inline void
insert_bubble2(Bubble *prev, Bubble *bubble){
bubble->prev2 = prev;
bubble->next2 = prev->next2;
bubble->prev2->next2 = bubble;
bubble->next2->prev2 = bubble;
}
inline void
remove_bubble2(Bubble *bubble){
bubble->prev2->next2 = bubble->next2;
bubble->next2->prev2 = bubble->prev2;
}
static void
general_sentinel_init(Bubble *bubble){
bubble->prev = bubble;
bubble->next = bubble;
bubble->prev2 = bubble;
bubble->next2 = bubble;
bubble->flags = MEM_BUBBLE_USED;
bubble->size = 0;
}
#define BUBBLE_MIN_SIZE 1024
static void
general_memory_attempt_split(General_Memory *general, Bubble *bubble, i32_4tech wanted_size){
i32_4tech remaining_size = bubble->size - wanted_size;
if (remaining_size >= BUBBLE_MIN_SIZE){
bubble->size = wanted_size;
Bubble *new_bubble = (Bubble*)((char*)(bubble + 1) + wanted_size);
new_bubble->flags = (u32_4tech)MEM_BUBBLE_FLAG_INIT;
new_bubble->size = remaining_size - sizeof(Bubble);
insert_bubble(bubble, new_bubble);
insert_bubble2(&general->free_sentinel, new_bubble);
}
}
inline void
general_memory_do_merge(Bubble *left, Bubble *right){
left->size += sizeof(Bubble) + right->size;
remove_bubble(right);
remove_bubble2(right);
}
inline void
general_memory_attempt_merge(Bubble *left, Bubble *right){
if (!(left->flags & MEM_BUBBLE_USED) && !(right->flags & MEM_BUBBLE_USED)){
general_memory_do_merge(left, right);
}
}
// NOTE(allen): public procedures
static void
general_memory_open(General_Memory *general, void *memory, i32_4tech size){
general_sentinel_init(&general->sentinel);
general_sentinel_init(&general->free_sentinel);
general_sentinel_init(&general->used_sentinel);
Bubble *first = (Bubble*)memory;
first->flags = (u32_4tech)MEM_BUBBLE_FLAG_INIT;
first->size = size - sizeof(Bubble);
insert_bubble(&general->sentinel, first);
insert_bubble2(&general->free_sentinel, first);
}
#if defined(Assert)
static i32_4tech
general_memory_check(General_Memory *general){
Bubble *sentinel = &general->sentinel;
for (Bubble *bubble = sentinel->next;
bubble != sentinel;
bubble = bubble->next){
Assert(bubble);
Bubble *next = bubble->next;
Assert(bubble == next->prev);
if (next != sentinel && bubble->prev != sentinel){
Assert(bubble->next > bubble);
Assert(bubble > bubble->prev);
char *end_ptr = (char*)(bubble + 1) + bubble->size;
char *next_ptr = (char*)next;
(void)(end_ptr);
(void)(next_ptr);
Assert(end_ptr == next_ptr);
}
}
return(1);
}
#else
static i32_4tech
general_memory_check(General_Memory *general){}
#endif
static void*
general_memory_allocate(General_Memory *general, i32_4tech size){
void *result = 0;
if (size < BUBBLE_MIN_SIZE) size = BUBBLE_MIN_SIZE;
for (Bubble *bubble = general->free_sentinel.next2;
bubble != &general->free_sentinel;
bubble = bubble->next2){
if (!(bubble->flags & MEM_BUBBLE_USED)){
if (bubble->size >= size){
result = bubble + 1;
bubble->flags |= MEM_BUBBLE_USED;
remove_bubble2(bubble);
insert_bubble2(&general->used_sentinel, bubble);
general_memory_attempt_split(general, bubble, size);
break;
}
}
}
return(result);
}
static void
general_memory_free(General_Memory *general, void *memory){
Bubble *bubble = ((Bubble*)memory) - 1;
bubble->flags = 0;
remove_bubble2(bubble);
insert_bubble2(&general->free_sentinel, bubble);
Bubble *prev, *next;
prev = bubble->prev;
next = bubble->next;
general_memory_attempt_merge(bubble, next);
general_memory_attempt_merge(prev, bubble);
}
static void*
general_memory_reallocate(General_Memory *general, void *old, i32_4tech old_size, i32_4tech size){
void *result = old;
Bubble *bubble = ((Bubble*)old) - 1;
i32_4tech additional_space = size - bubble->size;
if (additional_space > 0){
Bubble *next = bubble->next;
if (!(next->flags & MEM_BUBBLE_USED) && next->size + (i32_4tech)sizeof(Bubble) >= additional_space){
general_memory_do_merge(bubble, next);
general_memory_attempt_split(general, bubble, size);
}
else{
result = general_memory_allocate(general, size);
if (old_size) memcpy(result, old, old_size);
general_memory_free(general, old);
}
}
return(result);
}
inline void*
general_memory_reallocate_nocopy(General_Memory *general, void *old, i32_4tech size){
void *result = general_memory_reallocate(general, old, 0, size);
return(result);
}
#define gen_struct(g, T) (T*)general_memory_allocate(g, sizeof(T), 0)
#define gen_array(g, T, size) (T*)general_memory_allocate(g, sizeof(T)*(size))
#define gen_block(g, size) general_memory_open(g, size, 0)
#define gen_realloc_array(g, T, old, old_size, size)\
(T*)general_memory_reallocate(g, old, old_size*sizeof(T), size*sizeof(T))
#endif
// BOTTOM

View File

@ -18,7 +18,7 @@ CUSTOM_COMMAND_SIG(lister__activate)
CUSTOM_DOC("A lister mode command that activates the list's action on the highlighted item.") CUSTOM_DOC("A lister mode command that activates the list's action on the highlighted item.")
{ {
Partition *scratch = &global_part; Partition *scratch = &global_part;
General_Memory *general = &global_general; Heap *heap = &global_heap;
View_Summary view = get_active_view(app, AccessAll); View_Summary view = get_active_view(app, AccessAll);
Lister_State *state = view_get_lister_state(&view); Lister_State *state = view_get_lister_state(&view);
if (state->initialized){ if (state->initialized){
@ -26,8 +26,7 @@ CUSTOM_DOC("A lister mode command that activates the list's action on the highli
if (0 <= state->raw_item_index && state->raw_item_index < state->lister.options.count){ if (0 <= state->raw_item_index && state->raw_item_index < state->lister.options.count){
user_data = lister_get_user_data(&state->lister, state->raw_item_index); user_data = lister_get_user_data(&state->lister, state->raw_item_index);
} }
lister_call_activate_handler(app, scratch, general, &view, lister_call_activate_handler(app, scratch, heap, &view, state, user_data, false);
state, user_data, false);
} }
} }
@ -102,13 +101,13 @@ CUSTOM_COMMAND_SIG(lister__mouse_release)
CUSTOM_DOC("A lister mode command that ends a click interaction with a list item under the mouse, possibly activating it.") CUSTOM_DOC("A lister mode command that ends a click interaction with a list item under the mouse, possibly activating it.")
{ {
Partition *scratch = &global_part; Partition *scratch = &global_part;
General_Memory *general = &global_general; Heap *heap = &global_heap;
View_Summary view = get_active_view(app, AccessAll); View_Summary view = get_active_view(app, AccessAll);
Lister_State *state = view_get_lister_state(&view); Lister_State *state = view_get_lister_state(&view);
if (state->initialized && state->hot_user_data != 0){ if (state->initialized && state->hot_user_data != 0){
UI_Item clicked = lister_get_clicked_item(app, &view, scratch); UI_Item clicked = lister_get_clicked_item(app, &view, scratch);
if (state->hot_user_data == clicked.user_data){ if (state->hot_user_data == clicked.user_data){
lister_call_activate_handler(app, scratch, general, &view, lister_call_activate_handler(app, scratch, heap, &view,
state, clicked.user_data, true); state, clicked.user_data, true);
} }
} }
@ -257,7 +256,7 @@ CUSTOM_COMMAND_SIG(lister__write_character__fixed_list)
CUSTOM_DOC("A lister mode command that handles input for the fixed sure to kill list.") CUSTOM_DOC("A lister mode command that handles input for the fixed sure to kill list.")
{ {
Partition *scratch = &global_part; Partition *scratch = &global_part;
General_Memory *general = &global_general; Heap *heap = &global_heap;
View_Summary view = get_active_view(app, AccessAll); View_Summary view = get_active_view(app, AccessAll);
Lister_State *state = view_get_lister_state(&view); Lister_State *state = view_get_lister_state(&view);
if (state->initialized){ if (state->initialized){
@ -278,7 +277,7 @@ CUSTOM_DOC("A lister mode command that handles input for the fixed sure to kill
} }
} }
if (did_shortcut_key){ if (did_shortcut_key){
lister_call_activate_handler(app, scratch, general, lister_call_activate_handler(app, scratch, heap,
&view, state, &view, state,
user_data, false); user_data, false);
} }
@ -314,11 +313,11 @@ begin_integrated_lister__with_refresh_handler(Application_Links *app, char *quer
View_Summary *view){ View_Summary *view){
if (handlers.refresh != 0){ if (handlers.refresh != 0){
Partition *scratch = &global_part; Partition *scratch = &global_part;
General_Memory *general = &global_general; Heap *heap = &global_heap;
view_start_ui_mode(app, view); view_start_ui_mode(app, view);
view_set_setting(app, view, ViewSetting_UICommandMap, default_lister_ui_map); view_set_setting(app, view, ViewSetting_UICommandMap, default_lister_ui_map);
Lister_State *state = view_get_lister_state(view); Lister_State *state = view_get_lister_state(view);
init_lister_state(state, general); init_lister_state(state, heap);
lister_first_init(&state->lister); lister_first_init(&state->lister);
lister_set_query_string(&state->lister, query_string); lister_set_query_string(&state->lister, query_string);
state->lister.handlers = handlers; state->lister.handlers = handlers;
@ -342,11 +341,11 @@ begin_integrated_lister__with_fixed_options(Application_Links *app, char *query_
Lister_Fixed_Option *options, int32_t option_count, Lister_Fixed_Option *options, int32_t option_count,
View_Summary *view){ View_Summary *view){
Partition *scratch = &global_part; Partition *scratch = &global_part;
General_Memory *general = &global_general; Heap *heap = &global_heap;
view_start_ui_mode(app, view); view_start_ui_mode(app, view);
view_set_setting(app, view, ViewSetting_UICommandMap, default_lister_ui_map); view_set_setting(app, view, ViewSetting_UICommandMap, default_lister_ui_map);
Lister_State *state = view_get_lister_state(view); Lister_State *state = view_get_lister_state(view);
init_lister_state(state, general); init_lister_state(state, heap);
lister_first_init(&state->lister); lister_first_init(&state->lister);
for (int32_t i = 0; i < option_count; i += 1){ for (int32_t i = 0; i < option_count; i += 1){
char *shortcut_chars = options[i].shortcut_chars; char *shortcut_chars = options[i].shortcut_chars;
@ -384,11 +383,11 @@ begin_integrated_lister__ui_list(Application_Links *app, char *query_string,
Lister_UI_Option *options, int32_t option_count, Lister_UI_Option *options, int32_t option_count,
View_Summary *view){ View_Summary *view){
Partition *scratch = &global_part; Partition *scratch = &global_part;
General_Memory *general = &global_general; Heap *heap = &global_heap;
view_start_ui_mode(app, view); view_start_ui_mode(app, view);
view_set_setting(app, view, ViewSetting_UICommandMap, default_lister_ui_map); view_set_setting(app, view, ViewSetting_UICommandMap, default_lister_ui_map);
Lister_State *state = view_get_lister_state(view); Lister_State *state = view_get_lister_state(view);
init_lister_state(state, general); init_lister_state(state, heap);
lister_first_init(&state->lister); lister_first_init(&state->lister);
state->lister.theme_list = true; state->lister.theme_list = true;
for (int32_t i = 0; i < option_count; i += 1){ for (int32_t i = 0; i < option_count; i += 1){

View File

@ -8,7 +8,6 @@
#include "4coder_file.h" #include "4coder_file.h"
#include "4coder_lib/4coder_mem.h"
#include "4coder_lib/4cpp_lexer.h" #include "4coder_lib/4cpp_lexer.h"
#include <stdio.h> #include <stdio.h>

View File

@ -7,8 +7,6 @@
#if !defined(FCODER_PROJECT_COMMANDS_H) #if !defined(FCODER_PROJECT_COMMANDS_H)
#define FCODER_PROJECT_COMMANDS_H #define FCODER_PROJECT_COMMANDS_H
#include "4coder_lib/4coder_mem.h"
enum{ enum{
OpenAllFilesFlag_Recursive = 1, OpenAllFilesFlag_Recursive = 1,
}; };

View File

@ -10,7 +10,7 @@ and list all locations.
// //
static void static void
search_key_alloc(General_Memory *general, Search_Key *key, int32_t *size, int32_t count){ search_key_alloc(Heap *heap, Search_Key *key, int32_t *size, int32_t count){
if (count > ArrayCount(key->words)){ if (count > ArrayCount(key->words)){
count = ArrayCount(key->words); count = ArrayCount(key->words);
} }
@ -24,14 +24,15 @@ search_key_alloc(General_Memory *general, Search_Key *key, int32_t *size, int32_
} }
} }
int32_t max_base_size = total_size*2;
if (key->base == 0){ if (key->base == 0){
key->base = (char*)general_memory_allocate(general, max_base_size); int32_t max_base_size = total_size*2;
key->base = heap_array(heap, char, max_base_size);
key->base_size = max_base_size; key->base_size = max_base_size;
} }
else if (key->base_size < total_size){ else if (key->base_size < total_size){
key->base = (char*)general_memory_reallocate_nocopy(general, key->base, max_base_size); int32_t max_base_size = total_size*2;
heap_free(heap, key->base);
key->base = heap_array(heap, char, max_base_size);
key->base_size = max_base_size; key->base_size = max_base_size;
} }
@ -55,52 +56,54 @@ search_iter_init(Search_Iter *iter, Search_Key key){
} }
static void static void
search_set_init(General_Memory *general, Search_Set *set, int32_t range_count){ search_set_init(Heap *heap, Search_Set *set, int32_t range_count){
int32_t max = range_count*2;
if (set->ranges == 0){ if (set->ranges == 0){
set->ranges = (Search_Range*)general_memory_allocate(general, sizeof(Search_Range)*max); int32_t max = range_count*2;
set->ranges = heap_array(heap, Search_Range, max);
set->max = max; set->max = max;
} }
else if (set->max < range_count){ else if (set->max < range_count){
set->ranges = (Search_Range*)general_memory_reallocate_nocopy( int32_t max = range_count*2;
general, set->ranges, sizeof(Search_Range)*max); heap_free(heap, set->ranges);
set->ranges = heap_array(heap, Search_Range, max);
set->max = max; set->max = max;
} }
set->count = range_count; set->count = range_count;
} }
static void static void
search_hits_table_alloc(General_Memory *general, Table *hits, int32_t table_size){ search_hits_table_alloc(Heap *heap, Table *hits, int32_t table_size){
void *mem = 0; void *mem = 0;
int32_t mem_size = table_required_mem_size(table_size, sizeof(Offset_String)); int32_t mem_size = table_required_mem_size(table_size, sizeof(Offset_String));
if (hits->hash_array == 0){ if (hits->hash_array == 0){
mem = general_memory_allocate(general, mem_size); mem = heap_allocate(heap, mem_size);
} }
else{ else{
mem = general_memory_reallocate_nocopy(general, hits->hash_array, mem_size); heap_free(heap, hits->hash_array);
mem = heap_allocate(heap, mem_size);
} }
table_init_memory(hits, mem, table_size, sizeof(Offset_String)); table_init_memory(hits, mem, table_size, sizeof(Offset_String));
} }
static void static void
search_hits_init(General_Memory *general, Table *hits, String_Space *str, int32_t table_size, int32_t str_size){ search_hits_init(Heap *heap, Table *hits, String_Space *str, int32_t table_size, int32_t str_size){
if (hits->hash_array == 0){ if (hits->hash_array == 0){
search_hits_table_alloc(general, hits, table_size); search_hits_table_alloc(heap, hits, table_size);
} }
else{ else{
int32_t mem_size = table_required_mem_size(table_size, sizeof(Offset_String)); int32_t mem_size = table_required_mem_size(table_size, sizeof(Offset_String));
void *mem = general_memory_reallocate_nocopy(general, hits->hash_array, mem_size); heap_free(heap, hits->hash_array);
void *mem = heap_allocate(heap, mem_size);
table_init_memory(hits, mem, table_size, sizeof(Offset_String)); table_init_memory(hits, mem, table_size, sizeof(Offset_String));
} }
if (str->space == 0){ if (str->space == 0){
str->space = (char*)general_memory_allocate(general, str_size); str->space = heap_array(heap, char, str_size);
str->max = str_size; str->max = str_size;
} }
else if (str->max < str_size){ else if (str->max < str_size){
str->space = (char*)general_memory_reallocate_nocopy(general, str->space, str_size); heap_free(heap, str->space);
str->space = heap_array(heap, char, str_size);
str->max = str_size; str->max = str_size;
} }
@ -113,7 +116,7 @@ search_hits_init(General_Memory *general, Table *hits, String_Space *str, int32_
// //
static int32_t static int32_t
search_hit_add(General_Memory *general, Table *hits, String_Space *space, char *str, int32_t len){ search_hit_add(Heap *heap, Table *hits, String_Space *space, char *str, int32_t len){
int32_t result = false; int32_t result = false;
Assert(len != 0); Assert(len != 0);
@ -124,7 +127,10 @@ search_hit_add(General_Memory *general, Table *hits, String_Space *space, char *
if (new_size < space->max + len){ if (new_size < space->max + len){
new_size = space->max + len; new_size = space->max + len;
} }
space->space = (char*)general_memory_reallocate(general, space->space, space->new_pos, new_size); char *new_space = heap_array(heap, char, new_size);
memcpy(new_space, space->space, space->new_pos);
heap_free(heap, space->space);
space->space = new_space;
ostring = strspace_append(space, str, len); ostring = strspace_append(space, str, len);
} }
@ -132,10 +138,10 @@ search_hit_add(General_Memory *general, Table *hits, String_Space *space, char *
if (table_at_capacity(hits)){ if (table_at_capacity(hits)){
Table new_hits = {0}; Table new_hits = {0};
search_hits_table_alloc(general, &new_hits, hits->max*2); search_hits_table_alloc(heap, &new_hits, hits->max*2);
table_clear(&new_hits); table_clear(&new_hits);
table_rehash(hits, &new_hits, space->space, tbl_offset_string_hash, tbl_offset_string_compare); table_rehash(hits, &new_hits, space->space, tbl_offset_string_hash, tbl_offset_string_compare);
general_memory_free(general, hits->hash_array); heap_free(heap, hits->hash_array);
*hits = new_hits; *hits = new_hits;
} }
@ -478,7 +484,7 @@ search_next_match(Application_Links *app, Search_Set *set, Search_Iter *it_ptr){
// //
static void static void
initialize_generic_search_all_buffers(Application_Links *app, General_Memory *general, String *strings, int32_t count, Search_Range_Flag match_flags, int32_t *skip_buffers, int32_t skip_buffer_count, Search_Set *set, Search_Iter *iter){ initialize_generic_search_all_buffers(Application_Links *app, Heap *heap, String *strings, int32_t count, Search_Range_Flag match_flags, int32_t *skip_buffers, int32_t skip_buffer_count, Search_Set *set, Search_Iter *iter){
memset(set, 0, sizeof(*set)); memset(set, 0, sizeof(*set));
memset(iter, 0, sizeof(*iter)); memset(iter, 0, sizeof(*iter));
@ -494,7 +500,7 @@ initialize_generic_search_all_buffers(Application_Links *app, General_Memory *ge
} }
// TODO(allen): Why on earth am I allocating these separately in this case? Upgrade to just use the string array on the stack! // TODO(allen): Why on earth am I allocating these separately in this case? Upgrade to just use the string array on the stack!
search_key_alloc(general, &key, sizes, count); search_key_alloc(heap, &key, sizes, count);
for (int32_t i = 0; i < count; ++i){ for (int32_t i = 0; i < count; ++i){
copy(&key.words[i], strings[i]); copy(&key.words[i], strings[i]);
} }
@ -502,7 +508,7 @@ initialize_generic_search_all_buffers(Application_Links *app, General_Memory *ge
search_iter_init(iter, key); search_iter_init(iter, key);
int32_t buffer_count = get_buffer_count(app); int32_t buffer_count = get_buffer_count(app);
search_set_init(general, set, buffer_count); search_set_init(heap, set, buffer_count);
Search_Range *ranges = set->ranges; Search_Range *ranges = set->ranges;
@ -613,7 +619,7 @@ buffered_print_match_jump_line(Application_Links *app, Partition *part, Temp_Mem
} }
static void static void
list__parameters(Application_Links *app, General_Memory *general, Partition *scratch, list__parameters(Application_Links *app, Heap *heap, Partition *scratch,
String *strings, int32_t count, Search_Range_Flag match_flags){ String *strings, int32_t count, Search_Range_Flag match_flags){
// Open the search buffer // Open the search buffer
String search_name = make_lit_string("*search*"); String search_name = make_lit_string("*search*");
@ -632,7 +638,7 @@ list__parameters(Application_Links *app, General_Memory *general, Partition *scr
// Initialize a generic search all buffers // Initialize a generic search all buffers
Search_Set set = {0}; Search_Set set = {0};
Search_Iter iter = {0}; Search_Iter iter = {0};
initialize_generic_search_all_buffers(app, general, strings, count, match_flags, &search_buffer.buffer_id, 1, &set, &iter); initialize_generic_search_all_buffers(app, heap, strings, count, match_flags, &search_buffer.buffer_id, 1, &set, &iter);
// List all locations into search buffer // List all locations into search buffer
Temp_Memory all_temp = begin_temp_memory(scratch); Temp_Memory all_temp = begin_temp_memory(scratch);
@ -657,7 +663,7 @@ list__parameters(Application_Links *app, General_Memory *general, Partition *scr
} }
static void static void
list_single__parameters(Application_Links *app, General_Memory *general, Partition *scratch, list_single__parameters(Application_Links *app, Heap *heap, Partition *scratch,
String str, bool32 substrings, bool32 case_insensitive){ String str, bool32 substrings, bool32 case_insensitive){
Search_Range_Flag flags = 0; Search_Range_Flag flags = 0;
if (substrings){ if (substrings){
@ -669,22 +675,22 @@ list_single__parameters(Application_Links *app, General_Memory *general, Partiti
if (case_insensitive){ if (case_insensitive){
flags |= SearchFlag_CaseInsensitive; flags |= SearchFlag_CaseInsensitive;
} }
list__parameters(app, general, scratch, &str, 1, flags); list__parameters(app, heap, scratch, &str, 1, flags);
} }
static void static void
list_query__parameters(Application_Links *app, General_Memory *general, Partition *scratch, list_query__parameters(Application_Links *app, Heap *heap, Partition *scratch,
bool32 substrings, bool32 case_insensitive){ bool32 substrings, bool32 case_insensitive){
char space[1024]; char space[1024];
String str = get_query_string(app, "List Locations For: ", space, sizeof(space)); String str = get_query_string(app, "List Locations For: ", space, sizeof(space));
if (str.str != 0){ if (str.str != 0){
change_active_panel(app); change_active_panel(app);
list_single__parameters(app, general, scratch, str, substrings, case_insensitive); list_single__parameters(app, heap, scratch, str, substrings, case_insensitive);
} }
} }
static void static void
list_identifier__parameters(Application_Links *app, General_Memory *general, Partition *scratch, list_identifier__parameters(Application_Links *app, Heap *heap, Partition *scratch,
bool32 substrings, bool32 case_insensitive){ bool32 substrings, bool32 case_insensitive){
View_Summary view = get_active_view(app, AccessProtected); View_Summary view = get_active_view(app, AccessProtected);
Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessProtected); Buffer_Summary buffer = get_buffer(app, view.buffer_id, AccessProtected);
@ -693,25 +699,25 @@ list_identifier__parameters(Application_Links *app, General_Memory *general, Par
String str = get_token_or_word_under_pos(app, &buffer, view.cursor.pos, space, sizeof(space)); String str = get_token_or_word_under_pos(app, &buffer, view.cursor.pos, space, sizeof(space));
if (str.str != 0){ if (str.str != 0){
change_active_panel(app); change_active_panel(app);
list_single__parameters(app, general, scratch, str, substrings, case_insensitive); list_single__parameters(app, heap, scratch, str, substrings, case_insensitive);
} }
} }
static void static void
list_selected_range__parameters(Application_Links *app, General_Memory *general, Partition *scratch, list_selected_range__parameters(Application_Links *app, Heap *heap, Partition *scratch,
bool32 substrings, bool32 case_insensitive){ bool32 substrings, bool32 case_insensitive){
View_Summary view = get_active_view(app, AccessProtected); View_Summary view = get_active_view(app, AccessProtected);
Temp_Memory temp = begin_temp_memory(scratch); Temp_Memory temp = begin_temp_memory(scratch);
String str = get_string_in_view_range(app, scratch, &view); String str = get_string_in_view_range(app, scratch, &view);
if (str.str != 0){ if (str.str != 0){
change_active_panel(app); change_active_panel(app);
list_single__parameters(app, general, scratch, str, substrings, case_insensitive); list_single__parameters(app, heap, scratch, str, substrings, case_insensitive);
} }
end_temp_memory(temp); end_temp_memory(temp);
} }
static void static void
list_type_definition__parameters(Application_Links *app, General_Memory *general, Partition *scratch, list_type_definition__parameters(Application_Links *app, Heap *heap, Partition *scratch,
String str){ String str){
Temp_Memory temp = begin_temp_memory(scratch); Temp_Memory temp = begin_temp_memory(scratch);
@ -723,7 +729,7 @@ list_type_definition__parameters(Application_Links *app, General_Memory *general
match_strings[4] = build_string(scratch, "enum " , str, "{"); match_strings[4] = build_string(scratch, "enum " , str, "{");
match_strings[5] = build_string(scratch, "enum " , str, "\n{"); match_strings[5] = build_string(scratch, "enum " , str, "\n{");
list__parameters(app, general, scratch, list__parameters(app, heap, scratch,
match_strings, ArrayCount(match_strings), 0); match_strings, ArrayCount(match_strings), 0);
end_temp_memory(temp); end_temp_memory(temp);
@ -741,49 +747,49 @@ list_type_definition__parameters(Application_Links *app, General_Memory *general
CUSTOM_COMMAND_SIG(list_all_locations) CUSTOM_COMMAND_SIG(list_all_locations)
CUSTOM_DOC("Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.") CUSTOM_DOC("Queries the user for a string and lists all exact case-sensitive matches found in all open buffers.")
{ {
list_query__parameters(app, &global_general, &global_part, false, false); list_query__parameters(app, &global_heap, &global_part, false, false);
} }
CUSTOM_COMMAND_SIG(list_all_substring_locations) CUSTOM_COMMAND_SIG(list_all_substring_locations)
CUSTOM_DOC("Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.") CUSTOM_DOC("Queries the user for a string and lists all case-sensitive substring matches found in all open buffers.")
{ {
list_query__parameters(app, &global_general, &global_part, true, false); list_query__parameters(app, &global_heap, &global_part, true, false);
} }
CUSTOM_COMMAND_SIG(list_all_locations_case_insensitive) CUSTOM_COMMAND_SIG(list_all_locations_case_insensitive)
CUSTOM_DOC("Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.") CUSTOM_DOC("Queries the user for a string and lists all exact case-insensitive matches found in all open buffers.")
{ {
list_query__parameters(app, &global_general, &global_part, false, true); list_query__parameters(app, &global_heap, &global_part, false, true);
} }
CUSTOM_COMMAND_SIG(list_all_substring_locations_case_insensitive) CUSTOM_COMMAND_SIG(list_all_substring_locations_case_insensitive)
CUSTOM_DOC("Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.") CUSTOM_DOC("Queries the user for a string and lists all case-insensitive substring matches found in all open buffers.")
{ {
list_query__parameters(app, &global_general, &global_part, true, true); list_query__parameters(app, &global_heap, &global_part, true, true);
} }
CUSTOM_COMMAND_SIG(list_all_locations_of_identifier) CUSTOM_COMMAND_SIG(list_all_locations_of_identifier)
CUSTOM_DOC("Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.") CUSTOM_DOC("Reads a token or word under the cursor and lists all exact case-sensitive mathces in all open buffers.")
{ {
list_identifier__parameters(app, &global_general, &global_part, false, false); list_identifier__parameters(app, &global_heap, &global_part, false, false);
} }
CUSTOM_COMMAND_SIG(list_all_locations_of_identifier_case_insensitive) CUSTOM_COMMAND_SIG(list_all_locations_of_identifier_case_insensitive)
CUSTOM_DOC("Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.") CUSTOM_DOC("Reads a token or word under the cursor and lists all exact case-insensitive mathces in all open buffers.")
{ {
list_identifier__parameters(app, &global_general, &global_part, false, true); list_identifier__parameters(app, &global_heap, &global_part, false, true);
} }
CUSTOM_COMMAND_SIG(list_all_locations_of_selection) CUSTOM_COMMAND_SIG(list_all_locations_of_selection)
CUSTOM_DOC("Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.") CUSTOM_DOC("Reads the string in the selected range and lists all exact case-sensitive mathces in all open buffers.")
{ {
list_selected_range__parameters(app, &global_general, &global_part, false, false); list_selected_range__parameters(app, &global_heap, &global_part, false, false);
} }
CUSTOM_COMMAND_SIG(list_all_locations_of_selection_case_insensitive) CUSTOM_COMMAND_SIG(list_all_locations_of_selection_case_insensitive)
CUSTOM_DOC("Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.") CUSTOM_DOC("Reads the string in the selected range and lists all exact case-insensitive mathces in all open buffers.")
{ {
list_selected_range__parameters(app, &global_general, &global_part, false, true); list_selected_range__parameters(app, &global_heap, &global_part, false, true);
} }
CUSTOM_COMMAND_SIG(list_all_locations_of_type_definition) CUSTOM_COMMAND_SIG(list_all_locations_of_type_definition)
@ -793,7 +799,7 @@ CUSTOM_DOC("Queries user for string, lists all locations of strings that appear
String str = get_query_string(app, "List Definitions For: ", space, sizeof(space)); String str = get_query_string(app, "List Definitions For: ", space, sizeof(space));
if (str.str != 0){ if (str.str != 0){
change_active_panel(app); change_active_panel(app);
list_type_definition__parameters(app, &global_general, &global_part, str); list_type_definition__parameters(app, &global_heap, &global_part, str);
} }
} }
@ -806,7 +812,7 @@ CUSTOM_DOC("Reads a token or word under the cursor and lists all locations of st
String str = get_token_or_word_under_pos(app, &buffer, view.cursor.pos, space, sizeof(space) - 1); String str = get_token_or_word_under_pos(app, &buffer, view.cursor.pos, space, sizeof(space) - 1);
if (str.str != 0){ if (str.str != 0){
change_active_panel(app); change_active_panel(app);
list_type_definition__parameters(app, &global_general, &global_part, str); list_type_definition__parameters(app, &global_heap, &global_part, str);
} }
} }
@ -881,7 +887,7 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
// NOTE(allen): Initialize the search iterator with the partial word. // NOTE(allen): Initialize the search iterator with the partial word.
complete_state.initialized = true; complete_state.initialized = true;
Search_Key key = {0}; Search_Key key = {0};
search_key_alloc(&global_general, &key, &size, 1); search_key_alloc(&global_heap, &key, &size, 1);
buffer_read_range(app, &buffer, word_start, word_end, key.words[0].str); buffer_read_range(app, &buffer, word_start, word_end, key.words[0].str);
key.words[0].size = size; key.words[0].size = size;
@ -889,7 +895,7 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
// NOTE(allen): Initialize the set of ranges to be searched. // NOTE(allen): Initialize the set of ranges to be searched.
int32_t buffer_count = get_buffer_count(app); int32_t buffer_count = get_buffer_count(app);
search_set_init(&global_general, &complete_state.set, buffer_count); search_set_init(&global_heap, &complete_state.set, buffer_count);
Search_Range *ranges = complete_state.set.ranges; Search_Range *ranges = complete_state.set.ranges;
ranges[0].type = SearchRange_Wave; ranges[0].type = SearchRange_Wave;
@ -916,9 +922,9 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
complete_state.set.count = j; complete_state.set.count = j;
// NOTE(allen): Initialize the search hit table. // NOTE(allen): Initialize the search hit table.
search_hits_init(&global_general, &complete_state.hits, &complete_state.str, 100, (4 << 10)); search_hits_init(&global_heap, &complete_state.hits, &complete_state.str, 100, (4 << 10));
String word = complete_state.iter.key.words[0]; String word = complete_state.iter.key.words[0];
search_hit_add(&global_general, &complete_state.hits, &complete_state.str, word.str, word.size); search_hit_add(&global_heap, &complete_state.hits, &complete_state.str, word.str, word.size);
complete_state.word_start = word_start; complete_state.word_start = word_start;
complete_state.word_end = word_end; complete_state.word_end = word_end;
@ -942,7 +948,7 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
buffer_read_range(app, &match.buffer, match.start, match.end, spare); buffer_read_range(app, &match.buffer, match.start, match.end, spare);
if (search_hit_add(&global_general, &complete_state.hits, &complete_state.str, spare, match_size)){ if (search_hit_add(&global_heap, &complete_state.hits, &complete_state.str, spare, match_size)){
buffer_replace_range(app, &buffer, word_start, word_end, spare, match_size); buffer_replace_range(app, &buffer, word_start, word_end, spare, match_size);
view_set_cursor(app, &view, seek_pos(word_start + match_size), true); view_set_cursor(app, &view, seek_pos(word_start + match_size), true);
@ -957,9 +963,9 @@ CUSTOM_DOC("Iteratively tries completing the word to the left of the cursor with
complete_state.iter.pos = 0; complete_state.iter.pos = 0;
complete_state.iter.i = 0; complete_state.iter.i = 0;
search_hits_init(&global_general, &complete_state.hits, &complete_state.str, 100, (4 << 10)); search_hits_init(&global_heap, &complete_state.hits, &complete_state.str, 100, (4 << 10));
String word = complete_state.iter.key.words[0]; String word = complete_state.iter.key.words[0];
search_hit_add(&global_general, &complete_state.hits, &complete_state.str, word.str, word.size); search_hit_add(&global_heap, &complete_state.hits, &complete_state.str, word.str, word.size);
match_size = word.size; match_size = word.size;
char *str = word.str; char *str = word.str;

View File

@ -195,17 +195,17 @@ view_get_lister_state(View_Summary *view){
} }
static void static void
init_lister_state(Lister_State *state, General_Memory *general){ init_lister_state(Lister_State *state, Heap *heap){
state->initialized = true; state->initialized = true;
state->hot_user_data = 0; state->hot_user_data = 0;
state->item_index = 0; state->item_index = 0;
state->set_view_vertical_focus_to_item = false; state->set_view_vertical_focus_to_item = false;
state->option_item_count = 0; state->option_item_count = 0;
if (state->arena.base != 0){ if (state->arena.base != 0){
general_memory_free(general, state->arena.base); heap_free(heap, state->arena.base);
} }
int32_t arena_size = (64 << 10); int32_t arena_size = (64 << 10);
state->arena = make_part(general_memory_allocate(general, arena_size), arena_size); state->arena = make_part(heap_allocate(heap, arena_size), arena_size);
memset(&state->lister, 0, sizeof(state->lister)); memset(&state->lister, 0, sizeof(state->lister));
} }
@ -470,7 +470,7 @@ lister_call_refresh_handler(Application_Links *app, Partition *arena, Lister *li
} }
static void static void
lister_call_activate_handler(Application_Links *app, Partition *scratch, General_Memory *general, lister_call_activate_handler(Application_Links *app, Partition *scratch, Heap *heap,
View_Summary *view, Lister_State *state, View_Summary *view, Lister_State *state,
void *user_data, bool32 activated_by_mouse){ void *user_data, bool32 activated_by_mouse){
Lister *lister = &state->lister; Lister *lister = &state->lister;
@ -484,7 +484,7 @@ lister_call_activate_handler(Application_Links *app, Partition *scratch, General
if (view_end_ui_mode(app, view) == 0){ if (view_end_ui_mode(app, view) == 0){
state->initialized = false; state->initialized = false;
if (state->arena.base != 0){ if (state->arena.base != 0){
general_memory_free(general, state->arena.base); heap_free(heap, state->arena.base);
memset(&state->arena, 0, sizeof(state->arena)); memset(&state->arena, 0, sizeof(state->arena));
} }
} }

37
4ed.cpp
View File

@ -192,7 +192,7 @@ do_feedback_message(System_Functions *system, Models *models, String value){
internal View* internal View*
panel_make_empty(System_Functions *system, Models *models, Panel *panel){ panel_make_empty(System_Functions *system, Models *models, Panel *panel){
Assert(panel->view == 0); Assert(panel->view == 0);
View_And_ID new_view = live_set_alloc_view(&models->mem.general, &models->lifetime_allocator, &models->live_set, panel); View_And_ID new_view = live_set_alloc_view(&models->mem.heap, &models->lifetime_allocator, &models->live_set, panel);
view_set_file(system, models, new_view.view, models->scratch_buffer); view_set_file(system, models, new_view.view, models->scratch_buffer);
return(new_view.view); return(new_view.view);
} }
@ -254,7 +254,7 @@ COMMAND_DECL(reopen){
if (system->load_file(handle, buffer, size)){ if (system->load_file(handle, buffer, size)){
system->load_close(handle); system->load_close(handle);
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
File_Edit_Positions edit_poss[16]; File_Edit_Positions edit_poss[16];
int32_t line_number[16]; int32_t line_number[16];
@ -277,7 +277,7 @@ COMMAND_DECL(reopen){
++vptr_count; ++vptr_count;
} }
file_free(system, &models->app_links, general, file); file_free(system, &models->app_links, heap, file);
init_normal_file(system, models, buffer, size, file); init_normal_file(system, models, buffer, size, file);
for (i32 i = 0; i < vptr_count; ++i){ for (i32 i = 0; i < vptr_count; ++i){
@ -403,7 +403,7 @@ internal b32
interpret_binding_buffer(Models *models, void *buffer, i32 size){ interpret_binding_buffer(Models *models, void *buffer, i32 size){
b32 result = true; b32 result = true;
General_Memory *gen = &models->mem.general; Heap *gen = &models->mem.heap;
Partition *part = &models->mem.part; Partition *part = &models->mem.part;
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(part);
@ -508,7 +508,7 @@ interpret_binding_buffer(Models *models, void *buffer, i32 size){
i32 binding_rounded_memsize = l_round_up_i32(binding_memsize, 8); i32 binding_rounded_memsize = l_round_up_i32(binding_memsize, 8);
i32 needed_memsize = map_id_table_rounded_memsize + user_maps_rounded_memsize + binding_rounded_memsize; i32 needed_memsize = map_id_table_rounded_memsize + user_maps_rounded_memsize + binding_rounded_memsize;
new_mapping.memory = general_memory_allocate(gen, needed_memsize); new_mapping.memory = heap_allocate(gen, needed_memsize);
local_part = make_part(new_mapping.memory, needed_memsize); local_part = make_part(new_mapping.memory, needed_memsize);
// Move ID Table Memory and Pointer // Move ID Table Memory and Pointer
@ -688,7 +688,7 @@ interpret_binding_buffer(Models *models, void *buffer, i32 size){
Mapping old_mapping = models->mapping; Mapping old_mapping = models->mapping;
if (old_mapping.memory != 0){ if (old_mapping.memory != 0){
// TODO(allen): Do I need to explicity work on recovering the old ids of buffers? // TODO(allen): Do I need to explicity work on recovering the old ids of buffers?
general_memory_free(gen, old_mapping.memory); heap_free(gen, old_mapping.memory);
} }
models->mapping = new_mapping; models->mapping = new_mapping;
@ -974,13 +974,8 @@ app_setup_memory(System_Functions *system, Application_Memory *memory){
Assert(vars != 0); Assert(vars != 0);
memset(vars, 0, sizeof(*vars)); memset(vars, 0, sizeof(*vars));
vars->models.mem.part = _partition; vars->models.mem.part = _partition;
heap_init(&vars->models.mem.heap);
#if defined(USE_DEBUG_MEMORY) heap_extend(&vars->models.mem.heap, memory->target_memory, memory->target_memory_size);
general_memory_open(system, &vars->models.mem.general, memory->target_memory, memory->target_memory_size);
#else
general_memory_open(&vars->models.mem.general, memory->target_memory, memory->target_memory_size);
#endif
return(vars); return(vars);
} }
@ -1067,7 +1062,7 @@ App_Init_Sig(app_init){
umem memsize = KB(8); umem memsize = KB(8);
void *mem = push_array(partition, u8, (i32)memsize); void *mem = push_array(partition, u8, (i32)memsize);
parse_context_init_memory(&models->parse_context_memory, mem, memsize); parse_context_init_memory(&models->parse_context_memory, mem, memsize);
parse_context_add_default(&models->parse_context_memory, &models->mem.general); parse_context_add_default(&models->parse_context_memory, &models->mem.heap);
} }
{ {
@ -1080,10 +1075,10 @@ App_Init_Sig(app_init){
} }
dynamic_variables_init(&models->variable_layout); dynamic_variables_init(&models->variable_layout);
dynamic_variables_block_init(&models->mem.general, &models->dynamic_vars); dynamic_workspace_init(&models->mem.heap, &models->dynamic_workspace);
// NOTE(allen): file setup // NOTE(allen): file setup
working_set_init(&models->working_set, partition, &vars->models.mem.general); working_set_init(&models->working_set, partition, &vars->models.mem.heap);
models->working_set.default_display_width = DEFAULT_DISPLAY_WIDTH; models->working_set.default_display_width = DEFAULT_DISPLAY_WIDTH;
models->working_set.default_minimum_base_display_width = DEFAULT_MINIMUM_BASE_DISPLAY_WIDTH; models->working_set.default_minimum_base_display_width = DEFAULT_MINIMUM_BASE_DISPLAY_WIDTH;
@ -1095,7 +1090,7 @@ App_Init_Sig(app_init){
// TODO(allen): more robust allocation solution for the clipboard // TODO(allen): more robust allocation solution for the clipboard
if (clipboard.str != 0){ if (clipboard.str != 0){
String *dest = working_set_next_clipboard_string(&models->mem.general, &models->working_set, clipboard.size); String *dest = working_set_next_clipboard_string(&models->mem.heap, &models->working_set, clipboard.size);
copy(dest, make_string((char*)clipboard.str, clipboard.size)); copy(dest, make_string((char*)clipboard.str, clipboard.size));
} }
@ -1131,10 +1126,10 @@ App_Init_Sig(app_init){
{ make_lit_string("*scratch*"), &models->scratch_buffer, false, }, { make_lit_string("*scratch*"), &models->scratch_buffer, false, },
}; };
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
for (i32 i = 0; i < ArrayCount(init_files); ++i){ for (i32 i = 0; i < ArrayCount(init_files); ++i){
Editing_File *file = working_set_alloc_always(&models->working_set, general, &models->lifetime_allocator); Editing_File *file = working_set_alloc_always(&models->working_set, heap, &models->lifetime_allocator);
buffer_bind_name(models, general, partition, &models->working_set, file, init_files[i].name); buffer_bind_name(models, heap, partition, &models->working_set, file, init_files[i].name);
if (init_files[i].read_only){ if (init_files[i].read_only){
init_read_only_file(system, models, file); init_read_only_file(system, models, file);
@ -1177,7 +1172,7 @@ App_Step_Sig(app_step){
// NOTE(allen): OS clipboard event handling // NOTE(allen): OS clipboard event handling
String clipboard = input->clipboard; String clipboard = input->clipboard;
if (clipboard.str){ if (clipboard.str){
String *dest =working_set_next_clipboard_string(&models->mem.general, &models->working_set, clipboard.size); String *dest = working_set_next_clipboard_string(&models->mem.heap, &models->working_set, clipboard.size);
dest->size = eol_convert_in(dest->str, clipboard.str, clipboard.size); dest->size = eol_convert_in(dest->str, clipboard.str, clipboard.size);
} }

View File

@ -19,7 +19,7 @@ access_test(u32 lock_flags, u32 access_flags){
internal void internal void
fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Working_Set *working_set){ fill_buffer_summary(Buffer_Summary *buffer, Editing_File *file, Working_Set *working_set){
*buffer = null_buffer_summary; memset(buffer, 0, sizeof(*buffer));
if (!file->is_dummy){ if (!file->is_dummy){
buffer->exists = 1; buffer->exists = 1;
buffer->ready = file_is_ready(file); buffer->ready = file_is_ready(file);
@ -247,7 +247,7 @@ DOC_SEE(Command_Line_Interface_Flag)
App_Vars *vars = cmd->vars; App_Vars *vars = cmd->vars;
Models *models = cmd->models; Models *models = cmd->models;
Partition *part = &models->mem.part; Partition *part = &models->mem.part;
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
Working_Set *working_set = &models->working_set; Working_Set *working_set = &models->working_set;
bool32 result = true; bool32 result = true;
@ -287,11 +287,11 @@ DOC_SEE(Command_Line_Interface_Flag)
// NOTE(allen): If the buffer is specified by name but does not already exist, then create it. // NOTE(allen): If the buffer is specified by name but does not already exist, then create it.
if (file == 0 && buffer_id.name != 0){ if (file == 0 && buffer_id.name != 0){
file = working_set_alloc_always(working_set, general, &models->lifetime_allocator); file = working_set_alloc_always(working_set, heap, &models->lifetime_allocator);
Assert(file != 0); Assert(file != 0);
String name = push_string(part, buffer_id.name, buffer_id.name_len); String name = push_string(part, buffer_id.name, buffer_id.name_len);
buffer_bind_name(models, general, part, working_set, file, name); buffer_bind_name(models, heap, part, working_set, file, name);
init_read_only_file(system, models, file); init_read_only_file(system, models, file);
} }
@ -393,10 +393,10 @@ DOC_SEE(The_4coder_Clipboard)
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
System_Functions *system = cmd->system; System_Functions *system = cmd->system;
Models *models = cmd->models; Models *models = cmd->models;
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
Working_Set *working = &models->working_set; Working_Set *working = &models->working_set;
String *dest = working_set_next_clipboard_string(general, working, len); String *dest = working_set_next_clipboard_string(heap, working, len);
copy_ss(dest, make_string(str, len)); copy_ss(dest, make_string(str, len));
system->post_clipboard(*dest); system->post_clipboard(*dest);
} }
@ -455,7 +455,7 @@ DOC_RETURN(On success returns an id for the new parse context. If id == 0, then
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models; Models *models = cmd->models;
Parse_Context_ID id = parse_context_add(&models->parse_context_memory, &models->mem.general, kw, kw_count, pp, pp_count); Parse_Context_ID id = parse_context_add(&models->parse_context_memory, &models->mem.heap, kw, kw_count, pp, pp_count);
return(id); return(id);
} }
@ -481,17 +481,17 @@ internal_get_buffer_first(Working_Set *working_set, Buffer_Summary *buffer){
internal void internal void
internal_get_buffer_next(Working_Set *working_set, Buffer_Summary *buffer){ internal_get_buffer_next(Working_Set *working_set, Buffer_Summary *buffer){
Editing_File *file = working_set_get_active_file(working_set, buffer->buffer_id); Editing_File *file = working_set_get_active_file(working_set, buffer->buffer_id);
if (file){ if (file != 0){
file = (Editing_File*)file->node.next; file = (Editing_File*)file->node.next;
if (file != (Editing_File*)&working_set->used_sentinel){ if (file != (Editing_File*)&working_set->used_sentinel){
fill_buffer_summary(buffer, file, working_set); fill_buffer_summary(buffer, file, working_set);
} }
else{ else{
*buffer = null_buffer_summary; memset(buffer, 0, sizeof(*buffer));
} }
} }
else{ else{
*buffer = null_buffer_summary; memset(buffer, 0, sizeof(*buffer));
} }
} }
@ -559,15 +559,13 @@ DOC_SEE(Buffer_ID)
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
Working_Set *working_set = &cmd->models->working_set; Working_Set *working_set = &cmd->models->working_set;
Buffer_Summary buffer = {0}; Buffer_Summary buffer = {0};
Editing_File *file = working_set_get_active_file(working_set, buffer_id); Editing_File *file = working_set_get_active_file(working_set, buffer_id);
if (file != 0 && !file->is_dummy){ if (file != 0 && !file->is_dummy){
fill_buffer_summary(&buffer, file, working_set); fill_buffer_summary(&buffer, file, working_set);
if (!access_test(buffer.lock_flags, access)){ if (!access_test(buffer.lock_flags, access)){
buffer = null_buffer_summary; memset(&buffer, 0, sizeof(buffer));
} }
} }
return(buffer); return(buffer);
} }
@ -588,15 +586,13 @@ DOC_SEE(Access_Flag)
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
Buffer_Summary buffer = {0}; Buffer_Summary buffer = {0};
Working_Set *working_set = &cmd->models->working_set; Working_Set *working_set = &cmd->models->working_set;
Editing_File *file = working_set_contains_name(working_set, make_string(name, len)); Editing_File *file = working_set_contains_name(working_set, make_string(name, len));
if (file != 0 && !file->is_dummy){ if (file != 0 && !file->is_dummy){
fill_buffer_summary(&buffer, file, working_set); fill_buffer_summary(&buffer, file, working_set);
if (!access_test(buffer.lock_flags, access)){ if (!access_test(buffer.lock_flags, access)){
buffer = null_buffer_summary; memset(&buffer, 0, sizeof(buffer));
} }
} }
return(buffer); return(buffer);
} }
@ -620,17 +616,15 @@ DOC_SEE(Access_Flag)
System_Functions *system = cmd->system; System_Functions *system = cmd->system;
Models *models = cmd->models; Models *models = cmd->models;
Working_Set *working_set = &models->working_set; Working_Set *working_set = &models->working_set;
String fname = make_string(name, len); String fname = make_string(name, len);
Editing_File_Name canon = {0}; Editing_File_Name canon = {0};
if (get_canon_name(system, fname, &canon)){ if (get_canon_name(system, fname, &canon)){
Editing_File *file = working_set_contains_canon(working_set, canon.name); Editing_File *file = working_set_contains_canon(working_set, canon.name);
fill_buffer_summary(&buffer, file, working_set); fill_buffer_summary(&buffer, file, working_set);
if (!access_test(buffer.lock_flags, access)){ if (!access_test(buffer.lock_flags, access)){
buffer = null_buffer_summary; memset(&buffer, 0, sizeof(buffer));
} }
} }
return(buffer); return(buffer);
} }
@ -772,7 +766,7 @@ DOC_SEE(Buffer_Batch_Edit_Type)
char *inv_str = (char*)part->base + part->pos; char *inv_str = (char*)part->base + part->pos;
int32_t inv_str_max = part->max - part->pos; int32_t inv_str_max = part->max - part->pos;
Edit_Spec spec = edit_compute_batch_spec(&mem->general, Edit_Spec spec = edit_compute_batch_spec(&mem->heap,
file, file,
edits, str, str_len, edits, str, str_len,
inverse_edits, inv_str, inv_str_max, edit_count, type); inverse_edits, inv_str, inv_str_max, edit_count, type);
@ -803,7 +797,7 @@ DOC_SEE(Marker)
Editing_File *file = imp_get_file(cmd, buffer_id); Editing_File *file = imp_get_file(cmd, buffer_id);
Managed_Object result = 0; Managed_Object result = 0;
if (file != 0){ if (file != 0){
result = (Managed_Object)allocate_markers_state(&models->mem.general, file, marker_count); result = (Managed_Object)allocate_markers_state(&models->mem.heap, file, marker_count);
} }
return(result); return(result);
} }
@ -816,7 +810,7 @@ DOC_PARAM(access, The access parameter determines what levels of protection this
DOC_SEE(Marker) DOC_SEE(Marker)
*/{ */{
Buffer_Summary buffer = {0}; Buffer_Summary buffer = {0};
if (object != 0){ if (marker_object != 0){
void *ptr = IntAsPtr(marker_object); void *ptr = IntAsPtr(marker_object);
Buffer_ID buffer_id = get_buffer_id_from_marker_handle(ptr); Buffer_ID buffer_id = get_buffer_id_from_marker_handle(ptr);
buffer = Get_Buffer(app, buffer_id, access); buffer = Get_Buffer(app, buffer_id, access);
@ -877,10 +871,10 @@ DOC_SEE(Marker)
} }
API_EXPORT bool32 API_EXPORT bool32
Buffer_Remove_Markers(Application_Links *app, Managed_Object marker) Buffer_Remove_Markers(Application_Links *app, Managed_Object marker_object)
/* /*
DOC_PARAM(buffer, The buffer on which the specified markers are attached.) DOC_PARAM(buffer, The buffer on which the specified markers are attached.)
DOC_PARAM(marker, The marker handle refering to the markers to be detached from the buffer.) DOC_PARAM(marker_object, The marker handle refering to the markers to be detached from the buffer.)
DOC_RETURN(On success returns non-zero, on failure returns zero.) DOC_RETURN(On success returns non-zero, on failure returns zero.)
DOC(Deactivates the entire range of markers specified by the marker handle and frees the memory used to store the markers internally.) DOC(Deactivates the entire range of markers specified by the marker handle and frees the memory used to store the markers internally.)
DOC_SEE(buffer_add_markers) DOC_SEE(buffer_add_markers)
@ -893,7 +887,7 @@ DOC_SEE(buffer_add_markers)
Buffer_ID buffer_id = get_buffer_id_from_marker_handle(ptr); Buffer_ID buffer_id = get_buffer_id_from_marker_handle(ptr);
Editing_File *file = imp_get_file(cmd, buffer_id); Editing_File *file = imp_get_file(cmd, buffer_id);
if (file != 0){ if (file != 0){
if (markers_free(&models->mem.general, file, ptr)){ if (markers_free(&models->mem.heap, file, ptr)){
result = true; result = true;
} }
} }
@ -1005,7 +999,7 @@ DOC_SEE(Buffer_Setting_ID)
{ {
if (file->settings.tokens_exist){ if (file->settings.tokens_exist){
if (!value){ if (!value){
file_kill_tokens(system, &models->mem.general, file); file_kill_tokens(system, &models->mem.heap, file);
} }
} }
else{ else{
@ -1024,7 +1018,7 @@ DOC_SEE(Buffer_Setting_ID)
{ {
if (file->settings.tokens_exist){ if (file->settings.tokens_exist){
if ((b8)value != file->settings.tokens_without_strings){ if ((b8)value != file->settings.tokens_without_strings){
file_kill_tokens(system, &models->mem.general, file); file_kill_tokens(system, &models->mem.heap, file);
file->settings.tokens_without_strings = (b8)value; file->settings.tokens_without_strings = (b8)value;
if (!file->settings.virtual_white){ if (!file->settings.virtual_white){
file_first_lex_parallel(system, models, file); file_first_lex_parallel(system, models, file);
@ -1045,7 +1039,7 @@ DOC_SEE(Buffer_Setting_ID)
if (file->settings.tokens_exist){ if (file->settings.tokens_exist){
if (fixed_value != file->settings.parse_context_id){ if (fixed_value != file->settings.parse_context_id){
file_kill_tokens(system, &models->mem.general, file); file_kill_tokens(system, &models->mem.heap, file);
file->settings.parse_context_id = fixed_value; file->settings.parse_context_id = fixed_value;
if (!file->settings.virtual_white){ if (!file->settings.virtual_white){
file_first_lex_parallel(system, models, file); file_first_lex_parallel(system, models, file);
@ -1166,7 +1160,7 @@ DOC_SEE(Buffer_Setting_ID)
if (full_remeasure){ if (full_remeasure){
Font_Pointers font = system->font.get_pointers_by_id(file->settings.font_id); Font_Pointers font = system->font.get_pointers_by_id(file->settings.font_id);
file_allocate_character_starts_as_needed(&models->mem.general, file); file_allocate_character_starts_as_needed(&models->mem.heap, file);
buffer_measure_character_starts(system, font, &file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white); buffer_measure_character_starts(system, font, &file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white);
file_measure_wraps(system, &models->mem, file, font); file_measure_wraps(system, &models->mem, file, font);
adjust_views_looking_at_file_to_new_cursor(system, models, file); adjust_views_looking_at_file_to_new_cursor(system, models, file);
@ -1302,7 +1296,7 @@ DOC_SEE(Buffer_Create_Flag)
System_Functions *system = cmd->system; System_Functions *system = cmd->system;
Models *models = cmd->models; Models *models = cmd->models;
Working_Set *working_set = &models->working_set; Working_Set *working_set = &models->working_set;
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
Partition *part = &models->mem.part; Partition *part = &models->mem.part;
Buffer_Summary result = {0}; Buffer_Summary result = {0};
@ -1352,12 +1346,12 @@ DOC_SEE(Buffer_Create_Flag)
if (do_empty_buffer){ if (do_empty_buffer){
if ((flags & BufferCreate_NeverNew) == 0){ if ((flags & BufferCreate_NeverNew) == 0){
file = working_set_alloc_always(working_set, general, &models->lifetime_allocator); file = working_set_alloc_always(working_set, heap, &models->lifetime_allocator);
if (file != 0){ if (file != 0){
if (has_canon_name){ if (has_canon_name){
buffer_bind_file(system, general, working_set, file, canon.name); buffer_bind_file(system, heap, working_set, file, canon.name);
} }
buffer_bind_name(models, general, part, working_set, file, front_of_directory(fname)); buffer_bind_name(models, heap, part, working_set, file, front_of_directory(fname));
init_normal_file(system, models, 0, 0, file); init_normal_file(system, models, 0, 0, file);
fill_buffer_summary(&result, file, cmd); fill_buffer_summary(&result, file, cmd);
} }
@ -1367,21 +1361,21 @@ DOC_SEE(Buffer_Create_Flag)
Assert(!handle_equal(handle, null_plat_handle)); Assert(!handle_equal(handle, null_plat_handle));
i32 size = system->load_size(handle); i32 size = system->load_size(handle);
b32 in_general_mem = false; b32 in_heap_mem = false;
char *buffer = push_array(part, char, size); char *buffer = push_array(part, char, size);
if (buffer == 0){ if (buffer == 0){
buffer = (char*)general_memory_allocate(general, size); buffer = heap_array(heap, char, size);
Assert(buffer != 0); Assert(buffer != 0);
in_general_mem = true; in_heap_mem = true;
} }
if (system->load_file(handle, buffer, size)){ if (system->load_file(handle, buffer, size)){
system->load_close(handle); system->load_close(handle);
file = working_set_alloc_always(working_set, general, &models->lifetime_allocator); file = working_set_alloc_always(working_set, heap, &models->lifetime_allocator);
if (file != 0){ if (file != 0){
buffer_bind_file(system, general, working_set, file, canon.name); buffer_bind_file(system, heap, working_set, file, canon.name);
buffer_bind_name(models, general, part, working_set, file, front_of_directory(fname)); buffer_bind_name(models, heap, part, working_set, file, front_of_directory(fname));
init_normal_file(system, models, buffer, size, file); init_normal_file(system, models, buffer, size, file);
fill_buffer_summary(&result, file, cmd); fill_buffer_summary(&result, file, cmd);
} }
@ -1390,8 +1384,8 @@ DOC_SEE(Buffer_Create_Flag)
system->load_close(handle); system->load_close(handle);
} }
if (in_general_mem){ if (in_heap_mem){
general_memory_free(general, buffer); heap_free(heap, buffer);
} }
} }
} }
@ -1489,8 +1483,8 @@ DOC_SEE(Buffer_Identifier)
if (file->canon.name.size != 0){ if (file->canon.name.size != 0){
buffer_unbind_file(system, working_set, file); buffer_unbind_file(system, working_set, file);
} }
file_free(system, &models->app_links, &models->mem.general, file); file_free(system, &models->app_links, &models->mem.heap, file);
working_set_free_file(&models->mem.general, &models->lifetime_allocator, working_set, file); working_set_free_file(&models->mem.heap, &models->lifetime_allocator, working_set, file);
File_Node *used = &working_set->used_sentinel; File_Node *used = &working_set->used_sentinel;
File_Node *node = used->next; File_Node *node = used->next;
@ -1735,7 +1729,7 @@ in the system, the call will fail.)
if (vptr != 0 && models->layout.panel_count > 1){ if (vptr != 0 && models->layout.panel_count > 1){
Panel *panel = vptr->transient.panel; Panel *panel = vptr->transient.panel;
live_set_free_view(&models->mem.general, &models->lifetime_allocator, &models->live_set, vptr); live_set_free_view(&models->mem.heap, &models->lifetime_allocator, &models->live_set, vptr);
panel->view = 0; panel->view = 0;
Divider_And_ID div = layout_get_divider(&models->layout, panel->parent); Divider_And_ID div = layout_get_divider(&models->layout, panel->parent);
@ -2230,11 +2224,11 @@ View_Set_UI(Application_Links *app, View_Summary *view, UI_Control *control)
{ {
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models; Models *models = cmd->models;
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
View *vptr = imp_get_view(cmd, view); View *vptr = imp_get_view(cmd, view);
if (vptr != 0){ if (vptr != 0){
if (vptr->transient.ui_control.items != 0){ if (vptr->transient.ui_control.items != 0){
general_memory_free(general, vptr->transient.ui_control.items); heap_free(heap, vptr->transient.ui_control.items);
} }
memset(&vptr->transient.ui_control, 0, sizeof(vptr->transient.ui_control)); memset(&vptr->transient.ui_control, 0, sizeof(vptr->transient.ui_control));
if (control->count > 0){ if (control->count > 0){
@ -2264,7 +2258,7 @@ View_Set_UI(Application_Links *app, View_Summary *view, UI_Control *control)
i32 all_items_size = sizeof(UI_Item)*control->count; i32 all_items_size = sizeof(UI_Item)*control->count;
i32 memory_size = all_items_size + string_size; i32 memory_size = all_items_size + string_size;
UI_Item *new_items = (UI_Item*)general_memory_allocate(general, memory_size); UI_Item *new_items = (UI_Item*)heap_allocate(heap, memory_size);
if (new_items != 0){ if (new_items != 0){
char *string_space = (char*)(new_items + control->count); char *string_space = (char*)(new_items + control->count);
Partition string_alloc = make_part(string_space, string_size); Partition string_alloc = make_part(string_space, string_size);
@ -2414,8 +2408,8 @@ Get_Intersected_Dynamic_Scope(Application_Links *app, Dynamic_Scope *intersected
i32 member_count = (i32)(push_array(scratch, Lifetime_Object*, 0) - object_ptr_array); i32 member_count = (i32)(push_array(scratch, Lifetime_Object*, 0) - object_ptr_array);
member_count = lifetime_sort_and_dedup_object_set(object_ptr_array, member_count); member_count = lifetime_sort_and_dedup_object_set(object_ptr_array, member_count);
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
Lifetime_Key *key = lifetime_get_or_create_intersection_key(general, lifetime_allocator, object_ptr_array, member_count); Lifetime_Key *key = lifetime_get_or_create_intersection_key(heap, lifetime_allocator, object_ptr_array, member_count);
result.type = DynamicScopeType_Intersected; result.type = DynamicScopeType_Intersected;
result.intersected_opaque_handle = (u64)(PtrAsInt(key)); result.intersected_opaque_handle = (u64)(PtrAsInt(key));
} }
@ -2431,9 +2425,9 @@ Managed_Variable_Create(Application_Links *app, char *null_terminated_name, uint
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models; Models *models = cmd->models;
String name = make_string_slowly(null_terminated_name); String name = make_string_slowly(null_terminated_name);
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
Dynamic_Variable_Layout *layout = &models->variable_layout; Dynamic_Variable_Layout *layout = &models->variable_layout;
return(dynamic_variables_create(general, layout, name, default_value)); return(dynamic_variables_create(heap, layout, name, default_value));
} }
API_EXPORT Managed_Variable_ID API_EXPORT Managed_Variable_ID
@ -2452,53 +2446,55 @@ Managed_Variable_Create_Or_Get_ID(Application_Links *app, char *null_terminated_
Command_Data *cmd = (Command_Data*)app->cmd_context; Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models; Models *models = cmd->models;
String name = make_string_slowly(null_terminated_name); String name = make_string_slowly(null_terminated_name);
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
Dynamic_Variable_Layout *layout = &models->variable_layout; Dynamic_Variable_Layout *layout = &models->variable_layout;
return(dynamic_variables_lookup_or_create(general, layout, name, default_value)); return(dynamic_variables_lookup_or_create(heap, layout, name, default_value));
}
internal Dynamic_Workspace*
get_dynamic_workspace(Command_Data *cmd, Dynamic_Scope handle){
Models *models = cmd->models;
Dynamic_Workspace *workspace = 0;
switch (handle.type){
case DynamicScopeType_Global:
{
workspace = &models->dynamic_workspace;
}break;
case DynamicScopeType_Intersected:
{
Lifetime_Key *key = (Lifetime_Key*)IntAsPtr(handle.intersected_opaque_handle);
Lifetime_Allocator *lifetime_allocator = &models->lifetime_allocator;
if (lifetime_key_check(lifetime_allocator, key)){
workspace = &key->dynamic_workspace;
}
}break;
case DynamicScopeType_Buffer:
{
Editing_File *file = imp_get_file(cmd, handle.buffer_id);
if (file != 0){
workspace = &file->dynamic_workspace;
}
}break;
case DynamicScopeType_View:
{
View *vptr = imp_get_view(cmd, handle.view_id);
if (vptr != 0){
workspace = &vptr->transient.dynamic_workspace;
}
}break;
}
return(workspace);
} }
internal bool32 internal bool32
get_dynamic_variable(Command_Data *cmd, Dynamic_Scope handle, int32_t location, uint64_t **ptr_out){ get_dynamic_variable(Command_Data *cmd, Dynamic_Scope handle, int32_t location, uint64_t **ptr_out){
Models *models = cmd->models; Models *models = cmd->models;
Lifetime_Allocator *lifetime_allocator = &models->lifetime_allocator; Heap *heap = &models->mem.heap;
General_Memory *general = &models->mem.general;
Dynamic_Variable_Layout *layout = &models->variable_layout; Dynamic_Variable_Layout *layout = &models->variable_layout;
Dynamic_Variable_Block *block = 0; Dynamic_Workspace *workspace = get_dynamic_workspace(cmd, handle);
switch (handle.type){
case DynamicScopeType_Global:
{
block = &models->dynamic_vars;
}break;
case DynamicScopeType_Intersected:
{
Lifetime_Key *key = (Lifetime_Key*)IntAsPtr(handle.intersected_opaque_handle);
if (lifetime_key_check(lifetime_allocator, key)){
block = &key->dynamic_vars;
}
}break;
case DynamicScopeType_Buffer:
{
Editing_File *file = imp_get_file(cmd, handle.buffer_id);
if (file != 0){
block = &file->dynamic_vars;
}
}break;
case DynamicScopeType_View:
{
View *vptr = imp_get_view(cmd, handle.view_id);
if (vptr != 0){
block = &vptr->transient.dynamic_vars;
}
}break;
}
bool32 result = false; bool32 result = false;
if (layout != 0 && block != 0){ if (workspace != 0){
if (dynamic_variables_get_ptr(general, layout, block, location, ptr_out)){ if (dynamic_variables_get_ptr(heap, layout, &workspace->var_block, location, ptr_out)){
result = true; result = true;
} }
} }
@ -2529,6 +2525,40 @@ Managed_Variable_Get(Application_Links *app, Dynamic_Scope scope, Managed_Variab
return(false); return(false);
} }
API_EXPORT Managed_Object
Managed_Memory_Alloc(Application_Links *app, Dynamic_Scope scope, int32_t size)
{
Command_Data *cmd = (Command_Data*)app->cmd_context;
Models *models = cmd->models;
Heap *heap = &models->mem.heap;
Dynamic_Workspace *workspace = get_dynamic_workspace(cmd, scope);
Managed_Object result = 0;
if (workspace != 0){
result = (Managed_Object)dynamic_allocate(heap, &workspace->mem_bank, size);
}
return(result);
}
API_EXPORT bool32
Managed_Memory_Set(Application_Links *app, Managed_Object object, uint32_t start, uint32_t size, void *mem)
{
// Command_Data *cmd = (Command_Data*)app->cmd_context;
// Models *models = cmd->models;
u8 *ptr = (u8*)IntAsPtr(object);
memcpy(ptr + start, mem, size);
return(true);
}
API_EXPORT bool32
Managed_Memory_Get(Application_Links *app, Managed_Object object, uint32_t start, uint32_t size, void *mem_out)
{
// Command_Data *cmd = (Command_Data*)app->cmd_context;
// Models *models = cmd->models;
u8 *ptr = (u8*)IntAsPtr(object);
memcpy(mem_out, ptr + start, size);
return(true);
}
API_EXPORT User_Input API_EXPORT User_Input
Get_User_Input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type) Get_User_Input(Application_Links *app, Input_Type_Flag get_type, Input_Type_Flag abort_type)
/* /*

View File

@ -68,7 +68,7 @@ struct Models{
Parse_Context_Memory parse_context_memory; Parse_Context_Memory parse_context_memory;
Dynamic_Variable_Layout variable_layout; Dynamic_Variable_Layout variable_layout;
Dynamic_Variable_Block dynamic_vars; Dynamic_Workspace dynamic_workspace;
Lifetime_Allocator lifetime_allocator; Lifetime_Allocator lifetime_allocator;
Editing_File *message_buffer; Editing_File *message_buffer;

View File

@ -21,17 +21,22 @@
#include "4ed_system.h" #include "4ed_system.h"
#define PREFERRED_ALIGNMENT 8 #define PREFERRED_ALIGNMENT 8
#define USE_DEBUG_MEMORY
#define FSTRING_IMPLEMENTATION #define FSTRING_IMPLEMENTATION
#define FSTRING_C #define FSTRING_C
#include "4coder_lib/4coder_string.h" #include "4coder_lib/4coder_string.h"
#include "4coder_lib/4coder_mem.h" #include "4coder_lib/4coder_arena.h"
#include "4coder_lib/4coder_heap.h"
#include "4coder_lib/4coder_table.h" #include "4coder_lib/4coder_table.h"
#include "4coder_lib/4coder_utf8.h" #include "4coder_lib/4coder_utf8.h"
#if defined(USE_DEBUG_MEMORY)
# include "4ed_debug_mem.h" struct Mem_Options{
#endif Partition part;
Heap heap;
};
#include "4coder_lib/4coder_arena.cpp"
#include "4coder_lib/4coder_heap.cpp"
#include "4ed_render_target.h" #include "4ed_render_target.h"
#include "4ed_render_format.h" #include "4ed_render_format.h"

View File

@ -435,14 +435,14 @@ get_current_shift(Code_Wrap_State *wrap_state, i32 next_line_start){
internal void internal void
file_measure_wraps(System_Functions *system, Mem_Options *mem, Editing_File *file, Font_Pointers font){ file_measure_wraps(System_Functions *system, Mem_Options *mem, Editing_File *file, Font_Pointers font){
General_Memory *general = &mem->general; Heap *heap = &mem->heap;
Partition *part = &mem->part; Partition *part = &mem->part;
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(part);
file_allocate_wraps_as_needed(general, file); file_allocate_wraps_as_needed(heap, file);
file_allocate_indents_as_needed(general, file, file->state.buffer.line_count); file_allocate_indents_as_needed(heap, file, file->state.buffer.line_count);
file_allocate_wrap_positions_as_needed(general, file, file->state.buffer.line_count); file_allocate_wrap_positions_as_needed(heap, file, file->state.buffer.line_count);
Buffer_Measure_Wrap_Params params; Buffer_Measure_Wrap_Params params;
params.buffer = &file->state.buffer; params.buffer = &file->state.buffer;
@ -506,7 +506,7 @@ file_measure_wraps(System_Functions *system, Mem_Options *mem, Editing_File *fil
else{ else{
do_wrap = 1; do_wrap = 1;
wrap_unit_end = wrap_indent_marks[stage+1].wrap_position; wrap_unit_end = wrap_indent_marks[stage+1].wrap_position;
file_allocate_wrap_positions_as_needed(general, file, wrap_position_index); file_allocate_wrap_positions_as_needed(heap, file, wrap_position_index);
file->state.wrap_positions[wrap_position_index++] = stop.pos; file->state.wrap_positions[wrap_position_index++] = stop.pos;
} }
} }
@ -569,7 +569,7 @@ file_measure_wraps(System_Functions *system, Mem_Options *mem, Editing_File *fil
wrap_unit_end = wrap_end_result; wrap_unit_end = wrap_end_result;
if (x > width){ if (x > width){
do_wrap = 1; do_wrap = 1;
file_allocate_wrap_positions_as_needed(general, file, wrap_position_index); file_allocate_wrap_positions_as_needed(heap, file, wrap_position_index);
file->state.wrap_positions[wrap_position_index++] = stop.pos; file->state.wrap_positions[wrap_position_index++] = stop.pos;
} }
else{ else{
@ -801,17 +801,17 @@ file_measure_wraps(System_Functions *system, Mem_Options *mem, Editing_File *fil
next_stickieness = stickieness_guess(next_type, this_type, next_flags, this_flags, 0); next_stickieness = stickieness_guess(next_type, this_type, next_flags, this_flags, 0);
} }
i32 general_stickieness = this_stickieness; i32 heap_stickieness = this_stickieness;
if (general_stickieness < next_stickieness){ if (heap_stickieness < next_stickieness){
general_stickieness = next_stickieness; heap_stickieness = next_stickieness;
} }
if (wrap_state.wrap_x.paren_top != 0 && this_type == CPP_TOKEN_COMMA){ if (wrap_state.wrap_x.paren_top != 0 && this_type == CPP_TOKEN_COMMA){
general_stickieness = 0; heap_stickieness = 0;
} }
wrappable_score = 64*50; wrappable_score = 64*50;
wrappable_score += 101 - general_stickieness - wrap_state.wrap_x.paren_safe_top*80; wrappable_score += 101 - heap_stickieness - wrap_state.wrap_x.paren_safe_top*80;
potential_marks[potential_count].wrap_position = next_wrap_position; potential_marks[potential_count].wrap_position = next_wrap_position;
potential_marks[potential_count].line_shift = current_shift.shift; potential_marks[potential_count].line_shift = current_shift.shift;
@ -914,7 +914,7 @@ file_measure_wraps(System_Functions *system, Mem_Options *mem, Editing_File *fil
current_line_shift = clamp_top(current_line_shift, current_width - edge_tolerance); current_line_shift = clamp_top(current_line_shift, current_width - edge_tolerance);
if (stop.wrap_line_index >= file->state.line_indent_max){ if (stop.wrap_line_index >= file->state.line_indent_max){
file_allocate_indents_as_needed(general, file, stop.wrap_line_index); file_allocate_indents_as_needed(heap, file, stop.wrap_line_index);
} }
file->state.line_indents[stop.wrap_line_index] = current_line_shift; file->state.line_indents[stop.wrap_line_index] = current_line_shift;
@ -925,7 +925,7 @@ file_measure_wraps(System_Functions *system, Mem_Options *mem, Editing_File *fil
++file->state.wrap_line_count; ++file->state.wrap_line_count;
file_allocate_wrap_positions_as_needed(general, file, wrap_position_index); file_allocate_wrap_positions_as_needed(heap, file, wrap_position_index);
file->state.wrap_positions[wrap_position_index++] = size; file->state.wrap_positions[wrap_position_index++] = size;
file->state.wrap_position_count = wrap_position_index; file->state.wrap_position_count = wrap_position_index;

View File

@ -1,91 +0,0 @@
/*
* Mr. 4th Dimention - Allen Webster
*
* 01.14.2017
*
*
*
*/
// TOP
#ifndef FED_DEBUG_MEM_H
#define FED_DEBUG_MEM_H
// NOTE(allen): Prevent any future instantiation of 4coder_mem.h
#define FCODER_MEM_H
#if !defined(OS_PAGE_SIZE)
#define OS_PAGE_SIZE 4096
#endif
struct Debug_GM{
System_Functions *system;
};
static void
debug_gm_open(System_Functions *system, Debug_GM *general, void *memory, i32 size){
general->system = system;
}
static void*
debug_gm_allocate(Debug_GM *general, int32_t size){
System_Functions *system = general->system;
local_persist u32 page_round_val = OS_PAGE_SIZE-1;
int32_t page_rounded_size = (size + page_round_val) & (~page_round_val);
u8 *result = (u8*)system->memory_allocate(page_rounded_size + OS_PAGE_SIZE);
system->memory_set_protection(result + page_rounded_size, OS_PAGE_SIZE, 0);
local_persist u32 align_round_val = PREFERRED_ALIGNMENT-1;
int32_t align_rounded_size = (size + align_round_val) & (~align_round_val);
int32_t offset = page_rounded_size - align_rounded_size;
return(result + offset);
}
static void
debug_gm_free(Debug_GM *general, void *memory){
u8 *ptr = (u8*)memory;
umem val = *(umem*)(&ptr);
val &= ~(0xFFF);
ptr = *(u8**)(&val);
Assert(sizeof(val) == sizeof(ptr));
System_Functions *system = general->system;
system->memory_free(ptr, 0);
}
static void*
debug_gm_reallocate(Debug_GM *general, void *old, int32_t old_size, int32_t size){
void *result = debug_gm_allocate(general, size);
memcpy(result, old, Min(old_size, size));
debug_gm_free(general, old);
return(result);
}
inline void*
debug_gm_reallocate_nocopy(Debug_GM *general, void *old, int32_t size){
debug_gm_free(general, old);
void *result = debug_gm_allocate(general, size);
return(result);
}
// Redefine the normal general memory names to go to these debug names.
#define General_Memory Debug_GM
struct Debug_Mem_Options{
Partition part;
General_Memory general;
};
#define Mem_Options Debug_Mem_Options
#define general_memory_open(sys,gen,mem,siz) debug_gm_open(sys,gen,mem,siz)
#define general_memory_allocate(gen,siz) debug_gm_allocate(gen,siz)
#define general_memory_free(gen,siz) debug_gm_free(gen,siz)
#define general_memory_reallocate(gen,old,old_size,new_size) debug_gm_reallocate(gen,old,old_size,new_size)
#define general_memory_reallocate_nocopy(gen,old,new_size) debug_gm_reallocate_nocopy(gen,old,new_size)
#endif
// BOTTOM

View File

@ -28,9 +28,9 @@ dynamic_variables_lookup(Dynamic_Variable_Layout *layout, String name){
} }
internal Managed_Variable_ID internal Managed_Variable_ID
dynamic_variables_create__always(General_Memory *general, Dynamic_Variable_Layout *layout, String name, u64 default_value){ dynamic_variables_create__always(Heap *heap, Dynamic_Variable_Layout *layout, String name, u64 default_value){
int32_t alloc_size = name.size + 1 + sizeof(Dynamic_Variable_Slot); int32_t alloc_size = name.size + 1 + sizeof(Dynamic_Variable_Slot);
void *ptr = general_memory_allocate(general, alloc_size); void *ptr = heap_allocate(heap, alloc_size);
if (ptr != 0){ if (ptr != 0){
Dynamic_Variable_Slot *new_slot = (Dynamic_Variable_Slot*)ptr; Dynamic_Variable_Slot *new_slot = (Dynamic_Variable_Slot*)ptr;
char *c_str = (char*)(new_slot + 1); char *c_str = (char*)(new_slot + 1);
@ -47,41 +47,41 @@ dynamic_variables_create__always(General_Memory *general, Dynamic_Variable_Layou
} }
internal Managed_Variable_ID internal Managed_Variable_ID
dynamic_variables_lookup_or_create(General_Memory *general, Dynamic_Variable_Layout *layout, String name, u64 default_value){ dynamic_variables_lookup_or_create(Heap *heap, Dynamic_Variable_Layout *layout, String name, u64 default_value){
Managed_Variable_ID lookup_id = dynamic_variables_lookup(layout, name); Managed_Variable_ID lookup_id = dynamic_variables_lookup(layout, name);
if (lookup_id != ManagedVariableIndex_ERROR){ if (lookup_id != ManagedVariableIndex_ERROR){
return(lookup_id); return(lookup_id);
} }
return(dynamic_variables_create__always(general, layout, name, default_value)); return(dynamic_variables_create__always(heap, layout, name, default_value));
} }
internal i32 internal i32
dynamic_variables_create(General_Memory *general, Dynamic_Variable_Layout *layout, String name, u64 default_value){ dynamic_variables_create(Heap *heap, Dynamic_Variable_Layout *layout, String name, u64 default_value){
Managed_Variable_ID lookup_id = dynamic_variables_lookup(layout, name); Managed_Variable_ID lookup_id = dynamic_variables_lookup(layout, name);
if (lookup_id == ManagedVariableIndex_ERROR){ if (lookup_id == ManagedVariableIndex_ERROR){
return(dynamic_variables_create__always(general, layout, name, default_value)); return(dynamic_variables_create__always(heap, layout, name, default_value));
} }
return(ManagedVariableIndex_ERROR); return(ManagedVariableIndex_ERROR);
} }
internal void internal void
dynamic_variables_block_init(General_Memory *general, Dynamic_Variable_Block *block){ dynamic_variables_block_init(Heap *heap, Dynamic_Variable_Block *block){
i32 max = 64; i32 max = 64;
block->val_array = (u64*)general_memory_allocate(general, sizeof(u64)*max); block->val_array = heap_array(heap, u64, max);
block->count = 0; block->count = 0;
block->max = max; block->max = max;
} }
internal void internal void
dynamic_variables_block_free(General_Memory *general, Dynamic_Variable_Block *block){ dynamic_variables_block_free(Heap *heap, Dynamic_Variable_Block *block){
general_memory_free(general, block->val_array); heap_free(heap, block->val_array);
} }
internal void internal void
dynamic_variables_block_grow_max_to(General_Memory *general, i32 new_max, Dynamic_Variable_Block *block){ dynamic_variables_block_grow_max_to(Heap *heap, i32 new_max, Dynamic_Variable_Block *block){
u64 *new_array = (u64*)general_memory_allocate(general, sizeof(u64)*new_max); u64 *new_array = heap_array(heap, u64, new_max);
memcpy(new_array, block->val_array, sizeof(u64)*block->count); memcpy(new_array, block->val_array, sizeof(u64)*block->count);
general_memory_free(general, block->val_array); heap_free(heap, block->val_array);
block->val_array = new_array; block->val_array = new_array;
} }
@ -101,7 +101,7 @@ dynamic_variables_block_fill_unset_values(Dynamic_Variable_Layout *layout, Dynam
} }
internal b32 internal b32
dynamic_variables_get_ptr(General_Memory *general, dynamic_variables_get_ptr(Heap *heap,
Dynamic_Variable_Layout *layout, Dynamic_Variable_Block *block, Dynamic_Variable_Layout *layout, Dynamic_Variable_Block *block,
i32 location, u64 **ptr_out){ i32 location, u64 **ptr_out){
b32 result = false; b32 result = false;
@ -110,7 +110,7 @@ dynamic_variables_get_ptr(General_Memory *general,
if (index >= block->count){ if (index >= block->count){
i32 minimum_max = layout->location_counter - 1; i32 minimum_max = layout->location_counter - 1;
if (block->max < minimum_max){ if (block->max < minimum_max){
dynamic_variables_block_grow_max_to(general, minimum_max*2, block); dynamic_variables_block_grow_max_to(heap, minimum_max*2, block);
} }
dynamic_variables_block_fill_unset_values(layout, block, index + 1); dynamic_variables_block_fill_unset_values(layout, block, index + 1);
} }
@ -122,25 +122,55 @@ dynamic_variables_get_ptr(General_Memory *general,
//////////////////////////////// ////////////////////////////////
internal void*
dynamic_allocate(Heap *heap, Dynamic_Memory_Bank *bank, i32 size){
void *ptr = heap_allocate(&bank->heap, size);
if (ptr == 0){
i32 alloc_size = clamp_bottom(4096, size*4);
void *new_block = heap_allocate(heap, alloc_size);
if (new_block != 0){
Dynamic_Memory_Header *header = (Dynamic_Memory_Header*)new_block;
sll_push(bank->first, bank->last, header);
heap_extend(&bank->heap, header + 1, alloc_size - sizeof(*header));
ptr = heap_allocate(&bank->heap, size);
}
}
return(ptr);
}
////////////////////////////////
internal void
dynamic_workspace_init(Heap *heap, Dynamic_Workspace *workspace){
dynamic_variables_block_init(heap, &workspace->var_block);
}
internal void
dynamic_workspace_free(Heap *heap, Dynamic_Workspace *workspace){
dynamic_variables_block_free(heap, &workspace->var_block);
}
////////////////////////////////
internal u64 internal u64
ptr_check__hash(Lifetime_Key *key){ ptr_check__hash(void *key){
u64 x = (u64)(PtrAsInt(key)); u64 x = (u64)(PtrAsInt(key));
return(x >> 3); return((x >> 3) | bit_63);
} }
internal b32 internal b32
ptr_check_table_check(Ptr_Check_Table *table, void *key){ ptr_check_table_check(Ptr_Check_Table *table, void *key){
u32 max = table->max; u32 max = table->max;
if (max > 0 && table->count > 0){ if (max > 0 && table->count > 0){
u64 hash = ptr_check_hash(key); u64 hash = ptr_check__hash(key);
u32 first_index = hash%max; u32 first_index = hash%max;
u32 index = first_index; u32 index = first_index;
void *keys = table->keys; void **keys = table->keys;
for (;;){ for (;;){
if (keys[index] == key){ if (keys[index] == key){
return(true); return(true);
} }
else if (hashes[index] == LifetimeKeyHash_Empty){ else if (keys[index] == IntAsPtr(LifetimeKeyHash_Empty)){
return(false); return(false);
} }
index += 1; index += 1;
@ -156,17 +186,17 @@ ptr_check_table_check(Ptr_Check_Table *table, void *key){
} }
internal Ptr_Check_Table internal Ptr_Check_Table
ptr_check_table_copy(General_Memory *general, Ptr_Check_Table *table, u32 new_max); ptr_check_table_copy(Heap *heap, Ptr_Check_Table table, u32 new_max);
internal void internal void
ptr_check_table_insert(General_Memory *general, Ptr_Check_Table *table, void *key){ ptr_check_table_insert(Heap *heap, Ptr_Check_Table *table, void *key){
{ {
u32 max = table->max; u32 max = table->max;
u32 count = table->count; u32 count = table->count;
if (max == 0 || (count + 1)*6 > max*5){ if (max == 0 || (count + 1)*6 > max*5){
Assert(general != 0); Assert(heap != 0);
Ptr_Check_Table new_table = ptr_check_table_copy(general, *table, max*2); Ptr_Check_Table new_table = ptr_check_table_copy(heap, *table, max*2);
general_memory_free(general, table->mem_ptr); heap_free(heap, table->keys);
*table = new_table; *table = new_table;
} }
} }
@ -174,7 +204,7 @@ ptr_check_table_insert(General_Memory *general, Ptr_Check_Table *table, void *ke
{ {
u32 max = table->max; u32 max = table->max;
if (max > 0 && table->count > 0){ if (max > 0 && table->count > 0){
u64 hash = ptr_check_hash(key); u64 hash = ptr_check__hash(key);
u32 first_index = hash%max; u32 first_index = hash%max;
u32 index = first_index; u32 index = first_index;
void **keys = table->keys; void **keys = table->keys;
@ -199,7 +229,7 @@ internal void
ptr_check_table_erase(Ptr_Check_Table *table, Lifetime_Key *erase_key){ ptr_check_table_erase(Ptr_Check_Table *table, Lifetime_Key *erase_key){
u32 max = table->max; u32 max = table->max;
if (max > 0 && table->count > 0){ if (max > 0 && table->count > 0){
u64 hash = ptr_check_hash(erase_key); u64 hash = ptr_check__hash(erase_key);
u32 first_index = hash%max; u32 first_index = hash%max;
u32 index = first_index; u32 index = first_index;
void **keys = table->keys; void **keys = table->keys;
@ -208,7 +238,7 @@ ptr_check_table_erase(Ptr_Check_Table *table, Lifetime_Key *erase_key){
keys[index] = 0; keys[index] = 0;
return; return;
} }
else if (hashes[index] == LifetimeKeyHash_Empty){ else if (keys[index] == IntAsPtr(LifetimeKeyHash_Empty)){
return; return;
} }
index += 1; index += 1;
@ -222,17 +252,16 @@ ptr_check_table_erase(Ptr_Check_Table *table, Lifetime_Key *erase_key){
} }
} }
internal Lifetime_Key_Check_Table internal Ptr_Check_Table
ptr_check_table_copy(General_Memory *general, Lifetime_Key_Check_Table *table, u32 new_max){ ptr_check_table_copy(Heap *heap, Ptr_Check_Table table, u32 new_max){
Lifetime_Key_Check_Table new_table = {0}; Ptr_Check_Table new_table = {0};
new_table.max = clamp_bottom(table.max, new_max); new_table.max = clamp_bottom(table.max, new_max);
new_table.max = clamp_bottom(307, new_table.max); new_table.max = clamp_bottom(307, new_table.max);
i32 item_size = sizeof(*new_table.keys); new_table.keys = heap_array(heap, void*, new_table.max);
new_table.keys = (Lifetime_Key**)general_memory_allocate(general, item_size*new_table.max); memset(new_table.keys, 0, sizeof(*new_table.keys)*new_table.max);
memset(new_table.keys, 0, item_size*new_table.max);
for (u32 i = 0; i < table.max; i += 1){ for (u32 i = 0; i < table.max; i += 1){
u64 k = (u64)(PtrAsInt(table.keys[i])); u64 k = (u64)(PtrAsInt(table.keys[i]));
if (k > 1){ if ((k&bit_63) == 0){
ptr_check_table_insert(0, &new_table, table.keys[i]); ptr_check_table_insert(0, &new_table, table.keys[i]);
} }
} }
@ -284,17 +313,17 @@ lifetime__key_table_lookup(Lifetime_Key_Table *table, u64 hash, Lifetime_Object
} }
internal Lifetime_Key_Table internal Lifetime_Key_Table
lifetime__key_table_copy(General_Memory *general, Lifetime_Key_Table table, u32 new_max); lifetime__key_table_copy(Heap *heap, Lifetime_Key_Table table, u32 new_max);
internal void internal void
lifetime__key_table_insert(General_Memory *general, Lifetime_Key_Table *table, u64 hash, Lifetime_Key *key){ lifetime__key_table_insert(Heap *heap, Lifetime_Key_Table *table, u64 hash, Lifetime_Key *key){
{ {
u32 max = table->max; u32 max = table->max;
u32 count = table->count; u32 count = table->count;
if (max == 0 || (count + 1)*6 > max*5){ if (max == 0 || (count + 1)*6 > max*5){
Assert(general != 0); Assert(heap != 0);
Lifetime_Key_Table new_table = lifetime__key_table_copy(general, *table, max*2); Lifetime_Key_Table new_table = lifetime__key_table_copy(heap, *table, max*2);
general_memory_free(general, table->mem_ptr); heap_free(heap, table->mem_ptr);
*table = new_table; *table = new_table;
} }
} }
@ -356,12 +385,12 @@ lifetime__key_table_erase(Lifetime_Key_Table *table, Lifetime_Key *erase_key){
} }
internal Lifetime_Key_Table internal Lifetime_Key_Table
lifetime__key_table_copy(General_Memory *general, Lifetime_Key_Table table, u32 new_max){ lifetime__key_table_copy(Heap *heap, Lifetime_Key_Table table, u32 new_max){
Lifetime_Key_Table new_table = {0}; Lifetime_Key_Table new_table = {0};
new_table.max = clamp_bottom(table.max, new_max); new_table.max = clamp_bottom(table.max, new_max);
new_table.max = clamp_bottom(307, new_table.max); new_table.max = clamp_bottom(307, new_table.max);
i32 item_size = sizeof(*new_table.hashes) + sizeof(*new_table.keys); i32 item_size = sizeof(*new_table.hashes) + sizeof(*new_table.keys);
new_table.mem_ptr = general_memory_allocate(general, item_size*new_table.max); new_table.mem_ptr = heap_allocate(heap, item_size*new_table.max);
memset(new_table.mem_ptr, 0, item_size*new_table.max); memset(new_table.mem_ptr, 0, item_size*new_table.max);
new_table.hashes = (u64*)(new_table.mem_ptr); new_table.hashes = (u64*)(new_table.mem_ptr);
new_table.keys = (Lifetime_Key**)(new_table.hashes + new_table.max); new_table.keys = (Lifetime_Key**)(new_table.hashes + new_table.max);
@ -374,10 +403,10 @@ lifetime__key_table_copy(General_Memory *general, Lifetime_Key_Table table, u32
} }
internal void internal void
lifetime__free_key(General_Memory *general, Lifetime_Allocator *lifetime_allocator, lifetime__free_key(Heap *heap, Lifetime_Allocator *lifetime_allocator,
Lifetime_Key *key, Lifetime_Object *skip_object){ Lifetime_Key *key, Lifetime_Object *skip_object){
// Deinit // Deinit
dynamic_variables_block_free(general, &key->dynamic_vars); dynamic_workspace_free(heap, &key->dynamic_workspace);
// Remove From Objects // Remove From Objects
i32 count = key->count; i32 count = key->count;
@ -420,16 +449,16 @@ lifetime__free_key(General_Memory *general, Lifetime_Allocator *lifetime_allocat
// Free // Free
lifetime__key_table_erase(&lifetime_allocator->key_table, key); lifetime__key_table_erase(&lifetime_allocator->key_table, key);
ptr_check_table_erase(&lifetime_allocator->key_check_table, key); ptr_check_table_erase(&lifetime_allocator->key_check_table, key);
general_memory_free(general, key->members); heap_free(heap, key->members);
zdll_push_back(lifetime_allocator->free_keys.first, lifetime_allocator->free_keys.last, key); zdll_push_back(lifetime_allocator->free_keys.first, lifetime_allocator->free_keys.last, key);
} }
internal Lifetime_Key_Ref_Node* internal Lifetime_Key_Ref_Node*
lifetime__alloc_key_reference_node(General_Memory *general, Lifetime_Allocator *lifetime_allocator){ lifetime__alloc_key_reference_node(Heap *heap, Lifetime_Allocator *lifetime_allocator){
Lifetime_Key_Ref_Node *result = lifetime_allocator->free_key_references.first; Lifetime_Key_Ref_Node *result = lifetime_allocator->free_key_references.first;
if (result == 0){ if (result == 0){
i32 new_node_count = 32; i32 new_node_count = 32;
Lifetime_Key_Ref_Node *new_nodes = (Lifetime_Key_Ref_Node*)general_memory_allocate(general, sizeof(Lifetime_Key_Ref_Node)*new_node_count); Lifetime_Key_Ref_Node *new_nodes = heap_array(heap, Lifetime_Key_Ref_Node, new_node_count);
Lifetime_Key_Ref_Node *new_node_ptr = new_nodes; Lifetime_Key_Ref_Node *new_node_ptr = new_nodes;
for (i32 i = 0; i < new_node_count; i += 1, new_node_ptr += 1){ for (i32 i = 0; i < new_node_count; i += 1, new_node_ptr += 1){
zdll_push_back(lifetime_allocator->free_key_references.first, zdll_push_back(lifetime_allocator->free_key_references.first,
@ -445,7 +474,7 @@ lifetime__alloc_key_reference_node(General_Memory *general, Lifetime_Allocator *
} }
internal void internal void
lifetime__object_add_key(General_Memory *general, Lifetime_Allocator *lifetime_allocator, lifetime__object_add_key(Heap *heap, Lifetime_Allocator *lifetime_allocator,
Lifetime_Object *object, Lifetime_Key *key){ Lifetime_Object *object, Lifetime_Key *key){
Lifetime_Key_Ref_Node *last_node = object->key_node_last; Lifetime_Key_Ref_Node *last_node = object->key_node_last;
b32 insert_on_new_node = false; b32 insert_on_new_node = false;
@ -462,7 +491,7 @@ lifetime__object_add_key(General_Memory *general, Lifetime_Allocator *lifetime_a
} }
} }
if (insert_on_new_node){ if (insert_on_new_node){
Lifetime_Key_Ref_Node *new_node = lifetime__alloc_key_reference_node(general, lifetime_allocator); Lifetime_Key_Ref_Node *new_node = lifetime__alloc_key_reference_node(heap, lifetime_allocator);
zdll_push_back(object->key_node_first, object->key_node_last, new_node); zdll_push_back(object->key_node_first, object->key_node_last, new_node);
memset(new_node->keys, 0, sizeof(new_node->keys)); memset(new_node->keys, 0, sizeof(new_node->keys));
new_node->keys[0] = key; new_node->keys[0] = key;
@ -471,11 +500,11 @@ lifetime__object_add_key(General_Memory *general, Lifetime_Allocator *lifetime_a
} }
internal Lifetime_Object* internal Lifetime_Object*
lifetime_alloc_object(General_Memory *general, Lifetime_Allocator *lifetime_allocator, i32 user_type, void *user_back_ptr){ lifetime_alloc_object(Heap *heap, Lifetime_Allocator *lifetime_allocator, i32 user_type, void *user_back_ptr){
Lifetime_Object *object = lifetime_allocator->free_objects.first; Lifetime_Object *object = lifetime_allocator->free_objects.first;
if (object == 0){ if (object == 0){
i32 new_object_count = 256; i32 new_object_count = 256;
Lifetime_Object *new_objects = (Lifetime_Object*)general_memory_allocate(general, sizeof(Lifetime_Object)*new_object_count); Lifetime_Object *new_objects = heap_array(heap, Lifetime_Object, new_object_count);
Lifetime_Object *new_object_ptr = new_objects; Lifetime_Object *new_object_ptr = new_objects;
for (i32 i = 0; i < new_object_count; i += 1, new_object_ptr += 1){ for (i32 i = 0; i < new_object_count; i += 1, new_object_ptr += 1){
zdll_push_back(lifetime_allocator->free_objects.first, lifetime_allocator->free_objects.last, new_object_ptr); zdll_push_back(lifetime_allocator->free_objects.first, lifetime_allocator->free_objects.last, new_object_ptr);
@ -495,7 +524,7 @@ lifetime_alloc_object(General_Memory *general, Lifetime_Allocator *lifetime_allo
} }
internal void internal void
lifetime_free_object(General_Memory *general, Lifetime_Allocator *lifetime_allocator, lifetime_free_object(Heap *heap, Lifetime_Allocator *lifetime_allocator,
Lifetime_Object *lifetime_object){ Lifetime_Object *lifetime_object){
i32 key_i = 0; i32 key_i = 0;
for (Lifetime_Key_Ref_Node *node = lifetime_object->key_node_first; for (Lifetime_Key_Ref_Node *node = lifetime_object->key_node_first;
@ -503,7 +532,7 @@ lifetime_free_object(General_Memory *general, Lifetime_Allocator *lifetime_alloc
node = node->next){ node = node->next){
i32 one_past_last = clamp_top(ArrayCount(node->keys), lifetime_object->key_count - key_i); i32 one_past_last = clamp_top(ArrayCount(node->keys), lifetime_object->key_count - key_i);
for (i32 i = 0; i < one_past_last; i += 1){ for (i32 i = 0; i < one_past_last; i += 1){
lifetime__free_key(general, lifetime_allocator, node->keys[i], lifetime_object); lifetime__free_key(heap, lifetime_allocator, node->keys[i], lifetime_object);
} }
key_i += one_past_last; key_i += one_past_last;
} }
@ -558,7 +587,7 @@ lifetime_sort_and_dedup_object_set(Lifetime_Object **ptr_array, i32 count){
} }
internal Lifetime_Key* internal Lifetime_Key*
lifetime_get_or_create_intersection_key(General_Memory *general, Lifetime_Allocator *lifetime_allocator, Lifetime_Object **object_ptr_array, i32 count){ lifetime_get_or_create_intersection_key(Heap *heap, Lifetime_Allocator *lifetime_allocator, Lifetime_Object **object_ptr_array, i32 count){
u64 hash = lifetime__key_hash(object_ptr_array, count); u64 hash = lifetime__key_hash(object_ptr_array, count);
// Lookup // Lookup
@ -572,7 +601,7 @@ lifetime_get_or_create_intersection_key(General_Memory *general, Lifetime_Alloca
Lifetime_Key *new_key = lifetime_allocator->free_keys.first; Lifetime_Key *new_key = lifetime_allocator->free_keys.first;
if (new_key == 0){ if (new_key == 0){
i32 new_key_count = 256; i32 new_key_count = 256;
Lifetime_Key *new_keys = (Lifetime_Key*)general_memory_allocate(general, sizeof(Lifetime_Key)*new_key_count); Lifetime_Key *new_keys = heap_array(heap, Lifetime_Key, new_key_count);
Lifetime_Key *new_key_ptr = new_keys; Lifetime_Key *new_key_ptr = new_keys;
for (i32 i = 0; i < new_key_count; i += 1, new_key_ptr += 1){ for (i32 i = 0; i < new_key_count; i += 1, new_key_ptr += 1){
zdll_push_back(lifetime_allocator->free_keys.first, lifetime_allocator->free_keys.last, new_key_ptr); zdll_push_back(lifetime_allocator->free_keys.first, lifetime_allocator->free_keys.last, new_key_ptr);
@ -586,17 +615,17 @@ lifetime_get_or_create_intersection_key(General_Memory *general, Lifetime_Alloca
Lifetime_Object **object_ptr = object_ptr_array; Lifetime_Object **object_ptr = object_ptr_array;
for (i32 i = 0; i < count; i += 1, object_ptr += 1){ for (i32 i = 0; i < count; i += 1, object_ptr += 1){
Lifetime_Object *object = *object_ptr; Lifetime_Object *object = *object_ptr;
lifetime__object_add_key(general, lifetime_allocator, object, new_key); lifetime__object_add_key(heap, lifetime_allocator, object, new_key);
} }
// Initialize // Initialize
new_key->members = (Lifetime_Object**)general_memory_allocate(general, sizeof(Lifetime_Object*)*count); new_key->members = heap_array(heap, Lifetime_Object*, count);
memcpy(new_key->members, object_ptr_array, sizeof(Lifetime_Object*)*count); memcpy(new_key->members, object_ptr_array, sizeof(*new_key->members)*count);
new_key->count = count; new_key->count = count;
dynamic_variables_block_init(general, &new_key->dynamic_vars); dynamic_workspace_init(heap, &new_key->dynamic_workspace);
lifetime__key_table_insert(general, &lifetime_allocator->key_table, hash, new_key); lifetime__key_table_insert(heap, &lifetime_allocator->key_table, hash, new_key);
ptr_check_table_insert(general, &lifetime_allocator->key_check_table, new_key); ptr_check_table_insert(heap, &lifetime_allocator->key_check_table, new_key);
return(new_key); return(new_key);
} }

View File

@ -33,6 +33,25 @@ struct Dynamic_Variable_Block{
//////////////////////////////// ////////////////////////////////
struct Dynamic_Memory_Header{
Dynamic_Memory_Header *next;
};
struct Dynamic_Memory_Bank{
Heap heap;
Dynamic_Memory_Header *first;
Dynamic_Memory_Header *last;
};
////////////////////////////////
struct Dynamic_Workspace{
Dynamic_Variable_Block var_block;
Dynamic_Memory_Bank mem_bank;
};
////////////////////////////////
struct Ptr_Check_Table{ struct Ptr_Check_Table{
void **keys; void **keys;
u32 count; u32 count;
@ -74,7 +93,7 @@ struct Lifetime_Key{
struct{ struct{
struct Lifetime_Object **members; struct Lifetime_Object **members;
i32 count; i32 count;
Dynamic_Variable_Block dynamic_vars; Dynamic_Workspace dynamic_workspace;
}; };
}; };
}; };
@ -113,7 +132,7 @@ struct Lifetime_Allocator{
Lifetime_Object_List free_objects; Lifetime_Object_List free_objects;
Lifetime_Key_List free_keys; Lifetime_Key_List free_keys;
Lifetime_Key_Table key_table; Lifetime_Key_Table key_table;
Lifetime_Ptr_Check_Table key_check_table; Ptr_Check_Table key_check_table;
}; };
struct Lifetime_Key_With_Opaque_ID{ struct Lifetime_Key_With_Opaque_ID{

View File

@ -10,11 +10,11 @@
// TOP // TOP
inline void inline void
edit_pre_maintenance(System_Functions *system, General_Memory *general, Editing_File *file){ edit_pre_maintenance(System_Functions *system, Heap *heap, Editing_File *file){
if (file->state.still_lexing){ if (file->state.still_lexing){
system->cancel_job(BACKGROUND_THREADS, file->state.lex_job); system->cancel_job(BACKGROUND_THREADS, file->state.lex_job);
if (file->state.swap_array.tokens){ if (file->state.swap_array.tokens){
general_memory_free(general, file->state.swap_array.tokens); heap_free(heap, file->state.swap_array.tokens);
file->state.swap_array.tokens = 0; file->state.swap_array.tokens = 0;
} }
file->state.still_lexing = 0; file->state.still_lexing = 0;
@ -142,11 +142,11 @@ edit_single__inner(System_Functions *system, Models *models, Editing_File *file,
// NOTE(allen): fixing stuff beforewards???? // NOTE(allen): fixing stuff beforewards????
file_update_history_before_edit(mem, file, spec.step, spec.str, history_mode); file_update_history_before_edit(mem, file, spec.step, spec.str, history_mode);
edit_pre_maintenance(system, &mem->general, file); edit_pre_maintenance(system, &mem->heap, file);
// NOTE(allen): actual text replacement // NOTE(allen): actual text replacement
i32 shift_amount = 0; i32 shift_amount = 0;
General_Memory *general = &mem->general; Heap *heap = &mem->heap;
Partition *part = &mem->part; Partition *part = &mem->part;
char *str = (char*)spec.str; char *str = (char*)spec.str;
@ -162,11 +162,11 @@ edit_single__inner(System_Functions *system, Models *models, Editing_File *file,
while (buffer_replace_range(&file->state.buffer, start, end, str, str_len, &shift_amount, part->base + part->pos, scratch_size, &request_amount)){ while (buffer_replace_range(&file->state.buffer, start, end, str, str_len, &shift_amount, part->base + part->pos, scratch_size, &request_amount)){
void *new_data = 0; void *new_data = 0;
if (request_amount > 0){ if (request_amount > 0){
new_data = general_memory_allocate(general, request_amount); new_data = heap_allocate(heap, request_amount);
} }
void *old_data = buffer_edit_provide_memory(&file->state.buffer, new_data, request_amount); void *old_data = buffer_edit_provide_memory(&file->state.buffer, new_data, request_amount);
if (old_data){ if (old_data){
general_memory_free(general, old_data); heap_free(heap, old_data);
} }
} }
@ -191,10 +191,10 @@ edit_single__inner(System_Functions *system, Models *models, Editing_File *file,
Font_Pointers font = system->font.get_pointers_by_id(file->settings.font_id); Font_Pointers font = system->font.get_pointers_by_id(file->settings.font_id);
Assert(font.valid); Assert(font.valid);
file_grow_starts_as_needed(general, buffer, line_shift); file_grow_starts_as_needed(heap, buffer, line_shift);
buffer_remeasure_starts(buffer, line_start, line_end, line_shift, shift_amount); buffer_remeasure_starts(buffer, line_start, line_end, line_shift, shift_amount);
file_allocate_character_starts_as_needed(general, file); file_allocate_character_starts_as_needed(heap, file);
buffer_remeasure_character_starts(system, font, buffer, line_start, line_end, line_shift, file->state.character_starts, 0, file->settings.virtual_white); buffer_remeasure_character_starts(system, font, buffer, line_start, line_end, line_shift, file->state.character_starts, 0, file->settings.virtual_white);
file_measure_wraps(system, &models->mem, file, font); file_measure_wraps(system, &models->mem, file, font);
@ -220,7 +220,7 @@ edit_single(System_Functions *system, Models *models, Editing_File *file,
} }
internal Edit_Spec internal Edit_Spec
edit_compute_batch_spec(General_Memory *general, edit_compute_batch_spec(Heap *heap,
Editing_File *file, Editing_File *file,
Buffer_Edit *edits, char *str_base, i32 str_size, Buffer_Edit *edits, char *str_base, i32 str_size,
Buffer_Edit *inverse_array, char *inv_str, i32 inv_max, i32 edit_count, i32 batch_type){ Buffer_Edit *inverse_array, char *inv_str, i32 inv_max, i32 edit_count, i32 batch_type){
@ -232,8 +232,8 @@ edit_compute_batch_spec(General_Memory *general,
InvalidCodePath; InvalidCodePath;
} }
i32 first_child = undo_children_push(general, &file->state.undo.children, edits, edit_count, (u8*)(str_base), str_size); i32 first_child = undo_children_push(heap, &file->state.undo.children, edits, edit_count, (u8*)(str_base), str_size);
i32 inverse_first_child = undo_children_push(general, &file->state.undo.children, inverse_array, edit_count, (u8*)(inv_str), inv_str_pos); i32 inverse_first_child = undo_children_push(heap, &file->state.undo.children, inverse_array, edit_count, (u8*)(inv_str), inv_str_pos);
Edit_Spec spec = {}; Edit_Spec spec = {};
spec.step.type = ED_NORMAL; spec.step.type = ED_NORMAL;
@ -250,14 +250,14 @@ edit_batch(System_Functions *system, Models *models, Editing_File *file,
Edit_Spec spec, History_Mode history_mode, Buffer_Batch_Edit_Type batch_type){ Edit_Spec spec, History_Mode history_mode, Buffer_Batch_Edit_Type batch_type){
Mem_Options *mem = &models->mem; Mem_Options *mem = &models->mem;
General_Memory *general = &mem->general; Heap *heap = &mem->heap;
Partition *part = &mem->part; Partition *part = &mem->part;
Editing_Layout *layout = &models->layout; Editing_Layout *layout = &models->layout;
// NOTE(allen): fixing stuff "beforewards"??? // NOTE(allen): fixing stuff "beforewards"???
Assert(spec.str == 0); Assert(spec.str == 0);
file_update_history_before_edit(mem, file, spec.step, 0, history_mode); file_update_history_before_edit(mem, file, spec.step, 0, history_mode);
edit_pre_maintenance(system, &mem->general, file); edit_pre_maintenance(system, &mem->heap, file);
// NOTE(allen): actual text replacement // NOTE(allen): actual text replacement
u8 *str_base = file->state.undo.children.strings; u8 *str_base = file->state.undo.children.strings;
@ -275,11 +275,11 @@ edit_batch(System_Functions *system, Models *models, Editing_File *file,
scratch_size, &request_amount)){ scratch_size, &request_amount)){
void *new_data = 0; void *new_data = 0;
if (request_amount > 0){ if (request_amount > 0){
new_data = general_memory_allocate(general, request_amount); new_data = heap_allocate(heap, request_amount);
} }
void *old_data = buffer_edit_provide_memory(&file->state.buffer, new_data, request_amount); void *old_data = buffer_edit_provide_memory(&file->state.buffer, new_data, request_amount);
if (old_data){ if (old_data){
general_memory_free(general, old_data); heap_free(heap, old_data);
} }
} }
@ -341,13 +341,13 @@ edit_batch(System_Functions *system, Models *models, Editing_File *file,
// it from cursor fixing is because you're a lazy asshole. // it from cursor fixing is because you're a lazy asshole.
// NOTE(allen): meta data // NOTE(allen): meta data
file_measure_starts(general, &file->state.buffer); file_measure_starts(heap, &file->state.buffer);
Font_Pointers font = system->font.get_pointers_by_id(file->settings.font_id); Font_Pointers font = system->font.get_pointers_by_id(file->settings.font_id);
Assert(font.valid); Assert(font.valid);
// TODO(allen): write the remeasurement version // TODO(allen): write the remeasurement version
file_allocate_character_starts_as_needed(general, file); file_allocate_character_starts_as_needed(heap, file);
buffer_measure_character_starts(system, font, &file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white); buffer_measure_character_starts(system, font, &file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white);
file_measure_wraps(system, &models->mem, file, font); file_measure_wraps(system, &models->mem, file, font);

View File

@ -27,16 +27,13 @@ init_file_markers_state(Editing_File_Markers *markers){
} }
internal void internal void
clear_file_markers_state(Application_Links *app, General_Memory *general, Editing_File_Markers *markers){ clear_file_markers_state(Application_Links *app, Heap *heap, Editing_File_Markers *markers){
Marker_Array *sentinel = &markers->sentinel; Marker_Array *sentinel = &markers->sentinel;
for (Marker_Array *marker_array = sentinel->next; for (Marker_Array *marker_array = sentinel->next;
marker_array != sentinel; marker_array != sentinel;
marker_array = sentinel->next){ marker_array = sentinel->next){
if (marker_array->callback != 0){
marker_array->callback(app, marker_array, marker_array + 1, marker_array->user_data_size);
}
dll_remove(marker_array); dll_remove(marker_array);
general_memory_free(general, marker_array); heap_free(heap, marker_array);
} }
Assert(sentinel->next == sentinel); Assert(sentinel->next == sentinel);
Assert(sentinel->prev == sentinel); Assert(sentinel->prev == sentinel);
@ -45,9 +42,9 @@ clear_file_markers_state(Application_Links *app, General_Memory *general, Editin
} }
internal void* internal void*
allocate_markers_state(General_Memory *general, Editing_File *file, u32 new_array_max){ allocate_markers_state(Heap *heap, Editing_File *file, u32 new_array_max){
u32 memory_size = sizeof(Marker_Array) + sizeof(Marker)*new_array_max; u32 memory_size = sizeof(Marker_Array) + sizeof(Marker)*new_array_max;
Marker_Array *array = (Marker_Array*)general_memory_allocate(general, memory_size); Marker_Array *array = (Marker_Array*)heap_allocate(heap, memory_size);
dll_insert_back(&file->markers.sentinel, array); dll_insert_back(&file->markers.sentinel, array);
array->buffer_id = file->id; array->buffer_id = file->id;
@ -67,15 +64,6 @@ get_buffer_id_from_marker_handle(void *handle){
return(result.id); return(result.id);
} }
internal Data
get_user_data_from_marker_handle(void *handle){
Marker_Array *markers = (Marker_Array*)handle;
Data data;
data.data = (u8*)markers + 1;
data.size = markers->user_data_size;
return(data);
}
internal b32 internal b32
markers_set(Editing_File *file, void *handle, u32 first_index, u32 count, Marker *source){ markers_set(Editing_File *file, void *handle, u32 first_index, u32 count, Marker *source){
Assert(file != 0); Assert(file != 0);
@ -126,7 +114,7 @@ markers_get(Editing_File *file, void *handle, u32 first_index, u32 count, Marker
} }
internal b32 internal b32
markers_free(General_Memory *general, Editing_File *file, void *handle){ markers_free(Heap *heap, Editing_File *file, void *handle){
Assert(file != 0); Assert(file != 0);
if (handle == 0){ if (handle == 0){
return(false); return(false);
@ -140,7 +128,7 @@ markers_free(General_Memory *general, Editing_File *file, void *handle){
dll_remove(markers); dll_remove(markers);
file->markers.marker_count -= markers->count; file->markers.marker_count -= markers->count;
--file->markers.array_count; --file->markers.array_count;
general_memory_free(general, markers); heap_free(heap, markers);
return(true); return(true);
} }
@ -333,15 +321,14 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
if (filename != 0){ if (filename != 0){
Mem_Options *mem = &models->mem; Mem_Options *mem = &models->mem;
if (models->hook_save_file){ if (models->hook_save_file != 0){
models->hook_save_file(&models->app_links, file->id.id); models->hook_save_file(&models->app_links, file->id.id);
} }
i32 max = 0, size = 0;
b32 dos_write_mode = file->settings.dos_write_mode;
char *data = 0;
Gap_Buffer *buffer = &file->state.buffer; Gap_Buffer *buffer = &file->state.buffer;
b32 dos_write_mode = file->settings.dos_write_mode;
i32 max = 0;
if (dos_write_mode){ if (dos_write_mode){
max = buffer_size(buffer) + buffer->line_count + 1; max = buffer_size(buffer) + buffer->line_count + 1;
} }
@ -349,21 +336,23 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
max = buffer_size(buffer); max = buffer_size(buffer);
} }
b32 used_general = 0; b32 used_heap = 0;
Temp_Memory temp = begin_temp_memory(&mem->part); Temp_Memory temp = begin_temp_memory(&mem->part);
char empty = 0; char empty = 0;
char *data = 0;
if (max == 0){ if (max == 0){
data = &empty; data = &empty;
} }
else{ else{
data = (char*)push_array(&mem->part, char, max); data = (char*)push_array(&mem->part, char, max);
if (!data){ if (!data){
used_general = 1; used_heap = 1;
data = (char*)general_memory_allocate(&mem->general, max); data = heap_array(&mem->heap, char, max);
} }
} }
Assert(data != 0); Assert(data != 0);
i32 size = 0;
if (dos_write_mode){ if (dos_write_mode){
size = buffer_convert_out(buffer, data, max); size = buffer_convert_out(buffer, data, max);
} }
@ -391,8 +380,8 @@ save_file_to_name(System_Functions *system, Models *models, Editing_File *file,
file_set_dirty_flag(file, DirtyState_UpToDate); file_set_dirty_flag(file, DirtyState_UpToDate);
if (used_general){ if (used_heap){
general_memory_free(&mem->general, data); heap_free(&mem->heap, data);
} }
end_temp_memory(temp); end_temp_memory(temp);
@ -507,35 +496,33 @@ file_compute_cursor(System_Functions *system, Editing_File *file, Buffer_Seek se
//////////////////////////////// ////////////////////////////////
internal i32 internal i32
file_grow_starts_as_needed(General_Memory *general, Gap_Buffer *buffer, i32 additional_lines){ file_grow_starts_as_needed(Heap *heap, Gap_Buffer *buffer, i32 additional_lines){
b32 result = GROW_NOT_NEEDED; b32 result = GROW_NOT_NEEDED;
i32 max = buffer->line_max; i32 max = buffer->line_max;
i32 count = buffer->line_count; i32 count = buffer->line_count;
i32 target_lines = count + additional_lines; i32 target_lines = count + additional_lines;
if (target_lines > max || max == 0){ if (target_lines > max || max == 0){
max = l_round_up_i32(target_lines + max, KB(1)); max = l_round_up_i32(target_lines + max, KB(1));
i32 *new_lines = heap_array(heap, i32, max);
i32 *new_lines = (i32*)general_memory_reallocate(general, buffer->line_starts, sizeof(i32)*count, sizeof(f32)*max); if (new_lines != 0){
if (new_lines){
result = GROW_SUCCESS; result = GROW_SUCCESS;
buffer->line_max = max; memcpy(new_lines, buffer->line_starts, sizeof(*new_lines)*count);
heap_free(heap, buffer->line_starts);
buffer->line_starts = new_lines; buffer->line_starts = new_lines;
buffer->line_max = max;
} }
else{ else{
result = GROW_FAILED; result = GROW_FAILED;
} }
} }
return(result); return(result);
} }
internal void internal void
file_measure_starts(General_Memory *general, Gap_Buffer *buffer){ file_measure_starts(Heap *heap, Gap_Buffer *buffer){
if (buffer->line_starts == 0){ if (buffer->line_starts == 0){
i32 max = buffer->line_max = KB(1); i32 max = buffer->line_max = KB(1);
buffer->line_starts = (i32*)general_memory_allocate(general, max*sizeof(i32)); buffer->line_starts = heap_array(heap, i32, max);
Assert(buffer->line_starts != 0); Assert(buffer->line_starts != 0);
} }
@ -543,25 +530,29 @@ file_measure_starts(General_Memory *general, Gap_Buffer *buffer){
for (;buffer_measure_starts(&state, buffer);){ for (;buffer_measure_starts(&state, buffer);){
i32 count = state.count; i32 count = state.count;
i32 max = ((buffer->line_max + 1) << 1); i32 max = ((buffer->line_max + 1) << 1);
i32 *new_lines = (i32*)general_memory_reallocate(general, buffer->line_starts, sizeof(i32)*count, sizeof(i32)*max); i32 *new_lines = heap_array(heap, i32, max);
Assert(new_lines); Assert(new_lines != 0);
memcpy(new_lines, buffer->line_starts, sizeof(*new_lines)*count);
heap_free(heap, buffer->line_starts);
buffer->line_starts = new_lines; buffer->line_starts = new_lines;
buffer->line_max = max; buffer->line_max = max;
} }
} }
internal void internal void
file_allocate_metadata_as_needed(General_Memory *general, Gap_Buffer *buffer, void **mem, i32 *mem_max_count, i32 count, i32 item_size){ file_allocate_metadata_as_needed(Heap *heap, Gap_Buffer *buffer, void **mem, i32 *mem_max_count, i32 count, i32 item_size){
if (*mem == 0){ if (*mem == 0){
i32 max = l_round_up_i32(((count + 1)*2), KB(1)); i32 max = l_round_up_i32(((count + 1)*2), KB(1));
*mem = general_memory_allocate(general, max*item_size); *mem = heap_allocate(heap, max*item_size);
*mem_max_count = max; *mem_max_count = max;
Assert(*mem != 0); Assert(*mem != 0);
} }
else if (*mem_max_count < count){ else if (*mem_max_count < count){
i32 old_max = *mem_max_count; i32 old_max = *mem_max_count;
i32 max = l_round_up_i32(((count + 1)*2), KB(1)); i32 max = l_round_up_i32(((count + 1)*2), KB(1));
void *new_mem = general_memory_reallocate(general, *mem, item_size*old_max, item_size*max); void *new_mem = heap_allocate(heap, item_size*max);
memcpy(new_mem, *mem, item_size*old_max);
heap_free(heap, *mem);
*mem = new_mem; *mem = new_mem;
*mem_max_count = max; *mem_max_count = max;
Assert(*mem != 0); Assert(*mem != 0);
@ -569,31 +560,31 @@ file_allocate_metadata_as_needed(General_Memory *general, Gap_Buffer *buffer, vo
} }
inline void inline void
file_allocate_character_starts_as_needed(General_Memory *general, Editing_File *file){ file_allocate_character_starts_as_needed(Heap *heap, Editing_File *file){
file_allocate_metadata_as_needed(general, file_allocate_metadata_as_needed(heap,
&file->state.buffer, (void**)&file->state.character_starts, &file->state.buffer, (void**)&file->state.character_starts,
&file->state.character_start_max, file->state.buffer.line_count + 1, sizeof(i32)); &file->state.character_start_max, file->state.buffer.line_count + 1, sizeof(i32));
} }
internal void internal void
file_allocate_indents_as_needed(General_Memory *general, Editing_File *file, i32 min_last_index){ file_allocate_indents_as_needed(Heap *heap, Editing_File *file, i32 min_last_index){
i32 min_amount = min_last_index + 1; i32 min_amount = min_last_index + 1;
file_allocate_metadata_as_needed(general, file_allocate_metadata_as_needed(heap,
&file->state.buffer, (void**)&file->state.line_indents, &file->state.buffer, (void**)&file->state.line_indents,
&file->state.line_indent_max, min_amount, sizeof(f32)); &file->state.line_indent_max, min_amount, sizeof(f32));
} }
inline void inline void
file_allocate_wraps_as_needed(General_Memory *general, Editing_File *file){ file_allocate_wraps_as_needed(Heap *heap, Editing_File *file){
file_allocate_metadata_as_needed(general, file_allocate_metadata_as_needed(heap,
&file->state.buffer, (void**)&file->state.wrap_line_index, &file->state.buffer, (void**)&file->state.wrap_line_index,
&file->state.wrap_max, file->state.buffer.line_count + 1, sizeof(f32)); &file->state.wrap_max, file->state.buffer.line_count + 1, sizeof(f32));
} }
inline void inline void
file_allocate_wrap_positions_as_needed(General_Memory *general, Editing_File *file, i32 min_last_index){ file_allocate_wrap_positions_as_needed(Heap *heap, Editing_File *file, i32 min_last_index){
i32 min_amount = min_last_index + 1; i32 min_amount = min_last_index + 1;
file_allocate_metadata_as_needed(general, file_allocate_metadata_as_needed(heap,
&file->state.buffer, (void**)&file->state.wrap_positions, &file->state.buffer, (void**)&file->state.wrap_positions,
&file->state.wrap_position_max, min_amount, sizeof(f32)); &file->state.wrap_position_max, min_amount, sizeof(f32));
} }
@ -602,7 +593,7 @@ file_allocate_wrap_positions_as_needed(General_Memory *general, Editing_File *fi
internal void internal void
file_create_from_string(System_Functions *system, Models *models, Editing_File *file, String val, u32 flags){ file_create_from_string(System_Functions *system, Models *models, Editing_File *file, String val, u32 flags){
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
Partition *part = &models->mem.part; Partition *part = &models->mem.part;
Open_File_Hook_Function *hook_open_file = models->hook_open_file; Open_File_Hook_Function *hook_open_file = models->hook_open_file;
Application_Links *app_links = &models->app_links; Application_Links *app_links = &models->app_links;
@ -615,7 +606,7 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File *
if (page_size < KB(4)){ if (page_size < KB(4)){
page_size = KB(4); page_size = KB(4);
} }
void *data = general_memory_allocate(general, page_size); void *data = heap_allocate(heap, page_size);
buffer_init_provide_page(&init, data, page_size); buffer_init_provide_page(&init, data, page_size);
} }
@ -635,9 +626,9 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File *
Assert(font.valid); Assert(font.valid);
{ {
file_measure_starts(general, &file->state.buffer); file_measure_starts(heap, &file->state.buffer);
file_allocate_character_starts_as_needed(general, file); file_allocate_character_starts_as_needed(heap, file);
buffer_measure_character_starts(system, font, &file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white); buffer_measure_character_starts(system, font, &file->state.buffer, file->state.character_starts, 0, file->settings.virtual_white);
file_measure_wraps(system, &models->mem, file, font); file_measure_wraps(system, &models->mem, file, font);
@ -649,24 +640,24 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File *
// TODO(allen): Redo undo system (if you don't mind the pun) // TODO(allen): Redo undo system (if you don't mind the pun)
i32 request_size = KB(64); i32 request_size = KB(64);
file->state.undo.undo.max = request_size; file->state.undo.undo.max = request_size;
file->state.undo.undo.strings = (u8*)general_memory_allocate(general, request_size); file->state.undo.undo.strings = (u8*)heap_allocate(heap, request_size);
file->state.undo.undo.edit_max = request_size / sizeof(Edit_Step); file->state.undo.undo.edit_max = request_size/sizeof(Edit_Step);
file->state.undo.undo.edits = (Edit_Step*)general_memory_allocate(general, request_size); file->state.undo.undo.edits = (Edit_Step*)heap_allocate(heap, request_size);
file->state.undo.redo.max = request_size; file->state.undo.redo.max = request_size;
file->state.undo.redo.strings = (u8*)general_memory_allocate(general, request_size); file->state.undo.redo.strings = (u8*)heap_allocate(heap, request_size);
file->state.undo.redo.edit_max = request_size / sizeof(Edit_Step); file->state.undo.redo.edit_max = request_size/sizeof(Edit_Step);
file->state.undo.redo.edits = (Edit_Step*)general_memory_allocate(general, request_size); file->state.undo.redo.edits = (Edit_Step*)heap_allocate(heap, request_size);
file->state.undo.history.max = request_size; file->state.undo.history.max = request_size;
file->state.undo.history.strings = (u8*)general_memory_allocate(general, request_size); file->state.undo.history.strings = (u8*)heap_allocate(heap, request_size);
file->state.undo.history.edit_max = request_size / sizeof(Edit_Step); file->state.undo.history.edit_max = request_size/sizeof(Edit_Step);
file->state.undo.history.edits = (Edit_Step*)general_memory_allocate(general, request_size); file->state.undo.history.edits = (Edit_Step*)heap_allocate(heap, request_size);
file->state.undo.children.max = request_size; file->state.undo.children.max = request_size;
file->state.undo.children.strings = (u8*)general_memory_allocate(general, request_size); file->state.undo.children.strings = (u8*)heap_allocate(heap, request_size);
file->state.undo.children.edit_max = request_size / sizeof(Buffer_Edit); file->state.undo.children.edit_max = request_size/sizeof(Buffer_Edit);
file->state.undo.children.edits = (Buffer_Edit*)general_memory_allocate(general, request_size); file->state.undo.children.edits = (Buffer_Edit*)heap_allocate(heap, request_size);
file->state.undo.history_block_count = 1; file->state.undo.history_block_count = 1;
file->state.undo.history_head_block = 0; file->state.undo.history_head_block = 0;
@ -680,42 +671,42 @@ file_create_from_string(System_Functions *system, Models *models, Editing_File *
} }
internal void internal void
file_free(System_Functions *system, Application_Links *app, General_Memory *general, Editing_File *file){ file_free(System_Functions *system, Application_Links *app, Heap *heap, Editing_File *file){
if (file->state.still_lexing){ if (file->state.still_lexing){
system->cancel_job(BACKGROUND_THREADS, file->state.lex_job); system->cancel_job(BACKGROUND_THREADS, file->state.lex_job);
if (file->state.swap_array.tokens){ if (file->state.swap_array.tokens){
general_memory_free(general, file->state.swap_array.tokens); heap_free(heap, file->state.swap_array.tokens);
file->state.swap_array.tokens = 0; file->state.swap_array.tokens = 0;
} }
} }
if (file->state.token_array.tokens){ if (file->state.token_array.tokens){
general_memory_free(general, file->state.token_array.tokens); heap_free(heap, file->state.token_array.tokens);
} }
clear_file_markers_state(app, general, &file->markers); clear_file_markers_state(app, heap, &file->markers);
Gap_Buffer *buffer = &file->state.buffer; Gap_Buffer *buffer = &file->state.buffer;
if (buffer->data){ if (buffer->data){
general_memory_free(general, buffer->data); heap_free(heap, buffer->data);
general_memory_free(general, buffer->line_starts); heap_free(heap, buffer->line_starts);
} }
general_memory_free(general, file->state.wrap_line_index); heap_free(heap, file->state.wrap_line_index);
general_memory_free(general, file->state.character_starts); heap_free(heap, file->state.character_starts);
general_memory_free(general, file->state.line_indents); heap_free(heap, file->state.line_indents);
if (file->state.undo.undo.edits){ if (file->state.undo.undo.edits){
general_memory_free(general, file->state.undo.undo.strings); heap_free(heap, file->state.undo.undo.strings);
general_memory_free(general, file->state.undo.undo.edits); heap_free(heap, file->state.undo.undo.edits);
general_memory_free(general, file->state.undo.redo.strings); heap_free(heap, file->state.undo.redo.strings);
general_memory_free(general, file->state.undo.redo.edits); heap_free(heap, file->state.undo.redo.edits);
general_memory_free(general, file->state.undo.history.strings); heap_free(heap, file->state.undo.history.strings);
general_memory_free(general, file->state.undo.history.edits); heap_free(heap, file->state.undo.history.edits);
general_memory_free(general, file->state.undo.children.strings); heap_free(heap, file->state.undo.children.strings);
general_memory_free(general, file->state.undo.children.edits); heap_free(heap, file->state.undo.children.edits);
} }
} }

View File

@ -48,7 +48,7 @@ struct Marker_Array{
u32 max; u32 max;
}; };
#define MarkerArrayBase(a) (Marker*)((u8*)(a) + sizeof(Marker_Array) + ((Marker_Array*)(a))->rounded_user_data_size) #define MarkerArrayBase(a) (Marker*)((u8*)(a) + sizeof(Marker_Array))
struct Editing_File_Markers{ struct Editing_File_Markers{
Marker_Array sentinel; Marker_Array sentinel;
@ -128,7 +128,7 @@ struct Editing_File{
b32 is_loading; b32 is_loading;
b32 is_dummy; b32 is_dummy;
Editing_File_State state; Editing_File_State state;
Dynamic_Variable_Block dynamic_vars; Dynamic_Workspace dynamic_workspace;
Lifetime_Object *lifetime_object; Lifetime_Object *lifetime_object;
Editing_File_Markers markers; Editing_File_Markers markers;
Editing_File_Name base_name; Editing_File_Name base_name;

View File

@ -12,7 +12,7 @@
internal internal
Job_Callback_Sig(job_full_lex){ Job_Callback_Sig(job_full_lex){
Editing_File *file = (Editing_File*)data[0]; Editing_File *file = (Editing_File*)data[0];
General_Memory *general = (General_Memory*)data[1]; Heap *heap = (Heap*)data[1];
Models *models = (Models*)data[2]; Models *models = (Models*)data[2];
Parse_Context parse_context = parse_context_get(&models->parse_context_memory, file->settings.parse_context_id, memory->data, memory->size); Parse_Context parse_context = parse_context_get(&models->parse_context_memory, file->settings.parse_context_id, memory->data, memory->size);
@ -108,7 +108,7 @@ Job_Callback_Sig(job_full_lex){
system->acquire_lock(FRAME_LOCK); system->acquire_lock(FRAME_LOCK);
{ {
Assert(file->state.swap_array.tokens == 0); Assert(file->state.swap_array.tokens == 0);
file->state.swap_array.tokens = (Cpp_Token*)general_memory_allocate(general, new_max*sizeof(Cpp_Token)); file->state.swap_array.tokens = heap_array(heap, Cpp_Token, new_max);
} }
system->release_lock(FRAME_LOCK); system->release_lock(FRAME_LOCK);
@ -123,7 +123,7 @@ Job_Callback_Sig(job_full_lex){
file_token_array->count = tokens.count; file_token_array->count = tokens.count;
file_token_array->max_count = new_max; file_token_array->max_count = new_max;
if (file_token_array->tokens){ if (file_token_array->tokens){
general_memory_free(general, file_token_array->tokens); heap_free(heap, file_token_array->tokens);
} }
file_token_array->tokens = file->state.swap_array.tokens; file_token_array->tokens = file->state.swap_array.tokens;
file->state.swap_array.tokens = 0; file->state.swap_array.tokens = 0;
@ -138,17 +138,17 @@ Job_Callback_Sig(job_full_lex){
} }
internal void internal void
file_kill_tokens(System_Functions *system, General_Memory *general, Editing_File *file){ file_kill_tokens(System_Functions *system, Heap *heap, Editing_File *file){
file->settings.tokens_exist = 0; file->settings.tokens_exist = 0;
if (file->state.still_lexing){ if (file->state.still_lexing){
system->cancel_job(BACKGROUND_THREADS, file->state.lex_job); system->cancel_job(BACKGROUND_THREADS, file->state.lex_job);
if (file->state.swap_array.tokens){ if (file->state.swap_array.tokens){
general_memory_free(general, file->state.swap_array.tokens); heap_free(heap, file->state.swap_array.tokens);
file->state.swap_array.tokens = 0; file->state.swap_array.tokens = 0;
} }
} }
if (file->state.token_array.tokens){ if (file->state.token_array.tokens){
general_memory_free(general, file->state.token_array.tokens); heap_free(heap, file->state.token_array.tokens);
} }
file->state.tokens_complete = 0; file->state.tokens_complete = 0;
file->state.token_array = null_cpp_token_array; file->state.token_array = null_cpp_token_array;
@ -156,7 +156,7 @@ file_kill_tokens(System_Functions *system, General_Memory *general, Editing_File
internal void internal void
file_first_lex_parallel(System_Functions *system, Models *models, Editing_File *file){ file_first_lex_parallel(System_Functions *system, Models *models, Editing_File *file){
General_Memory *general = &models->mem.general; Heap *heap = &models->mem.heap;
file->settings.tokens_exist = true; file->settings.tokens_exist = true;
if (file->is_loading == 0 && file->state.still_lexing == 0){ if (file->is_loading == 0 && file->state.still_lexing == 0){
@ -168,7 +168,7 @@ file_first_lex_parallel(System_Functions *system, Models *models, Editing_File *
Job_Data job; Job_Data job;
job.callback = job_full_lex; job.callback = job_full_lex;
job.data[0] = file; job.data[0] = file;
job.data[1] = general; job.data[1] = heap;
job.data[2] = models; job.data[2] = models;
file->state.lex_job = system->post_job(BACKGROUND_THREADS, job); file->state.lex_job = system->post_job(BACKGROUND_THREADS, job);
} }
@ -178,7 +178,7 @@ internal void
file_first_lex_serial(Models *models, Editing_File *file){ file_first_lex_serial(Models *models, Editing_File *file){
Mem_Options *mem = &models->mem; Mem_Options *mem = &models->mem;
Partition *part = &mem->part; Partition *part = &mem->part;
General_Memory *general = &mem->general; Heap *heap = &mem->heap;
file->settings.tokens_exist = true; file->settings.tokens_exist = true;
Assert(!file->state.still_lexing); Assert(!file->state.still_lexing);
@ -238,14 +238,15 @@ file_first_lex_serial(Models *models, Editing_File *file){
case LexResult_NeedTokenMemory: case LexResult_NeedTokenMemory:
{ {
u32 new_max = l_round_up_u32(swap_array->count + new_tokens.count + 1, KB(1)); u32 new_max = l_round_up_u32(swap_array->count + new_tokens.count + 1, KB(1));
u32 new_mem_max = new_max*sizeof(Cpp_Token);
u32 old_mem_count = swap_array->count*sizeof(Cpp_Token);
if (swap_array->tokens == 0){ if (swap_array->tokens == 0){
swap_array->tokens = (Cpp_Token*)general_memory_allocate(general, new_mem_max); swap_array->tokens = heap_array(heap, Cpp_Token, new_max);
} }
else{ else{
swap_array->tokens = (Cpp_Token*) u32 old_count = swap_array->count;
general_memory_reallocate(general, swap_array->tokens, old_mem_count, new_mem_max); Cpp_Token *new_tokens = heap_array(heap, Cpp_Token, new_max);
memcpy(new_tokens, swap_array->tokens, sizeof(*new_tokens)*old_count);
heap_free(heap, swap_array->tokens);
swap_array->tokens = new_tokens;
} }
swap_array->max_count = new_max; swap_array->max_count = new_max;
@ -267,7 +268,7 @@ file_first_lex_serial(Models *models, Editing_File *file){
token_array->count = swap_array->count; token_array->count = swap_array->count;
token_array->max_count = swap_array->max_count; token_array->max_count = swap_array->max_count;
if (token_array->tokens != 0){ if (token_array->tokens != 0){
general_memory_free(general, token_array->tokens); heap_free(heap, token_array->tokens);
} }
token_array->tokens = swap_array->tokens; token_array->tokens = swap_array->tokens;
@ -288,7 +289,7 @@ file_first_lex_serial(Models *models, Editing_File *file){
internal b32 internal b32
file_relex_parallel(System_Functions *system, Models *models, Editing_File *file, i32 start_i, i32 end_i, i32 shift_amount){ file_relex_parallel(System_Functions *system, Models *models, Editing_File *file, i32 start_i, i32 end_i, i32 shift_amount){
Mem_Options *mem = &models->mem; Mem_Options *mem = &models->mem;
General_Memory *general = &mem->general; Heap *heap = &mem->heap;
Partition *part = &mem->part; Partition *part = &mem->part;
if (file->state.token_array.tokens == 0){ if (file->state.token_array.tokens == 0){
@ -372,7 +373,9 @@ file_relex_parallel(System_Functions *system, Models *models, Editing_File *file
i32 new_count = cpp_relex_get_new_count(&state, array->count, &relex_array); i32 new_count = cpp_relex_get_new_count(&state, array->count, &relex_array);
if (new_count > array->max_count){ if (new_count > array->max_count){
i32 new_max = l_round_up_i32(new_count, KB(1)); i32 new_max = l_round_up_i32(new_count, KB(1));
void *memory = general_memory_reallocate(general, array->tokens, array->count*sizeof(Cpp_Token), new_max*sizeof(Cpp_Token)); void *memory = heap_allocate(heap, new_max*sizeof(Cpp_Token));
memcpy(memory, array->tokens, array->count*sizeof(Cpp_Token));
heap_free(heap, array->tokens);
array->tokens = (Cpp_Token*)memory; array->tokens = (Cpp_Token*)memory;
array->max_count = new_max; array->max_count = new_max;
} }
@ -412,7 +415,7 @@ file_relex_parallel(System_Functions *system, Models *models, Editing_File *file
Job_Data job; Job_Data job;
job.callback = job_full_lex; job.callback = job_full_lex;
job.data[0] = file; job.data[0] = file;
job.data[1] = general; job.data[1] = heap;
job.data[2] = models; job.data[2] = models;
file->state.lex_job = system->post_job(BACKGROUND_THREADS, job); file->state.lex_job = system->post_job(BACKGROUND_THREADS, job);
result = false; result = false;
@ -424,7 +427,7 @@ file_relex_parallel(System_Functions *system, Models *models, Editing_File *file
internal b32 internal b32
file_relex_serial(Models *models, Editing_File *file, i32 start_i, i32 end_i, i32 shift_amount){ file_relex_serial(Models *models, Editing_File *file, i32 start_i, i32 end_i, i32 shift_amount){
Mem_Options *mem = &models->mem; Mem_Options *mem = &models->mem;
General_Memory *general = &mem->general; Heap *heap = &mem->heap;
Partition *part = &mem->part; Partition *part = &mem->part;
if (file->state.token_array.tokens == 0){ if (file->state.token_array.tokens == 0){
@ -496,7 +499,10 @@ file_relex_serial(Models *models, Editing_File *file, i32 start_i, i32 end_i, i3
i32 new_count = cpp_relex_get_new_count(&state, array->count, &relex_array); i32 new_count = cpp_relex_get_new_count(&state, array->count, &relex_array);
if (new_count > array->max_count){ if (new_count > array->max_count){
i32 new_max = l_round_up_i32(new_count, KB(1)); i32 new_max = l_round_up_i32(new_count, KB(1));
array->tokens = (Cpp_Token*)general_memory_reallocate(general, array->tokens, array->count*sizeof(Cpp_Token), new_max*sizeof(Cpp_Token)); Cpp_Token *new_tokens = heap_array(heap, Cpp_Token, new_max);
memcpy(new_tokens, array->tokens, array->count*sizeof(Cpp_Token));
heap_free(heap, array->tokens);
array->tokens = new_tokens;
array->max_count = new_max; array->max_count = new_max;
} }

View File

@ -28,7 +28,7 @@ parse_context_valid_id(Parse_Context_Memory *parse_mem, Parse_Context_ID id){
} }
internal Parse_Context_ID internal Parse_Context_ID
parse_context_add(Parse_Context_Memory *parse_mem, General_Memory *general, Parser_String_And_Type *kw_sats, u32 kw_count, Parser_String_And_Type *pp_sats, u32 pp_count){ parse_context_add(Parse_Context_Memory *parse_mem, Heap *heap, Parser_String_And_Type *kw_sats, u32 kw_count, Parser_String_And_Type *pp_sats, u32 pp_count){
Stored_Parse_Context_Slot *slot = 0; Stored_Parse_Context_Slot *slot = 0;
if (parse_mem->free_sentinel.next != &parse_mem->free_sentinel){ if (parse_mem->free_sentinel.next != &parse_mem->free_sentinel){
slot = parse_mem->free_sentinel.next; slot = parse_mem->free_sentinel.next;
@ -45,7 +45,7 @@ parse_context_add(Parse_Context_Memory *parse_mem, General_Memory *general, Pars
umem pp_memsize = cpp_get_table_memory_size_string_lengths(&pp_sats->length, stride, pp_count); umem pp_memsize = cpp_get_table_memory_size_string_lengths(&pp_sats->length, stride, pp_count);
umem memsize = kw_memsize + pp_memsize + sizeof(Stored_Parse_Context); umem memsize = kw_memsize + pp_memsize + sizeof(Stored_Parse_Context);
void *mem = general_memory_allocate(general, (i32)memsize); void *mem = heap_allocate(heap, (i32)memsize);
Stored_Parse_Context *parse_context = (Stored_Parse_Context*)mem; Stored_Parse_Context *parse_context = (Stored_Parse_Context*)mem;
u8 *kw_mem = (u8*)(parse_context+1); u8 *kw_mem = (u8*)(parse_context+1);
@ -70,7 +70,7 @@ parse_context_add(Parse_Context_Memory *parse_mem, General_Memory *general, Pars
} }
internal u32 internal u32
parse_context_add_default(Parse_Context_Memory *parse_mem, General_Memory *general){ parse_context_add_default(Parse_Context_Memory *parse_mem, Heap *heap){
Stored_Parse_Context_Slot *slot = 0; Stored_Parse_Context_Slot *slot = 0;
if (parse_mem->free_sentinel.next != &parse_mem->free_sentinel){ if (parse_mem->free_sentinel.next != &parse_mem->free_sentinel){
slot = parse_mem->free_sentinel.next; slot = parse_mem->free_sentinel.next;
@ -86,7 +86,7 @@ parse_context_add_default(Parse_Context_Memory *parse_mem, General_Memory *gener
umem pp_memsize = cpp_get_table_memory_size_default(CPP_TABLE_PREPROCESSOR_DIRECTIVES); umem pp_memsize = cpp_get_table_memory_size_default(CPP_TABLE_PREPROCESSOR_DIRECTIVES);
umem memsize = kw_memsize + pp_memsize + sizeof(Stored_Parse_Context); umem memsize = kw_memsize + pp_memsize + sizeof(Stored_Parse_Context);
void *mem = general_memory_allocate(general, (i32)(memsize)); void *mem = heap_allocate(heap, (i32)(memsize));
Stored_Parse_Context *parse_context = (Stored_Parse_Context*)mem; Stored_Parse_Context *parse_context = (Stored_Parse_Context*)mem;
u8 *kw_mem = (u8*)(parse_context+1); u8 *kw_mem = (u8*)(parse_context+1);

View File

@ -10,54 +10,62 @@
// TOP // TOP
internal void internal void
undo_stack_grow_string(General_Memory *general, Edit_Stack *stack, i32 extra_size){ undo_stack_grow_string(Heap *heap, Edit_Stack *stack, i32 extra_size){
i32 old_max = stack->max; i32 old_max = stack->max;
u8 *old_str = stack->strings; u8 *old_str = stack->strings;
i32 new_max = old_max*2 + extra_size; i32 new_max = old_max*2 + extra_size;
u8 *new_str = (u8*)general_memory_reallocate(general, old_str, old_max, new_max); u8 *new_str = heap_array(heap, u8, new_max);
memcpy(new_str, old_str, sizeof(*new_str)*old_max);
heap_free(heap, old_str);
stack->strings = new_str; stack->strings = new_str;
stack->max = new_max; stack->max = new_max;
} }
internal void internal void
undo_stack_grow_edits(General_Memory *general, Edit_Stack *stack){ undo_stack_grow_edits(Heap *heap, Edit_Stack *stack){
i32 old_max = stack->edit_max; i32 old_max = stack->edit_max;
Edit_Step *old_eds = stack->edits; Edit_Step *old_eds = stack->edits;
i32 new_max = old_max*2 + 2; i32 new_max = old_max*2 + 2;
Edit_Step *new_eds = (Edit_Step*)general_memory_reallocate(general, old_eds, old_max*sizeof(Edit_Step), new_max*sizeof(Edit_Step)); Edit_Step *new_eds = heap_array(heap, Edit_Step, new_max);
memcpy(new_eds, old_eds, sizeof(*new_eds)*old_max);
heap_free(heap, old_eds);
stack->edits = new_eds; stack->edits = new_eds;
stack->edit_max = new_max; stack->edit_max = new_max;
} }
internal void internal void
child_stack_grow_string(General_Memory *general, Small_Edit_Stack *stack, i32 extra_size){ child_stack_grow_string(Heap *heap, Small_Edit_Stack *stack, i32 extra_size){
i32 old_max = stack->max; i32 old_max = stack->max;
u8 *old_str = stack->strings; u8 *old_str = stack->strings;
i32 new_max = old_max*2 + extra_size; i32 new_max = old_max*2 + extra_size;
u8 *new_str = (u8*)general_memory_reallocate(general, old_str, old_max, new_max); u8 *new_str = heap_array(heap, u8, new_max);
memcpy(new_str, old_str, sizeof(*new_str)*old_max);
heap_free(heap, old_str);
stack->strings = new_str; stack->strings = new_str;
stack->max = new_max; stack->max = new_max;
} }
internal void internal void
child_stack_grow_edits(General_Memory *general, Small_Edit_Stack *stack, i32 amount){ child_stack_grow_edits(Heap *heap, Small_Edit_Stack *stack, i32 amount){
i32 old_max = stack->edit_max; i32 old_max = stack->edit_max;
Buffer_Edit *old_eds = stack->edits; Buffer_Edit *old_eds = stack->edits;
i32 new_max = old_max*2 + amount; i32 new_max = old_max*2 + amount;
Buffer_Edit *new_eds = (Buffer_Edit*)general_memory_reallocate(general, old_eds, old_max*sizeof(Buffer_Edit), new_max*sizeof(Buffer_Edit)); Buffer_Edit *new_eds = heap_array(heap, Buffer_Edit, new_max);
memcpy(new_eds, old_eds, sizeof(*new_eds)*new_max);
heap_free(heap, old_eds);
stack->edits = new_eds; stack->edits = new_eds;
stack->edit_max = new_max; stack->edit_max = new_max;
} }
internal i32 internal i32
undo_children_push(General_Memory *general, Small_Edit_Stack *children, Buffer_Edit *edits, i32 edit_count, u8 *strings, i32 string_size){ undo_children_push(Heap *heap, Small_Edit_Stack *children, Buffer_Edit *edits, i32 edit_count, u8 *strings, i32 string_size){
i32 result = children->edit_count; i32 result = children->edit_count;
if (children->edit_count + edit_count > children->edit_max){ if (children->edit_count + edit_count > children->edit_max){
child_stack_grow_edits(general, children, edit_count); child_stack_grow_edits(heap, children, edit_count);
} }
if (children->size + string_size > children->max){ if (children->size + string_size > children->max){
child_stack_grow_string(general, children, string_size); child_stack_grow_string(heap, children, string_size);
} }
memcpy(children->edits + children->edit_count, edits, edit_count*sizeof(Buffer_Edit)); memcpy(children->edits + children->edit_count, edits, edit_count*sizeof(Buffer_Edit));
@ -76,7 +84,7 @@ undo_children_push(General_Memory *general, Small_Edit_Stack *children, Buffer_E
} }
internal Edit_Step* internal Edit_Step*
file_post_undo(General_Memory *general, Editing_File *file, Edit_Step step, b32 do_merge, b32 can_merge){ file_post_undo(Heap *heap, Editing_File *file, Edit_Step step, b32 do_merge, b32 can_merge){
if (step.type == ED_NORMAL){ if (step.type == ED_NORMAL){
file->state.undo.redo.size = 0; file->state.undo.redo.size = 0;
file->state.undo.redo.edit_count = 0; file->state.undo.redo.edit_count = 0;
@ -87,7 +95,7 @@ file_post_undo(General_Memory *general, Editing_File *file, Edit_Step step, b32
if (step.child_count == 0){ if (step.child_count == 0){
if (step.edit.end - step.edit.start + undo->size > undo->max){ if (step.edit.end - step.edit.start + undo->size > undo->max){
undo_stack_grow_string(general, undo, step.edit.end - step.edit.start); undo_stack_grow_string(heap, undo, step.edit.end - step.edit.start);
} }
Buffer_Edit inv; Buffer_Edit inv;
@ -115,7 +123,7 @@ file_post_undo(General_Memory *general, Editing_File *file, Edit_Step step, b32
} }
else{ else{
if (undo->edit_count == undo->edit_max){ if (undo->edit_count == undo->edit_max){
undo_stack_grow_edits(general, undo); undo_stack_grow_edits(heap, undo);
} }
result = undo->edits + (undo->edit_count++); result = undo->edits + (undo->edit_count++);
@ -132,7 +140,7 @@ file_post_undo(General_Memory *general, Editing_File *file, Edit_Step step, b32
inv_step.inverse_child_count = step.child_count; inv_step.inverse_child_count = step.child_count;
if (undo->edit_count == undo->edit_max){ if (undo->edit_count == undo->edit_max){
undo_stack_grow_edits(general, undo); undo_stack_grow_edits(heap, undo);
} }
result = undo->edits + (undo->edit_count++); result = undo->edits + (undo->edit_count++);
*result = inv_step; *result = inv_step;
@ -151,12 +159,12 @@ undo_stack_pop(Edit_Stack *stack){
} }
internal void internal void
file_post_redo(General_Memory *general, Editing_File *file, Edit_Step step){ file_post_redo(Heap *heap, Editing_File *file, Edit_Step step){
Edit_Stack *redo = &file->state.undo.redo; Edit_Stack *redo = &file->state.undo.redo;
if (step.child_count == 0){ if (step.child_count == 0){
if (step.edit.end - step.edit.start + redo->size > redo->max){ if (step.edit.end - step.edit.start + redo->size > redo->max){
undo_stack_grow_string(general, redo, step.edit.end - step.edit.start); undo_stack_grow_string(heap, redo, step.edit.end - step.edit.start);
} }
Buffer_Edit inv; Buffer_Edit inv;
@ -167,7 +175,7 @@ file_post_redo(General_Memory *general, Editing_File *file, Edit_Step step){
inv_step.type = ED_REDO; inv_step.type = ED_REDO;
if (redo->edit_count == redo->edit_max){ if (redo->edit_count == redo->edit_max){
undo_stack_grow_edits(general, redo); undo_stack_grow_edits(heap, redo);
} }
redo->edits[redo->edit_count++] = inv_step; redo->edits[redo->edit_count++] = inv_step;
} }
@ -181,7 +189,7 @@ file_post_redo(General_Memory *general, Editing_File *file, Edit_Step step){
inv_step.inverse_child_count = step.child_count; inv_step.inverse_child_count = step.child_count;
if (redo->edit_count == redo->edit_max){ if (redo->edit_count == redo->edit_max){
undo_stack_grow_edits(general, redo); undo_stack_grow_edits(heap, redo);
} }
redo->edits[redo->edit_count++] = inv_step; redo->edits[redo->edit_count++] = inv_step;
} }
@ -210,7 +218,7 @@ file_unpost_history_block(Editing_File *file){
} }
internal Edit_Step* internal Edit_Step*
file_post_history(General_Memory *general, Editing_File *file, Edit_Step step, b32 do_merge, b32 can_merge){ file_post_history(Heap *heap, Editing_File *file, Edit_Step step, b32 do_merge, b32 can_merge){
Edit_Stack *history = &file->state.undo.history; Edit_Stack *history = &file->state.undo.history;
Edit_Step *result = 0; Edit_Step *result = 0;
@ -224,7 +232,7 @@ file_post_history(General_Memory *general, Editing_File *file, Edit_Step step, b
if (step.child_count == 0){ if (step.child_count == 0){
if (step.edit.end - step.edit.start + history->size > history->max){ if (step.edit.end - step.edit.start + history->size > history->max){
undo_stack_grow_string(general, history, step.edit.end - step.edit.start); undo_stack_grow_string(heap, history, step.edit.end - step.edit.start);
} }
Buffer_Edit inv; Buffer_Edit inv;
@ -252,7 +260,7 @@ file_post_history(General_Memory *general, Editing_File *file, Edit_Step step, b
} }
else{ else{
if (history->edit_count == history->edit_max){ if (history->edit_count == history->edit_max){
undo_stack_grow_edits(general, history); undo_stack_grow_edits(heap, history);
} }
result = history->edits + (history->edit_count++); result = history->edits + (history->edit_count++);
} }
@ -269,7 +277,7 @@ file_post_history(General_Memory *general, Editing_File *file, Edit_Step step, b
inv_step.child_count = step.inverse_child_count; inv_step.child_count = step.inverse_child_count;
if (history->edit_count == history->edit_max){ if (history->edit_count == history->edit_max){
undo_stack_grow_edits(general, history); undo_stack_grow_edits(heap, history);
} }
result = history->edits + (history->edit_count++); result = history->edits + (history->edit_count++);
*result = inv_step; *result = inv_step;
@ -281,7 +289,7 @@ file_post_history(General_Memory *general, Editing_File *file, Edit_Step step, b
internal void internal void
file_update_history_before_edit(Mem_Options *mem, Editing_File *file, Edit_Step step, u8 *str, History_Mode history_mode){ file_update_history_before_edit(Mem_Options *mem, Editing_File *file, Edit_Step step, u8 *str, History_Mode history_mode){
if (!file->state.undo.undo.edits) return; if (!file->state.undo.undo.edits) return;
General_Memory *general = &mem->general; Heap *heap = &mem->heap;
b32 can_merge = 0, do_merge = 0; b32 can_merge = 0, do_merge = 0;
switch (step.type){ switch (step.type){
@ -295,16 +303,16 @@ file_update_history_before_edit(Mem_Options *mem, Editing_File *file, Edit_Step
} }
if (history_mode != hist_forward){ if (history_mode != hist_forward){
file_post_history(general, file, step, do_merge, can_merge); file_post_history(heap, file, step, do_merge, can_merge);
} }
file_post_undo(general, file, step, do_merge, can_merge); file_post_undo(heap, file, step, do_merge, can_merge);
}break; }break;
case ED_REVERSE_NORMAL: case ED_REVERSE_NORMAL:
{ {
if (history_mode != hist_forward){ if (history_mode != hist_forward){
file_post_history(general, file, step, do_merge, can_merge); file_post_history(heap, file, step, do_merge, can_merge);
} }
undo_stack_pop(&file->state.undo.undo); undo_stack_pop(&file->state.undo.undo);
@ -349,10 +357,10 @@ file_update_history_before_edit(Mem_Options *mem, Editing_File *file, Edit_Step
++redo_end; ++redo_end;
if (file->state.undo.redo.edit_count + steps_of_redo > file->state.undo.redo.edit_max) if (file->state.undo.redo.edit_count + steps_of_redo > file->state.undo.redo.edit_max)
undo_stack_grow_edits(general, &file->state.undo.redo); undo_stack_grow_edits(heap, &file->state.undo.redo);
if (file->state.undo.redo.size + strings_of_redo > file->state.undo.redo.max) if (file->state.undo.redo.size + strings_of_redo > file->state.undo.redo.max)
undo_stack_grow_string(general, &file->state.undo.redo, strings_of_redo); undo_stack_grow_string(heap, &file->state.undo.redo, strings_of_redo);
u8 *str_src = file->state.undo.history.strings + redo_end->edit.str_start; u8 *str_src = file->state.undo.history.strings + redo_end->edit.str_start;
u8 *str_dest_base = file->state.undo.redo.strings; u8 *str_dest_base = file->state.undo.redo.strings;
@ -398,9 +406,9 @@ file_update_history_before_edit(Mem_Options *mem, Editing_File *file, Edit_Step
case ED_UNDO: case ED_UNDO:
{ {
if (history_mode != hist_forward){ if (history_mode != hist_forward){
file_post_history(general, file, step, do_merge, can_merge); file_post_history(heap, file, step, do_merge, can_merge);
} }
file_post_redo(general, file, step); file_post_redo(heap, file, step);
undo_stack_pop(&file->state.undo.undo); undo_stack_pop(&file->state.undo.undo);
}break; }break;
@ -410,10 +418,10 @@ file_update_history_before_edit(Mem_Options *mem, Editing_File *file, Edit_Step
if (step.edit.len == 1 && str && (can_merge || char_is_whitespace(*str))) do_merge = 1; if (step.edit.len == 1 && str && (can_merge || char_is_whitespace(*str))) do_merge = 1;
if (history_mode != hist_forward){ if (history_mode != hist_forward){
file_post_history(general, file, step, do_merge, can_merge); file_post_history(heap, file, step, do_merge, can_merge);
} }
file_post_undo(general, file, step, do_merge, can_merge); file_post_undo(heap, file, step, do_merge, can_merge);
undo_stack_pop(&file->state.undo.redo); undo_stack_pop(&file->state.undo.redo);
}break; }break;
} }

View File

@ -20,7 +20,7 @@ view_get_map(View *view){
} }
internal View_And_ID internal View_And_ID
live_set_alloc_view(General_Memory *general, Lifetime_Allocator *lifetime_allocator, Live_Views *live_set, Panel *panel){ live_set_alloc_view(Heap *heap, Lifetime_Allocator *lifetime_allocator, Live_Views *live_set, Panel *panel){
Assert(live_set->count < live_set->max); Assert(live_set->count < live_set->max);
++live_set->count; ++live_set->count;
@ -39,19 +39,19 @@ live_set_alloc_view(General_Memory *general, Lifetime_Allocator *lifetime_alloca
init_query_set(&result.view->transient.query_set); init_query_set(&result.view->transient.query_set);
dynamic_variables_block_init(general, &result.view->transient.dynamic_vars); dynamic_workspace_init(heap, &result.view->transient.dynamic_workspace);
result.view->transient.lifetime_object = lifetime_alloc_object(general, lifetime_allocator, LifetimeObject_View, result.view); result.view->transient.lifetime_object = lifetime_alloc_object(heap, lifetime_allocator, LifetimeObject_View, result.view);
return(result); return(result);
} }
inline void inline void
live_set_free_view(General_Memory *general, Lifetime_Allocator *lifetime_allocator, Live_Views *live_set, View *view){ live_set_free_view(Heap *heap, Lifetime_Allocator *lifetime_allocator, Live_Views *live_set, View *view){
Assert(live_set->count > 0); Assert(live_set->count > 0);
--live_set->count; --live_set->count;
if (view->transient.ui_control.items != 0){ if (view->transient.ui_control.items != 0){
general_memory_free(general, view->transient.ui_control.items); heap_free(heap, view->transient.ui_control.items);
} }
view->transient.next = live_set->free_sentinel.transient.next; view->transient.next = live_set->free_sentinel.transient.next;
@ -60,8 +60,8 @@ live_set_free_view(General_Memory *general, Lifetime_Allocator *lifetime_allocat
view->transient.next->transient.prev = view; view->transient.next->transient.prev = view;
view->transient.in_use = false; view->transient.in_use = false;
dynamic_variables_block_free(general, &view->transient.dynamic_vars); dynamic_workspace_free(heap, &view->transient.dynamic_workspace);
lifetime_free_object(general, lifetime_allocator, view->transient.lifetime_object); lifetime_free_object(heap, lifetime_allocator, view->transient.lifetime_object);
} }
//////////////////////////////// ////////////////////////////////

View File

@ -36,7 +36,7 @@ struct View_Transient{
b32 in_use; b32 in_use;
File_Viewing_Data file_data; File_Viewing_Data file_data;
Dynamic_Variable_Block dynamic_vars; Dynamic_Workspace dynamic_workspace;
Lifetime_Object *lifetime_object; Lifetime_Object *lifetime_object;
i32_Rect file_region_prev; i32_Rect file_region_prev;

View File

@ -66,11 +66,11 @@ working_set_extend_memory(Working_Set *working_set, Editing_File *new_space, i16
} }
internal Editing_File* internal Editing_File*
working_set_alloc_always(Working_Set *working_set, General_Memory *general, Lifetime_Allocator *lifetime_allocator){ working_set_alloc_always(Working_Set *working_set, Heap *heap, Lifetime_Allocator *lifetime_allocator){
Editing_File *result = 0; Editing_File *result = 0;
if (working_set->file_count == working_set->file_max && working_set->array_count < working_set->array_max){ if (working_set->file_count == working_set->file_max && working_set->array_count < working_set->array_max){
i16 new_count = (i16)clamp_top(working_set->file_max, max_i16); i16 new_count = (i16)clamp_top(working_set->file_max, max_i16);
Editing_File *new_chunk = gen_array(general, Editing_File, new_count); Editing_File *new_chunk = heap_array(heap, Editing_File, new_count);
working_set_extend_memory(working_set, new_chunk, new_count); working_set_extend_memory(working_set, new_chunk, new_count);
} }
@ -88,8 +88,8 @@ working_set_alloc_always(Working_Set *working_set, General_Memory *general, Life
result->settings.minimum_base_display_width = working_set->default_minimum_base_display_width; result->settings.minimum_base_display_width = working_set->default_minimum_base_display_width;
result->settings.wrap_indicator = WrapIndicator_Show_At_Wrap_Edge; result->settings.wrap_indicator = WrapIndicator_Show_At_Wrap_Edge;
init_file_markers_state(&result->markers); init_file_markers_state(&result->markers);
dynamic_variables_block_init(general, &result->dynamic_vars); dynamic_workspace_init(heap, &result->dynamic_workspace);
result->lifetime_object = lifetime_alloc_object(general, lifetime_allocator, LifetimeObject_File, result); result->lifetime_object = lifetime_alloc_object(heap, lifetime_allocator, LifetimeObject_File, result);
++working_set->file_count; ++working_set->file_count;
} }
@ -97,13 +97,13 @@ working_set_alloc_always(Working_Set *working_set, General_Memory *general, Life
} }
inline void inline void
working_set_free_file(General_Memory *general, Lifetime_Allocator *lifetime_allocator, Working_Set *working_set, Editing_File *file){ working_set_free_file(Heap *heap, Lifetime_Allocator *lifetime_allocator, Working_Set *working_set, Editing_File *file){
if (working_set->sync_check_iter == &file->node){ if (working_set->sync_check_iter == &file->node){
working_set->sync_check_iter = working_set->sync_check_iter->next; working_set->sync_check_iter = working_set->sync_check_iter->next;
} }
dynamic_variables_block_free(general, &file->dynamic_vars); dynamic_workspace_free(heap, &file->dynamic_workspace);
lifetime_free_object(general, lifetime_allocator, file->lifetime_object); lifetime_free_object(heap, lifetime_allocator, file->lifetime_object);
file->is_dummy = true; file->is_dummy = true;
dll_remove(&file->node); dll_remove(&file->node);
@ -149,7 +149,7 @@ working_set_get_active_file(Working_Set *working_set, i32 id){
} }
internal void internal void
working_set_init(Working_Set *working_set, Partition *partition, General_Memory *general){ working_set_init(Working_Set *working_set, Partition *partition, Heap *heap){
i16 init_count = 16; i16 init_count = 16;
i16 array_init_count = 256; i16 array_init_count = 256;
@ -178,7 +178,7 @@ working_set_init(Working_Set *working_set, Partition *partition, General_Memory
i32 item_size = sizeof(File_Name_Entry); i32 item_size = sizeof(File_Name_Entry);
i32 table_size = working_set->file_max; i32 table_size = working_set->file_max;
i32 mem_size = table_required_mem_size(table_size, item_size); i32 mem_size = table_required_mem_size(table_size, item_size);
void *mem = general_memory_allocate(general, mem_size); void *mem = heap_allocate(heap, mem_size);
memset(mem, 0, mem_size); memset(mem, 0, mem_size);
table_init_memory(&working_set->canon_table, mem, table_size, item_size); table_init_memory(&working_set->canon_table, mem, table_size, item_size);
} }
@ -188,23 +188,23 @@ working_set_init(Working_Set *working_set, Partition *partition, General_Memory
i32 item_size = sizeof(File_Name_Entry); i32 item_size = sizeof(File_Name_Entry);
i32 table_size = working_set->file_max; i32 table_size = working_set->file_max;
i32 mem_size = table_required_mem_size(table_size, item_size); i32 mem_size = table_required_mem_size(table_size, item_size);
void *mem = general_memory_allocate(general, mem_size); void *mem = heap_allocate(heap, mem_size);
memset(mem, 0, mem_size); memset(mem, 0, mem_size);
table_init_memory(&working_set->name_table, mem, table_size, item_size); table_init_memory(&working_set->name_table, mem, table_size, item_size);
} }
} }
inline void inline void
working_set__grow_if_needed(Table *table, General_Memory *general, void *arg, Hash_Function *hash_func, Compare_Function *comp_func){ working_set__grow_if_needed(Table *table, Heap *heap, void *arg, Hash_Function *hash_func, Compare_Function *comp_func){
if (table_at_capacity(table)){ if (table_at_capacity(table)){
Table btable = {0}; Table btable = {0};
i32 new_max = table->max * 2; i32 new_max = table->max * 2;
i32 mem_size = table_required_mem_size(new_max, table->item_size); i32 mem_size = table_required_mem_size(new_max, table->item_size);
void *mem = general_memory_allocate(general, mem_size); void *mem = heap_allocate(heap, mem_size);
table_init_memory(&btable, mem, new_max, table->item_size); table_init_memory(&btable, mem, new_max, table->item_size);
table_clear(&btable); table_clear(&btable);
table_rehash(table, &btable, 0, hash_func, comp_func); table_rehash(table, &btable, 0, hash_func, comp_func);
general_memory_free(general, table->hash_array); heap_free(heap, table->hash_array);
*table = btable; *table = btable;
} }
} }
@ -223,8 +223,8 @@ working_set_contains_basic(Working_Set *working_set, Table *table, String name){
} }
internal b32 internal b32
working_set_add_basic(General_Memory *general, Working_Set *working_set, Table *table, Editing_File *file, String name){ working_set_add_basic(Heap *heap, Working_Set *working_set, Table *table, Editing_File *file, String name){
working_set__grow_if_needed(table, general, 0, tbl_string_hash, tbl_string_compare); working_set__grow_if_needed(table, heap, 0, tbl_string_hash, tbl_string_compare);
File_Name_Entry entry; File_Name_Entry entry;
entry.name = name; entry.name = name;
@ -245,8 +245,8 @@ working_set_contains_canon(Working_Set *working_set, String name){
} }
internal b32 internal b32
working_set_canon_add(General_Memory *general, Working_Set *working_set, Editing_File *file, String name){ working_set_canon_add(Heap *heap, Working_Set *working_set, Editing_File *file, String name){
b32 result = working_set_add_basic(general,working_set, &working_set->canon_table, file, name); b32 result = working_set_add_basic(heap,working_set, &working_set->canon_table, file, name);
return(result); return(result);
} }
@ -262,8 +262,8 @@ working_set_contains_name(Working_Set *working_set, String name){
} }
internal b32 internal b32
working_set_add_name(General_Memory *general, Working_Set *working_set, Editing_File *file, String name){ working_set_add_name(Heap *heap, Working_Set *working_set, Editing_File *file, String name){
b32 result = working_set_add_basic(general, working_set, &working_set->name_table, file, name); b32 result = working_set_add_basic(heap, working_set, &working_set->name_table, file, name);
return(result); return(result);
} }
@ -316,7 +316,7 @@ touch_file(Working_Set *working_set, Editing_File *file){
// TODO(allen): Bring the clipboard fully to the custom side. // TODO(allen): Bring the clipboard fully to the custom side.
internal String* internal String*
working_set_next_clipboard_string(General_Memory *general, Working_Set *working, i32 str_size){ working_set_next_clipboard_string(Heap *heap, Working_Set *working, i32 str_size){
i32 clipboard_current = working->clipboard_current; i32 clipboard_current = working->clipboard_current;
if (working->clipboard_size == 0){ if (working->clipboard_size == 0){
clipboard_current = 0; clipboard_current = 0;
@ -334,12 +334,14 @@ working_set_next_clipboard_string(General_Memory *general, Working_Set *working,
String *result = &working->clipboards[clipboard_current]; String *result = &working->clipboards[clipboard_current];
working->clipboard_current = clipboard_current; working->clipboard_current = clipboard_current;
working->clipboard_rolling = clipboard_current; working->clipboard_rolling = clipboard_current;
char *new_str; char *new_str = 0;
if (result->str != 0){ if (result->str != 0){
new_str = (char*)general_memory_reallocate(general, result->str, result->size, str_size); new_str = heap_array(heap, char, str_size);
memcpy(new_str, result->str, result->size);
heap_free(heap, result->str);
} }
else{ else{
new_str = (char*)general_memory_allocate(general, str_size+1); new_str = (char*)heap_allocate(heap, str_size + 1);
} }
// TODO(allen): What if new_str == 0? // TODO(allen): What if new_str == 0?
*result = make_string_cap(new_str, 0, str_size); *result = make_string_cap(new_str, 0, str_size);
@ -397,7 +399,7 @@ get_canon_name(System_Functions *system, String filename,
} }
internal void internal void
buffer_bind_file(System_Functions *system, General_Memory *general, buffer_bind_file(System_Functions *system, Heap *heap,
Working_Set *working_set, Working_Set *working_set,
Editing_File *file, String canon_filename){ Editing_File *file, String canon_filename){
Assert(file->unique_name.name.size == 0); Assert(file->unique_name.name.size == 0);
@ -407,7 +409,7 @@ buffer_bind_file(System_Functions *system, General_Memory *general,
copy(&file->canon.name, canon_filename); copy(&file->canon.name, canon_filename);
terminate_with_null(&file->canon.name); terminate_with_null(&file->canon.name);
system->add_listener(file->canon.name.str); system->add_listener(file->canon.name.str);
if (!working_set_canon_add(general, working_set, file, file->canon.name)){ if (!working_set_canon_add(heap, working_set, file, file->canon.name)){
InvalidCodePath; InvalidCodePath;
} }
} }
@ -458,7 +460,7 @@ buffer_resolve_name_low_level(Working_Set *working_set, Editing_File_Name *name,
} }
internal void internal void
buffer_bind_name_low_level(General_Memory *general, Working_Set *working_set, Editing_File *file, String base_name, String name){ buffer_bind_name_low_level(Heap *heap, Working_Set *working_set, Editing_File *file, String base_name, String name){
Assert(file->base_name.name.size == 0); Assert(file->base_name.name.size == 0);
Assert(file->unique_name.name.size == 0); Assert(file->unique_name.name.size == 0);
@ -472,7 +474,7 @@ buffer_bind_name_low_level(General_Memory *general, Working_Set *working_set, Ed
file->unique_name.name = make_fixed_width_string(file->unique_name.name_); file->unique_name.name = make_fixed_width_string(file->unique_name.name_);
copy(&file->unique_name.name, new_name.name); copy(&file->unique_name.name, new_name.name);
if (!working_set_add_name(general, working_set, file, file->unique_name.name)){ if (!working_set_add_name(heap, working_set, file, file->unique_name.name)){
InvalidCodePath; InvalidCodePath;
} }
} }
@ -487,7 +489,7 @@ buffer_unbind_name_low_level(Working_Set *working_set, Editing_File *file){
} }
internal void internal void
buffer_bind_name(Models *models, General_Memory *general, Partition *scratch, buffer_bind_name(Models *models, Heap *heap, Partition *scratch,
Working_Set *working_set, Working_Set *working_set,
Editing_File *file, String base_name){ Editing_File *file, String base_name){
Temp_Memory temp = begin_temp_memory(scratch); Temp_Memory temp = begin_temp_memory(scratch);
@ -555,7 +557,7 @@ buffer_bind_name(Models *models, General_Memory *general, Partition *scratch,
Editing_File *file_ptr = conflict_file_ptrs[i]; Editing_File *file_ptr = conflict_file_ptrs[i];
Buffer_Name_Conflict_Entry *entry = &conflicts[i]; Buffer_Name_Conflict_Entry *entry = &conflicts[i];
String unique_name = make_string(entry->unique_name_in_out, entry->unique_name_len_in_out); String unique_name = make_string(entry->unique_name_in_out, entry->unique_name_len_in_out);
buffer_bind_name_low_level(general, working_set, file_ptr, base_name, unique_name); buffer_bind_name_low_level(heap, working_set, file_ptr, base_name, unique_name);
} }
end_temp_memory(temp); end_temp_memory(temp);
@ -576,12 +578,12 @@ open_file(System_Functions *system, Models *models, String filename){
Plat_Handle handle; Plat_Handle handle;
if (system->load_handle(canon_name.name.str, &handle)){ if (system->load_handle(canon_name.name.str, &handle)){
Mem_Options *mem = &models->mem; Mem_Options *mem = &models->mem;
General_Memory *general = &mem->general; Heap *heap = &mem->heap;
Partition *part = &mem->part; Partition *part = &mem->part;
file = working_set_alloc_always(working_set, general, &models->lifetime_allocator); file = working_set_alloc_always(working_set, heap, &models->lifetime_allocator);
buffer_bind_file(system, general, working_set, file, canon_name.name); buffer_bind_file(system, heap, working_set, file, canon_name.name);
buffer_bind_name(models, general, part, working_set, file, front_of_directory(filename)); buffer_bind_name(models, heap, part, working_set, file, front_of_directory(filename));
Temp_Memory temp = begin_temp_memory(part); Temp_Memory temp = begin_temp_memory(part);
@ -589,7 +591,7 @@ open_file(System_Functions *system, Models *models, String filename){
char *buffer = push_array(part, char, size); char *buffer = push_array(part, char, size);
b32 gen_buffer = false; b32 gen_buffer = false;
if (buffer == 0){ if (buffer == 0){
buffer = (char*)general_memory_allocate(general, size); buffer = heap_array(heap, char, size);
Assert(buffer != 0); Assert(buffer != 0);
gen_buffer = true; gen_buffer = true;
} }
@ -601,7 +603,7 @@ open_file(System_Functions *system, Models *models, String filename){
} }
if (gen_buffer){ if (gen_buffer){
general_memory_free(general, buffer); heap_free(heap, buffer);
} }
end_temp_memory(temp); end_temp_memory(temp);

View File

@ -33,7 +33,9 @@
# define FSTRING_IMPLEMENTATION # define FSTRING_IMPLEMENTATION
# include "4coder_lib/4coder_string.h" # include "4coder_lib/4coder_string.h"
# include "4coder_lib/4coder_mem.h" # include "4coder_lib/4coder_arena.h"
# include "4coder_lib/4coder_arena.cpp"
# include "4coder_API/types.h" # include "4coder_API/types.h"