summaryrefslogtreecommitdiffstats
path: root/lem/io/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'lem/io/file.c')
-rw-r--r--lem/io/file.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/lem/io/file.c b/lem/io/file.c
index 5bdce06..e3289a1 100644
--- a/lem/io/file.c
+++ b/lem/io/file.c
@@ -220,6 +220,7 @@ file_write_reap(struct lem_async *a)
{
struct file *f = (struct file *)a;
lua_State *T = f->a.T;
+ int top;
if (f->ret) {
f->a.T = NULL;
@@ -227,14 +228,18 @@ file_write_reap(struct lem_async *a)
return;
}
- if (f->write.idx == lua_gettop(T)) {
- f->a.T = NULL;
- lua_pushboolean(T, 1);
- lem_queue(T, 1);
- return;
- }
+ top = lua_gettop(T);
+ do {
+ if (f->write.idx == top) {
+ f->a.T = NULL;
+ lua_pushboolean(T, 1);
+ lem_queue(T, 1);
+ return;
+ }
+
+ f->write.str = lua_tolstring(T, ++f->write.idx, &f->write.len);
+ } while (f->write.len == 0);
- f->write.str = lua_tolstring(T, ++f->write.idx, &f->write.len);
lem_async_put(&f->a);
}
@@ -244,13 +249,17 @@ file_write(lua_State *T)
struct file *f;
const char *str;
size_t len;
+ int idx;
int i;
int top;
luaL_checktype(T, 1, LUA_TUSERDATA);
- str = luaL_checklstring(T, 2, &len);
top = lua_gettop(T);
- for (i = 3; i <= top; i++)
+ idx = 1;
+ do {
+ str = luaL_checklstring(T, ++idx, &len);
+ } while (len == 0 && idx <= top);
+ for (i = idx+1; i <= top; i++)
(void)luaL_checkstring(T, i);
f = lua_touserdata(T, 1);
@@ -258,10 +267,14 @@ file_write(lua_State *T)
return io_closed(T);
if (f->a.T != NULL)
return io_busy(T);
+ if (idx > top) {
+ lua_pushboolean(T, 1);
+ return 1;
+ }
f->write.str = str;
f->write.len = len;
- f->write.idx = 2;
+ f->write.idx = idx;
lem_async_do(&f->a, T, file_write_work, file_write_reap);
return lua_yield(T, top);