-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added luasocket. Might require some tweaks for macOS, mobile and emsc…
…ripten as I only tested it on Windows so far
- Loading branch information
Showing
53 changed files
with
9,118 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
project(luasocket) | ||
|
||
include_directories(.) | ||
|
||
file(GLOB SOURCES | ||
auxiliar.c | ||
buffer.c | ||
compat.c | ||
except.c | ||
inet.c | ||
io.c | ||
luasocket.c | ||
mime.c | ||
options.c | ||
select.c | ||
|
||
tcp.c | ||
timeout.c | ||
udp.c | ||
|
||
|
||
) | ||
set(SOURCES | ||
${SOURCES} | ||
) | ||
|
||
file(GLOB HEADERS *.h) | ||
|
||
if(APPLE) | ||
file(GLOB_RECURSE MACOS_SOURCES | ||
serial.c | ||
unix.c | ||
unixdgram.c | ||
unixstream.c | ||
usocket.c | ||
|
||
) | ||
list(APPEND SOURCES ${MACOS_SOURCES}) | ||
|
||
endif() | ||
|
||
if(MSVC) | ||
file(GLOB_RECURSE WIN32_SOURCES | ||
wsocket.c | ||
) | ||
list(APPEND SOURCES ${WIN32_SOURCES}) | ||
|
||
endif() | ||
|
||
|
||
add_library(luasocket OBJECT ${SOURCES}) | ||
|
||
if (IOS) | ||
set_target_properties( | ||
luasocket | ||
PROPERTIES | ||
XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 9.0 | ||
) | ||
endif(IOS) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
/*=========================================================================*\ | ||
* Auxiliar routines for class hierarchy manipulation | ||
* LuaSocket toolkit | ||
\*=========================================================================*/ | ||
#include "luasocket.h" | ||
#include "auxiliar.h" | ||
#include <string.h> | ||
#include <stdio.h> | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Initializes the module | ||
\*-------------------------------------------------------------------------*/ | ||
int auxiliar_open(lua_State *L) { | ||
(void) L; | ||
return 0; | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Creates a new class with given methods | ||
* Methods whose names start with __ are passed directly to the metatable. | ||
\*-------------------------------------------------------------------------*/ | ||
void auxiliar_newclass(lua_State *L, const char *classname, luaL_Reg *func) { | ||
luaL_newmetatable(L, classname); /* mt */ | ||
/* create __index table to place methods */ | ||
lua_pushstring(L, "__index"); /* mt,"__index" */ | ||
lua_newtable(L); /* mt,"__index",it */ | ||
/* put class name into class metatable */ | ||
lua_pushstring(L, "class"); /* mt,"__index",it,"class" */ | ||
lua_pushstring(L, classname); /* mt,"__index",it,"class",classname */ | ||
lua_rawset(L, -3); /* mt,"__index",it */ | ||
/* pass all methods that start with _ to the metatable, and all others | ||
* to the index table */ | ||
for (; func->name; func++) { /* mt,"__index",it */ | ||
lua_pushstring(L, func->name); | ||
lua_pushcfunction(L, func->func); | ||
lua_rawset(L, func->name[0] == '_' ? -5: -3); | ||
} | ||
lua_rawset(L, -3); /* mt */ | ||
lua_pop(L, 1); | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Prints the value of a class in a nice way | ||
\*-------------------------------------------------------------------------*/ | ||
int auxiliar_tostring(lua_State *L) { | ||
char buf[32]; | ||
if (!lua_getmetatable(L, 1)) goto error; | ||
lua_pushstring(L, "__index"); | ||
lua_gettable(L, -2); | ||
if (!lua_istable(L, -1)) goto error; | ||
lua_pushstring(L, "class"); | ||
lua_gettable(L, -2); | ||
if (!lua_isstring(L, -1)) goto error; | ||
sprintf(buf, "%p", lua_touserdata(L, 1)); | ||
lua_pushfstring(L, "%s: %s", lua_tostring(L, -1), buf); | ||
return 1; | ||
error: | ||
lua_pushstring(L, "invalid object passed to 'auxiliar.c:__tostring'"); | ||
lua_error(L); | ||
return 1; | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Insert class into group | ||
\*-------------------------------------------------------------------------*/ | ||
void auxiliar_add2group(lua_State *L, const char *classname, const char *groupname) { | ||
luaL_getmetatable(L, classname); | ||
lua_pushstring(L, groupname); | ||
lua_pushboolean(L, 1); | ||
lua_rawset(L, -3); | ||
lua_pop(L, 1); | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Make sure argument is a boolean | ||
\*-------------------------------------------------------------------------*/ | ||
int auxiliar_checkboolean(lua_State *L, int objidx) { | ||
if (!lua_isboolean(L, objidx)) | ||
auxiliar_typeerror(L, objidx, lua_typename(L, LUA_TBOOLEAN)); | ||
return lua_toboolean(L, objidx); | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Return userdata pointer if object belongs to a given class, abort with | ||
* error otherwise | ||
\*-------------------------------------------------------------------------*/ | ||
void *auxiliar_checkclass(lua_State *L, const char *classname, int objidx) { | ||
void *data = auxiliar_getclassudata(L, classname, objidx); | ||
if (!data) { | ||
char msg[45]; | ||
sprintf(msg, "%.35s expected", classname); | ||
luaL_argerror(L, objidx, msg); | ||
} | ||
return data; | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Return userdata pointer if object belongs to a given group, abort with | ||
* error otherwise | ||
\*-------------------------------------------------------------------------*/ | ||
void *auxiliar_checkgroup(lua_State *L, const char *groupname, int objidx) { | ||
void *data = auxiliar_getgroupudata(L, groupname, objidx); | ||
if (!data) { | ||
char msg[45]; | ||
sprintf(msg, "%.35s expected", groupname); | ||
luaL_argerror(L, objidx, msg); | ||
} | ||
return data; | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Set object class | ||
\*-------------------------------------------------------------------------*/ | ||
void auxiliar_setclass(lua_State *L, const char *classname, int objidx) { | ||
luaL_getmetatable(L, classname); | ||
if (objidx < 0) objidx--; | ||
lua_setmetatable(L, objidx); | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Get a userdata pointer if object belongs to a given group. Return NULL | ||
* otherwise | ||
\*-------------------------------------------------------------------------*/ | ||
void *auxiliar_getgroupudata(lua_State *L, const char *groupname, int objidx) { | ||
if (!lua_getmetatable(L, objidx)) | ||
return NULL; | ||
lua_pushstring(L, groupname); | ||
lua_rawget(L, -2); | ||
if (lua_isnil(L, -1)) { | ||
lua_pop(L, 2); | ||
return NULL; | ||
} else { | ||
lua_pop(L, 2); | ||
return lua_touserdata(L, objidx); | ||
} | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Get a userdata pointer if object belongs to a given class. Return NULL | ||
* otherwise | ||
\*-------------------------------------------------------------------------*/ | ||
void *auxiliar_getclassudata(lua_State *L, const char *classname, int objidx) { | ||
return luaL_testudata(L, objidx, classname); | ||
} | ||
|
||
/*-------------------------------------------------------------------------*\ | ||
* Throws error when argument does not have correct type. | ||
* Used to be part of lauxlib in Lua 5.1, was dropped from 5.2. | ||
\*-------------------------------------------------------------------------*/ | ||
int auxiliar_typeerror (lua_State *L, int narg, const char *tname) { | ||
const char *msg = lua_pushfstring(L, "%s expected, got %s", tname, | ||
luaL_typename(L, narg)); | ||
return luaL_argerror(L, narg, msg); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
#ifndef AUXILIAR_H | ||
#define AUXILIAR_H | ||
/*=========================================================================*\ | ||
* Auxiliar routines for class hierarchy manipulation | ||
* LuaSocket toolkit (but completely independent of other LuaSocket modules) | ||
* | ||
* A LuaSocket class is a name associated with Lua metatables. A LuaSocket | ||
* group is a name associated with a class. A class can belong to any number | ||
* of groups. This module provides the functionality to: | ||
* | ||
* - create new classes | ||
* - add classes to groups | ||
* - set the class of objects | ||
* - check if an object belongs to a given class or group | ||
* - get the userdata associated to objects | ||
* - print objects in a pretty way | ||
* | ||
* LuaSocket class names follow the convention <module>{<class>}. Modules | ||
* can define any number of classes and groups. The module tcp.c, for | ||
* example, defines the classes tcp{master}, tcp{client} and tcp{server} and | ||
* the groups tcp{client,server} and tcp{any}. Module functions can then | ||
* perform type-checking on their arguments by either class or group. | ||
* | ||
* LuaSocket metatables define the __index metamethod as being a table. This | ||
* table has one field for each method supported by the class, and a field | ||
* "class" with the class name. | ||
* | ||
* The mapping from class name to the corresponding metatable and the | ||
* reverse mapping are done using lauxlib. | ||
\*=========================================================================*/ | ||
|
||
#include "luasocket.h" | ||
|
||
#ifndef _WIN32 | ||
#pragma GCC visibility push(hidden) | ||
#endif | ||
|
||
int auxiliar_open(lua_State *L); | ||
void auxiliar_newclass(lua_State *L, const char *classname, luaL_Reg *func); | ||
int auxiliar_tostring(lua_State *L); | ||
void auxiliar_add2group(lua_State *L, const char *classname, const char *group); | ||
int auxiliar_checkboolean(lua_State *L, int objidx); | ||
void *auxiliar_checkclass(lua_State *L, const char *classname, int objidx); | ||
void *auxiliar_checkgroup(lua_State *L, const char *groupname, int objidx); | ||
void auxiliar_setclass(lua_State *L, const char *classname, int objidx); | ||
void *auxiliar_getgroupudata(lua_State *L, const char *groupname, int objidx); | ||
void *auxiliar_getclassudata(lua_State *L, const char *groupname, int objidx); | ||
int auxiliar_typeerror(lua_State *L, int narg, const char *tname); | ||
|
||
#ifndef _WIN32 | ||
#pragma GCC visibility pop | ||
#endif | ||
|
||
#endif /* AUXILIAR_H */ |
Oops, something went wrong.