LCOV - code coverage report
Current view: top level - ballet/json - cJSON.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 7 13 53.8 %
Date: 2024-11-13 11:58:15 Functions: 0 0 -

          Line data    Source code
       1             : /*
       2             :   Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
       3             : 
       4             :   Permission is hereby granted, free of charge, to any person obtaining a copy
       5             :   of this software and associated documentation files (the "Software"), to deal
       6             :   in the Software without restriction, including without limitation the rights
       7             :   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
       8             :   copies of the Software, and to permit persons to whom the Software is
       9             :   furnished to do so, subject to the following conditions:
      10             : 
      11             :   The above copyright notice and this permission notice shall be included in
      12             :   all copies or substantial portions of the Software.
      13             : 
      14             :   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      15             :   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      16             :   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      17             :   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      18             :   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      19             :   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      20             :   THE SOFTWARE.
      21             : */
      22             : 
      23             : #ifndef cJSON__h
      24             : #define cJSON__h
      25             : 
      26             : #ifdef __cplusplus
      27             : extern "C"
      28             : {
      29             : #endif
      30             : 
      31             : #if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
      32             : #define __WINDOWS__
      33             : #endif
      34             : 
      35             : #ifdef __WINDOWS__
      36             : 
      37             : /* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention.  For windows you have 3 define options:
      38             : 
      39             : CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
      40             : CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
      41             : CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
      42             : 
      43             : For *nix builds that support visibility attribute, you can define similar behavior by
      44             : 
      45             : setting default visibility to hidden by adding
      46             : -fvisibility=hidden (for gcc)
      47             : or
      48             : -xldscope=hidden (for sun cc)
      49             : to CFLAGS
      50             : 
      51             : then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
      52             : 
      53             : */
      54             : 
      55             : #define CJSON_CDECL __cdecl
      56             : #define CJSON_STDCALL __stdcall
      57             : 
      58             : /* export symbols by default, this is necessary for copy pasting the C and header file */
      59             : #if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)
      60             : #define CJSON_EXPORT_SYMBOLS
      61             : #endif
      62             : 
      63             : #if defined(CJSON_HIDE_SYMBOLS)
      64             : #define CJSON_PUBLIC(type)   type CJSON_STDCALL
      65             : #elif defined(CJSON_EXPORT_SYMBOLS)
      66             : #define CJSON_PUBLIC(type)   __declspec(dllexport) type CJSON_STDCALL
      67             : #elif defined(CJSON_IMPORT_SYMBOLS)
      68             : #define CJSON_PUBLIC(type)   __declspec(dllimport) type CJSON_STDCALL
      69             : #endif
      70             : #else /* !__WINDOWS__ */
      71             : #define CJSON_CDECL
      72             : #define CJSON_STDCALL
      73             : 
      74             : #if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
      75             : #define CJSON_PUBLIC(type)   __attribute__((visibility("default"))) type
      76             : #else
      77             : #define CJSON_PUBLIC(type) type
      78             : #endif
      79             : #endif
      80             : 
      81             : /* project version */
      82             : #define CJSON_VERSION_MAJOR 1
      83             : #define CJSON_VERSION_MINOR 7
      84             : #define CJSON_VERSION_PATCH 16
      85             : 
      86             : #include <stddef.h>
      87             : 
      88             : /* cJSON Types: */
      89           0 : #define cJSON_Invalid (0)
      90           0 : #define cJSON_False  (1 << 0)
      91           0 : #define cJSON_True   (1 << 1)
      92           0 : #define cJSON_NULL   (1 << 2)
      93          12 : #define cJSON_Number (1 << 3)
      94          84 : #define cJSON_String (1 << 4)
      95           6 : #define cJSON_Array  (1 << 5)
      96          27 : #define cJSON_Object (1 << 6)
      97           0 : #define cJSON_Raw    (1 << 7) /* raw json */
      98             : 
      99         132 : #define cJSON_IsReference 256
     100          66 : #define cJSON_StringIsConst 512
     101             : 
     102             : /* The cJSON structure: */
     103             : typedef struct cJSON
     104             : {
     105             :     /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
     106             :     struct cJSON *next;
     107             :     struct cJSON *prev;
     108             :     /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
     109             :     struct cJSON *child;
     110             : 
     111             :     /* The type of the item, as above. */
     112             :     int type;
     113             : 
     114             :     /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
     115             :     char *valuestring;
     116             :     /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
     117             :     int valueint;
     118             :     /* The item's number, if type==cJSON_Number */
     119             :     double valuedouble;
     120             : 
     121             :     unsigned long valueulong;
     122             : 
     123             :     /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
     124             :     char *string;
     125             : } cJSON;
     126             : 
     127             : typedef struct cJSON_Hooks
     128             : {
     129             :       /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
     130             :       void *(CJSON_CDECL *malloc_fn)(size_t sz);
     131             :       void (CJSON_CDECL *free_fn)(void *ptr);
     132             : } cJSON_Hooks;
     133             : 
     134             : typedef int cJSON_bool;
     135             : 
     136             : /* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
     137             :  * This is to prevent stack overflows. */
     138             : #ifndef CJSON_NESTING_LIMIT
     139          27 : #define CJSON_NESTING_LIMIT 1000
     140             : #endif
     141             : 
     142             : /* returns the version of cJSON as a string */
     143             : CJSON_PUBLIC(const char*) cJSON_Version(void);
     144             : 
     145             : /* Supply malloc, realloc and free functions to cJSON */
     146             : CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
     147             : 
     148             : /* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
     149             : /* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
     150             : CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
     151             : CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);
     152             : /* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
     153             : /* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
     154             : CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);
     155             : CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated);
     156             : 
     157             : /* Render a cJSON entity to text for transfer/storage. */
     158             : CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
     159             : /* Render a cJSON entity to text for transfer/storage without any formatting. */
     160             : CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
     161             : /* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
     162             : CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
     163             : /* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
     164             : /* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
     165             : CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);
     166             : /* Delete a cJSON entity and all subentities. */
     167             : CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);
     168             : 
     169             : /* Returns the number of items in an array (or object). */
     170             : CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
     171             : /* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
     172             : CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
     173             : /* Get item "string" from object. Case insensitive. */
     174             : CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
     175             : CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
     176             : CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
     177             : /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
     178             : CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
     179             : 
     180             : /* Check item type and return its value */
     181             : CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
     182             : CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
     183             : 
     184             : /* These functions check the type of an item */
     185             : CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);
     186             : CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);
     187             : CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);
     188             : CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);
     189             : CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);
     190             : CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);
     191             : CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);
     192             : CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);
     193             : CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);
     194             : CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);
     195             : 
     196             : /* These calls create a cJSON item of the appropriate type. */
     197             : CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
     198             : CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
     199             : CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
     200             : CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);
     201             : CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
     202             : CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
     203             : /* raw json */
     204             : CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
     205             : CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
     206             : CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
     207             : 
     208             : /* Create a string where valuestring references a string so
     209             :  * it will not be freed by cJSON_Delete */
     210             : CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
     211             : /* Create an object/array that only references it's elements so
     212             :  * they will not be freed by cJSON_Delete */
     213             : CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
     214             : CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
     215             : 
     216             : /* These utilities create an Array of count items.
     217             :  * The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/
     218             : CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
     219             : CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
     220             : CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
     221             : CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);
     222             : 
     223             : /* Append item to the specified array/object. */
     224             : CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
     225             : CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
     226             : /* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
     227             :  * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
     228             :  * writing to `item->string` */
     229             : CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
     230             : /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
     231             : CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
     232             : CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
     233             : 
     234             : /* Remove/Detach items from Arrays/Objects. */
     235             : CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
     236             : CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
     237             : CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
     238             : CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
     239             : CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
     240             : CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
     241             : CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
     242             : 
     243             : /* Update array items. */
     244             : CJSON_PUBLIC(cJSON_bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */
     245             : CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
     246             : CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
     247             : CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
     248             : CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
     249             : 
     250             : /* Duplicate a cJSON item */
     251             : CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);
     252             : /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
     253             :  * need to be released. With recurse!=0, it will duplicate any children connected to the item.
     254             :  * The item->next and ->prev pointers are always zero on return from Duplicate. */
     255             : /* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
     256             :  * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
     257             : CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);
     258             : 
     259             : /* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
     260             :  * The input pointer json cannot point to a read-only address area, such as a string constant,
     261             :  * but should point to a readable and writable address area. */
     262             : CJSON_PUBLIC(void) cJSON_Minify(char *json);
     263             : 
     264             : /* Helper functions for creating and adding items to an object at the same time.
     265             :  * They return the added item or NULL on failure. */
     266             : CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
     267             : CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
     268             : CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
     269             : CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);
     270             : CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
     271             : CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
     272             : CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
     273             : CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
     274             : CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
     275             : 
     276             : /* When assigning an integer value, it needs to be propagated to valuedouble too. */
     277             : #define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
     278             : /* helper for the cJSON_SetNumberValue macro */
     279             : CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
     280             : #define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
     281             : /* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */
     282             : CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring);
     283             : 
     284             : /* If the object is not a boolean type this does nothing and returns cJSON_Invalid else it returns the new type*/
     285             : #define cJSON_SetBoolValue(object, boolValue) ( \
     286             :     (object != NULL && ((object)->type & (cJSON_False|cJSON_True))) ? \
     287             :     (object)->type=((object)->type &(~(cJSON_False|cJSON_True)))|((boolValue)?cJSON_True:cJSON_False) : \
     288             :     cJSON_Invalid\
     289             : )
     290             : 
     291             : /* Macro for iterating over an array or object */
     292           0 : #define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)
     293             : 
     294             : /* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
     295             : CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
     296             : CJSON_PUBLIC(void) cJSON_free(void *object);
     297             : 
     298             : #ifdef __cplusplus
     299             : }
     300             : #endif
     301             : 
     302             : #endif

Generated by: LCOV version 1.14