Mercurial > pub > dyncall > bindings
comparison lua/luadyncall/src/ldynstruct.c @ 0:0cfcc391201f
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:26:28 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:0cfcc391201f |
---|---|
1 #include "lua.h" | |
2 #include "lauxlib.h" | |
3 #include "dyncall.h" | |
4 #include "dyncall_signature.h" | |
5 #include <stddef.h> | |
6 | |
7 static int lua_newstruct(lua_State *L) | |
8 { | |
9 size_t size; | |
10 void *addr; | |
11 size = (size_t) luaL_checkinteger(L, 1); | |
12 addr = lua_newuserdata(L, size); | |
13 return 1; | |
14 } | |
15 | |
16 static int lua_aslightuserdata(lua_State *L) | |
17 { | |
18 lua_pushlightuserdata(L, (void*) (ptrdiff_t) luaL_checkinteger(L, 1) ); | |
19 return 1; | |
20 } | |
21 | |
22 /* | |
23 static int lua_newdynstruct(lua_State *L) | |
24 { | |
25 size_t size; | |
26 void *addr; | |
27 size = (size_t) luaL_checkinteger(L, 1); | |
28 luaL_checktype(L, 2, LUA_TTABLE); | |
29 addr = lua_newuserdata(L, size); | |
30 lua_pushvalue(L, 2); | |
31 lua_setmetatable(L, 3); | |
32 return 1; | |
33 } | |
34 */ | |
35 | |
36 int lua_dynpoke(lua_State *L) | |
37 { | |
38 const char *ptr = (const char *) lua_touserdata(L, 1); | |
39 size_t offset = (ptrdiff_t) lua_tointeger(L, 2); | |
40 const char *typesig = (const char*) lua_tostring(L, 3); | |
41 const char *sig = typesig; | |
42 char ch; | |
43 ptr += offset; | |
44 while ((ch=*sig++) != '\0') { | |
45 switch(ch) { | |
46 case DC_SIGCHAR_BOOL: *((int*)ptr) = lua_toboolean(L, 4); break; | |
47 case DC_SIGCHAR_CHAR: *((char*)ptr) = (char) lua_tointeger(L, 4); break; | |
48 case DC_SIGCHAR_UCHAR: *((unsigned char*)ptr) = (unsigned char) lua_tointeger(L, 4); break; | |
49 case DC_SIGCHAR_SHORT: *((short*)ptr) = (short) lua_tointeger(L, 4); break; | |
50 case DC_SIGCHAR_USHORT: *((unsigned short*)ptr) = (unsigned short) lua_tointeger(L, 4); break; | |
51 case DC_SIGCHAR_INT: *((int*)ptr) = lua_tointeger(L, 4); break; | |
52 case DC_SIGCHAR_UINT: *((unsigned int*)ptr) = (unsigned int) lua_tonumber(L, 4); break; | |
53 case DC_SIGCHAR_LONG: *((long*)ptr) = (long) lua_tonumber(L, 4); break; | |
54 case DC_SIGCHAR_ULONG: *((unsigned long*)ptr) = (unsigned long) lua_tonumber(L, 4); break; | |
55 case DC_SIGCHAR_LONGLONG: *((DClonglong*)ptr) = (long long) lua_tonumber(L, 4); break; | |
56 case DC_SIGCHAR_ULONGLONG: *((DCulonglong*)ptr) = (unsigned long long) lua_tonumber(L, 4); break; | |
57 case DC_SIGCHAR_FLOAT: *((float*)ptr) = (float) lua_tonumber(L, 4); break; | |
58 case DC_SIGCHAR_DOUBLE: *((double*)ptr) = (double) lua_tonumber(L, 4); break; | |
59 case DC_SIGCHAR_POINTER: *((const void**)ptr) = lua_topointer(L, 4); break; | |
60 case DC_SIGCHAR_STRING: *((const char**)ptr) = lua_topointer(L, 4); break; | |
61 default: luaL_error(L, "invalid type signature %s", typesig); return 0; | |
62 } | |
63 } | |
64 return 0; | |
65 } | |
66 | |
67 int lua_dynpeek(lua_State *L) | |
68 { | |
69 const char *ptr = (const char *) lua_touserdata(L, 1); | |
70 size_t offset = (ptrdiff_t) lua_tointeger(L, 2); | |
71 const char *typesig = (const char*) lua_tostring(L, 3); | |
72 const char* sig = typesig; | |
73 char ch; | |
74 ptr += offset; | |
75 while ((ch = *sig++) != '\0') { | |
76 switch(ch) { | |
77 case DC_SIGCHAR_BOOL: lua_pushboolean(L, *((int*)ptr)); break; | |
78 case DC_SIGCHAR_CHAR: lua_pushinteger(L, (int) *((char*)ptr)); break; | |
79 case DC_SIGCHAR_UCHAR: lua_pushinteger(L, (int) *((unsigned char*)ptr)); break; | |
80 case DC_SIGCHAR_SHORT: lua_pushinteger(L, (int) *((short*)ptr)); break; | |
81 case DC_SIGCHAR_USHORT: lua_pushinteger(L, (int) *((unsigned short*)ptr)); break; | |
82 case DC_SIGCHAR_INT: lua_pushinteger(L, *((int*)ptr)); break; | |
83 case DC_SIGCHAR_UINT: lua_pushnumber(L, (lua_Number) *((unsigned int*)ptr)); break; | |
84 case DC_SIGCHAR_LONG: lua_pushnumber(L, (lua_Number) *((long*)ptr)); break; | |
85 case DC_SIGCHAR_ULONG: lua_pushnumber(L, (lua_Number) *((unsigned long*)ptr)); break; | |
86 case DC_SIGCHAR_LONGLONG: lua_pushnumber(L, (lua_Number) *((DClonglong*)ptr)); break; | |
87 case DC_SIGCHAR_ULONGLONG: lua_pushnumber(L, (lua_Number) *((DCulonglong*)ptr)); break; | |
88 case DC_SIGCHAR_FLOAT: lua_pushnumber(L, (lua_Number) *((float*)ptr)); break; | |
89 case DC_SIGCHAR_DOUBLE: lua_pushnumber(L, (lua_Number) *((double*)ptr)); break; | |
90 case DC_SIGCHAR_POINTER: lua_pushlightuserdata(L, *((void**)ptr) ); break; | |
91 case DC_SIGCHAR_STRING: lua_pushstring(L, (const char*)ptr); break; | |
92 default: luaL_error(L, "invalid type signature %s", typesig); return 0; | |
93 } | |
94 } | |
95 return 1; | |
96 } | |
97 | |
98 static const struct luaL_Reg luareg_dynstruct[] = | |
99 { | |
100 { "newstruct", lua_newstruct }, | |
101 { "aslightuserdata", lua_aslightuserdata }, | |
102 { "dynpoke", lua_dynpoke }, | |
103 { "dynpeek", lua_dynpeek }, | |
104 { NULL, NULL } | |
105 }; | |
106 | |
107 LUA_API int luaopen_ldynstruct(lua_State *L) | |
108 { | |
109 luaL_register(L, "ldynstruct", luareg_dynstruct); | |
110 return 1; | |
111 } |