@@ -88,7 +88,7 @@ AC_CHECK_HEADERS(cxxabi.h) | |||
AC_LANG_POP(C++) | |||
dnl Common C functions | |||
AC_CHECK_FUNCS(getenv getcwd _getcwd backtrace_symbols) | |||
AC_CHECK_FUNCS(getenv system tmpfile tmpnam getcwd _getcwd backtrace_symbols) | |||
if test "${enable_debug}" = "yes"; then | |||
@@ -14,6 +14,7 @@ | |||
#if defined __CELLOS_LV2__ | |||
#include <sys/paths.h> | |||
#include <cell/sysmodule.h> | |||
#include <cell/codec/pngdec.h> | |||
@@ -98,7 +99,7 @@ bool Ps3ImageData::Open(char const *path) | |||
Array<String> pathlist = System::GetPathList(path); | |||
for (int i = 0; i < pathlist.Count(); ++i) | |||
{ | |||
String name = String("/app_home/") + pathlist[i]; | |||
String name = String(SYS_APP_HOME) + '/' + pathlist[i]; | |||
dec_src.fileName = name.C(); | |||
err = cellPngDecOpen(hmain, &hsub, &dec_src, &open_info); | |||
if (err == CELL_OK) | |||
@@ -25,17 +25,19 @@ static inline void Abort() | |||
#endif | |||
} | |||
extern void DumpStack(); | |||
/* FIXME: see http://stackoverflow.com/q/3596781/111461 for discussions | |||
* on implementing __debugbreak() on POSIX systems. */ | |||
static inline void DebugBreak() | |||
static inline void DebugAbort() | |||
{ | |||
DumpStack(); | |||
#if defined _WIN32 | |||
__debugbreak(); | |||
#endif | |||
Abort(); | |||
} | |||
extern void DumpStack(); | |||
#define LOL_CALL(macro, args) macro args | |||
#define LOL_EVAL(a) a | |||
#define LOL_1ST(a, ...) a | |||
@@ -117,9 +119,7 @@ extern void DumpStack(); | |||
LOL_CALL(LOL_CAT(LOL_ERROR_, LOL_CALL(LOL_COUNT_TO_3, \ | |||
(__VA_ARGS__))), \ | |||
(__VA_ARGS__)); \ | |||
DumpStack(); \ | |||
DebugBreak(); \ | |||
Abort(); \ | |||
DebugAbort(); \ | |||
} | |||
#endif | |||
@@ -43,9 +43,12 @@ public: | |||
~File(); | |||
void Open(String const &file, FileAccess mode); | |||
String ReadString(); | |||
bool IsValid() const; | |||
void Close(); | |||
int Read(uint8_t *buf, int count); | |||
String ReadString(); | |||
private: | |||
class FileData *m_data; | |||
}; | |||
@@ -34,8 +34,10 @@ static const luaL_Reg loadedlibs[] = { | |||
{LUA_LOADLIBNAME, luaopen_package}, | |||
{LUA_COLIBNAME, luaopen_coroutine}, | |||
{LUA_TABLIBNAME, luaopen_table}, | |||
#if 0 // LOL BEGIN | |||
{LUA_IOLIBNAME, luaopen_io}, | |||
{LUA_OSLIBNAME, luaopen_os}, | |||
#endif // LOL END | |||
{LUA_STRLIBNAME, luaopen_string}, | |||
{LUA_BITLIBNAME, luaopen_bit32}, | |||
{LUA_MATHLIBNAME, luaopen_math}, | |||
@@ -12,8 +12,24 @@ | |||
# include "config.h" | |||
#endif | |||
#if __CELLOS_LV2__ | |||
# include <sys/paths.h> | |||
# include <cell/cell_fs.h> | |||
#endif | |||
#include "core.h" | |||
/* HACK: use fopen() for now so that we get FIOS. */ | |||
#if 0//__CELLOS_LV2__ | |||
extern "C" { | |||
# include <stdio.h> | |||
} | |||
# undef __CELLOS_LV2__ | |||
# define HAVE_STDIO_H 1 | |||
# undef BUFSIZ | |||
# define BUFSIZ 1024 | |||
#endif | |||
namespace lol | |||
{ | |||
@@ -24,35 +40,69 @@ class FileData | |||
void Open(String const &file, FileAccess mode) | |||
{ | |||
#if __CELLOS_LV2__ | |||
String realfile = String(SYS_APP_HOME) + '/' + file; | |||
CellFsErrno err = cellFsOpen(realfile.C(), CELL_FS_O_RDONLY, | |||
&m_fd, NULL, 0); | |||
if (err != CELL_FS_SUCCEEDED) | |||
m_fd = -1; | |||
#elif HAVE_STDIO_H | |||
/* FIXME: no modes, no error checking, no nothing */ | |||
m_fd = fopen(file.C(), "r"); | |||
#endif | |||
} | |||
String ReadString() | |||
inline bool IsValid() const | |||
{ | |||
String ret; | |||
#if __CELLOS_LV2__ | |||
return m_fd > -1; | |||
#elif HAVE_STDIO_H | |||
return !!m_fd; | |||
#endif | |||
} | |||
int Read(uint8_t *buf, int count) | |||
{ | |||
#if __CELLOS_LV2__ | |||
uint64_t done; | |||
CellFsErrno err = cellFsRead(m_fd, buf, count, &done); | |||
if (err != CELL_FS_SUCCEEDED) | |||
return -1; | |||
return (int)done; | |||
#elif HAVE_STDIO_H | |||
while (m_fd && !feof(m_fd)) | |||
size_t done = fread(buf, 1, count, m_fd); | |||
if (done <= 0) | |||
return -1; | |||
return (int)done; | |||
#endif | |||
} | |||
String ReadString() | |||
{ | |||
String ret; | |||
while (IsValid()) | |||
{ | |||
char buf[BUFSIZ]; | |||
size_t count = fread(buf, 1, BUFSIZ, m_fd); | |||
if (count <= 0) | |||
/* XXX: BUFSIZ would overflow the stack here */ | |||
uint8_t buf[1024]; | |||
int done = Read(buf, 1024); | |||
if (done <= 0) | |||
break; | |||
int oldsize = ret.Count(); | |||
ret.Resize(oldsize + count); | |||
memcpy(&ret[oldsize], buf, count); | |||
ret.Resize(oldsize + done); | |||
memcpy(&ret[oldsize], buf, done); | |||
} | |||
#endif | |||
return ret; | |||
} | |||
void Close() | |||
{ | |||
#if __CELLOS_LV2__ | |||
if (m_fd >= 0) | |||
cellFsClose(m_fd); | |||
#elif HAVE_STDIO_H | |||
if (m_fd) | |||
fclose(m_fd); | |||
@@ -61,6 +111,7 @@ class FileData | |||
} | |||
#if __CELLOS_LV2__ | |||
int m_fd; | |||
#elif HAVE_STDIO_H | |||
FILE *m_fd; | |||
#endif | |||
@@ -84,6 +135,7 @@ File &File::operator =(File const &that) | |||
if (this == &that) | |||
return *this; | |||
/* FIXME: this needs auditing */ | |||
int refcount = --m_data->m_refcount; | |||
if (refcount == 0) | |||
{ | |||
@@ -112,6 +164,16 @@ void File::Open(String const &file, FileAccess mode) | |||
return m_data->Open(file, mode); | |||
} | |||
bool File::IsValid() const | |||
{ | |||
return m_data->IsValid(); | |||
} | |||
int File::Read(uint8_t *buf, int count) | |||
{ | |||
return m_data->Read(buf, count); | |||
} | |||
String File::ReadString() | |||
{ | |||
return m_data->ReadString(); | |||
@@ -31,6 +31,12 @@ class WorldData | |||
{ | |||
friend class World; | |||
static int LuaPanic(lua_State* L) | |||
{ | |||
DebugAbort(); | |||
return 0; | |||
} | |||
lua_State *m_lua_state; | |||
}; | |||
@@ -44,6 +50,7 @@ World g_world; | |||
World::World() | |||
{ | |||
g_world_data.m_lua_state = luaL_newstate(); | |||
lua_atpanic(g_world_data.m_lua_state, WorldData::LuaPanic); | |||
luaL_openlibs(g_world_data.m_lua_state); | |||
} | |||
@@ -55,18 +62,32 @@ World::~World() | |||
bool World::ExecLua(String const &lua) | |||
{ | |||
Array<String> pathlist = System::GetPathList(lua); | |||
File f; | |||
for (int i = 0; i < pathlist.Count(); ++i) | |||
{ | |||
luaL_dofile(g_world_data.m_lua_state, pathlist[i].C()); | |||
f.Open(pathlist[i], FileAccess::Read); | |||
if (f.IsValid()) | |||
{ | |||
String s = f.ReadString(); | |||
f.Close(); | |||
luaL_dostring(g_world_data.m_lua_state, s.C()); | |||
Log::Debug("loaded Lua file %s\n", pathlist[i].C()); | |||
return true; | |||
} | |||
} | |||
return true; | |||
Log::Error("could not find Lua file %s\n", lua.C()); | |||
return false; | |||
} | |||
double World::GetLuaNumber(String const &var) | |||
{ | |||
double ret; | |||
lua_getglobal(g_world_data.m_lua_state, var.C()); | |||
return lua_tonumber(g_world_data.m_lua_state, -1); | |||
ret = lua_tonumber(g_world_data.m_lua_state, -1); | |||
lua_pop(g_world_data.m_lua_state, 1); | |||
return ret; | |||
} | |||
} /* namespace lol */ | |||