summaryrefslogtreecommitdiff
path: root/lib/LuaHandle.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/LuaHandle.cc')
-rw-r--r--lib/LuaHandle.cc83
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) {