aboutsummaryrefslogtreecommitdiff
path: root/lapi.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-05-01 17:48:12 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-05-01 17:48:12 -0300
commit751cd867d3e0338279fa6f3390c8b7ddc0108659 (patch)
tree726f6f3cd49109382b2c0d7ee6a1e0fea740afbd /lapi.c
parentb36b2a061c88be22e36900146cbcad39bab07f5d (diff)
downloadlua-751cd867d3e0338279fa6f3390c8b7ddc0108659.tar.gz
lua-751cd867d3e0338279fa6f3390c8b7ddc0108659.tar.bz2
lua-751cd867d3e0338279fa6f3390c8b7ddc0108659.zip
new way to handle errors
Diffstat (limited to 'lapi.c')
-rw-r--r--lapi.c118
1 files changed, 75 insertions, 43 deletions
diff --git a/lapi.c b/lapi.c
index 4eeada6c..42ed4a82 100644
--- a/lapi.c
+++ b/lapi.c
@@ -1,10 +1,12 @@
1/* 1/*
2** $Id: lapi.c,v 1.184 2002/04/16 17:08:28 roberto Exp roberto $ 2** $Id: lapi.c,v 1.185 2002/04/22 14:40:50 roberto Exp roberto $
3** Lua API 3** Lua API
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
6 6
7 7
8#include <errno.h>
9#include <stdio.h>
8#include <string.h> 10#include <string.h>
9 11
10#include "lua.h" 12#include "lua.h"
@@ -516,7 +518,7 @@ LUA_API void lua_setmetatable (lua_State *L, int objindex) {
516 518
517 519
518/* 520/*
519** `do' functions (run Lua code) 521** `load' and `call' functions (run Lua code)
520*/ 522*/
521 523
522LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults) { 524LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults) {
@@ -529,17 +531,6 @@ LUA_API void lua_rawcall (lua_State *L, int nargs, int nresults) {
529} 531}
530 532
531 533
532LUA_API int lua_call (lua_State *L, int nargs, int nresults) {
533 int status;
534 int errpos = lua_gettop(L) - nargs;
535 lua_getglobal(L, "_ERRORMESSAGE");
536 lua_insert(L, errpos); /* put below function and args */
537 status = lua_pcall(L, nargs, nresults, errpos);
538 lua_remove(L, errpos);
539 return status;
540}
541
542
543LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errf) { 534LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errf) {
544 int status; 535 int status;
545 const TObject *err; 536 const TObject *err;
@@ -551,31 +542,11 @@ LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errf) {
551} 542}
552 543
553 544
554static int aux_do (lua_State *L, int status) { 545static int errfile (lua_State *L, const char *filename) {
555 if (status == 0) { /* parse OK? */ 546 char buff[150];
556 int err = lua_gettop(L); 547 sprintf(buff, "cannot read file `%.80s' (%.40s)", filename, strerror(errno));
557 lua_getglobal(L, "_ERRORMESSAGE"); 548 lua_pushstring(L, buff);
558 lua_insert(L, err); 549 return LUA_ERRFILE;
559 status = lua_pcall(L, 0, LUA_MULTRET, err); /* call main */
560 lua_remove(L, err); /* remove error function */
561 }
562 return status;
563}
564
565
566LUA_API int lua_dofile (lua_State *L, const char *filename) {
567 return aux_do(L, lua_loadfile(L, filename));
568}
569
570
571LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size,
572 const char *name) {
573 return aux_do(L, lua_loadbuffer(L, buff, size, name));
574}
575
576
577LUA_API int lua_dostring (lua_State *L, const char *str) {
578 return lua_dobuffer(L, str, strlen(str), str);
579} 550}
580 551
581 552
@@ -585,12 +556,12 @@ LUA_API int lua_loadfile (lua_State *L, const char *filename) {
585 int bin; /* flag for file mode */ 556 int bin; /* flag for file mode */
586 int nlevel; /* level on the stack of filename */ 557 int nlevel; /* level on the stack of filename */
587 FILE *f = (filename == NULL) ? stdin : fopen(filename, "r"); 558 FILE *f = (filename == NULL) ? stdin : fopen(filename, "r");
588 if (f == NULL) return LUA_ERRFILE; /* unable to open file */ 559 if (f == NULL) return errfile(L, filename); /* unable to open file */
589 bin = (ungetc(getc(f), f) == LUA_SIGNATURE[0]); 560 bin = (ungetc(getc(f), f) == LUA_SIGNATURE[0]);
590 if (bin && f != stdin) { 561 if (bin && f != stdin) {
591 fclose(f); 562 fclose(f);
592 f = fopen(filename, "rb"); /* reopen in binary mode */ 563 f = fopen(filename, "rb"); /* reopen in binary mode */
593 if (f == NULL) return LUA_ERRFILE; /* unable to reopen file */ 564 if (f == NULL) return errfile(L, filename); /* unable to reopen file */
594 } 565 }
595 if (filename == NULL) 566 if (filename == NULL)
596 lua_pushstring(L, "=stdin"); 567 lua_pushstring(L, "=stdin");
@@ -603,7 +574,8 @@ LUA_API int lua_loadfile (lua_State *L, const char *filename) {
603 filename = lua_tostring(L, -1); /* filename = `@'..filename */ 574 filename = lua_tostring(L, -1); /* filename = `@'..filename */
604 luaZ_Fopen(&z, f, filename); 575 luaZ_Fopen(&z, f, filename);
605 status = luaD_protectedparser(L, &z, bin); 576 status = luaD_protectedparser(L, &z, bin);
606 if (ferror(f)) status = LUA_ERRFILE; 577 if (ferror(f))
578 return errfile(L, filename);
607 lua_remove(L, nlevel); /* remove filename */ 579 lua_remove(L, nlevel); /* remove filename */
608 if (f != stdin) 580 if (f != stdin)
609 fclose(f); 581 fclose(f);
@@ -661,9 +633,10 @@ LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) {
661*/ 633*/
662 634
663 635
664LUA_API void lua_error (lua_State *L, const char *s) { 636LUA_API void lua_errorobj (lua_State *L) {
665 lua_lock(L); 637 lua_lock(L);
666 luaD_runerror(L, s); 638 api_checknelems(L, 1);
639 luaD_errorobj(L, L->top - 1, LUA_ERRRUN);
667 lua_unlock(L); 640 lua_unlock(L);
668} 641}
669 642
@@ -767,3 +740,62 @@ LUA_API int lua_pushupvalues (lua_State *L) {
767} 740}
768 741
769 742
743
744/*
745** {======================================================
746** compatibility code
747** =======================================================
748*/
749
750
751static void callalert (lua_State *L, int status) {
752 if (status != 0) {
753 int top = lua_gettop(L);
754 lua_getglobal(L, "_ALERT");
755 lua_insert(L, -2);
756 lua_pcall(L, 1, 0, 0);
757 lua_settop(L, top-1);
758 }
759}
760
761
762LUA_API int lua_call (lua_State *L, int nargs, int nresults) {
763 int status;
764 int errpos = lua_gettop(L) - nargs;
765 lua_getglobal(L, "_ERRORMESSAGE");
766 lua_insert(L, errpos); /* put below function and args */
767 status = lua_pcall(L, nargs, nresults, errpos);
768 lua_remove(L, errpos);
769 callalert(L, status);
770 return status;
771}
772
773static int aux_do (lua_State *L, int status) {
774 if (status == 0) { /* parse OK? */
775 int err = lua_gettop(L);
776 lua_getglobal(L, "_ERRORMESSAGE");
777 lua_insert(L, err);
778 status = lua_pcall(L, 0, LUA_MULTRET, err); /* call main */
779 lua_remove(L, err); /* remove error function */
780 }
781 callalert(L, status);
782 return status;
783}
784
785
786LUA_API int lua_dofile (lua_State *L, const char *filename) {
787 return aux_do(L, lua_loadfile(L, filename));
788}
789
790
791LUA_API int lua_dobuffer (lua_State *L, const char *buff, size_t size,
792 const char *name) {
793 return aux_do(L, lua_loadbuffer(L, buff, size, name));
794}
795
796
797LUA_API int lua_dostring (lua_State *L, const char *str) {
798 return lua_dobuffer(L, str, strlen(str), str);
799}
800
801/* }====================================================== */