mirror of
https://github.com/love2d/love.git
synced 2026-08-20 04:30:09 +02:00
Add second loader for binary modules
This commit is contained in:
@@ -67,6 +67,13 @@ namespace physfs
|
|||||||
releaseSet = true;
|
releaseSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Filesystem::isRelease() const
|
||||||
|
{
|
||||||
|
if (!releaseSet)
|
||||||
|
return false;
|
||||||
|
return release;
|
||||||
|
}
|
||||||
|
|
||||||
bool Filesystem::setIdentity( const char * ident )
|
bool Filesystem::setIdentity( const char * ident )
|
||||||
{
|
{
|
||||||
if(!isInited)
|
if(!isInited)
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ namespace physfs
|
|||||||
void init(const char * arg0);
|
void init(const char * arg0);
|
||||||
|
|
||||||
void setRelease(bool release);
|
void setRelease(bool release);
|
||||||
|
bool isRelease() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This sets up the save directory. If the
|
* This sets up the save directory. If the
|
||||||
|
|||||||
@@ -297,6 +297,59 @@ namespace physfs
|
|||||||
return 1;
|
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.
|
// List of functions to wrap.
|
||||||
static const luaL_Reg functions[] = {
|
static const luaL_Reg functions[] = {
|
||||||
{ "init", w_init },
|
{ "init", w_init },
|
||||||
@@ -337,6 +390,7 @@ namespace physfs
|
|||||||
{
|
{
|
||||||
instance = new Filesystem();
|
instance = new Filesystem();
|
||||||
love::luax_register_searcher(L, loader);
|
love::luax_register_searcher(L, loader);
|
||||||
|
love::luax_register_searcher(L, extloader);
|
||||||
}
|
}
|
||||||
catch(Exception & e)
|
catch(Exception & e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,6 +26,9 @@
|
|||||||
#include "wrap_File.h"
|
#include "wrap_File.h"
|
||||||
#include "wrap_FileData.h"
|
#include "wrap_FileData.h"
|
||||||
|
|
||||||
|
// SDL
|
||||||
|
#include <SDL_loadso.h>
|
||||||
|
|
||||||
namespace love
|
namespace love
|
||||||
{
|
{
|
||||||
namespace filesystem
|
namespace filesystem
|
||||||
@@ -60,6 +63,7 @@ namespace physfs
|
|||||||
int w_load(lua_State * L);
|
int w_load(lua_State * L);
|
||||||
int w_getLastModified(lua_State * L);
|
int w_getLastModified(lua_State * L);
|
||||||
int loader(lua_State * L);
|
int loader(lua_State * L);
|
||||||
|
int extloader(lua_State * L);
|
||||||
extern "C" LOVE_EXPORT int luaopen_love_filesystem(lua_State * L);
|
extern "C" LOVE_EXPORT int luaopen_love_filesystem(lua_State * L);
|
||||||
|
|
||||||
} // physfs
|
} // physfs
|
||||||
|
|||||||
Reference in New Issue
Block a user