add rpc event handler
[uwplayer.git] / application / json.c
index 6b126d4..719a570 100644 (file)
@@ -842,3 +842,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);
+}