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