/* Render a value to text. */ static char *print_value(srjson_doc_t *doc, srjson_t *item, int depth, int fmt) { char *out = 0; if (!item) return 0; switch ((item->type) & 255) { case srjson_NULL: out = srjson_strdup(doc, "null"); break; case srjson_False: out = srjson_strdup(doc, "false"); break; case srjson_True: out = srjson_strdup(doc, "true"); break; case srjson_Number: out = print_number(doc, item); break; case srjson_String: out = print_string(doc, item); break; case srjson_Array: out = print_array(doc, item, depth, fmt); break; case srjson_Object: out = print_object(doc, item, depth, fmt); break; } return out; }
srjson_t *srjson_CreateString(srjson_doc_t *doc, const char *string) { srjson_t *item = srjson_New_Item(doc); if (item) { item->type = srjson_String; item->valuestring = srjson_strdup(doc, string); } return item; }
void srjson_AddItemToObject(srjson_doc_t *doc, srjson_t *object, const char *string, srjson_t *item) { if (!item) return; if (item->string) doc->free_fn(item->string); item->string = srjson_strdup(doc, string); srjson_AddItemToArray(doc, object, item); }
void srjson_ReplaceItemInObject(srjson_doc_t *doc, srjson_t * object, const char *string, srjson_t *newitem) { int i = 0; srjson_t *c = object->child; while (c && srjson_strcasecmp(c->string, string)) i++, c = c->next; if (c) { newitem->string = srjson_strdup(doc, string); srjson_ReplaceItemInArray(doc, object, i, newitem); } }
/* Render the cstring provided to an escaped version that can be printed. */ static char *print_string_ptr(srjson_doc_t *doc, const char *str) { const char *ptr; char *ptr2, *out; int len = 0; unsigned char token; if (!str) return srjson_strdup(doc, ""); ptr = str; while ((token = *ptr) && ++len) { if (strchr("\"\\\b\f\n\r\t", token)) len++; else if (token < 32) len += 5; ptr++; } out = (char *) doc->malloc_fn(len + 3); if (!out) return 0; ptr2 = out; ptr = str; *ptr2++ = '\"'; while (*ptr) { if ((unsigned char) *ptr > 31 && *ptr != '\"' && *ptr != '\\') *ptr2++ = *ptr++; else { *ptr2++ = '\\'; switch (token = *ptr++) { case '\\': *ptr2++ = '\\'; break; case '\"': *ptr2++ = '\"'; break; case '\b': *ptr2++ = 'b'; break; case '\f': *ptr2++ = 'f'; break; case '\n': *ptr2++ = 'n'; break; case '\r': *ptr2++ = 'r'; break; case '\t': *ptr2++ = 't'; break; default: sprintf(ptr2, "u%04x", token); ptr2 += 5; break; /* escape and print */ } } } *ptr2++ = '\"'; *ptr2++ = 0; return out; }