Упаковка библиотеки C для Lua: как мне создать вложенные таблицы функций?

Код, связанный с этим вопросом, находится здесь: https://github.com / jchester / lua-polarssl / tree / master / src

В настоящее время я пытаюсь обернуть одну часть библиотеки PolarSSL (http://polarssl.org), чтобы предоставить мне доступ к HMAC SHA-512 (luacrypto не предоставьте это).

API, к которому я стремлюсь, имеет форму:

a_sha512_hash = polarssl.hash.sha512('text')

или более подробно

local polarssl = require 'polarssl'
local hash = polarssl.hash

a_sha512_hash = hash.sha512('test')

Если вы обратитесь к polarssl.c в приведенной выше ссылке, вы увидите, что я написал функции, которые являются оболочкой для кода PolarSSL. Затем я пытаюсь построить таблицы функций следующим образом:

LUA_API int luaopen_polarssl( lua_State *L ) {
  static const struct luaL_Reg core[] = {
    { NULL, NULL }
  };

  static const struct luaL_Reg hash_functions[] = {
    { "sha512", hash_sha512 },
    { "sha384", hash_sha384 },
    { NULL, NULL }
  };

  static const struct luaL_Reg hmac_functions[] = {
    { "sha512", hmac_sha512 },
    { "sha384", hmac_sha384 },
    { NULL, NULL }
  };

  luaL_register( L, CORE_MOD_NAME, core );
  luaL_register( L, HASH_MOD_NAME, hash_functions );
  luaL_register( L, HMAC_MOD_NAME, hmac_functions );

  return 1;
}

Где CORE_MOD_NAME = 'polarssl', HASH_MOD_NAME = 'polarssl.hash', HMAC_MOD_NAME = 'polarssl.hmac'.

Когда я запускаю тестовый сценарий, похожий на код Lua в верхней части этого вопроса, я получаю следующее:

lua: test.lua:23: attempt to index global 'polarssl' (a nil value)
stack traceback:
    test.lua:23: in main chunk
    [C]: ?

Я пробовал искать примеры того, как достичь этого подхода module.submodule (например, naim против luasockets ), но, похоже, у каждого есть свой способ достичь этого. Я совершенно заблудился.

10
задан Daniel Roethlisberger 14 December 2012 в 11:38
поделиться