C/C++: Einbinden von Lua-Skripten in C

Lua ist eine Skriptsprache, welche u.a. in C Programme eingebunden werden kann und somit die Möglichekit bietet, Programmlogik ohne Neukompilierung zu ändern bzw. erweitern. Die Einbindung in ein C-Programm soll dieses Tutorial zeigen.

Installation

Voraussetzung für das Erstellen unf Ausführen von Lua-Skripten - auch von C heraus - sind die folgenden Linux-Module:

  • gcc (C-Compiler)
  • liblua50-dev (Lua Interpreter)
  • liblualib50-dev (Lua Libs und Header)

Eine gute Anleitung zu dem Thema findet sich auch unter http://www.debian-administration.org/articles/264.

Kompilieren

Das Kopilieren und Linken der C-Quellen erfoglt mit dem nachfolgendem Aufruf:

gcc `lua-config --include --libs` -o

Es ist auch möglich, das Lua Skript zu kompilieren. Dazu muss der folgende Befehl ausgeführt werden:

luac -o

Beispiel

Als Beispiel soll ein kleines Programm zur Hashberechnung einer Zeichenkette dienen. Der Aufruf erfolgt aus einem C-Programm (calculatehash.c) heraus.

#include

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

/*
 * the function which calls the hash function in the lua script
 */
char* dohash(const char* value)
{
        /* the calculated hash value */
        char* hash;

        /* the lua state */
        lua_State* lua_state;

        /* init lua state */
        L = lua_open();

        /* load lua libs */
        lua_baselibopen(lua_state);

        /* load lua script "hash.lua - stored in the current directory" */
        lua_dofile(lua_state, "hash.lua");

        /* the name of the function is "hash(x)" */
        lua_getglobal(lua_state, "hash");

        /* the parameter of the hash function "hash(x)" */
        lua_pushstring(lua_state, value );

        /* call the hash function with 1 argument and return 1 result */
        lua_call(lua_state, 1, 1);

        /** convert return value to char* */
        hash = (char *)lua_tostring(L, -1);

        /** remove from stack */
        lua_pop(lua_state, 1);

        /* close lua state */
        lua_close(lua_state);

        /** return the hash value */
        return hash;
}

/**
 * The main method ...
 */
int main ( int argc, char *argv[] )
{
        /** Call the c function and print out the result */
        printf("The result is: %sn", dohash(argv[1]));
        return 0;
}

Das Lua Skript "hash.lua" - welches im C-Quellcode referenziert wird, enthält die eigentliche Hashfunktion (hier nur eine Dummy-Implementierung):

function hash(x)
        return "{implementhash}: " .. x
end

Hier wäre denkbar, einen MD5 oder SHA-1 Hash zu bilden. Dafür sind weitere Lua-Libs notwendig.

Abschliessend muss das C-Programm mit dem folgendem Befehl kompiliert werden:

gcc -Wall `lua-config --include --libs` -o calculatehash calulatehash.c

Das war es schon - wenn jetzt das Programm mit einem Parameter aufgerufen wird, erfolgt die Hashberechnung und das Ergebnis wird auf STDOUT ausgegeben:

ronnyfriedland@dev:~/lua$ ./calculatehash "Hallo Lua"
The result is: {implementhash}: Hallo Lua