Skip to content

Commit

Permalink
Added luasocket. Might require some tweaks for macOS, mobile and emsc…
Browse files Browse the repository at this point in the history
…ripten as I only tested it on Windows so far
  • Loading branch information
tanis2000 committed May 1, 2024
1 parent 5238459 commit bb67521
Show file tree
Hide file tree
Showing 53 changed files with 9,118 additions and 3 deletions.
6 changes: 3 additions & 3 deletions src/binocle/core/binocle_asset.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@


typedef struct binocle_asset {

int dummy;
} binocle_asset;

typedef struct binocle_asset_file {

int dummy;
} binocle_asset_file;

typedef struct binocle_asset_source_file {

int dummy;
} binocle_asset_source_file;

typedef struct binocle_assets {
Expand Down
5 changes: 5 additions & 0 deletions src/binocle/core/binocle_lua.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "binocle_window.h"
#include "binocle_window_wrap.h"
#include "kazmath/lkazmath.h"
#include "luasocket/luasocket.h"
#include <sokol_time.h>
#include <stdlib.h>

Expand Down Expand Up @@ -58,6 +59,10 @@ bool binocle_lua_init(binocle_lua *lua) {
binocle_log_info("Lua stack after kazmath: %d", lua_gettop(lua->L));
lua_pop(lua->L, 11);

luaopen_socket_core(lua->L);
lua_setglobal(lua->L, "socket");
binocle_log_info("Lua stack after socket: %d", lua_gettop(lua->L));

luaopen_sdl(lua->L);
binocle_log_info("Lua stack after sdl: %d", lua_gettop(lua->L));
luaopen_image(lua->L);
Expand Down
6 changes: 6 additions & 0 deletions src/deps/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ if (NOT EMSCRIPTEN)
add_subdirectory(ogg)
else()
add_subdirectory(lua)
add_subdirectory(luasocket)
endif()

if (APPLE AND NOT IOS)
Expand All @@ -35,26 +36,31 @@ if (APPLE AND NOT IOS)
SET(WITH_SHARED_LUA OFF)
SET(WITH_OBJECT_LUA ON)
add_subdirectory(luajit-cmake)
add_subdirectory(luasocket)
else ()
add_subdirectory(lua)
add_subdirectory(luasocket)
endif ()
endif()

if (ANDROID)
add_subdirectory(vorbisidec)
add_subdirectory(lua)
add_subdirectory(luasocket)
#add_subdirectory(luajit)
endif()

if (IOS)
add_subdirectory(lua)
add_subdirectory(luasocket)
endif()

if (MSVC)
add_subdirectory(glew)
# we're using lua instead of luajit on macos to be able to test with valgrind
#add_subdirectory(luajit)
add_subdirectory(lua)
add_subdirectory(luasocket)
if (BINOCLE_HTTP)
add_subdirectory(curl)
endif ()
Expand Down
59 changes: 59 additions & 0 deletions src/deps/luasocket/CMakeLists.txt
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)
154 changes: 154 additions & 0 deletions src/deps/luasocket/auxiliar.c
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);
}
54 changes: 54 additions & 0 deletions src/deps/luasocket/auxiliar.h
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 */
Loading

0 comments on commit bb67521

Please sign in to comment.