Files
fastfetch/src/common/library.h
T

109 lines
4.5 KiB
C
Raw Normal View History

#pragma once
2022-10-13 17:00:36 +08:00
#include "fastfetch.h"
2026-01-06 09:48:38 +08:00
#include "common/FFcheckmacros.h"
2022-10-13 17:00:36 +08:00
#ifndef FF_DISABLE_DLOPEN
2024-05-23 16:35:16 +08:00
#if defined(_WIN32)
2022-10-13 17:00:36 +08:00
#include <libloaderapi.h>
#define FF_DLOPEN_FLAGS 0
FF_C_NODISCARD static inline void* dlopen(const char* path, int mode) { FF_UNUSED(mode); return LoadLibraryA(path); }
FF_C_NODISCARD static inline void* dlsym(void* handle, const char* symbol) { return (void*) GetProcAddress((HMODULE)handle, symbol); }
2022-10-13 17:00:36 +08:00
static inline int dlclose(void* handle) { return !FreeLibrary((HMODULE)handle); }
#else
#include <dlfcn.h>
#endif
2022-10-14 16:39:48 +08:00
#ifdef _WIN32
2022-10-09 02:04:41 +08:00
#define FF_LIBRARY_EXTENSION ".dll"
#elif defined(__APPLE__)
2022-09-09 20:37:56 +02:00
#define FF_LIBRARY_EXTENSION ".dylib"
#else
#define FF_LIBRARY_EXTENSION ".so"
#endif
static inline void ffLibraryUnload(void** handle)
{
assert(handle);
if (*handle)
dlclose(*handle);
}
#define FF_LIBRARY_SYMBOL(symbolName) \
__typeof__(&symbolName) ff ## symbolName;
2024-09-04 15:28:35 +08:00
#define FF_LIBRARY_LOAD(libraryObjectName, returnValue, ...) \
void* __attribute__((__cleanup__(ffLibraryUnload))) libraryObjectName = ffLibraryLoad(__VA_ARGS__, NULL);\
if(libraryObjectName == NULL) \
return returnValue;
#if _WIN32
#define FF_LIBRARY_LOAD_MESSAGE(libraryObjectName, libraryFileName, maxVersion, ...) \
FF_LIBRARY_LOAD(libraryObjectName, "LoadLibraryA(" libraryFileName ") failed", libraryFileName, maxVersion, ##__VA_ARGS__)
#else
#define FF_LIBRARY_LOAD_MESSAGE(libraryObjectName, libraryFileName, maxVersion, ...) \
FF_LIBRARY_LOAD(libraryObjectName, "dlopen(" libraryFileName ") failed", libraryFileName, maxVersion, ##__VA_ARGS__)
#endif
2022-09-10 13:36:15 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, symbolMapping, symbolName, returnValue) \
symbolMapping = (__typeof__(&symbolName)) dlsym(library, #symbolName); \
if(symbolMapping == NULL) \
return returnValue;
#define FF_LIBRARY_LOAD_SYMBOL(library, symbolName, returnValue) \
2026-03-11 16:20:05 +08:00
__auto_type FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, returnValue);
2022-09-10 13:36:15 +08:00
2022-12-22 11:36:13 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_LAZY(library, symbolName) \
2026-03-11 16:20:05 +08:00
__auto_type ff ## symbolName = (__typeof__(&symbolName)) dlsym(library, #symbolName);
2022-12-22 11:36:13 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_MESSAGE(library, symbolName) \
2026-03-11 16:20:05 +08:00
__auto_type FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, "dlsym " #symbolName " failed");
2022-09-10 13:36:15 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_VAR(library, varName, symbolName, returnValue) \
2023-03-15 11:24:49 +08:00
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff ## symbolName, symbolName, returnValue);
2022-09-10 13:36:15 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(library, varName, symbolName) \
2023-03-15 11:24:49 +08:00
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff ## symbolName, symbolName, "dlsym " #symbolName " failed");
2022-09-10 13:36:15 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_PTR(library, varName, symbolName, returnValue) \
2023-03-15 11:24:49 +08:00
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName)->ff ## symbolName, symbolName, returnValue);
2024-09-04 15:28:35 +08:00
void* ffLibraryLoad(const char* path, int maxVersion, ...);
2024-05-23 16:35:16 +08:00
#else
#define FF_LIBRARY_EXTENSION ""
#define FF_LIBRARY_SYMBOL(symbolName) \
__typeof__(&symbolName) ff ## symbolName;
2024-09-04 15:28:35 +08:00
#define FF_LIBRARY_LOAD(libraryObjectName, returnValue, ...) \
2024-05-23 16:35:16 +08:00
FF_MAYBE_UNUSED void* libraryObjectName = NULL; // Placeholder
#define FF_LIBRARY_LOAD_MESSAGE(libraryObjectName, libraryFileName, maxVersion, ...) \
FF_LIBRARY_LOAD(libraryObjectName, , libraryFileName, maxVersion, ##__VA_ARGS__)
2024-05-23 16:35:16 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, symbolMapping, symbolName, returnValue) \
2025-07-04 01:16:14 +00:00
symbolMapping = (__typeof__(&symbolName)) &symbolName;
2024-05-23 16:35:16 +08:00
#define FF_LIBRARY_LOAD_SYMBOL(library, symbolName, returnValue) \
2026-03-11 16:20:05 +08:00
FF_MAYBE_UNUSED __auto_type FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, returnValue);
2024-05-23 16:35:16 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_LAZY(library, symbolName) \
2026-03-11 16:20:05 +08:00
FF_MAYBE_UNUSED __auto_type ff ## symbolName = (__typeof__(&symbolName)) &symbolName;
2024-05-23 16:35:16 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_MESSAGE(library, symbolName) \
2026-03-11 16:20:05 +08:00
FF_MAYBE_UNUSED __auto_type FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, ff ## symbolName, symbolName, "dlsym " #symbolName " failed");
2024-05-23 16:35:16 +08:00
#define FF_LIBRARY_LOAD_SYMBOL_VAR(library, varName, symbolName, returnValue) \
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff ## symbolName, symbolName, returnValue);
#define FF_LIBRARY_LOAD_SYMBOL_VAR_MESSAGE(library, varName, symbolName) \
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName).ff ## symbolName, symbolName, "dlsym " #symbolName " failed");
#define FF_LIBRARY_LOAD_SYMBOL_PTR(library, varName, symbolName, returnValue) \
FF_LIBRARY_LOAD_SYMBOL_ADDRESS(library, (varName)->ff ## symbolName, symbolName, returnValue);
#endif