diff options
| -rw-r--r-- | lauxlib.c | 60 | ||||
| -rw-r--r-- | lauxlib.h | 5 | ||||
| -rw-r--r-- | liolib.c | 73 | ||||
| -rw-r--r-- | loslib.c | 29 |
4 files changed, 85 insertions, 82 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lauxlib.c,v 1.227 2010/11/10 18:05:36 roberto Exp roberto $ | 2 | ** $Id: lauxlib.c,v 1.228 2011/01/10 15:51:42 roberto Exp roberto $ |
| 3 | ** Auxiliary functions for building Lua libraries | 3 | ** Auxiliary functions for building Lua libraries |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -203,6 +203,64 @@ LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { | |||
| 203 | return lua_error(L); | 203 | return lua_error(L); |
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | |||
| 207 | LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) { | ||
| 208 | int en = errno; /* calls to Lua API may change this value */ | ||
| 209 | if (stat) { | ||
| 210 | lua_pushboolean(L, 1); | ||
| 211 | return 1; | ||
| 212 | } | ||
| 213 | else { | ||
| 214 | lua_pushnil(L); | ||
| 215 | if (fname) | ||
| 216 | lua_pushfstring(L, "%s: %s", fname, strerror(en)); | ||
| 217 | else | ||
| 218 | lua_pushfstring(L, "%s", strerror(en)); | ||
| 219 | lua_pushinteger(L, en); | ||
| 220 | return 3; | ||
| 221 | } | ||
| 222 | } | ||
| 223 | |||
| 224 | |||
| 225 | #if !defined(inspectstat) /* { */ | ||
| 226 | |||
| 227 | #if defined(LUA_USE_POSIX) | ||
| 228 | |||
| 229 | #include <sys/wait.h> | ||
| 230 | |||
| 231 | /* | ||
| 232 | ** use appropriate macros to interpret 'pclose' return status | ||
| 233 | */ | ||
| 234 | #define inspectstat(stat,what) \ | ||
| 235 | if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \ | ||
| 236 | else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; } | ||
| 237 | |||
| 238 | #else | ||
| 239 | |||
| 240 | #define inspectstat(stat,what) /* no op */ | ||
| 241 | |||
| 242 | #endif | ||
| 243 | |||
| 244 | #endif /* } */ | ||
| 245 | |||
| 246 | |||
| 247 | LUALIB_API int luaL_execresult (lua_State *L, int stat) { | ||
| 248 | const char *what = "exit"; /* type of termination */ | ||
| 249 | if (stat == -1) /* error? */ | ||
| 250 | return luaL_fileresult(L, 0, NULL); | ||
| 251 | else { | ||
| 252 | inspectstat(stat, what); /* interpret result */ | ||
| 253 | if (*what == 'e' && stat == 0) /* successful termination? */ | ||
| 254 | return luaL_fileresult(L, 1, NULL); | ||
| 255 | else { /* return nil,what,code */ | ||
| 256 | lua_pushnil(L); | ||
| 257 | lua_pushstring(L, what); | ||
| 258 | lua_pushinteger(L, stat); | ||
| 259 | return 3; | ||
| 260 | } | ||
| 261 | } | ||
| 262 | } | ||
| 263 | |||
| 206 | /* }====================================================== */ | 264 | /* }====================================================== */ |
| 207 | 265 | ||
| 208 | 266 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lauxlib.h,v 1.113 2010/11/16 19:20:01 roberto Exp roberto $ | 2 | ** $Id: lauxlib.h,v 1.114 2011/01/10 15:51:42 roberto Exp roberto $ |
| 3 | ** Auxiliary functions for building Lua libraries | 3 | ** Auxiliary functions for building Lua libraries |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -62,6 +62,9 @@ LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); | |||
| 62 | LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, | 62 | LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, |
| 63 | const char *const lst[]); | 63 | const char *const lst[]); |
| 64 | 64 | ||
| 65 | LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname); | ||
| 66 | LUALIB_API int (luaL_execresult) (lua_State *L, int stat); | ||
| 67 | |||
| 65 | /* pre-defined references */ | 68 | /* pre-defined references */ |
| 66 | #define LUA_NOREF (-2) | 69 | #define LUA_NOREF (-2) |
| 67 | #define LUA_REFNIL (-1) | 70 | #define LUA_REFNIL (-1) |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: liolib.c,v 2.97 2011/02/10 15:35:50 roberto Exp roberto $ | 2 | ** $Id: liolib.c,v 2.98 2011/02/21 19:12:54 roberto Exp roberto $ |
| 3 | ** Standard I/O (and system) library | 3 | ** Standard I/O (and system) library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -33,20 +33,6 @@ | |||
| 33 | #define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m)) | 33 | #define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m)) |
| 34 | #define lua_pclose(L,file) ((void)L, pclose(file)) | 34 | #define lua_pclose(L,file) ((void)L, pclose(file)) |
| 35 | 35 | ||
| 36 | |||
| 37 | #if defined(LUA_USE_POSIX) /* { */ | ||
| 38 | |||
| 39 | #include <sys/wait.h> | ||
| 40 | |||
| 41 | /* | ||
| 42 | ** use appropriate macros to interpret 'pclose' return status | ||
| 43 | */ | ||
| 44 | #define inspectstat(stat,what) \ | ||
| 45 | if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \ | ||
| 46 | else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; } | ||
| 47 | |||
| 48 | #endif /* } */ | ||
| 49 | |||
| 50 | #elif defined(LUA_WIN) /* }{ */ | 36 | #elif defined(LUA_WIN) /* }{ */ |
| 51 | 37 | ||
| 52 | #define lua_popen(L,c,m) ((void)L, _popen(c,m)) | 38 | #define lua_popen(L,c,m) ((void)L, _popen(c,m)) |
| @@ -64,10 +50,6 @@ | |||
| 64 | 50 | ||
| 65 | #endif /* } */ | 51 | #endif /* } */ |
| 66 | 52 | ||
| 67 | #if !defined(inspectstat) | ||
| 68 | #define inspectstat(stat,what) /* no op */ | ||
| 69 | #endif | ||
| 70 | |||
| 71 | 53 | ||
| 72 | #define IO_INPUT 1 | 54 | #define IO_INPUT 1 |
| 73 | #define IO_OUTPUT 2 | 55 | #define IO_OUTPUT 2 |
| @@ -76,24 +58,6 @@ | |||
| 76 | static const char *const fnames[] = {"input", "output"}; | 58 | static const char *const fnames[] = {"input", "output"}; |
| 77 | 59 | ||
| 78 | 60 | ||
| 79 | static int pushresult (lua_State *L, int i, const char *filename) { | ||
| 80 | int en = errno; /* calls to Lua API may change this value */ | ||
| 81 | if (i) { | ||
| 82 | lua_pushboolean(L, 1); | ||
| 83 | return 1; | ||
| 84 | } | ||
| 85 | else { | ||
| 86 | lua_pushnil(L); | ||
| 87 | if (filename) | ||
| 88 | lua_pushfstring(L, "%s: %s", filename, strerror(en)); | ||
| 89 | else | ||
| 90 | lua_pushfstring(L, "%s", strerror(en)); | ||
| 91 | lua_pushinteger(L, en); | ||
| 92 | return 3; | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 96 | |||
| 97 | static void fileerror (lua_State *L, int arg, const char *filename) { | 61 | static void fileerror (lua_State *L, int arg, const char *filename) { |
| 98 | lua_pushfstring(L, "%s: %s", filename, strerror(errno)); | 62 | lua_pushfstring(L, "%s: %s", filename, strerror(errno)); |
| 99 | luaL_argerror(L, arg, lua_tostring(L, -1)); | 63 | luaL_argerror(L, arg, lua_tostring(L, -1)); |
| @@ -162,21 +126,8 @@ static int io_noclose (lua_State *L) { | |||
| 162 | static int io_pclose (lua_State *L) { | 126 | static int io_pclose (lua_State *L) { |
| 163 | FILE **p = tofilep(L); | 127 | FILE **p = tofilep(L); |
| 164 | int stat = lua_pclose(L, *p); | 128 | int stat = lua_pclose(L, *p); |
| 165 | const char *what = "exit"; /* type of termination */ | ||
| 166 | *p = NULL; /* mark stream as closed (for GC) */ | 129 | *p = NULL; /* mark stream as closed (for GC) */ |
| 167 | if (stat == -1) /* error? */ | 130 | return luaL_execresult(L, stat); |
| 168 | return pushresult(L, 0, NULL); | ||
| 169 | else { | ||
| 170 | inspectstat(stat, what); /* interpret result from 'pclose' */ | ||
| 171 | if (*what == 'e' && stat == 0) /* successful termination? */ | ||
| 172 | return pushresult(L, 1, NULL); | ||
| 173 | else { /* return nil,what,code */ | ||
| 174 | lua_pushnil(L); | ||
| 175 | lua_pushstring(L, what); | ||
| 176 | lua_pushinteger(L, stat); | ||
| 177 | return 3; | ||
| 178 | } | ||
| 179 | } | ||
| 180 | } | 131 | } |
| 181 | 132 | ||
| 182 | 133 | ||
| @@ -187,7 +138,7 @@ static int io_fclose (lua_State *L) { | |||
| 187 | FILE **p = tofilep(L); | 138 | FILE **p = tofilep(L); |
| 188 | int ok = (fclose(*p) == 0); | 139 | int ok = (fclose(*p) == 0); |
| 189 | *p = NULL; /* mark stream as closed (for GC) */ | 140 | *p = NULL; /* mark stream as closed (for GC) */ |
| 190 | return pushresult(L, ok, NULL); | 141 | return luaL_fileresult(L, ok, NULL); |
| 191 | } | 142 | } |
| 192 | 143 | ||
| 193 | 144 | ||
| @@ -238,7 +189,7 @@ static int io_open (lua_State *L) { | |||
| 238 | " (should match " LUA_QL("[rwa]%%+?b?") ")", mode); | 189 | " (should match " LUA_QL("[rwa]%%+?b?") ")", mode); |
| 239 | pf = newfile(L); | 190 | pf = newfile(L); |
| 240 | *pf = fopen(filename, mode); | 191 | *pf = fopen(filename, mode); |
| 241 | return (*pf == NULL) ? pushresult(L, 0, filename) : 1; | 192 | return (*pf == NULL) ? luaL_fileresult(L, 0, filename) : 1; |
| 242 | } | 193 | } |
| 243 | 194 | ||
| 244 | 195 | ||
| @@ -251,14 +202,14 @@ static int io_popen (lua_State *L) { | |||
| 251 | const char *mode = luaL_optstring(L, 2, "r"); | 202 | const char *mode = luaL_optstring(L, 2, "r"); |
| 252 | FILE **pf = newfile(L); | 203 | FILE **pf = newfile(L); |
| 253 | *pf = lua_popen(L, filename, mode); | 204 | *pf = lua_popen(L, filename, mode); |
| 254 | return (*pf == NULL) ? pushresult(L, 0, filename) : 1; | 205 | return (*pf == NULL) ? luaL_fileresult(L, 0, filename) : 1; |
| 255 | } | 206 | } |
| 256 | 207 | ||
| 257 | 208 | ||
| 258 | static int io_tmpfile (lua_State *L) { | 209 | static int io_tmpfile (lua_State *L) { |
| 259 | FILE **pf = newfile(L); | 210 | FILE **pf = newfile(L); |
| 260 | *pf = tmpfile(); | 211 | *pf = tmpfile(); |
| 261 | return (*pf == NULL) ? pushresult(L, 0, NULL) : 1; | 212 | return (*pf == NULL) ? luaL_fileresult(L, 0, NULL) : 1; |
| 262 | } | 213 | } |
| 263 | 214 | ||
| 264 | 215 | ||
| @@ -469,7 +420,7 @@ static int g_read (lua_State *L, FILE *f, int first) { | |||
| 469 | } | 420 | } |
| 470 | } | 421 | } |
| 471 | if (ferror(f)) | 422 | if (ferror(f)) |
| 472 | return pushresult(L, 0, NULL); | 423 | return luaL_fileresult(L, 0, NULL); |
| 473 | if (!success) { | 424 | if (!success) { |
| 474 | lua_pop(L, 1); /* remove last result */ | 425 | lua_pop(L, 1); /* remove last result */ |
| 475 | lua_pushnil(L); /* push nil instead */ | 426 | lua_pushnil(L); /* push nil instead */ |
| @@ -533,7 +484,7 @@ static int g_write (lua_State *L, FILE *f, int arg) { | |||
| 533 | } | 484 | } |
| 534 | } | 485 | } |
| 535 | if (status) return 1; /* file handle already on stack top */ | 486 | if (status) return 1; /* file handle already on stack top */ |
| 536 | else return pushresult(L, status, NULL); | 487 | else return luaL_fileresult(L, status, NULL); |
| 537 | } | 488 | } |
| 538 | 489 | ||
| 539 | 490 | ||
| @@ -557,7 +508,7 @@ static int f_seek (lua_State *L) { | |||
| 557 | long offset = luaL_optlong(L, 3, 0); | 508 | long offset = luaL_optlong(L, 3, 0); |
| 558 | op = fseek(f, offset, mode[op]); | 509 | op = fseek(f, offset, mode[op]); |
| 559 | if (op) | 510 | if (op) |
| 560 | return pushresult(L, 0, NULL); /* error */ | 511 | return luaL_fileresult(L, 0, NULL); /* error */ |
| 561 | else { | 512 | else { |
| 562 | lua_pushinteger(L, ftell(f)); | 513 | lua_pushinteger(L, ftell(f)); |
| 563 | return 1; | 514 | return 1; |
| @@ -572,18 +523,18 @@ static int f_setvbuf (lua_State *L) { | |||
| 572 | int op = luaL_checkoption(L, 2, NULL, modenames); | 523 | int op = luaL_checkoption(L, 2, NULL, modenames); |
| 573 | lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); | 524 | lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); |
| 574 | int res = setvbuf(f, NULL, mode[op], sz); | 525 | int res = setvbuf(f, NULL, mode[op], sz); |
| 575 | return pushresult(L, res == 0, NULL); | 526 | return luaL_fileresult(L, res == 0, NULL); |
| 576 | } | 527 | } |
| 577 | 528 | ||
| 578 | 529 | ||
| 579 | 530 | ||
| 580 | static int io_flush (lua_State *L) { | 531 | static int io_flush (lua_State *L) { |
| 581 | return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); | 532 | return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); |
| 582 | } | 533 | } |
| 583 | 534 | ||
| 584 | 535 | ||
| 585 | static int f_flush (lua_State *L) { | 536 | static int f_flush (lua_State *L) { |
| 586 | return pushresult(L, fflush(tofile(L)) == 0, NULL); | 537 | return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL); |
| 587 | } | 538 | } |
| 588 | 539 | ||
| 589 | 540 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: loslib.c,v 1.32 2010/10/05 12:18:03 roberto Exp roberto $ | 2 | ** $Id: loslib.c,v 1.33 2011/01/26 16:30:02 roberto Exp roberto $ |
| 3 | ** Standard Operating System library | 3 | ** Standard Operating System library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -59,37 +59,28 @@ | |||
| 59 | 59 | ||
| 60 | 60 | ||
| 61 | 61 | ||
| 62 | static int os_pushresult (lua_State *L, int i, const char *filename) { | 62 | static int os_execute (lua_State *L) { |
| 63 | int en = errno; /* calls to Lua API may change this value */ | 63 | const char *cmd = luaL_optstring(L, 1, NULL); |
| 64 | if (i) { | 64 | int stat = system(cmd); |
| 65 | lua_pushboolean(L, 1); | 65 | if (cmd != NULL) |
| 66 | return 1; | 66 | return luaL_execresult(L, stat); |
| 67 | } | ||
| 68 | else { | 67 | else { |
| 69 | lua_pushnil(L); | 68 | lua_pushboolean(L, stat); /* true if there is a shell */ |
| 70 | lua_pushfstring(L, "%s: %s", filename, strerror(en)); | 69 | return 1; |
| 71 | lua_pushinteger(L, en); | ||
| 72 | return 3; | ||
| 73 | } | 70 | } |
| 74 | } | 71 | } |
| 75 | 72 | ||
| 76 | 73 | ||
| 77 | static int os_execute (lua_State *L) { | ||
| 78 | lua_pushinteger(L, system(luaL_optstring(L, 1, NULL))); | ||
| 79 | return 1; | ||
| 80 | } | ||
| 81 | |||
| 82 | |||
| 83 | static int os_remove (lua_State *L) { | 74 | static int os_remove (lua_State *L) { |
| 84 | const char *filename = luaL_checkstring(L, 1); | 75 | const char *filename = luaL_checkstring(L, 1); |
| 85 | return os_pushresult(L, remove(filename) == 0, filename); | 76 | return luaL_fileresult(L, remove(filename) == 0, filename); |
| 86 | } | 77 | } |
| 87 | 78 | ||
| 88 | 79 | ||
| 89 | static int os_rename (lua_State *L) { | 80 | static int os_rename (lua_State *L) { |
| 90 | const char *fromname = luaL_checkstring(L, 1); | 81 | const char *fromname = luaL_checkstring(L, 1); |
| 91 | const char *toname = luaL_checkstring(L, 2); | 82 | const char *toname = luaL_checkstring(L, 2); |
| 92 | return os_pushresult(L, rename(fromname, toname) == 0, fromname); | 83 | return luaL_fileresult(L, rename(fromname, toname) == 0, fromname); |
| 93 | } | 84 | } |
| 94 | 85 | ||
| 95 | 86 | ||
