This commit is contained in:
twinaphex 2015-04-04 21:10:36 +02:00
parent a7a1d60ecb
commit d41b55b25b
3 changed files with 100 additions and 94 deletions

View File

@ -3,35 +3,35 @@
#include <stdlib.h>
#include <string.h>
int libretrodb_lua_to_rmsgpack_value(
lua_State * L,
int index,
struct rmsgpack_dom_value * out
) {
int rv = -1;
int i;
int libretrodb_lua_to_rmsgpack_value(lua_State * L, int index, struct rmsgpack_dom_value * out)
{
lua_Number tmp_num;
size_t tmp_len;
int i, rv = -1;
const char * tmp_string = NULL;
char * tmp_buff = NULL;
struct rmsgpack_dom_value * tmp_value;
const int key_idx = -2;
const int value_idx = -1;
const int MAX_FIELDS = 100;
size_t tmp_len;
lua_Number tmp_num;
out->type = RDT_MAP;
out->map.len = 0;
out->map.items = calloc(MAX_FIELDS, sizeof(struct rmsgpack_dom_pair));
lua_pushnil(L);
while (lua_next(L, index - 1) != 0) {
if (out->map.len > MAX_FIELDS) {
while (lua_next(L, index - 1) != 0)
{
if (out->map.len > MAX_FIELDS)
printf("skipping due to too many keys\n");
} else if (!lua_isstring(L, key_idx)) {
else if (!lua_isstring(L, key_idx))
printf("skipping non string key\n");
} else if (lua_isnil(L, value_idx)) {
else if (lua_isnil(L, value_idx))
{
// Skipping nil value fields to save disk space
} else {
}
else
{
i = out->map.len;
tmp_buff = strdup(lua_tostring(L, key_idx));
out->map.items[i].key.type = RDT_STRING;
@ -39,7 +39,8 @@ int libretrodb_lua_to_rmsgpack_value(
out->map.items[i].key.string.buff = tmp_buff;
tmp_value = &out->map.items[i].value;
switch (lua_type(L, value_idx)) {
switch (lua_type(L, value_idx))
{
case LUA_TNUMBER:
tmp_num = lua_tonumber(L, value_idx);
tmp_value->type = RDT_INT;
@ -57,19 +58,25 @@ int libretrodb_lua_to_rmsgpack_value(
break;
case LUA_TTABLE:
lua_getfield(L, value_idx, "binary");
if (!lua_isstring(L, -1)) {
if (!lua_isstring(L, -1))
{
lua_pop(L, 1);
lua_getfield(L, value_idx, "uint");
if (!lua_isnumber(L, -1)) {
if (!lua_isnumber(L, -1))
{
lua_pop(L, 1);
goto set_nil;
} else {
}
else
{
tmp_num = lua_tonumber(L, -1);
tmp_value->type = RDT_UINT;
tmp_value->uint_ = tmp_num;
lua_pop(L, 1);
}
} else {
}
else
{
tmp_string = lua_tolstring(L, -1, &tmp_len);
tmp_buff = malloc(tmp_len);
memcpy(tmp_buff, tmp_string, tmp_len);
@ -90,4 +97,3 @@ set_nil:
rv = 0;
return rv;
}

View File

@ -345,11 +345,11 @@ static struct rmsgpack_dom_value q_glob(struct rmsgpack_dom_value input,
static struct rmsgpack_dom_value all_map(struct rmsgpack_dom_value input,
unsigned argc, const struct argument *argv)
{
unsigned i;
struct rmsgpack_dom_value res;
struct rmsgpack_dom_value *value = NULL;
struct argument arg;
struct rmsgpack_dom_value nil_value;
unsigned i;
struct rmsgpack_dom_value *value = NULL;
nil_value.type = RDT_NULL;
res.type = RDT_BOOL;