Changeset 2568


Ignore:
Timestamp:
Mar 8, 2013, 12:47:59 PM (7 years ago)
Author:
sam
Message:

ps3: implement Lua file loading.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/configure.ac

    r2544 r2568  
    8989
    9090dnl  Common C functions
    91 AC_CHECK_FUNCS(getenv getcwd _getcwd backtrace_symbols)
     91AC_CHECK_FUNCS(getenv system tmpfile tmpnam getcwd _getcwd backtrace_symbols)
    9292
    9393
  • trunk/src/image/codec/ps3-image.cpp

    r2551 r2568  
    1515#if defined __CELLOS_LV2__
    1616
     17#include <sys/paths.h>
    1718#include <cell/sysmodule.h>
    1819#include <cell/codec/pngdec.h>
     
    99100    for (int i = 0; i < pathlist.Count(); ++i)
    100101    {
    101         String name = String("/app_home/") + pathlist[i];
     102        String name = String(SYS_APP_HOME) + '/' + pathlist[i];
    102103        dec_src.fileName = name.C();
    103104        err = cellPngDecOpen(hmain, &hsub, &dec_src, &open_info);
  • trunk/src/lol/base/assert.h

    r2506 r2568  
    2626}
    2727
     28extern void DumpStack();
     29
    2830/* FIXME: see http://stackoverflow.com/q/3596781/111461 for discussions
    2931 * on implementing __debugbreak() on POSIX systems. */
    30 static inline void DebugBreak()
     32static inline void DebugAbort()
    3133{
     34    DumpStack();
    3235#if defined _WIN32
    3336    __debugbreak();
    3437#endif
     38    Abort();
    3539}
    36 
    37 extern void DumpStack();
    3840
    3941#define LOL_CALL(macro, args) macro args
     
    118120                                                  (__VA_ARGS__))), \
    119121                     (__VA_ARGS__)); \
    120             DumpStack(); \
    121             DebugBreak(); \
    122             Abort(); \
     122            DebugAbort(); \
    123123        }
    124124#endif
  • trunk/src/lol/sys/file.h

    r2361 r2568  
    4444
    4545    void Open(String const &file, FileAccess mode);
     46    bool IsValid() const;
     47    void Close();
     48
     49    int Read(uint8_t *buf, int count);
    4650    String ReadString();
    47     void Close();
    4851
    4952private:
  • trunk/src/lua/linit.c

    r2542 r2568  
    3535  {LUA_COLIBNAME, luaopen_coroutine},
    3636  {LUA_TABLIBNAME, luaopen_table},
     37#if 0 // LOL BEGIN
    3738  {LUA_IOLIBNAME, luaopen_io},
    3839  {LUA_OSLIBNAME, luaopen_os},
     40#endif // LOL END
    3941  {LUA_STRLIBNAME, luaopen_string},
    4042  {LUA_BITLIBNAME, luaopen_bit32},
  • trunk/src/sys/file.cpp

    r2506 r2568  
    1313#endif
    1414
     15#if __CELLOS_LV2__
     16#   include <sys/paths.h>
     17#   include <cell/cell_fs.h>
     18#endif
     19
    1520#include "core.h"
     21
     22/* HACK: use fopen() for now so that we get FIOS. */
     23#if 0//__CELLOS_LV2__
     24extern "C" {
     25#   include <stdio.h>
     26}
     27#   undef __CELLOS_LV2__
     28#   define HAVE_STDIO_H 1
     29#   undef BUFSIZ
     30#   define BUFSIZ 1024
     31#endif
    1632
    1733namespace lol
     
    2541    {
    2642#if __CELLOS_LV2__
     43        String realfile = String(SYS_APP_HOME) + '/' + file;
     44        CellFsErrno err = cellFsOpen(realfile.C(), CELL_FS_O_RDONLY,
     45                                     &m_fd, NULL, 0);
     46        if (err != CELL_FS_SUCCEEDED)
     47            m_fd = -1;
    2748#elif HAVE_STDIO_H
    2849        /* FIXME: no modes, no error checking, no nothing */
     
    3152    }
    3253
     54    inline bool IsValid() const
     55    {
     56#if __CELLOS_LV2__
     57        return m_fd > -1;
     58#elif HAVE_STDIO_H
     59        return !!m_fd;
     60#endif
     61    }
     62
     63    int Read(uint8_t *buf, int count)
     64    {
     65#if __CELLOS_LV2__
     66        uint64_t done;
     67        CellFsErrno err = cellFsRead(m_fd, buf, count, &done);
     68
     69        if (err != CELL_FS_SUCCEEDED)
     70            return -1;
     71
     72        return (int)done;
     73#elif HAVE_STDIO_H
     74        size_t done = fread(buf, 1, count, m_fd);
     75        if (done <= 0)
     76            return -1;
     77
     78        return (int)done;
     79#endif
     80    }
     81
    3382    String ReadString()
    3483    {
    3584        String ret;
    36 #if __CELLOS_LV2__
    37 #elif HAVE_STDIO_H
    38         while (m_fd && !feof(m_fd))
     85        while (IsValid())
    3986        {
    40             char buf[BUFSIZ];
    41             size_t count = fread(buf, 1, BUFSIZ, m_fd);
    42             if (count <= 0)
     87            /* XXX: BUFSIZ would overflow the stack here */
     88            uint8_t buf[1024];
     89            int done = Read(buf, 1024);
     90
     91            if (done <= 0)
    4392                break;
    4493
    4594            int oldsize = ret.Count();
    46             ret.Resize(oldsize + count);
    47             memcpy(&ret[oldsize], buf, count);
     95            ret.Resize(oldsize + done);
     96            memcpy(&ret[oldsize], buf, done);
    4897        }
    49 #endif
    5098        return ret;
    5199    }
     
    54102    {
    55103#if __CELLOS_LV2__
     104        if (m_fd >= 0)
     105            cellFsClose(m_fd);
    56106#elif HAVE_STDIO_H
    57107        if (m_fd)
     
    62112
    63113#if __CELLOS_LV2__
     114    int m_fd;
    64115#elif HAVE_STDIO_H
    65116    FILE *m_fd;
     
    85136        return *this;
    86137
     138    /* FIXME: this needs auditing */
    87139    int refcount = --m_data->m_refcount;
    88140    if (refcount == 0)
     
    113165}
    114166
     167bool File::IsValid() const
     168{
     169    return m_data->IsValid();
     170}
     171
     172int File::Read(uint8_t *buf, int count)
     173{
     174    return m_data->Read(buf, count);
     175}
     176
    115177String File::ReadString()
    116178{
  • trunk/src/world.cpp

    r2565 r2568  
    3232    friend class World;
    3333
     34    static int LuaPanic(lua_State* L)
     35    {
     36        DebugAbort();
     37        return 0;
     38    }
     39
    3440    lua_State *m_lua_state;
    3541};
     
    4551{
    4652    g_world_data.m_lua_state = luaL_newstate();
     53    lua_atpanic(g_world_data.m_lua_state, WorldData::LuaPanic);
    4754    luaL_openlibs(g_world_data.m_lua_state);
    4855}
     
    5663{
    5764    Array<String> pathlist = System::GetPathList(lua);
     65    File f;
    5866    for (int i = 0; i < pathlist.Count(); ++i)
    5967    {
    60         luaL_dofile(g_world_data.m_lua_state, pathlist[i].C());
     68        f.Open(pathlist[i], FileAccess::Read);
     69        if (f.IsValid())
     70        {
     71            String s = f.ReadString();
     72            f.Close();
     73
     74            luaL_dostring(g_world_data.m_lua_state, s.C());
     75            Log::Debug("loaded Lua file %s\n", pathlist[i].C());
     76            return true;
     77        }
    6178    }
    6279
    63     return true;
     80    Log::Error("could not find Lua file %s\n", lua.C());
     81    return false;
    6482}
    6583
    6684double World::GetLuaNumber(String const &var)
    6785{
     86    double ret;
    6887    lua_getglobal(g_world_data.m_lua_state, var.C());
    69     return lua_tonumber(g_world_data.m_lua_state, -1);
     88    ret = lua_tonumber(g_world_data.m_lua_state, -1);
     89    lua_pop(g_world_data.m_lua_state, 1);
     90    return ret;
    7091}
    7192
Note: See TracChangeset for help on using the changeset viewer.