Add second loader for binary modules

This commit is contained in:
Bart van Strien
2011-08-12 13:49:49 +02:00
parent 873a99aba1
commit 59a407bc6d
4 changed files with 66 additions and 0 deletions
@@ -67,6 +67,13 @@ namespace physfs
releaseSet = true;
}
bool Filesystem::isRelease() const
{
if (!releaseSet)
return false;
return release;
}
bool Filesystem::setIdentity( const char * ident )
{
if(!isInited)
@@ -119,6 +119,7 @@ namespace physfs
void init(const char * arg0);
void setRelease(bool release);
bool isRelease() const;
/**
* This sets up the save directory. If the
@@ -297,6 +297,59 @@ namespace physfs
return 1;
}
inline const char * library_extension()
{
#ifdef LOVE_WINDOWS
return ".dll";
#elif defined(LOVE_MACOSX) || defined(LOVE_MACOS)
return ".dylib";
#else
return ".so";
#endif
}
int extloader(lua_State * L)
{
const char * filename = lua_tostring(L, -1);
std::string tokenized_name(filename);
std::string tokenized_function(filename);
for (int i = 0; i < tokenized_name.size(); i++)
{
if (tokenized_name[i] == '.')
{
tokenized_name[i] = '/';
tokenized_function[i] = '_';
}
}
tokenized_name += library_extension();
void * handle = SDL_LoadObject((std::string(instance->getAppdataDirectory()) + LOVE_PATH_SEPARATOR LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR + tokenized_name).c_str());
if (!handle && instance->isRelease())
handle = SDL_LoadObject((std::string(instance->getSaveDirectory()) + LOVE_PATH_SEPARATOR + tokenized_name).c_str());
if (!handle)
{
lua_pushfstring(L, "\n\tno extension \"%s\" in LOVE paths.\n", filename);
return 1;
}
void * func = SDL_LoadFunction(handle, ("loveopen_" + tokenized_function).c_str());
if (!func)
func = SDL_LoadFunction(handle, ("luaopen_" + tokenized_function).c_str());
if (!func)
{
SDL_UnloadObject(handle);
lua_pushfstring(L, "\n\textension \"%s\" is incompatible.\n", filename);
return 1;
}
lua_pushcfunction(L, (lua_CFunction) func);
return 1;
}
// List of functions to wrap.
static const luaL_Reg functions[] = {
{ "init", w_init },
@@ -337,6 +390,7 @@ namespace physfs
{
instance = new Filesystem();
love::luax_register_searcher(L, loader);
love::luax_register_searcher(L, extloader);
}
catch(Exception & e)
{
@@ -26,6 +26,9 @@
#include "wrap_File.h"
#include "wrap_FileData.h"
// SDL
#include <SDL_loadso.h>
namespace love
{
namespace filesystem
@@ -60,6 +63,7 @@ namespace physfs
int w_load(lua_State * L);
int w_getLastModified(lua_State * L);
int loader(lua_State * L);
int extloader(lua_State * L);
extern "C" LOVE_EXPORT int luaopen_love_filesystem(lua_State * L);
} // physfs