module dl

pub const version = 1

pub const dl_ext = get_shared_library_extension()

pub const rtld_next = voidptr(-1)

// get_shared_library_extension returns the platform dependent shared library extension
// i.e. .dll on windows, .so on most unixes, .dylib on macos.
@[inline]
pub fn get_shared_library_extension() string {
	return $if windows {
		'.dll'
	} $else $if macos {
		'.dylib'
	} $else {
		'.so'
	}
}

// get_libname returns a library name with the operating system specific extension for
// shared libraries.
@[inline]
pub fn get_libname(libname string) string {
	return '${libname}${dl.dl_ext}'
}

// open_opt tries to load a given dynamic shared object.
pub fn open_opt(filename string, flags int) !voidptr {
	shared_object_handle := open(filename, flags)
	if shared_object_handle == 0 {
		e := dlerror()
		return error(e)
	}
	return shared_object_handle
}

// sym_opt returns the address of a symbol in a given shared object, if found.
// Unlike sym, sym_opt returns an option.
pub fn sym_opt(shared_object_handle voidptr, symbol string) !voidptr {
	sym_handle := sym(shared_object_handle, symbol)
	if sym_handle == 0 {
		e := dlerror()
		return error(e)
	}
	return sym_handle
}
