summaryrefslogtreecommitdiff
path: root/src/inout.c
diff options
context:
space:
mode:
authorLua Team <team@lua.org>1995-02-07 12:00:00 +0000
committerrepogen <>1995-02-07 12:00:00 +0000
commita8b6ba0954edb9e0e669e1f451b9a8f145ce5166 (patch)
tree35e9e9999968c4f13a25a5f647203456f044274a /src/inout.c
parent944fc7d7d95575f2b8023c1f3d4ac19e1369fc76 (diff)
downloadlua-github-2.1.tar.gz
Lua 2.12.1
Diffstat (limited to 'src/inout.c')
-rw-r--r--src/inout.c239
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);
+}
+