new API functions pop', insert', and `move'

This commit is contained in:
Roberto Ierusalimschy
2000-08-31 17:23:40 -03:00
parent fb5e6d5ac4
commit f0b3cd1d6f
8 changed files with 62 additions and 35 deletions

View File

@@ -1,5 +1,5 @@
/*
** $Id: liolib.c,v 1.74 2000/08/29 20:43:28 roberto Exp roberto $
** $Id: liolib.c,v 1.75 2000/08/31 13:30:10 roberto Exp roberto $
** Standard I/O (and system) library
** See Copyright Notice in lua.h
*/
@@ -150,14 +150,14 @@ static int closefile (lua_State *L, IOCtrl *ctrl, FILE *f) {
static int io_close (lua_State *L) {
IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1);
lua_settop(L, -1); /* remove upvalue */
lua_pop(L, 1); /* remove upvalue */
return pushresult(L, closefile(L, ctrl, getnonullfile(L, ctrl, 1)));
}
static int file_collect (lua_State *L) {
IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1);
lua_settop(L, -1); /* remove upvalue */
lua_pop(L, 1); /* remove upvalue */
if (ctrl == (IOCtrl *)lua_touserdata(L, 1)) {
/* collecting `ctrl' itself */
lua_unref(L, ctrl->ref[INFILE]);
@@ -176,7 +176,7 @@ static int file_collect (lua_State *L) {
static int io_open (lua_State *L) {
IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1);
FILE *f;
lua_settop(L, -1); /* remove upvalue */
lua_pop(L, 1); /* remove upvalue */
f = fopen(luaL_check_string(L, 1), luaL_check_string(L, 2));
if (f) {
lua_pushusertag(L, f, ctrl->iotag);
@@ -191,7 +191,7 @@ static int io_open (lua_State *L) {
static int io_fromto (lua_State *L, int inout, const char *mode) {
IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1);
FILE *current;
lua_settop(L, -1); /* remove upvalue */
lua_pop(L, 1); /* remove upvalue */
if (lua_isnull(L, 1)) {
closefile(L, ctrl, getfilebyref(L, ctrl, inout));
current = (inout == 0) ? stdin : stdout;
@@ -219,7 +219,7 @@ static int io_writeto (lua_State *L) {
static int io_appendto (lua_State *L) {
IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1);
FILE *current;
lua_settop(L, -1); /* remove upvalue */
lua_pop(L, 1); /* remove upvalue */
current = fopen(luaL_check_string(L, 1), "a");
return setreturn(L, ctrl, current, OUTFILE);
}
@@ -366,7 +366,7 @@ static int io_read (lua_State *L) {
int n;
if (f) firstarg++;
else f = getfilebyref(L, ctrl, INFILE); /* get _INPUT */
lua_settop(L, -1);
lua_pop(L, 1);
if (firstarg > lastarg) { /* no arguments? */
lua_settop(L, 0); /* erase upvalue and other eventual garbage */
firstarg = lastarg = 1; /* correct indices */
@@ -447,7 +447,7 @@ static int io_seek (lua_State *L) {
FILE *f;
int op;
long offset;
lua_settop(L, -1); /* remove upvalue */
lua_pop(L, 1); /* remove upvalue */
f = getnonullfile(L, ctrl, 1);
op = luaL_findstring(luaL_opt_string(L, 2, "cur"), modenames);
offset = luaL_opt_long(L, 3, 0);
@@ -465,7 +465,7 @@ static int io_seek (lua_State *L) {
static int io_flush (lua_State *L) {
IOCtrl *ctrl = (IOCtrl *)lua_touserdata(L, -1);
FILE *f;
lua_settop(L, -1); /* remove upvalue */
lua_pop(L, 1); /* remove upvalue */
f = gethandle(L, ctrl, 1);
luaL_arg_check(L, f || lua_isnull(L, 1), 1, "invalid file handle");
return pushresult(L, fflush(f) == 0);