From b3b4fd468cb4703ceed95ed78a567bb759cdb338 Mon Sep 17 00:00:00 2001 From: pixel Date: Sun, 7 Dec 2003 04:44:37 +0000 Subject: LUA work work work --- lib/luacd.cpp | 461 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 304 insertions(+), 157 deletions(-) (limited to 'lib') diff --git a/lib/luacd.cpp b/lib/luacd.cpp index 9d8f6df..bda2c10 100644 --- a/lib/luacd.cpp +++ b/lib/luacd.cpp @@ -17,26 +17,20 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* $Id: luacd.cpp,v 1.1 2003-12-06 04:26:17 pixel Exp $ */ +/* $Id: luacd.cpp,v 1.2 2003-12-07 04:44:39 pixel Exp $ */ #include "luacd.h" -Luacdfile::Luacdfile(cdfile * h) : LuaHandle(h) { } -Luacdutils::Luacdutils(cdutils * _cd) : cd(_cd) { } -Luadirentry::Luadirentry(cdutils::DirEntry * _dir) : dir(_dir) { } -enum { - LUA_ANY = 0, - LUA_OBJECT, - LUA_TABLE, - LUA_BOOLEAN, - LUA_NUMBER, - LUA_STRING, - LUA_FUNCTION, -}; +/****************************\ +|** class cdutils exports **| +\****************************/ -enum { - CDUTILS_GUESSTYPE = 0, +Luacdutils::Luacdutils(cdutils * _cd) : cd(_cd) { } + +enum cdutils_methods_t { + CDUTILS_SETISOW = 0, + CDUTILS_GUESSTYPE, CDUTILS_SECTORSEEK, CDUTILS_READSECTOR, CDUTILS_READDATAS, @@ -51,139 +45,176 @@ enum { CDUTILS_FINDDIRENTRY, }; -struct functypes_t { - int number; - char * name; - int minargs, maxargs; - int argtypes[32]; +enum cdutils_functions_t { + CDUTILS_NEWCDUTILS = 0, + CDUTILS_SWAPWORD, + CDUTILS_SWAPDWORD, + CDUTILS_FROM_BCD, + CDUTILS_TO_BCD, + CDUTILS_IS_VALID_BCD, + CDUTILS_FROM_MSF, }; -struct functypes_t cdfunctions[] = { - { CDUTILS_GUESSTYPE, "cdutils::guesstype", 0, 1, {LUA_NUMBER} }, - { CDUTILS_SECTORSEEK, "cdutils::sectorseek", 1, 1, {LUA_NUMBER} }, - { CDUTILS_READSECTOR, "cdutils::readsector", 0, 2, {LUA_NUMBER, LUA_NUMBER} }, - { CDUTILS_READDATAS, "cdutils::readdatas", 3, 3, {LUA_NUMBER, LUA_NUMBER, LUA_NUMBER} }, - { CDUTILS_READFILE, "cdutils::readfile", 4, 4, {LUA_OBJECT, LUA_NUMBER, LUA_NUMBER, LUA_NUMBER} }, - { CDUTILS_WRITESECTOR, "cdutils::writesector", 1, 3, {LUA_TABLE, LUA_NUMBER, LUA_NUMBER} }, - { CDUTILS_WRITEDATAS, "cdutils::writedatas", 4, 4, {LUA_TABLE, LUA_NUMBER, LUA_NUMBER, LUA_NUMBER} }, - { CDUTILS_WRITEFILE, "cdutils::writefile", 1, 3, {LUA_OBJECT, LUA_NUMBER, LUA_NUMBER} }, - { CDUTILS_GETISOINFOS, "cdutils::getisoinfos", 0, 0, 0 }, - { CDUTILS_GETPTINFOS, "cdutils::getptinfos", 0, 0, 0 }, - { CDUTILS_FINDPATH, "cdutils::findpath", 1, 1, {LUA_STRING} }, - { CDUTILS_FINDPARENT, "cdutils::findparent", 1, 1, {LUA_STRING} }, - { CDUTILS_FINDDIRENTRY, "cdutils::finddirentry", 2, 2, {LUA_OBJECT, LUA_STRING} }, +struct lua_functypes_t cdutils_methods[] = { + { CDUTILS_SETISOW, "set_iso_w", 1, 1, {LUA_OBJECT} }, + { CDUTILS_GUESSTYPE, "guesstype", 0, 1, {LUA_NUMBER} }, + { CDUTILS_SECTORSEEK, "sectorseek", 1, 1, {LUA_NUMBER} }, + { CDUTILS_READSECTOR, "readsector", 0, 2, {LUA_NUMBER, LUA_NUMBER} }, + { CDUTILS_READDATAS, "readdatas", 3, 3, {LUA_NUMBER, LUA_NUMBER, LUA_NUMBER} }, + { CDUTILS_READFILE, "readfile", 4, 4, {LUA_OBJECT, LUA_NUMBER, LUA_NUMBER, LUA_NUMBER} }, + { CDUTILS_WRITESECTOR, "writesector", 1, 3, {LUA_TABLE, LUA_NUMBER, LUA_NUMBER} }, + { CDUTILS_WRITEDATAS, "writedatas", 4, 4, {LUA_TABLE, LUA_NUMBER, LUA_NUMBER, LUA_NUMBER} }, + { CDUTILS_WRITEFILE, "writefile", 1, 3, {LUA_OBJECT, LUA_NUMBER, LUA_NUMBER} }, + { CDUTILS_GETISOINFOS, "getisoinfos", 0, 0, 0 }, + { CDUTILS_GETPTINFOS, "getptinfos", 0, 0, 0 }, + { CDUTILS_FINDPATH, "findpath", 1, 1, {LUA_STRING} }, + { CDUTILS_FINDPARENT, "findparent", 1, 1, {LUA_STRING} }, + { CDUTILS_FINDDIRENTRY, "finddirentry", 2, 2, {LUA_OBJECT, LUA_STRING} }, + { -1, 0, 0, 0, 0 } }; -#define DECLARE_FUNC(enumvar) static int method_##enumvar(lua_State * L) { return multiplex(enumvar, L); } -#define PUSH_FUNC(enumvar) pushit(L, cdfunctions[enumvar].name, sLuacd::method_##enumvar) +struct lua_functypes_t cdutils_functions[] = { + { CDUTILS_NEWCDUTILS, "cdutils" , 1, 2, {LUA_OBJECT, LUA_OBJECT} }, + { CDUTILS_SWAPWORD, "swapword", 1, 1, {LUA_NUMBER} }, + { CDUTILS_SWAPDWORD, "swapdword", 1, 1, {LUA_NUMBER} }, + { CDUTILS_FROM_BCD, "from_BCD", 1, 1, {LUA_NUMBER} }, + { CDUTILS_TO_BCD, "to_BCD", 1, 1, {LUA_NUMBER} }, + { CDUTILS_IS_VALID_BCD, "is_valid_BCD", 1, 1, {LUA_NUMBER} }, + { CDUTILS_FROM_MSF, "from_MSF", 1, 4, {LUA_NUMBER, LUA_NUMBER, LUA_NUMBER, LUA_NUMBER} }, + { -1, 0, 0, 0, 0 } +}; -class sLuacd : public Base { +class sLua_cdutils : public Base { public: - static int newcdfile(lua_State * L); - static int newcdutils(lua_State * L); - - DECLARE_FUNC(CDUTILS_GUESSTYPE); - DECLARE_FUNC(CDUTILS_SECTORSEEK); - DECLARE_FUNC(CDUTILS_READSECTOR); - DECLARE_FUNC(CDUTILS_READDATAS); - DECLARE_FUNC(CDUTILS_READFILE); - DECLARE_FUNC(CDUTILS_WRITESECTOR); - DECLARE_FUNC(CDUTILS_WRITEDATAS); - DECLARE_FUNC(CDUTILS_WRITEFILE); - DECLARE_FUNC(CDUTILS_GETISOINFOS); - DECLARE_FUNC(CDUTILS_GETPTINFOS); - DECLARE_FUNC(CDUTILS_FINDPATH); - DECLARE_FUNC(CDUTILS_FINDPARENT); - DECLARE_FUNC(CDUTILS_FINDDIRENTRY); + DECLARE_METHOD(cdutils, CDUTILS_SETISOW); + DECLARE_METHOD(cdutils, CDUTILS_GUESSTYPE); + DECLARE_METHOD(cdutils, CDUTILS_SECTORSEEK); + DECLARE_METHOD(cdutils, CDUTILS_READSECTOR); + DECLARE_METHOD(cdutils, CDUTILS_READDATAS); + DECLARE_METHOD(cdutils, CDUTILS_READFILE); + DECLARE_METHOD(cdutils, CDUTILS_WRITESECTOR); + DECLARE_METHOD(cdutils, CDUTILS_WRITEDATAS); + DECLARE_METHOD(cdutils, CDUTILS_WRITEFILE); + DECLARE_METHOD(cdutils, CDUTILS_GETISOINFOS); + DECLARE_METHOD(cdutils, CDUTILS_GETPTINFOS); + DECLARE_METHOD(cdutils, CDUTILS_FINDPATH); + DECLARE_METHOD(cdutils, CDUTILS_FINDPARENT); + DECLARE_METHOD(cdutils, CDUTILS_FINDDIRENTRY); + + DECLARE_FUNCTION(cdutils, CDUTILS_NEWCDUTILS); + DECLARE_FUNCTION(cdutils, CDUTILS_SWAPWORD); + DECLARE_FUNCTION(cdutils, CDUTILS_SWAPDWORD); + DECLARE_FUNCTION(cdutils, CDUTILS_FROM_BCD); + DECLARE_FUNCTION(cdutils, CDUTILS_TO_BCD); + DECLARE_FUNCTION(cdutils, CDUTILS_IS_VALID_BCD); + DECLARE_FUNCTION(cdutils, CDUTILS_FROM_MSF); private: - static int multiplex(int caller, lua_State * L); - static int proceed(Lua * L, int n, void * obj, int caller); + static int cdutils_proceed(Lua * L, int n, cdutils * obj, int caller); + static int cdutils_proceed_statics(Lua * L, int n, int caller); }; -void Luacdfile::pushconstruct(Lua * L) { - L->declarefunc("cdfile", sLuacd::newcdfile); -} +void Luacdutils::pushmembers(Lua * L) { + pushme(L, cd); -void Luacdutils::pushconstruct(Lua * L) { - L->declarefunc("cdutils", sLuacd::newcdutils); + PUSH_METHOD(cdutils, CDUTILS_SETISOW); + PUSH_METHOD(cdutils, CDUTILS_GUESSTYPE); + PUSH_METHOD(cdutils, CDUTILS_SECTORSEEK); + PUSH_METHOD(cdutils, CDUTILS_READSECTOR); + PUSH_METHOD(cdutils, CDUTILS_READDATAS); + PUSH_METHOD(cdutils, CDUTILS_READFILE); + PUSH_METHOD(cdutils, CDUTILS_WRITESECTOR); + PUSH_METHOD(cdutils, CDUTILS_WRITEDATAS); + PUSH_METHOD(cdutils, CDUTILS_WRITEFILE); + PUSH_METHOD(cdutils, CDUTILS_GETISOINFOS); + PUSH_METHOD(cdutils, CDUTILS_GETPTINFOS); + PUSH_METHOD(cdutils, CDUTILS_FINDPATH); + PUSH_METHOD(cdutils, CDUTILS_FINDPARENT); + PUSH_METHOD(cdutils, CDUTILS_FINDDIRENTRY); } -int sLuacd::newcdfile(lua_State * _L) { - /***TODO***/ - /* Creation of a 'cdfile' from within lua. */ +void Luacdutils::pushstatics(Lua * L) throw (GeneralException) { + CHECK_METHODS(cdutils); + CHECK_FUNCTIONS(cdutils); - return 0; -} + PUSH_FUNCTION(cdutils, CDUTILS_NEWCDUTILS); + PUSH_FUNCTION(cdutils, CDUTILS_SWAPWORD); + PUSH_FUNCTION(cdutils, CDUTILS_SWAPDWORD); + PUSH_FUNCTION(cdutils, CDUTILS_FROM_BCD); + PUSH_FUNCTION(cdutils, CDUTILS_TO_BCD); + PUSH_FUNCTION(cdutils, CDUTILS_IS_VALID_BCD); + PUSH_FUNCTION(cdutils, CDUTILS_FROM_MSF); -int sLuacd::newcdutils(lua_State * _L) { - /***TODO***/ - /* Creation of a 'cdutils' from within lua. */ + L->push("MODE0"); + L->push((lua_Number) MODE0); + L->setvar(); - return 0; -} + L->push("MODE1"); + L->push((lua_Number) MODE1); + L->setvar(); + + L->push("MODE2"); + L->push((lua_Number) MODE2); + L->setvar(); + + L->push("MODE2_FORM1"); + L->push((lua_Number) MODE2_FORM1); + L->setvar(); + + L->push("MODE2_FORM2"); + L->push((lua_Number) MODE2_FORM2); + L->setvar(); + + L->push("MORE_RAW"); + L->push((lua_Number) MODE_RAW); + L->setvar(); + + L->push("GUESS"); + L->push((lua_Number) GUESS); + L->setvar(); -int sLuacd::multiplex(int caller, lua_State * _L) { - Lua * L = Lua::find(_L); - int n = L->gettop() - 1; - void * obj = LuaObject::getme(L); int i; - bool invalid = false; - - if ((n < cdfunctions[caller].minargs) || (n > cdfunctions[caller].maxargs)) { - invalid = true; - } else { - for (i = 0; i < cdfunctions[caller].maxargs && !invalid; i++) { - if (n >= (i + 1)) { - switch(cdfunctions[caller].argtypes[i]) { - case LUA_ANY: - break; - case LUA_OBJECT: - invalid = !L->istable(i + 2); - if (!invalid) { - L->push("__obj"); - L->gettable(i + 2); - invalid = L->islightuserdata(); - L->pop(); - } - break; - case LUA_TABLE: - invalid = !L->istable(i + 2); - break; - case LUA_BOOLEAN: - invalid = !L->isboolean(i + 2); - break; - case LUA_NUMBER: - invalid = !L->isnumber(i + 2); - break; - case LUA_STRING: - invalid = !L->isstring(i + 2); - break; - case LUA_FUNCTION: - invalid = !L->isfunction(i + 2); - break; - } - } - } - } - if (invalid) { - L->error(String("Invalid arguments to method `") + cdfunctions[caller].name + "'"); + L->push("sec_sizes"); + L->newtable(); + for (i = 0; i <= GUESS; i++) { + L->push((lua_Number) i); + L->push((lua_Number) sec_sizes[i]); + L->settable(); } - - return proceed(L, n, obj, caller); + L->setvar(); + + L->push("sec_offsts"); + L->newtable(); + for (i = 0; i <= GUESS; i++) { + L->push((lua_Number) i); + L->push((lua_Number) sec_offsts[i]); + L->settable(); + } + L->setvar(); + + L->push("sec_modes"); + L->newtable(); + for (i = 0; i <= GUESS; i++) { + L->push((lua_Number) i); + L->push(sec_modes[i]); + L->settable(); + } + L->setvar(); } -int sLuacd::proceed(Lua * L, int n, void * obj, int caller) { +int sLua_cdutils::cdutils_proceed(Lua * L, int n, cdutils * cd, int caller) { int r = 0, sect = -1, mode = GUESS, size, i; Handle * h; Byte sdatas[2352], * datas; String path; - - cdutils * cd = (cdutils *) obj; - cdutils::DirEntry * dir = (cdutils::DirEntry *) obj, * bdir, * adir; + cdutils::DirEntry * dir, * bdir, * adir; switch(caller) { + case CDUTILS_SETISOW: + h = (Handle *) LuaObject::getme(L, 2); + cd->set_iso_w(h); + break; case CDUTILS_GUESSTYPE: if (n == 1) { sect = L->tonumber(); @@ -316,56 +347,172 @@ int sLuacd::proceed(Lua * L, int n, void * obj, int caller) { return r; } +int sLua_cdutils::cdutils_proceed_statics(Lua * L, int n, int caller) { + int r = 0; + Uint32 x; + + switch(caller) { + case CDUTILS_NEWCDUTILS: + /***TODO***/ + break; + case CDUTILS_SWAPWORD: + x = L->tonumber(); + L->push((lua_Number) cdutils::swap_word(x)); + r = 1; + break; + case CDUTILS_SWAPDWORD: + x = L->tonumber(); + L->push((lua_Number) cdutils::swap_dword(x)); + r = 1; + break; + case CDUTILS_FROM_BCD: + x = L->tonumber(); + L->push((lua_Number) cdutils::from_BCD(x)); + r = 1; + break; + case CDUTILS_TO_BCD: + x = L->tonumber(); + L->push((lua_Number) cdutils::to_BCD(x)); + r = 1; + break; + case CDUTILS_IS_VALID_BCD: + x = L->tonumber(); + L->push(cdutils::is_valid_BCD(x)); + r = 1; + break; + case CDUTILS_FROM_MSF: + /***TODO***/ + break; + } + + return r; +} + + +/***************************\ +|** class cdfile exports **| +\***************************/ + +Luacdfile::Luacdfile(cdfile * h) : LuaHandle(h) { } + +enum cdfile_functions_t { + CDFILE_NEWCDFILE = 0, +}; + +struct lua_functypes_t cdfile_functions[] = { + { CDFILE_NEWCDFILE, "cdfile", 1, 4, {LUA_OBJECT, LUA_ANY, LUA_NUMBER, LUA_NUMBER} }, + { -1, 0, 0, 0, 0 } +}; + +class sLua_cdfile : public Base { + public: + DECLARE_FUNCTION(cdfile, CDFILE_NEWCDFILE); + private: + static int cdfile_proceed_statics(Lua * L, int n, int caller); +}; + void Luacdfile::pushmembers(Lua * L) { LuaHandle::pushmembers(L); } -void Luacdutils::pushmembers(Lua * L) { - pushme(L, cd); +void Luacdfile::pushstatics(Lua * L) { + CHECK_FUNCTIONS(cdfile); + PUSH_FUNCTION(cdfile, CDFILE_NEWCDFILE); +} - PUSH_FUNC(CDUTILS_GUESSTYPE); - PUSH_FUNC(CDUTILS_SECTORSEEK); - PUSH_FUNC(CDUTILS_READSECTOR); - PUSH_FUNC(CDUTILS_READDATAS); - PUSH_FUNC(CDUTILS_READFILE); - PUSH_FUNC(CDUTILS_WRITESECTOR); - PUSH_FUNC(CDUTILS_WRITEDATAS); - PUSH_FUNC(CDUTILS_WRITEFILE); - PUSH_FUNC(CDUTILS_GETISOINFOS); - PUSH_FUNC(CDUTILS_GETPTINFOS); - PUSH_FUNC(CDUTILS_FINDPATH); - PUSH_FUNC(CDUTILS_FINDPARENT); - PUSH_FUNC(CDUTILS_FINDDIRENTRY); +int sLua_cdfile::cdfile_proceed_statics(Lua * L, int n, int caller) { + int r = 0; - L->push("MODE0"); - L->push((lua_Number) MODE0); - L->settable(LUA_GLOBALSINDEX); + switch(caller) { + case CDFILE_NEWCDFILE: + /****TODO****/ + break; + } - L->push("MODE1"); - L->push((lua_Number) MODE1); - L->settable(LUA_GLOBALSINDEX); + return r; +} - L->push("MODE2"); - L->push((lua_Number) MODE2); - L->settable(LUA_GLOBALSINDEX); - L->push("MODE2_FORM1"); - L->push((lua_Number) MODE2_FORM1); - L->settable(LUA_GLOBALSINDEX); - L->push("MODE2_FORM2"); - L->push((lua_Number) MODE2_FORM2); - L->settable(LUA_GLOBALSINDEX); +Luadirentry::Luadirentry(cdutils::DirEntry * _dir) : dir(_dir) { } - L->push("MORE_RAW"); - L->push((lua_Number) MODE_RAW); - L->settable(LUA_GLOBALSINDEX); +typedef cdutils::DirEntry direntry; - L->push("GUESS"); - L->push((lua_Number) GUESS); - L->settable(LUA_GLOBALSINDEX); -} +enum direntry_methods_t { + DIRENTRY_INDEX = 0, +}; + +struct lua_functypes_t direntry_methods[] = { + { DIRENTRY_INDEX, "index", 2, 2, {LUA_OBJECT, LUA_STRING} }, + { -1, 0, 0, 0, 0 } +}; + +class sLua_direntry : public Base { + public: + DECLARE_METHOD(direntry, DIRENTRY_INDEX); + private: + static int direntry_proceed(Lua * L, int n, direntry * obj, int caller); +}; void Luadirentry::pushmembers(Lua * L) { pushme(L, dir); + + PUSH_METAMETHOD(direntry, DIRENTRY_INDEX); +} + +int sLua_direntry::direntry_proceed(Lua * L, int n, direntry * dir, int caller) { + int r = 0; + String index; + + switch (caller) { + case DIRENTRY_INDEX: + index = L->tostring(); + r = 1; + if (index == "R") { + L->push((lua_Number) dir->R); + } else if (index == "NExt") { + L->push((lua_Number) dir->NExt); + } else if (index == "Sector") { + L->push((lua_Number) dir->Sector); + } else if (index == "Size") { + L->push((lua_Number) dir->Size); + } else if (index == "Year") { + L->push((lua_Number) dir->Year); + } else if (index == "Month") { + L->push((lua_Number) dir->Month); + } else if (index == "Day") { + L->push((lua_Number) dir->Day); + } else if (index == "Hour") { + L->push((lua_Number) dir->Hour); + } else if (index == "Minute") { + L->push((lua_Number) dir->Minute); + } else if (index == "Second") { + L->push((lua_Number) dir->Second); + } else if (index == "Offset") { + L->push((lua_Number) dir->Offset); + } else if (index == "Flags") { + L->push((lua_Number) dir->Flags); + } else if (index == "HandleUnit") { + L->push((lua_Number) dir->HandleUnit); + } else if (index == "HandleGap") { + L->push((lua_Number) dir->HandleGap); + } else if (index == "VolSeq") { + L->push((lua_Number) dir->VolSeq); + } else if (index == "N") { + L->push((lua_Number) dir->N); + } else if (index == "id") { + char pbuf[256]; + memcpy(pbuf, dir->id, dir->N); + pbuf[dir->N] = 0; + L->push(pbuf, dir->N); + } else { + L->push(); + } + } + + return r; +} + +const cdutils::DirEntry * Luadirentry::getdir() { + return dir; } -- cgit v1.2.3