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

📄 lbaselib.c

📁 小游戏 linux very happy
💻 C
📖 第 1 页 / 共 2 页
字号:
/*** $Id: lbaselib.c,v 1.2 2002/07/12 07:49:04 jcatki Exp $** Basic library** See Copyright Notice in lua.h*/#include <ctype.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "lua.h"#include "lauxlib.h"#include "luadebug.h"#include "lualib.h"/*** If your system does not support `stderr', redefine this function, or** redefine _ERRORMESSAGE so that it won't need _ALERT.*/static int luaB__ALERT (lua_State *L) {  fputs(luaL_check_string(L, 1), stderr);  return 0;}/*** Basic implementation of _ERRORMESSAGE.** The library `liolib' redefines _ERRORMESSAGE for better error information.*/static int luaB__ERRORMESSAGE (lua_State *L) {  luaL_checktype(L, 1, LUA_TSTRING);  lua_getglobal(L, LUA_ALERT);  if (lua_isfunction(L, -1)) {  /* avoid error loop if _ALERT is not defined */    lua_Debug ar;    lua_pushstring(L, "error: ");    lua_pushvalue(L, 1);    if (lua_getstack(L, 1, &ar)) {      lua_getinfo(L, "Sl", &ar);      if (ar.source && ar.currentline > 0) {        char buff[100];        sprintf(buff, "\n  <%.70s: line %d>", ar.short_src, ar.currentline);        lua_pushstring(L, buff);        lua_concat(L, 2);      }    }    lua_pushstring(L, "\n");    lua_concat(L, 3);    lua_rawcall(L, 1, 0);  }  return 0;}/*** 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_rawcall(L, 1, 1);    s = lua_tostring(L, -1);  /* get result */    if (s == NULL)      lua_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_opt_int(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_check_string(L, 1);    char *s2;    unsigned long n;    luaL_arg_check(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, n);        return 1;      }    }  }  lua_pushnil(L);  /* else not a number */  return 1;}static int luaB_error (lua_State *L) {  lua_error(L, luaL_opt_string(L, 1, NULL));  return 0;  /* to avoid warnings */}static int luaB_setglobal (lua_State *L) {  luaL_checkany(L, 2);  lua_setglobal(L, luaL_check_string(L, 1));  return 0;}static int luaB_getglobal (lua_State *L) {  lua_getglobal(L, luaL_check_string(L, 1));  return 1;}static int luaB_tag (lua_State *L) {  luaL_checkany(L, 1);  lua_pushnumber(L, lua_tag(L, 1));  return 1;}static int luaB_settag (lua_State *L) {  luaL_checktype(L, 1, LUA_TTABLE);  lua_pushvalue(L, 1);  /* push table */  lua_settag(L, luaL_check_int(L, 2));  return 1;  /* return table */}static int luaB_newtag (lua_State *L) {  lua_pushnumber(L, lua_newtag(L));  return 1;}static int luaB_copytagmethods (lua_State *L) {  lua_pushnumber(L, lua_copytagmethods(L, luaL_check_int(L, 1),                                          luaL_check_int(L, 2)));  return 1;}static int luaB_globals (lua_State *L) {  lua_getglobals(L);  /* value to be returned */  if (!lua_isnull(L, 1)) {    luaL_checktype(L, 1, LUA_TTABLE);    lua_pushvalue(L, 1);  /* new table of globals */    lua_setglobals(L);  }  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_settagmethod (lua_State *L) {  int tag = luaL_check_int(L, 1);  const char *event = luaL_check_string(L, 2);  luaL_arg_check(L, lua_isfunction(L, 3) || lua_isnil(L, 3), 3,                 "function or nil expected");  if (strcmp(event, "gc") == 0)    lua_error(L, "deprecated use: cannot set the `gc' tag method from Lua");  lua_gettagmethod(L, tag, event);  lua_pushvalue(L, 3);  lua_settagmethod(L, tag, event);  return 1;}static int luaB_gettagmethod (lua_State *L) {  int tag = luaL_check_int(L, 1);  const char *event = luaL_check_string(L, 2);  if (strcmp(event, "gc") == 0)    lua_error(L, "deprecated use: cannot get the `gc' tag method from Lua");  lua_gettagmethod(L, tag, event);  return 1;}static int luaB_gcinfo (lua_State *L) {  lua_pushnumber(L, lua_getgccount(L));  lua_pushnumber(L, lua_getgcthreshold(L));  return 2;}static int luaB_collectgarbage (lua_State *L) {  lua_setgcthreshold(L, luaL_opt_int(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 passresults (lua_State *L, int status, int oldtop) {  static const char *const errornames[] =    {"ok", "run-time error", "file error", "syntax error",     "memory error", "error in error handling"};  if (status == 0) {    int nresults = lua_gettop(L) - oldtop;    if (nresults > 0)      return nresults;  /* results are already on the stack */    else {      lua_pushuserdata(L, NULL);  /* at least one result to signal no errors */      return 1;    }  }  else {  /* error */    lua_pushnil(L);    lua_pushstring(L, errornames[status]);  /* error code */    return 2;  }}static int luaB_dostring (lua_State *L) {  int oldtop = lua_gettop(L);  size_t l;  const char *s = luaL_check_lstr(L, 1, &l);  if (*s == '\33')  /* binary files start with ESC... */    lua_error(L, "`dostring' cannot run pre-compiled code");  return passresults(L, lua_dobuffer(L, s, l, luaL_opt_string(L, 2, s)), oldtop);}static int luaB_dofile (lua_State *L) {  int oldtop = lua_gettop(L);  const char *fname = luaL_opt_string(L, 1, NULL);  return passresults(L, lua_dofile(L, fname), oldtop);}static int luaB_call (lua_State *L) {  int oldtop;  const char *options = luaL_opt_string(L, 3, "");  int err = 0;  /* index of old error method */  int i, status;  int n;  luaL_checktype(L, 2, LUA_TTABLE);  n = lua_getn(L, 2);  if (!lua_isnull(L, 4)) {  /* set new error method */    lua_getglobal(L, LUA_ERRORMESSAGE);    err = lua_gettop(L);  /* get index */    lua_pushvalue(L, 4);    lua_setglobal(L, LUA_ERRORMESSAGE);  }  oldtop = lua_gettop(L);  /* top before function-call preparation */  /* push function */  lua_pushvalue(L, 1);  luaL_checkstack(L, n, "too many arguments");  for (i=0; i<n; i++)  /* push arg[1...n] */    lua_rawgeti(L, 2, i+1);  status = lua_call(L, n, LUA_MULTRET);  if (err != 0) {  /* restore old error method */    lua_pushvalue(L, err);    lua_setglobal(L, LUA_ERRORMESSAGE);  }  if (status != 0) {  /* error in call? */    if (strchr(options, 'x'))      lua_pushnil(L);  /* return nil to signal the error */    else      lua_error(L, NULL);  /* propagate error without additional messages */    return 1;  }  if (strchr(options, 'p'))  /* pack results? */    lua_error(L, "deprecated option `p' in `call'");  return lua_gettop(L) - oldtop;  /* results are already on the stack */}static int luaB_tostring (lua_State *L) {  char buff[64];  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;    case LUA_TTABLE:      sprintf(buff, "table: %p", lua_topointer(L, 1));      break;    case LUA_TFUNCTION:      sprintf(buff, "function: %p", lua_topointer(L, 1));      break;    case LUA_TUSERDATA:

⌨️ 快捷键说明

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