1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
/* tolua: funcitons to convert to C types
** Support code for Lua bindings.
** Written by Waldemar Celes
** TeCGraf/PUC-Rio
** Apr 2003
*/
/* 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 <string.h>
#include <stdlib.h>
TOLUA_API lua_Number tolua_tonumber (lua_State* L, int narg, lua_Number def)
{
return lua_gettop(L)<abs(narg) ? def : lua_tonumber(L,narg);
}
TOLUA_API const char* tolua_tostring (lua_State* L, int narg, const char* def)
{
return lua_gettop(L)<abs(narg) ? def : lua_tostring(L,narg);
}
TOLUA_API void* tolua_touserdata (lua_State* L, int narg, void* def)
{
/* return lua_gettop(L)<abs(narg) ? def : lua_touserdata(L,narg); */
if (lua_gettop(L)<abs(narg)) {
return def;
};
if (lua_islightuserdata(L, narg)) {
return lua_touserdata(L,narg);
};
return tolua_tousertype(L, narg, def);
}
extern int push_table_instance(lua_State* L, int lo);
TOLUA_API void* tolua_tousertype (lua_State* L, int narg, void* def)
{
if (lua_gettop(L)<abs(narg))
return def;
else
{
void* u;
if (!lua_isuserdata(L, narg)) {
if (!push_table_instance(L, narg)) return NULL;
};
u = lua_touserdata(L,narg);
return (u==NULL) ? NULL : *((void**)u); /* nil represents NULL */
}
}
TOLUA_API int tolua_tovalue (lua_State* L, int narg, int def)
{
return lua_gettop(L)<abs(narg) ? def : narg;
}
TOLUA_API int tolua_toboolean (lua_State* L, int narg, int def)
{
return lua_gettop(L)<abs(narg) ? def : lua_toboolean(L,narg);
}
TOLUA_API lua_Number tolua_tofieldnumber (lua_State* L, int lo, int index, lua_Number def)
{
double v;
lua_pushnumber(L,index);
lua_gettable(L,lo);
v = lua_isnil(L,-1) ? def : lua_tonumber(L,-1);
lua_pop(L,1);
return v;
}
TOLUA_API const char* tolua_tofieldstring
(lua_State* L, int lo, int index, const char* def)
{
const char* v;
lua_pushnumber(L,index);
lua_gettable(L,lo);
v = lua_isnil(L,-1) ? def : lua_tostring(L,-1);
lua_pop(L,1);
return v;
}
TOLUA_API void* tolua_tofielduserdata (lua_State* L, int lo, int index, void* def)
{
void* v;
lua_pushnumber(L,index);
lua_gettable(L,lo);
v = lua_isnil(L,-1) ? def : lua_touserdata(L,-1);
lua_pop(L,1);
return v;
}
TOLUA_API void* tolua_tofieldusertype (lua_State* L, int lo, int index, void* def)
{
void* v;
lua_pushnumber(L,index);
lua_gettable(L,lo);
v = lua_isnil(L,-1) ? def : (*(void **)(lua_touserdata(L, -1))); /* lua_unboxpointer(L,-1); */
lua_pop(L,1);
return v;
}
TOLUA_API int tolua_tofieldvalue (lua_State* L, int lo, int index, int def)
{
int v;
lua_pushnumber(L,index);
lua_gettable(L,lo);
v = lua_isnil(L,-1) ? def : lo;
lua_pop(L,1);
return v;
}
TOLUA_API int tolua_getfieldboolean (lua_State* L, int lo, int index, int def)
{
int v;
lua_pushnumber(L,index);
lua_gettable(L,lo);
v = lua_isnil(L,-1) ? 0 : lua_toboolean(L,-1);
lua_pop(L,1);
return v;
}
|