diff --git a/4ed_system.h b/4ed_system.h index 87c8d51a..e87cf336 100644 --- a/4ed_system.h +++ b/4ed_system.h @@ -195,6 +195,9 @@ typedef Sys_File_Exists_Sig(System_File_Exists); #define Sys_Directory_CD_Sig(name) bool32 name(char *dir, i32 *len, i32 cap, char *rel_path, i32 rel_len) typedef Sys_Directory_CD_Sig(System_Directory_CD); +#define Sys_Get_Current_Path_Sig(name) int32_t name(char *out, i32 capacity) +typedef Sys_Get_Current_Path_Sig(System_Get_Current_Path); + #define Sys_Get_4ed_Path_Sig(name) int32_t name(char *out, i32 capacity) typedef Sys_Get_4ed_Path_Sig(System_Get_4ed_Path); @@ -222,16 +225,16 @@ struct System_Functions{ Font_Functions font; // files (tracked api): 10 - System_Set_File_List *set_file_list; - System_Get_Canonical *get_canonical; - System_Add_Listener *add_listener; + System_Set_File_List *set_file_list; + System_Get_Canonical *get_canonical; + System_Add_Listener *add_listener; System_Remove_Listener *remove_listener; System_Get_File_Change *get_file_change; - System_Load_Handle *load_handle; - System_Load_Size *load_size; - System_Load_File *load_file; - System_Load_Close *load_close; - System_Save_File *save_file; + System_Load_Handle *load_handle; + System_Load_Size *load_size; + System_Load_File *load_file; + System_Load_Close *load_close; + System_Save_File *save_file; // time: 1 System_Now_Time *now_time; @@ -243,21 +246,21 @@ struct System_Functions{ System_Create_Coroutine *create_coroutine; System_Launch_Coroutine *launch_coroutine; System_Resume_Coroutine *resume_coroutine; - System_Yield_Coroutine *yield_coroutine; + System_Yield_Coroutine *yield_coroutine; // cli: 4 - System_CLI_Call *cli_call; + 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_CLI_Update_Step *cli_update_step; + System_CLI_End_Update *cli_end_update; // threads: 6 - System_Post_Job *post_job; - System_Cancel_Job *cancel_job; - System_Check_Cancel *check_cancel; + System_Post_Job *post_job; + System_Cancel_Job *cancel_job; + System_Check_Cancel *check_cancel; System_Grow_Thread_Memory *grow_thread_memory; - System_Acquire_Lock *acquire_lock; - System_Release_Lock *release_lock; + System_Acquire_Lock *acquire_lock; + System_Release_Lock *release_lock; // custom: 10 System_Memory_Allocate *memory_allocate; @@ -265,6 +268,7 @@ struct System_Functions{ System_Memory_Free *memory_free; System_File_Exists *file_exists; System_Directory_CD *directory_cd; + System_Get_Current_Path *get_current_path; System_Get_4ed_Path *get_4ed_path; System_Show_Mouse_Cursor *show_mouse_cursor; System_Set_Fullscreen *set_fullscreen; diff --git a/meta/4ed_file_moving.h b/meta/4ed_file_moving.h index a9afb480..8b7a1389 100644 --- a/meta/4ed_file_moving.h +++ b/meta/4ed_file_moving.h @@ -32,7 +32,7 @@ static i32 prev_error = 0; #endif #define systemf(...) do{ \ - int32_t n = snprintf(SF_CMD, sizeof(SF_CMD), __VA_ARGS__); \ + i32 n = snprintf(SF_CMD, sizeof(SF_CMD), __VA_ARGS__); \ AllowLocal(n); \ Assert(n < sizeof(SF_CMD)); \ SYSTEMF_PRINTF("%s\n", SF_CMD); \ @@ -49,8 +49,8 @@ internal void fm_init_system(); internal u64 fm_get_time(); #define LLU_CAST(n) (long long unsigned int)(n) -#define BEGIN_TIME_SECTION() uint64_t start = fm_get_time() -#define END_TIME_SECTION(n) uint64_t total = fm_get_time() - start; printf("%-20s: %.2llu.%.6llu\n", (n), LLU_CAST(total/1000000), LLU_CAST(total%1000000)); +#define BEGIN_TIME_SECTION() u64 start = fm_get_time() +#define END_TIME_SECTION(n) u64 total = fm_get_time() - start; printf("%-20s: %.2llu.%.6llu\n", (n), LLU_CAST(total/1000000), LLU_CAST(total%1000000)); // Files and Folders Manipulation internal void fm_make_folder_if_missing(char *dir); @@ -228,12 +228,12 @@ fm_align(){ #if defined(IS_WINDOWS) -typedef uint32_t DWORD; -typedef int32_t LONG; -typedef int64_t LONGLONG; +typedef u32 DWORD; +typedef i32 LONG; +typedef i64 LONGLONG; typedef char* LPTSTR; typedef char* LPCTSTR; -typedef int32_t BOOL; +typedef i32 BOOL; typedef void* LPSECURITY_ATTRIBUTES; typedef union _LARGE_INTEGER { struct { @@ -302,7 +302,7 @@ extern "C"{ #define FILE_ATTRIBUTE_NORMAL 0x00000080 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100 -static uint64_t perf_frequency; +static u64 perf_frequency; static void fm_init_system(){ @@ -326,9 +326,9 @@ fm_popdir(Temp_Dir temp){ SetCurrentDirectoryA(temp.dir); } -static uint64_t +static u64 fm_get_time(){ - uint64_t time = 0; + u64 time = 0; LARGE_INTEGER lint; if (QueryPerformanceCounter(&lint)){ time = lint.QuadPart; @@ -337,9 +337,9 @@ fm_get_time(){ return(time); } -static int32_t -fm_get_current_directory(char *buffer, int32_t max){ - int32_t result = GetCurrentDirectoryA(max, buffer); +static i32 +fm_get_current_directory(char *buffer, i32 max){ + i32 result = GetCurrentDirectoryA(max, buffer); return(result); } @@ -368,7 +368,7 @@ fm_execute_in_dir(char *dir, char *str, char *args){ static void fm_slash_fix(char *path){ if (path != 0){ - for (int32_t i = 0; path[i]; ++i){ + for (i32 i = 0; path[i]; ++i){ if (path[i] == '/') path[i] = '\\'; } } @@ -458,7 +458,7 @@ static Temp_Dir fm_pushdir(char *dir){ Temp_Dir temp; char *result = getcwd(temp.dir, sizeof(temp.dir)); - int32_t chresult = chdir(dir); + i32 chresult = chdir(dir); if (result == 0 || chresult != 0){ printf("trying pushdir %s\n", dir); Assert(result != 0); @@ -477,18 +477,18 @@ fm_init_system(){ fm__init_memory(); } -static uint64_t +static u64 fm_get_time(){ struct timespec spec; - uint64_t result; + u64 result; clock_gettime(CLOCK_MONOTONIC, &spec); - result = (spec.tv_sec * (uint64_t)(1000000)) + (spec.tv_nsec / (uint64_t)(1000)); + result = (spec.tv_sec * (u64)(1000000)) + (spec.tv_nsec / (u64)(1000)); return(result); } -static int32_t -fm_get_current_directory(char *buffer, int32_t max){ - int32_t result = 0; +static i32 +fm_get_current_directory(char *buffer, i32 max){ + i32 result = 0; char *d = getcwd(buffer, max); if (d == buffer){ result = strlen(buffer); diff --git a/platform_all/4ed_link_system_functions.cpp b/platform_all/4ed_link_system_functions.cpp index a90b8a19..10d32d5f 100644 --- a/platform_all/4ed_link_system_functions.cpp +++ b/platform_all/4ed_link_system_functions.cpp @@ -14,7 +14,7 @@ #define SYSLINK(name) sysfunc.name = system_##name internal void -link_system_code(System_Functions *system){ +link_system_code(){ SYSLINK(set_file_list); SYSLINK(get_canonical); SYSLINK(add_listener); @@ -52,6 +52,7 @@ link_system_code(System_Functions *system){ SYSLINK(memory_free); SYSLINK(file_exists); SYSLINK(directory_cd); + SYSLINK(get_current_path); SYSLINK(get_4ed_path); SYSLINK(set_fullscreen); SYSLINK(is_fullscreen); diff --git a/platform_all/4ed_shared_init_logic.cpp b/platform_all/4ed_shared_init_logic.cpp index f447e33e..84f0517d 100644 --- a/platform_all/4ed_shared_init_logic.cpp +++ b/platform_all/4ed_shared_init_logic.cpp @@ -47,7 +47,7 @@ internal void load_app_code(){ App_Get_Functions *get_funcs = 0; - if (system_load_library(&libraries.app_code, "4ed_app")){ + if (system_load_library(&libraries.app_code, "4ed_app", LoadLibrary_BinaryDirectory)){ get_funcs = (App_Get_Functions*)system_get_proc(&libraries.app_code, "app_get_functions"); } else{ @@ -64,5 +64,61 @@ load_app_code(){ } } +global char custom_fail_version_msg[] = "Failed to load custom code due to missing version information or a version mismatch. Try rebuilding with buildsuper."; + +global char custom_fail_missing_get_bindings_msg[] = "Failed to load custom code due to missing 'get_bindings' symbol. Try rebuilding with buildsuper."; + +internal void +load_custom_code(){ + local_persist char *default_file = "custom_4coder"; + local_persist Load_Library_Location locations[] = { + LoadLibrary_CurrentDirectory, + LoadLibrary_BinaryDirectory, + }; + + char *custom_files[3] = {0}; + if (plat_settings.custom_dll != 0){ + custom_files[0] = plat_settings.custom_dll; + if (!plat_settings.custom_dll_is_strict){ + custom_files[1] = default_file; + } + } + else{ + custom_files[0] = default_file; + } + + char success_file[4096]; + b32 has_library = false; + for (u32 i = 0; custom_files[i] != 0 && !has_library; ++i){ + char *file = custom_files[i]; + for (u32 j = 0; j < ArrayCount(locations) && !has_library; ++j){ + if (system_load_library(&libraries.custom, file, locations[j], success_file, sizeof(success_file))){ + has_library = true; + success_file[sizeof(success_file) - 1] = 0; + } + } + } + + if (!has_library){ + system_error_box("Did not find a library for the custom layer."); + } + + custom_api.get_alpha_4coder_version = (_Get_Version_Function*) + system_get_proc(&libraries.custom, "get_alpha_4coder_version"); + + if (custom_api.get_alpha_4coder_version == 0 || custom_api.get_alpha_4coder_version(MAJOR, MINOR, PATCH) == 0){ + system_error_box(custom_fail_version_msg); + } + + custom_api.get_bindings = (Get_Binding_Data_Function*) + system_get_proc(&libraries.custom, "get_bindings"); + + if (custom_api.get_bindings == 0){ + system_error_box(custom_fail_missing_get_bindings_msg); + } + + LOGF("Loaded custom file: %s\n", success_file); +} + // BOTTOM diff --git a/platform_all/4ed_shared_library_constants.h b/platform_all/4ed_shared_library_constants.h new file mode 100644 index 00000000..95194bcd --- /dev/null +++ b/platform_all/4ed_shared_library_constants.h @@ -0,0 +1,94 @@ +/* + * Mr. 4th Dimention - Allen Webster + * + * 19.07.2017 + * + * Cross platform library constants + * + */ + +// TOP + +#if !defined(FRED_SHARED_LIBRARY_CONSTANTS_H) +#define FRED_SHARED_LIBRARY_CONSTANTS_H + +// Wrapper functions +union Library; + +internal b32 +system_load_library_direct(Library *library, char *name); + +internal void* +system_get_proc(Library *library, char *name); + +internal void +system_free_library(Library *library); + +// Shared logic +#define LIBRARY_TYPE_SIZE 32 + +#define AssertLibrarySizes() Assert(sizeof(Library) == LIBRARY_TYPE_SIZE) + +typedef u32 Load_Library_Location; +enum{ + LoadLibrary_CurrentDirectory, + LoadLibrary_BinaryDirectory, +}; + +internal b32 +system_load_library(Library *library, char *name, Load_Library_Location location, char *full_file_out, u32 full_file_max){ + char space[4096]; + String extension = file_extension(make_string_slowly(name)); + if (!match(extension, DLL)){ + String full_name = make_fixed_width_string(space); + append(&full_name, name); + append(&full_name, "."DLL); + if (terminate_with_null(&full_name)){ + name = space; + } + else{ + name = 0; + } + } + + char path_space[4096]; + String path = make_fixed_width_string(path_space); + switch (location){ + case LoadLibrary_CurrentDirectory: + { + path.size = sysfunc.get_current_path(path.str, path.memory_size); + }break; + + case LoadLibrary_BinaryDirectory: + { + path.size = sysfunc.get_4ed_path(path.str, path.memory_size); + }break; + + default: LOG("Invalid library location passed.\n"); break; + } + + b32 success = false; + if (path.size > 0){ + append(&path, SLASH); + append(&path, name); + terminate_with_null(&path); + success = system_load_library_direct(library, path.str); + if (success && full_file_out != 0){ + String out = make_string_cap(full_file_out, 0, full_file_max); + copy(&out, path); + terminate_with_null(&out); + } + } + + return(success); +} + +internal b32 +system_load_library(Library *library, char *name, Load_Library_Location location){ + system_load_library(library, name, location, 0, 0); +} + +#endif + +// BOTTOM + diff --git a/platform_all/4ed_standard_libraries.cpp b/platform_all/4ed_standard_libraries.cpp index 1842ad0f..85bb4315 100644 --- a/platform_all/4ed_standard_libraries.cpp +++ b/platform_all/4ed_standard_libraries.cpp @@ -11,6 +11,7 @@ struct Libraries{ Library app_code; + Library custom; }; // BOTTOM diff --git a/platform_all/4ed_system_shared.cpp b/platform_all/4ed_system_shared.cpp index b27c6870..bb5d502d 100644 --- a/platform_all/4ed_system_shared.cpp +++ b/platform_all/4ed_system_shared.cpp @@ -223,31 +223,9 @@ sysshared_to_binary_path(String *out_filename, char *filename){ } // -// Rendering +// Rendering Interface // -inline void -draw_set_clip(Render_Target *target, i32_Rect clip_box){ - glScissor(clip_box.x0, target->height - clip_box.y1, clip_box.x1 - clip_box.x0, clip_box.y1 - clip_box.y0); -} - -inline void -draw_bind_texture(Render_Target *target, i32 texid){ - if (target->bound_texture != texid){ - glBindTexture(GL_TEXTURE_2D, texid); - target->bound_texture = texid; - } -} - -inline void -draw_set_color(Render_Target *target, u32 color){ - if (target->color != color){ - target->color = color; - Vec4 c = unpack_color4(color); - glColor4f(c.r, c.g, c.b, c.a); - } -} - inline void draw_safe_push(Render_Target *target, i32 size, void *x){ if (size + target->size <= target->max){ @@ -327,8 +305,41 @@ draw_pop_clip(Render_Target *target){ return(result); } +internal void +link_rendering(){ + target.push_clip = draw_push_clip; + target.pop_clip = draw_pop_clip; + target.push_piece = draw_push_piece; +} + +// +// OpenGL +// + #define ExtractStruct(s) ((s*)cursor); cursor += sizeof(s) +inline void +draw_set_clip(Render_Target *target, i32_Rect clip_box){ + glScissor(clip_box.x0, target->height - clip_box.y1, clip_box.x1 - clip_box.x0, clip_box.y1 - clip_box.y0); +} + +inline void +draw_bind_texture(Render_Target *target, i32 texid){ + if (target->bound_texture != texid){ + glBindTexture(GL_TEXTURE_2D, texid); + target->bound_texture = texid; + } +} + +inline void +draw_set_color(Render_Target *target, u32 color){ + if (target->color != color){ + target->color = color; + Vec4 c = unpack_color4(color); + glColor4f(c.r, c.g, c.b, c.a); + } +} + inline void private_draw_rectangle(Render_Target *target, f32_Rect rect, u32 color){ draw_set_color(target, color); diff --git a/platform_linux/linux_4ed.cpp b/platform_linux/linux_4ed.cpp index 78006239..f652ea00 100644 --- a/platform_linux/linux_4ed.cpp +++ b/platform_linux/linux_4ed.cpp @@ -121,8 +121,12 @@ internal void LinuxStringDup(String*, void*, size_t); //////////////////////////////// +#define SLASH '/' +#define DLL "so" + global System_Functions sysfunc; -#include "linux_4ed_libraries.cpp" +#include "4ed_shared_library_constants.h" +#include "linux_library_wrapper.h" #include "4ed_standard_libraries.cpp" //////////////////////////////// @@ -174,13 +178,10 @@ struct Linux_Vars{ b32 hide_cursor; Cursor hidden_cursor; - void *custom; - sem_t thread_semaphore; i32 dpi_x, dpi_y; - Custom_API custom_api; b32 vsync; Linux_Coroutine coroutine_data[18]; @@ -196,6 +197,7 @@ global Plat_Settings plat_settings; global Libraries libraries; global App_Functions app; +global Custom_API custom_api; //////////////////////////////// @@ -210,9 +212,6 @@ linux_set_icon(Display* d, Window w){ //////////////////////////////// -#define SLASH '/' -#define DLL "so" - internal sem_t* handle_sem(Plat_Handle h){ return(*(sem_t**)&h); @@ -537,17 +536,6 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){ // End of system funcs // -// -// Linux init functions -// - -internal void -LinuxLoadRenderCode(){ - target.push_clip = draw_push_clip; - target.pop_clip = draw_pop_clip; - target.push_piece = draw_push_piece; -} - // // Renderer // @@ -1636,18 +1624,36 @@ LinuxHandleX11Events(void) int main(int argc, char **argv){ - // - // System & Memory init - // + memset(&linuxvars, 0, sizeof(linuxvars)); + memset(&target, 0, sizeof(target)); + memset(&memory_vars, 0, sizeof(memory_vars)); + memset(&plat_settings, 0, sizeof(plat_settings)); - load_app_code(); - link_system_code(&sysfunc); - LinuxLoadRenderCode(); - - system_memory_init(); + memset(&libraries, 0, sizeof(libraries)); + memset(&app, 0, sizeof(app)); + memset(&custom_api, 0, sizeof(custom_api)); init_shared_vars(); + // + // Linkage + // + + link_system_code(); + load_app_code(); + link_rendering(); +#if defined(FRED_SUPER) + load_custom_code(); +#else + custom_api.get_bindings = get_bindings; +#endif + + // + // Memory init + // + + system_memory_init(); + // // Read command line // @@ -1680,68 +1686,6 @@ main(int argc, char **argv){ sysshared_filter_real_files(files, file_count); - // - // Custom layer linkage - // - -#ifdef FRED_SUPER - - char base_dir_mem[PATH_MAX]; - String base_dir = make_fixed_width_string(base_dir_mem); - - char *custom_file_default = "custom_4coder.so"; - sysshared_to_binary_path(&base_dir, custom_file_default); - custom_file_default = base_dir.str; - - char *custom_file; - if (plat_settings.custom_dll){ - custom_file = plat_settings.custom_dll; - } - else{ - custom_file = custom_file_default; - } - - linuxvars.custom = dlopen(custom_file, RTLD_LAZY); - if (!linuxvars.custom && custom_file != custom_file_default){ - if (!plat_settings.custom_dll_is_strict){ - linuxvars.custom = dlopen(custom_file_default, RTLD_LAZY); - } - } - - if (linuxvars.custom){ - linuxvars.custom_api.get_alpha_4coder_version = (_Get_Version_Function*) - dlsym(linuxvars.custom, "get_alpha_4coder_version"); - - if (linuxvars.custom_api.get_alpha_4coder_version == 0 || - linuxvars.custom_api.get_alpha_4coder_version(MAJOR, MINOR, PATCH) == 0){ - system_error_box("Failed to load 'custom_4coder.so': Version mismatch. Try rebuilding it with 'buildsuper.sh'."); - } - else{ - linuxvars.custom_api.get_bindings = (Get_Binding_Data_Function*) - dlsym(linuxvars.custom, "get_bindings"); - - if (linuxvars.custom_api.get_bindings == 0){ - system_error_box("Failed to load 'custom_4coder.so': " - "It does not export the required 'get_bindings' function. " - "Try rebuilding it with 'buildsuper.sh'."); - } - else{ - LOG("Successfully loaded custom_4coder.so\n"); - } - } - } - else{ - char buf[4096]; - const char* error = dlerror(); - snprintf(buf, sizeof(buf), "Error loading custom: %s. " - "Make sure this file is in the same directory as the main '4ed' executable.", - error ? error : "'custom_4coder.so' missing"); - system_error_box(buf); - } -#else - linuxvars.custom_api.get_bindings = get_bindings; -#endif - // // Coroutines // @@ -1760,8 +1704,8 @@ main(int argc, char **argv){ // // Threads // - system_init_threaded_work_system(); + system_init_threaded_work_system(); // // X11 init @@ -1892,7 +1836,7 @@ main(int argc, char **argv){ XAddConnectionWatch(linuxvars.XDisplay, &LinuxX11ConnectionWatch, NULL); - app.init(&sysfunc, &target, &memory_vars, linuxvars.clipboard_contents, current_directory, linuxvars.custom_api); + app.init(&sysfunc, &target, &memory_vars, linuxvars.clipboard_contents, current_directory, custom_api); LinuxResizeTarget(window_width, window_height); diff --git a/platform_linux/linux_4ed_libraries.cpp b/platform_linux/linux_4ed_libraries.cpp deleted file mode 100644 index c03dcc3a..00000000 --- a/platform_linux/linux_4ed_libraries.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Mr. 4th Dimention - Allen Webster - * - * 18.07.2017 - * - * Linux library wrapper. - * - */ - -// TOP - -struct Library{ - void *lib; -}; - -internal b32 -system_load_library(Library *library, char *name){ - String extension = file_extension(make_string_slowly(name)); - char space[4096]; - if (!match(extension, "so")){ - String full_name = make_fixed_width_string(space); - append(&full_name, name); - append(&full_name, ".so"); - terminate_with_null(&full_name); - name = space; - } - - char path_space[4096]; - i32 size = sysfunc.get_4ed_path(path_space, sizeof(path_space)); - String full_path = make_string(path_space, size, sizeof(path_space)); - append(&full_path, "/"); - append(&full_path, name); - terminate_with_null(&full_path); - - library->lib = dlopen(full_path.str, RTLD_LAZY); - b32 success = (library->lib != 0); - return(success); -} - -internal void* -system_get_proc(Library *library, char *name){ - void *result = dlsym(library->lib, name); - return(result); -} - -internal void -system_free_library(Library *library){ - dlclose(library->lib); - library->lib = 0; -} - -// BOTTOM - diff --git a/platform_linux/linux_library_wrapper.h b/platform_linux/linux_library_wrapper.h new file mode 100644 index 00000000..0af75f92 --- /dev/null +++ b/platform_linux/linux_library_wrapper.h @@ -0,0 +1,38 @@ +/* + * Mr. 4th Dimention - Allen Webster + * + * 18.07.2017 + * + * Linux library wrapper. + * + */ + +// TOP + +union Library{ + void *lib; + FixSize(LIBRARY_TYPE_SIZE); +}; + +internal b32 +system_load_library_direct(Library *library, char *name){ + AssertLibrarySizes(); + library->lib = dlopen(name, RTLD_LAZY); + b32 success = (library->lib != 0); + return(success); +} + +internal void* +system_get_proc(Library *library, char *name){ + void *result = dlsym(library->lib, name); + return(result); +} + +internal void +system_free_library(Library *library){ + dlclose(library->lib); + library->lib = 0; +} + +// BOTTOM + diff --git a/platform_unix/unix_4ed_functions.cpp b/platform_unix/unix_4ed_functions.cpp index c8f433b6..50210e9c 100644 --- a/platform_unix/unix_4ed_functions.cpp +++ b/platform_unix/unix_4ed_functions.cpp @@ -18,6 +18,16 @@ global Unix_Vars unixvars; // 4ed Path // +internal +Sys_Get_Current_Path_Sig(system_get_current_path){ + i32 result = 0; + char *d = getcwd(out, capacity); + if (d == out){ + result = strlen(out); + } + return(result); +} + internal Sys_Get_4ed_Path_Sig(system_get_4ed_path){ ssize_t size = readlink("/proc/self/exe", out, capacity - 1); diff --git a/platform_win32/win32_4ed.cpp b/platform_win32/win32_4ed.cpp index e35d9d8d..2700cef4 100644 --- a/platform_win32/win32_4ed.cpp +++ b/platform_win32/win32_4ed.cpp @@ -113,15 +113,18 @@ struct Win32_Coroutine{ //////////////////////////////// +#define SLASH '\\' +#define DLL "dll" + global System_Functions sysfunc; -#include "win32_4ed_libraries.cpp" +#include "4ed_shared_library_constants.h" +#include "win32_library_wrapper.h" #include "4ed_standard_libraries.cpp" //////////////////////////////// struct Win32_Vars{ Custom_API custom_api; - HMODULE custom; Win32_Coroutine coroutine_data[18]; Win32_Coroutine *coroutine_free; @@ -172,9 +175,6 @@ global App_Functions app; //////////////////////////////// -#define SLASH '\\' -#define DLL "dll" - internal HANDLE handle_type(Plat_Handle h){ HANDLE result; @@ -577,13 +577,6 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){ #include "4ed_font_data.h" #include "4ed_system_shared.cpp" -internal void -Win32LoadRenderCode(){ - target.push_clip = draw_push_clip; - target.pop_clip = draw_pop_clip; - target.push_piece = draw_push_piece; -} - // // Helpers // @@ -1069,9 +1062,39 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS i32 argc = __argc; char **argv = __argv; - memset(&win32vars, 0, sizeof(win32vars)); + memset(&linuxvars, 0, sizeof(linuxvars)); + memset(&target, 0, sizeof(target)); + memset(&memory_vars, 0, sizeof(memory_vars)); + memset(&plat_settings, 0, sizeof(plat_settings)); - win32vars.bordered_win_pos.length = sizeof(win32vars.bordered_win_pos); + memset(&libraries, 0, sizeof(libraries)); + memset(&app, 0, sizeof(app)); + memset(&custom_api, 0, sizeof(custom_api)); + + init_shared_vars(); + + // + // Linkage + // + + link_system_code(); + load_app_code(); + link_rendering(); +#if defined(FRED_SUPER) + load_custom_code(); +#else + custom_api.get_bindings = get_bindings; +#endif + + // + // Memory Initialization + // + + system_memory_init(); + + // + // Threads + // system_init_threaded_work_system(); @@ -1085,26 +1108,6 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS win32vars.coroutine_data[i].next = &win32vars.coroutine_data[i + 1]; } - // - // Memory Initialization - // - - system_memory_init(); - - // - // System and Application Layer Linkage - // - - load_app_code(); - link_system_code(&sysfunc); - Win32LoadRenderCode(); - - // - // Shared Systems Init - // - - init_shared_vars(); - // // Read Command Line // @@ -1130,47 +1133,6 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS sysshared_filter_real_files(files, file_count); LOG("Loaded system code, read command line.\n"); - // - // Custom Layer Linkage - // - -#if defined(FRED_SUPER) - char *custom_file_default = "custom_4coder.dll"; - char *custom_file = 0; - if (plat_settings.custom_dll){ - custom_file = plat_settings.custom_dll; - } - else{ - custom_file = custom_file_default; - } - - LOGF("Trying to load custom DLL: %s\n", custom_file); - win32vars.custom = LoadLibraryA(custom_file); - if (!win32vars.custom && custom_file != custom_file_default){ - if (!plat_settings.custom_dll_is_strict){ - LOGF("Trying to load custom DLL: %s\n", custom_file_default); - win32vars.custom = LoadLibraryA(custom_file_default); - } - } - - if (win32vars.custom){ - win32vars.custom_api.get_alpha_4coder_version = (_Get_Version_Function*)GetProcAddress(win32vars.custom, "get_alpha_4coder_version"); - - if (win32vars.custom_api.get_alpha_4coder_version == 0 || win32vars.custom_api.get_alpha_4coder_version(MAJOR, MINOR, PATCH) == 0){ - system_error_box("The application and custom version numbers don't match."); - } - - win32vars.custom_api.get_bindings = (Get_Binding_Data_Function*)GetProcAddress(win32vars.custom, "get_bindings"); - } - - if (win32vars.custom_api.get_bindings == 0){ - system_error_box("The custom dll is missing."); - } - -#else - win32vars.custom_api.get_bindings = (Get_Binding_Data_Function*)get_bindings; -#endif - // // Window and GL Initialization // diff --git a/platform_win32/win32_4ed_libraries.cpp b/platform_win32/win32_library_wrapper.h similarity index 55% rename from platform_win32/win32_4ed_libraries.cpp rename to platform_win32/win32_library_wrapper.h index df59f0e6..154ad9ce 100644 --- a/platform_win32/win32_4ed_libraries.cpp +++ b/platform_win32/win32_library_wrapper.h @@ -9,22 +9,14 @@ // TOP -struct Library{ +union Library{ HMODULE lib; + FixSize(LIBRARY_TYPE_SIZE); }; internal b32 -system_load_library(Library *library, char *name){ - String extension = file_extension(make_string_slowly(name)); - char space[4096]; - if (!match(extension, "dll")){ - String full_name = make_fixed_width_string(space); - append(&full_name, name); - append(&full_name, ".dll"); - terminate_with_null(&full_name); - name = space; - } - +system_load_library_direct(Library *library, char *name){ + AssertLibrarySizes(); library->lib = LoadLibraryA(name); b32 success = (library->lib != 0); return(success);