From ce50c47c2b3679ea70e617e9ac90c5da71a91330 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Fri, 13 Nov 2015 11:04:02 +0800 Subject: [PATCH] socket.send support strings table --- lualib-src/lua-socket.c | 55 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/lualib-src/lua-socket.c b/lualib-src/lua-socket.c index 9d12ab52..8f08ead0 100644 --- a/lualib-src/lua-socket.c +++ b/lualib-src/lua-socket.c @@ -484,18 +484,65 @@ llisten(lua_State *L) { return 1; } +static size_t +count_size(lua_State *L, int index) { + size_t tlen = 0; + int i; + for (i=1;lua_geti(L, index, i) != LUA_TNIL; ++i) { + size_t len; + luaL_checklstring(L, -1, &len); + tlen += len; + lua_pop(L,1); + } + lua_pop(L,1); + return tlen; +} + +static void +concat_table(lua_State *L, int index, void *buffer, size_t tlen) { + char *ptr = buffer; + int i; + for (i=1;lua_geti(L, index, i) != LUA_TNIL; ++i) { + size_t len; + const char * str = lua_tolstring(L, -1, &len); + if (str == NULL || tlen < len) { + break; + } + memcpy(ptr, str, len); + ptr += len; + tlen -= len; + lua_pop(L,1); + } + if (tlen != 0) { + skynet_free(buffer); + luaL_error(L, "Invalid strings table"); + } + lua_pop(L,1); +} + static void * get_buffer(lua_State *L, int index, int *sz) { void *buffer; - if (lua_isuserdata(L,index)) { + switch(lua_type(L, index)) { + const char * str; + size_t len; + case LUA_TUSERDATA: buffer = lua_touserdata(L,index); *sz = luaL_checkinteger(L,index+1); - } else { - size_t len = 0; - const char * str = luaL_checklstring(L, index, &len); + break; + case LUA_TTABLE: + // concat the table as a string + len = count_size(L, index); + buffer = skynet_malloc(len); + concat_table(L, index, buffer, len); + *sz = (int)len; + break; + default: + str = luaL_checklstring(L, index, &len); buffer = skynet_malloc(len); memcpy(buffer, str, len); *sz = (int)len; + break; } return buffer; }