lualib.h详解
来源:互联网 发布:java默认访问修饰符 编辑:程序博客网 时间:2024/06/06 04:17
首先贴上代码:
/*** Standard library header.** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h*/#ifndef _LUALIB_H#define _LUALIB_H#include "lua.h"#define LUA_FILEHANDLE"FILE*"#define LUA_COLIBNAME"coroutine"#define LUA_MATHLIBNAME"math"#define LUA_STRLIBNAME"string"#define LUA_TABLIBNAME"table"#define LUA_IOLIBNAME"io"#define LUA_OSLIBNAME"os"#define LUA_LOADLIBNAME"package"#define LUA_DBLIBNAME"debug"#define LUA_BITLIBNAME"bit"#define LUA_JITLIBNAME"jit"#define LUA_FFILIBNAME"ffi"LUALIB_API int luaopen_base(lua_State *L);LUALIB_API int luaopen_math(lua_State *L);LUALIB_API int luaopen_string(lua_State *L);LUALIB_API int luaopen_table(lua_State *L);LUALIB_API int luaopen_io(lua_State *L);LUALIB_API int luaopen_os(lua_State *L);LUALIB_API int luaopen_package(lua_State *L);LUALIB_API int luaopen_debug(lua_State *L);LUALIB_API int luaopen_bit(lua_State *L);LUALIB_API int luaopen_jit(lua_State *L);LUALIB_API int luaopen_ffi(lua_State *L);LUALIB_API void luaL_openlibs(lua_State *L);#ifndef lua_assert#define lua_assert(x)((void)0)#endif#endif
先来说luaopen_base的实现。
luaopen_base代码实现:
LUAMOD_API int luaopen_base (lua_State *L) {
/* open lib into global table */
lua_pushglobaltable(L);
luaL_setfuncs(L, base_funcs, 0);//注册函数到栈顶的表中
/* set global _G */
lua_pushvalue(L, -1);
lua_setfield(L, -2, "_G");
/* set global _VERSION */
lua_pushliteral(L, LUA_VERSION); //#define lua_pushliteral(L, s) lua_pushstring(L, "" s)
lua_setfield(L, -2, "_VERSION");
return 1;
}
上面的lua_pushglobaltable方法其实是一个元方法:
#define lua_pushglobaltable(L) \
((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)),
作用就是把打开的库添加进全局表中(global table)
那两个宏的定义如下:
#define LUA_REGISTRYINDEX (-LUAI_MAXSTACK - 1000)
#define LUAI_MAXSTACK 15000
#define LUA_RIDX_GLOBALS 2
下面是lua_openmath的实现
LUAMOD_API int luaopen_math (lua_State *L) {
luaL_newlib(L, mathlib);
lua_pushnumber(L, PI);
lua_setfield(L, -2, "pi");
lua_pushnumber(L, (lua_Number)HUGE_VAL);
lua_setfield(L, -2, "huge");
lua_pushinteger(L, LUA_MAXINTEGER);
lua_setfield(L, -2, "maxinteger");
lua_pushinteger(L, LUA_MININTEGER);
lua_setfield(L, -2, "mininteger");
return 1;
}
luaL_newlib 被定义为宏,完成功能很简单。首先创建一个 table,然后把成员函数名做 key,成员函数作为 value 放入该 table 中。
这里记录一下lua_setfield的使用:
void lua_setfield (lua_State *L, int index, const char *k)
操作: arr = Stack[index]
arr[k] = Stack.top()
Stack.pop()
给表中键为k的元素赋值value(value就是栈顶元素), 这里的表是由index指向的栈上的一个表
无返回值
栈高度-1, 被弹出的是value
注意, 该操作将触发 __newindex 元方法
下面是lua_openstring的介绍:
LUAMOD_API int luaopen_string (lua_State *L) {
luaL_newlib(L, strlib);
createmetatable(L);
return 1;
}
这里是createmetatable的实现:
static void createmetatable (lua_State *L) {
lua_createtable(L, 0, 1); /* table to be metatable for strings */
lua_pushliteral(L, ""); /* dummy string */
lua_pushvalue(L, -2); /* copy table */
lua_setmetatable(L, -2); /* set table as metatable for strings */
lua_pop(L, 1); /* pop dummy string */
lua_pushvalue(L, -2); /* get string library */
lua_setfield(L, -2, "__index"); /* metatable.__index = string */
lua_pop(L, 1); /* pop metatable */
}
下面是lua_opentable的实现:
LUAMOD_API int luaopen_table (lua_State *L) {
luaL_newlib(L, tab_funcs);
#if defined(LUA_COMPAT_UNPACK)
/* _G.unpack = table.unpack */
lua_getfield(L, -1, "unpack");
lua_setglobal(L, "unpack");
#endif
return 1;
}
下面是lua_openio的实现:
LUAMOD_API int luaopen_io (lua_State *L) {
luaL_newlib(L, iolib); /* new module */
createmeta(L);
/* create (and set) default files */
createstdfile(L, stdin, IO_INPUT, "stdin");
createstdfile(L, stdout, IO_OUTPUT, "stdout");
createstdfile(L, stderr, NULL, "stderr");
return 1;
}
static void createstdfile (lua_State *L, FILE *f, const char *k,
const char *fname) {
LStream *p = newprefile(L);
p->f = f;
p->closef = &io_noclose;
if (k != NULL) {
lua_pushvalue(L, -1);
lua_setfield(L, LUA_REGISTRYINDEX, k); /* add file to registry */
}
lua_setfield(L, -2, fname); /* add file to module */
}
luaopen_os:
LUAMOD_API int luaopen_os (lua_State *L) {
luaL_newlib(L, syslib);
return 1;
}
下面的内容大部分都一样,不写了。
参考这个网址:传送门
- lualib.h详解
- lua头文件翻译之lualib.h
- lualib.h解析(5.3.4)
- [转]vs2013编译使用Lualib
- reg51.h 详解
- H.264 标准详解
- H.264详解(二)
- H.264详解(一)
- H.264详解
- #include“stdafx.h”详解
- H.264详解
- stdarg.h详解
- h:panelGrid 属性详解
- #include“stdafx.h”详解
- reg51.h 详解
- linnids.h 详解
- CGGeometry.h详解
- H.264详解
- [BZOJ4921][Lydsy六月份月赛 .E][二分][瞎搞]互质序列
- 【剑指offer】题目4
- C语言关键字Volatile
- JSP的静态与动态包含
- HDU 6030 Happy Necklace【矩阵快速幂】
- lualib.h详解
- 函数模板的模板参数自动推导探究
- Opencv及Kinect/OpenNI常用学习网址
- IDEA破解办法
- 扯淡的bug--redis
- The ServiceClass object does not implement the required method in the following form: OMElement sayH
- JSP的out内置对象及其常用方法
- 51自学网,各种软件自学视频的地方
- 【转载】SMARTFORM字段参数设置 解决SMARTFORM中数量、金额字段显示 等问题