// ===================================================================================================================== // fennec, a free and open source game engine // Copyright © 2025 Medusa Slockbower // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // ===================================================================================================================== #include #include namespace fennec { namespace wayland { using shared_lib = platform::shared_lib; static int _load_count = 0; // Create private variables #define FENNEC_LIB(lib) static shared_lib _FENNEC_LIB_##lib = { nullptr, FENNEC_LIB_##lib }; #define FENNEC_SYMBOL(...) #include bool load_symbols(linux_platform* platform) { if (_load_count++ != 0) { return true; } #define FENNEC_LIB(lib) _FENNEC_LIB_##lib._lib = platform->load_object(_FENNEC_LIB_##lib._name); \ FENNEC_HAS_LIB_##lib = _FENNEC_LIB_##lib._lib != nullptr; \ if(not FENNEC_HAS_LIB_##lib) { \ unload_symbols(platform); \ return false; \ } \ shared_lib& current_lib = _FENNEC_LIB_##lib; #define FENNEC_SYMBOL(ret, fn, ...) fn = (sym_##fn)(platform->find_symbol(current_lib._lib, #fn)); #include return true; } void unload_symbols(linux_platform* platform) { if (--_load_count != 0) { return; } #define FENNEC_LIB(lib) platform->unload_object(_FENNEC_LIB_##lib._lib); \ _FENNEC_LIB_##lib._lib = nullptr; #define FENNEC_SYMBOL(ret, fn, ...) fn = nullptr; #include } } }