/* ** $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