• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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