From 26c5f56ad1ac6f0409e638f44af75da09f2b0a0b Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 16 Sep 1997 16:25:59 -0300 Subject: [PATCH] Built-in functions --- inout.c | 405 ----------------------------------------------------- inout.h | 26 ---- lbuiltin.c | 404 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lbuiltin.h | 14 ++ 4 files changed, 418 insertions(+), 431 deletions(-) delete mode 100644 inout.c delete mode 100644 inout.h create mode 100644 lbuiltin.c create mode 100644 lbuiltin.h diff --git a/inout.c b/inout.c deleted file mode 100644 index 0a05c9c4..00000000 --- a/inout.c +++ /dev/null @@ -1,405 +0,0 @@ -/* -** 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 2.71 1997/07/29 13:33:15 roberto Exp roberto $"; - -#include -#include - -#include "auxlib.h" -#include "fallback.h" -#include "hash.h" -#include "inout.h" -#include "lex.h" -#include "lua.h" -#include "luamem.h" -#include "luamem.h" -#include "opcode.h" -#include "table.h" -#include "tree.h" -#include "undump.h" -#include "zio.h" - - -/* Exported variables */ -Word lua_linenumber; -TaggedString *lua_parsedfile; - - -char *luaI_typenames[] = { /* ORDER LUA_T */ - "userdata", "line", "cmark", "mark", "function", - "function", "table", "string", "number", "nil", - NULL -}; - - - -void luaI_setparsedfile (char *name) -{ - lua_parsedfile = luaI_createstring(name); -} - - -int lua_doFILE (FILE *f, int bin) -{ - ZIO z; - luaZ_Fopen(&z, f); - if (bin) - return luaI_undump(&z); - else { - lua_setinput(&z); - return lua_domain(); - } -} - - -int lua_dofile (char *filename) -{ - int status; - int c; - FILE *f = (filename == NULL) ? stdin : fopen(filename, "r"); - if (f == NULL) - return 2; - luaI_setparsedfile(filename?filename:"(stdin)"); - c = fgetc(f); - ungetc(c, f); - if (c == ID_CHUNK) { - f = freopen(filename, "rb", f); /* set binary mode */ - status = lua_doFILE(f, 1); - } - else - status = lua_doFILE(f, 0); - if (f != stdin) - fclose(f); - return status; -} - - - -#define SIZE_PREF 20 /* size of string prefix to appear in error messages */ - - -int lua_dobuffer (char *buff, int size) -{ - int status; - ZIO z; - luaI_setparsedfile("(buffer)"); - luaZ_mopen(&z, buff, size); - status = luaI_undump(&z); - return status; -} - - -int lua_dostring (char *str) -{ - int status; - char buff[SIZE_PREF+25]; - char *temp; - ZIO z; - if (str == NULL) return 1; - sprintf(buff, "(dostring) >> %.20s", str); - temp = strchr(buff, '\n'); - if (temp) *temp = 0; /* end string after first line */ - luaI_setparsedfile(buff); - luaZ_sopen(&z, str); - lua_setinput(&z); - status = lua_domain(); - return status; -} - - - - -static int passresults (void) -{ - int arg = 0; - lua_Object obj; - while ((obj = lua_getresult(++arg)) != LUA_NOOBJECT) - lua_pushobject(obj); - return arg-1; -} - - -static void packresults (void) -{ - int arg = 0; - lua_Object obj; - lua_Object table = lua_createtable(); - while ((obj = lua_getresult(++arg)) != LUA_NOOBJECT) { - lua_pushobject(table); - lua_pushnumber(arg); - lua_pushobject(obj); - lua_rawsettable(); - } - lua_pushobject(table); - lua_pushstring("n"); - lua_pushnumber(arg-1); - lua_rawsettable(); - lua_pushobject(table); /* final result */ -} - -/* -** Internal function: do a string -*/ -static void lua_internaldostring (void) -{ - lua_Object err = lua_getparam(2); - if (err != LUA_NOOBJECT) { /* set new error method */ - luaL_arg_check(lua_isnil(err) || lua_isfunction(err), 2, - "must be a valid error handler"); - lua_pushobject(err); - err = lua_seterrormethod(); - } - if (lua_dostring(luaL_check_string(1)) == 0) - if (passresults() == 0) - lua_pushuserdata(NULL); /* at least one result to signal no errors */ - if (err != LUA_NOOBJECT) { /* restore old error method */ - lua_pushobject(err); - lua_seterrormethod(); - } -} - -/* -** Internal function: do a file -*/ -static void lua_internaldofile (void) -{ - char *fname = luaL_opt_string(1, NULL); - if (lua_dofile(fname) == 0) - if (passresults() == 0) - lua_pushuserdata(NULL); /* at least one result to signal no errors */ -} - - -static char *tostring (lua_Object obj) -{ - TObject *o = luaI_Address(obj); - switch (ttype(o)) { - case LUA_T_NUMBER: case LUA_T_STRING: - return lua_getstring(obj); - case LUA_T_ARRAY: case LUA_T_FUNCTION: - case LUA_T_CFUNCTION: case LUA_T_NIL: - return luaI_typenames[-ttype(o)]; - case LUA_T_USERDATA: { - char *buff = luaI_buffer(30); - sprintf(buff, "userdata: %p", o->value.ts->u.v); - return buff; - } - default: return ""; - } -} - -static void luaI_tostring (void) -{ - lua_pushstring(tostring(lua_getparam(1))); -} - -static void luaI_print (void) -{ - int i = 1; - lua_Object obj; - while ((obj = lua_getparam(i++)) != LUA_NOOBJECT) - printf("%s\n", tostring(obj)); -} - -static void luaI_type (void) -{ - lua_Object o = lua_getparam(1); - luaL_arg_check(o != LUA_NOOBJECT, 1, "no argument"); - lua_pushstring(luaI_typenames[-ttype(luaI_Address(o))]); - lua_pushnumber(lua_tag(o)); -} - -/* -** Internal function: convert an object to a number -*/ -static void lua_obj2number (void) -{ - lua_Object o = lua_getparam(1); - if (lua_isnumber(o)) - lua_pushnumber(lua_getnumber(o)); -} - - -static void luaI_error (void) -{ - char *s = lua_getstring(lua_getparam(1)); - if (s == NULL) s = "(no message)"; - lua_error(s); -} - -static void luaI_assert (void) -{ - lua_Object p = lua_getparam(1); - if (p == LUA_NOOBJECT || lua_isnil(p)) - lua_error("assertion failed!"); -} - -static void luaI_setglobal (void) -{ - lua_Object value = lua_getparam(2); - luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); - lua_pushobject(value); - lua_setglobal(luaL_check_string(1)); - lua_pushobject(value); /* return given value */ -} - -static void luaI_rawsetglobal (void) -{ - lua_Object value = lua_getparam(2); - luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); - lua_pushobject(value); - lua_rawsetglobal(luaL_check_string(1)); - lua_pushobject(value); /* return given value */ -} - -static void luaI_getglobal (void) -{ - lua_pushobject(lua_getglobal(luaL_check_string(1))); -} - -static void luaI_rawgetglobal (void) -{ - lua_pushobject(lua_rawgetglobal(luaL_check_string(1))); -} - -static void luatag (void) -{ - lua_pushnumber(lua_tag(lua_getparam(1))); -} - - -static int getnarg (lua_Object table) -{ - lua_Object temp; - /* temp = table.n */ - lua_pushobject(table); lua_pushstring("n"); temp = lua_gettable(); - return (lua_isnumber(temp) ? lua_getnumber(temp) : MAX_WORD); -} - -static void luaI_call (void) -{ - lua_Object f = lua_getparam(1); - lua_Object arg = lua_getparam(2); - int withtable = (strcmp(luaL_opt_string(3, ""), "pack") == 0); - int narg, i; - luaL_arg_check(lua_isfunction(f), 1, "function expected"); - luaL_arg_check(lua_istable(arg), 2, "table expected"); - narg = getnarg(arg); - /* push arg[1...n] */ - for (i=0; i - - -extern Word lua_linenumber; -extern Word lua_debugline; -extern TaggedString *lua_parsedfile; - -void luaI_setparsedfile (char *name); - -void luaI_predefine (void); - -int lua_dobuffer (char *buff, int size); -int lua_doFILE (FILE *f, int bin); - - -#endif diff --git a/lbuiltin.c b/lbuiltin.c new file mode 100644 index 00000000..eeb3daf8 --- /dev/null +++ b/lbuiltin.c @@ -0,0 +1,404 @@ +/* +** $Id: $ +** Built-in functions +** See Copyright Notice in lua.h +*/ + + +#include + +#include "lapi.h" +#include "lauxlib.h" +#include "lbuiltin.h" +#include "lglobal.h" +#include "lmem.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lua.h" + + +static void nextvar (void) +{ + int i = luaG_nextvar(lua_isnil(lua_getparam(1)) ? 0 : + luaG_findsymbolbyname(luaL_check_string(1))+1); + if (i >= 0) { + lua_pushstring(luaG_global[i].varname->str); + luaA_pushobject(&s_object(i)); + } +} + + +static void next (void) +{ + lua_Object o = lua_getparam(1); + lua_Object r = lua_getparam(2); + Node *n; + luaL_arg_check(lua_istable(o), 1, "table expected"); + luaL_arg_check(r != LUA_NOOBJECT, 2, "value expected"); + n = luaH_next(luaA_Address(o), luaA_Address(r)); + if (n) { + luaA_pushobject(&n->ref); + luaA_pushobject(&n->val); + } +} + + +static void internaldostring (void) +{ + lua_Object err = lua_getparam(2); + if (err != LUA_NOOBJECT) { /* set new error method */ + lua_pushobject(err); + err = lua_seterrormethod(); + } + if (lua_dostring(luaL_check_string(1)) == 0) + if (luaA_passresults() == 0) + lua_pushuserdata(NULL); /* at least one result to signal no errors */ + if (err != LUA_NOOBJECT) { /* restore old error method */ + lua_pushobject(err); + lua_seterrormethod(); + } +} + + +static void internaldofile (void) +{ + char *fname = luaL_opt_string(1, NULL); + if (lua_dofile(fname) == 0) + if (luaA_passresults() == 0) + lua_pushuserdata(NULL); /* at least one result to signal no errors */ +} + + +static char *to_string (lua_Object obj) +{ + char *buff = luaM_buffer(30); + TObject *o = luaA_Address(obj); + switch (ttype(o)) { + case LUA_T_NUMBER: case LUA_T_STRING: + return lua_getstring(obj); + case LUA_T_ARRAY: { + sprintf(buff, "table: %p", o->value.a); + return buff; + } + case LUA_T_FUNCTION: { + sprintf(buff, "function: %p", o->value.cl); + return buff; + } + case LUA_T_CFUNCTION: { + sprintf(buff, "cfunction: %p", o->value.f); + return buff; + } + case LUA_T_USERDATA: { + sprintf(buff, "userdata: %p", o->value.ts->u.v); + return buff; + } + case LUA_T_NIL: + return "nil"; + default: return ""; + } +} + +static void bi_tostring (void) +{ + lua_pushstring(to_string(lua_getparam(1))); +} + + +static void luaI_print (void) +{ + int i = 1; + lua_Object obj; + while ((obj = lua_getparam(i++)) != LUA_NOOBJECT) + printf("%s\n", to_string(obj)); +} + + +static void luaI_type (void) +{ + lua_Object o = lua_getparam(1); + luaL_arg_check(o != LUA_NOOBJECT, 1, "no argument"); + lua_pushstring(luaO_typenames[-ttype(luaA_Address(o))]); + lua_pushnumber(lua_tag(o)); +} + + +static void lua_obj2number (void) +{ + lua_Object o = lua_getparam(1); + if (lua_isnumber(o)) + lua_pushnumber(lua_getnumber(o)); +} + + +static void luaI_error (void) +{ + char *s = lua_getstring(lua_getparam(1)); + if (s == NULL) s = "(no message)"; + lua_error(s); +} + + +static void luaI_assert (void) +{ + lua_Object p = lua_getparam(1); + if (p == LUA_NOOBJECT || lua_isnil(p)) + lua_error("assertion failed!"); +} + + +static void setglobal (void) +{ + lua_Object value = lua_getparam(2); + luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); + lua_pushobject(value); + lua_setglobal(luaL_check_string(1)); + lua_pushobject(value); /* return given value */ +} + +static void rawsetglobal (void) +{ + lua_Object value = lua_getparam(2); + luaL_arg_check(value != LUA_NOOBJECT, 2, NULL); + lua_pushobject(value); + lua_rawsetglobal(luaL_check_string(1)); + lua_pushobject(value); /* return given value */ +} + +static void getglobal (void) +{ + lua_pushobject(lua_getglobal(luaL_check_string(1))); +} + +static void rawgetglobal (void) +{ + lua_pushobject(lua_rawgetglobal(luaL_check_string(1))); +} + +static void luatag (void) +{ + lua_pushnumber(lua_tag(lua_getparam(1))); +} + + +static int getnarg (lua_Object table) +{ + lua_Object temp; + /* temp = table.n */ + lua_pushobject(table); lua_pushstring("n"); temp = lua_gettable(); + return (lua_isnumber(temp) ? lua_getnumber(temp) : MAX_WORD); +} + +static void luaI_call (void) +{ + lua_Object f = lua_getparam(1); + lua_Object arg = lua_getparam(2); + int withtable = (strcmp(luaL_opt_string(3, ""), "pack") == 0); + int narg, i; + luaL_arg_check(lua_isfunction(f), 1, "function expected"); + luaL_arg_check(lua_istable(arg), 2, "table expected"); + narg = getnarg(arg); + /* push arg[1...n] */ + for (i=0; i