예제 #1
0
/* 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;
}
예제 #2
0
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;
}
예제 #3
0
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);
}
예제 #4
0
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);
    }
}
예제 #5
0
/* 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;
}