#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. [并查集] POJ 1703 Find them, Catch them

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43132   Accepted: ...

  2. HDU 4941 Magical Forest(2014 Multi-University Training Contest 7)

    思路:将行列离散化,那么就可以用vector 存下10W个点 ,对于交换操作 只需要将行列独立分开标记就行   . r[i] 表示第 i 行存的是 原先的哪行         c[j] 表示 第 j ...

  3. Git-rebase 小笔记

    转自: https://blog.yorkxin.org/posts/2011/07/29/git-rebase/ 最近刚好有个机会整理很乱的Git commit tree,终于搞懂了rebase 的 ...

  4. js动画之多物体运动

    多个物体这不能使用一个定时器了,要给每个物体一个定时器 <!DOCTYPE html> <html lang="en"> <head> < ...

  5. ArcEngine拓扑

    空间拓扑描述的是自然界地理对象的空间位置关系-相邻,重合,连通等,是地理对象空间属性的一部分.目前ESRI提供的数据存储方式中,Coverage和GeoDatabase能够建立拓扑,Shape格式的数 ...

  6. python导入cx_Oracle报错的问题!

    import cx_Oracle 总是报错:ImportError: DLL load failed: 找不到指定的模块. 或者:ImportError: DLL load failed: %1 不是 ...

  7. CONTAINING_RECORD的实现

    // 9.25.cpp : 定义控制台应用程序的入口点.///*----------------------------CONTAINING_RECODER的实现------------------- ...

  8. what we do and how we behave

    It comes after a report last week revealed the "brutal" treatment of terror suspects by th ...

  9. 界面绚丽的SharePoint仪表盘控件Nevron Gauge for SharePoint 控件详细介绍

    Nevron .NET Vision 是一款用于创建独特的.强大的数据表示应用程序的最终控件,它具有超强的数据可视化性能. 整合了Nevron Chart for .NET, Nevron Diagr ...

  10. js⑤

    ##返回在制定位置的的字符  var result = str.charAt(1);  console.log(result);  console.log(str[1]); ##返回在指定的位置的字符 ...