diff options
-rw-r--r-- | lib/LuaHandle.cc | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/lib/LuaHandle.cc b/lib/LuaHandle.cc index 3172ec8..4456e13 100644 --- a/lib/LuaHandle.cc +++ b/lib/LuaHandle.cc @@ -38,6 +38,7 @@ class sLuaHandle : public Base { static int readU32(lua_State * L); static int readFloat(lua_State * L); static int readDouble(lua_State * L); + static int readfile(lua_State * L); static int write(lua_State * L); static int writestring(lua_State * L); static int writeU8(lua_State * L); @@ -81,6 +82,8 @@ class sLuaHandle : public Base { #endif static int archive(lua_State * L); static int user2table(lua_State * L); + static int adler32(lua_State * L); + static int crc32(lua_State * L); private: static int read(lua_State * L, int); static int write(lua_State * L, int); @@ -248,6 +251,82 @@ int sLuaHandle::readstring(lua_State * __L) { return 1; } +int sLuaHandle::readfile(lua_State * __L) { + Lua * L = Lua::find(__L); + int n = L->gettop(); + Handle * h; + Byte * buf; + + if (n != 1) { + L->error("Incorrect arguments to method `Headle::readfile'"); + } + + h = L->recast<Handle>(); + if (h->GetSize() < 0) return 0; + + h->seek(0); + + buf = (Byte *) malloc(h->GetSize()); + h->read(buf, h->GetSize()); + + L->push((char *) buf, h->GetSize()); + free(buf); + + return 1; +} + +int sLuaHandle::adler32(lua_State * __L) { + Lua * L = Lua::find(__L); + int n = L->gettop(); + Handle * h; + Byte * buf; + + if (n != 1) { + L->error("Incorrect arguments to function `adler32'"); + } + + h = L->recast<Handle>(); + if (h->GetSize() < 0) return 0; + + h->seek(0); + + buf = (Byte *) malloc(h->GetSize()); + Uint32 adler = ::adler32(0L, Z_NULL, 0); + + adler = ::adler32(adler, buf, h->GetSize()); + + L->push((lua_Number) adler); + free(buf); + + return 1; +} + +int sLuaHandle::crc32(lua_State * __L) { + Lua * L = Lua::find(__L); + int n = L->gettop(); + Handle * h; + Byte * buf; + + if (n != 1) { + L->error("Incorrect arguments to function `crc32'"); + } + + h = L->recast<Handle>(); + if (h->GetSize() < 0) return 0; + + h->seek(0); + + buf = (Byte *) malloc(h->GetSize()); + Uint32 crc = ::crc32(0L, Z_NULL, 0); + + crc = ::crc32(crc, buf, h->GetSize()); + + L->push((lua_Number) crc); + free(buf); + + return 1; +} + int sLuaHandle::readU8(lua_State * L) { return read(L, U8); } @@ -928,6 +1007,7 @@ void LuaHandle::pushmembers(Lua * L) { pushit(L, "readstring", sLuaHandle::readstring); pushit(L, "writestring", sLuaHandle::writestring); + pushit(L, "readfile", sLuaHandle::readfile); pushit(L, "readU8", sLuaHandle::readU8); pushit(L, "readU16", sLuaHandle::readU16); @@ -998,6 +1078,9 @@ void LuaHandle::pushconstruct(Lua * L) { L->declarefunc("Archive", sLuaHandle::archive); L->declarefunc("user2table", sLuaHandle::user2table); + + L->declarefunc("adler32", sLuaHandle::adler32); + L->declarefunc("crc32", sLuaHandle::crc32); } HandleLua::HandleLua(Lua * L, int i) : Handle(-1), L(L) { |