Permalink
208 lines (183 sloc) 8.66 KB
#include "general.h"
#include "THFile.h"
#include "luaT.h"
#define IMPLEMENT_TORCH_FILE_FLAG(NAME) \
static int torch_File_##NAME(lua_State *L) \
{ \
THFile *self = luaT_checkudata(L, 1, "torch.File"); \
lua_pushboolean(L, THFile_##NAME(self)); \
return 1; \
}
IMPLEMENT_TORCH_FILE_FLAG(isQuiet)
IMPLEMENT_TORCH_FILE_FLAG(isReadable)
IMPLEMENT_TORCH_FILE_FLAG(isWritable)
IMPLEMENT_TORCH_FILE_FLAG(isBinary)
IMPLEMENT_TORCH_FILE_FLAG(isAutoSpacing)
IMPLEMENT_TORCH_FILE_FLAG(hasError)
#define IMPLEMENT_TORCH_FILE_FUNC(NAME) \
static int torch_File_##NAME(lua_State *L) \
{ \
THFile *self = luaT_checkudata(L, 1, "torch.File"); \
THFile_##NAME(self); \
lua_settop(L, 1); \
return 1; \
}
IMPLEMENT_TORCH_FILE_FUNC(binary)
IMPLEMENT_TORCH_FILE_FUNC(ascii)
IMPLEMENT_TORCH_FILE_FUNC(autoSpacing)
IMPLEMENT_TORCH_FILE_FUNC(noAutoSpacing)
IMPLEMENT_TORCH_FILE_FUNC(quiet)
IMPLEMENT_TORCH_FILE_FUNC(pedantic)
IMPLEMENT_TORCH_FILE_FUNC(clearError)
IMPLEMENT_TORCH_FILE_FUNC(synchronize)
static int torch_File_seek(lua_State *L)
{
THFile *self = luaT_checkudata(L, 1, "torch.File");
ptrdiff_t position = luaL_checkinteger(L, 2)-1;
// >= 0 because it has 1 already subtracted
THArgCheck(position >= 0, 2, "position has to be greater than 0!");
THFile_seek(self, (size_t)position);
lua_settop(L, 1);
return 1;
}
IMPLEMENT_TORCH_FILE_FUNC(seekEnd)
static int torch_File_position(lua_State *L)
{
THFile *self = luaT_checkudata(L, 1, "torch.File");
lua_pushnumber(L, THFile_position(self)+1);
return 1;
}
IMPLEMENT_TORCH_FILE_FUNC(close)
#define IMPLEMENT_TORCH_FILE_RW(TYPEC, TYPE) \
static int torch_File_read##TYPEC(lua_State *L) \
{ \
THFile *self = luaT_checkudata(L, 1, "torch.File"); \
int narg = lua_gettop(L); \
\
if(narg == 1) \
{ \
lua_pushnumber(L, THFile_read##TYPEC##Scalar(self)); \
return 1; \
} \
else if(narg == 2) \
{ \
if(lua_isnumber(L, 2)) \
{ \
ptrdiff_t size = lua_tonumber(L, 2); \
ptrdiff_t nread; \
\
TH##TYPEC##Storage *storage = TH##TYPEC##Storage_newWithSize(size); \
luaT_pushudata(L, storage, "torch." #TYPEC "Storage"); \
nread = THFile_read##TYPEC(self, storage); \
if(nread != size) \
TH##TYPEC##Storage_resize(storage, nread); \
return 1; \
} \
else if(luaT_toudata(L, 2, "torch." #TYPEC "Storage")) \
{ \
TH##TYPEC##Storage *storage = luaT_toudata(L, 2, "torch." #TYPEC "Storage"); \
lua_pushnumber(L, THFile_read##TYPEC(self, storage)); \
return 1; \
} \
} \
\
luaL_error(L, "nothing, number, or " #TYPEC "Storage expected"); \
return 0; \
} \
\
static int torch_File_write##TYPEC(lua_State *L) \
{ \
THFile *self = luaT_checkudata(L, 1, "torch.File"); \
int narg = lua_gettop(L); \
\
if(narg == 2) \
{ \
if(lua_isnumber(L, 2)) \
{ \
TYPE value = lua_tonumber(L, 2); \
THFile_write##TYPEC##Scalar(self, (TYPE)value); \
return 0; \
} \
else if(luaT_toudata(L, 2, "torch." #TYPEC "Storage")) \
{ \
TH##TYPEC##Storage *storage = luaT_toudata(L, 2, "torch." #TYPEC "Storage"); \
lua_pushnumber(L, THFile_write##TYPEC(self, storage)); \
return 1; \
} \
} \
\
luaL_error(L, "number, or " #TYPEC "Storage expected"); \
return 0; \
}
IMPLEMENT_TORCH_FILE_RW(Byte, unsigned char)
IMPLEMENT_TORCH_FILE_RW(Char, char)
IMPLEMENT_TORCH_FILE_RW(Short, short)
IMPLEMENT_TORCH_FILE_RW(Int, int)
IMPLEMENT_TORCH_FILE_RW(Long, long)
IMPLEMENT_TORCH_FILE_RW(Float, float)
IMPLEMENT_TORCH_FILE_RW(Double, double)
static int torch_File_readString(lua_State *L)
{
THFile *self = luaT_checkudata(L, 1, "torch.File");
const char *format = luaL_checkstring(L, 2);
char *str;
ptrdiff_t size;
size = THFile_readStringRaw(self, format, &str);
lua_pushlstring(L, str, size);
THFree(str);
return 1;
}
static int torch_File_writeString(lua_State *L)
{
THFile *self = luaT_checkudata(L, 1, "torch.File");
const char *str = NULL;
size_t size;
luaL_checktype(L, 2, LUA_TSTRING);
str = lua_tolstring(L, 2, &size);
lua_pushnumber(L, THFile_writeStringRaw(self, str, size));
return 1;
}
static const struct luaL_Reg torch_File__ [] = {
{"isQuiet", torch_File_isQuiet},
{"isReadable", torch_File_isReadable},
{"isWritable", torch_File_isWritable},
{"isBinary", torch_File_isBinary},
{"isAutoSpacing", torch_File_isAutoSpacing},
{"hasError", torch_File_hasError},
{"binary", torch_File_binary},
{"ascii", torch_File_ascii},
{"autoSpacing", torch_File_autoSpacing},
{"noAutoSpacing", torch_File_noAutoSpacing},
{"quiet", torch_File_quiet},
{"pedantic", torch_File_pedantic},
{"clearError", torch_File_clearError},
/* DEBUG: CHECK DISK FREE & READ/WRITE STRING*/
{"readByte", torch_File_readByte},
{"readChar", torch_File_readChar},
{"readShort", torch_File_readShort},
{"readInt", torch_File_readInt},
{"readLong", torch_File_readLong},
{"readFloat", torch_File_readFloat},
{"readDouble", torch_File_readDouble},
{"readString", torch_File_readString},
{"writeByte", torch_File_writeByte},
{"writeChar", torch_File_writeChar},
{"writeShort", torch_File_writeShort},
{"writeInt", torch_File_writeInt},
{"writeLong", torch_File_writeLong},
{"writeFloat", torch_File_writeFloat},
{"writeDouble", torch_File_writeDouble},
{"writeString", torch_File_writeString},
{"synchronize", torch_File_synchronize},
{"seek", torch_File_seek},
{"seekEnd", torch_File_seekEnd},
{"position", torch_File_position},
{"close", torch_File_close},
{NULL, NULL}
};
void torch_File_init(lua_State *L)
{
luaT_newmetatable(L, "torch.File", NULL, NULL, NULL, NULL);
luaT_setfuncs(L, torch_File__, 0);
lua_pop(L, 1);
}