Home | History | Annotate | Download | only in zzjson
      1 /* ZZJSON - Copyright (C) 2008 by Ivo van Poorten
      2  * License: GNU Lesser General Public License version 2.1
      3  */
      4 #ifndef ZZJSON_H
      5 #define ZZJSON_H
      6 
      7 #include <stdlib.h>
      8 
      9 /* Version: */
     10 
     11 #define ZZJSON_VERSION_MAJOR    1
     12 #define ZZJSON_VERSION_MINOR    1
     13 #define ZZJSON_VERSION_MICRO    0
     14 #define ZZJSON_VERSION_INT      ( 1<<16 | 1<<8 | 0 )
     15 #define ZZJSON_IDENT            "zzjson 1.1.0"
     16 
     17 /* Defines: */
     18 
     19 #define ZZJSON_ALLOW_EXTRA_COMMA        1
     20 #define ZZJSON_ALLOW_ILLEGAL_ESCAPE     2
     21 #define ZZJSON_ALLOW_CONTROL_CHARS      4
     22 #define ZZJSON_ALLOW_GARBAGE_AT_END     8
     23 #define ZZJSON_ALLOW_COMMENTS           16
     24 
     25 #define ZZJSON_VERY_LOOSE               (-1)
     26 #define ZZJSON_VERY_STRICT              0
     27 
     28 /* Types: */
     29 
     30 /* needed by: pa = parser, pr = printer, f = free, q = query, c = create */
     31 typedef struct ZZJSON_CONFIG {
     32     int strictness;                                        // pa
     33     void *ihandle;                                         // pa
     34     int (*getchar)(void *ihandle);                         // pa
     35     int (*ungetchar)(int c, void *ihandle);                // pa
     36     void *(*malloc)(size_t size);                          // pa      c
     37     void *(*calloc)(size_t nmemb, size_t size);            // pa      c
     38     void (*free)(void *ptr);                               // pa    f c
     39     void *(*realloc)(void *ptr, size_t size);              // pa
     40     void *ehandle;                                         // pa pr   c
     41     void (*error)(void *ehandle, const char *format, ...); // pa pr   c
     42     void *ohandle;                                         //    pr
     43     int (*print)(void *ohandle, const char *format, ...);  //    pr
     44     int (*putchar)(int c, void *handle);                   //    pr
     45 } ZZJSON_CONFIG;
     46 
     47 typedef enum ZZJSON_TYPE {
     48     ZZJSON_NONE = 0,
     49     ZZJSON_OBJECT,
     50     ZZJSON_ARRAY,
     51     ZZJSON_STRING,
     52     ZZJSON_NUMBER_NEGINT,
     53     ZZJSON_NUMBER_POSINT,
     54     ZZJSON_NUMBER_DOUBLE,
     55     ZZJSON_NULL,
     56     ZZJSON_TRUE,
     57     ZZJSON_FALSE
     58 } ZZJSON_TYPE;
     59 
     60 typedef struct ZZJSON {
     61     ZZJSON_TYPE type;
     62     union {
     63         struct {
     64             char *label;
     65             struct ZZJSON *val;
     66         } object;
     67         struct {
     68             struct ZZJSON *val;
     69         } array;
     70         struct {
     71             char *string;
     72         } string;
     73         struct {
     74             union {
     75                 unsigned long long ival;
     76                 double             dval;
     77             } val;
     78         } number;
     79     } value;
     80     struct ZZJSON *next;
     81 } ZZJSON;
     82 
     83 /* Functions: */
     84 
     85 ZZJSON *zzjson_parse(ZZJSON_CONFIG *config);
     86 void zzjson_free(ZZJSON_CONFIG *config, ZZJSON *zzjson);
     87 int zzjson_print(ZZJSON_CONFIG *config, ZZJSON *zzjson);
     88 
     89 ZZJSON *zzjson_object_find_label(ZZJSON *zzjson, char *label);
     90 ZZJSON *zzjson_object_find_labels(ZZJSON *zzjson, ...); // end with , NULL
     91 unsigned int zzjson_object_count(ZZJSON *zzjson);
     92 unsigned int zzjson_array_count(ZZJSON *zzjson);
     93 
     94 ZZJSON *zzjson_create_true(ZZJSON_CONFIG *config);
     95 ZZJSON *zzjson_create_false(ZZJSON_CONFIG *config);
     96 ZZJSON *zzjson_create_null(ZZJSON_CONFIG *config);
     97 ZZJSON *zzjson_create_number_d(ZZJSON_CONFIG *config, double d);
     98 ZZJSON *zzjson_create_number_i(ZZJSON_CONFIG *config, long long i);
     99 ZZJSON *zzjson_create_string(ZZJSON_CONFIG *config, char *s);
    100 
    101 /* list of ZZJSON *'s and end with , NULL */
    102 ZZJSON *zzjson_create_array(ZZJSON_CONFIG *config, ...);
    103 
    104 /* list of char*,ZZJSON* pairs, end with , NULL */
    105 ZZJSON *zzjson_create_object(ZZJSON_CONFIG *config, ...);
    106 
    107 ZZJSON *zzjson_array_prepend(ZZJSON_CONFIG *config, ZZJSON *array,
    108                                                     ZZJSON *val);
    109 ZZJSON *zzjson_array_append (ZZJSON_CONFIG *config, ZZJSON *array,
    110                                                     ZZJSON *val);
    111 
    112 ZZJSON *zzjson_object_prepend(ZZJSON_CONFIG *config, ZZJSON *object,
    113                                         char *label, ZZJSON *val);
    114 ZZJSON *zzjson_object_append (ZZJSON_CONFIG *config, ZZJSON *object,
    115                                         char *label, ZZJSON *val);
    116 #endif
    117