// =====================================================================================================================
//  fennec, a free and open source game engine
//  Copyright © 2025 - 2026  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 <https://www.gnu.org/licenses/>.
// =====================================================================================================================

#include <fennec/platform/unix/platform.h>

#include <dlfcn.h>

namespace fennec
{

shared_object* unix_platform::load_object(const cstring& file) {
	void* handle = dlopen(file, RTLD_NOW | RTLD_LOCAL);
	const char* load_error = dlerror();
	assert(handle != nullptr, load_error);
	return static_cast<shared_object*>(handle);
}

void unix_platform::unload_object(shared_object* obj) {
	if (obj) {
		dlclose(obj);
	}
}

platform::symbol unix_platform::find_symbol(shared_object* obj, const cstring& name) {
	string _name = name;
	void* symbol = dlsym(obj, _name.cstr());
	if (symbol == nullptr) {
		_name = '_' + _name;
		symbol = dlsym(obj, _name.cstr());
	}
	return symbol;
}

}
