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;
|
||||
} Full_Cursor;
|
||||
|
||||
typedef enum{
|
||||
typedef enum Buffer_Seek_Type{
|
||||
buffer_seek_pos,
|
||||
buffer_seek_wrapped_xy,
|
||||
buffer_seek_unwrapped_xy,
|
||||
|
|
|
@ -1,11 +1,5 @@
|
|||
#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 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_COUNT_SIG(n) int n(Application_Links *app)
|
||||
#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_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 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_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)
|
||||
|
@ -43,15 +37,15 @@
|
|||
#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 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"{
|
||||
typedef EXEC_COMMAND_SIG(Exec_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_COUNT_SIG(Clipboard_Count_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_SIG(Get_Buffer_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_REPLACE_RANGE_SIG(Buffer_Replace_Range_Function);
|
||||
typedef BUFFER_SET_SETTING_SIG(Buffer_Set_Setting_Function);
|
||||
|
@ -89,18 +83,18 @@ extern "C"{
|
|||
typedef CHANGE_FONT_SIG(Change_Font_Function);
|
||||
typedef SET_THEME_COLORS_SIG(Set_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{
|
||||
void *memory;
|
||||
int memory_size;
|
||||
Exec_Command_Function *exec_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_Count_Function *clipboard_count;
|
||||
Clipboard_Index_Function *clipboard_index;
|
||||
|
@ -108,7 +102,7 @@ struct Application_Links{
|
|||
Get_Buffer_Next_Function *get_buffer_next;
|
||||
Get_Buffer_Function *get_buffer;
|
||||
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_Replace_Range_Function *buffer_replace_range;
|
||||
Buffer_Set_Setting_Function *buffer_set_setting;
|
||||
|
@ -138,54 +132,60 @@ struct Application_Links{
|
|||
Change_Font_Function *change_font;
|
||||
Set_Theme_Colors_Function *set_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 *system_links;
|
||||
void *current_coroutine;
|
||||
int type_coroutine;
|
||||
};
|
||||
#define FillAppLinksAPI(app_links) do{\
|
||||
app_links->exec_command = external_exec_command;\
|
||||
app_links->exec_system_command = external_exec_system_command;\
|
||||
app_links->directory_get_hot = external_directory_get_hot;\
|
||||
app_links->get_4ed_path = external_get_4ed_path;\
|
||||
app_links->file_exists = external_file_exists;\
|
||||
app_links->directory_cd = external_directory_cd;\
|
||||
app_links->get_file_list = external_get_file_list;\
|
||||
app_links->free_file_list = external_free_file_list;\
|
||||
app_links->clipboard_post = external_clipboard_post;\
|
||||
app_links->clipboard_count = external_clipboard_count;\
|
||||
app_links->clipboard_index = external_clipboard_index;\
|
||||
app_links->get_buffer_first = external_get_buffer_first;\
|
||||
app_links->get_buffer_next = external_get_buffer_next;\
|
||||
app_links->get_buffer = external_get_buffer;\
|
||||
app_links->get_buffer_by_name = external_get_buffer_by_name;\
|
||||
app_links->buffer_seek = external_buffer_seek;\
|
||||
app_links->buffer_read_range = external_buffer_read_range;\
|
||||
app_links->buffer_replace_range = external_buffer_replace_range;\
|
||||
app_links->buffer_set_setting = external_buffer_set_setting;\
|
||||
app_links->buffer_auto_indent = external_buffer_auto_indent;\
|
||||
app_links->create_buffer = external_create_buffer;\
|
||||
app_links->save_buffer = external_save_buffer;\
|
||||
app_links->kill_buffer = external_kill_buffer;\
|
||||
app_links->get_view_first = external_get_view_first;\
|
||||
app_links->get_view_next = external_get_view_next;\
|
||||
app_links->get_view = external_get_view;\
|
||||
app_links->get_active_view = external_get_active_view;\
|
||||
app_links->view_compute_cursor = external_view_compute_cursor;\
|
||||
app_links->view_set_cursor = external_view_set_cursor;\
|
||||
app_links->view_set_mark = external_view_set_mark;\
|
||||
app_links->view_set_highlight = external_view_set_highlight;\
|
||||
app_links->view_set_buffer = external_view_set_buffer;\
|
||||
app_links->view_post_fade = external_view_post_fade;\
|
||||
app_links->view_set_paste_rewrite_ = external_view_set_paste_rewrite_;\
|
||||
app_links->view_get_paste_rewrite_ = external_view_get_paste_rewrite_;\
|
||||
app_links->get_user_input = external_get_user_input;\
|
||||
app_links->get_command_input = external_get_command_input;\
|
||||
app_links->get_mouse_state = external_get_mouse_state;\
|
||||
app_links->start_query_bar = external_start_query_bar;\
|
||||
app_links->end_query_bar = external_end_query_bar;\
|
||||
app_links->print_message = external_print_message;\
|
||||
app_links->change_theme = external_change_theme;\
|
||||
app_links->change_font = external_change_font;\
|
||||
app_links->set_theme_colors = external_set_theme_colors;\
|
||||
app_links->get_theme_colors = external_get_theme_colors; } while(false)
|
||||
app_links->exec_command = Exec_Command;\
|
||||
app_links->exec_system_command = Exec_System_Command;\
|
||||
app_links->clipboard_post = Clipboard_Post;\
|
||||
app_links->clipboard_count = Clipboard_Count;\
|
||||
app_links->clipboard_index = Clipboard_Index;\
|
||||
app_links->get_buffer_first = Get_Buffer_First;\
|
||||
app_links->get_buffer_next = Get_Buffer_Next;\
|
||||
app_links->get_buffer = Get_Buffer;\
|
||||
app_links->get_buffer_by_name = Get_Buffer_By_Name;\
|
||||
app_links->buffer_boundary_seek = Buffer_Boundary_Seek;\
|
||||
app_links->buffer_read_range = Buffer_Read_Range;\
|
||||
app_links->buffer_replace_range = Buffer_Replace_Range;\
|
||||
app_links->buffer_set_setting = Buffer_Set_Setting;\
|
||||
app_links->buffer_auto_indent = Buffer_Auto_Indent;\
|
||||
app_links->create_buffer = Create_Buffer;\
|
||||
app_links->save_buffer = Save_Buffer;\
|
||||
app_links->kill_buffer = Kill_Buffer;\
|
||||
app_links->get_view_first = Get_View_First;\
|
||||
app_links->get_view_next = Get_View_Next;\
|
||||
app_links->get_view = Get_View;\
|
||||
app_links->get_active_view = Get_Active_View;\
|
||||
app_links->view_compute_cursor = View_Compute_Cursor;\
|
||||
app_links->view_set_cursor = View_Set_Cursor;\
|
||||
app_links->view_set_mark = View_Set_Mark;\
|
||||
app_links->view_set_highlight = View_Set_Highlight;\
|
||||
app_links->view_set_buffer = View_Set_Buffer;\
|
||||
app_links->view_post_fade = View_Post_Fade;\
|
||||
app_links->view_set_paste_rewrite_ = View_Set_Paste_Rewrite_;\
|
||||
app_links->view_get_paste_rewrite_ = View_Get_Paste_Rewrite_;\
|
||||
app_links->get_user_input = Get_User_Input;\
|
||||
app_links->get_command_input = Get_Command_Input;\
|
||||
app_links->get_mouse_state = Get_Mouse_State;\
|
||||
app_links->start_query_bar = Start_Query_Bar;\
|
||||
app_links->end_query_bar = End_Query_Bar;\
|
||||
app_links->print_message = Print_Message;\
|
||||
app_links->change_theme = Change_Theme;\
|
||||
app_links->change_font = Change_Font;\
|
||||
app_links->set_theme_colors = Set_Theme_Colors;\
|
||||
app_links->get_theme_colors = Get_Theme_Colors;\
|
||||
app_links->directory_get_hot = Directory_Get_Hot;\
|
||||
app_links->get_file_list = Get_File_List;\
|
||||
app_links->free_file_list = Free_File_List;\
|
||||
app_links->file_exists = File_Exists;\
|
||||
app_links->directory_cd = Directory_CD;\
|
||||
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;
|
||||
View_Summary view = app->get_active_view(app, 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);
|
||||
}
|
||||
|
||||
|
@ -798,9 +798,9 @@ CUSTOM_COMMAND_SIG(snipe_token_or_word){
|
|||
view = app->get_active_view(app, 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);
|
||||
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));
|
||||
|
||||
exec_command(app, cmdid_change_active_panel);
|
||||
view = app->get_active_view(app, AccessAll);
|
||||
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];
|
||||
|
||||
//extern "C"{
|
||||
#include "4ed_api_implementation.cpp"
|
||||
//}
|
||||
|
||||
struct Command_In{
|
||||
Command_Data *cmd;
|
||||
|
|
|
@ -139,7 +139,10 @@ imp_get_view(Command_Data *cmd, View_Summary *view){
|
|||
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(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
|
||||
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(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)
|
||||
|
@ -321,63 +325,8 @@ of at the beginning.
|
|||
return(result);
|
||||
}
|
||||
|
||||
DIRECTORY_GET_HOT_SIG(external_directory_get_hot)/*
|
||||
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 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)/*
|
||||
API_EXPORT void
|
||||
Clipboard_Post(Application_Links *app, char *str, int len)/*
|
||||
DOC_PARAM(str, the string to post to the clipboard)
|
||||
DOC_PARAM(len, the length of the string str)
|
||||
DOC
|
||||
|
@ -398,7 +347,8 @@ be pasted into other applications.
|
|||
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)
|
||||
*/{
|
||||
Command_Data *cmd = (Command_Data*)app->cmd_context;
|
||||
|
@ -407,7 +357,8 @@ DOC(returns the number of items in the clipboard)
|
|||
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(out, a buffer where the clipboard contents are written or NULL)
|
||||
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_RETURN(returns the summary of the first buffer in a buffer loop)
|
||||
DOC
|
||||
|
@ -485,7 +437,8 @@ DOC_SEE(get_buffer_next)
|
|||
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(access, the access flags for the access)
|
||||
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(access, the access flags for the access)
|
||||
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);
|
||||
}
|
||||
|
||||
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(len, the length of the name string)
|
||||
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);
|
||||
}
|
||||
|
||||
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(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)
|
||||
|
@ -651,7 +607,8 @@ DOC_SEE(Seek_Boundary_Flag)
|
|||
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(start, the beginning 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
|
||||
(
|
||||
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.
|
||||
|
||||
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;
|
||||
|
@ -680,7 +640,8 @@ The output is not null terminated.
|
|||
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(start, the start 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
|
||||
(
|
||||
Replace simultaneously deletes the range from start to end and writes str
|
||||
in the same position. If end == start then this call is equivalent to
|
||||
inserting the string at start. If len == 0 this call is equivalent to
|
||||
deleteing the range from start to end.
|
||||
If this call succeeds it deletes the range from start to end
|
||||
and writes str in the same position. If end == start then
|
||||
this call is equivalent to inserting the string at start.
|
||||
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;
|
||||
|
@ -721,7 +686,8 @@ deleteing the range from start to end.
|
|||
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(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)
|
||||
|
@ -792,7 +758,8 @@ DOC_SEE(Buffer_Setting_ID)
|
|||
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(start, the position to start the auto indenting)
|
||||
DOC_PARAM(end, the position to end the auto indenting)
|
||||
|
@ -832,7 +799,8 @@ DOC_SEE(Auto_Tab_Flag)
|
|||
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_len, the length of the filename string)
|
||||
DOC_PARAM(flags, flags for buffer creation behavior)
|
||||
|
@ -923,7 +891,8 @@ DOC_SEE(Buffer_Create_Flag)
|
|||
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(filename, the name of the file to save the buffer into)
|
||||
DOC_PARAM(filename_len, length of the filename string)
|
||||
|
@ -945,7 +914,8 @@ DOC_RETURN(returns non-zero if the save succeeds)
|
|||
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(view_id, the id of view that will contain the "are you sure" dialogue)
|
||||
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_RETURN(returns the summary of the first view in a view loop)
|
||||
DOC
|
||||
|
@ -1044,7 +1015,8 @@ DOC_SEE(get_view_next)
|
|||
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(access, the access flags for the access)
|
||||
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(access, the access flags for the access)
|
||||
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);
|
||||
}
|
||||
|
||||
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_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);
|
||||
}
|
||||
|
||||
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(seek, the seek position)
|
||||
DOC_PARAM(cursor_out, on success this is filled with result of the seek)
|
||||
|
@ -1134,7 +1109,8 @@ DOC_SEE(Buffer_Seek)
|
|||
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(seek, the seek 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);
|
||||
}
|
||||
|
||||
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(seek, the seek position)
|
||||
DOC_RETURN(returns non-zero on success)
|
||||
|
@ -1200,7 +1177,8 @@ DOC_SEE(Buffer_Seek)
|
|||
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(start, the start 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);
|
||||
}
|
||||
|
||||
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(buffer_id, the buffer to show in the view)
|
||||
DOC_PARAM(flags, set buffer behavior flags)
|
||||
|
@ -1269,7 +1248,8 @@ DOC_SEE(Set_Buffer_Flag)
|
|||
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(seconds, the number of seconds the fade effect should last)
|
||||
DOC_PARAM(start, the first character in the fade range)
|
||||
|
@ -1292,7 +1272,8 @@ DOC_PARAM(color, the color to fade from)
|
|||
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;
|
||||
View *vptr = imp_get_view(cmd, view);
|
||||
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;
|
||||
View *vptr = imp_get_view(cmd, view);
|
||||
int result = false;
|
||||
|
@ -1310,7 +1292,8 @@ VIEW_GET_PASTE_REWRITE__SIG(external_view_get_paste_rewrite_){
|
|||
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(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)
|
||||
|
@ -1341,7 +1324,8 @@ DOC_SEE(User_Input)
|
|||
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_SEE(User_Input)
|
||||
*/{
|
||||
|
@ -1356,7 +1340,8 @@ DOC_SEE(User_Input)
|
|||
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_SEE(Mouse_State)
|
||||
*/{
|
||||
|
@ -1367,7 +1352,9 @@ DOC_SEE(Mouse_State)
|
|||
}
|
||||
|
||||
#if 0
|
||||
GET_EVENT_MESSAGE_SIG(external_get_event_message){
|
||||
//API_EXPORT
|
||||
Event_Message
|
||||
Get_Event_Message (Application_Links *app){
|
||||
Event_Message message = {0};
|
||||
System_Functions *system = (System_Functions*)app->system_links;
|
||||
Coroutine *coroutine = (Coroutine*)app->current_coroutine;
|
||||
|
@ -1382,7 +1369,8 @@ GET_EVENT_MESSAGE_SIG(external_get_event_message){
|
|||
}
|
||||
#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(flags, not currently used)
|
||||
DOC_RETURN(returns non-zero on success)
|
||||
|
@ -1404,7 +1392,8 @@ until the command returns.
|
|||
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(flags, not currently used)
|
||||
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);
|
||||
}
|
||||
|
||||
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(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));
|
||||
}
|
||||
|
||||
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(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(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(count, the number of color structs in the colors array)
|
||||
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(count, the number of color structs in the colors array)
|
||||
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
|
||||
|
||||
|
|
751
4ed_metagen.cpp
751
4ed_metagen.cpp
|
@ -19,6 +19,8 @@
|
|||
#define FCPP_LEXER_IMPLEMENTATION
|
||||
#include "4cpp_lexer.h"
|
||||
|
||||
#include "4coder_version.h"
|
||||
|
||||
struct Struct_Field{
|
||||
char *type;
|
||||
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 *ret;
|
||||
String *args;
|
||||
|
||||
String *macros;
|
||||
String *public_name;
|
||||
String *doc_string;
|
||||
|
||||
int *valid;
|
||||
};
|
||||
|
||||
Argument_Breakdown *breakdown;
|
||||
Documentation *doc;
|
||||
} Function_Set;
|
||||
|
||||
void
|
||||
zero_index(Function_Set fnc_set, int sig_count){
|
||||
|
@ -416,6 +438,13 @@ chop_whitespace(String str){
|
|||
return(result);
|
||||
}
|
||||
|
||||
String
|
||||
skip_chop_whitespace(String str){
|
||||
str = skip_whitespace(str);
|
||||
str = chop_whitespace(str);
|
||||
return(str);
|
||||
}
|
||||
|
||||
int
|
||||
is_comment(String str){
|
||||
int result = 0;
|
||||
|
@ -428,9 +457,8 @@ is_comment(String str){
|
|||
return(result);
|
||||
}
|
||||
|
||||
struct Doc_Parse{
|
||||
struct Parse{
|
||||
Cpp_Token_Stack tokens;
|
||||
String doc_string;
|
||||
};
|
||||
|
||||
int
|
||||
|
@ -454,6 +482,13 @@ check_and_fix_docs(String *lexeme){
|
|||
return(result);
|
||||
}
|
||||
|
||||
enum Doc_Note_Type{
|
||||
DOC_PARAM,
|
||||
DOC_RETURN,
|
||||
DOC,
|
||||
DOC_SEE
|
||||
};
|
||||
|
||||
static String
|
||||
doc_note_string[] = {
|
||||
make_lit_string("DOC_PARAM"),
|
||||
|
@ -462,27 +497,195 @@ doc_note_string[] = {
|
|||
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
|
||||
perform_doc_parse(Doc_Parse *parse, String lexeme){
|
||||
#if 0
|
||||
perform_doc_parse(String doc_string, Documentation *doc){
|
||||
int keep_parsing = true;
|
||||
int pos = 0;
|
||||
|
||||
int param_count = 0;
|
||||
int see_count = 0;
|
||||
|
||||
do{
|
||||
String doc_note = doc_parse_identifier(lexeme, &pos);
|
||||
String doc_note = doc_parse_note(doc_string, &pos);
|
||||
if (doc_note.size == 0){
|
||||
keep_parsing = false;
|
||||
}
|
||||
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);
|
||||
|
||||
switch (doc_note_type){
|
||||
case DOC_PARAM:
|
||||
++param_count;
|
||||
break;
|
||||
|
||||
case DOC_SEE:
|
||||
++see_count;
|
||||
break;
|
||||
}
|
||||
else{
|
||||
// TODO(allen): do warning
|
||||
}
|
||||
}
|
||||
}while(keep_parsing);
|
||||
#endif
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
char*
|
||||
|
@ -492,92 +695,242 @@ generate_custom_headers(){
|
|||
|
||||
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.name = (String*)malloc((sizeof(String)*5 + sizeof(int))*line_count);
|
||||
// NOTE(allen): Documentation
|
||||
String code_data[2];
|
||||
code_data[0] = file_dump("4ed_api_implementation.cpp");
|
||||
code_data[1] = file_dump("win32_api_impl.cpp");
|
||||
Parse parses[2];
|
||||
|
||||
int max_name_size = 0;
|
||||
int line_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;
|
||||
|
||||
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 &&
|
||||
!(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){
|
||||
++line_count;
|
||||
|
||||
if (max_name_size < token->size){
|
||||
max_name_size = token->size;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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.valid = (int*)(function_set.public_name + 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 max_name_size = 0;
|
||||
int sig_count = 0;
|
||||
line_count = 0;
|
||||
for (line = get_first_line(data);
|
||||
line.str;
|
||||
line = get_next_line(data, line)){
|
||||
for (int J = 0; J < 2; ++J){
|
||||
String *code = &code_data[J];
|
||||
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 = skip_whitespace(parse);
|
||||
parse = chop_whitespace(parse);
|
||||
if (parse.size > 0){
|
||||
if (!is_comment(parse)){
|
||||
zero_index(function_set, sig_count);
|
||||
int valid = false;
|
||||
int count = parse->tokens.count;
|
||||
Cpp_Token *tokens = parse->tokens.tokens;
|
||||
|
||||
int pos = find(parse, 0, ' ');
|
||||
function_set.ret[sig_count] = substr(parse, 0, pos);
|
||||
parse = substr(parse, pos);
|
||||
parse = skip_whitespace(parse);
|
||||
Cpp_Token *token = 0;
|
||||
|
||||
if (parse.size > 0){
|
||||
pos = find(parse, 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;
|
||||
|
||||
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;
|
||||
for (; i < count; ++i, ++token){
|
||||
if (token->type == CPP_TOKEN_PARENTHESE_OPEN){
|
||||
break;
|
||||
}
|
||||
function_set.valid[sig_count] = valid;
|
||||
}
|
||||
|
||||
if (max_name_size < name_string.size){
|
||||
max_name_size = name_string.size;
|
||||
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 (!valid){
|
||||
printf("custom_api_spec.cpp(%d) : generator warning : invalid function signature\n",
|
||||
line_count);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FILE *file = fopen(API_H, "wb");
|
||||
// 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){
|
||||
String name_string = function_set.name[i];
|
||||
|
@ -601,6 +954,9 @@ generate_custom_headers(){
|
|||
to_lower(public_name);
|
||||
}
|
||||
|
||||
// NOTE(allen): Header
|
||||
FILE *file = fopen(API_H, "wb");
|
||||
|
||||
for (int i = 0; i < sig_count; ++i){
|
||||
String ret_string = function_set.ret[i];
|
||||
String args_string = function_set.args[i];
|
||||
|
@ -647,13 +1003,14 @@ generate_custom_headers(){
|
|||
|
||||
fprintf(file, "#define FillAppLinksAPI(app_links) do{");
|
||||
for (int i = 0; i < sig_count; ++i){
|
||||
String name = function_set.name[i];
|
||||
String public_string = function_set.public_name[i];
|
||||
|
||||
fprintf(file,
|
||||
"\\\n"
|
||||
"app_links->%.*s = external_%.*s;",
|
||||
"app_links->%.*s = %.*s;",
|
||||
public_string.size, public_string.str,
|
||||
public_string.size, public_string.str
|
||||
name.size, name.str
|
||||
);
|
||||
}
|
||||
fprintf(file, " } while(false)\n");
|
||||
|
@ -661,75 +1018,223 @@ generate_custom_headers(){
|
|||
fclose(file);
|
||||
|
||||
// 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");
|
||||
|
||||
#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,
|
||||
"<html lang=\"en-US\">\n"
|
||||
"<head>\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"
|
||||
"<body style='font-family:Arial;'>\n"
|
||||
"<h1>4coder API</h1>"
|
||||
"<body>\n"
|
||||
"<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,
|
||||
"<h2>\n§1 Introduction</h2>\n"
|
||||
"<div style='margin-bottom: 5mm;'><i>Coming Soon</i></div>");
|
||||
"<h2>§1 Introduction</h2>\n"
|
||||
"<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>§2 Types and Functions</h2>\n");
|
||||
{
|
||||
#undef SECTION
|
||||
#define SECTION "2.1"
|
||||
|
||||
fprintf(file,
|
||||
"<h3>§"SECTION" Function List</h3>\n"
|
||||
"<ul>\n");
|
||||
|
||||
fprintf(file, "<h2>\n§2 Functions</h2>\n");
|
||||
for (int i = 0; i < sig_count; ++i){
|
||||
String name = function_set.public_name[i];
|
||||
fprintf(file,
|
||||
"<div>\n"
|
||||
"%.*s\n"
|
||||
"</div>\n",
|
||||
"<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,
|
||||
"</body>"
|
||||
"<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,
|
||||
"</div>\n"
|
||||
"</body>\n"
|
||||
"</html>\n"
|
||||
);
|
||||
|
||||
|
|
|
@ -359,7 +359,7 @@ part_free(void *ptr, void *context){
|
|||
#include "stb_truetype.h"
|
||||
|
||||
internal i32
|
||||
font_load_stb(Partition *part,
|
||||
stb_font_load(Partition *part,
|
||||
Render_Font *font_out,
|
||||
char *filename_untranslated,
|
||||
i32 pt_size,
|
||||
|
|
|
@ -1,14 +1,5 @@
|
|||
@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
|
||||
"build_all.bat" /DFRED_SUPER /DFRED_INTERNAL /Zi
|
||||
REM "build_all.bat" /O2 /Zi
|
||||
|
|
|
@ -21,22 +21,23 @@ pushd ..\code
|
|||
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
||||
popd
|
||||
|
||||
|
||||
pushd ..\build
|
||||
REM call "..\code\buildsuper.bat" ..\code\4coder_default_bindings.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
|
||||
if %ERRORLEVEL% neq 0 (set FirstError=1)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
call "print_size.bat" 4ed_app.dll
|
||||
call "print_size.bat" 4ed.exe
|
||||
REM call "print_size.bat" 4ed_app.dll
|
||||
REM call "print_size.bat" 4ed.exe
|
||||
|
||||
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
|
||||
|
||||
call "build_all.bat" /O2 /DFRED_KEEP_ASSERT
|
||||
del ..\current_dist\4coder\*.html
|
||||
copy ..\build\4ed.exe ..\current_dist\4coder\*
|
||||
copy ..\build\4ed.pdb ..\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 README.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\4coder\basic.cpp
|
||||
del ..\current_dist\4coder\.4coder_settings
|
||||
|
||||
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.pdb ..\current_dist_super\4coder\*
|
||||
copy ..\build\4ed_app.dll ..\current_dist_super\4coder\*
|
||||
|
|
107
win32_4ed.cpp
107
win32_4ed.cpp
|
@ -867,100 +867,12 @@ Sys_File_Unique_Hash_Sig(system_file_unique_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){
|
||||
DWORD attrib = GetFileAttributesA(path);
|
||||
return (attrib != INVALID_FILE_ATTRIBUTES &&
|
||||
(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
|
||||
Sys_Get_Binary_Path_Sig(system_get_binary_path){
|
||||
i32 result = 0;
|
||||
|
@ -974,16 +886,7 @@ Sys_Get_Binary_Path_Sig(system_get_binary_path){
|
|||
return(result);
|
||||
}
|
||||
|
||||
// NOTE(allen): Exposed to the custom layer.
|
||||
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));
|
||||
}
|
||||
|
||||
#include "win32_api_impl.cpp"
|
||||
|
||||
//
|
||||
// Clipboard
|
||||
|
@ -1227,7 +1130,7 @@ Font_Load_Sig(system_draw_font_load){
|
|||
|
||||
#else
|
||||
|
||||
success = font_load(&win32vars.font_part,
|
||||
success = stb_font_load(&win32vars.font_part,
|
||||
font_out,
|
||||
filename,
|
||||
pt_size,
|
||||
|
@ -1323,9 +1226,9 @@ Win32LoadSystemCode(){
|
|||
win32vars.system.file_load_end = system_file_load_end;
|
||||
win32vars.system.file_save = system_file_save;
|
||||
|
||||
win32vars.system.file_exists = system_file_exists;
|
||||
win32vars.system.directory_cd = system_directory_cd;
|
||||
win32vars.system.get_4ed_path = system_get_4ed_path;
|
||||
win32vars.system.file_exists = File_Exists;
|
||||
win32vars.system.directory_cd = Directory_CD;
|
||||
win32vars.system.get_4ed_path = Get_4ed_Path;
|
||||
|
||||
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