首頁 後端開發 php教程 lua與c語言互相調用

lua與c語言互相調用

Aug 08, 2016 am 09:23 AM
include lua printf quot

lua和c語言之間的互調大量出現在lua-nginx-module中,這裡給出《lua程式設計》第24-27章的一些測試程式碼。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <stdarg.h>
#include <stdlib.h>

#define MAX_COLOR 255

static void stackDump(lua_State *L);

static int l_split(lua_State *L)
{
	const char *s = luaL_checkstring(L, 1);
	const char *sep = luaL_checkstring(L, 2);
	const char *e;
	int i = 1;
	
	lua_newtable(L);
	
	while ((e = strchr(s, *sep)) != NULL)
	{
		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;
}

int l_map(lua_State *L)
{
	int i, n;
	luaL_checktype(L, 1, LUA_TTABLE);
	luaL_checktype(L, 2, LUA_TFUNCTION);
	
	n = lua_objlen(L, 1);
	for (i = 1; i <= n; i ++)
	{
		//stackDump(L);
		//printf("=====1=====\n");
		lua_pushvalue(L, 2);
		//stackDump(L);
		//printf("=====2=====\n");
		lua_rawgeti(L, 1, i);
		//stackDump(L);
		//printf("=====3=====\n");
		lua_call(L, 1, 1);
		//stackDump(L);
		//printf("=====4=====\n");
		lua_rawseti(L, 1, i);
		//stackDump(L);
		//printf("=====5=====\n");
	}
	
	return 0;
}

// 通过Lua调用的c函数,通过打印栈说明每个函数有独立的栈
// 将c函数注册到lua中,从而被lua调用。
static int l_sin(lua_State *L)
{
	double d = lua_tonumber(L, 1);
	lua_pushnumber(L, sin(d));
	
	// stackDump(L);
	// printf("====l_sin===\n");
	
	return 1;
}

// c 调用lua 函数
// 从Lua中得到函数,在c语言中传入参数。
double f(lua_State *L,double x, double y)
{
	double z;
	lua_getglobal(L, "f");
	lua_pushnumber(L, x);
	lua_pushnumber(L, y);
	// table function 1.1 2.2 说明c语言调用Lua会共享相同的栈.
	// stackDump(L);
	// printf("=====f=====\n");
	
	if (lua_pcall(L, 2, 1, 0) != 0)
		printf("call f error\n");
	
	if (!lua_isnumber(L, -1))
		printf("function f must return a number\n");
	
	z = lua_tonumber(L, -1);
	lua_pop(L, 1);
	return z;
}

int getfield(lua_State *L, const char *key)
{
	int result;
	// stackDump(L);
	// printf("==1==\n");
	lua_getfield(L, -1, key);
	// stackDump(L);
	// printf("==2==\n");
	if (!lua_isnumber(L, -1))
		printf("invalid component\n");
	result = lua_tonumber(L, -1);
	lua_pop(L, 1);
	// stackDump(L);
	// printf("==4==\n");
	return result;
}

static void stackDump(lua_State *L)
{
	int i;
	int top = lua_gettop(L);
	for (i = 1; i <= top; ++ i)
	{
		int t = lua_type(L, i);
		switch(t) {
		case LUA_TSTRING:
			printf("'%s'", lua_tostring(L, i));
			break;
		case LUA_TBOOLEAN:
			printf(lua_toboolean(L, i) ? "true" : "false");
			break;
		case LUA_TNUMBER:
			printf("%g", lua_tonumber(L, i));
			break;
		default:
			printf("%s", lua_typename(L, t));
			break;
		}
		printf(" ");
	}
	printf("\n");
}

void load(lua_State *L, const char *fname, int *w, int *h) {
	if (luaL_loadfile(L, fname) || lua_pcall(L, 0, 0, 0))
			printf("cannot run config.file\n");
	
	/*lua_getglobal(L, "height");
	lua_getglobal(L, "width");
	
	if (!lua_isnumber(L, -2))
		printf("width should be a number\n");
	
	if (!lua_isnumber(L, -1))
		printf("height should be a number\n");
	
	*w = lua_tointeger(L, -2);
	*h = lua_tointeger(L, -1);*/
	
	lua_getglobal(L, "table");
	
	if (!lua_istable(L, -1))
		printf("background should be table\n");
	
	printf("%f\n", f(L, 1.1, 2.2));
	
	float red = getfield(L, "r");
	float green = getfield(L, "g");
	float blue = getfield(L, "b");
	
	printf("%f, %f, %f\n", red, green, blue);
}

// lua 调用c代码可以模仿这里的格式
const char* testfunc = "t = mysplit(\"hi, hello\", \",\"); print(t[1], t[2])";

int main(void)
{
	char buff[256];
	int error;
	lua_State *L = luaL_newstate();
	luaL_openlibs(L);
	int w, h;
	// load(L, "test.lua", &w, &h);
	
	lua_pushcfunction(L, l_sin);
	lua_setglobal(L, "mysin");
	
	lua_pushcfunction(L, l_map);
	lua_setglobal(L, "mymap");
	
	lua_pushcfunction(L, l_split);
	lua_setglobal(L, "mysplit");
	
	if (luaL_dostring(L, testfunc))
		fprintf(stderr, "%s", lua_tostring(L, -1));
	
	/*
	while (fgets(buff, sizeof(buff), stdin) != NULL)
	{
		error = luaL_loadbuffer(L, buff, strlen(buff), "line");
		stackDump(L);
		error = error || lua_pcall(L, 0, 0, 0);
		stackDump(L);
	}
	
	if (error) {
		fprintf(stderr, "%s", lua_tostring(L, -1));
		lua_pop(L, 1);
	}*/
	
	lua_close(L);
	return 0;
}
登入後複製

test.lua

BULE = {r = 0, g = 0, b = 1}
table = {["r"] = 10, ["g"] = 23, ["b"] = 33}

function f(x, y)
	return x + y
end
登入後複製

編譯:gcc test.c -I/usr/local/include/luajit-2.0 -llua-5.1 -lm

以上就介紹了lua與c語言互相調用,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Nginx怎麼安裝設定Lua支持 Nginx怎麼安裝設定Lua支持 Jun 02, 2023 pm 10:01 PM

Nginx安裝配置Lua支援預設情況下Nginx不支援Lua模組,需要安裝LuaJIT解釋器,並且重新編譯Nginx,或者可使用國人開發的openrestry需要的模組:LuaJIT,Ngx_devel和lua-nginx-module1.環境準備[root @nginx_lua~]#yuminstall-ygccgcc-c++makepcre-develzlib-developenssl-devel2.下載最新的luajit和ngx_devel_kit以及lua-nginx-module解壓[r

nginx怎麼整合lua操作mysql nginx怎麼整合lua操作mysql May 16, 2023 pm 10:43 PM

實作想法直接在nginx做配置黑名單,透過編寫邏輯塊實現;在服務端(Java)中編寫過濾器,在過濾器中統一攔截;在服務端(Java)中編寫攔截器,在攔截器中統一攔截;這裡列舉了3種實現的思路,至於實現方案,可能還有更多,但是我們想想,在nginx中編寫邏輯塊貌似不是很多人擅長的;在代碼層面做不是不可以,而是這樣一來,在涉及高並發的業務高峰期,這必然會對後端服務造成較大的壓力,那麼還有沒有其他更好的處理辦法呢?這就是要說的lua,即nginx作為網關仍然作為代理伺服器,由於nginx可以整合lu

Vue.js與Lua語言的融合,編寫輕量級的嵌入式應用 Vue.js與Lua語言的融合,編寫輕量級的嵌入式應用 Jul 31, 2023 pm 02:23 PM

Vue.js與Lua語言的融合,編寫輕量級的嵌入式應用在現代開發中,前端框架Vue.js和腳本語言Lua都各自有著廣泛的應用。 Vue.js是一款用於建立使用者介面的漸進式框架,而Lua則是一種輕量級的腳本語言,經常用於嵌入式應用和遊戲開發。本文將介紹如何將Vue.js與Lua語言進行融合,用於編寫輕量級的嵌入式應用,並提供程式碼範例。首先,我們需要安裝Vue.j

php include和include_once有什麼差別 php include和include_once有什麼差別 Mar 22, 2023 am 10:38 AM

當我們在使用 PHP 編寫網頁時,有時我們需要在目前 PHP 檔案中包含其他 PHP 檔案中的程式碼。這時,就可以使用 include 或 include_once 函數來實作檔案包含。那麼,include 和 include_once 到底有什麼差別呢?

Vue.js與Lua語言的融合,建構遊戲開發的前端引擎的最佳實踐和經驗分享 Vue.js與Lua語言的融合,建構遊戲開發的前端引擎的最佳實踐和經驗分享 Aug 01, 2023 pm 08:14 PM

Vue.js與Lua語言的融合,建構遊戲開發的前端引擎的最佳實踐和經驗分享引言:隨著遊戲開發的不斷發展,遊戲前端引擎的選擇成為了一個重要的決策。在這些選擇中,Vue.js框架和Lua語言都成為了眾多開發者的關注點。 Vue.js作為一款受歡迎的前端框架具有豐富的生態系統和便捷的開發方式,而Lua語言則因其輕量級和高效性能在遊戲開發中得到廣泛應用。本文將探討如何將

Java生態/Redis中怎麼使用Lua腳本 Java生態/Redis中怎麼使用Lua腳本 Jun 02, 2023 pm 10:41 PM

一、安裝LUAMac上安裝LUA很簡單,直接使用brew相關指令;brewinstalllua使用lua-v指令可以看到lua已經安裝完畢。 1)簡單使用創建一個test.lua文件,內容為:執行命令:luatest.lua輸出為:二、lua語法簡介Lua提供了互動式程式設計和腳本程式設計:互動式程式設計:直接在命令列中輸入語法,可以立即執行並查看到執行效果。腳本是程式設計:編寫腳本文件,然後再執行。 1.註解lua提供兩種註解方式:單行註解和多行註解1)單行註解使用兩個減號;--2)多行註解--[[多行註解多行

idaPro如何分析app解密lua腳本 idaPro如何分析app解密lua腳本 May 18, 2023 am 08:34 AM

透過前面idaPro調試或hook,我們可以取得到xxtea解密key,對於sign我們可以直接開啟原始檔:可以看到sign值:byds。所以,我們可以同過xxtea解密工具(可從GitHub上下源碼自己編譯)試著解密:以index.luac為例,我們看index.luac解密前後變化:我們看到經過xxtea解密後的lua腳本仍然不是明文!我們之前根據cocos2d框架源碼及大神apk反編結果確定就是用的xxtea加密,而且app的lua腳本也有簽名值,這也印證了就是xxtea加密方式,但是我們

如何使用Redis+Lua腳本實現計數器介面防刷功能 如何使用Redis+Lua腳本實現計數器介面防刷功能 May 28, 2023 pm 11:32 PM

【實作過程】一、問題分析如果set指令設定上,但是在設定失效時間時因網路抖動等原因導致沒有設定成功,這時就會出現死計數器(類似死鎖);二、解決方案Redis+Lua是一個很好的解決方案,使用腳本使得set命令和expire命令一同達到Redis被執行且不會被幹擾,在很大程度上保證了原子操作;為什麼說是很大程度上保證原子操作而不是完全保證?因為在Redis內部執行的時候出問題也有可能出現問題不過概率非常小;即使針對小概率事件也有相應的解決方案,例如解決死鎖一個思路值得參考:防止死鎖會將鎖的值存成

See all articles