1 #ifndef __JSON__H 2 #define __JSON__H 3 4 #include "lib/output_buffer.h" 5 6 #define JSON_TYPE_STRING 0 7 #define JSON_TYPE_INTEGER 1 8 #define JSON_TYPE_FLOAT 2 9 #define JSON_TYPE_OBJECT 3 10 #define JSON_TYPE_ARRAY 4 11 #define JSON_PARENT_TYPE_PAIR 0 12 #define JSON_PARENT_TYPE_ARRAY 1 13 struct json_value { 14 int type; 15 union { 16 long long integer_number; 17 double float_number; 18 char *string; 19 struct json_object *object; 20 struct json_array *array; 21 }; 22 int parent_type; 23 union { 24 struct json_pair *parent_pair; 25 struct json_array *parent_array; 26 }; 27 }; 28 29 struct json_array { 30 struct json_value **values; 31 int value_cnt; 32 struct json_value *parent; 33 }; 34 35 struct json_object { 36 struct json_pair **pairs; 37 int pair_cnt; 38 struct json_value *parent; 39 }; 40 41 struct json_pair { 42 char *name; 43 struct json_value *value; 44 struct json_object *parent; 45 }; 46 47 struct json_object *json_create_object(void); 48 struct json_array *json_create_array(void); 49 50 void json_free_object(struct json_object *obj); 51 52 int json_object_add_value_type(struct json_object *obj, const char *name, 53 const struct json_value *val); 54 55 static inline int json_object_add_value_int(struct json_object *obj, 56 const char *name, long long val) 57 { 58 struct json_value arg = { 59 .type = JSON_TYPE_INTEGER, 60 }; 61 62 arg.integer_number = val; 63 return json_object_add_value_type(obj, name, &arg); 64 } 65 66 static inline int json_object_add_value_float(struct json_object *obj, 67 const char *name, double val) 68 { 69 struct json_value arg = { 70 .type = JSON_TYPE_FLOAT, 71 }; 72 73 arg.float_number = val; 74 return json_object_add_value_type(obj, name, &arg); 75 } 76 77 static inline int json_object_add_value_string(struct json_object *obj, 78 const char *name, 79 const char *val) 80 { 81 struct json_value arg = { 82 .type = JSON_TYPE_STRING, 83 }; 84 85 arg.string = strdup(val ? : ""); 86 return json_object_add_value_type(obj, name, &arg); 87 } 88 89 static inline int json_object_add_value_object(struct json_object *obj, 90 const char *name, 91 struct json_object *val) 92 { 93 struct json_value arg = { 94 .type = JSON_TYPE_OBJECT, 95 }; 96 97 arg.object = val; 98 return json_object_add_value_type(obj, name, &arg); 99 } 100 101 static inline int json_object_add_value_array(struct json_object *obj, 102 const char *name, 103 struct json_array *val) 104 { 105 struct json_value arg = { 106 .type = JSON_TYPE_ARRAY, 107 }; 108 109 arg.array = val; 110 return json_object_add_value_type(obj, name, &arg); 111 } 112 113 int json_array_add_value_type(struct json_array *array, 114 const struct json_value *val); 115 116 static inline int json_array_add_value_int(struct json_array *obj, 117 long long val) 118 { 119 struct json_value arg = { 120 .type = JSON_TYPE_INTEGER, 121 }; 122 123 arg.integer_number = val; 124 return json_array_add_value_type(obj, &arg); 125 } 126 127 static inline int json_array_add_value_float(struct json_array *obj, 128 double val) 129 { 130 struct json_value arg = { 131 .type = JSON_TYPE_FLOAT, 132 }; 133 134 arg.float_number = val; 135 return json_array_add_value_type(obj, &arg); 136 } 137 138 static inline int json_array_add_value_string(struct json_array *obj, 139 const char *val) 140 { 141 struct json_value arg = { 142 .type = JSON_TYPE_STRING, 143 }; 144 145 arg.string = (char *)val; 146 return json_array_add_value_type(obj, &arg); 147 } 148 149 static inline int json_array_add_value_object(struct json_array *obj, 150 struct json_object *val) 151 { 152 struct json_value arg = { 153 .type = JSON_TYPE_OBJECT, 154 }; 155 156 arg.object = val; 157 return json_array_add_value_type(obj, &arg); 158 } 159 160 static inline int json_array_add_value_array(struct json_array *obj, io_sample_set_ddir(struct io_log * log,struct io_sample * io,enum fio_ddir ddir)161 struct json_array *val) 162 { 163 struct json_value arg = { 164 .type = JSON_TYPE_ARRAY, 165 }; 166 167 arg.array = val; 168 return json_array_add_value_type(obj, &arg); 169 } 170 171 #define json_array_last_value_object(obj) \ 172 (obj->values[obj->value_cnt - 1]->object) 173 174 void json_print_object(struct json_object *obj, struct buf_output *out); 175 #endif log_entry_sz(struct io_log * log)176