| | @@ -1595,17 +1595,27 @@ |
| 1595 | 1595 | static const cson_value cson_value_double_empty = { &cson_value_api_double, NULL, 0 }; |
| 1596 | 1596 | static const cson_value cson_value_string_empty = { &cson_value_api_string, NULL, 0 }; |
| 1597 | 1597 | static const cson_value cson_value_array_empty = { &cson_value_api_array, NULL, 0 }; |
| 1598 | 1598 | static const cson_value cson_value_object_empty = { &cson_value_api_object, NULL, 0 }; |
| 1599 | 1599 | |
| 1600 | | - |
| 1601 | 1600 | struct cson_string |
| 1602 | 1601 | { |
| 1603 | 1602 | unsigned int length; |
| 1604 | 1603 | }; |
| 1605 | 1604 | #define cson_string_empty_m {0/*length*/} |
| 1606 | 1605 | static const cson_string cson_string_empty = cson_string_empty_m; |
| 1606 | + |
| 1607 | + |
| 1608 | + |
| 1609 | +#define CSON_CAST(T,V) ((T*)((V)->value)) |
| 1610 | +#define CSON_VCAST(V) ((cson_value *)(((unsigned char *)(V))-sizeof(cson_value))) |
| 1611 | +#define CSON_INT(V) ((cson_int_t*)(V)->value) |
| 1612 | +#define CSON_DBL(V) CSON_CAST(cson_double_t,(V)) |
| 1613 | +#define CSON_STR(V) CSON_CAST(cson_string,(V)) |
| 1614 | +#define CSON_OBJ(V) CSON_CAST(cson_object,(V)) |
| 1615 | +#define CSON_ARRAY(V) CSON_CAST(cson_array,(V)) |
| 1616 | + |
| 1607 | 1617 | /** |
| 1608 | 1618 | |
| 1609 | 1619 | Holds special shared "constant" (though they are non-const) |
| 1610 | 1620 | values. |
| 1611 | 1621 | |
| | @@ -1876,11 +1886,11 @@ |
| 1876 | 1886 | allocated in a single chunk of memory, and the cson_string object |
| 1877 | 1887 | does not directly provide (or have) a pointer to the string bytes. |
| 1878 | 1888 | */ |
| 1879 | 1889 | static cson_string * cson_string_alloc(unsigned int len) |
| 1880 | 1890 | { |
| 1881 | | - if( ! len ) return &CSON_EMPTY_HOLDER.stringValue; |
| 1891 | + if( ! len ) return CSON_STR(&CSON_SPECIAL_VALUES[CSON_VAL_STR_EMPTY]); |
| 1882 | 1892 | else |
| 1883 | 1893 | { |
| 1884 | 1894 | cson_string * s = NULL; |
| 1885 | 1895 | const size_t msz = sizeof(cson_string) + len + 1 /*NUL*/; |
| 1886 | 1896 | unsigned char * mem = NULL; |
| | @@ -2265,18 +2275,10 @@ |
| 2265 | 2275 | @see cson_value_new_bool() |
| 2266 | 2276 | @see cson_value_free() |
| 2267 | 2277 | */ |
| 2268 | 2278 | static cson_value * cson_value_new(cson_type_id t, size_t extra); |
| 2269 | 2279 | |
| 2270 | | -#define CSON_CAST(T,V) ((T*)((V)->value)) |
| 2271 | | -#define CSON_VCAST(V) ((cson_value *)(((unsigned char *)(V))-sizeof(cson_value))) |
| 2272 | | -#define CSON_INT(V) ((cson_int_t*)(V)->value) |
| 2273 | | -#define CSON_DBL(V) CSON_CAST(cson_double_t,(V)) |
| 2274 | | -#define CSON_STR(V) CSON_CAST(cson_string,(V)) |
| 2275 | | -#define CSON_OBJ(V) CSON_CAST(cson_object,(V)) |
| 2276 | | -#define CSON_ARRAY(V) CSON_CAST(cson_array,(V)) |
| 2277 | | - |
| 2278 | 2280 | cson_value * cson_value_new(cson_type_id t, size_t extra) |
| 2279 | 2281 | { |
| 2280 | 2282 | static const size_t vsz = sizeof(cson_value); |
| 2281 | 2283 | const size_t sz = vsz + extra; |
| 2282 | 2284 | size_t tx = 0; |
| | @@ -2420,16 +2422,28 @@ |
| 2420 | 2422 | |
| 2421 | 2423 | cson_value * cson_value_new_object() |
| 2422 | 2424 | { |
| 2423 | 2425 | return cson_value_object_alloc(); |
| 2424 | 2426 | } |
| 2427 | + |
| 2428 | +cson_object * cson_new_object() |
| 2429 | +{ |
| 2430 | + |
| 2431 | + return cson_value_get_object( cson_value_new_object() ); |
| 2432 | +} |
| 2425 | 2433 | |
| 2426 | 2434 | cson_value * cson_value_new_array() |
| 2427 | 2435 | { |
| 2428 | 2436 | return cson_value_array_alloc(); |
| 2429 | 2437 | } |
| 2430 | 2438 | |
| 2439 | + |
| 2440 | +cson_array * cson_new_array() |
| 2441 | +{ |
| 2442 | + return cson_value_get_array( cson_value_new_array() ); |
| 2443 | +} |
| 2444 | + |
| 2431 | 2445 | /** |
| 2432 | 2446 | Frees kvp->key and kvp->value and sets them to NULL, but does not free |
| 2433 | 2447 | kvp. If !kvp then this is a no-op. |
| 2434 | 2448 | */ |
| 2435 | 2449 | static void cson_kvp_clean( cson_kvp * kvp ) |
| | @@ -2941,31 +2955,38 @@ |
| 2941 | 2955 | *CSON_DBL(c) = v; |
| 2942 | 2956 | } |
| 2943 | 2957 | return c; |
| 2944 | 2958 | } |
| 2945 | 2959 | } |
| 2946 | | -cson_value * cson_value_new_string( char const * str, unsigned int len ) |
| 2960 | + |
| 2961 | +cson_string const * cson_new_string(char const * str, unsigned int len) |
| 2947 | 2962 | { |
| 2948 | | - if( !str || !*str || !len ) return &CSON_SPECIAL_VALUES[CSON_VAL_STR_EMPTY]; |
| 2963 | + if( !str || !*str || !len ) return &CSON_EMPTY_HOLDER.stringValue; |
| 2949 | 2964 | else |
| 2950 | 2965 | { |
| 2951 | 2966 | cson_value * c = cson_value_new(CSON_TYPE_STRING, len + 1/*NUL byte*/); |
| 2967 | + cson_string * s = NULL; |
| 2952 | 2968 | if( c ) |
| 2953 | 2969 | { |
| 2954 | 2970 | char * dest = NULL; |
| 2955 | | - cson_string * s = CSON_STR(c); |
| 2971 | + s = CSON_STR(c); |
| 2956 | 2972 | *s = cson_string_empty; |
| 2957 | 2973 | assert( NULL != s ); |
| 2958 | 2974 | s->length = len; |
| 2959 | 2975 | dest = cson_string_str(s); |
| 2960 | 2976 | assert( NULL != dest ); |
| 2961 | 2977 | memcpy( dest, str, len ); |
| 2962 | 2978 | dest[len] = 0; |
| 2963 | 2979 | } |
| 2964 | | - return c; |
| 2980 | + return s; |
| 2965 | 2981 | } |
| 2966 | 2982 | } |
| 2983 | + |
| 2984 | +cson_value * cson_value_new_string( char const * str, unsigned int len ) |
| 2985 | +{ |
| 2986 | + return cson_string_value( cson_new_string(str, len) ); |
| 2987 | +} |
| 2967 | 2988 | |
| 2968 | 2989 | int cson_array_value_fetch( cson_array const * ar, unsigned int pos, cson_value ** v ) |
| 2969 | 2990 | { |
| 2970 | 2991 | if( !ar) return cson_rc.ArgError; |
| 2971 | 2992 | if( pos >= ar->list.count ) return cson_rc.RangeError; |
| | @@ -4676,13 +4697,15 @@ |
| 4676 | 4697 | } |
| 4677 | 4698 | } |
| 4678 | 4699 | |
| 4679 | 4700 | cson_value * cson_string_value(cson_string const * s) |
| 4680 | 4701 | { |
| 4702 | +#define MT CSON_SPECIAL_VALUES[CSON_VAL_STR_EMPTY] |
| 4681 | 4703 | return s |
| 4682 | | - ? CSON_VCAST(s) |
| 4704 | + ? ((s==MT.value) ? &MT : CSON_VCAST(s)) |
| 4683 | 4705 | : NULL; |
| 4706 | +#undef MT |
| 4684 | 4707 | } |
| 4685 | 4708 | |
| 4686 | 4709 | cson_value * cson_object_value(cson_object const * s) |
| 4687 | 4710 | { |
| 4688 | 4711 | return s |
| 4689 | 4712 | |