aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-10-12 14:11:41 +0200
committerMike Pall <mike>2012-10-12 14:11:41 +0200
commitfff12979fec8a8483d17e6a8ae05cd2e881f4b99 (patch)
tree362f26b6a31a36183f4216bba324740dffce9479 /src
parentfd292c9f26ab3cd63cb4bdf9b305584c6e057a41 (diff)
downloadluajit-fff12979fec8a8483d17e6a8ae05cd2e881f4b99.tar.gz
luajit-fff12979fec8a8483d17e6a8ae05cd2e881f4b99.tar.bz2
luajit-fff12979fec8a8483d17e6a8ae05cd2e881f4b99.zip
From Lua 5.2: Add format options to io.lines().
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.dep4
-rw-r--r--src/lib_io.c59
2 files changed, 37 insertions, 26 deletions
diff --git a/src/Makefile.dep b/src/Makefile.dep
index 9571e16d..6433bea7 100644
--- a/src/Makefile.dep
+++ b/src/Makefile.dep
@@ -17,8 +17,8 @@ lib_ffi.o: lib_ffi.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \
17 lj_ccallback.h lj_clib.h lj_ff.h lj_ffdef.h lj_lib.h lj_libdef.h 17 lj_ccallback.h lj_clib.h lj_ff.h lj_ffdef.h lj_lib.h lj_libdef.h
18lib_init.o: lib_init.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h 18lib_init.o: lib_init.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h
19lib_io.o: lib_io.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \ 19lib_io.o: lib_io.c lua.h luaconf.h lauxlib.h lualib.h lj_obj.h lj_def.h \
20 lj_arch.h lj_err.h lj_errmsg.h lj_str.h lj_ff.h lj_ffdef.h lj_lib.h \ 20 lj_arch.h lj_err.h lj_errmsg.h lj_str.h lj_state.h lj_ff.h lj_ffdef.h \
21 lj_libdef.h 21 lj_lib.h lj_libdef.h
22lib_jit.o: lib_jit.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h \ 22lib_jit.o: lib_jit.c lua.h luaconf.h lauxlib.h lualib.h lj_arch.h \
23 lj_obj.h lj_def.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h \ 23 lj_obj.h lj_def.h lj_err.h lj_errmsg.h lj_debug.h lj_str.h lj_tab.h \
24 lj_bc.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_target.h \ 24 lj_bc.h lj_ir.h lj_jit.h lj_ircall.h lj_iropt.h lj_target.h \
diff --git a/src/lib_io.c b/src/lib_io.c
index e0762297..8911958f 100644
--- a/src/lib_io.c
+++ b/src/lib_io.c
@@ -19,6 +19,7 @@
19#include "lj_obj.h" 19#include "lj_obj.h"
20#include "lj_err.h" 20#include "lj_err.h"
21#include "lj_str.h" 21#include "lj_str.h"
22#include "lj_state.h"
22#include "lj_ff.h" 23#include "lj_ff.h"
23#include "lj_lib.h" 24#include "lj_lib.h"
24 25
@@ -253,6 +254,31 @@ static int io_file_write(lua_State *L, FILE *fp, int start)
253 return luaL_fileresult(L, status, NULL); 254 return luaL_fileresult(L, status, NULL);
254} 255}
255 256
257static int io_file_iter(lua_State *L)
258{
259 GCfunc *fn = curr_func(L);
260 IOFileUD *iof = uddata(udataV(&fn->c.upvalue[0]));
261 int n = fn->c.nupvalues - 1;
262 if (iof->fp == NULL)
263 lj_err_caller(L, LJ_ERR_IOCLFL);
264 L->top = L->base;
265 if (n) { /* Copy upvalues with options to stack. */
266 if (n > LUAI_MAXCSTACK)
267 lj_err_caller(L, LJ_ERR_STKOV);
268 lj_state_checkstack(L, (MSize)n);
269 memcpy(L->top, &fn->c.upvalue[1], n*sizeof(TValue));
270 L->top += n;
271 }
272 n = io_file_read(L, iof->fp, 0);
273 if (ferror(iof->fp))
274 lj_err_callermsg(L, strVdata(L->top-2));
275 if (tvisnil(L->base) && (iof->type & IOFILE_FLAG_CLOSE)) {
276 io_file_close(L, iof); /* Return values are ignored. */
277 return 0;
278 }
279 return n;
280}
281
256/* -- I/O file methods ---------------------------------------------------- */ 282/* -- I/O file methods ---------------------------------------------------- */
257 283
258#define LJLIB_MODULE_io_method 284#define LJLIB_MODULE_io_method
@@ -333,14 +359,11 @@ LJLIB_CF(io_method_setvbuf)
333 return luaL_fileresult(L, setvbuf(fp, NULL, opt, sz) == 0, NULL); 359 return luaL_fileresult(L, setvbuf(fp, NULL, opt, sz) == 0, NULL);
334} 360}
335 361
336LJLIB_PUSH(top-2) /* io_lines_iter */
337LJLIB_CF(io_method_lines) 362LJLIB_CF(io_method_lines)
338{ 363{
339 io_tofile(L); 364 io_tofile(L);
340 setfuncV(L, L->top, funcV(lj_lib_upvalue(L, 1))); 365 lua_pushcclosure(L, io_file_iter, (int)(L->top - L->base));
341 setudataV(L, L->top+1, udataV(L->base)); 366 return 1;
342 L->top += 2;
343 return 2;
344} 367}
345 368
346LJLIB_CF(io_method___gc) 369LJLIB_CF(io_method___gc)
@@ -459,30 +482,19 @@ LJLIB_CF(io_output)
459 return io_std_getset(L, GCROOT_IO_OUTPUT, "w"); 482 return io_std_getset(L, GCROOT_IO_OUTPUT, "w");
460} 483}
461 484
462LJLIB_NOREG LJLIB_CF(io_lines_iter)
463{
464 IOFileUD *iof = io_tofile(L);
465 int ok = io_file_readline(L, iof->fp, 1);
466 if (ferror(iof->fp))
467 lj_err_callermsg(L, strerror(errno));
468 if (!ok && (iof->type & IOFILE_FLAG_CLOSE))
469 io_file_close(L, iof); /* Return values are ignored (ok is 0). */
470 return ok;
471}
472
473LJLIB_PUSH(top-3) /* io_lines_iter */
474LJLIB_CF(io_lines) 485LJLIB_CF(io_lines)
475{ 486{
476 if (L->base < L->top && !tvisnil(L->base)) { /* io.lines(fname) */ 487 if (L->base == L->top) setnilV(L->top++);
488 if (!tvisnil(L->base)) { /* io.lines(fname) */
477 IOFileUD *iof = io_file_open(L, "r"); 489 IOFileUD *iof = io_file_open(L, "r");
478 iof->type = IOFILE_TYPE_FILE|IOFILE_FLAG_CLOSE; 490 iof->type = IOFILE_TYPE_FILE|IOFILE_FLAG_CLOSE;
479 setfuncV(L, L->top-2, funcV(lj_lib_upvalue(L, 1))); 491 L->top--;
492 setudataV(L, L->base, udataV(L->top));
480 } else { /* io.lines() iterates over stdin. */ 493 } else { /* io.lines() iterates over stdin. */
481 setfuncV(L, L->top, funcV(lj_lib_upvalue(L, 1))); 494 setudataV(L, L->base, IOSTDF_UD(L, GCROOT_IO_INPUT));
482 setudataV(L, L->top+1, IOSTDF_UD(L, GCROOT_IO_INPUT));
483 L->top += 2;
484 } 495 }
485 return 2; 496 lua_pushcclosure(L, io_file_iter, (int)(L->top - L->base));
497 return 1;
486} 498}
487 499
488LJLIB_CF(io_type) 500LJLIB_CF(io_type)
@@ -516,7 +528,6 @@ static GCobj *io_std_new(lua_State *L, FILE *fp, const char *name)
516 528
517LUALIB_API int luaopen_io(lua_State *L) 529LUALIB_API int luaopen_io(lua_State *L)
518{ 530{
519 lj_lib_pushcf(L, lj_cf_io_lines_iter, FF_io_lines_iter);
520 LJ_LIB_REG(L, NULL, io_method); 531 LJ_LIB_REG(L, NULL, io_method);
521 copyTV(L, L->top, L->top-1); L->top++; 532 copyTV(L, L->top, L->top-1); L->top++;
522 lua_setfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); 533 lua_setfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE);