From a121cef86fcf7b3f4e3a8f067a68795da14de72c Mon Sep 17 00:00:00 2001 From: Laria Carolin Chabowski Date: Tue, 2 Apr 2019 21:43:25 +0200 Subject: Expose additional libuuid functions --- lua_uuid.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 90 insertions(+), 2 deletions(-) (limited to 'lua_uuid.c') diff --git a/lua_uuid.c b/lua_uuid.c index 94d76b1..60f779c 100644 --- a/lua_uuid.c +++ b/lua_uuid.c @@ -4,11 +4,14 @@ Utility for generating UUIDs by wrapping libuuid's generate(). @license MIT @module lua_uuid */ +#include #include #include #include -/// Generate a UUID +#define UUID_LEN 16 + +/// Generate a UUID. As a shortcut, you can also call the module directly to generate a uuid. // @return uuid_str // @function generate() static int generate(lua_State *L) { @@ -22,7 +25,92 @@ static int generate(lua_State *L) { return 1; } +/// Generate a binary UUID +// @return uuid +// @function generate_binary() +static int generate_binary(lua_State *L) { + uuid_t uuid; + uuid_generate(uuid); + + lua_pushlstring(L, (char *)&uuid, UUID_LEN); + return 1; +} + +/// Unparse UUID (create a hex string representation from a binary string representation) +// @tparam string binary_uuid +// @treturn string uuid_str +// @error if the binary_uuid could not be unparsed +// @function unparse +static int unparse(lua_State *L) { + const char *binary_uuid; + size_t binary_uuid_len; + uuid_t uuid; + char uuid_str[37]; + + binary_uuid = luaL_checklstring(L, 1, &binary_uuid_len); + + if (binary_uuid_len != UUID_LEN) { + lua_pushnil(L); + lua_pushfstring(L, "could not unparse uuid: string length was != %d", UUID_LEN); + return 2; + } + + memcpy(&uuid[0], binary_uuid, UUID_LEN); + + uuid_unparse_lower(uuid, uuid_str); + + lua_pushstring(L, uuid_str); + return 1; +} + +/// Parse a hexadecimal UUID into a binary representation +// @tparam string uuid_str +// @treturn string uuid +// @error if the uuid_str could not be parsed +// @function parse +static int parse(lua_State *L) { + const char *uuid_str; + uuid_t uuid; + + uuid_str = luaL_checkstring(L, 1); + + if (uuid_parse(uuid_str, uuid) != 0) { + lua_pushnil(L); + lua_pushstring(L, "could not parse uuid"); + return 2; + } + + lua_pushlstring(L, (char *)uuid, UUID_LEN); + return 1; +} + +static int mt_call(lua_State *L) { + lua_pop(L, 1); + return generate(L); +} + +static const struct luaL_Reg mylib [] = { + {"generate", generate}, + {"generate_binary", generate_binary}, + {"unparse", unparse}, + {"parse", parse}, + {NULL, NULL} +}; + int luaopen_lua_uuid(lua_State *L) { - lua_pushcfunction(L, generate); + // Set up library table + lua_newtable(L); + const luaL_Reg *fundef = mylib; + for(fundef = mylib; fundef->name != NULL; fundef++) { + lua_pushcfunction(L, fundef->func); + lua_setfield(L, -2, fundef->name); + } + + // Set up metatable + lua_newtable(L); + lua_pushcfunction(L, mt_call); + lua_setfield(L, -2, "__call"); + + lua_setmetatable(L, -2); return 1; } -- cgit v1.2.3-54-g00ecf