2022-07-25 11:20:38 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
2022-10-13 17:00:36 +08:00
|
|
|
#include "fastfetch.h"
|
|
|
|
|
|
2024-05-24 14:40:14 +08:00
|
|
|
#ifndef FF_DISABLE_DLOPEN
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#if defined(_WIN32)
|
|
|
|
|
#define FF_DLOPEN_FLAGS 0
|
2026-04-09 16:20:59 +08:00
|
|
|
FF_A_NODISCARD void* dlopen(const char* path, int mode);
|
|
|
|
|
FF_A_NODISCARD void* dlsym(void* handle, const char* symbol);
|
2026-03-29 09:28:49 +08:00
|
|
|
int dlclose(void* handle);
|
2026-04-15 16:16:46 +08:00
|
|
|
#else
|
|
|
|
|
#include <dlfcn.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
|
#define FF_LIBRARY_EXTENSION ".dll"
|
|
|
|
|
#elif defined(__APPLE__)
|
|
|
|
|
#define FF_LIBRARY_EXTENSION ".dylib"
|
|
|
|
|
#else
|
|
|
|
|
#define FF_LIBRARY_EXTENSION ".so"
|
|
|
|
|
#endif
|
2026-03-29 09:28:49 +08:00
|
|
|
|
|
|
|
|
static inline void ffLibraryUnload(void** handle) {
|
2023-02-15 14:51:04 +08:00
|
|
|
assert(handle);
|
2026-03-29 09:28:49 +08:00
|
|
|
if (*handle) {
|
2023-02-15 14:51:04 +08:00
|
|
|
dlclose(*handle);
|
2026-03-29 09:28:49 +08:00
|
|
|
}
|
2023-02-15 14:51:04 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#if __cplusplus
|
|
|
|
|
#define __auto_type auto
|
|
|
|
|
#endif
|
2026-03-19 15:24:55 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_SYMBOL(symbolName) \
|
2026-03-29 09:28:49 +08:00
|
|
|
__typeof__(&symbolName) ff##symbolName;
|
2022-07-25 11:20:38 +02:00
|
|
|
|
2026-06-30 18:46:03 +08:00
|
|
|
#define FF_LIBRARY_LOAD(libraryObjectName, returnValue, libraryFileName, maxVersion, ...) \
|
|
|
|
|
void* FF_A_CLEANUP(ffLibraryUnload) libraryObjectName = ffLibraryLoadSingle(libraryFileName, maxVersion); \
|
2026-07-10 18:08:04 +08:00
|
|
|
__VA_OPT__(if (__builtin_expect(libraryObjectName == nullptr, false)) libraryObjectName = ffLibraryLoadMulti(__VA_ARGS__, nullptr);) \
|
|
|
|
|
if (__builtin_expect(libraryObjectName == nullptr, false)) \
|
2026-03-29 09:28:49 +08:00
|
|
|
return returnValue;
|
2022-07-25 11:20:38 +02:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_MESSAGE(libraryObjectName, libraryFileName, maxVersion, ...) \
|
2026-03-29 09:28:49 +08:00
|
|
|
FF_LIBRARY_LOAD(libraryObjectName, "dlopen(" libraryFileName ") failed", libraryFileName, maxVersion, ##__VA_ARGS__)
|
2026-01-05 14:51:27 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, symbolMapping, symbolName, returnValue) \
|
2026-03-29 09:28:49 +08:00
|
|
|
symbolMapping = (__typeof__(&symbolName)) dlsym(library, #symbolName); \
|
2026-07-10 18:08:04 +08:00
|
|
|
if (__builtin_expect(symbolMapping == nullptr, false)) \
|
2026-03-29 09:28:49 +08:00
|
|
|
return returnValue;
|
2022-07-25 11:20:38 +02:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL(library, symbolName, returnValue) \
|
2026-03-29 09:28:49 +08:00
|
|
|
__auto_type FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff##symbolName, symbolName, returnValue);
|
2022-09-10 13:36:15 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_LAZY(library, symbolName) \
|
2026-03-29 09:28:49 +08:00
|
|
|
__auto_type ff##symbolName = (__typeof__(&symbolName)) dlsym(library, #symbolName);
|
2022-12-22 11:36:13 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_MESSAGE(library, symbolName) \
|
2026-03-29 09:28:49 +08:00
|
|
|
__auto_type FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff##symbolName, symbolName, "dlsym " #symbolName " failed");
|
2022-09-15 13:32:08 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_VAR(library, varName, symbolName, returnValue) \
|
2026-03-29 09:28:49 +08:00
|
|
|
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff##symbolName, symbolName, returnValue);
|
2022-09-10 13:36:15 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(library, varName, symbolName) \
|
2026-03-29 09:28:49 +08:00
|
|
|
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff##symbolName, symbolName, "dlsym " #symbolName " failed");
|
2022-09-10 13:36:15 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_PTR(library, varName, symbolName, returnValue) \
|
2026-03-29 09:28:49 +08:00
|
|
|
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName)->ff##symbolName, symbolName, returnValue);
|
2022-07-25 11:20:38 +02:00
|
|
|
|
2026-06-30 18:46:03 +08:00
|
|
|
void* ffLibraryLoadSingle(const char* path, int maxVersion);
|
|
|
|
|
void* ffLibraryLoadMulti(const char* path, int maxVersion, ...);
|
2024-05-23 16:35:16 +08:00
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_EXTENSION ""
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_SYMBOL(symbolName) \
|
2026-03-29 09:28:49 +08:00
|
|
|
__typeof__(&symbolName) ff##symbolName;
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD(libraryObjectName, returnValue, ...) \
|
2026-07-10 18:08:04 +08:00
|
|
|
FF_A_UNUSED void* libraryObjectName = nullptr; // Placeholder
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_MESSAGE(libraryObjectName, libraryFileName, maxVersion, ...) \
|
2026-03-29 09:28:49 +08:00
|
|
|
FF_LIBRARY_LOAD(libraryObjectName, , libraryFileName, maxVersion, ##__VA_ARGS__)
|
2026-01-05 14:51:27 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, symbolMapping, symbolName, returnValue) \
|
2026-03-29 09:28:49 +08:00
|
|
|
symbolMapping = (__typeof__(&symbolName)) &symbolName;
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL(library, symbolName, returnValue) \
|
2026-04-09 16:20:59 +08:00
|
|
|
FF_A_UNUSED __auto_type FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff##symbolName, symbolName, returnValue);
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_LAZY(library, symbolName) \
|
2026-04-09 16:20:59 +08:00
|
|
|
FF_A_UNUSED __auto_type ff##symbolName = (__typeof__(&symbolName)) &symbolName;
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_MESSAGE(library, symbolName) \
|
2026-04-09 16:20:59 +08:00
|
|
|
FF_A_UNUSED __auto_type FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff##symbolName, symbolName, "dlsym " #symbolName " failed");
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_VAR(library, varName, symbolName, returnValue) \
|
2026-03-29 09:28:49 +08:00
|
|
|
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff##symbolName, symbolName, returnValue);
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(library, varName, symbolName) \
|
2026-03-29 09:28:49 +08:00
|
|
|
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff##symbolName, symbolName, "dlsym " #symbolName " failed");
|
2024-05-23 16:35:16 +08:00
|
|
|
|
2026-04-15 16:16:46 +08:00
|
|
|
#define FF_LIBRARY_LOAD_SYMBOL_PTR(library, varName, symbolName, returnValue) \
|
2026-03-29 09:28:49 +08:00
|
|
|
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName)->ff##symbolName, symbolName, returnValue);
|
2024-05-23 16:35:16 +08:00
|
|
|
|
|
|
|
|
#endif
|
2026-03-19 15:24:55 +08:00
|
|
|
|
|
|
|
|
#if _WIN32
|
|
|
|
|
void* ffLibraryGetModule(const wchar_t* libraryFileName);
|
|
|
|
|
#endif
|