#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模块的更多相关文章

  1. cocos进阶教程(1)Lua调用自定义C++类和函数的最佳实践

    第一层:纯C环境下,把C函数注册进Lua环境 a.lua 文件 )) a.c 文件 #include <lua.h> #include <lualib.h> #include ...

  2. Cocos2d-x下Lua调用自定义C++类和函数的最佳实践[转]

    Cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 ...

  3. Lua与C++交互初探之Lua调用C++

    Lua与C++交互初探之Lua调用C++ 上一篇我们已经成功将Lua的运行环境搭建了起来,也成功在C++里调用了Lua函数.今天我来讲解一下如何在Lua里调用C++函数. Lua作为一个轻量级脚本语言 ...

  4. 【转】Cocos2d-x下Lua调用自定义C++类和函数的最佳实践

    转自:http://segmentfault.com/blog/hongliang/1190000000631630 关于cocos2d-x下Lua调用C++的文档看了不少,但没有一篇真正把这事给讲明 ...

  5. lua调用java java调用lua[转载]

    转载:http://dualface.github.io/blog/2013/01/01/call-java-from-lua/LuaJavaBridge - Lua 与 Java 互操作的简单解决方 ...

  6. 用IKVMC将jar转成dll供c#调用

    用IKVMC将jar转成dll供c#调用 ikvmc c# dll jar 用IKVMC将jar转成dll供c#调用 前言 ikvmc介绍 ikvmc下载安装 下载并解压 设置环境变量 jar-> ...

  7. (原+译)LUA调用C函数

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5804924.html 原始网址: http://www.troubleshooters.com/cod ...

  8. lua调用C语言

    在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调,Lua与C也可以互调.   当lua调用c ...

  9. lua调用c++函数返回值作用

    2015/05/28 lua调用c++接口,返回给lua函数的是压入栈的内容,可以有多个返回值.但是c++接口本身也是有返回值的,这个返回值也非常的重要,会决定最后返回到lua函数的值的个数. (1) ...

随机推荐

  1. Java parseInt()方法

    1.Java parseInt()方法 使用此方法得到的原始数据类型的一个特定的字符串. parseXxx()是一个静态方法,可以有一个参数或两个. java parseInt() 语法:   sta ...

  2. 激活Microsoft Office professional plus 2010

    1. 下载工具 http://pan.baidu.com/s/1dDDFhEL 2. 启动工具 双击Office 2010 Toolkit.exe 在Activation选项栏中选择AutoKMS C ...

  3. stm8s103头文件

    //============================================================================== //================= ...

  4. 端口限制情况下php+xdebug环境配置

    PHP程序在开发的时候调试是比较方便的,大体情况下,输出,打log是可以解决几乎所有问题. 但是还不够,有些问题,用打log的形式定位问题是相当痛苦的事情,有些时候测试环境没配好的话,你可能需要做许多 ...

  5. python学习03——设计,与input有关

    笨办法学python第36节,我写的代码如下: from sys import exit def rule(): print "Congratulations! You made the r ...

  6. python文本过滤

    #encoding:UTF-8 import re temp = "想做/ 兼_职/学生_/ 的 .加,我Q: 8 8. 8 8. !!?? 8 8 .8. 8. 8 有,惊,喜,哦&quo ...

  7. asp.net 5 中应用程序根目录及物理文件根目录的获取方式 此文已过期,不再适应rc1以后的版本

    之前看了asp.net5,小弟就试着用了用,做了个小网站练习一下,有一个小模块需要上传图片到wwwroot下的images文件夹,但是aspnet5 发生了翻天复地变化,之前获取网站根目录的的方法不再 ...

  8. 了解JavaScript

    JavaScript是什么? JavaScript是一种可以用来给网页增加交互性的编程语言. JavaScript是一种面向对象的语言. JavaScript和Java之间没有太大的关系. JavaS ...

  9. impress.js webslide 参数

    data-transition-duration="2000" 改变切换场景的速度,默认1000data-perspective="500" 改变透视的深度,默 ...

  10. ios之JavaScript

    初次接触java脚本,感觉java脚本so interesting!为什么呢?写javascript代码感觉就像是在记流水账,无拐弯抹角,一个字,就是"干",想怎么干就怎么干,哈哈 ...