/* * Mr. 4th Dimention - Allen Webster * * 21.01.2014 * * System functions for project codename "4ed" * */ // TOP struct System_Functions; struct Plat_Handle{ u32 d[4]; }; struct File_Data{ void *data; u32 size; }; struct Time_Stamp{ u64 time; b32 success; }; #define Sys_Load_File_Sig(name) File_Data name(char *filename) typedef Sys_Load_File_Sig(System_Load_File); #define Sys_Save_File_Sig(name) i32 name(char *filename, void *data, i32 size) typedef Sys_Save_File_Sig(System_Save_File); #define Sys_File_Size_Sig(name) i32 name(char *filename) typedef Sys_File_Size_Sig(System_File_Size); #define Sys_File_Time_Stamp_Sig(name) Time_Stamp name(char *filename) typedef Sys_File_Time_Stamp_Sig(System_File_Time_Stamp); #define Sys_Time_Stamp_Now_Sig(name) u64 name() typedef Sys_Time_Stamp_Now_Sig(System_Time_Stamp_Now); #if 0 #define Sys_Free_File_Sig(name) void name(File_Data file) typedef Sys_Free_File_Sig(System_Free_File); #endif #define Sys_Get_Current_Directory_Sig(name) i32 name(char *out, i32 max) typedef Sys_Get_Current_Directory_Sig(System_Get_Current_Directory); #define Sys_Get_Easy_Directory_Sig(name) i32 name(char *destination) typedef Sys_Get_Easy_Directory_Sig(System_Get_Easy_Directory); struct File_Info{ String filename; b32 folder; }; struct File_List{ File_Info *infos; void *block; i32 count; }; #define Sys_Get_File_List_Sig(name) File_List name(String directory) typedef Sys_Get_File_List_Sig(System_Get_File_List); #define Sys_Free_File_List_Sig(name) void name(File_List list) typedef Sys_Free_File_List_Sig(System_Free_File_List); #define Sys_Get_Memory_Sig(name) void* name(i32 size, i32 line_number, char *filename) typedef Sys_Get_Memory_Sig(System_Get_Memory); #define get_memory(size) get_memory_full(size, __LINE__, __FILE__) #define Sys_Free_Memory_Sig(name) void name(void *block) typedef Sys_Free_Memory_Sig(System_Free_Memory); #define Sys_Post_Clipboard_Sig(name) void name(String str) typedef Sys_Post_Clipboard_Sig(System_Post_Clipboard); #define Sys_Time_Sig(name) i64 name() typedef Sys_Time_Sig(System_Time); struct CLI_Handles{ Plat_Handle proc; Plat_Handle out_read; Plat_Handle out_write; u32 scratch_space[4]; }; #define Sys_CLI_Call_Sig(name) b32 name(char *path, char *script, CLI_Handles *cli) typedef Sys_CLI_Call_Sig(System_CLI_Call); #define Sys_CLI_Begin_Update_Sig(name) void name(CLI_Handles *cli) typedef Sys_CLI_Begin_Update_Sig(System_CLI_Begin_Update); #define Sys_CLI_Update_Step_Sig(name) b32 name(CLI_Handles *cli, char *dest, u32 max, u32 *amount) typedef Sys_CLI_Update_Step_Sig(System_CLI_Update_Step); #define Sys_CLI_End_Update_Sig(name) b32 name(CLI_Handles *cli) typedef Sys_CLI_End_Update_Sig(System_CLI_End_Update); struct Thread_Context; enum Lock_ID{ FRAME_LOCK, CANCEL_LOCK0, CANCEL_LOCK1, CANCEL_LOCK2, CANCEL_LOCK3, CANCEL_LOCK4, CANCEL_LOCK5, CANCEL_LOCK6, CANCEL_LOCK7, LOCK_COUNT }; enum Thread_Group_ID{ BACKGROUND_THREADS, THREAD_GROUP_COUNT }; struct Thread_Memory{ void *data; i32 size; i32 id; }; #define Job_Callback(name) void name(System_Functions *system, Thread_Context *thread, Thread_Memory *memory, void *data[2]) typedef Job_Callback(Job_Callback); struct Job_Data{ Job_Callback *callback; void *data[2]; i32 memory_request; }; #define Sys_Thread_Get_ID_Sig(name) u32 name(Thread_Context *thread) typedef Sys_Thread_Get_ID_Sig(System_Thread_Get_ID); #define Sys_Thread_Current_Job_ID_Sig(name) u32 name(Thread_Context *thread) typedef Sys_Thread_Current_Job_ID_Sig(System_Thread_Current_Job_ID); #define Sys_Post_Job_Sig(name) u32 name(Thread_Group_ID id, Job_Data job) typedef Sys_Post_Job_Sig(System_Post_Job); #define Sys_Cancel_Job_Sig(name) void name(Thread_Group_ID id, u32 job_id) typedef Sys_Cancel_Job_Sig(System_Cancel_Job); #define Sys_Job_Is_Pending_Sig(name) b32 name(Thread_Group_ID id, u32 job_id) typedef Sys_Job_Is_Pending_Sig(System_Job_Is_Pending); #define Sys_Grow_Thread_Memory_Sig(name) void name(Thread_Memory *memory) typedef Sys_Grow_Thread_Memory_Sig(System_Grow_Thread_Memory); #define Sys_Acquire_Lock_Sig(name) void name(i32 id) typedef Sys_Acquire_Lock_Sig(System_Acquire_Lock); #define Sys_Release_Lock_Sig(name) void name(i32 id) typedef Sys_Release_Lock_Sig(System_Release_Lock); #define Sys_Force_Redraw_Sig(name) void name() typedef Sys_Force_Redraw_Sig(System_Force_Redraw); #define INTERNAL_Sys_Sentinel_Sig(name) Bubble* name() typedef INTERNAL_Sys_Sentinel_Sig(INTERNAL_System_Sentinel); #define INTERNAL_Sys_Get_Thread_States_Sig(name) void name(Thread_Group_ID id, b8 *running, i32 *pending) typedef INTERNAL_Sys_Get_Thread_States_Sig(INTERNAL_System_Get_Thread_States); struct System_Functions{ System_Load_File *load_file; System_Save_File *save_file; System_File_Time_Stamp *file_time_stamp; System_Time_Stamp_Now *time_stamp_now; System_Free_File *free_file; System_Get_Current_Directory *get_current_directory; System_Get_Easy_Directory *get_easy_directory; System_Get_File_List *get_file_list; System_Free_File_List *free_file_list; System_Get_Memory *get_memory_full; System_Free_Memory *free_memory; System_Post_Clipboard *post_clipboard; System_Time *time; System_CLI_Call *cli_call; System_CLI_Begin_Update *cli_begin_update; System_CLI_Update_Step *cli_update_step; System_CLI_End_Update *cli_end_update; System_Thread_Get_ID *thread_get_id; System_Thread_Current_Job_ID *thread_current_job_id; System_Post_Job *post_job; System_Cancel_Job *cancel_job; System_Job_Is_Pending *job_is_pending; System_Grow_Thread_Memory *grow_thread_memory; System_Acquire_Lock *acquire_lock; System_Release_Lock *release_lock; System_Force_Redraw *force_redraw; INTERNAL_System_Sentinel *internal_sentinel; INTERNAL_System_Get_Thread_States *internal_get_thread_states; }; // BOTTOM