moonbridge

annotate moonbridge_io.c @ 79:22dbb9d09f02

Stub for new non-blocking I/O library
author jbe
date Sun Apr 05 18:01:31 2015 +0200 (2015-04-05)
parents
children 1a0346580e6d
rev   line source
jbe@79 1
jbe@79 2 #include <stdlib.h>
jbe@79 3 #include <unistd.h>
jbe@79 4 #include <stdint.h>
jbe@79 5 #include <errno.h>
jbe@79 6 #include <string.h>
jbe@79 7 #include <stdio.h>
jbe@79 8 #include <time.h>
jbe@79 9 #include <sys/time.h>
jbe@79 10 #include <sys/socket.h>
jbe@79 11 #include <sys/select.h>
jbe@79 12
jbe@79 13 #include <lua.h>
jbe@79 14 #include <lauxlib.h>
jbe@79 15 #include <lualib.h>
jbe@79 16
jbe@79 17 #define MOONBR_IO_HANDLE_MT_REGKEY "moonbridge_io_handle"
jbe@79 18 #define MOONBR_IO_HANDLE_PUBLIC_MT_REGKEY "moonbridge_io_handle_public"
jbe@79 19
jbe@79 20 typedef struct {
jbe@79 21 int fd;
jbe@79 22 } moonbr_io_handle_t;
jbe@79 23
jbe@79 24 void moonbr_io_pushhandle(lua_State *L, int fd) {
jbe@79 25 moonbr_io_handle_t *handle;
jbe@79 26 handle = lua_newuserdata(L, sizeof(moonbr_io_handle_t));
jbe@79 27 handle->fd = fd;
jbe@79 28 luaL_getmetatable(L, MOONBR_IO_HANDLE_MT_REGKEY);
jbe@79 29 lua_setmetatable(L, -2);
jbe@79 30 lua_newtable(L); // uservalue
jbe@79 31 lua_newtable(L); // public
jbe@79 32 luaL_getmetatable(L, MOONBR_IO_HANDLE_PUBLIC_MT_REGKEY);
jbe@79 33 lua_setmetatable(L, -2);
jbe@79 34 lua_setfield(L, -2, "public");
jbe@79 35 lua_setuservalue(L, -2);
jbe@79 36 }
jbe@79 37
jbe@79 38 static int moonbr_io_handleindex(lua_State *L) {
jbe@79 39 lua_getuservalue(L, 1);
jbe@79 40 lua_getfield(L, -1, "public");
jbe@79 41 lua_pushvalue(L, 2);
jbe@79 42 lua_gettable(L, -2);
jbe@79 43 return 1;
jbe@79 44 }
jbe@79 45
jbe@79 46 static int moonbr_io_handlenewindex(lua_State *L) {
jbe@79 47 lua_getuservalue(L, 1);
jbe@79 48 lua_getfield(L, -1, "public");
jbe@79 49 lua_pushvalue(L, 2);
jbe@79 50 lua_pushvalue(L, 3);
jbe@79 51 lua_settable(L, -3);
jbe@79 52 return 0;
jbe@79 53 }
jbe@79 54
jbe@79 55 static int moonbr_io_getdummy(lua_State *L) {
jbe@79 56 moonbr_io_pushhandle(L, 1);
jbe@79 57 return 1;
jbe@79 58 }
jbe@79 59
jbe@79 60 static int moonbr_io_testmethod(lua_State *L) {
jbe@79 61 fprintf(stderr, "DEBUG\n");
jbe@79 62 return 0;
jbe@79 63 }
jbe@79 64
jbe@79 65 static const struct luaL_Reg moonbr_io_handle_methods[] = {
jbe@79 66 {"testmethod", moonbr_io_testmethod},
jbe@79 67 {NULL, NULL}
jbe@79 68 };
jbe@79 69
jbe@79 70 static const struct luaL_Reg moonbr_io_handle_metamethods[] = {
jbe@79 71 {"__index", moonbr_io_handleindex},
jbe@79 72 {"__newindex", moonbr_io_handlenewindex},
jbe@79 73 {NULL, NULL}
jbe@79 74 };
jbe@79 75
jbe@79 76 static const struct luaL_Reg moonbr_io_module_funcs[] = {
jbe@79 77 {"getdummy", moonbr_io_getdummy},
jbe@79 78 {NULL, NULL}
jbe@79 79 };
jbe@79 80
jbe@79 81 int luaopen_moonbridge_io(lua_State *L) {
jbe@79 82
jbe@79 83 lua_newtable(L); // public metatable
jbe@79 84 lua_newtable(L); // handle methods
jbe@79 85 luaL_setfuncs(L, moonbr_io_handle_methods, 0);
jbe@79 86 lua_setfield(L, -2, "__index");
jbe@79 87 lua_setfield(L, LUA_REGISTRYINDEX, MOONBR_IO_HANDLE_PUBLIC_MT_REGKEY);
jbe@79 88
jbe@79 89 lua_newtable(L); // handle metatable
jbe@79 90 luaL_setfuncs(L, moonbr_io_handle_metamethods, 0);
jbe@79 91 lua_setfield(L, LUA_REGISTRYINDEX, MOONBR_IO_HANDLE_MT_REGKEY);
jbe@79 92
jbe@79 93 lua_newtable(L); // module
jbe@79 94 luaL_setfuncs(L, moonbr_io_module_funcs, 0);
jbe@79 95 return 1;
jbe@79 96
jbe@79 97 }
jbe@79 98

Impressum / About Us