diff options
| author | Diego Nehab <diego@tecgraf.puc-rio.br> | 2004-07-15 06:11:53 +0000 |
|---|---|---|
| committer | Diego Nehab <diego@tecgraf.puc-rio.br> | 2004-07-15 06:11:53 +0000 |
| commit | 9a79d500eb3e015f5bf579aab714916d49c1f289 (patch) | |
| tree | db658e87a17e5417ec01ab4a1b0249bdaf2bd1d2 /src/buffer.c | |
| parent | 471334c3d07f398e4b0859c43276341a28b91504 (diff) | |
| download | luasocket-9a79d500eb3e015f5bf579aab714916d49c1f289.tar.gz luasocket-9a79d500eb3e015f5bf579aab714916d49c1f289.tar.bz2 luasocket-9a79d500eb3e015f5bf579aab714916d49c1f289.zip | |
Still need to fix windows. :o/
Diffstat (limited to '')
| -rw-r--r-- | src/buffer.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/buffer.c b/src/buffer.c index baa248a..33fae84 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -77,7 +77,7 @@ int buf_meth_send(lua_State *L, p_buf buf) { | |||
| 77 | /* check if there was an error */ | 77 | /* check if there was an error */ |
| 78 | if (err != IO_DONE) { | 78 | if (err != IO_DONE) { |
| 79 | lua_pushnil(L); | 79 | lua_pushnil(L); |
| 80 | io_pusherror(L, buf->io, err); | 80 | lua_pushstring(L, buf->io->error(buf->io->ctx, err)); |
| 81 | lua_pushnumber(L, total); | 81 | lua_pushnumber(L, total); |
| 82 | } else { | 82 | } else { |
| 83 | lua_pushnumber(L, total); | 83 | lua_pushnumber(L, total); |
| @@ -98,22 +98,26 @@ int buf_meth_receive(lua_State *L, p_buf buf) { | |||
| 98 | int err = IO_DONE, top = lua_gettop(L); | 98 | int err = IO_DONE, top = lua_gettop(L); |
| 99 | p_tm tm = tm_markstart(buf->tm); | 99 | p_tm tm = tm_markstart(buf->tm); |
| 100 | luaL_Buffer b; | 100 | luaL_Buffer b; |
| 101 | size_t size; | ||
| 102 | const char *part = luaL_optlstring(L, 3, "", &size); | ||
| 103 | /* initialize buffer with optional extra prefix | ||
| 104 | * (useful for concatenating previous partial results) */ | ||
| 101 | luaL_buffinit(L, &b); | 105 | luaL_buffinit(L, &b); |
| 102 | /* receive all patterns */ | 106 | luaL_addlstring(&b, part, size); |
| 107 | /* receive new patterns */ | ||
| 103 | if (!lua_isnumber(L, 2)) { | 108 | if (!lua_isnumber(L, 2)) { |
| 104 | static const char *patternnames[] = {"*l", "*a", NULL}; | 109 | const char *p= luaL_optstring(L, 2, "*l"); |
| 105 | const char *pattern = luaL_optstring(L, 2, "*l"); | 110 | if (p[0] == '*' && p[1] == 'l') err = recvline(buf, &b); |
| 106 | /* get next pattern */ | 111 | else if (p[0] == '*' && p[1] == 'a') err = recvall(buf, &b); |
| 107 | int p = luaL_findstring(pattern, patternnames); | ||
| 108 | if (p == 0) err = recvline(buf, &b); | ||
| 109 | else if (p == 1) err = recvall(buf, &b); | ||
| 110 | else luaL_argcheck(L, 0, 2, "invalid receive pattern"); | 112 | else luaL_argcheck(L, 0, 2, "invalid receive pattern"); |
| 111 | /* get a fixed number of bytes */ | 113 | /* get a fixed number of bytes */ |
| 112 | } else err = recvraw(buf, (size_t) lua_tonumber(L, 2), &b); | 114 | } else err = recvraw(buf, (size_t) lua_tonumber(L, 2), &b); |
| 113 | /* check if there was an error */ | 115 | /* check if there was an error */ |
| 114 | if (err != IO_DONE) { | 116 | if (err != IO_DONE) { |
| 117 | /* we can't push anyting in the stack before pushing the | ||
| 118 | * contents of the buffer. this is the reason for the complication */ | ||
| 115 | luaL_pushresult(&b); | 119 | luaL_pushresult(&b); |
| 116 | io_pusherror(L, buf->io, err); | 120 | lua_pushstring(L, buf->io->error(buf->io->ctx, err)); |
| 117 | lua_pushvalue(L, -2); | 121 | lua_pushvalue(L, -2); |
| 118 | lua_pushnil(L); | 122 | lua_pushnil(L); |
| 119 | lua_replace(L, -4); | 123 | lua_replace(L, -4); |
