Compare commits

...

4 Commits

Author SHA1 Message Date
mbartlett21
9b85654e4f
Merge b0470f4a0eab396ef116c77dcae0cb75ebe17fce into 23241717bf91c4317065828bedafd05ebb97c1ef 2024-03-10 04:19:01 -06:00
Thijs Schreijer
23241717bf
fix(docs): link to included LTN documents (#426) 2024-03-05 23:18:24 +03:00
mbartlett21
b0470f4a0e
Receive line with ending 2020-01-17 12:17:32 +10:00
mbartlett21
c27c23074c
TCP Receive without *
The TCP Receive code now uses a switch statement and allows dropping the * at the start of the string, like Lua's io library
2020-01-17 12:08:54 +10:00
3 changed files with 29 additions and 7 deletions

View File

@ -40,7 +40,7 @@ Pump, Support, Library">
<h2 id="ltn12">LTN12</h2>
<p> The <tt>ltn12</tt> namespace implements the ideas described in
<a href="http://lua-users.org/wiki/FiltersSourcesAndSinks">
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn012.md">
LTN012, Filters sources and sinks</a>. This manual simply describes the
functions. Please refer to the LTN for a deeper explanation of the
functionality provided by this module.

View File

@ -164,6 +164,9 @@ Creates and returns a <em>clean</em>
<a href="#try"><tt>try</tt></a>
function that allows for cleanup before the exception
is raised.
This implements the ideas described in
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn013.md">
LTN012, Using finalized exceptions</a>.
</p>
<p class="parameters">
@ -207,6 +210,9 @@ Converts a function that throws exceptions into a safe function. This
function only catches exceptions thrown by the <a href="#try"><tt>try</tt></a>
and <a href="#newtry"><tt>newtry</tt></a> functions. It does not catch normal
Lua errors.
This implements the ideas described in
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn013.md">
LTN012, Using finalized exceptions</a>.
</p>
<p class="parameters">
@ -425,6 +431,9 @@ socket.<b>try(</b>ret<sub>1</sub> [, ret<sub>2</sub> ... ret<sub>N</sub>]<b>)</b
Throws an exception in case <tt>ret<sub>1</sub></tt> is falsy, using
<tt>ret<sub>2</sub></tt> as the error message. The exception is supposed to be caught
by a <a href="#protect"><tt>protect</tt></a>ed function only.
This implements the ideas described in
<a href="https://github.com/lunarmodules/luasocket/blob/master/ltn013.md">
LTN012, Using finalized exceptions</a>.
</p>
<p class="parameters">

View File

@ -9,7 +9,7 @@
* Internal function prototypes
\*=========================================================================*/
static int recvraw(p_buffer buf, size_t wanted, luaL_Buffer *b);
static int recvline(p_buffer buf, luaL_Buffer *b);
static int recvline(p_buffer buf, luaL_Buffer *b, int chop);
static int recvall(p_buffer buf, luaL_Buffer *b);
static int buffer_get(p_buffer buf, const char **data, size_t *count);
static void buffer_skip(p_buffer buf, size_t count);
@ -117,10 +117,21 @@ int buffer_meth_receive(lua_State *L, p_buffer buf) {
luaL_addlstring(&b, part, size);
/* receive new patterns */
if (!lua_isnumber(L, 2)) {
const char *p= luaL_optstring(L, 2, "*l");
if (p[0] == '*' && p[1] == 'l') err = recvline(buf, &b);
else if (p[0] == '*' && p[1] == 'a') err = recvall(buf, &b);
else luaL_argcheck(L, 0, 2, "invalid receive pattern");
const char *p = luaL_optstring(L, 2, "l");
if (*p == '*') p++; /* skip optional '*' (for compatibility) */
switch (*p) {
case 'l': /* line */
err = recvline(buf, &b, 1);
break;
case 'L': /* line with \n */
err = recvline(buf, &b, 0);
break;
case 'a': /* all */
err = recvall(buf, &b);
break;
default:
luaL_argcheck(L, 0, 2, "invalid receive pattern");
}
/* get a fixed number of bytes (minus what was already partially
* received) */
} else {
@ -222,7 +233,7 @@ static int recvall(p_buffer buf, luaL_Buffer *b) {
* Reads a line terminated by a CR LF pair or just by a LF. The CR and LF
* are not returned by the function and are discarded from the buffer
\*-------------------------------------------------------------------------*/
static int recvline(p_buffer buf, luaL_Buffer *b) {
static int recvline(p_buffer buf, luaL_Buffer *b, int chop) {
int err = IO_DONE;
while (err == IO_DONE) {
size_t count, pos; const char *data;
@ -234,6 +245,8 @@ static int recvline(p_buffer buf, luaL_Buffer *b) {
pos++;
}
if (pos < count) { /* found '\n' */
if (!chop)
luaL_addchar(b, '\n');
buffer_skip(buf, pos+1); /* skip '\n' too */
break; /* we are done */
} else /* reached the end of the buffer */