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