Beispiel #1
0
/* Convert TOML table to JSON.
 */
static int table_to_json (toml_table_t *tab, json_t **op)
{
    int i;
    int saved_errno;
    json_t *obj;

    if (!(obj = json_object ()))
        goto nomem;
    for (i = 0; ; i++) {
        const char *key;
        const char *raw;
        toml_table_t *subtab;
        toml_array_t *arr;
        json_t *val = NULL;

        if (!(key = toml_key_in (tab, i)))
            break;
        if ((raw = toml_raw_in (tab, key))) {
            if (value_to_json (raw, &val) < 0)
                goto error;
        }
        else if ((subtab = toml_table_in (tab, key))) {
            if (table_to_json (subtab, &val) < 0)
                goto error;
        }
        else if ((arr = toml_array_in (tab, key))) {
            if (array_to_json (arr, &val) < 0)
                goto error;
        }
        if (json_object_set_new (obj, key, val) < 0) {
            json_decref (val);
            goto nomem;
        }
    }
    *op = obj;
    return 0;
nomem:
    errno = ENOMEM;
error:
    saved_errno = errno;
    json_decref (obj);
    errno = saved_errno;
    return -1;
}
Beispiel #2
0
/* Convert TOML array to JSON.
 */
static int array_to_json (toml_array_t *arr, json_t **op)
{
    int i;
    int saved_errno;
    json_t *obj;

    if (!(obj = json_array ()))
        goto nomem;
    for (i = 0; ; i++) {
        const char *raw;
        json_t *val;
        toml_table_t *tab;
        toml_array_t *subarr;

        if ((raw = toml_raw_at (arr, i))) {
            if (value_to_json (raw, &val) < 0)
                goto error;
        }
        else if ((tab = toml_table_at (arr, i))) {
            if (table_to_json (tab, &val) < 0)
                goto error;
        }
        else if ((subarr = toml_array_at (arr, i))) {
            if (array_to_json (subarr, &val) < 0)
                goto error;
        }
        else
            break;
        if (json_array_append_new (obj, val) < 0) {
            json_decref (val);
            goto nomem;
        }
    }
    *op = obj;
    return 0;
nomem:
    errno = ENOMEM;
error:
    saved_errno = errno;
    json_decref (obj);
    errno = saved_errno;
    return -1;
}
Beispiel #3
0
json_object *
value_to_json(struct svalue *sp)
{
    static int depth = 0;
    json_object *ret = NULL; 

    if (++depth > MAX_DEPTH)
    {
        depth = 0;
        error("Too deep recursion");
    }

    switch(sp->type) {
        case T_NUMBER:
            ret = int_to_json(sp);
            break;
        case T_STRING:
            ret = string_to_json(sp);
            break;
        case T_POINTER:
            ret = array_to_json(sp);
            break;
        case T_MAPPING:
            ret = mapping_to_json(sp);
            break;
        case T_FLOAT:
            ret = float_to_json(sp);
            break;
        default:
            error("Unsupported data type in val2json");
            break;
    }

    depth--;
    return ret;
}