JSON *null_type_parse(){ next_char(); assert(*s == 'u'); next_char(); assert(*s == 'l'); next_char(); assert(*s == 'l'); next_char(); return CreateNULL(); }
JSON *Duplicate(JSON *obj, int recurse){ switch (obj->type){ case JSON_NULL: return CreateNULL(); case JSON_TRUE: return CreateTrue(); case JSON_FALSE: return CreateFalse(); case JSON_NUMBER: return CreateNumber(obj->valuedouble); case JSON_STRING: return CreateString(obj->valuestring); case JSON_ARRAY:{ JSON *new_obj = CreateArray(); if (recurse == 0) new_obj->son = obj->son; else{ if (obj->son != NULL){ new_obj->son = Duplicate(obj->son, 1); JSON *old_item = obj->son, *new_item = new_obj->son; for ( ; old_item->next != NULL; old_item = old_item->next, new_item = new_item->next){ JSON *temp = Duplicate(old_item->next,1); new_item->next = temp; temp->last = new_item; } } } return new_obj; } case JSON_OBJECT:{ JSON *new_obj = CreateObject(); if (recurse == 0) new_obj->son = obj->son; else{ if (obj->son != NULL){ new_obj->son = Duplicate(obj->son, 1); JSON *old_item = obj->son, *new_item = new_obj->son; for ( ; old_item->next != NULL; old_item = old_item->next, new_item = new_item->next){ JSON *temp = Duplicate(old_item->next,1); new_item->next = temp; temp->last = new_item; } } } return new_obj; } case JSON_ENTRY:{ JSON *new_obj = CreateEntry(obj->key, Duplicate(obj->value,1)); return new_obj; } default: return NULL; } }
JSON *Duplicate(JSON *item, int recurse) { JSON *rtn = NULL; JSON *iter = NULL; unsigned int i = 0; if (item == NULL) { printf("Exception: Cannot duplicate a NULL JSON pointer.\n"); return rtn; } switch (item->type) { case JSON_NULL: rtn = CreateNULL(); return rtn; case JSON_FALSE: rtn = CreateFalse(); return rtn; case JSON_TRUE: rtn = CreateTrue(); return rtn; case JSON_NUMBER: rtn = CreateNumber(item->valuedouble); return rtn; case JSON_STRING: rtn = CreateString(item->valuestring); return rtn; case JSON_ARRAY: rtn = CreateArray(); if (recurse == 1) { iter = item->childstart; for (i = 0; i < item->childlength; ++i) { AddItemToArray(rtn, Duplicate(iter, 1)); iter = iter->next; } } else { rtn->childlength = item->childlength; rtn->childstart = item->childstart; rtn->childend = item->childend; } return rtn; case JSON_OBJECT: rtn = CreateObject(); if (recurse == 1) { iter = item->childstart; for (i = 0; i < item->childlength; ++i) { AddItemToObject(rtn, iter->key, Duplicate(iter, 1)); iter = iter->next; } } else { rtn->childlength = item->childlength; rtn->childstart = item->childstart; rtn->childend = item->childend; } return rtn; } }
JSON *ParseJSON(const char *value) { JSON *rtn = NULL; StrSlice *ss = NULL; StrSlice *iter = NULL; int len = strlen(value); int index = 0; char *value_deletespace = DeleteSpaces(value); switch(value[0]) { case '-': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': //To number return CreateNumber(FormatNumber(value_deletespace)); free(value_deletespace); break; case '\"': // To string return CreateString(FormatString(value)); break; case '{': rtn = CreateObject(); ss = GetObjectSlices(value); iter = ss; if (ss->length == 0) { DeleteStrSlice(ss); return rtn; } while (iter != NULL) { AddItemToObject(rtn, FormatString(iter->str), ParseJSON(DeleteSpaces(iter->next->str))); iter = iter->next->next; } DeleteStrSlice(ss); return rtn; break; case '[': rtn = CreateArray(); ss = GetArraySlices(value); iter = ss; if (ss->length == 0) { DeleteStrSlice(ss); return rtn; } while (iter != NULL) { AddItemToArray(rtn, ParseJSON(DeleteSpaces(iter->str))); iter = iter->next; } DeleteStrSlice(ss); return rtn; break; case 'n': if (strcmp(value_deletespace, "null") == 0) { free(value_deletespace); return CreateNULL(); } else { printf("Exception: Invalid Syntax \"%s\"", value); return NULL; } case 't': if (strcmp(value_deletespace, "true") == 0) { free(value_deletespace); return CreateTrue(); } else { printf("Exception: Invalid Syntax \"%s\"", value); return NULL; } break; case 'f': if (strcmp(value_deletespace, "false") == 0) { free(value_deletespace); return CreateFalse(); } else { printf("Exception: Invalid Syntax \"%s\"", value); return NULL; } break; } }