⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lbaselib.c

📁 Lua 语言解释器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*** $Id: lbaselib.c,v 1.130b 2003/04/03 13:35:34 roberto Exp $** Basic library** See Copyright Notice in lua.h*/#include <ctype.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define lbaselib_c#include "lua.h"#include "lauxlib.h"#include "lualib.h"/*** If your system does not support `stdout', you can just remove this function.** If you need, you can define your own `print' function, following this** model but changing `fputs' to put the strings at a proper place** (a console window or a log file, for instance).*/static int luaB_print (lua_State *L) {  int n = lua_gettop(L);  /* number of arguments */  int i;  lua_getglobal(L, "tostring");  for (i=1; i<=n; i++) {    const char *s;    lua_pushvalue(L, -1);  /* function to be called */    lua_pushvalue(L, i);   /* value to print */    lua_call(L, 1, 1);    s = lua_tostring(L, -1);  /* get result */    if (s == NULL)      return luaL_error(L, "`tostring' must return a string to `print'");    if (i>1) fputs("\t", stdout);    fputs(s, stdout);    lua_pop(L, 1);  /* pop result */  }  fputs("\n", stdout);  return 0;}static int luaB_tonumber (lua_State *L) {  int base = luaL_optint(L, 2, 10);  if (base == 10) {  /* standard conversion */    luaL_checkany(L, 1);    if (lua_isnumber(L, 1)) {      lua_pushnumber(L, lua_tonumber(L, 1));      return 1;    }  }  else {    const char *s1 = luaL_checkstring(L, 1);    char *s2;    unsigned long n;    luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");    n = strtoul(s1, &s2, base);    if (s1 != s2) {  /* at least one valid digit? */      while (isspace((unsigned char)(*s2))) s2++;  /* skip trailing spaces */      if (*s2 == '\0') {  /* no invalid trailing characters? */        lua_pushnumber(L, (lua_Number)n);        return 1;      }    }  }  lua_pushnil(L);  /* else not a number */  return 1;}static int luaB_error (lua_State *L) {  int level = luaL_optint(L, 2, 1);  luaL_checkany(L, 1);  if (!lua_isstring(L, 1) || level == 0)    lua_pushvalue(L, 1);  /* propagate error message without changes */  else {  /* add extra information */    luaL_where(L, level);    lua_pushvalue(L, 1);    lua_concat(L, 2);  }  return lua_error(L);}static int luaB_getmetatable (lua_State *L) {  luaL_checkany(L, 1);  if (!lua_getmetatable(L, 1)) {    lua_pushnil(L);    return 1;  /* no metatable */  }  luaL_getmetafield(L, 1, "__metatable");  return 1;  /* returns either __metatable field (if present) or metatable */}static int luaB_setmetatable (lua_State *L) {  int t = lua_type(L, 2);  luaL_checktype(L, 1, LUA_TTABLE);  luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2,                    "nil or table expected");  if (luaL_getmetafield(L, 1, "__metatable"))    luaL_error(L, "cannot change a protected metatable");  lua_settop(L, 2);  lua_setmetatable(L, 1);  return 1;}static void getfunc (lua_State *L) {  if (lua_isfunction(L, 1)) lua_pushvalue(L, 1);  else {    lua_Debug ar;    int level = luaL_optint(L, 1, 1);    luaL_argcheck(L, level >= 0, 1, "level must be non-negative");    if (lua_getstack(L, level, &ar) == 0)      luaL_argerror(L, 1, "invalid level");    lua_getinfo(L, "f", &ar);    if (lua_isnil(L, -1))      luaL_error(L, "no function environment for tail call at level %d",                    level);  }}static int aux_getfenv (lua_State *L) {  lua_getfenv(L, -1);  lua_pushliteral(L, "__fenv");  lua_rawget(L, -2);  return !lua_isnil(L, -1);}static int luaB_getfenv (lua_State *L) {  getfunc(L);  if (!aux_getfenv(L))  /* __fenv not defined? */    lua_pop(L, 1);  /* remove it, to return real environment */  return 1;}static int luaB_setfenv (lua_State *L) {  luaL_checktype(L, 2, LUA_TTABLE);  getfunc(L);  if (aux_getfenv(L))  /* __fenv defined? */    luaL_error(L, "`setfenv' cannot change a protected environment");  else    lua_pop(L, 2);  /* remove __fenv and real environment table */  lua_pushvalue(L, 2);  if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0)    lua_replace(L, LUA_GLOBALSINDEX);  else if (lua_setfenv(L, -2) == 0)    luaL_error(L, "`setfenv' cannot change environment of given function");  return 0;}static int luaB_rawequal (lua_State *L) {  luaL_checkany(L, 1);  luaL_checkany(L, 2);  lua_pushboolean(L, lua_rawequal(L, 1, 2));  return 1;}static int luaB_rawget (lua_State *L) {  luaL_checktype(L, 1, LUA_TTABLE);  luaL_checkany(L, 2);  lua_rawget(L, 1);  return 1;}static int luaB_rawset (lua_State *L) {  luaL_checktype(L, 1, LUA_TTABLE);  luaL_checkany(L, 2);  luaL_checkany(L, 3);  lua_rawset(L, 1);  return 1;}static int luaB_gcinfo (lua_State *L) {  lua_pushnumber(L, (lua_Number)lua_getgccount(L));  lua_pushnumber(L, (lua_Number)lua_getgcthreshold(L));  return 2;}static int luaB_collectgarbage (lua_State *L) {  lua_setgcthreshold(L, luaL_optint(L, 1, 0));  return 0;}static int luaB_type (lua_State *L) {  luaL_checkany(L, 1);  lua_pushstring(L, lua_typename(L, lua_type(L, 1)));  return 1;}static int luaB_next (lua_State *L) {  luaL_checktype(L, 1, LUA_TTABLE);  lua_settop(L, 2);  /* create a 2nd argument if there isn't one */  if (lua_next(L, 1))    return 2;  else {    lua_pushnil(L);    return 1;  }}static int luaB_pairs (lua_State *L) {  luaL_checktype(L, 1, LUA_TTABLE);  lua_pushliteral(L, "next");  lua_rawget(L, LUA_GLOBALSINDEX);  /* return generator, */  lua_pushvalue(L, 1);  /* state, */  lua_pushnil(L);  /* and initial value */  return 3;}static int luaB_ipairs (lua_State *L) {  lua_Number i = lua_tonumber(L, 2);  luaL_checktype(L, 1, LUA_TTABLE);  if (i == 0 && lua_isnone(L, 2)) {  /* `for' start? */    lua_pushliteral(L, "ipairs");    lua_rawget(L, LUA_GLOBALSINDEX);  /* return generator, */    lua_pushvalue(L, 1);  /* state, */    lua_pushnumber(L, 0);  /* and initial value */    return 3;  }  else {  /* `for' step */    i++;  /* next value */    lua_pushnumber(L, i);    lua_rawgeti(L, 1, (int)i);    return (lua_isnil(L, -1)) ? 0 : 2;  }}static int load_aux (lua_State *L, int status) {  if (status == 0)  /* OK? */    return 1;  else {    lua_pushnil(L);    lua_insert(L, -2);  /* put before error message */    return 2;  /* return nil plus error message */  }}static int luaB_loadstring (lua_State *L) {  size_t l;  const char *s = luaL_checklstring(L, 1, &l);  const char *chunkname = luaL_optstring(L, 2, s);  return load_aux(L, luaL_loadbuffer(L, s, l, chunkname));}static int luaB_loadfile (lua_State *L) {  const char *fname = luaL_optstring(L, 1, NULL);  return load_aux(L, luaL_loadfile(L, fname));}static int luaB_dofile (lua_State *L) {  const char *fname = luaL_optstring(L, 1, NULL);  int n = lua_gettop(L);  int status = luaL_loadfile(L, fname);  if (status != 0) lua_error(L);  lua_call(L, 0, LUA_MULTRET);  return lua_gettop(L) - n;}static int luaB_assert (lua_State *L) {  luaL_checkany(L, 1);  if (!lua_toboolean(L, 1))    return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!"));  lua_settop(L, 1);  return 1;}static int luaB_unpack (lua_State *L) {  int n, i;  luaL_checktype(L, 1, LUA_TTABLE);  n = luaL_getn(L, 1);  luaL_checkstack(L, n, "table too big to unpack");  for (i=1; i<=n; i++)  /* push arg[1...n] */    lua_rawgeti(L, 1, i);  return n;}static int luaB_pcall (lua_State *L) {  int status;  luaL_checkany(L, 1);  status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0);  lua_pushboolean(L, (status == 0));  lua_insert(L, 1);  return lua_gettop(L);  /* return status + all results */}static int luaB_xpcall (lua_State *L) {  int status;  luaL_checkany(L, 2);  lua_settop(L, 2);  lua_insert(L, 1);  /* put error function under function to be called */  status = lua_pcall(L, 0, LUA_MULTRET, 1);  lua_pushboolean(L, (status == 0));  lua_replace(L, 1);  return lua_gettop(L);  /* return status + all results */}static int luaB_tostring (lua_State *L) {  char buff[128];  luaL_checkany(L, 1);  if (luaL_callmeta(L, 1, "__tostring"))  /* is there a metafield? */    return 1;  /* use its value */  switch (lua_type(L, 1)) {    case LUA_TNUMBER:      lua_pushstring(L, lua_tostring(L, 1));      return 1;    case LUA_TSTRING:      lua_pushvalue(L, 1);      return 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -