我的第一份供lua调用的c模块
#include <stdio.h>
#include <string>
#include <direct.h>
#include <windows.h>
#include <io.h>
extern "C" {
#include "D:\myPath\lua\5.3\include\lua.h"
#include "D:\myPath\lua\5.3\include\lauxlib.h"
#include "D:\myPath\lua\5.3\include\lualib.h"
}
#pragma comment(lib,"D:\\myPath\\lua\\5.3\\lib\\Lua53.lib")// 该模块和lua解释器都要使用动态链接
// 因为这是lua解释器也要用到的库,使用静态链接会报错 multiple Lua VMs detected
#define LUA_VERSION_NUM 503
// 使用static 防止名字污染
static int pusherror(lua_State *L, const char *info) // lua函数返回错误信息就是这么来的
{
lua_pushnil(L); // lua函数不是一出错就先返回 nil + info 的模式么?
if (info == NULL)
lua_pushstring(L, strerror(errno));
else
lua_pushfstring(L, "%s: %s", info, strerror(errno));
lua_pushinteger(L, errno);
return 3;
}
// 获取当前目录 因为会用到系统有关的目录api,所以cl编译时 运行时库选择 /MD
static int get_dir (lua_State *L)
{
#ifdef NO_GETCWD
lua_pushnil(L);
lua_pushstring(L, "Function 'getcwd' not provided by system");
return 2;
#else
char *path = NULL;
/* Passing (NULL, 0) is not guaranteed to work. Use a temp buffer and size instead. */
size_t size = MAX_PATH; /* initial buffer size */
int result;
while (1)
{
path = (char *)realloc(path, size);
if (!path) /* failed to allocate */
return pusherror(L, "get_dir realloc() failed");
if (_getcwd(path, size) != NULL)
{
/* success, push the path to the Lua stack */
lua_pushstring(L, path);
result = 1;
break;
}
if (errno != ERANGE) { /* unexpected error */ //就是说expected的error 是ERANGE,
result = pusherror(L, "get_dir getcwd() failed");
break;
}
/* ERANGE = insufficient buffer capacity, double size and retry */
size *= 2;
}
free(path);
return result;
#endif
}
static int l_split(lua_State*L){
const char* s = luaL_checkstring(L,-2);
const char* sep = luaL_checkstring(L,-1);
lua_newtable(L);
const char* e = s;
int i = 1;
while((e= strchr(s,*sep))!=NULL){
if(e-s==0){s=e+1;continue;} // 避免连续的*sep导致压入空串
lua_pushlstring(L, s, e-s);
lua_rawseti(L, -2, i++);
s = e+1;
}
lua_pushstring(L, s);
lua_rawseti(L, -2, i);
return 1;
}
static int gettable(lua_State *L)
{
//lua_setfield lua_seti lua_settable luaL_ref
//lua_getfield lua_geti lua_gettable luaL_unref
// luaL_unref是删除键值对 luaL_ref是自动生成唯一键
lua_newtable(L);
char value[32] = {0};
char key[10] = {0};
for(int i = 1; i <= 5; i++)
{
sprintf(value, "value: %d", i);
lua_pushstring(L, value);
lua_seti(L, -2, i);
}
for(int i = 6; i <= 10; ++i)
{
sprintf(key, "key %d", i);
sprintf(value, "value %d", i);
lua_pushstring(L, value);
lua_setfield(L, -2, key);
}
for(int i = 11; i <= 15; ++i)
{
sprintf(key, "key %d", i);
sprintf(value, "value %d", i);
lua_pushstring(L, key);
lua_pushstring(L, value);
lua_settable(L, -3);
}
for(int i = 16; i <= 20; ++i)
{
sprintf(value, "value %d", i);
lua_pushstring(L, value);
luaL_ref(L, -2); // 这个 不用管key, luaL_ref是自动生成唯一的key
}
return 1;
}
// assumes the table is on the top of stack
static int printtable(lua_State *L)
{
if(!lua_istable(L, -1))return 0;
lua_len(L, -1);
int nlen = lua_tointeger(L, -1);
lua_pop(L, 1);// 注意 这里不是索引而是数量
printf("table length:%d\n",nlen);
for(int i = 1; i <= nlen; ++i)
{
lua_geti(L, -1, i);
int t = lua_type(L, -1);
switch(t)
{
case LUA_TSTRING:
printf("%s\n", lua_tostring(L, -1));
break;
case LUA_TNUMBER:
{
if(lua_isinteger(L, -1))printf("%d\n", lua_tointeger(L, -1) );
else printf("%f\n", lua_tonumber(L, -1));
}
break;
default:printf("other type\n");
}
lua_pop(L, 1);
}
return 0;
}
static const struct luaL_Reg mylib[] =
{
{"currentdir", get_dir},
{"l_split", split},
{"gettable", gettable},
{"printtable",printtable},
{NULL, NULL},
};
extern "C" __declspec(dllexport) int luaopen_mylib(lua_State *L) // 必须是luaopen_+dll名的形式
//requre(name)=>会找name.dll 找到name.dll 中的 luaopen_name导出函数
{
//luaL_register(L,"mylib",mylib); // 已弃用 会污染全局namespace
//前面还可以加一些元表信息
//设置 __gc __index等写法
luaL_newlib(L, mylib);
// lua_setglobal(L, "mylib"); // 有了这一句就可以不用mylib = require("mylib")了
lua_pushliteral(L, "Copyright (C) 2003-2016 Kepler Project");
lua_setfield(L, -2, "_COPYRIGHT");
lua_pushliteral(L, "1.0 ");
lua_setfield(L, -2, "_VERSION");
return 1;
}
我的第一份供lua调用的c模块的更多相关文章
- cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践
第一层:纯C环境下,把C函数注册进Lua环境 a.lua 文件 )) a.c 文件 #include <lua.h> #include <lualib.h> #include ...
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践[转]
Cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 ...
- Lua与C++交互初探之Lua调用C++
Lua与C++交互初探之Lua调用C++ 上一篇我们已经成功将Lua的运行环境搭建了起来,也成功在C++里调用了Lua函数.今天我来讲解一下如何在Lua里调用C++函数. Lua作为一个轻量级脚本语言 ...
- 【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明 ...
- lua调用java java调用lua[转载]
转载:http://dualface.github.io/blog/2013/01/01/call-java-from-lua/LuaJavaBridge - Lua 与 Java 互操作的简单解决方 ...
- 用IKVMC将jar转成dll供c#调用
用IKVMC将jar转成dll供c#调用 ikvmc c# dll jar 用IKVMC将jar转成dll供c#调用 前言 ikvmc介绍 ikvmc下载安装 下载并解压 设置环境变量 jar-> ...
- (原+译)LUA调用C函数
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5804924.html 原始网址: http://www.troubleshooters.com/cod ...
- lua调用C语言
在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c ...
- lua调用c++函数返回值作用
2015/05/28 lua调用c++接口,返回给lua函数的是压入栈的内容,可以有多个返回值.但是c++接口本身也是有返回值的,这个返回值也非常的重要,会决定最后返回到lua函数的值的个数. (1) ...
随机推荐
- [并查集] POJ 1703 Find them, Catch them
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43132 Accepted: ...
- HDU 4941 Magical Forest(2014 Multi-University Training Contest 7)
思路:将行列离散化,那么就可以用vector 存下10W个点 ,对于交换操作 只需要将行列独立分开标记就行 . r[i] 表示第 i 行存的是 原先的哪行 c[j] 表示 第 j ...
- Git-rebase 小笔记
转自: https://blog.yorkxin.org/posts/2011/07/29/git-rebase/ 最近刚好有个机会整理很乱的Git commit tree,终于搞懂了rebase 的 ...
- js动画之多物体运动
多个物体这不能使用一个定时器了,要给每个物体一个定时器 <!DOCTYPE html> <html lang="en"> <head> < ...
- ArcEngine拓扑
空间拓扑描述的是自然界地理对象的空间位置关系-相邻,重合,连通等,是地理对象空间属性的一部分.目前ESRI提供的数据存储方式中,Coverage和GeoDatabase能够建立拓扑,Shape格式的数 ...
- python导入cx_Oracle报错的问题!
import cx_Oracle 总是报错:ImportError: DLL load failed: 找不到指定的模块. 或者:ImportError: DLL load failed: %1 不是 ...
- CONTAINING_RECORD的实现
// 9.25.cpp : 定义控制台应用程序的入口点.///*----------------------------CONTAINING_RECODER的实现------------------- ...
- what we do and how we behave
It comes after a report last week revealed the "brutal" treatment of terror suspects by th ...
- 界面绚丽的SharePoint仪表盘控件Nevron Gauge for SharePoint 控件详细介绍
Nevron .NET Vision 是一款用于创建独特的.强大的数据表示应用程序的最终控件,它具有超强的数据可视化性能. 整合了Nevron Chart for .NET, Nevron Diagr ...
- js⑤
##返回在制定位置的的字符 var result = str.charAt(1); console.log(result); console.log(str[1]); ##返回在指定的位置的字符 ...