4coder/platform_all/4ed_shared_library_constants.h

95 lines
2.2 KiB
C

/*
* 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