Merge branch 'master' of https://bitbucket.org/4coder/4coder
commit
934cbb4121
912
4coder_API.html
912
4coder_API.html
File diff suppressed because it is too large
Load Diff
|
@ -19,7 +19,7 @@ typedef struct Full_Cursor{
|
||||||
float wrapped_x, wrapped_y;
|
float wrapped_x, wrapped_y;
|
||||||
} Full_Cursor;
|
} Full_Cursor;
|
||||||
|
|
||||||
typedef enum{
|
typedef enum Buffer_Seek_Type{
|
||||||
buffer_seek_pos,
|
buffer_seek_pos,
|
||||||
buffer_seek_wrapped_xy,
|
buffer_seek_wrapped_xy,
|
||||||
buffer_seek_unwrapped_xy,
|
buffer_seek_unwrapped_xy,
|
||||||
|
|
|
@ -1,11 +1,5 @@
|
||||||
#define EXEC_COMMAND_SIG(n) void n(Application_Links *app, int command_id)
|
#define EXEC_COMMAND_SIG(n) void n(Application_Links *app, int command_id)
|
||||||
#define EXEC_SYSTEM_COMMAND_SIG(n) int n(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int path_len, char *command, int command_len, unsigned int flags)
|
#define EXEC_SYSTEM_COMMAND_SIG(n) int n(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int path_len, char *command, int command_len, unsigned int flags)
|
||||||
#define DIRECTORY_GET_HOT_SIG(n) int n(Application_Links *app, char *out, int capacity)
|
|
||||||
#define GET_4ED_PATH_SIG(n) int n(Application_Links *app, char *out, int capacity)
|
|
||||||
#define FILE_EXISTS_SIG(n) int n(Application_Links *app, char *filename, int len)
|
|
||||||
#define DIRECTORY_CD_SIG(n) int n(Application_Links *app, char *dir, int *len, int capacity, char *rel_path, int rel_len)
|
|
||||||
#define GET_FILE_LIST_SIG(n) File_List n(Application_Links *app, char *dir, int len)
|
|
||||||
#define FREE_FILE_LIST_SIG(n) void n(Application_Links *app, File_List list)
|
|
||||||
#define CLIPBOARD_POST_SIG(n) void n(Application_Links *app, char *str, int len)
|
#define CLIPBOARD_POST_SIG(n) void n(Application_Links *app, char *str, int len)
|
||||||
#define CLIPBOARD_COUNT_SIG(n) int n(Application_Links *app)
|
#define CLIPBOARD_COUNT_SIG(n) int n(Application_Links *app)
|
||||||
#define CLIPBOARD_INDEX_SIG(n) int n(Application_Links *app, int index, char *out, int len)
|
#define CLIPBOARD_INDEX_SIG(n) int n(Application_Links *app, int index, char *out, int len)
|
||||||
|
@ -13,7 +7,7 @@
|
||||||
#define GET_BUFFER_NEXT_SIG(n) void n(Application_Links *app, Buffer_Summary *buffer, unsigned int access)
|
#define GET_BUFFER_NEXT_SIG(n) void n(Application_Links *app, Buffer_Summary *buffer, unsigned int access)
|
||||||
#define GET_BUFFER_SIG(n) Buffer_Summary n(Application_Links *app, int buffer_id, unsigned int access)
|
#define GET_BUFFER_SIG(n) Buffer_Summary n(Application_Links *app, int buffer_id, unsigned int access)
|
||||||
#define GET_BUFFER_BY_NAME_SIG(n) Buffer_Summary n(Application_Links *app, char *name, int len, unsigned int access)
|
#define GET_BUFFER_BY_NAME_SIG(n) Buffer_Summary n(Application_Links *app, char *name, int len, unsigned int access)
|
||||||
#define BUFFER_SEEK_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start_pos, int seek_forward, unsigned int flags)
|
#define BUFFER_BOUNDARY_SEEK_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start_pos, int seek_forward, unsigned int flags)
|
||||||
#define BUFFER_READ_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out)
|
#define BUFFER_READ_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out)
|
||||||
#define BUFFER_REPLACE_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len)
|
#define BUFFER_REPLACE_RANGE_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len)
|
||||||
#define BUFFER_SET_SETTING_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int setting, int value)
|
#define BUFFER_SET_SETTING_SIG(n) int n(Application_Links *app, Buffer_Summary *buffer, int setting, int value)
|
||||||
|
@ -43,15 +37,15 @@
|
||||||
#define CHANGE_FONT_SIG(n) void n(Application_Links *app, char *name, int len)
|
#define CHANGE_FONT_SIG(n) void n(Application_Links *app, char *name, int len)
|
||||||
#define SET_THEME_COLORS_SIG(n) void n(Application_Links *app, Theme_Color *colors, int count)
|
#define SET_THEME_COLORS_SIG(n) void n(Application_Links *app, Theme_Color *colors, int count)
|
||||||
#define GET_THEME_COLORS_SIG(n) void n(Application_Links *app, Theme_Color *colors, int count)
|
#define GET_THEME_COLORS_SIG(n) void n(Application_Links *app, Theme_Color *colors, int count)
|
||||||
|
#define DIRECTORY_GET_HOT_SIG(n) int n(Application_Links *app, char *out, int capacity)
|
||||||
|
#define GET_FILE_LIST_SIG(n) File_List n(Application_Links *app, char *dir, int len)
|
||||||
|
#define FREE_FILE_LIST_SIG(n) void n(Application_Links *app, File_List list)
|
||||||
|
#define FILE_EXISTS_SIG(n) int n(Application_Links *app, char *filename, int len)
|
||||||
|
#define DIRECTORY_CD_SIG(n) int n(Application_Links *app, char *dir, int *len, int capacity, char *rel_path, int rel_len)
|
||||||
|
#define GET_4ED_PATH_SIG(n) int n(Application_Links *app, char *out, int capacity)
|
||||||
extern "C"{
|
extern "C"{
|
||||||
typedef EXEC_COMMAND_SIG(Exec_Command_Function);
|
typedef EXEC_COMMAND_SIG(Exec_Command_Function);
|
||||||
typedef EXEC_SYSTEM_COMMAND_SIG(Exec_System_Command_Function);
|
typedef EXEC_SYSTEM_COMMAND_SIG(Exec_System_Command_Function);
|
||||||
typedef DIRECTORY_GET_HOT_SIG(Directory_Get_Hot_Function);
|
|
||||||
typedef GET_4ED_PATH_SIG(Get_4ed_Path_Function);
|
|
||||||
typedef FILE_EXISTS_SIG(File_Exists_Function);
|
|
||||||
typedef DIRECTORY_CD_SIG(Directory_CD_Function);
|
|
||||||
typedef GET_FILE_LIST_SIG(Get_File_List_Function);
|
|
||||||
typedef FREE_FILE_LIST_SIG(Free_File_List_Function);
|
|
||||||
typedef CLIPBOARD_POST_SIG(Clipboard_Post_Function);
|
typedef CLIPBOARD_POST_SIG(Clipboard_Post_Function);
|
||||||
typedef CLIPBOARD_COUNT_SIG(Clipboard_Count_Function);
|
typedef CLIPBOARD_COUNT_SIG(Clipboard_Count_Function);
|
||||||
typedef CLIPBOARD_INDEX_SIG(Clipboard_Index_Function);
|
typedef CLIPBOARD_INDEX_SIG(Clipboard_Index_Function);
|
||||||
|
@ -59,7 +53,7 @@ extern "C"{
|
||||||
typedef GET_BUFFER_NEXT_SIG(Get_Buffer_Next_Function);
|
typedef GET_BUFFER_NEXT_SIG(Get_Buffer_Next_Function);
|
||||||
typedef GET_BUFFER_SIG(Get_Buffer_Function);
|
typedef GET_BUFFER_SIG(Get_Buffer_Function);
|
||||||
typedef GET_BUFFER_BY_NAME_SIG(Get_Buffer_By_Name_Function);
|
typedef GET_BUFFER_BY_NAME_SIG(Get_Buffer_By_Name_Function);
|
||||||
typedef BUFFER_SEEK_SIG(Buffer_Seek_Function);
|
typedef BUFFER_BOUNDARY_SEEK_SIG(Buffer_Boundary_Seek_Function);
|
||||||
typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function);
|
typedef BUFFER_READ_RANGE_SIG(Buffer_Read_Range_Function);
|
||||||
typedef BUFFER_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function);
|
typedef BUFFER_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function);
|
||||||
typedef BUFFER_SET_SETTING_SIG(Buffer_Set_Setting_Function);
|
typedef BUFFER_SET_SETTING_SIG(Buffer_Set_Setting_Function);
|
||||||
|
@ -89,18 +83,18 @@ extern "C"{
|
||||||
typedef CHANGE_FONT_SIG(Change_Font_Function);
|
typedef CHANGE_FONT_SIG(Change_Font_Function);
|
||||||
typedef SET_THEME_COLORS_SIG(Set_Theme_Colors_Function);
|
typedef SET_THEME_COLORS_SIG(Set_Theme_Colors_Function);
|
||||||
typedef GET_THEME_COLORS_SIG(Get_Theme_Colors_Function);
|
typedef GET_THEME_COLORS_SIG(Get_Theme_Colors_Function);
|
||||||
|
typedef DIRECTORY_GET_HOT_SIG(Directory_Get_Hot_Function);
|
||||||
|
typedef GET_FILE_LIST_SIG(Get_File_List_Function);
|
||||||
|
typedef FREE_FILE_LIST_SIG(Free_File_List_Function);
|
||||||
|
typedef FILE_EXISTS_SIG(File_Exists_Function);
|
||||||
|
typedef DIRECTORY_CD_SIG(Directory_CD_Function);
|
||||||
|
typedef GET_4ED_PATH_SIG(Get_4ed_Path_Function);
|
||||||
}
|
}
|
||||||
struct Application_Links{
|
struct Application_Links{
|
||||||
void *memory;
|
void *memory;
|
||||||
int memory_size;
|
int memory_size;
|
||||||
Exec_Command_Function *exec_command;
|
Exec_Command_Function *exec_command;
|
||||||
Exec_System_Command_Function *exec_system_command;
|
Exec_System_Command_Function *exec_system_command;
|
||||||
Directory_Get_Hot_Function *directory_get_hot;
|
|
||||||
Get_4ed_Path_Function *get_4ed_path;
|
|
||||||
File_Exists_Function *file_exists;
|
|
||||||
Directory_CD_Function *directory_cd;
|
|
||||||
Get_File_List_Function *get_file_list;
|
|
||||||
Free_File_List_Function *free_file_list;
|
|
||||||
Clipboard_Post_Function *clipboard_post;
|
Clipboard_Post_Function *clipboard_post;
|
||||||
Clipboard_Count_Function *clipboard_count;
|
Clipboard_Count_Function *clipboard_count;
|
||||||
Clipboard_Index_Function *clipboard_index;
|
Clipboard_Index_Function *clipboard_index;
|
||||||
|
@ -108,7 +102,7 @@ struct Application_Links{
|
||||||
Get_Buffer_Next_Function *get_buffer_next;
|
Get_Buffer_Next_Function *get_buffer_next;
|
||||||
Get_Buffer_Function *get_buffer;
|
Get_Buffer_Function *get_buffer;
|
||||||
Get_Buffer_By_Name_Function *get_buffer_by_name;
|
Get_Buffer_By_Name_Function *get_buffer_by_name;
|
||||||
Buffer_Seek_Function *buffer_seek;
|
Buffer_Boundary_Seek_Function *buffer_boundary_seek;
|
||||||
Buffer_Read_Range_Function *buffer_read_range;
|
Buffer_Read_Range_Function *buffer_read_range;
|
||||||
Buffer_Replace_Range_Function *buffer_replace_range;
|
Buffer_Replace_Range_Function *buffer_replace_range;
|
||||||
Buffer_Set_Setting_Function *buffer_set_setting;
|
Buffer_Set_Setting_Function *buffer_set_setting;
|
||||||
|
@ -138,54 +132,60 @@ struct Application_Links{
|
||||||
Change_Font_Function *change_font;
|
Change_Font_Function *change_font;
|
||||||
Set_Theme_Colors_Function *set_theme_colors;
|
Set_Theme_Colors_Function *set_theme_colors;
|
||||||
Get_Theme_Colors_Function *get_theme_colors;
|
Get_Theme_Colors_Function *get_theme_colors;
|
||||||
|
Directory_Get_Hot_Function *directory_get_hot;
|
||||||
|
Get_File_List_Function *get_file_list;
|
||||||
|
Free_File_List_Function *free_file_list;
|
||||||
|
File_Exists_Function *file_exists;
|
||||||
|
Directory_CD_Function *directory_cd;
|
||||||
|
Get_4ed_Path_Function *get_4ed_path;
|
||||||
void *cmd_context;
|
void *cmd_context;
|
||||||
void *system_links;
|
void *system_links;
|
||||||
void *current_coroutine;
|
void *current_coroutine;
|
||||||
int type_coroutine;
|
int type_coroutine;
|
||||||
};
|
};
|
||||||
#define FillAppLinksAPI(app_links) do{\
|
#define FillAppLinksAPI(app_links) do{\
|
||||||
app_links->exec_command = external_exec_command;\
|
app_links->exec_command = Exec_Command;\
|
||||||
app_links->exec_system_command = external_exec_system_command;\
|
app_links->exec_system_command = Exec_System_Command;\
|
||||||
app_links->directory_get_hot = external_directory_get_hot;\
|
app_links->clipboard_post = Clipboard_Post;\
|
||||||
app_links->get_4ed_path = external_get_4ed_path;\
|
app_links->clipboard_count = Clipboard_Count;\
|
||||||
app_links->file_exists = external_file_exists;\
|
app_links->clipboard_index = Clipboard_Index;\
|
||||||
app_links->directory_cd = external_directory_cd;\
|
app_links->get_buffer_first = Get_Buffer_First;\
|
||||||
app_links->get_file_list = external_get_file_list;\
|
app_links->get_buffer_next = Get_Buffer_Next;\
|
||||||
app_links->free_file_list = external_free_file_list;\
|
app_links->get_buffer = Get_Buffer;\
|
||||||
app_links->clipboard_post = external_clipboard_post;\
|
app_links->get_buffer_by_name = Get_Buffer_By_Name;\
|
||||||
app_links->clipboard_count = external_clipboard_count;\
|
app_links->buffer_boundary_seek = Buffer_Boundary_Seek;\
|
||||||
app_links->clipboard_index = external_clipboard_index;\
|
app_links->buffer_read_range = Buffer_Read_Range;\
|
||||||
app_links->get_buffer_first = external_get_buffer_first;\
|
app_links->buffer_replace_range = Buffer_Replace_Range;\
|
||||||
app_links->get_buffer_next = external_get_buffer_next;\
|
app_links->buffer_set_setting = Buffer_Set_Setting;\
|
||||||
app_links->get_buffer = external_get_buffer;\
|
app_links->buffer_auto_indent = Buffer_Auto_Indent;\
|
||||||
app_links->get_buffer_by_name = external_get_buffer_by_name;\
|
app_links->create_buffer = Create_Buffer;\
|
||||||
app_links->buffer_seek = external_buffer_seek;\
|
app_links->save_buffer = Save_Buffer;\
|
||||||
app_links->buffer_read_range = external_buffer_read_range;\
|
app_links->kill_buffer = Kill_Buffer;\
|
||||||
app_links->buffer_replace_range = external_buffer_replace_range;\
|
app_links->get_view_first = Get_View_First;\
|
||||||
app_links->buffer_set_setting = external_buffer_set_setting;\
|
app_links->get_view_next = Get_View_Next;\
|
||||||
app_links->buffer_auto_indent = external_buffer_auto_indent;\
|
app_links->get_view = Get_View;\
|
||||||
app_links->create_buffer = external_create_buffer;\
|
app_links->get_active_view = Get_Active_View;\
|
||||||
app_links->save_buffer = external_save_buffer;\
|
app_links->view_compute_cursor = View_Compute_Cursor;\
|
||||||
app_links->kill_buffer = external_kill_buffer;\
|
app_links->view_set_cursor = View_Set_Cursor;\
|
||||||
app_links->get_view_first = external_get_view_first;\
|
app_links->view_set_mark = View_Set_Mark;\
|
||||||
app_links->get_view_next = external_get_view_next;\
|
app_links->view_set_highlight = View_Set_Highlight;\
|
||||||
app_links->get_view = external_get_view;\
|
app_links->view_set_buffer = View_Set_Buffer;\
|
||||||
app_links->get_active_view = external_get_active_view;\
|
app_links->view_post_fade = View_Post_Fade;\
|
||||||
app_links->view_compute_cursor = external_view_compute_cursor;\
|
app_links->view_set_paste_rewrite_ = View_Set_Paste_Rewrite_;\
|
||||||
app_links->view_set_cursor = external_view_set_cursor;\
|
app_links->view_get_paste_rewrite_ = View_Get_Paste_Rewrite_;\
|
||||||
app_links->view_set_mark = external_view_set_mark;\
|
app_links->get_user_input = Get_User_Input;\
|
||||||
app_links->view_set_highlight = external_view_set_highlight;\
|
app_links->get_command_input = Get_Command_Input;\
|
||||||
app_links->view_set_buffer = external_view_set_buffer;\
|
app_links->get_mouse_state = Get_Mouse_State;\
|
||||||
app_links->view_post_fade = external_view_post_fade;\
|
app_links->start_query_bar = Start_Query_Bar;\
|
||||||
app_links->view_set_paste_rewrite_ = external_view_set_paste_rewrite_;\
|
app_links->end_query_bar = End_Query_Bar;\
|
||||||
app_links->view_get_paste_rewrite_ = external_view_get_paste_rewrite_;\
|
app_links->print_message = Print_Message;\
|
||||||
app_links->get_user_input = external_get_user_input;\
|
app_links->change_theme = Change_Theme;\
|
||||||
app_links->get_command_input = external_get_command_input;\
|
app_links->change_font = Change_Font;\
|
||||||
app_links->get_mouse_state = external_get_mouse_state;\
|
app_links->set_theme_colors = Set_Theme_Colors;\
|
||||||
app_links->start_query_bar = external_start_query_bar;\
|
app_links->get_theme_colors = Get_Theme_Colors;\
|
||||||
app_links->end_query_bar = external_end_query_bar;\
|
app_links->directory_get_hot = Directory_Get_Hot;\
|
||||||
app_links->print_message = external_print_message;\
|
app_links->get_file_list = Get_File_List;\
|
||||||
app_links->change_theme = external_change_theme;\
|
app_links->free_file_list = Free_File_List;\
|
||||||
app_links->change_font = external_change_font;\
|
app_links->file_exists = File_Exists;\
|
||||||
app_links->set_theme_colors = external_set_theme_colors;\
|
app_links->directory_cd = Directory_CD;\
|
||||||
app_links->get_theme_colors = external_get_theme_colors; } while(false)
|
app_links->get_4ed_path = Get_4ed_Path; } while(false)
|
||||||
|
|
|
@ -599,7 +599,7 @@ basic_seek(Application_Links *app, int seek_type, unsigned int flags){
|
||||||
unsigned int access = AccessProtected;
|
unsigned int access = AccessProtected;
|
||||||
View_Summary view = app->get_active_view(app, access);
|
View_Summary view = app->get_active_view(app, access);
|
||||||
Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access);
|
Buffer_Summary buffer = app->get_buffer(app, view.buffer_id, access);
|
||||||
int pos = app->buffer_seek(app, &buffer, view.cursor.pos, seek_type, flags);
|
int pos = app->buffer_boundary_seek(app, &buffer, view.cursor.pos, seek_type, flags);
|
||||||
app->view_set_cursor(app, &view, seek_pos(pos), true);
|
app->view_set_cursor(app, &view, seek_pos(pos), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -798,9 +798,9 @@ CUSTOM_COMMAND_SIG(snipe_token_or_word){
|
||||||
view = app->get_active_view(app, access);
|
view = app->get_active_view(app, access);
|
||||||
buffer = app->get_buffer(app, view.buffer_id, access);
|
buffer = app->get_buffer(app, view.buffer_id, access);
|
||||||
|
|
||||||
pos1 = app->buffer_seek(app, &buffer, view.cursor.pos, false, BoundryToken | BoundryWhitespace);
|
pos1 = app->buffer_boundary_seek(app, &buffer, view.cursor.pos, false, BoundryToken | BoundryWhitespace);
|
||||||
|
|
||||||
pos2 = app->buffer_seek(app, &buffer, pos1, true, BoundryToken | BoundryWhitespace);
|
pos2 = app->buffer_boundary_seek(app, &buffer, pos1, true, BoundryToken | BoundryWhitespace);
|
||||||
|
|
||||||
Range range = make_range(pos1, pos2);
|
Range range = make_range(pos1, pos2);
|
||||||
app->buffer_replace_range(app, &buffer, range.start, range.end, 0, 0);
|
app->buffer_replace_range(app, &buffer, range.start, range.end, 0, 0);
|
||||||
|
@ -836,6 +836,7 @@ CUSTOM_COMMAND_SIG(open_file_in_quotes){
|
||||||
append(&file_name, make_string(short_file_name, size));
|
append(&file_name, make_string(short_file_name, size));
|
||||||
|
|
||||||
exec_command(app, cmdid_change_active_panel);
|
exec_command(app, cmdid_change_active_panel);
|
||||||
|
view = app->get_active_view(app, AccessAll);
|
||||||
view_open_file(app, &view, expand_str(file_name), false);
|
view_open_file(app, &view, expand_str(file_name), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2
4ed.cpp
2
4ed.cpp
|
@ -984,9 +984,7 @@ update_command_data(App_Vars *vars, Command_Data *cmd){
|
||||||
|
|
||||||
globalvar Command_Function command_table[cmdid_count];
|
globalvar Command_Function command_table[cmdid_count];
|
||||||
|
|
||||||
//extern "C"{
|
|
||||||
#include "4ed_api_implementation.cpp"
|
#include "4ed_api_implementation.cpp"
|
||||||
//}
|
|
||||||
|
|
||||||
struct Command_In{
|
struct Command_In{
|
||||||
Command_Data *cmd;
|
Command_Data *cmd;
|
||||||
|
|
|
@ -139,7 +139,10 @@ imp_get_view(Command_Data *cmd, View_Summary *view){
|
||||||
return(vptr);
|
return(vptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXEC_COMMAND_SIG(external_exec_command)/*
|
#define API_EXPORT
|
||||||
|
|
||||||
|
API_EXPORT void
|
||||||
|
Exec_Command(Application_Links *app, int command_id)/*
|
||||||
DOC_PARAM(command_id, an integer id enumerated in 4coder_custom.h starting with cmdid)
|
DOC_PARAM(command_id, an integer id enumerated in 4coder_custom.h starting with cmdid)
|
||||||
DOC(Executes the command associated with the command_id passed in)
|
DOC(Executes the command associated with the command_id passed in)
|
||||||
*/{
|
*/{
|
||||||
|
@ -153,7 +156,8 @@ DOC(Executes the command associated with the command_id passed in)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(allen): This is a bit of a mess and needs to be fixed soon
|
// TODO(allen): This is a bit of a mess and needs to be fixed soon
|
||||||
EXEC_SYSTEM_COMMAND_SIG(external_exec_system_command)/*
|
API_EXPORT int
|
||||||
|
Exec_System_Command(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int path_len, char *command, int command_len, unsigned int flags)/*
|
||||||
DOC_PARAM(view, the target view that will display the output buffer, may be NULL, see description for details)
|
DOC_PARAM(view, the target view that will display the output buffer, may be NULL, see description for details)
|
||||||
DOC_PARAM(buffer, a buffer identifier for the buffer that will be filled with the output from the command)
|
DOC_PARAM(buffer, a buffer identifier for the buffer that will be filled with the output from the command)
|
||||||
DOC_PARAM(path, the path from which the command is executed)
|
DOC_PARAM(path, the path from which the command is executed)
|
||||||
|
@ -321,63 +325,8 @@ of at the beginning.
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
DIRECTORY_GET_HOT_SIG(external_directory_get_hot)/*
|
API_EXPORT void
|
||||||
DOC_PARAM(out, a buffer that receives the 4coder 'hot directory')
|
Clipboard_Post(Application_Links *app, char *str, int len)/*
|
||||||
DOC_PARAM(capacity, the maximum size to be output to the output buffer)
|
|
||||||
DOC_RETURN(returns the size of the string written into the buffer)
|
|
||||||
DOC
|
|
||||||
(
|
|
||||||
4coder has a concept of a 'hot directory' which is the directory most recently
|
|
||||||
accessed in the GUI. Whenever the GUI is opened it shows the hot directory.
|
|
||||||
|
|
||||||
In the future this will be deprecated and eliminated in favor of more flexible
|
|
||||||
directories controlled by the custom side.
|
|
||||||
)
|
|
||||||
*/{
|
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
|
||||||
Hot_Directory *hot = &cmd->models->hot_directory;
|
|
||||||
i32 copy_max = capacity - 1;
|
|
||||||
hot_directory_clean_end(hot);
|
|
||||||
if (copy_max > hot->string.size)
|
|
||||||
copy_max = hot->string.size;
|
|
||||||
memcpy(out, hot->string.str, copy_max);
|
|
||||||
out[copy_max] = 0;
|
|
||||||
return(hot->string.size);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define external_get_4ed_path system->get_4ed_path
|
|
||||||
|
|
||||||
#define external_file_exists system->file_exists
|
|
||||||
|
|
||||||
#define external_directory_cd system->directory_cd
|
|
||||||
|
|
||||||
GET_FILE_LIST_SIG(external_get_file_list)/*
|
|
||||||
DOC_PARAM(dir, the directory whose files will be enumerated in the returned list)
|
|
||||||
DOC_PARAM(len, the length of the dir string)
|
|
||||||
DOC_RETURN
|
|
||||||
(
|
|
||||||
returns a File_List struct containing pointers to the names of the files in
|
|
||||||
the specified directory. The File_List returned should be passed to free_file_list
|
|
||||||
when it is no longer in use.
|
|
||||||
)
|
|
||||||
*/{
|
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
|
||||||
System_Functions *system = cmd->system;
|
|
||||||
File_List result = {};
|
|
||||||
system->set_file_list(&result, make_string(dir, len));
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
FREE_FILE_LIST_SIG(external_free_file_list)/*
|
|
||||||
DOC_PARAM(list, the file list to be freed)
|
|
||||||
DOC(after this call the file list passed in should not be read or written to)
|
|
||||||
*/{
|
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
|
||||||
System_Functions *system = cmd->system;
|
|
||||||
system->set_file_list(&list, make_string(0, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
CLIPBOARD_POST_SIG(external_clipboard_post)/*
|
|
||||||
DOC_PARAM(str, the string to post to the clipboard)
|
DOC_PARAM(str, the string to post to the clipboard)
|
||||||
DOC_PARAM(len, the length of the string str)
|
DOC_PARAM(len, the length of the string str)
|
||||||
DOC
|
DOC
|
||||||
|
@ -398,7 +347,8 @@ be pasted into other applications.
|
||||||
system->post_clipboard(*dest);
|
system->post_clipboard(*dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
CLIPBOARD_COUNT_SIG(external_clipboard_count)/*
|
API_EXPORT int
|
||||||
|
Clipboard_Count(Application_Links *app)/*
|
||||||
DOC(returns the number of items in the clipboard)
|
DOC(returns the number of items in the clipboard)
|
||||||
*/{
|
*/{
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
|
@ -407,7 +357,8 @@ DOC(returns the number of items in the clipboard)
|
||||||
return(count);
|
return(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
CLIPBOARD_INDEX_SIG(external_clipboard_index)/*
|
API_EXPORT int
|
||||||
|
Clipboard_Index(Application_Links *app, int index, char *out, int len)/*
|
||||||
DOC_PARAM(index, the index of the item to be read)
|
DOC_PARAM(index, the index of the item to be read)
|
||||||
DOC_PARAM(out, a buffer where the clipboard contents are written or NULL)
|
DOC_PARAM(out, a buffer where the clipboard contents are written or NULL)
|
||||||
DOC_PARAM(len, the length of the out buffer)
|
DOC_PARAM(len, the length of the out buffer)
|
||||||
|
@ -460,7 +411,8 @@ internal_get_buffer_next(Working_Set *working_set, Buffer_Summary *buffer){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_BUFFER_FIRST_SIG(external_get_buffer_first)/*
|
API_EXPORT Buffer_Summary
|
||||||
|
Get_Buffer_First(Application_Links *app, unsigned int access)/*
|
||||||
DOC_PARAM(access, the access flags for the access)
|
DOC_PARAM(access, the access flags for the access)
|
||||||
DOC_RETURN(returns the summary of the first buffer in a buffer loop)
|
DOC_RETURN(returns the summary of the first buffer in a buffer loop)
|
||||||
DOC
|
DOC
|
||||||
|
@ -485,7 +437,8 @@ DOC_SEE(get_buffer_next)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_BUFFER_NEXT_SIG(external_get_buffer_next)/*
|
API_EXPORT void
|
||||||
|
Get_Buffer_Next(Application_Links *app, Buffer_Summary *buffer, unsigned int access)/*
|
||||||
DOC_PARAM(buffer, pointer to the loop buffer originally returned by get_buffer_first)
|
DOC_PARAM(buffer, pointer to the loop buffer originally returned by get_buffer_first)
|
||||||
DOC_PARAM(access, the access flags for the access)
|
DOC_PARAM(access, the access flags for the access)
|
||||||
DOC
|
DOC
|
||||||
|
@ -509,7 +462,8 @@ DOC_SEE(get_buffer_first)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_BUFFER_SIG(external_get_buffer)/*
|
API_EXPORT Buffer_Summary
|
||||||
|
Get_Buffer(Application_Links *app, int buffer_id, unsigned int access)/*
|
||||||
DOC_PARAM(buffer_id, the id of the buffer to get)
|
DOC_PARAM(buffer_id, the id of the buffer to get)
|
||||||
DOC_PARAM(access, the access flags for the access)
|
DOC_PARAM(access, the access flags for the access)
|
||||||
DOC_RETURN(returns a summary that describes the indicated buffer if it exists and is accessible)
|
DOC_RETURN(returns a summary that describes the indicated buffer if it exists and is accessible)
|
||||||
|
@ -530,7 +484,8 @@ DOC_RETURN(returns a summary that describes the indicated buffer if it exists an
|
||||||
return(buffer);
|
return(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_BUFFER_BY_NAME_SIG(external_get_buffer_by_name)/*
|
API_EXPORT Buffer_Summary
|
||||||
|
Get_Buffer_By_Name(Application_Links *app, char *name, int len, unsigned int access)/*
|
||||||
DOC_PARAM(name, the name of the buffer)
|
DOC_PARAM(name, the name of the buffer)
|
||||||
DOC_PARAM(len, the length of the name string)
|
DOC_PARAM(len, the length of the name string)
|
||||||
DOC_PARAM(access, the access flags for the access)
|
DOC_PARAM(access, the access flags for the access)
|
||||||
|
@ -552,7 +507,8 @@ DOC_RETURN(returns a summary that describes the indicated buffer if it exists an
|
||||||
return(buffer);
|
return(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
BUFFER_SEEK_SIG(external_buffer_seek)/*
|
API_EXPORT int
|
||||||
|
Buffer_Boundary_Seek(Application_Links *app, Buffer_Summary *buffer, int start_pos, int seek_forward, unsigned int flags)/*
|
||||||
DOC_PARAM(buffer, the buffer to seek through)
|
DOC_PARAM(buffer, the buffer to seek through)
|
||||||
DOC_PARAM(start_pos, the absolute position in the buffer to begin the seek)
|
DOC_PARAM(start_pos, the absolute position in the buffer to begin the seek)
|
||||||
DOC_PARAM(seek_forward, non-zero indicates to seek forward otherwise the seek goes backward)
|
DOC_PARAM(seek_forward, non-zero indicates to seek forward otherwise the seek goes backward)
|
||||||
|
@ -651,7 +607,8 @@ DOC_SEE(Seek_Boundary_Flag)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
BUFFER_READ_RANGE_SIG(external_buffer_read_range)/*
|
API_EXPORT int
|
||||||
|
Buffer_Read_Range(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out)/*
|
||||||
DOC_PARAM(buffer, the buffer to read out of)
|
DOC_PARAM(buffer, the buffer to read out of)
|
||||||
DOC_PARAM(start, the beginning of the read range)
|
DOC_PARAM(start, the beginning of the read range)
|
||||||
DOC_PARAM(end, one past the end of the read range)
|
DOC_PARAM(end, one past the end of the read range)
|
||||||
|
@ -659,8 +616,11 @@ DOC_PARAM(out, the output buffer to fill with the result of the read)
|
||||||
DOC_RETURN(returns non-zero on success)
|
DOC_RETURN(returns non-zero on success)
|
||||||
DOC
|
DOC
|
||||||
(
|
(
|
||||||
The output buffer might have a capacity of at least (end - start)
|
The output buffer must have a capacity of at least (end - start)
|
||||||
The output is not null terminated.
|
The output is not null terminated.
|
||||||
|
|
||||||
|
This call fails if the buffer does not exist, or if the read range
|
||||||
|
is not within the bounds of the buffer.
|
||||||
)
|
)
|
||||||
*/{
|
*/{
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
|
@ -680,7 +640,8 @@ The output is not null terminated.
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
BUFFER_REPLACE_RANGE_SIG(external_buffer_replace_range)/*
|
API_EXPORT int
|
||||||
|
Buffer_Replace_Range(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len)/*
|
||||||
DOC_PARAM(buffer, the buffer to edit)
|
DOC_PARAM(buffer, the buffer to edit)
|
||||||
DOC_PARAM(start, the start of the range to edit)
|
DOC_PARAM(start, the start of the range to edit)
|
||||||
DOC_PARAM(end, the end of the range to edit)
|
DOC_PARAM(end, the end of the range to edit)
|
||||||
|
@ -689,10 +650,14 @@ DOC_PARAM(len, the length of the str string)
|
||||||
DOC_RETURN(returns non-zero if the replacement succeeds)
|
DOC_RETURN(returns non-zero if the replacement succeeds)
|
||||||
DOC
|
DOC
|
||||||
(
|
(
|
||||||
Replace simultaneously deletes the range from start to end and writes str
|
If this call succeeds it deletes the range from start to end
|
||||||
in the same position. If end == start then this call is equivalent to
|
and writes str in the same position. If end == start then
|
||||||
inserting the string at start. If len == 0 this call is equivalent to
|
this call is equivalent to inserting the string at start.
|
||||||
deleteing the range from start to end.
|
If len == 0 this call is equivalent to deleteing the range
|
||||||
|
from start to end.
|
||||||
|
|
||||||
|
This call fails if the buffer does not exist, or if the replace
|
||||||
|
range is not within the bounds of the buffer.
|
||||||
)
|
)
|
||||||
*/{
|
*/{
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
|
@ -721,7 +686,8 @@ deleteing the range from start to end.
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
BUFFER_SET_SETTING_SIG(external_buffer_set_setting)/*
|
API_EXPORT int
|
||||||
|
Buffer_Set_Setting(Application_Links *app, Buffer_Summary *buffer, int setting, int value)/*
|
||||||
DOC_PARAM(buffer, the buffer to set a setting on)
|
DOC_PARAM(buffer, the buffer to set a setting on)
|
||||||
DOC_PARAM(setting, one of the Buffer_Setting_ID enum values that identifies the setting to set)
|
DOC_PARAM(setting, one of the Buffer_Setting_ID enum values that identifies the setting to set)
|
||||||
DOC_PARAM(value, the value to set the specified setting to)
|
DOC_PARAM(value, the value to set the specified setting to)
|
||||||
|
@ -792,7 +758,8 @@ DOC_SEE(Buffer_Setting_ID)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
BUFFER_AUTO_INDENT_SIG(external_buffer_auto_indent)/*
|
API_EXPORT int
|
||||||
|
Buffer_Auto_Indent(Application_Links *app, Buffer_Summary *buffer, int start, int end, int tab_width, unsigned int flags)/*
|
||||||
DOC_PARAM(buffer, the buffer in which to apply the auto indenting)
|
DOC_PARAM(buffer, the buffer in which to apply the auto indenting)
|
||||||
DOC_PARAM(start, the position to start the auto indenting)
|
DOC_PARAM(start, the position to start the auto indenting)
|
||||||
DOC_PARAM(end, the position to end the auto indenting)
|
DOC_PARAM(end, the position to end the auto indenting)
|
||||||
|
@ -832,7 +799,8 @@ DOC_SEE(Auto_Tab_Flag)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
CREATE_BUFFER_SIG(external_create_buffer)/*
|
API_EXPORT Buffer_Summary
|
||||||
|
Create_Buffer(Application_Links *app, char *filename, int filename_len, unsigned int flags)/*
|
||||||
DOC_PARAM(filename, the name of the file to be opened or created)
|
DOC_PARAM(filename, the name of the file to be opened or created)
|
||||||
DOC_PARAM(filename_len, the length of the filename string)
|
DOC_PARAM(filename_len, the length of the filename string)
|
||||||
DOC_PARAM(flags, flags for buffer creation behavior)
|
DOC_PARAM(flags, flags for buffer creation behavior)
|
||||||
|
@ -923,7 +891,8 @@ DOC_SEE(Buffer_Create_Flag)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
SAVE_BUFFER_SIG(external_save_buffer)/*
|
API_EXPORT int
|
||||||
|
Save_Buffer(Application_Links *app, Buffer_Summary *buffer, char *filename, int filename_len, unsigned int flags)/*
|
||||||
DOC_PARAM(buffer, the buffer to save to a file)
|
DOC_PARAM(buffer, the buffer to save to a file)
|
||||||
DOC_PARAM(filename, the name of the file to save the buffer into)
|
DOC_PARAM(filename, the name of the file to save the buffer into)
|
||||||
DOC_PARAM(filename_len, length of the filename string)
|
DOC_PARAM(filename_len, length of the filename string)
|
||||||
|
@ -945,7 +914,8 @@ DOC_RETURN(returns non-zero if the save succeeds)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
KILL_BUFFER_SIG(external_kill_buffer)/*
|
API_EXPORT int
|
||||||
|
Kill_Buffer(Application_Links *app, Buffer_Identifier buffer, int view_id, unsigned int flags)/*
|
||||||
DOC_PARAM(buffer, a buffer identifier specifying the buffer to try to kill)
|
DOC_PARAM(buffer, a buffer identifier specifying the buffer to try to kill)
|
||||||
DOC_PARAM(view_id, the id of view that will contain the "are you sure" dialogue)
|
DOC_PARAM(view_id, the id of view that will contain the "are you sure" dialogue)
|
||||||
DOC_PARAM(flags, flags for buffer kill behavior)
|
DOC_PARAM(flags, flags for buffer kill behavior)
|
||||||
|
@ -1020,7 +990,8 @@ internal_get_view_next(Command_Data *cmd, View_Summary *view){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_VIEW_FIRST_SIG(external_get_view_first)/*
|
API_EXPORT View_Summary
|
||||||
|
Get_View_First(Application_Links *app, unsigned int access)/*
|
||||||
DOC_PARAM(access, the access flags for the access)
|
DOC_PARAM(access, the access flags for the access)
|
||||||
DOC_RETURN(returns the summary of the first view in a view loop)
|
DOC_RETURN(returns the summary of the first view in a view loop)
|
||||||
DOC
|
DOC
|
||||||
|
@ -1044,7 +1015,8 @@ DOC_SEE(get_view_next)
|
||||||
return(view);
|
return(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_VIEW_NEXT_SIG(external_get_view_next)/*
|
API_EXPORT void
|
||||||
|
Get_View_Next(Application_Links *app, View_Summary *view, unsigned int access)/*
|
||||||
DOC_PARAM(view, pointer to the loop view originally returned by get_view_first)
|
DOC_PARAM(view, pointer to the loop view originally returned by get_view_first)
|
||||||
DOC_PARAM(access, the access flags for the access)
|
DOC_PARAM(access, the access flags for the access)
|
||||||
DOC
|
DOC
|
||||||
|
@ -1067,7 +1039,8 @@ DOC_SEE(get_view_first)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_VIEW_SIG(external_get_view)/*
|
API_EXPORT View_Summary
|
||||||
|
Get_View(Application_Links *app, int view_id, unsigned int access)/*
|
||||||
DOC_PARAM(view_id, the id of the view to get)
|
DOC_PARAM(view_id, the id of the view to get)
|
||||||
DOC_PARAM(access, the access flags for the access)
|
DOC_PARAM(access, the access flags for the access)
|
||||||
DOC_RETURN(returns a summary that describes the indicated view if it is open and is accessible)
|
DOC_RETURN(returns a summary that describes the indicated view if it is open and is accessible)
|
||||||
|
@ -1090,7 +1063,8 @@ DOC_RETURN(returns a summary that describes the indicated view if it is open and
|
||||||
return(view);
|
return(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_ACTIVE_VIEW_SIG(external_get_active_view)/*
|
API_EXPORT View_Summary
|
||||||
|
Get_Active_View(Application_Links *app, unsigned int access)/*
|
||||||
DOC_PARAM(access, the access flags for the access)
|
DOC_PARAM(access, the access flags for the access)
|
||||||
DOC_RETURN(returns a summary that describes the active view)
|
DOC_RETURN(returns a summary that describes the active view)
|
||||||
*/{
|
*/{
|
||||||
|
@ -1103,7 +1077,8 @@ DOC_RETURN(returns a summary that describes the active view)
|
||||||
return(view);
|
return(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIEW_COMPUTE_CURSOR_SIG(external_view_compute_cursor)/*
|
API_EXPORT int
|
||||||
|
View_Compute_Cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, Full_Cursor *cursor_out)/*
|
||||||
DOC_PARAM(view, the view on which to run the cursor computation)
|
DOC_PARAM(view, the view on which to run the cursor computation)
|
||||||
DOC_PARAM(seek, the seek position)
|
DOC_PARAM(seek, the seek position)
|
||||||
DOC_PARAM(cursor_out, on success this is filled with result of the seek)
|
DOC_PARAM(cursor_out, on success this is filled with result of the seek)
|
||||||
|
@ -1134,7 +1109,8 @@ DOC_SEE(Buffer_Seek)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIEW_SET_CURSOR_SIG(external_view_set_cursor)/*
|
API_EXPORT int
|
||||||
|
View_Set_Cursor(Application_Links *app, View_Summary *view, Buffer_Seek seek, int set_preferred_x)/*
|
||||||
DOC_PARAM(view, the view in which to set the cursor)
|
DOC_PARAM(view, the view in which to set the cursor)
|
||||||
DOC_PARAM(seek, the seek position)
|
DOC_PARAM(seek, the seek position)
|
||||||
DOC_PARAM(set_preferred_x, if true the preferred x is updated to match the new cursor position)
|
DOC_PARAM(set_preferred_x, if true the preferred x is updated to match the new cursor position)
|
||||||
|
@ -1170,7 +1146,8 @@ DOC_SEE(Buffer_Seek)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIEW_SET_MARK_SIG(external_view_set_mark)/*
|
API_EXPORT int
|
||||||
|
View_Set_Mark(Application_Links *app, View_Summary *view, Buffer_Seek seek)/*
|
||||||
DOC_PARAM(view, the view in which to set the mark)
|
DOC_PARAM(view, the view in which to set the mark)
|
||||||
DOC_PARAM(seek, the seek position)
|
DOC_PARAM(seek, the seek position)
|
||||||
DOC_RETURN(returns non-zero on success)
|
DOC_RETURN(returns non-zero on success)
|
||||||
|
@ -1200,7 +1177,8 @@ DOC_SEE(Buffer_Seek)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIEW_SET_HIGHLIGHT_SIG(external_view_set_highlight)/*
|
API_EXPORT int
|
||||||
|
View_Set_Highlight(Application_Links *app, View_Summary *view, int start, int end, int turn_on)/*
|
||||||
DOC_PARAM(view, the view to set the highlight in)
|
DOC_PARAM(view, the view to set the highlight in)
|
||||||
DOC_PARAM(start, the start of the highlight range)
|
DOC_PARAM(start, the start of the highlight range)
|
||||||
DOC_PARAM(end, the end of the highlight range)
|
DOC_PARAM(end, the end of the highlight range)
|
||||||
|
@ -1232,7 +1210,8 @@ the turn_on set to false, will switch back to showing the cursor.
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIEW_SET_BUFFER_SIG(external_view_set_buffer)/*
|
API_EXPORT int
|
||||||
|
View_Set_Buffer(Application_Links *app, View_Summary *view, int buffer_id, unsigned int flags)/*
|
||||||
DOC_PARAM(view, the view to display the buffer in)
|
DOC_PARAM(view, the view to display the buffer in)
|
||||||
DOC_PARAM(buffer_id, the buffer to show in the view)
|
DOC_PARAM(buffer_id, the buffer to show in the view)
|
||||||
DOC_PARAM(flags, set buffer behavior flags)
|
DOC_PARAM(flags, set buffer behavior flags)
|
||||||
|
@ -1269,7 +1248,8 @@ DOC_SEE(Set_Buffer_Flag)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIEW_POST_FADE_SIG(external_view_post_fade)/*
|
API_EXPORT int
|
||||||
|
View_Post_Fade(Application_Links *app, View_Summary *view, float seconds, int start, int end, unsigned int color)/*
|
||||||
DOC_PARAM(view, the veiw to post a fade effect to)
|
DOC_PARAM(view, the veiw to post a fade effect to)
|
||||||
DOC_PARAM(seconds, the number of seconds the fade effect should last)
|
DOC_PARAM(seconds, the number of seconds the fade effect should last)
|
||||||
DOC_PARAM(start, the first character in the fade range)
|
DOC_PARAM(start, the first character in the fade range)
|
||||||
|
@ -1292,7 +1272,8 @@ DOC_PARAM(color, the color to fade from)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
VIEW_SET_PASTE_REWRITE__SIG(external_view_set_paste_rewrite_){
|
API_EXPORT void
|
||||||
|
View_Set_Paste_Rewrite_(Application_Links *app, View_Summary *view){
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
View *vptr = imp_get_view(cmd, view);
|
View *vptr = imp_get_view(cmd, view);
|
||||||
if (vptr){
|
if (vptr){
|
||||||
|
@ -1300,7 +1281,8 @@ VIEW_SET_PASTE_REWRITE__SIG(external_view_set_paste_rewrite_){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VIEW_GET_PASTE_REWRITE__SIG(external_view_get_paste_rewrite_){
|
API_EXPORT int
|
||||||
|
View_Get_Paste_Rewrite_(Application_Links *app, View_Summary *view){
|
||||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
View *vptr = imp_get_view(cmd, view);
|
View *vptr = imp_get_view(cmd, view);
|
||||||
int result = false;
|
int result = false;
|
||||||
|
@ -1310,7 +1292,8 @@ VIEW_GET_PASTE_REWRITE__SIG(external_view_get_paste_rewrite_){
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_USER_INPUT_SIG(external_get_user_input)/*
|
API_EXPORT User_Input
|
||||||
|
Get_User_Input(Application_Links *app, unsigned int get_type, unsigned int abort_type)/*
|
||||||
DOC_PARAM(get_type, input type flag that specifies the types of inputs that should be returned)
|
DOC_PARAM(get_type, input type flag that specifies the types of inputs that should be returned)
|
||||||
DOC_PARAM(abort_type, input type flag that specifies the types of inputs that should cause an abort signal)
|
DOC_PARAM(abort_type, input type flag that specifies the types of inputs that should cause an abort signal)
|
||||||
DOC_RETURN(returns a User_Input that describes an event passed to the command)
|
DOC_RETURN(returns a User_Input that describes an event passed to the command)
|
||||||
|
@ -1341,7 +1324,8 @@ DOC_SEE(User_Input)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_COMMAND_INPUT_SIG(external_get_command_input)/*
|
API_EXPORT User_Input
|
||||||
|
Get_Command_Input (Application_Links *app)/*
|
||||||
DOC_RETURN(returns the input that triggered the command in execution.)
|
DOC_RETURN(returns the input that triggered the command in execution.)
|
||||||
DOC_SEE(User_Input)
|
DOC_SEE(User_Input)
|
||||||
*/{
|
*/{
|
||||||
|
@ -1356,7 +1340,8 @@ DOC_SEE(User_Input)
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_MOUSE_STATE_SIG(external_get_mouse_state)/*
|
API_EXPORT Mouse_State
|
||||||
|
Get_Mouse_State(Application_Links *app)/*
|
||||||
DOC_RETURN(returns the current mouse state)
|
DOC_RETURN(returns the current mouse state)
|
||||||
DOC_SEE(Mouse_State)
|
DOC_SEE(Mouse_State)
|
||||||
*/{
|
*/{
|
||||||
|
@ -1367,7 +1352,9 @@ DOC_SEE(Mouse_State)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
GET_EVENT_MESSAGE_SIG(external_get_event_message){
|
//API_EXPORT
|
||||||
|
Event_Message
|
||||||
|
Get_Event_Message (Application_Links *app){
|
||||||
Event_Message message = {0};
|
Event_Message message = {0};
|
||||||
System_Functions *system = (System_Functions*)app->system_links;
|
System_Functions *system = (System_Functions*)app->system_links;
|
||||||
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
|
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
|
||||||
|
@ -1382,7 +1369,8 @@ GET_EVENT_MESSAGE_SIG(external_get_event_message){
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
START_QUERY_BAR_SIG(external_start_query_bar)/*
|
API_EXPORT int
|
||||||
|
Start_Query_Bar(Application_Links *app, Query_Bar *bar, unsigned int flags)/*
|
||||||
DOC_PARAM(bar, a pointer to the Query_Bar struct that defines the bar's contents)
|
DOC_PARAM(bar, a pointer to the Query_Bar struct that defines the bar's contents)
|
||||||
DOC_PARAM(flags, not currently used)
|
DOC_PARAM(flags, not currently used)
|
||||||
DOC_RETURN(returns non-zero on success)
|
DOC_RETURN(returns non-zero on success)
|
||||||
|
@ -1404,7 +1392,8 @@ until the command returns.
|
||||||
return(slot != 0);
|
return(slot != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
END_QUERY_BAR_SIG(external_end_query_bar)/*
|
API_EXPORT void
|
||||||
|
End_Query_Bar(Application_Links *app, Query_Bar *bar, unsigned int flags)/*
|
||||||
DOC_PARAM(bar, a pointer to the Query_Bar struct to end)
|
DOC_PARAM(bar, a pointer to the Query_Bar struct to end)
|
||||||
DOC_PARAM(flags, not currently used)
|
DOC_PARAM(flags, not currently used)
|
||||||
DOC
|
DOC
|
||||||
|
@ -1418,7 +1407,8 @@ bar must be a pointer previously passed to start_query_bar previously in the sam
|
||||||
free_query_slot(&vptr->query_set, bar);
|
free_query_slot(&vptr->query_set, bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
PRINT_MESSAGE_SIG(external_print_message)/*
|
API_EXPORT void
|
||||||
|
Print_Message(Application_Links *app, char *str, int len)/*
|
||||||
DOC_PARAM(str, the string to post to *messages*)
|
DOC_PARAM(str, the string to post to *messages*)
|
||||||
DOC_PARAM(len, the length of str string)
|
DOC_PARAM(len, the length of str string)
|
||||||
*/{
|
*/{
|
||||||
|
@ -1427,7 +1417,8 @@ DOC_PARAM(len, the length of str string)
|
||||||
do_feedback_message(cmd->system, models, make_string(str, len));
|
do_feedback_message(cmd->system, models, make_string(str, len));
|
||||||
}
|
}
|
||||||
|
|
||||||
CHANGE_THEME_SIG(external_change_theme)/*
|
API_EXPORT void
|
||||||
|
Change_Theme(Application_Links *app, char *name, int len)/*
|
||||||
DOC_PARAM(name, the name of the built in theme to change to)
|
DOC_PARAM(name, the name of the built in theme to change to)
|
||||||
DOC_PARAM(len, the length of the name string)
|
DOC_PARAM(len, the length of the name string)
|
||||||
*/{
|
*/{
|
||||||
|
@ -1447,7 +1438,8 @@ DOC_PARAM(len, the length of the name string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CHANGE_FONT_SIG(external_change_font)/*
|
API_EXPORT void
|
||||||
|
Change_Font(Application_Links *app, char *name, int len)/*
|
||||||
DOC_PARAM(name, the name of the built in font to change to)
|
DOC_PARAM(name, the name of the built in font to change to)
|
||||||
DOC_PARAM(len, the length of the name string)
|
DOC_PARAM(len, the length of the name string)
|
||||||
*/{
|
*/{
|
||||||
|
@ -1463,7 +1455,8 @@ DOC_PARAM(len, the length of the name string)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_THEME_COLORS_SIG(external_set_theme_colors)/*
|
API_EXPORT void
|
||||||
|
Set_Theme_Colors(Application_Links *app, Theme_Color *colors, int count)/*
|
||||||
DOC_PARAM(colors, an array of color structs pairing differet style tags to color codes)
|
DOC_PARAM(colors, an array of color structs pairing differet style tags to color codes)
|
||||||
DOC_PARAM(count, the number of color structs in the colors array)
|
DOC_PARAM(count, the number of color structs in the colors array)
|
||||||
DOC
|
DOC
|
||||||
|
@ -1485,7 +1478,8 @@ code paired with the tag.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GET_THEME_COLORS_SIG(external_get_theme_colors)/*
|
API_EXPORT void
|
||||||
|
Get_Theme_Colors(Application_Links *app, Theme_Color *colors, int count)/*
|
||||||
DOC_PARAM(colors, an array of color structs listing style tags to get color values for)
|
DOC_PARAM(colors, an array of color structs listing style tags to get color values for)
|
||||||
DOC_PARAM(count, the number of color structs in the colors array)
|
DOC_PARAM(count, the number of color structs in the colors array)
|
||||||
DOC
|
DOC
|
||||||
|
@ -1512,5 +1506,62 @@ color from the specified color in the pallet.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
API_EXPORT int
|
||||||
|
Directory_Get_Hot(Application_Links *app, char *out, int capacity)/*
|
||||||
|
DOC_PARAM(out, a buffer that receives the 4coder 'hot directory')
|
||||||
|
DOC_PARAM(capacity, the maximum size to be output to the output buffer)
|
||||||
|
DOC_RETURN(returns the size of the string written into the buffer)
|
||||||
|
DOC
|
||||||
|
(
|
||||||
|
4coder has a concept of a 'hot directory' which is the directory most recently
|
||||||
|
accessed in the GUI. Whenever the GUI is opened it shows the hot directory.
|
||||||
|
|
||||||
|
In the future this will be deprecated and eliminated in favor of more flexible
|
||||||
|
directories controlled by the custom side.
|
||||||
|
)
|
||||||
|
*/{
|
||||||
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
|
Hot_Directory *hot = &cmd->models->hot_directory;
|
||||||
|
i32 copy_max = capacity - 1;
|
||||||
|
hot_directory_clean_end(hot);
|
||||||
|
if (copy_max > hot->string.size)
|
||||||
|
copy_max = hot->string.size;
|
||||||
|
memcpy(out, hot->string.str, copy_max);
|
||||||
|
out[copy_max] = 0;
|
||||||
|
return(hot->string.size);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define Get_4ed_Path system->get_4ed_path
|
||||||
|
#define File_Exists system->file_exists
|
||||||
|
#define Directory_CD system->directory_cd
|
||||||
|
|
||||||
|
API_EXPORT File_List
|
||||||
|
Get_File_List(Application_Links *app, char *dir, int len)/*
|
||||||
|
DOC_PARAM(dir, the directory whose files will be enumerated in the returned list)
|
||||||
|
DOC_PARAM(len, the length of the dir string)
|
||||||
|
DOC_RETURN
|
||||||
|
(
|
||||||
|
returns a File_List struct containing pointers to the names of the files in
|
||||||
|
the specified directory. The File_List returned should be passed to free_file_list
|
||||||
|
when it is no longer in use.
|
||||||
|
)
|
||||||
|
*/{
|
||||||
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
|
System_Functions *system = cmd->system;
|
||||||
|
File_List result = {};
|
||||||
|
system->set_file_list(&result, make_string(dir, len));
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
API_EXPORT void
|
||||||
|
Free_File_List(Application_Links *app, File_List list)/*
|
||||||
|
DOC_PARAM(list, the file list to be freed)
|
||||||
|
DOC(after this call the file list passed in should not be read or written to)
|
||||||
|
*/{
|
||||||
|
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||||
|
System_Functions *system = cmd->system;
|
||||||
|
system->set_file_list(&list, make_string(0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
// BOTTOM
|
// BOTTOM
|
||||||
|
|
||||||
|
|
783
4ed_metagen.cpp
783
4ed_metagen.cpp
|
@ -19,6 +19,8 @@
|
||||||
#define FCPP_LEXER_IMPLEMENTATION
|
#define FCPP_LEXER_IMPLEMENTATION
|
||||||
#include "4cpp_lexer.h"
|
#include "4cpp_lexer.h"
|
||||||
|
|
||||||
|
#include "4coder_version.h"
|
||||||
|
|
||||||
struct Struct_Field{
|
struct Struct_Field{
|
||||||
char *type;
|
char *type;
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -328,16 +330,36 @@ char* generate_style(){
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
struct Function_Set{
|
typedef struct Argument_Breakdown{
|
||||||
|
int count;
|
||||||
|
String *param_string;
|
||||||
|
String *param_name;
|
||||||
|
} Argument_Breakdown;
|
||||||
|
|
||||||
|
typedef struct Documentation{
|
||||||
|
int param_count;
|
||||||
|
String *param_name;
|
||||||
|
String *param_docs;
|
||||||
|
String return_doc;
|
||||||
|
String main_doc;
|
||||||
|
int see_also_count;
|
||||||
|
String *see_also;
|
||||||
|
} Documentation;
|
||||||
|
|
||||||
|
typedef struct Function_Set{
|
||||||
String *name;
|
String *name;
|
||||||
String *ret;
|
String *ret;
|
||||||
String *args;
|
String *args;
|
||||||
|
|
||||||
String *macros;
|
String *macros;
|
||||||
String *public_name;
|
String *public_name;
|
||||||
|
String *doc_string;
|
||||||
|
|
||||||
int *valid;
|
int *valid;
|
||||||
};
|
|
||||||
|
Argument_Breakdown *breakdown;
|
||||||
|
Documentation *doc;
|
||||||
|
} Function_Set;
|
||||||
|
|
||||||
void
|
void
|
||||||
zero_index(Function_Set fnc_set, int sig_count){
|
zero_index(Function_Set fnc_set, int sig_count){
|
||||||
|
@ -416,6 +438,13 @@ chop_whitespace(String str){
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String
|
||||||
|
skip_chop_whitespace(String str){
|
||||||
|
str = skip_whitespace(str);
|
||||||
|
str = chop_whitespace(str);
|
||||||
|
return(str);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
is_comment(String str){
|
is_comment(String str){
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
@ -428,9 +457,8 @@ is_comment(String str){
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Doc_Parse{
|
struct Parse{
|
||||||
Cpp_Token_Stack tokens;
|
Cpp_Token_Stack tokens;
|
||||||
String doc_string;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -454,6 +482,13 @@ check_and_fix_docs(String *lexeme){
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Doc_Note_Type{
|
||||||
|
DOC_PARAM,
|
||||||
|
DOC_RETURN,
|
||||||
|
DOC,
|
||||||
|
DOC_SEE
|
||||||
|
};
|
||||||
|
|
||||||
static String
|
static String
|
||||||
doc_note_string[] = {
|
doc_note_string[] = {
|
||||||
make_lit_string("DOC_PARAM"),
|
make_lit_string("DOC_PARAM"),
|
||||||
|
@ -462,27 +497,195 @@ doc_note_string[] = {
|
||||||
make_lit_string("DOC_SEE"),
|
make_lit_string("DOC_SEE"),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
String
|
||||||
|
doc_parse_note(String source, int *pos){
|
||||||
|
String result = {0};
|
||||||
|
|
||||||
|
int p = *pos;
|
||||||
|
int start = p;
|
||||||
|
for (; p < source.size; ++p){
|
||||||
|
if (source.str[p] == '('){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p != source.size){
|
||||||
|
result = make_string(source.str + start, p - start);
|
||||||
|
result = skip_chop_whitespace(result);
|
||||||
|
}
|
||||||
|
*pos = p;
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
String
|
||||||
|
doc_parse_note_string(String source, int *pos){
|
||||||
|
String result = {0};
|
||||||
|
|
||||||
|
assert(source.str[*pos] == '(');
|
||||||
|
|
||||||
|
int p = *pos + 1;
|
||||||
|
int start = p;
|
||||||
|
|
||||||
|
int nest_level = 0;
|
||||||
|
|
||||||
|
for (; p < source.size; ++p){
|
||||||
|
if (source.str[p] == ')'){
|
||||||
|
if (nest_level == 0){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
--nest_level;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (source.str[p] == '('){
|
||||||
|
++nest_level;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p != source.size){
|
||||||
|
result = make_string(source.str + start, p - start);
|
||||||
|
result = skip_chop_whitespace(result);
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
*pos = p;
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
String
|
||||||
|
doc_parse_parameter(String source, int *pos){
|
||||||
|
String result = {0};
|
||||||
|
|
||||||
|
int p = *pos;
|
||||||
|
int start = p;
|
||||||
|
|
||||||
|
for (; p < source.size; ++p){
|
||||||
|
if (source.str[p] == ','){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p != source.size){
|
||||||
|
result = make_string(source.str + start, p - start);
|
||||||
|
result = skip_chop_whitespace(result);
|
||||||
|
++p;
|
||||||
|
}
|
||||||
|
*pos = p;
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
String
|
||||||
|
doc_parse_last_parameter(String source, int *pos){
|
||||||
|
String result = {0};
|
||||||
|
|
||||||
|
int p = *pos;
|
||||||
|
int start = p;
|
||||||
|
|
||||||
|
for (; p < source.size; ++p){
|
||||||
|
if (source.str[p] == ')'){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p == source.size){
|
||||||
|
result = make_string(source.str + start, p - start);
|
||||||
|
result = skip_chop_whitespace(result);
|
||||||
|
}
|
||||||
|
*pos = p;
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
perform_doc_parse(Doc_Parse *parse, String lexeme){
|
perform_doc_parse(String doc_string, Documentation *doc){
|
||||||
#if 0
|
|
||||||
int keep_parsing = true;
|
int keep_parsing = true;
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
|
|
||||||
|
int param_count = 0;
|
||||||
|
int see_count = 0;
|
||||||
|
|
||||||
do{
|
do{
|
||||||
String doc_note = doc_parse_identifier(lexeme, &pos);
|
String doc_note = doc_parse_note(doc_string, &pos);
|
||||||
if (doc_note.size == 0){
|
if (doc_note.size == 0){
|
||||||
keep_parsing = false;
|
keep_parsing = false;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if (string_set_match(doc_note_string, ArrayCount(doc_note_string), doc_note, &match)){
|
int doc_note_type;
|
||||||
|
if (string_set_match(doc_note_string, ArrayCount(doc_note_string), doc_note, &doc_note_type)){
|
||||||
|
|
||||||
}
|
doc_parse_note_string(doc_string, &pos);
|
||||||
else{
|
|
||||||
// TODO(allen): do warning
|
switch (doc_note_type){
|
||||||
|
case DOC_PARAM:
|
||||||
|
++param_count;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DOC_SEE:
|
||||||
|
++see_count;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}while(keep_parsing);
|
||||||
|
|
||||||
|
if (param_count + see_count > 0){
|
||||||
|
int memory_size = sizeof(String)*(2*param_count + see_count);
|
||||||
|
doc->param_name = (String*)malloc(memory_size);
|
||||||
|
doc->param_docs = doc->param_name + param_count;
|
||||||
|
doc->see_also = doc->param_docs + param_count;
|
||||||
|
|
||||||
|
doc->param_count = param_count;
|
||||||
|
doc->see_also_count = see_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int param_index = 0;
|
||||||
|
int see_index = 0;
|
||||||
|
|
||||||
|
keep_parsing = true;
|
||||||
|
pos = 0;
|
||||||
|
do{
|
||||||
|
String doc_note = doc_parse_note(doc_string, &pos);
|
||||||
|
if (doc_note.size == 0){
|
||||||
|
keep_parsing = false;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
int doc_note_type;
|
||||||
|
if (string_set_match(doc_note_string, ArrayCount(doc_note_string), doc_note, &doc_note_type)){
|
||||||
|
|
||||||
|
String doc_note_string = doc_parse_note_string(doc_string, &pos);
|
||||||
|
|
||||||
|
switch (doc_note_type){
|
||||||
|
case DOC_PARAM:
|
||||||
|
{
|
||||||
|
assert(param_index < param_count);
|
||||||
|
int param_pos = 0;
|
||||||
|
String param_name = doc_parse_parameter(doc_note_string, ¶m_pos);
|
||||||
|
String param_docs = doc_parse_last_parameter(doc_note_string, ¶m_pos);
|
||||||
|
doc->param_name[param_index] = param_name;
|
||||||
|
doc->param_docs[param_index] = param_docs;
|
||||||
|
++param_index;
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case DOC_RETURN:
|
||||||
|
{
|
||||||
|
doc->return_doc = doc_note_string;
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case DOC:
|
||||||
|
{
|
||||||
|
doc->main_doc = doc_note_string;
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case DOC_SEE:
|
||||||
|
{
|
||||||
|
assert(see_index < see_count);
|
||||||
|
doc->see_also[see_index++] = doc_note_string;
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
printf("warning: invalid doc note %.*s\n", doc_note.size, doc_note.str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}while(keep_parsing);
|
}while(keep_parsing);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char*
|
char*
|
||||||
|
@ -492,92 +695,242 @@ generate_custom_headers(){
|
||||||
|
|
||||||
char *filename = API_H " & " API_DOC;
|
char *filename = API_H " & " API_DOC;
|
||||||
|
|
||||||
// NOTE(allen): Header
|
|
||||||
String data = file_dump("custom_api_spec.cpp");
|
|
||||||
|
|
||||||
int line_count = 0;
|
|
||||||
String line = {0};
|
|
||||||
for (line = get_first_line(data);
|
|
||||||
line.str;
|
|
||||||
line = get_next_line(data, line)){
|
|
||||||
++line_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
Function_Set function_set = {0};
|
Function_Set function_set = {0};
|
||||||
|
|
||||||
function_set.name = (String*)malloc((sizeof(String)*5 + sizeof(int))*line_count);
|
// NOTE(allen): Documentation
|
||||||
function_set.ret = function_set.name + line_count;
|
String code_data[2];
|
||||||
function_set.args = function_set.ret + line_count;
|
code_data[0] = file_dump("4ed_api_implementation.cpp");
|
||||||
function_set.macros = function_set.args + line_count;
|
code_data[1] = file_dump("win32_api_impl.cpp");
|
||||||
function_set.public_name = function_set.macros + line_count;
|
Parse parses[2];
|
||||||
function_set.valid = (int*)(function_set.public_name + line_count);
|
|
||||||
|
|
||||||
int max_name_size = 0;
|
int max_name_size = 0;
|
||||||
int sig_count = 0;
|
int line_count = 0;
|
||||||
line_count = 0;
|
|
||||||
for (line = get_first_line(data);
|
for (int J = 0; J < 2; ++J){
|
||||||
line.str;
|
String *code = &code_data[J];
|
||||||
line = get_next_line(data, line)){
|
Parse *parse = &parses[J];
|
||||||
|
|
||||||
++line_count;
|
// TODO(allen): KILL THIS FUCKIN' Cpp_File FUCKIN' NONSENSE HORSE SHIT!!!!!
|
||||||
|
Cpp_File file;
|
||||||
|
file.data = code->str;
|
||||||
|
file.size = code->size;
|
||||||
|
|
||||||
String parse = line;
|
parse->tokens = cpp_make_token_stack(512);
|
||||||
parse = skip_whitespace(parse);
|
cpp_lex_file(file, &parse->tokens);
|
||||||
parse = chop_whitespace(parse);
|
|
||||||
if (parse.size > 0){
|
int count = parse->tokens.count;
|
||||||
if (!is_comment(parse)){
|
Cpp_Token *tokens = parse->tokens.tokens;
|
||||||
zero_index(function_set, sig_count);
|
|
||||||
int valid = false;
|
Cpp_Token *token = tokens;
|
||||||
|
|
||||||
int pos = find(parse, 0, ' ');
|
for (int i = 0; i < count; ++i, ++token){
|
||||||
function_set.ret[sig_count] = substr(parse, 0, pos);
|
if (token->type == CPP_TOKEN_IDENTIFIER &&
|
||||||
parse = substr(parse, pos);
|
!(token->flags & CPP_TFLAG_PP_BODY)){
|
||||||
parse = skip_whitespace(parse);
|
String lexeme = make_string(file.data + token->start, token->size);
|
||||||
|
if (match(lexeme, "API_EXPORT")){
|
||||||
if (parse.size > 0){
|
for (; i < count; ++i, ++token){
|
||||||
pos = find(parse, 0, '(');
|
if (token->type == CPP_TOKEN_PARENTHESE_OPEN){
|
||||||
|
|
||||||
String name_string = substr(parse, 0, pos);
|
|
||||||
function_set.name[sig_count] = chop_whitespace(name_string);
|
|
||||||
parse = substr(parse, pos);
|
|
||||||
|
|
||||||
if (parse.size > 0){
|
|
||||||
char end = parse.str[parse.size - 1];
|
|
||||||
valid = true;
|
|
||||||
|
|
||||||
switch (end){
|
|
||||||
case ')':
|
|
||||||
function_set.args[sig_count] = parse;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ';':
|
|
||||||
--parse.size;
|
|
||||||
function_set.args[sig_count] = parse;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
valid = false;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
function_set.valid[sig_count] = valid;
|
}
|
||||||
|
|
||||||
|
if (i < count){
|
||||||
|
--i;
|
||||||
|
--token;
|
||||||
|
|
||||||
if (max_name_size < name_string.size){
|
if (token->type == CPP_TOKEN_IDENTIFIER){
|
||||||
max_name_size = name_string.size;
|
++line_count;
|
||||||
|
|
||||||
|
if (max_name_size < token->size){
|
||||||
|
max_name_size = token->size;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!valid){
|
|
||||||
printf("custom_api_spec.cpp(%d) : generator warning : invalid function signature\n",
|
|
||||||
line_count);
|
|
||||||
}
|
|
||||||
|
|
||||||
++sig_count;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *file = fopen(API_H, "wb");
|
int memory_size = (sizeof(String)*6 + sizeof(int) + sizeof(Argument_Breakdown) + sizeof(Documentation))*line_count;
|
||||||
|
|
||||||
|
function_set.name = (String*)malloc(memory_size);
|
||||||
|
function_set.ret = function_set.name + line_count;
|
||||||
|
function_set.args = function_set.ret + line_count;
|
||||||
|
function_set.macros = function_set.args + line_count;
|
||||||
|
function_set.public_name = function_set.macros + line_count;
|
||||||
|
function_set.doc_string = function_set.public_name + line_count;
|
||||||
|
function_set.valid = (int*)(function_set.doc_string + line_count);
|
||||||
|
function_set.breakdown = (Argument_Breakdown*)(function_set.valid + line_count);
|
||||||
|
function_set.doc = (Documentation*)(function_set.breakdown + line_count);
|
||||||
|
|
||||||
|
memset(function_set.name, 0, memory_size);
|
||||||
|
|
||||||
|
int sig_count = 0;
|
||||||
|
for (int J = 0; J < 2; ++J){
|
||||||
|
String *code = &code_data[J];
|
||||||
|
Parse *parse = &parses[J];
|
||||||
|
|
||||||
|
// TODO(allen): KILL THIS FUCKIN' Cpp_File FUCKIN' NONSENSE HORSE SHIT!!!!!
|
||||||
|
Cpp_File file;
|
||||||
|
file.data = code->str;
|
||||||
|
file.size = code->size;
|
||||||
|
|
||||||
|
int count = parse->tokens.count;
|
||||||
|
Cpp_Token *tokens = parse->tokens.tokens;
|
||||||
|
|
||||||
|
Cpp_Token *token = 0;
|
||||||
|
|
||||||
|
// NOTE(allen): Header Parse
|
||||||
|
token = tokens;
|
||||||
|
for (int i = 0; i < count; ++i, ++token){
|
||||||
|
if (token->type == CPP_TOKEN_IDENTIFIER &&
|
||||||
|
!(token->flags & CPP_TFLAG_PP_BODY)){
|
||||||
|
String lexeme = make_string(file.data + token->start, token->size);
|
||||||
|
if (match(lexeme, "API_EXPORT")){
|
||||||
|
++i;
|
||||||
|
++token;
|
||||||
|
if (i < count){
|
||||||
|
Cpp_Token *ret_start_token = token;
|
||||||
|
|
||||||
|
for (; i < count; ++i, ++token){
|
||||||
|
if (token->type == CPP_TOKEN_PARENTHESE_OPEN){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Cpp_Token *args_start_token = token;
|
||||||
|
|
||||||
|
if (i < count){
|
||||||
|
--i;
|
||||||
|
--token;
|
||||||
|
|
||||||
|
function_set.name[sig_count] = make_string(file.data + token->start, token->size);
|
||||||
|
|
||||||
|
int size = token->start - ret_start_token->start;
|
||||||
|
String ret = make_string(file.data + ret_start_token->start, size);
|
||||||
|
ret = chop_whitespace(ret);
|
||||||
|
function_set.ret[sig_count] = ret;
|
||||||
|
|
||||||
|
for (; i < count; ++i, ++token){
|
||||||
|
if (token->type == CPP_TOKEN_PARENTHESE_CLOSE){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < count){
|
||||||
|
int size = token->start + token->size - args_start_token->start;;
|
||||||
|
function_set.args[sig_count] =
|
||||||
|
make_string(file.data + args_start_token->start, size);
|
||||||
|
function_set.valid[sig_count] = true;
|
||||||
|
|
||||||
|
int arg_count = 1;
|
||||||
|
Cpp_Token *arg_token = args_start_token;
|
||||||
|
for (; arg_token < token; ++arg_token){
|
||||||
|
if (arg_token->type == CPP_TOKEN_COMMA){
|
||||||
|
++arg_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Argument_Breakdown *breakdown = &function_set.breakdown[sig_count];
|
||||||
|
breakdown->count = arg_count;
|
||||||
|
|
||||||
|
int memory_size = (sizeof(String)*2)*arg_count;
|
||||||
|
|
||||||
|
breakdown->param_string = (String*)malloc(memory_size);
|
||||||
|
breakdown->param_name = breakdown->param_string + arg_count;
|
||||||
|
|
||||||
|
memset(breakdown->param_string, 0, memory_size);
|
||||||
|
|
||||||
|
int arg_index = 0;
|
||||||
|
arg_token = args_start_token + 1;
|
||||||
|
int param_string_start = arg_token->start;
|
||||||
|
|
||||||
|
for (; arg_token <= token; ++arg_token){
|
||||||
|
if (arg_token->type == CPP_TOKEN_COMMA ||
|
||||||
|
arg_token->type == CPP_TOKEN_PARENTHESE_CLOSE){
|
||||||
|
|
||||||
|
int size = arg_token->start - param_string_start;
|
||||||
|
String param_string = make_string(file.data + param_string_start, size);
|
||||||
|
param_string = chop_whitespace(param_string);
|
||||||
|
breakdown->param_string[arg_index] = param_string;
|
||||||
|
|
||||||
|
for (Cpp_Token *param_name_token = arg_token - 1;
|
||||||
|
param_name_token->start > param_string_start;
|
||||||
|
--param_name_token){
|
||||||
|
if (param_name_token->type == CPP_TOKEN_IDENTIFIER){
|
||||||
|
int start = param_name_token->start;
|
||||||
|
int size = param_name_token->size;
|
||||||
|
breakdown->param_name[arg_index] = make_string(file.data + start, size);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
++arg_index;
|
||||||
|
|
||||||
|
++arg_token;
|
||||||
|
if (arg_token <= token){
|
||||||
|
param_string_start = arg_token->start;
|
||||||
|
}
|
||||||
|
--arg_token;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!function_set.valid[sig_count]){
|
||||||
|
function_set.ret[sig_count] = string_zero();
|
||||||
|
function_set.name[sig_count] = string_zero();
|
||||||
|
function_set.args[sig_count] = string_zero();
|
||||||
|
// TODO(allen): get warning line numbers
|
||||||
|
printf("custom_api_spec.cpp(???) : generator warning : invalid function signature\n");
|
||||||
|
}
|
||||||
|
++sig_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE(allen): Documentation Parse
|
||||||
|
token = tokens;
|
||||||
|
for (int i = 0; i < count; ++i, ++token){
|
||||||
|
if (token->type == CPP_TOKEN_IDENTIFIER &&
|
||||||
|
!(token->flags & CPP_TFLAG_PP_BODY)){
|
||||||
|
String lexeme = make_string(file.data + token->start, token->size);
|
||||||
|
if (match(lexeme, "API_EXPORT")){
|
||||||
|
for (; i < count; ++i, ++token){
|
||||||
|
if (token->type == CPP_TOKEN_PARENTHESE_OPEN){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < count){
|
||||||
|
--i;
|
||||||
|
--token;
|
||||||
|
|
||||||
|
if (token->type == CPP_TOKEN_IDENTIFIER){
|
||||||
|
lexeme = make_string(file.data + token->start, token->size);
|
||||||
|
int match = 0;
|
||||||
|
if (string_set_match(function_set.name, sig_count, lexeme, &match)){
|
||||||
|
for (; i < count; ++i, ++token){
|
||||||
|
if (token->type == CPP_TOKEN_COMMENT){
|
||||||
|
lexeme = make_string(file.data + token->start, token->size);
|
||||||
|
if (check_and_fix_docs(&lexeme)){
|
||||||
|
function_set.doc_string[match] = lexeme;
|
||||||
|
perform_doc_parse(lexeme, &function_set.doc[match]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (token->type == CPP_TOKEN_BRACE_OPEN){
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < sig_count; ++i){
|
for (int i = 0; i < sig_count; ++i){
|
||||||
String name_string = function_set.name[i];
|
String name_string = function_set.name[i];
|
||||||
|
@ -601,6 +954,9 @@ generate_custom_headers(){
|
||||||
to_lower(public_name);
|
to_lower(public_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE(allen): Header
|
||||||
|
FILE *file = fopen(API_H, "wb");
|
||||||
|
|
||||||
for (int i = 0; i < sig_count; ++i){
|
for (int i = 0; i < sig_count; ++i){
|
||||||
String ret_string = function_set.ret[i];
|
String ret_string = function_set.ret[i];
|
||||||
String args_string = function_set.args[i];
|
String args_string = function_set.args[i];
|
||||||
|
@ -647,13 +1003,14 @@ generate_custom_headers(){
|
||||||
|
|
||||||
fprintf(file, "#define FillAppLinksAPI(app_links) do{");
|
fprintf(file, "#define FillAppLinksAPI(app_links) do{");
|
||||||
for (int i = 0; i < sig_count; ++i){
|
for (int i = 0; i < sig_count; ++i){
|
||||||
|
String name = function_set.name[i];
|
||||||
String public_string = function_set.public_name[i];
|
String public_string = function_set.public_name[i];
|
||||||
|
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
"\\\n"
|
"\\\n"
|
||||||
"app_links->%.*s = external_%.*s;",
|
"app_links->%.*s = %.*s;",
|
||||||
public_string.size, public_string.str,
|
public_string.size, public_string.str,
|
||||||
public_string.size, public_string.str
|
name.size, name.str
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
fprintf(file, " } while(false)\n");
|
fprintf(file, " } while(false)\n");
|
||||||
|
@ -661,80 +1018,228 @@ generate_custom_headers(){
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
// NOTE(allen): Documentation
|
// NOTE(allen): Documentation
|
||||||
String code_data[2];
|
|
||||||
Doc_Parse parses[2];
|
|
||||||
|
|
||||||
code_data[0] = file_dump("4ed_api_implementation.cpp");
|
|
||||||
code_data[1] = file_dump("win32_4ed.cpp");
|
|
||||||
|
|
||||||
for (int J = 0; J < 2; ++J){
|
|
||||||
String *code = &code_data[J];
|
|
||||||
Doc_Parse *parse = &parses[J];
|
|
||||||
|
|
||||||
// TODO(allen): KILL THIS FUCKIN' Cpp_File FUCKIN NONSENSE BULLSHIT!!!!!
|
|
||||||
Cpp_File file;
|
|
||||||
file.data = code->str;
|
|
||||||
file.size = code->size;
|
|
||||||
|
|
||||||
parse->tokens = cpp_make_token_stack(512);
|
|
||||||
cpp_lex_file(file, &parse->tokens);
|
|
||||||
|
|
||||||
int count = parse->tokens.count;
|
|
||||||
Cpp_Token *tokens = parse->tokens.tokens;
|
|
||||||
|
|
||||||
Cpp_Token *token = tokens;
|
|
||||||
for (int i = 0; i < count; ++i, ++token){
|
|
||||||
if (token->type == CPP_TOKEN_IDENTIFIER){
|
|
||||||
String lexeme = make_string(file.data + token->start, token->size);
|
|
||||||
int match = 0;
|
|
||||||
if (string_set_match(function_set.macros, sig_count, lexeme, &match)){
|
|
||||||
for (; i < count; ++i, ++token){
|
|
||||||
if (token->type == CPP_TOKEN_COMMENT){
|
|
||||||
lexeme = make_string(file.data + token->start, token->size);
|
|
||||||
if (check_and_fix_docs(&lexeme)){
|
|
||||||
perform_doc_parse(parse, lexeme);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
file = fopen(API_DOC, "wb");
|
file = fopen(API_DOC, "wb");
|
||||||
|
|
||||||
|
#define CODE_STYLE "font-family: \"Courier New\", Courier, monospace; text-align: left;"
|
||||||
|
|
||||||
|
#define BACK_COLOR "#FAFAFA"
|
||||||
|
#define TEXT_COLOR "#0D0D0D"
|
||||||
|
#define CODE_BACK "#DFDFDF"
|
||||||
|
#define POP_COLOR_1 "#309030"
|
||||||
|
#define POP_BACK_1 "#E0FFD0"
|
||||||
|
#define POP_COLOR_2 "#007070"
|
||||||
|
#define POP_COLOR_3 "#005000"
|
||||||
|
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
"<html lang=\"en-US\">\n"
|
"<html lang=\"en-US\">\n"
|
||||||
"<head>\n"
|
"<head>\n"
|
||||||
"<title>4coder API Docs</title>\n"
|
"<title>4coder API Docs</title>\n"
|
||||||
|
"<style>\n"
|
||||||
|
|
||||||
|
"body { "
|
||||||
|
"background: " BACK_COLOR "; "
|
||||||
|
"color: " TEXT_COLOR "; "
|
||||||
|
"}\n"
|
||||||
|
|
||||||
|
// H things
|
||||||
|
"h1,h2,h3,h4 { "
|
||||||
|
"color: " POP_COLOR_1 "; "
|
||||||
|
"margin: 0; "
|
||||||
|
"}\n"
|
||||||
|
|
||||||
|
"h4 { "
|
||||||
|
"font-size: 1.1em; "
|
||||||
|
"}\n"
|
||||||
|
|
||||||
|
// ANCHORS
|
||||||
|
"a { "
|
||||||
|
"color: " POP_COLOR_1 "; "
|
||||||
|
"text-decoration: none; "
|
||||||
|
"}\n"
|
||||||
|
"a:visited { "
|
||||||
|
"color: " POP_COLOR_2 "; "
|
||||||
|
"}\n"
|
||||||
|
"a:hover { "
|
||||||
|
"background: " POP_BACK_1 "; "
|
||||||
|
"}\n"
|
||||||
|
|
||||||
|
// LIST
|
||||||
|
"ul { "
|
||||||
|
"list-style: none; "
|
||||||
|
"padding: 0; "
|
||||||
|
"margin: 0; "
|
||||||
|
"}\n"
|
||||||
|
"li { "
|
||||||
|
"padding-left: 1em;"
|
||||||
|
"text-indent: -.7em;"
|
||||||
|
"}\n"
|
||||||
|
"li:before { "
|
||||||
|
"content: \"4\"; "
|
||||||
|
"color: " POP_COLOR_3 "; "
|
||||||
|
"font-family:\"Webdings\"; "
|
||||||
|
"}\n"
|
||||||
|
|
||||||
|
"</style>\n"
|
||||||
"</head>\n"
|
"</head>\n"
|
||||||
"<body style='font-family:Arial;'>\n"
|
"<body>\n"
|
||||||
"<h1>4coder API</h1>"
|
"<div style='font-family:Arial; margin: 0 auto; "
|
||||||
|
"width: 900px; text-align: justify; line-height: 1.25;'>\n"
|
||||||
|
"<h1 style='margin-top: 5mm; margin-bottom: 5mm;'>4coder API</h1>\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
"<h2>\n§1 Introduction</h2>\n"
|
"<h2>§1 Introduction</h2>\n"
|
||||||
"<div style='margin-bottom: 5mm;'><i>Coming Soon</i></div>");
|
"<div>\n"
|
||||||
|
|
||||||
|
"<p>\n"
|
||||||
|
"This is the documentation for " VERSION " The documentation has been made as "
|
||||||
|
"accurate as possible but there may be errors. If you have questions or "
|
||||||
|
"discover errors please contact <span style='"CODE_STYLE"'>editor@4coder.net</span>."
|
||||||
|
"</p>\n"
|
||||||
|
|
||||||
|
"<p>\n"
|
||||||
|
"</p>\n"
|
||||||
|
|
||||||
|
"</div>\n");
|
||||||
|
|
||||||
fprintf(file, "<h2>\n§2 Functions</h2>\n");
|
fprintf(file, "<h2>§2 Types and Functions</h2>\n");
|
||||||
for (int i = 0; i < sig_count; ++i){
|
{
|
||||||
String name = function_set.public_name[i];
|
#undef SECTION
|
||||||
|
#define SECTION "2.1"
|
||||||
|
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
"<div>\n"
|
"<h3>§"SECTION" Function List</h3>\n"
|
||||||
"%.*s\n"
|
"<ul>\n");
|
||||||
"</div>\n",
|
|
||||||
name.size, name.str
|
for (int i = 0; i < sig_count; ++i){
|
||||||
);
|
String name = function_set.public_name[i];
|
||||||
|
fprintf(file,
|
||||||
|
"<li>\n"
|
||||||
|
"<a href='#%.*s_doc'>%.*s</a>\n"
|
||||||
|
"</li>\n",
|
||||||
|
name.size, name.str,
|
||||||
|
name.size, name.str
|
||||||
|
);
|
||||||
|
}
|
||||||
|
fprintf(file, "</ul>\n");
|
||||||
|
|
||||||
|
#undef SECTION
|
||||||
|
#define SECTION "2.2"
|
||||||
|
|
||||||
|
fprintf(file, "<h3 style='margin-top: 5mm; margin-bottom: 5mm;'>§"SECTION" Descriptions</h3>\n");
|
||||||
|
for (int i = 0; i < sig_count; ++i){
|
||||||
|
String name = function_set.public_name[i];
|
||||||
|
|
||||||
|
fprintf(file,
|
||||||
|
"<div id='%.*s_doc' style='margin-bottom: 1cm;'>\n"
|
||||||
|
" <h4>§"SECTION".%d: %.*s</h4>\n"
|
||||||
|
" <div style='"CODE_STYLE" margin-top: 3mm; margin-bottom: 3mm; font-size: .95em; "
|
||||||
|
"background: "CODE_BACK"; padding: 0.25em;'>",
|
||||||
|
name.size, name.str, i,
|
||||||
|
name.size, name.str
|
||||||
|
);
|
||||||
|
|
||||||
|
String ret = function_set.ret[i];
|
||||||
|
fprintf(file,
|
||||||
|
"%.*s %.*s(\n"
|
||||||
|
"<div style='margin-left: 4mm;'>",
|
||||||
|
ret.size, ret.str, name.size, name.str);
|
||||||
|
|
||||||
|
Argument_Breakdown *breakdown = &function_set.breakdown[i];
|
||||||
|
int arg_count = breakdown->count;
|
||||||
|
for (int j = 0; j < arg_count; ++j){
|
||||||
|
String param_string = breakdown->param_string[j];
|
||||||
|
if (j < arg_count - 1){
|
||||||
|
fprintf(file, "%.*s,<br>", param_string.size, param_string.str);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
fprintf(file, "%.*s<br>", param_string.size, param_string.str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(file,
|
||||||
|
"</div>)\n"
|
||||||
|
"</div>\n");
|
||||||
|
|
||||||
|
if (function_set.doc_string[i].size == 0){
|
||||||
|
fprintf(file, "No documentation generated for this function, assume it is non-public.\n");
|
||||||
|
printf("warning: no documentation string for %.*s\n", name.size, name.str);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DOC_HEAD_OPEN "<div style='margin-top: 3mm; margin-bottom: 3mm; color: "POP_COLOR_1";'><b><i>"
|
||||||
|
#define DOC_HEAD_CLOSE "</i></b></div>"
|
||||||
|
|
||||||
|
#define DOC_ITEM_OPEN "<div style='margin-left: 5mm; margin-right: 5mm;'>"
|
||||||
|
#define DOC_ITEM_CLOSE "</div>"
|
||||||
|
|
||||||
|
Documentation *doc = &function_set.doc[i];
|
||||||
|
|
||||||
|
int doc_param_count = doc->param_count;
|
||||||
|
if (doc_param_count > 0){
|
||||||
|
fprintf(file, DOC_HEAD_OPEN"Parameters"DOC_HEAD_CLOSE);
|
||||||
|
|
||||||
|
for (int j = 0; j < doc_param_count; ++j){
|
||||||
|
String param_name = doc->param_name[j];
|
||||||
|
String param_docs = doc->param_docs[j];
|
||||||
|
|
||||||
|
// TODO(allen): check that param_name is actually
|
||||||
|
// a parameter to this function!
|
||||||
|
|
||||||
|
fprintf(file,
|
||||||
|
"<div>\n"
|
||||||
|
"<div style='font-weight: 600;'>%.*s</div>\n"
|
||||||
|
"<div style='margin-bottom: 6mm;'>"DOC_ITEM_OPEN"%.*s"DOC_ITEM_CLOSE"</div>\n"
|
||||||
|
"</div>\n",
|
||||||
|
param_name.size, param_name.str,
|
||||||
|
param_docs.size, param_docs.str
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String ret_doc = doc->return_doc;
|
||||||
|
if (ret_doc.size != 0){
|
||||||
|
fprintf(file, DOC_HEAD_OPEN"Return"DOC_HEAD_CLOSE);
|
||||||
|
fprintf(file,
|
||||||
|
DOC_ITEM_OPEN"%.*s"DOC_ITEM_CLOSE,
|
||||||
|
ret_doc.size, ret_doc.str
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
String main_doc = doc->main_doc;
|
||||||
|
if (main_doc.size != 0){
|
||||||
|
fprintf(file, DOC_HEAD_OPEN"Description"DOC_HEAD_CLOSE);
|
||||||
|
fprintf(file,
|
||||||
|
DOC_ITEM_OPEN"%.*s"DOC_ITEM_CLOSE,
|
||||||
|
main_doc.size, main_doc.str
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
int doc_see_count = doc->see_also_count;
|
||||||
|
if (doc_see_count > 0){
|
||||||
|
fprintf(file, DOC_HEAD_OPEN"See Also"DOC_HEAD_CLOSE);
|
||||||
|
|
||||||
|
for (int j = 0; j < doc_see_count; ++j){
|
||||||
|
String see_also = doc->see_also[j];
|
||||||
|
fprintf(file,
|
||||||
|
DOC_ITEM_OPEN"<a href='#%.*s_doc'>%.*s</a>"DOC_ITEM_CLOSE,
|
||||||
|
see_also.size, see_also.str,
|
||||||
|
see_also.size, see_also.str
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(file, "</div><hr>\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
"</body>"
|
"</div>\n"
|
||||||
|
"</body>\n"
|
||||||
"</html>\n"
|
"</html>\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
return(filename);
|
return(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -359,7 +359,7 @@ part_free(void *ptr, void *context){
|
||||||
#include "stb_truetype.h"
|
#include "stb_truetype.h"
|
||||||
|
|
||||||
internal i32
|
internal i32
|
||||||
font_load_stb(Partition *part,
|
stb_font_load(Partition *part,
|
||||||
Render_Font *font_out,
|
Render_Font *font_out,
|
||||||
char *filename_untranslated,
|
char *filename_untranslated,
|
||||||
i32 pt_size,
|
i32 pt_size,
|
||||||
|
|
|
@ -1,14 +1,5 @@
|
||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
|
|
||||||
pushd ..\meta
|
|
||||||
REM cl %OPTS% ..\code\4ed_metagen.cpp /Zi /Femetagen
|
|
||||||
popd
|
|
||||||
|
|
||||||
pushd ..\code
|
|
||||||
REM "..\meta\metagen"
|
|
||||||
popd
|
|
||||||
|
|
||||||
REM "build_exp.bat" /Zi
|
REM "build_exp.bat" /Zi
|
||||||
"build_all.bat" /DFRED_SUPER /DFRED_INTERNAL /Zi
|
"build_all.bat" /DFRED_SUPER /DFRED_INTERNAL /Zi
|
||||||
REM "build_all.bat" /O2 /Zi
|
REM "build_all.bat" /O2 /Zi
|
||||||
|
|
|
@ -21,22 +21,23 @@ pushd ..\code
|
||||||
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
|
||||||
pushd ..\build
|
pushd ..\build
|
||||||
REM call "..\code\buildsuper.bat" ..\code\4coder_default_bindings.cpp
|
REM call "..\code\buildsuper.bat" ..\code\4coder_default_bindings.cpp
|
||||||
REM call "..\code\buildsuper.bat" ..\code\power\4coder_experiments.cpp
|
REM call "..\code\buildsuper.bat" ..\code\power\4coder_experiments.cpp
|
||||||
call "..\code\buildsuper.bat" ..\code\power\4coder_casey.cpp
|
REM call "..\code\buildsuper.bat" ..\code\power\4coder_casey.cpp
|
||||||
REM call "..\code\buildsuper.bat" ..\4vim\4coder_chronal.cpp
|
REM call "..\code\buildsuper.bat" ..\4vim\4coder_chronal.cpp
|
||||||
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
||||||
|
|
||||||
set EXPORTS=/EXPORT:app_get_functions
|
set EXPORTS=/EXPORT:app_get_functions
|
||||||
cl %OPTS% %INCLUDES% %DEFINES% ..\code\4ed_app_target.cpp %* /Fe4ed_app /LD /link /INCREMENTAL:NO /OPT:REF %EXPORTS%
|
REM cl %OPTS% %INCLUDES% %DEFINES% ..\code\4ed_app_target.cpp %* /Fe4ed_app /LD /link /INCREMENTAL:NO /OPT:REF %EXPORTS%
|
||||||
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
||||||
|
|
||||||
cl %OPTS% %INCLUDES% %DEFINES% ..\code\win32_4ed.cpp %LIBS% %ICON% %* /Fe4ed /link /NODEFAULTLIB:library
|
REM cl %OPTS% %INCLUDES% %DEFINES% ..\code\win32_4ed.cpp %LIBS% %ICON% %* /Fe4ed /link /NODEFAULTLIB:library
|
||||||
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
||||||
|
|
||||||
call "print_size.bat" 4ed_app.dll
|
REM call "print_size.bat" 4ed_app.dll
|
||||||
call "print_size.bat" 4ed.exe
|
REM call "print_size.bat" 4ed.exe
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
|
|
||||||
// Command exectuion
|
|
||||||
void Exec_Command(Application_Links *app, int command_id);
|
|
||||||
int Exec_System_Command(Application_Links *app, View_Summary *view, Buffer_Identifier buffer, char *path, int path_len, char *command, int command_len, unsigned int flags);
|
|
||||||
|
|
||||||
// File system navigation
|
|
||||||
int Directory_Get_Hot(Application_Links *app, char *out, int capacity);
|
|
||||||
int Get_4ed_Path(Application_Links *app, char *out, int capacity);
|
|
||||||
int File_Exists(Application_Links *app, char *filename, int len);
|
|
||||||
int Directory_CD(Application_Links *app, char *dir, int *len, int capacity, char *rel_path, int rel_len);
|
|
||||||
File_List Get_File_List(Application_Links *app, char *dir, int len);
|
|
||||||
void Free_File_List(Application_Links *app, File_List list);
|
|
||||||
|
|
||||||
// Clipboard
|
|
||||||
|
|
||||||
// TODO(allen): extend this API out a little bit to allow for future expansion.
|
|
||||||
void Clipboard_Post(Application_Links *app, char *str, int len);
|
|
||||||
int Clipboard_Count(Application_Links *app);
|
|
||||||
int Clipboard_Index(Application_Links *app, int index, char *out, int len);
|
|
||||||
|
|
||||||
// Direct buffer manipulation
|
|
||||||
Buffer_Summary Get_Buffer_First(Application_Links *app, unsigned int access);
|
|
||||||
void Get_Buffer_Next(Application_Links *app, Buffer_Summary *buffer, unsigned int access);
|
|
||||||
|
|
||||||
Buffer_Summary Get_Buffer(Application_Links *app, int buffer_id, unsigned int access);
|
|
||||||
Buffer_Summary Get_Buffer_By_Name(Application_Links *app, char *name, int len, unsigned int access);
|
|
||||||
|
|
||||||
int Buffer_Seek(Application_Links *app, Buffer_Summary *buffer, int start_pos, int seek_forward, unsigned int flags);
|
|
||||||
int Buffer_Read_Range(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *out);
|
|
||||||
|
|
||||||
int Buffer_Replace_Range(Application_Links *app, Buffer_Summary *buffer, int start, int end, char *str, int len);
|
|
||||||
int Buffer_Set_Setting(Application_Links *app, Buffer_Summary *buffer, int setting, int value);
|
|
||||||
int Buffer_Auto_Indent(Application_Links *app, Buffer_Summary *buffer, int start, int end, int tab_width, unsigned int flags);
|
|
||||||
|
|
||||||
Buffer_Summary Create_Buffer(Application_Links *app, char *filename, int filename_len, unsigned int flags);
|
|
||||||
int Save_Buffer(Application_Links *app, Buffer_Summary *buffer, char *filename, int filename_len, unsigned int flags);
|
|
||||||
int Kill_Buffer(Application_Links *app, Buffer_Identifier buffer, int view_id, unsigned int flags);
|
|
||||||
|
|
||||||
// View manipulation
|
|
||||||
View_Summary Get_View_First(Application_Links *app, unsigned int access);
|
|
||||||
void Get_View_Next(Application_Links *app, View_Summary *view, unsigned int access);
|
|
||||||
|
|
||||||
View_Summary Get_View(Application_Links *app, int view_id, unsigned int access);
|
|
||||||
View_Summary Get_Active_View(Application_Links *app, unsigned int access);
|
|
||||||
|
|
||||||
int View_Compute_Cursor (Application_Links *app, View_Summary *view, Buffer_Seek seek, Full_Cursor *cursor_out);
|
|
||||||
int View_Set_Cursor (Application_Links *app, View_Summary *view, Buffer_Seek seek, int set_preferred_x);
|
|
||||||
int View_Set_Mark (Application_Links *app, View_Summary *view, Buffer_Seek seek);
|
|
||||||
int View_Set_Highlight (Application_Links *app, View_Summary *view, int start, int end, int turn_on);
|
|
||||||
int View_Set_Buffer (Application_Links *app, View_Summary *view, int buffer_id, unsigned int flags);
|
|
||||||
int View_Post_Fade (Application_Links *app, View_Summary *view, float seconds, int start, int end, unsigned int color);
|
|
||||||
|
|
||||||
// TODO(allen):
|
|
||||||
// Get rid of this temporary hack ass soon ass possible.
|
|
||||||
void View_Set_Paste_Rewrite_(Application_Links *app, View_Summary *view);
|
|
||||||
int View_Get_Paste_Rewrite_(Application_Links *app, View_Summary *view);
|
|
||||||
|
|
||||||
// Directly get user input
|
|
||||||
User_Input Get_User_Input (Application_Links *app, unsigned int get_type, unsigned int abort_type);
|
|
||||||
User_Input Get_Command_Input (Application_Links *app);
|
|
||||||
Mouse_State Get_Mouse_State (Application_Links *app);
|
|
||||||
//Event_Message Get_Event_Message (Application_Links *app);
|
|
||||||
|
|
||||||
// Queries and information display
|
|
||||||
int Start_Query_Bar (Application_Links *app, Query_Bar *bar, unsigned int flags);
|
|
||||||
void End_Query_Bar (Application_Links *app, Query_Bar *bar, unsigned int flags);
|
|
||||||
void Print_Message (Application_Links *app, char *str, int len);
|
|
||||||
//GUI_Functions* Get_GUI_Functions(Application_Links *app);
|
|
||||||
//GUI* Get_GUI(Application_Links *app, int view_id);
|
|
||||||
|
|
||||||
// Color settings
|
|
||||||
void Change_Theme (Application_Links *app, char *name, int len);
|
|
||||||
void Change_Font (Application_Links *app, char *name, int len);
|
|
||||||
void Set_Theme_Colors (Application_Links *app, Theme_Color *colors, int count);
|
|
||||||
void Get_Theme_Colors (Application_Links *app, Theme_Color *colors, int count);
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ pushd W:\4ed\code
|
||||||
..\meta\readmegen
|
..\meta\readmegen
|
||||||
|
|
||||||
call "build_all.bat" /O2 /DFRED_KEEP_ASSERT
|
call "build_all.bat" /O2 /DFRED_KEEP_ASSERT
|
||||||
|
del ..\current_dist\4coder\*.html
|
||||||
copy ..\build\4ed.exe ..\current_dist\4coder\*
|
copy ..\build\4ed.exe ..\current_dist\4coder\*
|
||||||
copy ..\build\4ed.pdb ..\current_dist\4coder\*
|
copy ..\build\4ed.pdb ..\current_dist\4coder\*
|
||||||
copy ..\build\4ed_app.dll ..\current_dist\4coder\*
|
copy ..\build\4ed_app.dll ..\current_dist\4coder\*
|
||||||
|
@ -16,12 +17,12 @@ copy ..\build\4ed_app.pdb ..\current_dist\4coder\*
|
||||||
copy ..\data\* ..\current_dist\4coder\*
|
copy ..\data\* ..\current_dist\4coder\*
|
||||||
copy README.txt ..\current_dist\4coder\*
|
copy README.txt ..\current_dist\4coder\*
|
||||||
copy TODO.txt ..\current_dist\4coder\*
|
copy TODO.txt ..\current_dist\4coder\*
|
||||||
copy 4coder_API.html ..\current_dist\4coder\*
|
|
||||||
del ..\current_dist\SUPERREADME.txt
|
del ..\current_dist\SUPERREADME.txt
|
||||||
del ..\current_dist\4coder\basic.cpp
|
del ..\current_dist\4coder\basic.cpp
|
||||||
del ..\current_dist\4coder\.4coder_settings
|
del ..\current_dist\4coder\.4coder_settings
|
||||||
|
|
||||||
call "build_all.bat" /O2 /DFRED_SUPER /DFRED_KEEP_ASSERT
|
call "build_all.bat" /O2 /DFRED_SUPER /DFRED_KEEP_ASSERT
|
||||||
|
del ..\current_dist\4coder\*.html
|
||||||
copy ..\build\4ed.exe ..\current_dist_super\4coder\*
|
copy ..\build\4ed.exe ..\current_dist_super\4coder\*
|
||||||
copy ..\build\4ed.pdb ..\current_dist_super\4coder\*
|
copy ..\build\4ed.pdb ..\current_dist_super\4coder\*
|
||||||
copy ..\build\4ed_app.dll ..\current_dist_super\4coder\*
|
copy ..\build\4ed_app.dll ..\current_dist_super\4coder\*
|
||||||
|
|
119
win32_4ed.cpp
119
win32_4ed.cpp
|
@ -867,100 +867,12 @@ Sys_File_Unique_Hash_Sig(system_file_unique_hash){
|
||||||
return(hash);
|
return(hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): Exposed to the custom layer.
|
|
||||||
internal
|
|
||||||
FILE_EXISTS_SIG(system_file_exists)/*
|
|
||||||
DOC_PARAM(filename, the full path to a file)
|
|
||||||
DOC_PARAM(len, the number of characters in the filename string)
|
|
||||||
DOC_RETURN(returns non-zero if the file exists, returns zero if the file does not exist)
|
|
||||||
*/{
|
|
||||||
char full_filename_space[1024];
|
|
||||||
String full_filename;
|
|
||||||
HANDLE file;
|
|
||||||
b32 result;
|
|
||||||
|
|
||||||
result = 0;
|
|
||||||
|
|
||||||
if (len < sizeof(full_filename_space)){
|
|
||||||
full_filename = make_fixed_width_string(full_filename_space);
|
|
||||||
copy(&full_filename, make_string(filename, len));
|
|
||||||
terminate_with_null(&full_filename);
|
|
||||||
|
|
||||||
file = CreateFile(full_filename.str, GENERIC_READ, 0, 0,
|
|
||||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
|
||||||
|
|
||||||
if (file != INVALID_HANDLE_VALUE){
|
|
||||||
CloseHandle(file);
|
|
||||||
result = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
b32 Win32DirectoryExists(char *path){
|
b32 Win32DirectoryExists(char *path){
|
||||||
DWORD attrib = GetFileAttributesA(path);
|
DWORD attrib = GetFileAttributesA(path);
|
||||||
return (attrib != INVALID_FILE_ATTRIBUTES &&
|
return (attrib != INVALID_FILE_ATTRIBUTES &&
|
||||||
(attrib & FILE_ATTRIBUTE_DIRECTORY));
|
(attrib & FILE_ATTRIBUTE_DIRECTORY));
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): Exposed to the custom layer.
|
|
||||||
internal
|
|
||||||
DIRECTORY_CD_SIG(system_directory_cd)/*
|
|
||||||
DOC_PARAM(dir, a string buffer containing a directory)
|
|
||||||
DOC_PARAM(len, the length of the string in the string buffer)
|
|
||||||
DOC_PARAM(capacity, the maximum size of the string buffer)
|
|
||||||
DOC_PARAM(rel_path, the path to change to, may include '.' or '..')
|
|
||||||
DOC_PARAM(rel_len, the length of the rel_path string)
|
|
||||||
DOC_RETURN(returns non-zero if the call succeeds, returns zero otherwise)
|
|
||||||
DOC
|
|
||||||
(
|
|
||||||
This call succeeds if the directory exists and the new directory fits inside the dir buffer.
|
|
||||||
If the call succeeds the dir buffer is filled with the new directory and len contains the
|
|
||||||
length of the string in the buffer.
|
|
||||||
|
|
||||||
For instance if dir contains "C:/Users/MySelf" and rel is "Documents" the buffer will contain
|
|
||||||
"C:/Users/MySelf/Documents" and len will contain the length of that string. This call can
|
|
||||||
also be used with rel as ".." to traverse to parent folders.
|
|
||||||
)
|
|
||||||
*/{
|
|
||||||
String directory = make_string(dir, *len, capacity);
|
|
||||||
b32 result = 0;
|
|
||||||
i32 old_size;
|
|
||||||
|
|
||||||
char rel_path_space[1024];
|
|
||||||
String rel_path_string = make_fixed_width_string(rel_path_space);
|
|
||||||
copy(&rel_path_string, make_string(rel_path, rel_len));
|
|
||||||
terminate_with_null(&rel_path_string);
|
|
||||||
|
|
||||||
if (rel_path[0] != 0){
|
|
||||||
if (rel_path[0] == '.' && rel_path[1] == 0){
|
|
||||||
result = 1;
|
|
||||||
}
|
|
||||||
else if (rel_path[0] == '.' && rel_path[1] == '.' && rel_path[2] == 0){
|
|
||||||
result = remove_last_folder(&directory);
|
|
||||||
terminate_with_null(&directory);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if (directory.size + rel_len + 1 > directory.memory_size){
|
|
||||||
old_size = directory.size;
|
|
||||||
append_partial(&directory, rel_path);
|
|
||||||
append_partial(&directory, "\\");
|
|
||||||
if (Win32DirectoryExists(directory.str)){
|
|
||||||
result = 1;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
directory.size = old_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*len = directory.size;
|
|
||||||
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal
|
internal
|
||||||
Sys_Get_Binary_Path_Sig(system_get_binary_path){
|
Sys_Get_Binary_Path_Sig(system_get_binary_path){
|
||||||
i32 result = 0;
|
i32 result = 0;
|
||||||
|
@ -974,16 +886,7 @@ Sys_Get_Binary_Path_Sig(system_get_binary_path){
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(allen): Exposed to the custom layer.
|
#include "win32_api_impl.cpp"
|
||||||
GET_4ED_PATH_SIG(system_get_4ed_path)/*
|
|
||||||
DOC_PARAM(out, a buffer that receives the path to the 4ed executable file)
|
|
||||||
DOC_PARAM(capacity, the maximum capacity of the output buffer)
|
|
||||||
DOC_RETURN(returns non-zero on success, returns zero on failure)
|
|
||||||
*/{
|
|
||||||
String str = make_string(out, 0, capacity);
|
|
||||||
return(system_get_binary_path(&str));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Clipboard
|
// Clipboard
|
||||||
|
@ -1227,13 +1130,13 @@ Font_Load_Sig(system_draw_font_load){
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
success = font_load(&win32vars.font_part,
|
success = stb_font_load(&win32vars.font_part,
|
||||||
font_out,
|
font_out,
|
||||||
filename,
|
filename,
|
||||||
pt_size,
|
pt_size,
|
||||||
tab_width,
|
tab_width,
|
||||||
oversample,
|
oversample,
|
||||||
store_texture);
|
store_texture);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1323,9 +1226,9 @@ Win32LoadSystemCode(){
|
||||||
win32vars.system.file_load_end = system_file_load_end;
|
win32vars.system.file_load_end = system_file_load_end;
|
||||||
win32vars.system.file_save = system_file_save;
|
win32vars.system.file_save = system_file_save;
|
||||||
|
|
||||||
win32vars.system.file_exists = system_file_exists;
|
win32vars.system.file_exists = File_Exists;
|
||||||
win32vars.system.directory_cd = system_directory_cd;
|
win32vars.system.directory_cd = Directory_CD;
|
||||||
win32vars.system.get_4ed_path = system_get_4ed_path;
|
win32vars.system.get_4ed_path = Get_4ed_Path;
|
||||||
|
|
||||||
win32vars.system.post_clipboard = system_post_clipboard;
|
win32vars.system.post_clipboard = system_post_clipboard;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
Implementation of system level functions that get exposed straight
|
||||||
|
into the 4coder custom API. This file need not be split on other platforms,
|
||||||
|
as this is the only one that will be used for generating headers and docs.
|
||||||
|
-Allen
|
||||||
|
|
||||||
|
27.06.2016 (dd.mm.yyyy)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TOP
|
||||||
|
|
||||||
|
#define API_EXPORT
|
||||||
|
|
||||||
|
API_EXPORT int
|
||||||
|
File_Exists(Application_Links *app, char *filename, int len)/*
|
||||||
|
DOC_PARAM(filename, the full path to a file)
|
||||||
|
DOC_PARAM(len, the number of characters in the filename string)
|
||||||
|
DOC_RETURN(returns non-zero if the file exists, returns zero if the file does not exist)
|
||||||
|
*/{
|
||||||
|
char full_filename_space[1024];
|
||||||
|
String full_filename;
|
||||||
|
HANDLE file;
|
||||||
|
b32 result;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
if (len < sizeof(full_filename_space)){
|
||||||
|
full_filename = make_fixed_width_string(full_filename_space);
|
||||||
|
copy(&full_filename, make_string(filename, len));
|
||||||
|
terminate_with_null(&full_filename);
|
||||||
|
|
||||||
|
file = CreateFile(full_filename.str, GENERIC_READ, 0, 0,
|
||||||
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||||||
|
|
||||||
|
if (file != INVALID_HANDLE_VALUE){
|
||||||
|
CloseHandle(file);
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
API_EXPORT int
|
||||||
|
Directory_CD(Application_Links *app, char *dir, int *len, int capacity, char *rel_path, int rel_len)/*
|
||||||
|
DOC_PARAM(dir, a string buffer containing a directory)
|
||||||
|
DOC_PARAM(len, the length of the string in the string buffer)
|
||||||
|
DOC_PARAM(capacity, the maximum size of the string buffer)
|
||||||
|
DOC_PARAM(rel_path, the path to change to, may include '.' or '..')
|
||||||
|
DOC_PARAM(rel_len, the length of the rel_path string)
|
||||||
|
DOC_RETURN(returns non-zero if the call succeeds, returns zero otherwise)
|
||||||
|
DOC
|
||||||
|
(
|
||||||
|
This call succeeds if the directory exists and the new directory fits inside the dir buffer.
|
||||||
|
If the call succeeds the dir buffer is filled with the new directory and len contains the
|
||||||
|
length of the string in the buffer.
|
||||||
|
|
||||||
|
For instance if dir contains "C:/Users/MySelf" and rel is "Documents" the buffer will contain
|
||||||
|
"C:/Users/MySelf/Documents" and len will contain the length of that string. This call can
|
||||||
|
also be used with rel set to ".." to traverse to parent folders.
|
||||||
|
)
|
||||||
|
*/{
|
||||||
|
String directory = make_string(dir, *len, capacity);
|
||||||
|
b32 result = 0;
|
||||||
|
i32 old_size;
|
||||||
|
|
||||||
|
char rel_path_space[1024];
|
||||||
|
String rel_path_string = make_fixed_width_string(rel_path_space);
|
||||||
|
copy(&rel_path_string, make_string(rel_path, rel_len));
|
||||||
|
terminate_with_null(&rel_path_string);
|
||||||
|
|
||||||
|
if (rel_path[0] != 0){
|
||||||
|
if (rel_path[0] == '.' && rel_path[1] == 0){
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
else if (rel_path[0] == '.' && rel_path[1] == '.' && rel_path[2] == 0){
|
||||||
|
result = remove_last_folder(&directory);
|
||||||
|
terminate_with_null(&directory);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (directory.size + rel_len + 1 > directory.memory_size){
|
||||||
|
old_size = directory.size;
|
||||||
|
append_partial(&directory, rel_path);
|
||||||
|
append_partial(&directory, "\\");
|
||||||
|
if (Win32DirectoryExists(directory.str)){
|
||||||
|
result = 1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
directory.size = old_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*len = directory.size;
|
||||||
|
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
API_EXPORT int
|
||||||
|
Get_4ed_Path(Application_Links *app, char *out, int capacity)/*
|
||||||
|
DOC_PARAM(out, a buffer that receives the path to the 4ed executable file)
|
||||||
|
DOC_PARAM(capacity, the maximum capacity of the output buffer)
|
||||||
|
DOC_RETURN(returns non-zero on success, returns zero on failure)
|
||||||
|
*/{
|
||||||
|
String str = make_string(out, 0, capacity);
|
||||||
|
return(system_get_binary_path(&str));
|
||||||
|
}
|
||||||
|
|
||||||
|
// BOTTOM
|
||||||
|
|
Loading…
Reference in New Issue