From 26c5f56ad1ac6f0409e638f44af75da09f2b0a0b Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Tue, 16 Sep 1997 16:25:59 -0300 Subject: Built-in functions --- lbuiltin.c | 404 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 404 insertions(+) create mode 100644 lbuiltin.c (limited to 'lbuiltin.c') 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