diff options
Diffstat (limited to 'tolua++-1.0.93/src/lib/tolua_is.c')
-rw-r--r-- | tolua++-1.0.93/src/lib/tolua_is.c | 621 |
1 files changed, 0 insertions, 621 deletions
diff --git a/tolua++-1.0.93/src/lib/tolua_is.c b/tolua++-1.0.93/src/lib/tolua_is.c deleted file mode 100644 index add337d19..000000000 --- a/tolua++-1.0.93/src/lib/tolua_is.c +++ /dev/null @@ -1,621 +0,0 @@ -/* tolua: functions to check types. -** Support code for Lua bindings. -** Written by Waldemar Celes -** TeCGraf/PUC-Rio -** Apr 2003 -** $Id: $ -*/ - -/* This code is free software; you can redistribute it and/or modify it. -** The software provided hereunder is on an "as is" basis, and -** the author has no obligation to provide maintenance, support, updates, -** enhancements, or modifications. -*/ - -#include "tolua++.h" -#include "lauxlib.h" - -#include <stdlib.h> -#include <string.h> - -/* a fast check if a is b, without parameter validation - i.e. if b is equal to a or a superclass of a. */ -TOLUA_API int tolua_fast_isa(lua_State *L, int mt_indexa, int mt_indexb, int super_index) -{ - int result; - if (lua_rawequal(L,mt_indexa,mt_indexb)) - result = 1; - else - { - if (super_index) { - lua_pushvalue(L, super_index); - } else { - lua_pushliteral(L,"tolua_super"); - lua_rawget(L,LUA_REGISTRYINDEX); /* stack: super */ - }; - lua_pushvalue(L,mt_indexa); /* stack: super mta */ - lua_rawget(L,-2); /* stack: super super[mta] */ - lua_pushvalue(L,mt_indexb); /* stack: super super[mta] mtb */ - lua_rawget(L,LUA_REGISTRYINDEX); /* stack: super super[mta] typenameB */ - lua_rawget(L,-2); /* stack: super super[mta] bool */ - result = lua_toboolean(L,-1); - lua_pop(L,3); - } - return result; -} - -/* Push and returns the corresponding object typename */ -TOLUA_API const char* tolua_typename (lua_State* L, int lo) -{ - int tag = lua_type(L,lo); - if (tag == LUA_TNONE) - lua_pushstring(L,"[no object]"); - else if (tag != LUA_TUSERDATA && tag != LUA_TTABLE) - lua_pushstring(L,lua_typename(L,tag)); - else if (tag == LUA_TUSERDATA) - { - if (!lua_getmetatable(L,lo)) - lua_pushstring(L,lua_typename(L,tag)); - else - { - lua_rawget(L,LUA_REGISTRYINDEX); - if (!lua_isstring(L,-1)) - { - lua_pop(L,1); - lua_pushstring(L,"[undefined]"); - } - } - } - else /* is table */ - { - lua_pushvalue(L,lo); - lua_rawget(L,LUA_REGISTRYINDEX); - if (!lua_isstring(L,-1)) - { - lua_pop(L,1); - lua_pushstring(L,"table"); - } - else - { - lua_pushstring(L,"class "); - lua_insert(L,-2); - lua_concat(L,2); - } - } - return lua_tostring(L,-1); -} - -TOLUA_API void tolua_error (lua_State* L, const char* msg, tolua_Error* err) -{ - if (msg[0] == '#') - { - const char* expected = err->type; - const char* provided = tolua_typename(L,err->index); - if (msg[1]=='f') - { - int narg = err->index; - if (err->array) - luaL_error(L,"%s\n argument #%d is array of '%s'; array of '%s' expected.\n", - msg+2,narg,provided,expected); - else - luaL_error(L,"%s\n argument #%d is '%s'; '%s' expected.\n", - msg+2,narg,provided,expected); - } - else if (msg[1]=='v') - { - if (err->array) - luaL_error(L,"%s\n value is array of '%s'; array of '%s' expected.\n", - msg+2,provided,expected); - else - luaL_error(L,"%s\n value is '%s'; '%s' expected.\n", - msg+2,provided,expected); - } - } - else - luaL_error(L,msg); -} - -/* the equivalent of lua_is* for usertable */ -static int lua_isusertable (lua_State* L, int lo, const const char* type) -{ - int r = 0; - if (lo < 0) lo = lua_gettop(L)+lo+1; - lua_pushvalue(L,lo); - lua_rawget(L,LUA_REGISTRYINDEX); /* get registry[t] */ - if (lua_isstring(L,-1)) - { - r = strcmp(lua_tostring(L,-1),type)==0; - if (!r) - { - /* try const */ - lua_pushstring(L,"const "); - lua_insert(L,-2); - lua_concat(L,2); - r = lua_isstring(L,-1) && strcmp(lua_tostring(L,-1),type)==0; - } - } - lua_pop(L, 1); - return r; -} - -int push_table_instance(lua_State* L, int lo) { - - if (lua_istable(L, lo)) { - - lua_pushstring(L, ".c_instance"); - lua_gettable(L, lo); - if (lua_isuserdata(L, -1)) { - - lua_replace(L, lo); - return 1; - } else { - - lua_pop(L, 1); - return 0; - }; - } else { - return 0; - }; - - return 0; -}; - -/* the equivalent of lua_is* for usertype */ -static int lua_isusertype (lua_State* L, int lo, const char* type) -{ - if (!lua_isuserdata(L,lo)) { - if (!push_table_instance(L, lo)) { - return 0; - }; - }; - { - /* check if it is of the same type */ - int r; - const char *tn; - if (lua_getmetatable(L,lo)) /* if metatable? */ - { - lua_rawget(L,LUA_REGISTRYINDEX); /* get registry[mt] */ - tn = lua_tostring(L,-1); - r = tn && (strcmp(tn,type) == 0); - lua_pop(L, 1); - if (r) - return 1; - else - { - /* check if it is a specialized class */ - lua_pushstring(L,"tolua_super"); - lua_rawget(L,LUA_REGISTRYINDEX); /* get super */ - lua_getmetatable(L,lo); - lua_rawget(L,-2); /* get super[mt] */ - if (lua_istable(L,-1)) - { - int b; - lua_pushstring(L,type); - lua_rawget(L,-2); /* get super[mt][type] */ - b = lua_toboolean(L,-1); - lua_pop(L,3); - if (b) - return 1; - } - } - } - } - return 0; -} - -TOLUA_API int tolua_isnoobj (lua_State* L, int lo, tolua_Error* err) -{ - if (lua_gettop(L)<abs(lo)) - return 1; - err->index = lo; - err->array = 0; - err->type = "[no object]"; - return 0; -} - -TOLUA_API int tolua_isboolean (lua_State* L, int lo, int def, tolua_Error* err) -{ - if (def && lua_gettop(L)<abs(lo)) - return 1; - if (lua_isnil(L,lo) || lua_isboolean(L,lo)) - return 1; - err->index = lo; - err->array = 0; - err->type = "boolean"; - return 0; -} - -TOLUA_API int tolua_isnumber (lua_State* L, int lo, int def, tolua_Error* err) -{ - if (def && lua_gettop(L)<abs(lo)) - return 1; - if (lua_isnumber(L,lo)) - return 1; - err->index = lo; - err->array = 0; - err->type = "number"; - return 0; -} - -TOLUA_API int tolua_isstring (lua_State* L, int lo, int def, tolua_Error* err) -{ - if (def && lua_gettop(L)<abs(lo)) - return 1; - if (lua_isnil(L,lo) || lua_isstring(L,lo)) - return 1; - err->index = lo; - err->array = 0; - err->type = "string"; - return 0; -} - -TOLUA_API int tolua_istable (lua_State* L, int lo, int def, tolua_Error* err) -{ - if (def && lua_gettop(L)<abs(lo)) - return 1; - if (lua_istable(L,lo)) - return 1; - err->index = lo; - err->array = 0; - err->type = "table"; - return 0; -} - -TOLUA_API int tolua_isusertable (lua_State* L, int lo, const char* type, int def, tolua_Error* err) -{ - if (def && lua_gettop(L)<abs(lo)) - return 1; - if (lua_isusertable(L,lo,type)) - return 1; - err->index = lo; - err->array = 0; - err->type = type; - return 0; -} - - -TOLUA_API int tolua_isuserdata (lua_State* L, int lo, int def, tolua_Error* err) -{ - if (def && lua_gettop(L)<abs(lo)) - return 1; - if (lua_isnil(L,lo) || lua_isuserdata(L,lo)) - return 1; - err->index = lo; - err->array = 0; - err->type = "userdata"; - return 0; -} - -TOLUA_API int tolua_isvaluenil (lua_State* L, int lo, tolua_Error* err) { - - if (lua_gettop(L)<abs(lo)) - return 0; /* somebody else should chack this */ - if (!lua_isnil(L, lo)) - return 0; - - err->index = lo; - err->array = 0; - err->type = "value"; - return 1; -}; - -TOLUA_API int tolua_isvalue (lua_State* L, int lo, int def, tolua_Error* err) -{ - if (def || abs(lo)<=lua_gettop(L)) /* any valid index */ - return 1; - err->index = lo; - err->array = 0; - err->type = "value"; - return 0; -} - -TOLUA_API int tolua_isusertype (lua_State* L, int lo, const char* type, int def, tolua_Error* err) -{ - if (def && lua_gettop(L)<abs(lo)) - return 1; - if (lua_isnil(L,lo) || lua_isusertype(L,lo,type)) - return 1; - err->index = lo; - err->array = 0; - err->type = type; - return 0; -} - -TOLUA_API int tolua_isvaluearray - (lua_State* L, int lo, int dim, int def, tolua_Error* err) -{ - if (!tolua_istable(L,lo,def,err)) - return 0; - else - return 1; -} - -TOLUA_API int tolua_isbooleanarray - (lua_State* L, int lo, int dim, int def, tolua_Error* err) -{ - if (!tolua_istable(L,lo,def,err)) - return 0; - else - { - int i; - for (i=1; i<=dim; ++i) - { - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!(lua_isnil(L,-1) || lua_isboolean(L,-1)) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "boolean"; - return 0; - } - lua_pop(L,1); - } - } - return 1; -} - -TOLUA_API int tolua_isnumberarray - (lua_State* L, int lo, int dim, int def, tolua_Error* err) -{ - if (!tolua_istable(L,lo,def,err)) - return 0; - else - { - int i; - for (i=1; i<=dim; ++i) - { - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!lua_isnumber(L,-1) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "number"; - return 0; - } - lua_pop(L,1); - } - } - return 1; -} - -TOLUA_API int tolua_isstringarray - (lua_State* L, int lo, int dim, int def, tolua_Error* err) -{ - if (!tolua_istable(L,lo,def,err)) - return 0; - else - { - int i; - for (i=1; i<=dim; ++i) - { - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!(lua_isnil(L,-1) || lua_isstring(L,-1)) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "string"; - return 0; - } - lua_pop(L,1); - } - } - return 1; -} - -TOLUA_API int tolua_istablearray - (lua_State* L, int lo, int dim, int def, tolua_Error* err) -{ - if (!tolua_istable(L,lo,def,err)) - return 0; - else - { - int i; - for (i=1; i<=dim; ++i) - { - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (! lua_istable(L,-1) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "table"; - return 0; - } - lua_pop(L,1); - } - } - return 1; -} - -TOLUA_API int tolua_isuserdataarray - (lua_State* L, int lo, int dim, int def, tolua_Error* err) -{ - if (!tolua_istable(L,lo,def,err)) - return 0; - else - { - int i; - for (i=1; i<=dim; ++i) - { - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!(lua_isnil(L,-1) || lua_isuserdata(L,-1)) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "userdata"; - return 0; - } - lua_pop(L,1); - } - } - return 1; -} - -TOLUA_API int tolua_isusertypearray - (lua_State* L, int lo, const char* type, int dim, int def, tolua_Error* err) -{ - if (!tolua_istable(L,lo,def,err)) - return 0; - else - { - int i; - for (i=1; i<=dim; ++i) - { - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!(lua_isnil(L,-1) || lua_isuserdata(L,-1)) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->type = type; - err->array = 1; - return 0; - } - lua_pop(L,1); - } - } - return 1; -} - -#if 0 -int tolua_isbooleanfield - (lua_State* L, int lo, int i, int def, tolua_Error* err) -{ - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!(lua_isnil(L,-1) || lua_isboolean(L,-1)) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "boolean"; - return 0; - } - lua_pop(L,1); - return 1; -} - -int tolua_isnumberfield - (lua_State* L, int lo, int i, int def, tolua_Error* err) -{ - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!lua_isnumber(L,-1) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "number"; - return 0; - } - lua_pop(L,1); - return 1; -} - -int tolua_isstringfield - (lua_State* L, int lo, int i, int def, tolua_Error* err) -{ - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!(lua_isnil(L,-1) || lua_isstring(L,-1)) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "string"; - return 0; - } - lua_pop(L,1); - return 1; -} - -int tolua_istablefield - (lua_State* L, int lo, int i, int def, tolua_Error* err) -{ - lua_pushnumber(L,i+1); - lua_gettable(L,lo); - if (! lua_istable(L,-1) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "table"; - return 0; - } - lua_pop(L,1); -} - -int tolua_isusertablefield - (lua_State* L, int lo, const char* type, int i, int def, tolua_Error* err) -{ - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (! lua_isusertable(L,-1,type) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = type; - return 0; - } - lua_pop(L,1); - return 1; -} - -int tolua_isuserdatafield - (lua_State* L, int lo, int i, int def, tolua_Error* err) -{ - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!(lua_isnil(L,-1) || lua_isuserdata(L,-1)) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->array = 1; - err->type = "userdata"; - return 0; - } - lua_pop(L,1); - return 1; -} - -int tolua_isusertypefield - (lua_State* L, int lo, const char* type, int i, int def, tolua_Error* err) -{ - lua_pushnumber(L,i); - lua_gettable(L,lo); - if (!(lua_isnil(L,-1) || lua_isusertype(L,-1,type)) && - !(def && lua_isnil(L,-1)) - ) - { - err->index = lo; - err->type = type; - err->array = 1; - return 0; - } - lua_pop(L,1); - return 1; -} - -#endif |