176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** $Id: lbaselib.c,v 1.276.1.1 2013/04/12 18:48:47 roberto Exp $ 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** Basic library 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** See Copyright Notice in lua.h 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <ctype.h> 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h> 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h> 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define lbaselib_c 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define LUA_LIB 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lua.h" 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lauxlib.h" 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lualib.h" 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_print (lua_State *L) { 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int n = lua_gettop(L); /* number of arguments */ 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i; 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_getglobal(L, "tostring"); 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (i=1; i<=n; i++) { 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *s; 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman size_t l; 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushvalue(L, -1); /* function to be called */ 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushvalue(L, i); /* value to print */ 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_call(L, 1, 1); 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman s = lua_tolstring(L, -1, &l); /* get result */ 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (s == NULL) 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return luaL_error(L, 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LUA_QL("tostring") " must return a string to " LUA_QL("print")); 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (i>1) luai_writestring("\t", 1); 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luai_writestring(s, l); 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pop(L, 1); /* pop result */ 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luai_writeline(); 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SPACECHARS " \f\n\r\t\v" 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_tonumber (lua_State *L) { 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (lua_isnoneornil(L, 2)) { /* standard conversion */ 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int isnum; 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_Number n = lua_tonumberx(L, 1, &isnum); 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isnum) { 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushnumber(L, n); 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } /* else not a number; must be something */ 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 1); 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman size_t l; 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *s = luaL_checklstring(L, 1, &l); 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *e = s + l; /* end point for 's' */ 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int base = luaL_checkint(L, 2); 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int neg = 0; 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman s += strspn(s, SPACECHARS); /* skip initial spaces */ 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (*s == '-') { s++; neg = 1; } /* handle signal */ 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (*s == '+') s++; 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (isalnum((unsigned char)*s)) { 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_Number n = 0; 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman do { 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int digit = (isdigit((unsigned char)*s)) ? *s - '0' 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : toupper((unsigned char)*s) - 'A' + 10; 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (digit >= base) break; /* invalid numeral; force a fail */ 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman n = n * (lua_Number)base + (lua_Number)digit; 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman s++; 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } while (isalnum((unsigned char)*s)); 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman s += strspn(s, SPACECHARS); /* skip trailing spaces */ 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (s == e) { /* no invalid trailing characters? */ 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushnumber(L, (neg) ? -n : n); 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } /* else not a number */ 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } /* else not a number */ 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushnil(L); /* not a number */ 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_error (lua_State *L) { 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int level = luaL_optint(L, 2, 1); 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_settop(L, 1); 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (lua_isstring(L, 1) && level > 0) { /* add extra information? */ 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_where(L, level); 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushvalue(L, 1); 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_concat(L, 2); 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return lua_error(L); 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_getmetatable (lua_State *L) { 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 1); 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!lua_getmetatable(L, 1)) { 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushnil(L); 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; /* no metatable */ 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_getmetafield(L, 1, "__metatable"); 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; /* returns either __metatable field (if present) or metatable */ 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_setmetatable (lua_State *L) { 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int t = lua_type(L, 2); 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checktype(L, 1, LUA_TTABLE); 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "nil or table expected"); 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (luaL_getmetafield(L, 1, "__metatable")) 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return luaL_error(L, "cannot change a protected metatable"); 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_settop(L, 2); 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_setmetatable(L, 1); 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_rawequal (lua_State *L) { 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 1); 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 2); 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushboolean(L, lua_rawequal(L, 1, 2)); 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_rawlen (lua_State *L) { 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int t = lua_type(L, 1); 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_argcheck(L, t == LUA_TTABLE || t == LUA_TSTRING, 1, 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "table or string expected"); 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushinteger(L, lua_rawlen(L, 1)); 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_rawget (lua_State *L) { 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checktype(L, 1, LUA_TTABLE); 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 2); 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_settop(L, 2); 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_rawget(L, 1); 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_rawset (lua_State *L) { 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checktype(L, 1, LUA_TTABLE); 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 2); 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 3); 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_settop(L, 3); 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_rawset(L, 1); 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_collectgarbage (lua_State *L) { 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const char *const opts[] = {"stop", "restart", "collect", 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "count", "step", "setpause", "setstepmul", 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "setmajorinc", "isrunning", "generational", "incremental", NULL}; 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL, 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman LUA_GCSETMAJORINC, LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC}; 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int o = optsnum[luaL_checkoption(L, 1, "collect", opts)]; 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int ex = luaL_optint(L, 2, 0); 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int res = lua_gc(L, o, ex); 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (o) { 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCCOUNT: { 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int b = lua_gc(L, LUA_GCCOUNTB, 0); 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushnumber(L, res + ((lua_Number)b/1024)); 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushinteger(L, b); 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 2; 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case LUA_GCSTEP: case LUA_GCISRUNNING: { 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushboolean(L, res); 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: { 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushinteger(L, res); 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_type (lua_State *L) { 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 1); 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushstring(L, luaL_typename(L, 1)); 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int pairsmeta (lua_State *L, const char *method, int iszero, 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_CFunction iter) { 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!luaL_getmetafield(L, 1, method)) { /* no metamethod? */ 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checktype(L, 1, LUA_TTABLE); /* argument must be a table */ 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushcfunction(L, iter); /* will return generator, */ 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushvalue(L, 1); /* state, */ 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (iszero) lua_pushinteger(L, 0); /* and initial value */ 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else lua_pushnil(L); 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushvalue(L, 1); /* argument 'self' to metamethod */ 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_call(L, 1, 3); /* get 3 values from metamethod */ 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 3; 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_next (lua_State *L) { 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checktype(L, 1, LUA_TTABLE); 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_settop(L, 2); /* create a 2nd argument if there isn't one */ 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (lua_next(L, 1)) 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 2; 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushnil(L); 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_pairs (lua_State *L) { 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return pairsmeta(L, "__pairs", 0, luaB_next); 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int ipairsaux (lua_State *L) { 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i = luaL_checkint(L, 2); 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checktype(L, 1, LUA_TTABLE); 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i++; /* next value */ 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushinteger(L, i); 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_rawgeti(L, 1, i); 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return (lua_isnil(L, -1)) ? 1 : 2; 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_ipairs (lua_State *L) { 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return pairsmeta(L, "__ipairs", 1, ipairsaux); 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int load_aux (lua_State *L, int status, int envidx) { 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (status == LUA_OK) { 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (envidx != 0) { /* 'env' parameter? */ 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushvalue(L, envidx); /* environment for loaded function */ 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!lua_setupvalue(L, -2, 1)) /* set it as 1st upvalue */ 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pop(L, 1); /* remove 'env' if not used by previous call */ 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { /* error (message is on top of the stack) */ 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushnil(L); 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_insert(L, -2); /* put before error message */ 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 2; /* return nil plus error message */ 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_loadfile (lua_State *L) { 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *fname = luaL_optstring(L, 1, NULL); 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *mode = luaL_optstring(L, 2, NULL); 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int env = (!lua_isnone(L, 3) ? 3 : 0); /* 'env' index or 0 if no 'env' */ 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int status = luaL_loadfilex(L, fname, mode); 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return load_aux(L, status, env); 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** {====================================================== 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** Generic Read function 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** ======================================================= 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** reserved slot, above all arguments, to hold a copy of the returned 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** string to avoid it being collected while parsed. 'load' has four 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** optional arguments (chunk, source name, mode, and environment). 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define RESERVEDSLOT 5 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** Reader for generic `load' function: `lua_load' uses the 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** stack for internal stuff, so the reader cannot change the 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** stack top. Instead, it keeps its resulting string in a 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman** reserved slot inside the stack. 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic const char *generic_reader (lua_State *L, void *ud, size_t *size) { 29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (void)(ud); /* not used */ 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkstack(L, 2, "too many nested functions"); 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushvalue(L, 1); /* get function */ 29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_call(L, 0, 1); /* call it */ 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (lua_isnil(L, -1)) { 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pop(L, 1); /* pop result */ 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *size = 0; 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return NULL; 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (!lua_isstring(L, -1)) 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_error(L, "reader function must return a string"); 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */ 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return lua_tolstring(L, RESERVEDSLOT, size); 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_load (lua_State *L) { 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int status; 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman size_t l; 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *s = lua_tolstring(L, 1, &l); 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *mode = luaL_optstring(L, 3, "bt"); 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int env = (!lua_isnone(L, 4) ? 4 : 0); /* 'env' index or 0 if no 'env' */ 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (s != NULL) { /* loading a string? */ 31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *chunkname = luaL_optstring(L, 2, s); 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = luaL_loadbufferx(L, s, l, chunkname, mode); 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { /* loading from a reader function */ 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *chunkname = luaL_optstring(L, 2, "=(load)"); 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checktype(L, 1, LUA_TFUNCTION); 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_settop(L, RESERVEDSLOT); /* create reserved slot */ 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = lua_load(L, generic_reader, NULL, chunkname, mode); 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return load_aux(L, status, env); 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* }====================================================== */ 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int dofilecont (lua_State *L) { 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return lua_gettop(L) - 1; 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_dofile (lua_State *L) { 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *fname = luaL_optstring(L, 1, NULL); 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_settop(L, 1); 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (luaL_loadfile(L, fname) != LUA_OK) 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return lua_error(L); 34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_callk(L, 0, LUA_MULTRET, 0, dofilecont); 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return dofilecont(L); 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_assert (lua_State *L) { 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!lua_toboolean(L, 1)) 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!")); 34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return lua_gettop(L); 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_select (lua_State *L) { 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int n = lua_gettop(L); 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushinteger(L, n-1); 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else { 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i = luaL_checkint(L, 1); 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (i < 0) i = n + i; 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else if (i > n) i = n; 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_argcheck(L, 1 <= i, 1, "index out of range"); 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return n - i; 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int finishpcall (lua_State *L, int status) { 37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!lua_checkstack(L, 1)) { /* no space for extra boolean? */ 37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_settop(L, 0); /* create space for return values */ 37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushboolean(L, 0); 37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushstring(L, "stack overflow"); 37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 2; /* return false, msg */ 37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushboolean(L, status); /* first result (status) */ 37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_replace(L, 1); /* put first result in first slot */ 37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return lua_gettop(L); 37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int pcallcont (lua_State *L) { 38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int status = lua_getctx(L, NULL); 38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return finishpcall(L, (status == LUA_YIELD)); 38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_pcall (lua_State *L) { 38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int status; 39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 1); 39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushnil(L); 39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_insert(L, 1); /* create space for status result */ 39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, pcallcont); 39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return finishpcall(L, (status == LUA_OK)); 39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_xpcall (lua_State *L) { 39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int status; 40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int n = lua_gettop(L); 40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_argcheck(L, n >= 2, 2, "value expected"); 40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushvalue(L, 1); /* exchange function... */ 40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_copy(L, 2, 1); /* ...and error handler */ 40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_replace(L, 2); 40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman status = lua_pcallk(L, n - 2, LUA_MULTRET, 1, 0, pcallcont); 40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return finishpcall(L, (status == LUA_OK)); 40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int luaB_tostring (lua_State *L) { 41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_checkany(L, 1); 41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_tolstring(L, 1, NULL); 41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic const luaL_Reg base_funcs[] = { 41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"assert", luaB_assert}, 41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"collectgarbage", luaB_collectgarbage}, 42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"dofile", luaB_dofile}, 42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"error", luaB_error}, 42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"getmetatable", luaB_getmetatable}, 42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"ipairs", luaB_ipairs}, 42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"loadfile", luaB_loadfile}, 42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"load", luaB_load}, 42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if defined(LUA_COMPAT_LOADSTRING) 42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"loadstring", luaB_load}, 42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"next", luaB_next}, 43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"pairs", luaB_pairs}, 43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"pcall", luaB_pcall}, 43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"print", luaB_print}, 43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"rawequal", luaB_rawequal}, 43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"rawlen", luaB_rawlen}, 43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"rawget", luaB_rawget}, 43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"rawset", luaB_rawset}, 43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"select", luaB_select}, 43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"setmetatable", luaB_setmetatable}, 43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"tonumber", luaB_tonumber}, 44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"tostring", luaB_tostring}, 44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"type", luaB_type}, 44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {"xpcall", luaB_xpcall}, 44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman {NULL, NULL} 44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 44776d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLUAMOD_API int luaopen_base (lua_State *L) { 44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* set global _G */ 44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushglobaltable(L); 45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushglobaltable(L); 45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_setfield(L, -2, "_G"); 45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* open lib into global table */ 45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman luaL_setfuncs(L, base_funcs, 0); 45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_pushliteral(L, LUA_VERSION); 45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lua_setfield(L, -2, "_VERSION"); /* set global _VERSION */ 45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 1; 45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 459