diff options
Diffstat (limited to 'src/inout.c')
-rw-r--r-- | src/inout.c | 239 |
1 files changed, 178 insertions, 61 deletions
diff --git a/src/inout.c b/src/inout.c index d985c1b7..7bd7c235 100644 --- a/src/inout.c +++ b/src/inout.c @@ -2,49 +2,54 @@ ** inout.c ** Provide function to realise the input/output function and debugger ** facilities. +** Also provides some predefined lua functions. */ -char *rcs_inout="$Id: inout.c,v 1.2 1993/12/22 21:15:16 roberto Exp $"; +char *rcs_inout="$Id: inout.c,v 2.16 1994/12/20 21:20:36 roberto Exp $"; #include <stdio.h> +#include <stdlib.h> #include <string.h> +#include "mem.h" #include "opcode.h" #include "hash.h" #include "inout.h" #include "table.h" +#include "tree.h" +#include "lua.h" /* Exported variables */ -int lua_linenumber; -int lua_debug; -int lua_debugline; +Word lua_linenumber; +Bool lua_debug; +Word lua_debugline = 0; + /* Internal variables */ + #ifndef MAXFUNCSTACK -#define MAXFUNCSTACK 32 +#define MAXFUNCSTACK 100 #endif -static struct { int file; int function; } funcstack[MAXFUNCSTACK]; -static int nfuncstack=0; + +typedef struct FuncStackNode { + struct FuncStackNode *next; + char *file; + Word function; + Word line; +} FuncStackNode; + +static FuncStackNode *funcStack = NULL; +static Word nfuncstack=0; static FILE *fp; static char *st; -static void (*usererror) (char *s); - -/* -** Function to set user function to handle errors. -*/ -void lua_errorfunction (void (*fn) (char *s)) -{ - usererror = fn; -} /* ** Function to get the next character from the input file */ static int fileinput (void) { - int c = fgetc (fp); - return (c == EOF ? 0 : c); + return fgetc (fp); } /* @@ -52,22 +57,25 @@ static int fileinput (void) */ static int stringinput (void) { - st++; - return (*(st-1)); + return *st++; } /* ** Function to open a file to be input unit. -** Return 0 on success or 1 on error. +** Return 0 on success or error message on error. */ -int lua_openfile (char *fn) +char *lua_openfile (char *fn) { lua_linenumber = 1; lua_setinput (fileinput); fp = fopen (fn, "r"); - if (fp == NULL) return 1; - if (lua_addfile (fn)) return 1; - return 0; + if (fp == NULL) + { + static char buff[32]; + sprintf(buff, "unable to open file %.10s", fn); + return buff; + } + return lua_addfile (fn); } /* @@ -86,7 +94,7 @@ void lua_closefile (void) /* ** Function to open a string to be input unit */ -int lua_openstring (char *s) +char *lua_openstring (char *s) { lua_linenumber = 1; lua_setinput (stringinput); @@ -94,9 +102,8 @@ int lua_openstring (char *s) { char sn[64]; sprintf (sn, "String: %10.10s...", s); - if (lua_addfile (sn)) return 1; + return lua_addfile (sn); } - return 0; } /* @@ -107,40 +114,38 @@ void lua_closestring (void) lua_delfile(); } -/* -** Call user function to handle error messages, if registred. Or report error -** using standard function (fprintf). -*/ -void lua_error (char *s) -{ - if (usererror != NULL) usererror (s); - else fprintf (stderr, "lua: %s\n", s); -} /* ** Called to execute SETFUNCTION opcode, this function pushs a function into -** function stack. Return 0 on success or 1 on error. +** function stack. */ -int lua_pushfunction (int file, int function) +void lua_pushfunction (char *file, Word function) { - if (nfuncstack >= MAXFUNCSTACK-1) + FuncStackNode *newNode; + if (nfuncstack++ >= MAXFUNCSTACK) { - lua_error ("function stack overflow"); - return 1; + lua_reportbug("function stack overflow"); } - funcstack[nfuncstack].file = file; - funcstack[nfuncstack].function = function; - nfuncstack++; - return 0; + newNode = new(FuncStackNode); + newNode->function = function; + newNode->file = file; + newNode->line= lua_debugline; + newNode->next = funcStack; + funcStack = newNode; } /* -** Called to execute RESET opcode, this function pops a function from +** Called to execute RESET opcode, this function pops a function from ** function stack. */ void lua_popfunction (void) { - nfuncstack--; + FuncStackNode *temp = funcStack; + if (temp == NULL) return; + --nfuncstack; + lua_debugline = temp->line; + funcStack = temp->next; + luaI_free(temp); } /* @@ -148,30 +153,142 @@ void lua_popfunction (void) */ void lua_reportbug (char *s) { - char msg[1024]; + char msg[MAXFUNCSTACK*80]; strcpy (msg, s); if (lua_debugline != 0) { - int i; - if (nfuncstack > 0) + if (funcStack) { - sprintf (strchr(msg,0), - "\n\tin statement begining at line %d in function \"%s\" of file \"%s\"", - lua_debugline, s_name(funcstack[nfuncstack-1].function), - lua_file[funcstack[nfuncstack-1].file]); - sprintf (strchr(msg,0), "\n\tactive stack\n"); - for (i=nfuncstack-1; i>=0; i--) - sprintf (strchr(msg,0), "\t-> function \"%s\" of file \"%s\"\n", - s_name(funcstack[i].function), - lua_file[funcstack[i].file]); + FuncStackNode *func = funcStack; + int line = lua_debugline; + sprintf (strchr(msg,0), "\n\tactive stack:\n"); + do + { + sprintf (strchr(msg,0), + "\t-> function \"%s\" at file \"%s\":%u\n", + lua_constant[func->function]->str, func->file, line); + line = func->line; + func = func->next; + lua_popfunction(); + } while (func); } else { sprintf (strchr(msg,0), - "\n\tin statement begining at line %d of file \"%s\"", + "\n\tin statement begining at line %u of file \"%s\"", lua_debugline, lua_filename()); } } lua_error (msg); } + +/* +** Internal function: do a string +*/ +void lua_internaldostring (void) +{ + lua_Object obj = lua_getparam (1); + if (lua_isstring(obj) && !lua_dostring(lua_getstring(obj))) + lua_pushnumber(1); + else + lua_pushnil(); +} + +/* +** Internal function: do a file +*/ +void lua_internaldofile (void) +{ + lua_Object obj = lua_getparam (1); + if (lua_isstring(obj) && !lua_dofile(lua_getstring(obj))) + lua_pushnumber(1); + else + lua_pushnil(); +} + +/* +** Internal function: print object values +*/ +void lua_print (void) +{ + int i=1; + lua_Object obj; + while ((obj=lua_getparam (i++)) != LUA_NOOBJECT) + { + if (lua_isnumber(obj)) printf("%g\n",lua_getnumber(obj)); + else if (lua_isstring(obj)) printf("%s\n",lua_getstring(obj)); + else if (lua_isfunction(obj)) printf("function: %p\n",bvalue(luaI_Address(obj))); + else if (lua_iscfunction(obj)) printf("cfunction: %p\n",lua_getcfunction(obj) +); + else if (lua_isuserdata(obj)) printf("userdata: %p\n",lua_getuserdata(obj)); + else if (lua_istable(obj)) printf("table: %p\n",avalue(luaI_Address(obj))); + else if (lua_isnil(obj)) printf("nil\n"); + else printf("invalid value to print\n"); + } +} + + +/* +** Internal function: return an object type. +*/ +void luaI_type (void) +{ + lua_Object o = lua_getparam(1); + if (o == LUA_NOOBJECT) + lua_error("no parameter to function 'type'"); + switch (lua_type(o)) + { + case LUA_T_NIL : + lua_pushliteral("nil"); + break; + case LUA_T_NUMBER : + lua_pushliteral("number"); + break; + case LUA_T_STRING : + lua_pushliteral("string"); + break; + case LUA_T_ARRAY : + lua_pushliteral("table"); + break; + case LUA_T_FUNCTION : + lua_pushliteral("function"); + break; + case LUA_T_CFUNCTION : + lua_pushliteral("cfunction"); + break; + default : + lua_pushliteral("userdata"); + break; + } +} + +/* +** Internal function: convert an object to a number +*/ +void lua_obj2number (void) +{ + lua_Object o = lua_getparam(1); + if (lua_isnumber(o)) + lua_pushobject(o); + else if (lua_isstring(o)) + { + char c; + float f; + if (sscanf(lua_getstring(o),"%f %c",&f,&c) == 1) + lua_pushnumber(f); + else + lua_pushnil(); + } + else + lua_pushnil(); +} + + +void luaI_error (void) +{ + char *s = lua_getstring(lua_getparam(1)); + if (s == NULL) s = "(no message)"; + lua_reportbug(s); +} + |