c_lua_api.c

/*
 * Plik prezentuje korzystanie z skryptów Lua w środowisku C
 * wraz z tym kodem udostępniany jest także c_lua_api.lua
 * który jest przykładem skryptu Lua stworzonym do współpracy z tym programem
 *
 * kompilacja: gcc my.c -llua5.1
 *
 */

#include <lua5.1/lua.h>
#include <lua5.1/lauxlib.h>
#include "lgencall.h"

static int funkcja_dla_lua (lua_State *LS) {
  // zdejmujemy ze stosu liczbę argumentów przekazaną do funkcji
  int liczba_argumentow = lua_gettop(LS);
  int i;
  lua_Number wynik = 0;
  for (i = 1; i <= liczba_argumentow; i++) {
    int arg_type = lua_type(LS, i);
    
    // wypisujemy każdy argument
    printf("Agrument nr %d typu %s (%d) wartosc ", i, lua_typename(LS, arg_type), arg_type);
    switch (arg_type) {
      case LUA_TNUMBER:
        printf("%f\n", lua_tonumber(LS, i));
        break;
      case LUA_TSTRING:
        printf("%s\n", lua_tostring(LS, i));
        break;
      default :
        printf("(nieobslugiwany typ)\n");
    }
    
    // jeżeli argument jest liczbą to sumujemy
    // w zasadzie moznaby to robic w powyzszym case, ale chialem pokazac funkcje lua_isnumber
    if (lua_isnumber(LS, i))
      wynik += lua_tonumber(LS, i);
  }
  printf("Wynik %f\n", wynik);
  
  // odkladamy na stos wartosci zwracane przez funkce
  lua_pushnumber(LS, wynik);
  lua_pushstring(LS, "UDALO SIE");
  
  // zwracamy liczbę argumentow odlozonych jako wynik
  return 2;
}

main(int argc, char *argv[]) {
  if (argc <2) {
    puts("Nie podano argumentu określającego skrypt Lua");
      return -1;
  }
  // wywolujemy funckje tworzaca nowy "kontekst" obsługi skryptów Lua
  // w rzeczywistości jest to funkcja z lauxlib obudowująca wywaołania lua_newstate itd
  lua_State *LS = luaL_newstate();
  if (LS == NULL) {
    puts("Nie udało się zainicjalizować systemu Lua");
    return -1;
  }
  
  // ładujemy do wskazanego kontekstu wszystkie biblioteki języka Lua
  luaL_openlibs(LS);
  
  // korzystamy z kolejnej funkcji lauxlib
  // tym razem upraszcza ona ładowanie skryptów do "kontekstu"
  if ( luaL_loadfile(LS, argv[1]) ) {
    // wyświetlamy błąd zwrócony przez lua - jest na szczycie stosu
    printf("Nie udało się załadować skrypt Lua %s", lua_tostring(LS, -1));
    // kończymy działanie
    lua_close(LS);
    return -1;
  }
  
  // przygotowujemy dane na których będzie operował skrypt - tablica
  lua_newtable(LS);
  
  lua_pushnumber(LS, 1); // kładziemy indeks
  lua_pushfstring (LS, "a=%d b=%s", 3, "aby"); // kładziemy wartość
  lua_rawset(LS, -3); // tworzymy parę zgrupowaną w tablicy
  
  lua_pushstring(LS, "dwa"); // powtarzamy dla kolejnych elementów tablicy ...
  lua_pushnumber(LS, 8);
  lua_rawset(LS, -3);
  
  lua_setglobal(LS, "tabelka"); // nadajemy nazwę naszej tablicy
  
  // funkcja
  lua_pushcfunction(LS, funkcja_dla_lua);
  lua_setglobal(LS, "funkcja_z_c");
  
  // wykonanie skryptu
  if ( lua_pcall(LS, 0, LUA_MULTRET, 0) ) {
    printf("Nie udało się wykonać skrypt Lua %s", lua_tostring(LS, -1));
    lua_close(LS);
    return -1;
  }
  
  printf("Wynik %f %f %s\n",
    lua_tonumber(LS, -3), lua_tonumber(LS, -2), lua_tostring(LS, -1));
  // warto zwrócić uwagę na odwrotną kolejność odwołań niż kładzenia - stos ...
  // warto także zauważyć że lua_tonumber daje nam wartość zmiennoprzecinkową
  
  // zdejmujemy wszystkie 3 wyniki ze stosu
  printf("Elementów na stosie: %d\n", lua_gettop(LS));
  lua_pop(LS, 3);
  
  // uproszczona metoda wywołania wybranej funkccji skryptu lua
  // więcej na http://lua-users.org/wiki/LuaGenericCall
  int val;
  lua_genpcall(LS, "return jakas_funkcja(2)", ">%d", &val);
  printf("Zwrocilo: %d\n", val);
  
  // niszczymy mechanizm obsługi Lua
  lua_close(LS);
}

XHTML generated by highlight (http://www.andre-simon.de/) from c_lua_api.c



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/programing/c_cpp/c_lua_api.c) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2014-01-07 19:27:41 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).