From a91158ebf0dcc2c1a5114d63d48c275dbf707681 Mon Sep 17 00:00:00 2001 From: Yuval Dolev Date: Sat, 28 Dec 2019 01:54:33 +0200 Subject: [PATCH] Implemented all system library handling functions. --- platform_mac/mac_4ed.mm | 9 +++-- platform_mac/mac_4ed_functions.mm | 63 +++++++++++++++++++++++++------ 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/platform_mac/mac_4ed.mm b/platform_mac/mac_4ed.mm index de73ec52..b1bd4d7f 100644 --- a/platform_mac/mac_4ed.mm +++ b/platform_mac/mac_4ed.mm @@ -1,4 +1,4 @@ -/* Mac Objective C layer for 4coder */ +/* Mac Objective-C layer for 4coder */ #include "4coder_base_types.h" #include "4coder_version.h" @@ -54,6 +54,7 @@ #include // NOTE(yuval): Used for proc_pidpath #include // NOTE(yuval): Used for opendir, readdir +#include // NOTE(yuval): Used for dlopen, dlclose, dlsym #include // NOTE(yuval): Used for errno #include // NOTE(yuval): Used for open #include // NOTE(yuval): Used for getcwd, read, write, getpid @@ -67,6 +68,8 @@ #define global static #define external extern "C" +//////////////////////////////// + @interface App_Delegate : NSObject @end @@ -116,7 +119,7 @@ struct Mac_Vars { //////////////////////////////// -Mac_Vars mac_vars; +global Mac_Vars mac_vars; global Render_Target target; //////////////////////////////// @@ -139,7 +142,7 @@ main(int arg_count, char **args){ Arena test_arena = make_arena_malloc(); File_List list = system_get_file_list(&test_arena, - string_u8_litexpr("/Users/yuvaldolev/Desktop/imgui")); + string_u8_litexpr("/Users/yuvaldolev/Desktop")); for (u32 index = 0; index < list.count; ++index) { File_Info* info = list.infos[index]; diff --git a/platform_mac/mac_4ed_functions.mm b/platform_mac/mac_4ed_functions.mm index 00b4ecc4..291e3061 100644 --- a/platform_mac/mac_4ed_functions.mm +++ b/platform_mac/mac_4ed_functions.mm @@ -200,13 +200,25 @@ system_quick_file_attributes_sig(){ return(result); } +function inline Plat_Handle +mac_to_plat_handle(i32 fd){ + Plat_Handle result = *(Plat_Handle*)(&fd); + return result; +} + +function inline i32 +mac_to_fd(Plat_Handle handle){ + i32 result = *(i32*)(&handle); + return result; +} + function system_load_handle_sig(){ b32 result = false; i32 fd = open(file_name, O_RDONLY); if ((fd != -1) && (fd != 0)) { - *(i32*)out = fd; + *out = mac_to_plat_handle(fd); result = true; } @@ -215,7 +227,7 @@ system_load_handle_sig(){ function system_load_attributes_sig(){ - i32 fd = *(i32*)(&handle); + i32 fd = mac_to_fd(handle); File_Attributes result = mac_file_attributes_from_fd(fd); return(result); @@ -223,7 +235,7 @@ system_load_attributes_sig(){ function system_load_file_sig(){ - i32 fd = *(i32*)(&handle); + i32 fd = mac_to_fd(handle); do{ ssize_t bytes_read = read(fd, buffer, size); @@ -246,7 +258,7 @@ function system_load_close_sig(){ b32 result = true; - i32 fd = *(i32*)(&handle); + i32 fd = mac_to_fd(handle); if (close(fd) == -1){ // NOTE(yuval): An error occured while close the file descriptor result = false; @@ -289,29 +301,58 @@ system_save_file_sig(){ //////////////////////////////// +function inline System_Library +mac_to_system_library(void* dl_handle){ + System_Library result = *(System_Library*)(&dl_handle); + return result; +} + +function inline void* +mac_to_dl_handle(System_Library system_lib){ + void* result = *(void**)(&system_lib); + return result; +} + function system_load_library_sig(){ b32 result = false; - NotImplemented; + void* lib = 0; + + // NOTE(yuval): Open library handle + { + Temp_Memory temp = begin_temp(scratch); + + char* c_file_name = push_array(scratch, char, file_name.size + 1); + block_copy(c_file_name, file_name.str, file_name.size); + c_file_name[file_name.size] = 0; + + lib = dlopen(c_file_name, RTLD_LAZY | RTLD_GLOBAL); + + end_temp(temp); + } + + if (lib){ + *out = mac_to_system_library(lib); + result = true; + } return(result); } function system_release_library_sig(){ - b32 result = false; - - NotImplemented; + void* lib = mac_to_dl_handle(handle); + i32 rc = dlclose(lib); + b32 result = (rc == 0); return(result); } function system_get_proc_sig(){ - Void_Func* result = 0; - - NotImplemented; + void* lib = mac_to_dl_handle(handle); + Void_Func* result = (Void_Func*)dlsym(lib, proc_name); return(result); }