Tizen 2.1 base
[external/tolua++.git] / tolua_to.c
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 lua_Number tolua_tonumber (lua_State* L, int narg, lua_Number 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 lua_Number tolua_tofieldnumber (lua_State* L, int lo, int index, lua_Number 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 }