2016-02-01 05:03:42 +00:00
|
|
|
|
2016-02-25 23:52:11 +00:00
|
|
|
#include "4coder_keycodes.h"
|
2016-02-24 05:16:08 +00:00
|
|
|
#include "4coder_buffer_types.h"
|
|
|
|
|
2016-02-01 05:03:42 +00:00
|
|
|
#define MDFR_NONE 0
|
|
|
|
#define MDFR_CTRL 1
|
|
|
|
#define MDFR_ALT 2
|
|
|
|
#define MDFR_SHIFT 4
|
|
|
|
|
|
|
|
typedef unsigned char Code;
|
|
|
|
|
|
|
|
enum Command_ID{
|
|
|
|
cmdid_null,
|
|
|
|
cmdid_write_character,
|
|
|
|
cmdid_seek_whitespace_right,
|
|
|
|
cmdid_seek_whitespace_left,
|
|
|
|
cmdid_seek_whitespace_up,
|
|
|
|
cmdid_seek_whitespace_down,
|
|
|
|
cmdid_seek_token_left,
|
|
|
|
cmdid_seek_token_right,
|
|
|
|
cmdid_seek_white_or_token_left,
|
|
|
|
cmdid_seek_white_or_token_right,
|
|
|
|
cmdid_seek_alphanumeric_left,
|
|
|
|
cmdid_seek_alphanumeric_right,
|
|
|
|
cmdid_seek_alphanumeric_or_camel_left,
|
|
|
|
cmdid_seek_alphanumeric_or_camel_right,
|
|
|
|
cmdid_search,
|
2016-02-24 05:16:08 +00:00
|
|
|
cmdid_reverse_search,
|
2016-02-20 21:36:16 +00:00
|
|
|
cmdid_word_complete,
|
2016-02-01 05:03:42 +00:00
|
|
|
cmdid_goto_line,
|
|
|
|
cmdid_set_mark,
|
|
|
|
cmdid_copy,
|
|
|
|
cmdid_cut,
|
|
|
|
cmdid_paste,
|
|
|
|
cmdid_paste_next,
|
|
|
|
cmdid_delete_range,
|
|
|
|
cmdid_timeline_scrub,
|
|
|
|
cmdid_undo,
|
|
|
|
cmdid_redo,
|
|
|
|
cmdid_increase_rewind_speed,
|
|
|
|
cmdid_increase_fastforward_speed,
|
|
|
|
cmdid_stop_rewind_fastforward,
|
|
|
|
cmdid_history_backward,
|
|
|
|
cmdid_history_forward,
|
|
|
|
cmdid_interactive_new,
|
|
|
|
cmdid_interactive_open,
|
|
|
|
cmdid_reopen,
|
|
|
|
cmdid_save,
|
|
|
|
cmdid_interactive_save_as,
|
|
|
|
cmdid_change_active_panel,
|
|
|
|
cmdid_interactive_switch_buffer,
|
|
|
|
cmdid_interactive_kill_buffer,
|
|
|
|
cmdid_kill_buffer,
|
|
|
|
cmdid_toggle_line_wrap,
|
|
|
|
cmdid_toggle_endline_mode,
|
|
|
|
cmdid_to_uppercase,
|
|
|
|
cmdid_to_lowercase,
|
|
|
|
cmdid_toggle_show_whitespace,
|
|
|
|
cmdid_clean_all_lines,
|
|
|
|
cmdid_eol_dosify,
|
|
|
|
cmdid_eol_nixify,
|
|
|
|
cmdid_auto_tab_range,
|
|
|
|
cmdid_auto_tab_line_at_cursor,
|
|
|
|
cmdid_auto_tab_whole_file,
|
|
|
|
cmdid_open_panel_vsplit,
|
|
|
|
cmdid_open_panel_hsplit,
|
|
|
|
cmdid_close_panel,
|
|
|
|
cmdid_move_left,
|
|
|
|
cmdid_move_right,
|
|
|
|
cmdid_delete,
|
|
|
|
cmdid_backspace,
|
|
|
|
cmdid_move_up,
|
|
|
|
cmdid_move_down,
|
|
|
|
cmdid_seek_end_of_line,
|
|
|
|
cmdid_seek_beginning_of_line,
|
|
|
|
cmdid_page_up,
|
|
|
|
cmdid_page_down,
|
|
|
|
cmdid_open_color_tweaker,
|
|
|
|
cmdid_close_minor_view,
|
|
|
|
cmdid_cursor_mark_swap,
|
|
|
|
cmdid_open_menu,
|
|
|
|
cmdid_set_settings,
|
|
|
|
cmdid_build,
|
|
|
|
//
|
|
|
|
cmdid_count
|
|
|
|
};
|
|
|
|
|
|
|
|
enum Param_ID{
|
2016-02-24 05:16:08 +00:00
|
|
|
par_range_start,
|
|
|
|
par_range_end,
|
2016-02-01 05:03:42 +00:00
|
|
|
par_name,
|
|
|
|
par_lex_as_cpp_file,
|
|
|
|
par_wrap_lines,
|
|
|
|
par_key_mapid,
|
|
|
|
par_cli_path,
|
|
|
|
par_cli_command,
|
|
|
|
par_cli_overlap_with_conflict,
|
|
|
|
par_cli_always_bind_to_view,
|
2016-02-24 05:16:08 +00:00
|
|
|
par_clear_blank_lines,
|
2016-02-01 05:03:42 +00:00
|
|
|
// never below this
|
|
|
|
par_type_count
|
|
|
|
};
|
|
|
|
|
|
|
|
enum Hook_ID{
|
|
|
|
hook_start,
|
|
|
|
hook_open_file,
|
|
|
|
// never below this
|
|
|
|
hook_type_count
|
|
|
|
};
|
|
|
|
|
|
|
|
enum Dynamic_Type{
|
|
|
|
dynamic_type_int,
|
|
|
|
dynamic_type_string,
|
|
|
|
// never below this
|
|
|
|
dynamic_type_count
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Dynamic{
|
|
|
|
int type;
|
|
|
|
union{
|
|
|
|
struct{
|
|
|
|
int str_len;
|
|
|
|
char *str_value;
|
|
|
|
};
|
|
|
|
int int_value;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
inline Dynamic
|
|
|
|
dynamic_int(int x){
|
|
|
|
Dynamic result;
|
|
|
|
result.type = dynamic_type_int;
|
|
|
|
result.int_value = x;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline Dynamic
|
|
|
|
dynamic_string(const char *string, int len){
|
|
|
|
Dynamic result;
|
|
|
|
result.type = dynamic_type_string;
|
|
|
|
result.str_len = len;
|
|
|
|
result.str_value = (char*)(string);
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int
|
|
|
|
dynamic_to_int(Dynamic *dynamic){
|
|
|
|
int result = 0;
|
|
|
|
if (dynamic->type == dynamic_type_int){
|
|
|
|
result = dynamic->int_value;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline char*
|
|
|
|
dynamic_to_string(Dynamic *dynamic, int *len){
|
|
|
|
char *result = 0;
|
|
|
|
if (dynamic->type == dynamic_type_string){
|
|
|
|
result = dynamic->str_value;
|
|
|
|
*len = dynamic->str_len;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int
|
|
|
|
dynamic_to_bool(Dynamic *dynamic){
|
|
|
|
int result = 0;
|
|
|
|
if (dynamic->type == dynamic_type_int){
|
|
|
|
result = (dynamic->int_value != 0);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
result = 1;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct Extra_Font{
|
|
|
|
char file_name[256];
|
|
|
|
char font_name[24];
|
|
|
|
int size;
|
|
|
|
};
|
|
|
|
|
2016-02-24 05:16:08 +00:00
|
|
|
// NOTE(allen): None of the members of *_Summary structs nor any of the
|
|
|
|
// data pointed to by the members should be modified, I would have made
|
|
|
|
// them all const... but that causes a lot problems for C++ reasons.
|
2016-02-01 05:03:42 +00:00
|
|
|
struct Buffer_Summary{
|
2016-02-23 16:04:55 +00:00
|
|
|
int exists;
|
|
|
|
int ready;
|
2016-02-01 05:03:42 +00:00
|
|
|
int file_id;
|
|
|
|
|
|
|
|
int size;
|
|
|
|
|
|
|
|
int file_name_len;
|
|
|
|
int buffer_name_len;
|
2016-02-25 00:04:08 +00:00
|
|
|
char *file_name;
|
|
|
|
char *buffer_name;
|
2016-02-01 05:03:42 +00:00
|
|
|
|
|
|
|
int file_cursor_pos;
|
|
|
|
int is_lexed;
|
|
|
|
int map_id;
|
|
|
|
};
|
|
|
|
|
2016-02-24 05:16:08 +00:00
|
|
|
struct File_View_Summary{
|
|
|
|
int exists;
|
|
|
|
int view_id;
|
|
|
|
int file_id;
|
|
|
|
|
|
|
|
Full_Cursor cursor;
|
|
|
|
Full_Cursor mark;
|
2016-02-25 00:04:08 +00:00
|
|
|
float preferred_x;
|
|
|
|
int line_height;
|
|
|
|
int unwrapped_lines;
|
2016-02-24 05:16:08 +00:00
|
|
|
};
|
|
|
|
|
2016-02-01 05:03:42 +00:00
|
|
|
#ifndef FRED_STRING_STRUCT
|
|
|
|
#define FRED_STRING_STRUCT
|
|
|
|
struct String{
|
|
|
|
char *str;
|
|
|
|
int size;
|
|
|
|
int memory_size;
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2016-02-25 23:52:11 +00:00
|
|
|
#define GET_BINDING_DATA(name) int name(void *data, int size)
|
2016-02-01 05:03:42 +00:00
|
|
|
#define SET_EXTRA_FONT_SIG(name) void name(Extra_Font *font_out)
|
|
|
|
#define CUSTOM_COMMAND_SIG(name) void name(void *cmd_context, struct Application_Links *app)
|
|
|
|
#define HOOK_SIG(name) void name(void *cmd_context, struct Application_Links *app)
|
|
|
|
|
|
|
|
extern "C"{
|
|
|
|
typedef CUSTOM_COMMAND_SIG(Custom_Command_Function);
|
|
|
|
typedef GET_BINDING_DATA(Get_Binding_Data_Function);
|
|
|
|
typedef SET_EXTRA_FONT_SIG(Set_Extra_Font_Function);
|
|
|
|
typedef HOOK_SIG(Hook_Function);
|
|
|
|
}
|
|
|
|
|
2016-02-23 20:06:22 +00:00
|
|
|
// Command exectuion
|
2016-02-01 05:03:42 +00:00
|
|
|
#define PUSH_PARAMETER_SIG(name) void name(void *cmd_context, Dynamic param, Dynamic value)
|
|
|
|
#define PUSH_MEMORY_SIG(name) char* name(void *cmd_context, int len)
|
|
|
|
#define EXECUTE_COMMAND_SIG(name) void name(void *cmd_context, int command_id)
|
|
|
|
#define CLEAR_PARAMETERS_SIG(name) void name(void *cmd_context)
|
2016-02-23 20:06:22 +00:00
|
|
|
|
|
|
|
// File system navigation
|
2016-02-01 05:03:42 +00:00
|
|
|
#define DIRECTORY_GET_HOT_SIG(name) int name(void *cmd_context, char *buffer, int max)
|
|
|
|
#define DIRECTORY_HAS_FILE_SIG(name) int name(String dir, char *filename)
|
|
|
|
#define DIRECTORY_CD_SIG(name) int name(String *dir, char *rel_path)
|
|
|
|
|
2016-02-23 20:41:11 +00:00
|
|
|
// Direct buffer manipulation
|
2016-02-23 15:23:45 +00:00
|
|
|
#define GET_BUFFER_MAX_INDEX_SIG(name) int name(void *cmd_context)
|
|
|
|
#define GET_BUFFER_SIG(name) Buffer_Summary name(void *cmd_context, int index)
|
|
|
|
#define GET_ACTIVE_BUFFER_SIG(name) Buffer_Summary name(void *cmd_context)
|
|
|
|
#define GET_BUFFER_BY_NAME(name) Buffer_Summary name(void *cmd_context, String filename)
|
|
|
|
|
2016-02-24 05:16:08 +00:00
|
|
|
#define REFRESH_BUFFER_SIG(name) int name(void *cmd_context, Buffer_Summary *buffer)
|
2016-02-25 00:04:08 +00:00
|
|
|
#define BUFFER_SEEK_DELIMITER_SIG(name) int name(void *cmd_context, Buffer_Summary *buffer, int start, char delim, int seek_forward, int *out)
|
2016-02-23 20:06:22 +00:00
|
|
|
#define BUFFER_READ_RANGE_SIG(name) int name(void *cmd_context, Buffer_Summary *buffer, int start, int end, char *out)
|
2016-02-23 20:41:11 +00:00
|
|
|
#define BUFFER_REPLACE_RANGE_SIG(name) int name(void *cmd_context, Buffer_Summary *buffer, int start, int end, char *str, int len)
|
2016-02-26 05:50:19 +00:00
|
|
|
// TODO(allen): buffer save
|
2016-02-23 20:41:11 +00:00
|
|
|
|
2016-02-24 05:16:08 +00:00
|
|
|
// File view manipulation
|
|
|
|
#define GET_VIEW_MAX_INDEX_SIG(name) int name(void *cmd_context)
|
2016-02-24 16:58:02 +00:00
|
|
|
#define GET_FILE_VIEW_SIG(name) File_View_Summary name(void *cmd_context, int index)
|
|
|
|
#define GET_ACTIVE_FILE_VIEW_SIG(name) File_View_Summary name(void *cmd_context)
|
2016-02-24 05:16:08 +00:00
|
|
|
|
2016-02-24 16:58:02 +00:00
|
|
|
#define REFRESH_FILE_VIEW_SIG(name) int name(void *cmd_context, File_View_Summary *view)
|
2016-02-24 05:16:08 +00:00
|
|
|
#define VIEW_SET_CURSOR_SIG(name) int name(void *cmd_context, File_View_Summary *view, Buffer_Seek seek, int set_preferred_x)
|
|
|
|
#define VIEW_SET_MARK_SIG(name) int name(void *cmd_context, File_View_Summary *view, Buffer_Seek seek)
|
|
|
|
#define VIEW_SET_FILE_SIG(name) int name(void *cmd_context, File_View_Summary *view, int file_id)
|
|
|
|
|
2016-02-01 05:03:42 +00:00
|
|
|
extern "C"{
|
2016-02-23 20:06:22 +00:00
|
|
|
// Command exectuion
|
2016-02-01 05:03:42 +00:00
|
|
|
typedef EXECUTE_COMMAND_SIG(Exec_Command_Function);
|
|
|
|
typedef PUSH_PARAMETER_SIG(Push_Parameter_Function);
|
|
|
|
typedef PUSH_MEMORY_SIG(Push_Memory_Function);
|
|
|
|
typedef CLEAR_PARAMETERS_SIG(Clear_Parameters_Function);
|
2016-02-23 20:06:22 +00:00
|
|
|
|
|
|
|
// File system navigation
|
2016-02-01 05:03:42 +00:00
|
|
|
typedef DIRECTORY_GET_HOT_SIG(Directory_Get_Hot);
|
|
|
|
typedef DIRECTORY_HAS_FILE_SIG(Directory_Has_File);
|
|
|
|
typedef DIRECTORY_CD_SIG(Directory_CD);
|
2016-02-23 15:23:45 +00:00
|
|
|
|
2016-02-23 20:06:22 +00:00
|
|
|
// Buffer manipulation
|
2016-02-23 15:23:45 +00:00
|
|
|
typedef GET_BUFFER_MAX_INDEX_SIG(Get_Buffer_Max_Index_Function);
|
|
|
|
typedef GET_BUFFER_SIG(Get_Buffer_Function);
|
|
|
|
typedef GET_ACTIVE_BUFFER_SIG(Get_Active_Buffer_Function);
|
|
|
|
typedef GET_BUFFER_BY_NAME(Get_Buffer_By_Name_Function);
|
2016-02-23 20:06:22 +00:00
|
|
|
|
2016-02-24 05:16:08 +00:00
|
|
|
typedef REFRESH_BUFFER_SIG(Refresh_Buffer_Function);
|
2016-02-23 20:06:22 +00:00
|
|
|
typedef BUFFER_SEEK_DELIMITER_SIG(Buffer_Seek_Delimiter_Function);
|
|
|
|
typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function);
|
2016-02-23 20:41:11 +00:00
|
|
|
typedef BUFFER_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function);
|
2016-02-24 05:16:08 +00:00
|
|
|
|
|
|
|
// View manipulation
|
|
|
|
typedef GET_VIEW_MAX_INDEX_SIG(Get_View_Max_Index_Function);
|
2016-02-24 16:58:02 +00:00
|
|
|
typedef GET_FILE_VIEW_SIG(Get_File_View_Function);
|
|
|
|
typedef GET_ACTIVE_FILE_VIEW_SIG(Get_Active_File_View_Function);
|
2016-02-24 05:16:08 +00:00
|
|
|
|
2016-02-24 16:58:02 +00:00
|
|
|
typedef REFRESH_FILE_VIEW_SIG(Refresh_File_View_Function);
|
2016-02-24 05:16:08 +00:00
|
|
|
typedef VIEW_SET_CURSOR_SIG(View_Set_Cursor_Function);
|
|
|
|
typedef VIEW_SET_MARK_SIG(View_Set_Mark_Function);
|
|
|
|
typedef VIEW_SET_FILE_SIG(View_Set_File_Function);
|
2016-02-01 05:03:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
struct Application_Links{
|
2016-02-23 15:23:45 +00:00
|
|
|
// Command exectuion
|
2016-02-01 05:03:42 +00:00
|
|
|
Exec_Command_Function *exec_command_keep_stack;
|
|
|
|
Push_Parameter_Function *push_parameter;
|
|
|
|
Push_Memory_Function *push_memory;
|
|
|
|
Clear_Parameters_Function *clear_parameters;
|
2016-02-23 15:23:45 +00:00
|
|
|
|
|
|
|
// File system navigation
|
2016-02-01 05:03:42 +00:00
|
|
|
Directory_Get_Hot *directory_get_hot;
|
|
|
|
Directory_Has_File *directory_has_file;
|
|
|
|
Directory_CD *directory_cd;
|
2016-02-23 15:23:45 +00:00
|
|
|
|
|
|
|
// Buffer manipulation
|
|
|
|
Get_Buffer_Max_Index_Function *get_buffer_max_index;
|
|
|
|
Get_Buffer_Function *get_buffer;
|
|
|
|
Get_Active_Buffer_Function *get_active_buffer;
|
|
|
|
Get_Buffer_By_Name_Function *get_buffer_by_name;
|
2016-02-23 20:06:22 +00:00
|
|
|
|
2016-02-24 05:16:08 +00:00
|
|
|
Refresh_Buffer_Function *refresh_buffer;
|
2016-02-23 20:06:22 +00:00
|
|
|
Buffer_Seek_Delimiter_Function *buffer_seek_delimiter;
|
|
|
|
Buffer_Read_Range_Function *buffer_read_range;
|
2016-02-23 20:41:11 +00:00
|
|
|
Buffer_Replace_Range_Function *buffer_replace_range;
|
2016-02-24 05:16:08 +00:00
|
|
|
|
|
|
|
// View manipulation
|
|
|
|
Get_View_Max_Index_Function *get_view_max_index;
|
2016-02-24 16:58:02 +00:00
|
|
|
Get_File_View_Function *get_file_view;
|
|
|
|
Get_Active_File_View_Function *get_active_file_view;
|
2016-02-24 05:16:08 +00:00
|
|
|
|
2016-02-24 16:58:02 +00:00
|
|
|
Refresh_File_View_Function *refresh_file_view;
|
2016-02-24 05:16:08 +00:00
|
|
|
View_Set_Cursor_Function *view_set_cursor;
|
|
|
|
View_Set_Mark_Function *view_set_mark;
|
|
|
|
View_Set_File_Function *view_set_file;
|
2016-02-01 05:03:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct Custom_API{
|
|
|
|
Get_Binding_Data_Function *get_bindings;
|
|
|
|
};
|
|
|
|
|
|
|
|
// NOTE(allen): definitions for the buffer that communicates to 4ed.exe
|
|
|
|
|
|
|
|
enum Binding_Unit_Type{
|
|
|
|
unit_header,
|
|
|
|
unit_map_begin,
|
|
|
|
unit_binding,
|
|
|
|
unit_callback,
|
|
|
|
unit_inherit,
|
|
|
|
unit_hook
|
|
|
|
};
|
|
|
|
|
|
|
|
enum Map_ID{
|
|
|
|
mapid_global = (1 << 24),
|
|
|
|
mapid_file,
|
2016-02-22 02:45:41 +00:00
|
|
|
|
2016-02-01 05:03:42 +00:00
|
|
|
// NOTE(allen): mapid_nomap will remain empty even if you attempt to fill it
|
|
|
|
// it is for setting a map's parent to nothing, in cases where you don't want
|
|
|
|
// to inherit from global (which is the default).
|
|
|
|
mapid_nomap
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Binding_Unit{
|
|
|
|
Binding_Unit_Type type;
|
|
|
|
union{
|
|
|
|
struct{ int total_size; int user_map_count; int error; } header;
|
|
|
|
|
|
|
|
struct{ int mapid; int bind_count; } map_begin;
|
|
|
|
struct{ int mapid; } map_inherit;
|
|
|
|
struct{
|
|
|
|
short code;
|
|
|
|
unsigned char modifiers;
|
|
|
|
int command_id;
|
|
|
|
} binding;
|
|
|
|
struct{
|
|
|
|
short code;
|
|
|
|
unsigned char modifiers;
|
|
|
|
Custom_Command_Function *func;
|
|
|
|
} callback;
|
|
|
|
struct{
|
|
|
|
int hook_id;
|
|
|
|
Custom_Command_Function *func;
|
|
|
|
} hook;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|