add new json based config file
[uwplayer.git] / application / json.c
index 6b126d4..bd27f2f 100644 (file)
@@ -51,6 +51,13 @@ JSONParser* json_parser_new(void) {
     return parser;
 }
 
+void json_parser_free(JSONParser *p) {
+    if(p->states) free(p->states);
+    if(p->readvalue_stack) free(p->readvalue_stack);
+    
+    free(p);
+}
+
 void json_parser_fill(JSONParser *p, const char *buf, size_t size) {
     p->buffer = buf;
     p->size = size;
@@ -614,9 +621,10 @@ int json_reader_isnull(JSONParser *p) {
 
 JSONLiteralType json_reader_literal(JSONParser *p) {
     const char *l = p->reader_token.content;
-    if(!strcmp(l, "true")) {
+    size_t token_len = p->reader_token.length;
+    if(token_len == 4 && !memcmp(l, "true", 4)) {
         return JSON_TRUE;
-    } else if(!strcmp(l, "false")) {
+    } else if(token_len == 5 && !memcmp(l, "false", 5)) {
         return JSON_FALSE;
     }
     return JSON_NULL;
@@ -744,10 +752,11 @@ static int add_to_parent(JSONParser *p, JSONValue *parent, JSONValue *v) {
 static int readvaluestack_add(JSONParser *p, JSONValue *v) {
     if(p->readvalue_nelm == p->readvalue_alloc) {
         p->readvalue_alloc *= 2;
-        p->readvalue_stack = realloc(p->readvalue_stack, sizeof(JSONValue*) * p->readvalue_alloc);
-        if(!p->readvalue_stack) {
+        JSONValue **new_stack = realloc(p->readvalue_stack, sizeof(JSONValue*) * p->readvalue_alloc);
+        if(!new_stack) {
             return -1;
         }
+        p->readvalue_stack = new_stack;
     }
     p->readvalue_stack[p->readvalue_nelm++] = v;
     return 0;
@@ -842,3 +851,63 @@ int json_read_value(JSONParser *p, JSONValue **value) {
     return 1;
 }
 
+JSONValue* json_obj_get(JSONObject *obj, const char *name) {
+    for(size_t i=0;i<obj->size;i++) {
+        if(!strcmp(obj->values[i].name, name)) {
+            return obj->values[i].value;
+        }
+    }
+    return NULL;
+}
+
+JSONValue* json_array_get(JSONArray *array, size_t i) {
+    if(i >= array->size) return NULL;
+    return array->array[i];
+}
+
+void json_value_free(JSONValue *value) {
+    switch(value->type) {
+        case JSON_OBJECT: {
+            JSONObject obj = value->value.object;
+            for(size_t i=0;i<obj.size;i++) {
+                json_value_free(obj.values[i].value);
+                free(obj.values[i].name);
+            }
+            free(obj.values);
+            break;
+        }
+        case JSON_ARRAY: {
+            JSONArray array = value->value.array;
+            for(size_t i=0;i<array.size;i++) {
+                json_value_free(array.array[i]);
+            }
+            free(array.array);
+            break;
+        }
+        case JSON_STRING: {
+            free(value->value.string.string);
+            break;
+        }
+        default: {
+            break;
+        }
+    }
+    free(value);
+}
+
+int json_strcmp(JSONValue *jsstr, const char *str) {
+    return json_strncmp(jsstr, str, strlen(str));
+}
+
+int json_strncmp(JSONValue *jsstr, const char *str, size_t slen) {
+    if(jsstr->type != JSON_STRING) {
+        return -1;
+    }
+    size_t jsstrlen = jsstr->value.string.length;
+    
+    if(jsstrlen != slen) {
+        return jsstrlen > slen ? 1 : -1;
+    }
+    
+    return memcmp(jsstr->value.string.string, str, slen);
+}