commit 3c9d999424520c809e05bee11d81788b488434f6
parent f7840a3e0bc07813246b2bad6bf4579848187908
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Fri, 3 Mar 2000 11:58:04 -0300
many details (most by lhf).
Diffstat:
32 files changed, 280 insertions(+), 293 deletions(-)
diff --git a/lapi.c b/lapi.c
@@ -1,5 +1,5 @@
/*
-** $Id: lapi.c,v 1.71 2000/02/08 16:34:31 roberto Exp roberto $
+** $Id: lapi.c,v 1.72 2000/02/22 17:54:16 roberto Exp roberto $
** Lua API
** See Copyright Notice in lua.h
*/
@@ -41,9 +41,10 @@ const TObject *luaA_protovalue (const TObject *o) {
}
-void luaA_checkCparams (lua_State *L, int nParams) {
- if (nParams > L->top-L->Cstack.base)
- lua_error(L, "API error - wrong number of arguments in C2lua stack");
+void luaA_checkCargs (lua_State *L, int nargs) {
+ if (nargs > L->top-L->Cstack.base)
+ luaL_verror(L, "Lua API error - "
+ "expected at least %d arguments in C2lua stack", nargs);
}
@@ -70,7 +71,7 @@ static void top2LC (lua_State *L, int n) {
lua_Object lua_pop (lua_State *L) {
- luaA_checkCparams(L, 1);
+ luaA_checkCargs(L, 1);
return luaA_putObjectOnTop(L);
}
@@ -103,10 +104,10 @@ lua_Object lua_gettagmethod (lua_State *L, int tag, const char *event) {
lua_Object lua_settagmethod (lua_State *L, int tag, const char *event) {
TObject *method;
- luaA_checkCparams(L, 1);
+ luaA_checkCargs(L, 1);
method = L->top-1;
if ((ttype(method) != LUA_T_NIL) && (*lua_type(L, method) != 'f'))
- lua_error(L, "API error - tag method must be a function or nil");
+ lua_error(L, "Lua API error - tag method must be a function or nil");
luaT_settagmethod(L, tag, event, method);
return luaA_putObjectOnTop(L);
}
@@ -114,7 +115,7 @@ lua_Object lua_settagmethod (lua_State *L, int tag, const char *event) {
lua_Object lua_seterrormethod (lua_State *L) {
lua_Object temp;
- luaA_checkCparams(L, 1);
+ luaA_checkCargs(L, 1);
temp = lua_getglobal(L, "_ERRORMESSAGE");
lua_setglobal(L, "_ERRORMESSAGE");
return temp;
@@ -122,7 +123,7 @@ lua_Object lua_seterrormethod (lua_State *L) {
lua_Object lua_gettable (lua_State *L) {
- luaA_checkCparams(L, 2);
+ luaA_checkCargs(L, 2);
luaV_gettable(L, L->top--);
return luaA_putObjectOnTop(L);
}
@@ -130,7 +131,7 @@ lua_Object lua_gettable (lua_State *L) {
lua_Object lua_rawgettable (lua_State *L) {
lua_Object res;
- luaA_checkCparams(L, 2);
+ luaA_checkCargs(L, 2);
if (ttype(L->top-2) != LUA_T_ARRAY)
lua_error(L, "indexed expression not a table in rawgettable");
res = luaA_putluaObject(L, luaH_get(L, avalue(L->top-2), L->top-1));
@@ -141,7 +142,7 @@ lua_Object lua_rawgettable (lua_State *L) {
void lua_settable (lua_State *L) {
StkId top;
- luaA_checkCparams(L, 3);
+ luaA_checkCargs(L, 3);
top = L->top;
luaV_settable(L, top-3, top);
L->top = top-3; /* pop table, index, and value */
@@ -149,7 +150,7 @@ void lua_settable (lua_State *L) {
void lua_rawsettable (lua_State *L) {
- luaA_checkCparams(L, 3);
+ luaA_checkCargs(L, 3);
luaV_rawsettable(L, L->top-3);
}
@@ -176,14 +177,14 @@ lua_Object lua_rawgetglobal (lua_State *L, const char *name) {
void lua_setglobal (lua_State *L, const char *name) {
- luaA_checkCparams(L, 1);
+ luaA_checkCargs(L, 1);
luaV_setglobal(L, luaS_assertglobalbyname(L, name), L->top--);
}
void lua_rawsetglobal (lua_State *L, const char *name) {
GlobalVar *gv = luaS_assertglobalbyname(L, name);
- luaA_checkCparams(L, 1);
+ luaA_checkCargs(L, 1);
gv->value = *(--L->top);
}
@@ -296,8 +297,8 @@ void lua_pushstring (lua_State *L, const char *s) {
void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
if (fn == NULL)
- lua_error(L, "API error - attempt to push a NULL Cfunction");
- luaA_checkCparams(L, n);
+ lua_error(L, "Lua API error - attempt to push a NULL Cfunction");
+ luaA_checkCargs(L, n);
ttype(L->top) = LUA_T_CPROTO;
fvalue(L->top) = fn;
incr_top;
@@ -321,7 +322,7 @@ void luaA_pushobject (lua_State *L, const TObject *o) {
void lua_pushobject (lua_State *L, lua_Object o) {
if (o == LUA_NOOBJECT)
- lua_error(L, "API error - attempt to push a NOOBJECT");
+ lua_error(L, "Lua API error - attempt to push a NOOBJECT");
*L->top = *o;
incr_top;
}
@@ -339,7 +340,7 @@ int lua_tag (lua_State *L, lua_Object o) {
void lua_settag (lua_State *L, int tag) {
- luaA_checkCparams(L, 1);
+ luaA_checkCargs(L, 1);
luaT_realtag(L, tag);
switch (ttype(L->top-1)) {
case LUA_T_ARRAY:
@@ -406,7 +407,7 @@ int luaA_next (lua_State *L, const Hash *t, int i) {
int lua_next (lua_State *L, lua_Object t, int i) {
if (ttype(t) != LUA_T_ARRAY)
- lua_error(L, "API error - object is not a table in `lua_next'");
+ lua_error(L, "Lua API error - object is not a table in `lua_next'");
i = luaA_next(L, avalue(t), i);
top2LC(L, (i==0) ? 0 : 2);
return i;
diff --git a/lapi.h b/lapi.h
@@ -1,5 +1,5 @@
/*
-** $Id: lapi.h,v 1.12 1999/12/23 18:19:57 roberto Exp roberto $
+** $Id: lapi.h,v 1.13 2000/01/19 12:00:45 roberto Exp roberto $
** Auxiliary functions from Lua API
** See Copyright Notice in lua.h
*/
@@ -11,7 +11,7 @@
#include "lobject.h"
-void luaA_checkCparams (lua_State *L, int nParams);
+void luaA_checkCargs (lua_State *L, int nargs);
const TObject *luaA_protovalue (const TObject *o);
void luaA_pushobject (lua_State *L, const TObject *o);
GlobalVar *luaA_nextvar (lua_State *L, TaggedString *g);
diff --git a/lbuffer.c b/lbuffer.c
@@ -1,5 +1,5 @@
/*
-** $Id: lbuffer.c,v 1.10 1999/11/10 15:40:46 roberto Exp roberto $
+** $Id: lbuffer.c,v 1.11 1999/11/22 13:12:07 roberto Exp roberto $
** Auxiliary functions for building Lua libraries
** See Copyright Notice in lua.h
*/
@@ -19,10 +19,14 @@
-------------------------------------------------------*/
+/*
+** amount of extra space (pre)allocated when buffer is reallocated
+*/
#define EXTRABUFF 32
-#define openspace(L, size) if (L->Mbuffnext+(size) > L->Mbuffsize) Openspace(L, size)
+#define openspace(L, size) if (L->Mbuffnext+(size) > L->Mbuffsize) \
+ Openspace(L, size)
static void Openspace (lua_State *L, int size) {
L->Mbuffsize = (L->Mbuffnext+size+EXTRABUFF)*2;
diff --git a/lbuiltin.c b/lbuiltin.c
@@ -1,10 +1,19 @@
/*
-** $Id: lbuiltin.c,v 1.92 2000/01/19 16:50:30 roberto Exp roberto $
+** $Id: lbuiltin.c,v 1.93 2000/02/22 18:12:46 roberto Exp roberto $
** Built-in functions
** See Copyright Notice in lua.h
*/
+/*
+** =========================================================================
+** All built-in functions are public (i.e. not static) and are named luaB_f,
+** where f is the function name in Lua. So, if you do not need all these
+** functions, you may register manually only the ones that you need.
+** =========================================================================
+*/
+
+
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
@@ -91,7 +100,7 @@ static Hash *gettable (lua_State *L, int arg) {
/*
-** If your system does not support "stderr", redefine this function, or
+** If your system does not support `stderr', redefine this function, or
** redefine _ERRORMESSAGE so that it won't need _ALERT.
*/
void luaB__ALERT (lua_State *L) {
@@ -116,9 +125,9 @@ void luaB__ERRORMESSAGE (lua_State *L) {
/*
-** If your system does not support "stdout", you can just remove this function.
-** If you need, you can define your own "print" function, following this
-** model but changing "fputs" to put the strings at a proper place
+** If your system does not support `stdout', you can just remove this function.
+** If you need, you can define your own `print' function, following this
+** model but changing `fputs' to put the strings at a proper place
** (a console window or a log file, for instance).
*/
#ifndef MAXPRINT
@@ -174,17 +183,17 @@ void luaB_error (lua_State *L) {
}
void luaB_setglobal (lua_State *L) {
- const char *n = luaL_check_string(L, 1);
+ const char *name = luaL_check_string(L, 1);
lua_Object value = luaL_nonnullarg(L, 2);
lua_pushobject(L, value);
- lua_setglobal(L, n);
+ lua_setglobal(L, name);
}
void luaB_rawsetglobal (lua_State *L) {
- const char *n = luaL_check_string(L, 1);
+ const char *name = luaL_check_string(L, 1);
lua_Object value = luaL_nonnullarg(L, 2);
lua_pushobject(L, value);
- lua_rawsetglobal(L, n);
+ lua_rawsetglobal(L, name);
}
void luaB_getglobal (lua_State *L) {
@@ -236,7 +245,7 @@ void luaB_settagmethod (lua_State *L) {
"function or nil expected");
#ifndef LUA_COMPAT_GC
if (strcmp(event, "gc") == 0 && tag != LUA_T_NIL)
- lua_error(L, "cannot set this tag method from Lua");
+ lua_error(L, "cannot set this `gc' tag method from Lua");
#endif
lua_pushobject(L, nf);
lua_pushobject(L, lua_settagmethod(L, tag, event));
@@ -325,7 +334,7 @@ void luaB_call (lua_State *L) {
return; /* return nil to signal the error */
}
else
- lua_error(L, NULL);
+ lua_error(L, NULL); /* propagate error without additional messages */
}
else { /* no errors */
if (strchr(options, 'p')) { /* pack results? */
@@ -340,14 +349,14 @@ void luaB_call (lua_State *L) {
void luaB_nextvar (lua_State *L) {
lua_Object o = luaL_nonnullarg(L, 1);
- TaggedString *g;
+ TaggedString *name;
if (ttype(o) == LUA_T_NIL)
- g = NULL;
+ name = NULL;
else {
luaL_arg_check(L, ttype(o) == LUA_T_STRING, 1, "variable name expected");
- g = tsvalue(o);
+ name = tsvalue(o);
}
- if (!luaA_nextvar(L, g))
+ if (!luaA_nextvar(L, name))
lua_pushnil(L);
}
@@ -355,7 +364,7 @@ void luaB_nextvar (lua_State *L) {
void luaB_next (lua_State *L) {
const Hash *a = gettable(L, 1);
lua_Object k = luaL_nonnullarg(L, 2);
- int i; /* will get first element after `i' */
+ int i; /* `luaA_next' gets first element after `i' */
if (ttype(k) == LUA_T_NIL)
i = 0; /* get first */
else {
@@ -390,7 +399,8 @@ void luaB_tostring (lua_State *L) {
sprintf(buff, "function: %p", o->value.f);
break;
case LUA_T_USERDATA:
- sprintf(buff, "userdata: %p", o->value.ts->u.d.value);
+ sprintf(buff, "userdata: %p(%d)", o->value.ts->u.d.value,
+ o->value.ts->u.d.tag);
break;
case LUA_T_NIL:
lua_pushstring(L, "nil");
@@ -435,7 +445,7 @@ void luaB_foreachi (lua_State *L) {
luaD_call(L, L->top-3, 1);
if (ttype(L->top-1) != LUA_T_NIL)
return;
- L->top--;
+ L->top--; /* remove nil result */
}
}
@@ -499,7 +509,7 @@ void luaB_tinsert (lua_State *L) {
pos = n+1;
}
luaV_setn(L, a, n+1); /* a.n = n+1 */
- for ( ;n>=pos; n--)
+ for (; n>=pos; n--)
luaH_move(L, a, n, n+1); /* a[n+1] = a[n] */
luaH_setint(L, a, pos, v); /* a[pos] = v */
}
@@ -521,6 +531,7 @@ void luaB_tremove (lua_State *L) {
/*
** {======================================================
** Quicksort
+** (based on `Algorithms in MODULA-3', Robert Sedgewick; Addison-Wesley, 1993.)
*/
static void swap (lua_State *L, Hash *a, int i, int j) {
@@ -602,7 +613,7 @@ void luaB_sort (lua_State *L) {
lua_Object func = lua_getparam(L, 2);
luaL_arg_check(L, func == LUA_NOOBJECT || lua_isfunction(L, func), 2,
"function expected");
- luaD_checkstack(L, 4); /* for Pivot, f, a, b (sort_comp) */
+ luaD_checkstack(L, 4); /* for pivot, f, a, b (sort_comp) */
auxsort(L, a, 1, n, func);
lua_pushobject(L, t);
}
@@ -640,7 +651,7 @@ static const struct luaL_reg builtin_funcs[] = {
{"tonumber", luaB_tonumber},
{"tostring", luaB_tostring},
{"type", luaB_type},
- /* "Extra" functions */
+/* "Extra" functions */
{"assert", luaB_assert},
{"foreach", luaB_foreach},
{"foreachi", luaB_foreachi},
diff --git a/lbuiltin.h b/lbuiltin.h
@@ -1,5 +1,5 @@
/*
-** $Id: lbuiltin.h,v 1.4 1999/12/27 17:33:22 roberto Exp roberto $
+** $Id: lbuiltin.h,v 1.5 1999/12/28 19:23:41 roberto Exp roberto $
** Built-in functions
** See Copyright Notice in lua.h
*/
@@ -11,39 +11,38 @@
void luaB__ALERT (lua_State *L);
void luaB__ERRORMESSAGE (lua_State *L);
-void luaB_print (lua_State *L);
-void luaB_tonumber (lua_State *L);
+void luaB_assert (lua_State *L);
+void luaB_call (lua_State *L);
+void luaB_collectgarbage (lua_State *L);
+void luaB_copytagmethods (lua_State *L);
+void luaB_dofile (lua_State *L);
+void luaB_dostring (lua_State *L);
void luaB_error (lua_State *L);
-void luaB_setglobal (lua_State *L);
-void luaB_rawsetglobal (lua_State *L);
+void luaB_foreach (lua_State *L);
+void luaB_foreachi (lua_State *L);
+void luaB_foreachvar (lua_State *L);
void luaB_getglobal (lua_State *L);
-void luaB_rawgetglobal (lua_State *L);
-void luaB_tag (lua_State *L);
-void luaB_settag (lua_State *L);
+void luaB_getn (lua_State *L);
+void luaB_gettagmethod (lua_State *L);
void luaB_newtag (lua_State *L);
-void luaB_copytagmethods (lua_State *L);
+void luaB_next (lua_State *L);
+void luaB_nextvar (lua_State *L);
+void luaB_print (lua_State *L);
+void luaB_rawgetglobal (lua_State *L);
void luaB_rawgettable (lua_State *L);
+void luaB_rawsetglobal (lua_State *L);
void luaB_rawsettable (lua_State *L);
-void luaB_settagmethod (lua_State *L);
-void luaB_gettagmethod (lua_State *L);
void luaB_seterrormethod (lua_State *L);
-void luaB_collectgarbage (lua_State *L);
-void luaB_type (lua_State *L);
-void luaB_dostring (lua_State *L);
-void luaB_dofile (lua_State *L);
-void luaB_call (lua_State *L);
-void luaB_nextvar (lua_State *L);
-void luaB_next (lua_State *L);
-void luaB_tostring (lua_State *L);
-void luaB_assert (lua_State *L);
-void luaB_foreachi (lua_State *L);
-void luaB_foreach (lua_State *L);
-void luaB_foreachvar (lua_State *L);
-void luaB_getn (lua_State *L);
+void luaB_setglobal (lua_State *L);
+void luaB_settag (lua_State *L);
+void luaB_settagmethod (lua_State *L);
+void luaB_sort (lua_State *L);
+void luaB_tag (lua_State *L);
void luaB_tinsert (lua_State *L);
+void luaB_tonumber (lua_State *L);
+void luaB_tostring (lua_State *L);
void luaB_tremove (lua_State *L);
-void luaB_sort (lua_State *L);
-
+void luaB_type (lua_State *L);
void luaB_predefine (lua_State *L);
diff --git a/lcode.c b/lcode.c
@@ -1,5 +1,5 @@
/*
-** $Id: lcode.c,v 1.1 2000/02/22 13:30:11 roberto Exp roberto $
+** $Id: lcode.c,v 1.2 2000/03/03 12:33:59 roberto Exp roberto $
** Code generator for Lua
** See Copyright Notice in lua.h
*/
@@ -152,7 +152,7 @@ int luaK_kstr (LexState *ls, int c) {
#endif
static int real_constant (LexState *ls, real r) {
- /* check whether `r' has appeared within the last LIM entries */
+ /* check whether `r' has appeared within the last LOOKBACKNUMS entries */
TProtoFunc *f = ls->fs->f;
int c = f->nknum;
int lim = c < LOOKBACKNUMS ? 0 : c-LOOKBACKNUMS;
diff --git a/ldblib.c b/ldblib.c
@@ -1,5 +1,5 @@
/*
-** $Id: ldblib.c,v 1.9 1999/12/21 18:04:41 roberto Exp roberto $
+** $Id: ldblib.c,v 1.10 2000/01/19 12:00:45 roberto Exp roberto $
** Interface from Lua to its debug API
** See Copyright Notice in lua.h
*/
@@ -50,7 +50,7 @@ static void getstack (lua_State *L) {
lua_Object res = lua_createtable(L);
if (!lua_getinfo(L, options, &ar))
luaL_argerror(L, 2, "invalid option");
- for ( ;*options; options++) {
+ for (; *options; options++) {
switch (*options) {
case 'S':
settabss(L, res, "source", ar.source);
@@ -103,6 +103,10 @@ static void setlocal (lua_State *L) {
}
+/*
+** because of these variables, this module is not reentrant, and should
+** not be used in multiple states
+*/
static int linehook = LUA_NOREF; /* Lua reference to line hook function */
static int callhook = LUA_NOREF; /* Lua reference to call hook function */
diff --git a/ldebug.c b/ldebug.c
@@ -1,5 +1,5 @@
/*
-** $Id: ldebug.c,v 1.8 2000/02/11 16:52:54 roberto Exp roberto $
+** $Id: ldebug.c,v 1.9 2000/02/17 18:30:36 roberto Exp roberto $
** Debug Interface
** See Copyright Notice in lua.h
*/
@@ -187,7 +187,7 @@ static void lua_getobjname (lua_State *L, StkId f, lua_Dbgactreg *ar) {
int lua_getinfo (lua_State *L, const char *what, lua_Dbgactreg *ar) {
StkId func = ar->_func;
LUA_ASSERT(L, is_T_MARK(ttype(func)), "invalid activation record");
- for ( ;*what; what++) {
+ for (; *what; what++) {
switch (*what) {
case 'S':
lua_funcinfo(ar);
diff --git a/ldo.c b/ldo.c
@@ -1,5 +1,5 @@
/*
-** $Id: ldo.c,v 1.66 2000/01/19 12:00:45 roberto Exp roberto $
+** $Id: ldo.c,v 1.67 2000/02/08 16:34:31 roberto Exp roberto $
** Stack and Call structure of Lua
** See Copyright Notice in lua.h
*/
@@ -52,7 +52,7 @@ void luaD_checkstack (lua_State *L, int n) {
if (L->stack_last-L->stack > (L->stacksize-1)) {
/* overflow while handling overflow: do what?? */
L->top -= EXTRA_STACK;
- lua_error(L, "BAD STACK OVERFLOW! DATA CORRUPTED!!");
+ lua_error(L, "BAD STACK OVERFLOW! DATA CORRUPTED!");
}
else {
lua_Dbgactreg dummy;
@@ -62,7 +62,7 @@ void luaD_checkstack (lua_State *L, int n) {
lua_error(L, "Lua2C - C2Lua overflow");
}
else
- lua_error(L, "stack size overflow");
+ lua_error(L, "stack overflow; possible recursion loop");
}
}
}
@@ -254,7 +254,7 @@ void lua_error (lua_State *L, const char *s) {
if (L->errorJmp)
longjmp(L->errorJmp->b, 1);
else {
- message(L, "unable to recover. exiting.\n");
+ message(L, "unable to recover; exiting\n");
exit(1);
}
}
@@ -301,7 +301,7 @@ static int protectedparser (lua_State *L, ZIO *z, int bin) {
TProtoFunc *volatile tf;
struct lua_longjmp *volatile oldErr = L->errorJmp;
L->errorJmp = &myErrorJmp;
- L->top = base; /* erase C2Lua */
+ L->top = base; /* clear C2Lua */
if (setjmp(myErrorJmp.b) == 0) {
tf = bin ? luaU_undump1(L, z) : luaY_parser(L, z);
status = 0;
diff --git a/lfunc.c b/lfunc.c
@@ -1,5 +1,5 @@
/*
-** $Id: lfunc.c,v 1.17 2000/01/25 13:57:18 roberto Exp roberto $
+** $Id: lfunc.c,v 1.18 2000/01/28 16:53:00 roberto Exp roberto $
** Auxiliary functions to manipulate prototypes and closures
** See Copyright Notice in lua.h
*/
@@ -14,7 +14,7 @@
#include "lstate.h"
#define gcsizeproto(L, p) numblocks(L, 0, sizeof(TProtoFunc))
-#define gcsizeclosure(L, c) numblocks(L, c->nelems, sizeof(Closure))
+#define gcsizeclosure(L, c) numblocks(L, c->nelems, sizeof(Closure))
diff --git a/liolib.c b/liolib.c
@@ -1,5 +1,5 @@
/*
-** $Id: liolib.c,v 1.56 2000/01/19 12:00:45 roberto Exp roberto $
+** $Id: liolib.c,v 1.57 2000/02/08 16:34:31 roberto Exp roberto $
** Standard I/O (and system) library
** See Copyright Notice in lua.h
*/
@@ -97,7 +97,7 @@ static FILE *gethandle (lua_State *L, lua_Object f) {
static FILE *getfilebyname (lua_State *L, const char *name) {
FILE *handle = gethandle(L, lua_rawgetglobal(L, name));
if (!handle)
- luaL_verror(L, "global variable `%.50s' is not a file handle", name);
+ luaL_verror(L, "`%.50s' is not a file handle", name);
return handle;
}
@@ -286,7 +286,7 @@ static int read_pattern (lua_State *L, FILE *f, const char *p) {
#else
-#define read_pattern(L, f,p) (lua_error(L, "read patterns are deprecated"), 0)
+#define read_pattern(L, f, p) (lua_error(L, "read patterns are deprecated"), 0)
#endif
@@ -525,9 +525,6 @@ static void io_debug (lua_State *L) {
#define MAXMESSAGE (MESSAGESIZE*10)
-#define MAXSRC 60
-
-
static void errorfb (lua_State *L) {
char buff[MAXMESSAGE];
int level = 1; /* skip level 0 (it's this function) */
@@ -535,10 +532,10 @@ static void errorfb (lua_State *L) {
lua_Object alertfunc = lua_rawgetglobal(L, "_ALERT");
sprintf(buff, "error: %.200s\n", lua_getstring(L, lua_getparam(L, 1)));
while (lua_getstack(L, level++, &ar)) {
- char buffchunk[MAXSRC];
+ char buffchunk[60];
lua_getinfo(L, "Snl", &ar);
luaL_chunkid(buffchunk, ar.source, sizeof(buffchunk));
- if (level == 2) strcat(buff, "Active Stack:\n");
+ if (level == 2) strcat(buff, "Stack traceback:\n");
strcat(buff, " ");
if (strlen(buff) > MAXMESSAGE-MESSAGESIZE) {
strcat(buff, "...\n");
diff --git a/llex.c b/llex.c
@@ -1,5 +1,5 @@
/*
-** $Id: llex.c,v 1.50 2000/01/26 18:51:49 roberto Exp roberto $
+** $Id: llex.c,v 1.51 2000/02/08 16:34:31 roberto Exp roberto $
** Lexical Analyzer
** See Copyright Notice in lua.h
*/
@@ -23,7 +23,7 @@
-#define next(LS) (LS->current = zgetc(LS->lex_z))
+#define next(LS) (LS->current = zgetc(LS->z))
#define save(L, c) luaL_addchar(L, c)
@@ -37,7 +37,7 @@ static const char *const token2string [] = {"and", "do", "else", "elseif", "end"
void luaX_init (lua_State *L) {
- unsigned int i;
+ int i;
for (i=0; i<NUM_RESERVED; i++) {
TaggedString *ts = luaS_new(L, token2string[i]);
ts->marked = (unsigned char)(RESERVEDMARK+i); /* reserved word */
@@ -49,7 +49,7 @@ void luaX_init (lua_State *L) {
void luaX_syntaxerror (LexState *ls, const char *s, const char *token) {
char buff[MAXSRC];
- luaL_chunkid(buff, zname(ls->lex_z), sizeof(buff));
+ luaL_chunkid(buff, zname(ls->z), sizeof(buff));
luaL_verror(ls->L, "%.100s;\n last token read: `%.50s' at line %d in %.80s",
s, token, ls->linenumber, buff);
}
@@ -86,10 +86,10 @@ static void luaX_invalidchar (LexState *ls, int c) {
static void firstline (LexState *LS)
{
- int c = zgetc(LS->lex_z);
+ int c = zgetc(LS->z);
if (c == '#')
- while ((c=zgetc(LS->lex_z)) != '\n' && c != EOZ) /* skip first line */;
- zungetc(LS->lex_z);
+ while ((c=zgetc(LS->z)) != '\n' && c != EOZ) /* skip first line */;
+ zungetc(LS->z);
}
@@ -100,7 +100,7 @@ void luaX_setinput (lua_State *L, LexState *LS, ZIO *z) {
LS->iflevel = 0;
LS->ifstate[0].skip = 0;
LS->ifstate[0].elsepart = 1; /* to avoid a free $else */
- LS->lex_z = z;
+ LS->z = z;
LS->fs = NULL;
firstline(LS);
luaL_resetbuffer(L);
@@ -322,7 +322,7 @@ int luaX_lex (LexState *LS) {
for (;;) {
switch (LS->current) {
- case ' ': case '\t': case '\r': /* CR: to avoid problems with DOS */
+ case ' ': case '\t': case '\r': /* `\r' to avoid problems with DOS */
next(LS);
continue;
diff --git a/llex.h b/llex.h
@@ -1,5 +1,5 @@
/*
-** $Id: llex.h,v 1.17 2000/01/25 18:44:21 roberto Exp roberto $
+** $Id: llex.h,v 1.18 2000/02/08 16:34:31 roberto Exp roberto $
** Lexical Analyzer
** See Copyright Notice in lua.h
*/
@@ -11,7 +11,7 @@
#include "lzio.h"
-#define FIRST_RESERVED 260
+#define FIRST_RESERVED 257
/* maximum length of a reserved word (+1 for final 0) */
#define TOKEN_LEN 15
@@ -30,7 +30,8 @@ enum RESERVED {
NAME, CONC, DOTS, EQ, GE, LE, NE, NUMBER, STRING, EOS
};
-#define NUM_RESERVED (WHILE-FIRST_RESERVED+1) /* number of reserved words */
+/* number of reserved words */
+#define NUM_RESERVED ((int)(WHILE-FIRST_RESERVED+1))
#ifndef MAX_IFS
@@ -49,13 +50,13 @@ struct ifState {
typedef struct LexState {
int current; /* look ahead character */
int token; /* look ahead token */
- struct FuncState *fs; /* `FuncState' is private for the parser */
+ struct FuncState *fs; /* `FuncState' is private to the parser */
struct lua_State *L;
union {
real r;
TaggedString *ts;
} seminfo; /* semantics information */
- struct zio *lex_z; /* input stream */
+ struct zio *z; /* input stream */
int linenumber; /* input line counter */
int iflevel; /* level of nested $if's (for lexical analysis) */
struct ifState ifstate[MAX_IFS];
diff --git a/lmem.c b/lmem.c
@@ -1,5 +1,5 @@
/*
-** $Id: lmem.c,v 1.24 2000/01/13 16:30:47 roberto Exp roberto $
+** $Id: lmem.c,v 1.25 2000/02/08 16:34:31 roberto Exp roberto $
** Interface to Memory Manager
** See Copyright Notice in lua.h
*/
@@ -43,7 +43,9 @@
#define free(b) debug_realloc(b, 0)
-#define HEADER (sizeof(double)) /* maximum alignment */
+/* ensures maximum alignment for HEADER */
+#define HEADER (sizeof(double)>sizeof(long) ? sizeof(double) : sizeof(long))
+
#define MARKSIZE 16
#define MARK 0x55 /* 01010101 (a nice pattern) */
@@ -77,21 +79,21 @@ static void freeblock (void *block) {
static void *debug_realloc (void *block, size_t size) {
- size_t realsize = HEADER+size+MARKSIZE;
if (size == 0) {
freeblock(block);
return NULL;
}
else {
+ size_t realsize = HEADER+size+MARKSIZE;
char *newblock = (char *)(malloc)(realsize); /* alloc a new block */
int i;
+ if (newblock == NULL) return NULL;
if (block) {
size_t oldsize = *blocksize(block);
if (oldsize > size) oldsize = size;
memcpy(newblock+HEADER, block, oldsize);
freeblock(block); /* erase (and check) old copy */
}
- if (newblock == NULL) return NULL;
memdebug_total += size;
memdebug_numblocks++;
*(unsigned long *)newblock = size;
@@ -123,14 +125,13 @@ void *luaM_growaux (lua_State *L, void *block, unsigned long nelems,
** generic allocation routine.
*/
void *luaM_realloc (lua_State *L, void *block, unsigned long size) {
- size_t s = (size_t)size;
- if (s != size)
- lua_error(L, "memory allocation error: block too big");
if (size == 0) {
free(block); /* block may be NULL; that is OK for free */
return NULL;
}
- block = realloc(block, s);
+ else if ((size_t)size != size)
+ lua_error(L, "memory allocation error: block too big");
+ block = realloc(block, size);
if (block == NULL)
lua_error(L, memEM);
return block;
diff --git a/lobject.c b/lobject.c
@@ -1,5 +1,5 @@
/*
-** $Id: lobject.c,v 1.30 2000/01/25 18:44:21 roberto Exp roberto $
+** $Id: lobject.c,v 1.31 2000/02/17 18:30:36 roberto Exp roberto $
** Some generic functions over Lua objects
** See Copyright Notice in lua.h
*/
@@ -16,7 +16,7 @@
const char *const luaO_typenames[] = { /* ORDER LUA_T */
"userdata", "number", "string", "table", "function", "function", "nil",
"function", "function", "function", "function", "function", "function",
- "line", "global", "local", "field", NULL
+ "line", NULL
};
diff --git a/lobject.h b/lobject.h
@@ -1,5 +1,5 @@
/*
-** $Id: lobject.h,v 1.48 2000/02/17 18:30:36 roberto Exp roberto $
+** $Id: lobject.h,v 1.49 2000/02/21 18:33:26 roberto Exp roberto $
** Type definitions for Lua objects
** See Copyright Notice in lua.h
*/
@@ -14,15 +14,13 @@
#ifdef DEBUG
-#ifdef NDEBUG
#undef NDEBUG
-#endif
#include <assert.h>
#define LUA_INTERNALERROR(L,s) assert(0)
#define LUA_ASSERT(L,c,s) assert(c)
#else
#define LUA_INTERNALERROR(L,s) /* empty */
-#define LUA_ASSERT(L,c,s) /* empty */
+#define LUA_ASSERT(L,c,s) /* empty */
#endif
@@ -51,7 +49,7 @@ typedef unsigned long Instruction;
/* conversion of pointer to int (for hashing only) */
/* (the shift removes bits that are usually 0 because of alignment) */
-#define IntPoint(L, p) (((unsigned int)(p)) >> 3)
+#define IntPoint(L, p) (((unsigned long)(p)) >> 3)
/*
@@ -68,21 +66,21 @@ typedef unsigned long Instruction;
** grep "ORDER LUA_T"
*/
typedef enum {
- LUA_T_USERDATA = 0, /* default tag for userdata */
- LUA_T_NUMBER = -1, /* fixed tag for numbers */
- LUA_T_STRING = -2, /* fixed tag for strings */
- LUA_T_ARRAY = -3, /* default tag for tables (or arrays) */
- LUA_T_LPROTO = -4, /* fixed tag for Lua functions */
- LUA_T_CPROTO = -5, /* fixed tag for C functions */
- LUA_T_NIL = -6, /* last "pre-defined" tag */
+ LUA_T_USERDATA = 0, /* default tag for userdata */
+ LUA_T_NUMBER = -1, /* fixed tag for numbers */
+ LUA_T_STRING = -2, /* fixed tag for strings */
+ LUA_T_ARRAY = -3, /* default tag for tables (or arrays) */
+ LUA_T_LPROTO = -4, /* fixed tag for Lua functions */
+ LUA_T_CPROTO = -5, /* fixed tag for C functions */
+ LUA_T_NIL = -6, /* last "pre-defined" tag */
LUA_T_LCLOSURE = -7, /* Lua closure */
LUA_T_CCLOSURE = -8, /* C closure */
LUA_T_LCLMARK = -9 ,/* mark for Lua closures */
LUA_T_CCLMARK = -10,/* mark for C closures */
- LUA_T_LMARK = -11, /* mark for Lua prototypes */
- LUA_T_CMARK = -12, /* mark for C prototypes */
+ LUA_T_LMARK = -11,/* mark for Lua prototypes */
+ LUA_T_CMARK = -12,/* mark for C prototypes */
LUA_T_LINE = -13
} lua_Type;
@@ -93,7 +91,7 @@ typedef enum {
#define LAST_REGULAR_TAG LUA_T_CCLOSURE /* after that, are all marks */
/*
-** chech whether `t' is a mark; ttypes are negative numbers, so the
+** check whether `t' is a mark; ttypes are negative numbers, so the
** comparisons look reversed. (ORDER LUA_T)
*/
#define is_T_MARK(t) (LUA_T_CMARK <= (t) && (t) <= LUA_T_LCLMARK)
@@ -221,6 +219,7 @@ typedef struct Hash {
extern const char *const luaO_typenames[];
+extern const TObject luaO_nilobject;
#define luaO_typename(o) luaO_typenames[-ttype(o)]
@@ -228,11 +227,7 @@ extern const char *const luaO_typenames[];
unsigned long luaO_power2 (unsigned long n);
-extern const TObject luaO_nilobject;
-
-
-#define luaO_equalObj(t1,t2) ((ttype(t1) != ttype(t2)) ? 0 \
- : luaO_equalval(t1,t2))
+#define luaO_equalObj(t1,t2) (ttype(t1) == ttype(t2) && luaO_equalval(t1,t2))
int luaO_equalval (const TObject *t1, const TObject *t2);
int luaO_redimension (lua_State *L, int oldsize);
int luaO_str2d (const char *s, real *result);
diff --git a/lopcodes.h b/lopcodes.h
@@ -1,5 +1,5 @@
/*
-** $Id: lopcodes.h,v 1.41 2000/02/22 13:30:11 roberto Exp roberto $
+** $Id: lopcodes.h,v 1.42 2000/03/02 12:32:53 roberto Exp roberto $
** Opcodes for Lua virtual machine
** See Copyright Notice in lua.h
*/
@@ -21,9 +21,11 @@
2nd unsigned argument in the middle 8 bits (`B')
The signed argument is represented in excess 2^23; that is, the real value
- is 2^23 minus the usigned value.
+ is the usigned value minus 2^23.
===========================================================================*/
+#define EXCESS_S (1<<23) /* == 2^23 */
+
/*
** the following macros help to manipulate instructions
*/
@@ -35,13 +37,13 @@
#define GET_OPCODE(i) ((OpCode)((i)&0xFF))
#define GETARG_U(i) ((int)((i)>>8))
-#define GETARG_S(i) ((int)((i)>>8)-(1<<23))
+#define GETARG_S(i) ((int)((i)>>8)-EXCESS_S)
#define GETARG_A(i) ((int)((i)>>16))
#define GETARG_B(i) ((int)(((i)>>8) & 0xFF))
#define SET_OPCODE(i,o) (((i)&0xFFFFFF00u) | (Instruction)(o))
#define SETARG_U(i,u) (((i)&0x000000FFu) | ((Instruction)(u)<<8))
-#define SETARG_S(i,s) (((i)&0x000000FFu) | ((Instruction)((s)+(1<<23))<<8))
+#define SETARG_S(i,s) (((i)&0x000000FFu) | ((Instruction)((s)+EXCESS_S)<<8))
#define SETARG_A(i,a) (((i)&0x0000FFFFu) | ((Instruction)(a)<<16))
#define SETARG_B(i,b) (((i)&0xFFFF00FFu) | ((Instruction)(b)<<8))
@@ -55,8 +57,9 @@
*/
typedef enum {
-/* name parm before after side effect
------------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------
+name args stack before stack after side effects
+------------------------------------------------------------------------*/
ENDCODE,/* - - (return) */
RETCODE,/* U - (return) */
diff --git a/lparser.c b/lparser.c
@@ -1,5 +1,5 @@
/*
-** $Id: lparser.c,v 1.60 2000/02/22 13:30:11 roberto Exp roberto $
+** $Id: lparser.c,v 1.61 2000/03/03 12:33:59 roberto Exp roberto $
** LL(1) Parser and code generator for Lua
** See Copyright Notice in lua.h
*/
@@ -434,7 +434,7 @@ static int funcparams (LexState *ls, int slf) {
break;
case STRING: /* funcparams -> STRING */
- code_string(ls, ls->seminfo.ts); /* must use 'seminfo' before `next' */
+ code_string(ls, ls->seminfo.ts); /* must use `seminfo' before `next' */
next(ls);
break;
@@ -660,7 +660,7 @@ static void simpleexp (LexState *ls, expdesc *v) {
}
case STRING: /* simpleexp -> STRING */
- /* must use 'seminfo' before `next' */
+ /* must use `seminfo' before `next' */
v->info = code_string(ls, ls->seminfo.ts);
next(ls);
break;
@@ -930,7 +930,7 @@ static void namestat (LexState *ls) {
check_debugline(ls);
var_or_func(ls, &v);
if (v.k == VEXP) { /* stat -> func */
- if (!luaK_iscall(ls, v.info)) /* is just an upper value? */
+ if (!luaK_iscall(ls, v.info)) /* is just an upvalue? */
luaK_error(ls, "syntax error");
luaK_setcallreturns(ls, v.info, 0); /* call statement uses no results */
}
@@ -1006,7 +1006,7 @@ static int stat (LexState *ls) {
return 1;
case RETURN: case ';': case ELSE: case ELSEIF:
- case END: case UNTIL: case EOS: /* 'stat' follow */
+ case END: case UNTIL: case EOS: /* `stat' follow */
return 0;
default:
diff --git a/lparser.h b/lparser.h
@@ -1,5 +1,5 @@
/*
-** $Id: lparser.h,v 1.6 2000/02/22 13:30:11 roberto Exp roberto $
+** $Id: lparser.h,v 1.7 2000/03/03 12:33:59 roberto Exp roberto $
** LL(1) Parser and code generator for Lua
** See Copyright Notice in lua.h
*/
@@ -14,31 +14,31 @@
/* maximum number of local variables */
#ifndef MAXLOCALS
-#define MAXLOCALS 200 /* arbitrary limit (<=MAXARG_B) */
+#define MAXLOCALS 200 /* arbitrary limit (<=MAXARG_B) */
#endif
/* maximum number of upvalues */
#ifndef MAXUPVALUES
-#define MAXUPVALUES 32 /* arbitrary limit (<=MAXARG_B) */
+#define MAXUPVALUES 32 /* arbitrary limit (<=MAXARG_B) */
#endif
/* maximum number of variables in the left side of an assignment */
#ifndef MAXVARSLH
-#define MAXVARSLH 100 /* arbitrary limit (<=MAXARG_B) */
+#define MAXVARSLH 100 /* arbitrary limit (<=MAXARG_B) */
#endif
/* maximum number of parameters in a function */
#ifndef MAXPARAMS
-#define MAXPARAMS 100 /* arbitrary limit (<=MAXLOCALS) */
+#define MAXPARAMS 100 /* arbitrary limit (<=MAXLOCALS) */
#endif
/* maximum stack size in a function */
#ifndef MAXSTACK
-#define MAXSTACK 256 /* arbitrary limit (<=MAXARG_A) */
+#define MAXSTACK 256 /* arbitrary limit (<=MAXARG_A) */
#endif
diff --git a/lref.c b/lref.c
@@ -1,5 +1,5 @@
/*
-** $Id: lref.c,v 1.6 1999/12/27 17:33:22 roberto Exp roberto $
+** $Id: lref.c,v 1.7 2000/02/08 16:34:31 roberto Exp roberto $
** reference mechanism
** See Copyright Notice in lua.h
*/
@@ -16,7 +16,7 @@
int lua_ref (lua_State *L, int lock) {
int ref;
- luaA_checkCparams(L, 1);
+ luaA_checkCargs(L, 1);
if (ttype(L->top-1) == LUA_T_NIL)
ref = LUA_REFNIL;
else {
@@ -39,7 +39,8 @@ int lua_ref (lua_State *L, int lock) {
void lua_unref (lua_State *L, int ref) {
if (ref >= 0) {
if (ref >= L->refSize || L->refArray[ref].st >= 0)
- lua_error(L, "API error - invalid parameter for function `lua_unref'");
+ lua_error(L, "Lua API error - "
+ "invalid argument for function `lua_unref'");
L->refArray[ref].st = L->refFree;
L->refFree = ref;
}
@@ -67,7 +68,7 @@ void lua_beginblock (lua_State *L) {
void lua_endblock (lua_State *L) {
if (L->numCblocks <= 0)
- lua_error(L, "API error - no block to end");
+ lua_error(L, "Lua API error - no block to end");
--L->numCblocks;
L->Cstack = L->Cblocks[L->numCblocks];
L->top = L->Cstack.base;
diff --git a/lstring.c b/lstring.c
@@ -1,5 +1,5 @@
/*
-** $Id: lstring.c,v 1.30 1999/11/26 18:59:20 roberto Exp roberto $
+** $Id: lstring.c,v 1.31 1999/12/14 18:42:57 roberto Exp roberto $
** String table (keeps all strings handled by Lua)
** See Copyright Notice in lua.h
*/
@@ -18,7 +18,7 @@
#define gcsizestring(L, l) numblocks(L, 0, sizeof(TaggedString)+l)
-#define gcsizeudata gcsizestring(L, 0)
+#define gcsizeudata gcsizestring(L, 0)
diff --git a/lstring.h b/lstring.h
@@ -1,5 +1,5 @@
/*
-** $Id: lstring.h,v 1.14 1999/11/26 18:59:20 roberto Exp roberto $
+** $Id: lstring.h,v 1.15 1999/12/14 18:42:57 roberto Exp roberto $
** String table (keep all strings handled by Lua)
** See Copyright Notice in lua.h
*/
@@ -12,8 +12,8 @@
#include "lstate.h"
-#define NUM_HASHSTR 31 /* a prime not in array `dimensions' */
-#define NUM_HASHUDATA 31 /* idem */
+#define NUM_HASHSTR 31
+#define NUM_HASHUDATA 31
#define NUM_HASHS (NUM_HASHSTR+NUM_HASHUDATA)
diff --git a/lstrlib.c b/lstrlib.c
@@ -1,5 +1,5 @@
/*
-** $Id: lstrlib.c,v 1.39 1999/12/27 17:33:22 roberto Exp roberto $
+** $Id: lstrlib.c,v 1.40 2000/02/08 16:34:31 roberto Exp roberto $
** Standard library for string operations and pattern-matching
** See Copyright Notice in lua.h
*/
@@ -116,8 +116,8 @@ static void str_char (lua_State *L) {
** =======================================================
*/
-#ifndef MAX_CAPT
-#define MAX_CAPT 32 /* arbitrary limit */
+#ifndef MAX_CAPTURES
+#define MAX_CAPTURES 32 /* arbitrary limit */
#endif
@@ -127,12 +127,12 @@ struct Capture {
struct {
const char *init;
int len; /* -1 signals unfinished capture */
- } capture[MAX_CAPT];
+ } capture[MAX_CAPTURES];
};
-#define ESC '%'
-#define SPECIALS "^$*+?.([%-"
+#define ESC '%'
+#define SPECIALS "^$*+?.([%-"
static void push_captures (lua_State *L, struct Capture *cap) {
@@ -145,7 +145,7 @@ static void push_captures (lua_State *L, struct Capture *cap) {
}
-static int check_cap (lua_State *L, int l, struct Capture *cap) {
+static int check_capture (lua_State *L, int l, struct Capture *cap) {
l -= '1';
if (!(0 <= l && l < cap->level && cap->capture[l].len != -1))
lua_error(L, "invalid capture index");
@@ -165,12 +165,12 @@ static int capture_to_close (lua_State *L, struct Capture *cap) {
const char *luaI_classend (lua_State *L, const char *p) {
switch (*p++) {
case ESC:
- if (*p == '\0') lua_error(L, "incorrect pattern (ends with `%')");
+ if (*p == '\0') lua_error(L, "malformed pattern (ends with `%')");
return p+1;
case '[':
if (*p == '^') p++;
do { /* look for a ']' */
- if (*p == '\0') lua_error(L, "incorrect pattern (missing `]')");
+ if (*p == '\0') lua_error(L, "malformed pattern (missing `]')");
if (*(p++) == ESC && *p != '\0') p++; /* skip escapes (e.g. '%]') */
} while (*p != ']');
return p+1;
@@ -180,7 +180,7 @@ const char *luaI_classend (lua_State *L, const char *p) {
}
-static int matchclass (int c, int cl) {
+static int match_class (int c, int cl) {
int res;
switch (tolower(cl)) {
case 'a' : res = isalpha(c); break;
@@ -209,7 +209,7 @@ static int matchbracketclass (int c, const char *p, const char *endclass) {
while (++p < endclass) {
if (*p == ESC) {
p++;
- if (matchclass(c, (unsigned char)*p))
+ if (match_class(c, (unsigned char)*p))
return sig;
}
else if ((*(p+1) == '-') && (p+2 < endclass)) {
@@ -217,7 +217,7 @@ static int matchbracketclass (int c, const char *p, const char *endclass) {
if ((int)(unsigned char)*(p-2) <= c && c <= (int)(unsigned char)*p)
return sig;
}
- else if ((unsigned char)*p == c) return sig;
+ else if ((int)(unsigned char)*p == c) return sig;
}
return !sig;
}
@@ -229,7 +229,7 @@ int luaI_singlematch (int c, const char *p, const char *ep) {
case '.': /* matches any char */
return 1;
case ESC:
- return matchclass(c, (unsigned char)*(p+1));
+ return match_class(c, (unsigned char)*(p+1));
case '[':
return matchbracketclass(c, p, ep-1);
default:
@@ -289,11 +289,11 @@ static const char *min_expand (lua_State *L, const char *s, const char *p, const
}
-static const char *start_capt (lua_State *L, const char *s, const char *p,
- struct Capture *cap) {
+static const char *start_capture (lua_State *L, const char *s, const char *p,
+ struct Capture *cap) {
const char *res;
int level = cap->level;
- if (level >= MAX_CAPT) lua_error(L, "too many captures");
+ if (level >= MAX_CAPTURES) lua_error(L, "too many captures");
cap->capture[level].init = s;
cap->capture[level].len = -1;
cap->level = level+1;
@@ -303,8 +303,8 @@ static const char *start_capt (lua_State *L, const char *s, const char *p,
}
-static const char *end_capt (lua_State *L, const char *s, const char *p,
- struct Capture *cap) {
+static const char *end_capture (lua_State *L, const char *s, const char *p,
+ struct Capture *cap) {
int l = capture_to_close(L, cap);
const char *res;
cap->capture[l].len = s - cap->capture[l].init; /* close capture */
@@ -316,7 +316,7 @@ static const char *end_capt (lua_State *L, const char *s, const char *p,
static const char *match_capture (lua_State *L, const char *s, int level,
struct Capture *cap) {
- int l = check_cap(L, level, cap);
+ int l = check_capture(L, level, cap);
int len = cap->capture[l].len;
if (cap->src_end-s >= len &&
memcmp(cap->capture[l].init, s, len) == 0)
@@ -329,9 +329,9 @@ static const char *match (lua_State *L, const char *s, const char *p, struct Cap
init: /* using goto's to optimize tail recursion */
switch (*p) {
case '(': /* start capture */
- return start_capt(L, s, p, cap);
+ return start_capture(L, s, p, cap);
case ')': /* end capture */
- return end_capt(L, s, p, cap);
+ return end_capture(L, s, p, cap);
case ESC: /* may be %[0-9] or %b */
if (isdigit((unsigned char)(*(p+1)))) { /* capture? */
s = match_capture(L, s, *(p+1), cap);
@@ -444,7 +444,7 @@ static void add_s (lua_State *L, lua_Object newp, struct Capture *cap) {
if (!isdigit((unsigned char)news[i]))
luaL_addchar(L, news[i]);
else {
- int level = check_cap(L, news[i], cap);
+ int level = check_capture(L, news[i], cap);
addnchar(L, cap->capture[level].init, cap->capture[level].len);
}
}
@@ -576,7 +576,7 @@ static void str_format (lua_State *L) {
long l;
const char *s = luaL_check_lstr(L, arg, &l);
if (cap.capture[1].len == 0 && l >= 100) {
- /* no precision and string is too big to be formatted;
+ /* no precision and string is too long to be formatted;
keep original string */
addnchar(L, s, l);
continue; /* skip the "addsize" at the end */
diff --git a/ltable.c b/ltable.c
@@ -1,5 +1,5 @@
/*
-** $Id: ltable.c,v 1.33 1999/12/23 18:19:57 roberto Exp roberto $
+** $Id: ltable.c,v 1.34 2000/02/08 16:34:31 roberto Exp roberto $
** Lua tables (hash)
** See Copyright Notice in lua.h
*/
@@ -32,7 +32,7 @@
-#define TagDefault LUA_T_ARRAY;
+#define TagDefault LUA_T_ARRAY
diff --git a/ltm.c b/ltm.c
@@ -1,5 +1,5 @@
/*
-** $Id: ltm.c,v 1.31 2000/01/19 12:00:45 roberto Exp roberto $
+** $Id: ltm.c,v 1.32 2000/02/22 18:12:46 roberto Exp roberto $
** Tag methods
** See Copyright Notice in lua.h
*/
@@ -147,7 +147,7 @@ void luaT_settagmethod (lua_State *L, int t, const char *event, TObject *func) {
e = luaI_checkevent(L, event, luaT_eventname);
checktag(L, t);
if (!luaT_validevent(t, e))
- luaL_verror(L, "cannot change tag method `%.20s' for type `%.20s'%.20s",
+ luaL_verror(L, "cannot change `%.20s' tag method for type `%.20s'%.20s",
luaT_eventname[e], luaO_typenames[-t],
(t == LUA_T_ARRAY || t == LUA_T_USERDATA) ? " with default tag"
: "");
diff --git a/ltm.h b/ltm.h
@@ -1,5 +1,5 @@
/*
-** $Id: ltm.h,v 1.8 1999/11/22 13:12:07 roberto Exp roberto $
+** $Id: ltm.h,v 1.9 2000/02/22 18:12:46 roberto Exp roberto $
** Tag methods
** See Copyright Notice in lua.h
*/
@@ -30,11 +30,10 @@ typedef enum {
IM_LT,
IM_CONCAT,
IM_GC,
- IM_FUNCTION
+ IM_FUNCTION,
+ IM_N /* number of elements in the enum */
} IMS;
-#define IM_N 15
-
struct IM {
TObject int_method[IM_N];
diff --git a/lua.c b/lua.c
@@ -1,5 +1,5 @@
/*
-** $Id: lua.c,v 1.32 2000/01/19 16:50:14 roberto Exp roberto $
+** $Id: lua.c,v 1.33 2000/02/21 18:30:42 roberto Exp roberto $
** Lua stand-alone interpreter
** See Copyright Notice in lua.h
*/
@@ -87,16 +87,10 @@ static void print_version (void) {
static void assign (char *arg) {
- char buffer[500];
- if (strlen(arg) >= sizeof(buffer))
- fprintf(stderr, "lua: shell argument too long");
- else {
- char *eq = strchr(arg, '=');
- lua_pushstring(eq+1);
- strncpy(buffer, arg, eq-arg);
- buffer[eq-arg] = 0;
- lua_setglobal(buffer);
- }
+ char *eq = strchr(arg, '=');
+ *eq = '\0'; /* spilt `arg' in two strings (name & value) */
+ lua_pushstring(eq+1);
+ lua_setglobal(arg);
}
@@ -139,7 +133,7 @@ static void manual_input (int prompt) {
if (prompt) {
const char *s = lua_getstring(lua_getglobal("_PROMPT"));
if (!s) s = PROMPT;
- printf("%s", s);
+ fputs(s, stdout);
}
for(;;) {
int c = getchar();
@@ -153,7 +147,7 @@ static void manual_input (int prompt) {
else break;
}
else if (i >= BUFSIZ-1) {
- fprintf(stderr, "lua: argument line too long\n");
+ fprintf(stderr, "lua: input line too long\n");
break;
}
else buffer[i++] = (char)c;
@@ -217,9 +211,9 @@ int main (int argc, char *argv[]) {
print_message();
exit(1);
}
- getargs(argc-i, argv+i); /* collect following arguments */
+ getargs(argc-i, argv+i); /* collect remaining arguments */
file_input(argv, i);
- i = argc; /* stop running arguments */
+ i = argc; /* stop scanning arguments */
break;
default:
print_message();
diff --git a/lundump.c b/lundump.c
@@ -1,5 +1,5 @@
/*
-** $Id: lundump.c,v 1.16 1999/12/02 19:11:51 roberto Exp roberto $
+** $Id: lundump.c,v 1.26 2000/02/17 19:17:44 lhf Exp lhf $
** load bytecodes from files
** See Copyright Notice in lua.h
*/
@@ -50,22 +50,13 @@ static unsigned long LoadLong (lua_State* L, ZIO* Z)
return (hi<<16)|lo;
}
-static real LoadNumber (lua_State* L, ZIO* Z, int native)
+static real LoadNumber (lua_State* L, ZIO* Z)
{
- if (native)
- {
- real x;
- LoadBlock(L,&x,sizeof(x),Z);
- return x;
- }
- else
- {
- char b[256];
- int size=ezgetc(L,Z);
- LoadBlock(L,b,size,Z);
- b[size]=0;
- return luaU_str2d(L,b,zname(Z));
- }
+ char b[256];
+ int size=ezgetc(L,Z);
+ LoadBlock(L,b,size,Z);
+ b[size]=0;
+ return luaU_str2d(L,b,zname(Z));
}
static int LoadInt (lua_State* L, ZIO* Z, const char* message)
@@ -76,19 +67,15 @@ static int LoadInt (lua_State* L, ZIO* Z, const char* message)
return i;
}
-#define PAD 5 /* two word operands plus opcode */
-
-static Byte* LoadCode (lua_State* L, ZIO* Z)
+static void LoadCode (lua_State* L, TProtoFunc* tf, ZIO* Z)
{
int size=LoadInt(L,Z,"code too long (%lu bytes) in %.255s");
- Byte* b=luaM_malloc(L,size+PAD);
- LoadBlock(L,b,size,Z);
- if (b[size-1]!=ENDCODE) luaL_verror(L,"bad code in %.255s",zname(Z));
- memset(b+size,ENDCODE,PAD); /* pad code for safety */
- return b;
+ tf->code=luaM_newvector(L,size,Instruction);
+ LoadBlock(L,tf->code,size*sizeof(tf->code[0]),Z);
+ if (tf->code[size-1]!=ENDCODE) luaL_verror(L,"bad code in %.255s",zname(Z));
}
-static TaggedString* LoadTString (lua_State* L, ZIO* Z)
+static TaggedString* LoadString (lua_State* L, ZIO* Z)
{
long size=LoadLong(L,Z);
if (size==0)
@@ -97,7 +84,7 @@ static TaggedString* LoadTString (lua_State* L, ZIO* Z)
{
char* s=luaL_openspace(L,size);
LoadBlock(L,s,size,Z);
- return luaS_newlstr(L,s,size-1);
+ return luaS_newlstr(L,s,size-1); /* remove trailing '\0' */
}
}
@@ -109,7 +96,7 @@ static void LoadLocals (lua_State* L, TProtoFunc* tf, ZIO* Z)
for (i=0; i<n; i++)
{
tf->locvars[i].line=LoadInt(L,Z,"too many lines (%lu) in %.255s");
- tf->locvars[i].varname=LoadTString(L,Z);
+ tf->locvars[i].varname=LoadString(L,Z);
}
tf->locvars[i].line=-1; /* flag end of vector */
tf->locvars[i].varname=NULL;
@@ -119,31 +106,27 @@ static TProtoFunc* LoadFunction (lua_State* L, ZIO* Z, int native);
static void LoadConstants (lua_State* L, TProtoFunc* tf, ZIO* Z, int native)
{
- int i,n=LoadInt(L,Z,"too many constants (%lu) in %.255s");
- tf->nconsts=n;
- if (n==0) return;
- tf->consts=luaM_newvector(L,n,TObject);
- for (i=0; i<n; i++)
+ int i,n;
+ tf->nkstr=n=LoadInt(L,Z,"too many strings (%lu) in %.255s");
+ if (n>0)
{
- TObject* o=tf->consts+i;
- ttype(o)=-ezgetc(L,Z); /* ttype(o) is negative - ORDER LUA_T */
- switch (ttype(o))
- {
- case LUA_T_NUMBER:
- nvalue(o)=LoadNumber(L,Z,native);
- break;
- case LUA_T_STRING:
- tsvalue(o)=LoadTString(L,Z);
- break;
- case LUA_T_LPROTO:
- tfvalue(o)=LoadFunction(L,Z,native);
- break;
- case LUA_T_NIL:
- break;
- default: /* cannot happen */
- luaU_badconstant(L,"load",i,o,tf);
- break;
- }
+ tf->kstr=luaM_newvector(L,n,TaggedString*);
+ for (i=0; i<n; i++) tf->kstr[i]=LoadString(L,Z);
+ }
+ tf->nknum=n=LoadInt(L,Z,"too many numbers (%lu) in %.255s");
+ if (n>0)
+ {
+ tf->knum=luaM_newvector(L,n,real);
+ if (native)
+ LoadBlock(L,tf->knum,n*sizeof(tf->knum[0]),Z);
+ else
+ for (i=0; i<n; i++) tf->knum[i]=LoadNumber(L,Z);
+ }
+ tf->nkproto=n=LoadInt(L,Z,"too many functions (%lu) in %.255s");
+ if (n>0)
+ {
+ tf->kproto=luaM_newvector(L,n,TProtoFunc*);
+ for (i=0; i<n; i++) tf->kproto[i]=LoadFunction(L,Z,native);
}
}
@@ -151,9 +134,12 @@ static TProtoFunc* LoadFunction (lua_State* L, ZIO* Z, int native)
{
TProtoFunc* tf=luaF_newproto(L);
tf->lineDefined=LoadInt(L,Z,"lineDefined too large (%lu) in %.255s");
- tf->source=LoadTString(L,Z);
+ tf->source=LoadString(L,Z);
if (tf->source==NULL) tf->source=luaS_new(L,zname(Z));
- tf->code=LoadCode(L,Z);
+ tf->numparams=LoadInt(L,Z,"numparams too large (%lu) in %.255s");
+ tf->is_vararg=LoadInt(L,Z,"is_vararg too large (%lu) in %.255s");
+ tf->maxstacksize=LoadInt(L,Z,"maxstacksize too large (%lu) in %.255s");
+ LoadCode(L,tf,Z);
LoadLocals(L,tf,Z);
LoadConstants(L,tf,Z,native);
return tf;
@@ -167,6 +153,8 @@ static void LoadSignature (lua_State* L, ZIO* Z)
if (*s!=0) luaL_verror(L,"bad signature in %.255s",zname(Z));
}
+#define V(v) v/16,v%16
+
static int LoadHeader (lua_State* L, ZIO* Z)
{
int version,sizeofR,native;
@@ -174,12 +162,12 @@ static int LoadHeader (lua_State* L, ZIO* Z)
version=ezgetc(L,Z);
if (version>VERSION)
luaL_verror(L,
- "%.255s too new: version=0x%02x; expected at most 0x%02x",
- zname(Z),version,VERSION);
+ "%.255s too new: its version is %d.%d; expected at most %d.%d",
+ zname(Z),V(version),V(VERSION));
if (version<VERSION0) /* check last major change */
luaL_verror(L,
- "%.255s too old: version=0x%02x; expected at least 0x%02x",
- zname(Z),version,VERSION0);
+ "%.255s too old: its version is %d.%d; expected at least %d.%d",
+ zname(Z),V(version),V(VERSION));
sizeofR=ezgetc(L,Z);
native=(sizeofR!=0);
if (native) /* test number representation */
@@ -189,9 +177,9 @@ static int LoadHeader (lua_State* L, ZIO* Z)
zname(Z),sizeofR,(int)sizeof(real));
else
{
- real tf=TEST_NUMBER;
- real f=LoadNumber(L,Z,native);
- if ((long)f!=(long)tf)
+ real f=0,tf=TEST_NUMBER;
+ LoadBlock(L,&f,sizeof(f),Z);
+ if ((long)f!=(long)tf) /* disregard errors in last bit of fraction */
luaL_verror(L,"unknown number format in %.255s: "
"read " NUMBER_FMT "; expected " NUMBER_FMT,
zname(Z),f,tf);
@@ -220,16 +208,6 @@ TProtoFunc* luaU_undump1 (lua_State* L, ZIO* Z)
}
/*
-* handle constants that cannot happen
-*/
-void luaU_badconstant (lua_State* L, const char* s, int i, const TObject* o, const TProtoFunc* tf)
-{
- int t=ttype(o);
- const char* name= (t>0 || t<LUA_T_LINE) ? "?" : luaO_typenames[-t];
- luaL_verror(L,"cannot %.255s constant #%d: type=%d [%s]" IN,s,i,t,name,INLOC);
-}
-
-/*
* convert number from text
*/
double luaU_str2d (lua_State* L, const char* b, const char* where)
diff --git a/lundump.h b/lundump.h
@@ -1,5 +1,5 @@
/*
-** $Id: lundump.h,v 1.17 1999/12/02 18:51:09 lhf Exp $
+** $Id: lundump.h,v 1.18 2000/01/28 17:51:09 lhf Exp $
** load pre-compiled Lua chunks
** See Copyright Notice in lua.h
*/
@@ -27,6 +27,7 @@ double luaU_str2d (lua_State* L, const char* b, const char* where);
#define SIGNATURE "Lua" /* ...followed by this signature */
/* formats for error messages */
+#define xSOURCE "<%d:%.255s>"
#define SOURCE "<%.255s:%d>"
#define IN " in %p " SOURCE
#define INLOC tf,tf->source->str,tf->lineDefined
diff --git a/lvm.c b/lvm.c
@@ -1,5 +1,5 @@
/*
-** $Id: lvm.c,v 1.88 2000/02/22 13:31:30 roberto Exp roberto $
+** $Id: lvm.c,v 1.89 2000/02/22 18:12:46 roberto Exp roberto $
** Lua virtual machine
** See Copyright Notice in lua.h
*/
@@ -30,8 +30,6 @@
#endif
-#define highbyte(L, x) ((x)<<8)
-
/*
** Extra stack size to run a function:
@@ -106,7 +104,7 @@ void luaV_closure (lua_State *L, int nelems) {
void luaV_gettable (lua_State *L, StkId top) {
TObject *table = top-2;
const TObject *im;
- if (ttype(table) != LUA_T_ARRAY) { /* not a table, get gettable method */
+ if (ttype(table) != LUA_T_ARRAY) { /* not a table, get gettable TM */
im = luaT_getimbyObj(L, table, IM_GETTABLE);
if (ttype(im) == LUA_T_NIL) {
L->top = top;
@@ -116,7 +114,7 @@ void luaV_gettable (lua_State *L, StkId top) {
else { /* object is a table... */
int tg = table->value.a->htag;
im = luaT_getim(L, tg, IM_GETTABLE);
- if (ttype(im) == LUA_T_NIL) { /* and does not have a `gettable' method */
+ if (ttype(im) == LUA_T_NIL) { /* and does not have a `gettable' TM */
const TObject *h = luaH_get(L, avalue(table), table+1);
if (ttype(h) == LUA_T_NIL &&
(ttype(im=luaT_getim(L, tg, IM_INDEX)) != LUA_T_NIL)) {
@@ -128,9 +126,9 @@ void luaV_gettable (lua_State *L, StkId top) {
*table = *h; /* `push' result into table position */
return;
}
- /* else it has a `gettable' method, go through to next command */
+ /* else it has a `gettable' TM, go through to next command */
}
- /* object is not a table, or it has a `gettable' method */
+ /* object is not a table, or it has a `gettable' TM */
L->top = top;
luaD_callTM(L, im, 2, 1);
}
@@ -261,7 +259,7 @@ int luaV_lessthan (lua_State *L, TObject *l, TObject *r) {
else if (ttype(l) == LUA_T_STRING && ttype(r) == LUA_T_STRING)
return (luaV_strcomp(tsvalue(l), tsvalue(r)) < 0);
else {
- /* update top and put arguments in correct order to call Tag Method */
+ /* update top and put arguments in correct order to call TM */
if (l<r) /* are arguments in correct order? */
L->top = r+1; /* yes; 2nd is on top */
else { /* no; exchange them */
@@ -562,7 +560,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf,
call_arith(L, top+1, IM_UNM);
}
else
- nvalue(top-1) = - nvalue(top-1);
+ nvalue(top-1) = -nvalue(top-1);
break;
case NOTOP:
diff --git a/lvm.h b/lvm.h
@@ -1,5 +1,5 @@
/*
-** $Id: lvm.h,v 1.15 2000/01/24 20:14:07 roberto Exp roberto $
+** $Id: lvm.h,v 1.16 2000/02/22 18:12:46 roberto Exp roberto $
** Lua virtual machine
** See Copyright Notice in lua.h
*/
@@ -13,8 +13,8 @@
#include "ltm.h"
-#define tonumber(o) ((ttype(o) != LUA_T_NUMBER) && (luaV_tonumber(o) != 0))
-#define tostring(L, o) ((ttype(o) != LUA_T_STRING) && (luaV_tostring(L, o) != 0))
+#define tonumber(o) ((ttype(o) != LUA_T_NUMBER) && (luaV_tonumber(o) != 0))
+#define tostring(L,o) ((ttype(o) != LUA_T_STRING) && (luaV_tostring(L, o) != 0))
void luaV_pack (lua_State *L, StkId firstel, int nvararg, TObject *tab);
diff --git a/lzio.c b/lzio.c
@@ -1,5 +1,5 @@
/*
-** $Id: lzio.c,v 1.9 1999/11/09 17:59:35 roberto Exp roberto $
+** $Id: lzio.c,v 1.10 2000/02/08 16:39:42 roberto Exp roberto $
** a generic input stream interface
** See Copyright Notice in lua.h
*/
@@ -24,7 +24,7 @@ static int zmfilbuf (ZIO* z) {
ZIO* zmopen (ZIO* z, const char* b, int size, const char *name) {
if (b==NULL) return NULL;
z->n = size;
- z->p = (unsigned const char *)b;
+ z->p = (const unsigned char *)b;
z->filbuf = zmfilbuf;
z->u = NULL;
z->name = name;
@@ -69,7 +69,7 @@ int zread (ZIO *z, void *b, int n) {
if (z->n == 0) {
if (z->filbuf(z) == EOZ)
return n; /* return number of missing bytes */
- zungetc(z); /* put result from 'filbuf' in the buffer */
+ zungetc(z); /* put result from `filbuf' in the buffer */
}
m = (n <= z->n) ? n : z->n; /* min. between n and z->n */
memcpy(b, z->p, m);