starting to zip together library loading code
This commit is contained in:
parent
def252481c
commit
9c5977dc74
|
@ -43,5 +43,26 @@ system_memory_init(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
load_app_code(){
|
||||||
|
App_Get_Functions *get_funcs = 0;
|
||||||
|
|
||||||
|
if (system_load_library(&libraries.app_code, "4ed_app")){
|
||||||
|
get_funcs = (App_Get_Functions*)system_get_proc(&libraries.app_code, "app_get_functions");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
char msg[] = "Could not load '4ed_app." DLL "'. This file should be in the same directory as the main '4ed' executable.";
|
||||||
|
system_error_box(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get_funcs != 0){
|
||||||
|
app = get_funcs();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
char msg[] = "Failed to get application code from '4ed_app." DLL "'.";
|
||||||
|
system_error_box(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// BOTTOM
|
// BOTTOM
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* Mr. 4th Dimention - Allen Webster
|
||||||
|
*
|
||||||
|
* 18.07.2017
|
||||||
|
*
|
||||||
|
* Shared libraries struct.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TOP
|
||||||
|
|
||||||
|
struct Libraries{
|
||||||
|
Library app_code;
|
||||||
|
};
|
||||||
|
|
||||||
|
// BOTTOM
|
||||||
|
|
|
@ -119,7 +119,13 @@ struct Linux_Coroutine {
|
||||||
//
|
//
|
||||||
|
|
||||||
internal void LinuxStringDup(String*, void*, size_t);
|
internal void LinuxStringDup(String*, void*, size_t);
|
||||||
internal void LinuxToggleFullscreen(Display*, Window);
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
|
#include "linux_4ed_libraries.cpp"
|
||||||
|
#include "4ed_standard_libraries.cpp"
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
struct Linux_Vars{
|
struct Linux_Vars{
|
||||||
Display *XDisplay;
|
Display *XDisplay;
|
||||||
|
@ -168,14 +174,13 @@ struct Linux_Vars{
|
||||||
b32 hide_cursor;
|
b32 hide_cursor;
|
||||||
Cursor hidden_cursor;
|
Cursor hidden_cursor;
|
||||||
|
|
||||||
void *app_code;
|
Library app_code;
|
||||||
void *custom;
|
void *custom;
|
||||||
|
|
||||||
sem_t thread_semaphore;
|
sem_t thread_semaphore;
|
||||||
|
|
||||||
i32 dpi_x, dpi_y;
|
i32 dpi_x, dpi_y;
|
||||||
|
|
||||||
App_Functions app;
|
|
||||||
Custom_API custom_api;
|
Custom_API custom_api;
|
||||||
b32 vsync;
|
b32 vsync;
|
||||||
|
|
||||||
|
@ -190,6 +195,7 @@ global Render_Target target;
|
||||||
global System_Functions sysfunc;
|
global System_Functions sysfunc;
|
||||||
global Application_Memory memory_vars;
|
global Application_Memory memory_vars;
|
||||||
global Plat_Settings plat_settings;
|
global Plat_Settings plat_settings;
|
||||||
|
global App_Functions app;
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
|
@ -205,6 +211,7 @@ linux_set_icon(Display* d, Window w){
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
#define SLASH '/'
|
#define SLASH '/'
|
||||||
|
#define DLL "so"
|
||||||
|
|
||||||
internal sem_t*
|
internal sem_t*
|
||||||
handle_sem(Plat_Handle h){
|
handle_sem(Plat_Handle h){
|
||||||
|
@ -534,31 +541,6 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
||||||
// Linux init functions
|
// Linux init functions
|
||||||
//
|
//
|
||||||
|
|
||||||
internal b32
|
|
||||||
LinuxLoadAppCode(String* base_dir){
|
|
||||||
b32 result = 0;
|
|
||||||
App_Get_Functions *get_funcs = 0;
|
|
||||||
|
|
||||||
if (!sysshared_to_binary_path(base_dir, "4ed_app.so")){
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
linuxvars.app_code = dlopen(base_dir->str, RTLD_LAZY);
|
|
||||||
if (linuxvars.app_code){
|
|
||||||
get_funcs = (App_Get_Functions*)
|
|
||||||
dlsym(linuxvars.app_code, "app_get_functions");
|
|
||||||
} else {
|
|
||||||
LOGF("dlopen failed: %s\n", dlerror());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (get_funcs){
|
|
||||||
result = 1;
|
|
||||||
linuxvars.app = get_funcs();
|
|
||||||
}
|
|
||||||
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
LinuxLoadRenderCode(){
|
LinuxLoadRenderCode(){
|
||||||
target.push_clip = draw_push_clip;
|
target.push_clip = draw_push_clip;
|
||||||
|
@ -1658,14 +1640,7 @@ main(int argc, char **argv){
|
||||||
// System & Memory init
|
// System & Memory init
|
||||||
//
|
//
|
||||||
|
|
||||||
char base_dir_mem[PATH_MAX];
|
load_app_code();
|
||||||
String base_dir = make_fixed_width_string(base_dir_mem);
|
|
||||||
|
|
||||||
if (!LinuxLoadAppCode(&base_dir)){
|
|
||||||
char msg[] = "Could not load '4ed_app.so'. This file should be in the same directory as the main '4ed' executable.";
|
|
||||||
system_error_box(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
link_system_code(&sysfunc);
|
link_system_code(&sysfunc);
|
||||||
LinuxLoadRenderCode();
|
LinuxLoadRenderCode();
|
||||||
|
|
||||||
|
@ -1694,7 +1669,7 @@ main(int argc, char **argv){
|
||||||
i32 *file_count;
|
i32 *file_count;
|
||||||
i32 output_size;
|
i32 output_size;
|
||||||
|
|
||||||
output_size = linuxvars.app.read_command_line(&sysfunc, &memory_vars, current_directory, &plat_settings, &files, &file_count, clparams);
|
output_size = app.read_command_line(&sysfunc, &memory_vars, current_directory, &plat_settings, &files, &file_count, clparams);
|
||||||
|
|
||||||
if (output_size > 0){
|
if (output_size > 0){
|
||||||
LOGF("%.*s", output_size, (char*)memory_vars.target_memory);
|
LOGF("%.*s", output_size, (char*)memory_vars.target_memory);
|
||||||
|
@ -1711,6 +1686,9 @@ main(int argc, char **argv){
|
||||||
|
|
||||||
#ifdef FRED_SUPER
|
#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";
|
char *custom_file_default = "custom_4coder.so";
|
||||||
sysshared_to_binary_path(&base_dir, custom_file_default);
|
sysshared_to_binary_path(&base_dir, custom_file_default);
|
||||||
custom_file_default = base_dir.str;
|
custom_file_default = base_dir.str;
|
||||||
|
@ -1914,7 +1892,7 @@ main(int argc, char **argv){
|
||||||
|
|
||||||
XAddConnectionWatch(linuxvars.XDisplay, &LinuxX11ConnectionWatch, NULL);
|
XAddConnectionWatch(linuxvars.XDisplay, &LinuxX11ConnectionWatch, NULL);
|
||||||
|
|
||||||
linuxvars.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, linuxvars.custom_api);
|
||||||
|
|
||||||
LinuxResizeTarget(window_width, window_height);
|
LinuxResizeTarget(window_width, window_height);
|
||||||
|
|
||||||
|
@ -2008,7 +1986,7 @@ main(int argc, char **argv){
|
||||||
|
|
||||||
b32 keep_running = linuxvars.keep_running;
|
b32 keep_running = linuxvars.keep_running;
|
||||||
|
|
||||||
linuxvars.app.step(&sysfunc, &target, &memory_vars, &linuxvars.input, &result, clparams);
|
app.step(&sysfunc, &target, &memory_vars, &linuxvars.input, &result, clparams);
|
||||||
|
|
||||||
if (result.perform_kill){
|
if (result.perform_kill){
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* 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(path, 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
|
||||||
|
|
|
@ -51,12 +51,13 @@ linux_get_sys_font(char* name, i32 pt_size){
|
||||||
|
|
||||||
FcPatternDestroy(pat);
|
FcPatternDestroy(pat);
|
||||||
|
|
||||||
if(!result){
|
if (!result){
|
||||||
char space[1024];
|
char space[1024];
|
||||||
String str = make_fixed_width_string(space);
|
String str = make_fixed_width_string(space);
|
||||||
if(sysshared_to_binary_path(&str, name)){
|
if (sysshared_to_binary_path(&str, name)){
|
||||||
result = strdup(space);
|
result = strdup(space);
|
||||||
} else {
|
}
|
||||||
|
else{
|
||||||
result = strdup(name);
|
result = strdup(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
# include "4coder_API/style.h"
|
# include "4coder_API/style.h"
|
||||||
|
|
||||||
# define FSTRING_IMPLEMENTATION
|
# define FSTRING_IMPLEMENTATION
|
||||||
# define FSTRING_C
|
|
||||||
# include "4coder_lib/4coder_string.h"
|
# include "4coder_lib/4coder_string.h"
|
||||||
# include "4coder_lib/4coder_mem.h"
|
# include "4coder_lib/4coder_mem.h"
|
||||||
|
|
||||||
|
@ -112,10 +111,15 @@ struct Win32_Coroutine{
|
||||||
i32 done;
|
i32 done;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
|
#include "win32_4ed_libraries.cpp"
|
||||||
|
#include "4ed_standard_libraries.cpp"
|
||||||
|
|
||||||
|
////////////////////////////////
|
||||||
|
|
||||||
struct Win32_Vars{
|
struct Win32_Vars{
|
||||||
App_Functions app;
|
|
||||||
Custom_API custom_api;
|
Custom_API custom_api;
|
||||||
HMODULE app_code;
|
|
||||||
HMODULE custom;
|
HMODULE custom;
|
||||||
|
|
||||||
Win32_Coroutine coroutine_data[18];
|
Win32_Coroutine coroutine_data[18];
|
||||||
|
@ -159,6 +163,9 @@ global System_Functions sysfunc;
|
||||||
global Application_Memory memory_vars;
|
global Application_Memory memory_vars;
|
||||||
global Plat_Settings plat_settings;
|
global Plat_Settings plat_settings;
|
||||||
|
|
||||||
|
global Libraries libraries;
|
||||||
|
global App_Functions app;
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
#include "win32_error_box.cpp"
|
#include "win32_error_box.cpp"
|
||||||
|
@ -166,6 +173,7 @@ global Plat_Settings plat_settings;
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
#define SLASH '\\'
|
#define SLASH '\\'
|
||||||
|
#define DLL "dll"
|
||||||
|
|
||||||
internal HANDLE
|
internal HANDLE
|
||||||
handle_type(Plat_Handle h){
|
handle_type(Plat_Handle h){
|
||||||
|
@ -566,24 +574,6 @@ Sys_CLI_End_Update_Sig(system_cli_end_update){
|
||||||
// Linkage to Custom and Application
|
// Linkage to Custom and Application
|
||||||
//
|
//
|
||||||
|
|
||||||
internal b32
|
|
||||||
Win32LoadAppCode(){
|
|
||||||
b32 result = false;
|
|
||||||
App_Get_Functions *get_funcs = 0;
|
|
||||||
|
|
||||||
win32vars.app_code = LoadLibraryA("4ed_app.dll");
|
|
||||||
if (win32vars.app_code){
|
|
||||||
get_funcs = (App_Get_Functions*)GetProcAddress(win32vars.app_code, "app_get_functions");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (get_funcs){
|
|
||||||
result = true;
|
|
||||||
win32vars.app = get_funcs();
|
|
||||||
}
|
|
||||||
|
|
||||||
return(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "4ed_font_data.h"
|
#include "4ed_font_data.h"
|
||||||
#include "4ed_system_shared.cpp"
|
#include "4ed_system_shared.cpp"
|
||||||
|
|
||||||
|
@ -1105,10 +1095,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
// System and Application Layer Linkage
|
// System and Application Layer Linkage
|
||||||
//
|
//
|
||||||
|
|
||||||
if (!Win32LoadAppCode()){
|
load_app_code();
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
link_system_code(&sysfunc);
|
link_system_code(&sysfunc);
|
||||||
Win32LoadRenderCode();
|
Win32LoadRenderCode();
|
||||||
|
|
||||||
|
@ -1138,7 +1125,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
char **files = 0;
|
char **files = 0;
|
||||||
i32 *file_count = 0;
|
i32 *file_count = 0;
|
||||||
|
|
||||||
win32vars.app.read_command_line(&sysfunc, &memory_vars, current_directory, &plat_settings, &files, &file_count, clparams);
|
app.read_command_line(&sysfunc, &memory_vars, current_directory, &plat_settings, &files, &file_count, clparams);
|
||||||
|
|
||||||
sysshared_filter_real_files(files, file_count);
|
sysshared_filter_real_files(files, file_count);
|
||||||
LOG("Loaded system code, read command line.\n");
|
LOG("Loaded system code, read command line.\n");
|
||||||
|
@ -1306,7 +1293,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
//
|
//
|
||||||
|
|
||||||
LOG("Initializing application variables\n");
|
LOG("Initializing application variables\n");
|
||||||
win32vars.app.init(&sysfunc, &target, &memory_vars, win32vars.clipboard_contents, current_directory, win32vars.custom_api);
|
app.init(&sysfunc, &target, &memory_vars, win32vars.clipboard_contents, current_directory, win32vars.custom_api);
|
||||||
|
|
||||||
system_memory_free(current_directory.str, 0);
|
system_memory_free(current_directory.str, 0);
|
||||||
|
|
||||||
|
@ -1501,7 +1488,7 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdS
|
||||||
win32vars.send_exit_signal = false;
|
win32vars.send_exit_signal = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
win32vars.app.step(&sysfunc, &target, &memory_vars, &input, &result, clparams);
|
app.step(&sysfunc, &target, &memory_vars, &input, &result, clparams);
|
||||||
|
|
||||||
if (result.perform_kill){
|
if (result.perform_kill){
|
||||||
keep_running = false;
|
keep_running = false;
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Mr. 4th Dimention - Allen Webster
|
||||||
|
*
|
||||||
|
* 18.07.2017
|
||||||
|
*
|
||||||
|
* Win32 library wrapper.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// TOP
|
||||||
|
|
||||||
|
struct Library{
|
||||||
|
HMODULE lib;
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
library->lib = LoadLibraryA(name);
|
||||||
|
b32 success = (library->lib != 0);
|
||||||
|
return(success);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void*
|
||||||
|
system_get_proc(Library *library, char *name){
|
||||||
|
void *result = GetProcAddress(library->lib, name);
|
||||||
|
return(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void
|
||||||
|
system_free_library(Library *library){
|
||||||
|
FreeLibrary(library->lib);
|
||||||
|
library->lib = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BOTTOM
|
||||||
|
|
Loading…
Reference in New Issue