Config-UCL

 view release on metacpan or  search on metacpan

libucl-0.8.1/include/lua_ucl.h  view on Meta::CPAN

#endif

#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include "ucl.h"

/**
 * Closure structure for lua function storing inside UCL
 */
struct ucl_lua_funcdata {
	lua_State *L;
	int idx;
	char *ret;
};

/**
 * Initialize lua UCL API
 */
UCL_EXTERN int luaopen_ucl (lua_State *L);

libucl-0.8.1/include/lua_ucl.h  view on Meta::CPAN


/**
 * Push an object to lua
 * @param L lua state
 * @param obj object to push
 * @param allow_array traverse over implicit arrays
 */
UCL_EXTERN int ucl_object_push_lua (lua_State *L,
		const ucl_object_t *obj, bool allow_array);

UCL_EXTERN struct ucl_lua_funcdata* ucl_object_toclosure (
		const ucl_object_t *obj);

#endif /* LUA_UCL_H_ */

libucl-0.8.1/lua/lua_ucl.c  view on Meta::CPAN

		const ucl_object_t *obj)
{
	lua_pushstring (L, key);
	ucl_object_push_lua (L, obj, true);
	lua_settable (L, -3);
}

static void
lua_ucl_userdata_dtor (void *ud)
{
	struct ucl_lua_funcdata *fd = (struct ucl_lua_funcdata *)ud;

	luaL_unref (fd->L, LUA_REGISTRYINDEX, fd->idx);
	if (fd->ret != NULL) {
		free (fd->ret);
	}
	free (fd);
}

static const char *
lua_ucl_userdata_emitter (void *ud)
{
	struct ucl_lua_funcdata *fd = (struct ucl_lua_funcdata *)ud;
	const char *out = "";

	lua_rawgeti (fd->L, LUA_REGISTRYINDEX, fd->idx);

	lua_pcall (fd->L, 0, 1, 0);
	out = lua_tostring (fd->L, -1);

	if (out != NULL) {
		/* We need to store temporary string in a more appropriate place */
		if (fd->ret) {

libucl-0.8.1/lua/lua_ucl.c  view on Meta::CPAN

	return 1;
}

/**
 * Push a simple object to lua depending on its actual type
 */
static int
ucl_object_lua_push_scalar (lua_State *L, const ucl_object_t *obj,
		bool allow_array)
{
	struct ucl_lua_funcdata *fd;

	if (allow_array && obj->next != NULL) {
		/* Actually we need to push this as an array */
		return ucl_object_lua_push_array (L, obj);
	}

	switch (obj->type) {
	case UCL_BOOLEAN:
		lua_pushboolean (L, ucl_obj_toboolean (obj));
		break;

libucl-0.8.1/lua/lua_ucl.c  view on Meta::CPAN

#endif
		break;
	case UCL_FLOAT:
	case UCL_TIME:
		lua_pushnumber (L, ucl_obj_todouble (obj));
		break;
	case UCL_NULL:
		lua_getfield (L, LUA_REGISTRYINDEX, "ucl.null");
		break;
	case UCL_USERDATA:
		fd = (struct ucl_lua_funcdata *)obj->value.ud;
		lua_rawgeti (L, LUA_REGISTRYINDEX, fd->idx);
		break;
	default:
		lua_pushnil (L);
		break;
	}

	return 1;
}

libucl-0.8.1/lua/lua_ucl.c  view on Meta::CPAN

 * @param L
 * @param obj
 * @param idx
 */
static ucl_object_t *
ucl_object_lua_fromelt (lua_State *L, int idx, ucl_string_flags_t flags)
{
	int type;
	double num;
	ucl_object_t *obj = NULL;
	struct ucl_lua_funcdata *fd;
	const char *str;
	size_t sz;

	type = lua_type (L, idx);

	switch (type) {
	case LUA_TSTRING:
		str = lua_tolstring (L, idx, &sz);

		if (str) {

libucl-0.8.1/lua/lua_ucl.c  view on Meta::CPAN

	lua_setmetatable (L, -2);

	lua_pushvalue (L, -1);
	lua_setfield (L, LUA_REGISTRYINDEX, "ucl.null");

	lua_setfield (L, -2, "null");

	return 1;
}

struct ucl_lua_funcdata*
ucl_object_toclosure (const ucl_object_t *obj)
{
	if (obj == NULL || obj->type != UCL_USERDATA) {
		return NULL;
	}

	return (struct ucl_lua_funcdata*)obj->value.ud;
}



( run in 0.535 second using v1.01-cache-2.11-cpan-454fe037f31 )