Merge branch 'evelu-fix-engines' of https://github.com/ErwanAliasr1/fio
[fio.git] / json.c
diff --git a/json.c b/json.c
index 2160d296445fae5cf5aebbd8fbdb91155bf71cfc..cd3d5d74db12aab06409e523b95d9eed3c013682 100644 (file)
--- a/json.c
+++ b/json.c
@@ -1,6 +1,5 @@
 #include <stdlib.h>
 #include <string.h>
-#include <stdio.h>
 #include <errno.h>
 #include <stdarg.h>
 #include "json.h"
@@ -195,25 +194,31 @@ static int json_object_add_pair(struct json_object *obj, struct json_pair *pair)
        return 0;
 }
 
-int json_object_add_value_type(struct json_object *obj, const char *name, int type, ...)
+int json_object_add_value_type(struct json_object *obj, const char *name,
+                              const struct json_value *arg)
 {
        struct json_value *value;
        struct json_pair *pair;
-       va_list args;
        int ret;
 
-       va_start(args, type);
-       if (type == JSON_TYPE_STRING)
-               value = json_create_value_string(va_arg(args, char *));
-       else if (type == JSON_TYPE_INTEGER)
-               value = json_create_value_int(va_arg(args, long long));
-       else if (type == JSON_TYPE_FLOAT)
-               value = json_create_value_float(va_arg(args, double));
-       else if (type == JSON_TYPE_OBJECT)
-               value = json_create_value_object(va_arg(args, struct json_object *));
-       else
-               value = json_create_value_array(va_arg(args, struct json_array *));
-       va_end(args);
+       switch (arg->type) {
+       case JSON_TYPE_STRING:
+               value = json_create_value_string(arg->string);
+               break;
+       case JSON_TYPE_INTEGER:
+               value = json_create_value_int(arg->integer_number);
+               break;
+       case JSON_TYPE_FLOAT:
+               value = json_create_value_float(arg->float_number);
+               break;
+       case JSON_TYPE_OBJECT:
+               value = json_create_value_object(arg->object);
+               break;
+       default:
+       case JSON_TYPE_ARRAY:
+               value = json_create_value_array(arg->array);
+               break;
+       }
 
        if (!value)
                return ENOMEM;
@@ -231,25 +236,30 @@ int json_object_add_value_type(struct json_object *obj, const char *name, int ty
        return 0;
 }
 
-static void json_print_array(struct json_array *array, struct buf_output *);
-int json_array_add_value_type(struct json_array *array, int type, ...)
+int json_array_add_value_type(struct json_array *array,
+                             const struct json_value *arg)
 {
        struct json_value *value;
-       va_list args;
        int ret;
 
-       va_start(args, type);
-       if (type == JSON_TYPE_STRING)
-               value = json_create_value_string(va_arg(args, char *));
-       else if (type == JSON_TYPE_INTEGER)
-               value = json_create_value_int(va_arg(args, long long));
-       else if (type == JSON_TYPE_FLOAT)
-               value = json_create_value_float(va_arg(args, double));
-       else if (type == JSON_TYPE_OBJECT)
-               value = json_create_value_object(va_arg(args, struct json_object *));
-       else
-               value = json_create_value_array(va_arg(args, struct json_array *));
-       va_end(args);
+       switch (arg->type) {
+       case JSON_TYPE_STRING:
+               value = json_create_value_string(arg->string);
+               break;
+       case JSON_TYPE_INTEGER:
+               value = json_create_value_int(arg->integer_number);
+               break;
+       case JSON_TYPE_FLOAT:
+               value = json_create_value_float(arg->float_number);
+               break;
+       case JSON_TYPE_OBJECT:
+               value = json_create_value_object(arg->object);
+               break;
+       default:
+       case JSON_TYPE_ARRAY:
+               value = json_create_value_array(arg->array);
+               break;
+       }
 
        if (!value)
                return ENOMEM;
@@ -297,8 +307,8 @@ static void json_print_level(int level, struct buf_output *out)
 }
 
 static void json_print_pair(struct json_pair *pair, struct buf_output *);
-static void json_print_array(struct json_array *array, struct buf_output *);
 static void json_print_value(struct json_value *value, struct buf_output *);
+
 void json_print_object(struct json_object *obj, struct buf_output *out)
 {
        int i;
@@ -340,13 +350,9 @@ static void json_print_array(struct json_array *array, struct buf_output *out)
 static void json_print_value(struct json_value *value, struct buf_output *out)
 {
        switch (value->type) {
-       case JSON_TYPE_STRING: {
-                       const char delimiter = '"';
-                       buf_output_add(out, &delimiter, sizeof(delimiter));
-                       buf_output_add(out, value->string, strlen(value->string));
-                       buf_output_add(out, &delimiter, sizeof(delimiter));
-                       break;
-               }
+       case JSON_TYPE_STRING:
+               log_buf(out, "\"%s\"", value->string);
+               break;
        case JSON_TYPE_INTEGER:
                log_buf(out, "%lld", value->integer_number);
                break;