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;
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;
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;
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);
+}