| 75 CX_JSON_NULL, |
75 CX_JSON_NULL, |
| 76 CX_JSON_TRUE, |
76 CX_JSON_TRUE, |
| 77 CX_JSON_FALSE |
77 CX_JSON_FALSE |
| 78 }; |
78 }; |
| 79 |
79 |
| 80 enum cx_json_reader_type { |
|
| 81 CX_JSON_READER_OBJECT_BEGIN, |
|
| 82 CX_JSON_READER_OBJECT_END, |
|
| 83 CX_JSON_READER_ARRAY_BEGIN, |
|
| 84 CX_JSON_READER_ARRAY_END, |
|
| 85 CX_JSON_READER_STRING, |
|
| 86 CX_JSON_READER_INTEGER, |
|
| 87 CX_JSON_READER_NUMBER, |
|
| 88 CX_JSON_READER_LITERAL |
|
| 89 }; |
|
| 90 |
|
| 91 typedef enum cx_json_token_type CxJsonTokenType; |
80 typedef enum cx_json_token_type CxJsonTokenType; |
| 92 typedef enum cx_json_value_type CxJsonValueType; |
81 typedef enum cx_json_value_type CxJsonValueType; |
| 93 typedef enum cx_json_reader_type CxJsonReaderType; |
|
| 94 |
82 |
| 95 typedef struct cx_json_s CxJson; |
83 typedef struct cx_json_s CxJson; |
| 96 typedef struct cx_json_token_s CxJsonToken; |
84 typedef struct cx_json_token_s CxJsonToken; |
| 97 |
85 |
| 98 typedef struct cx_json_value_s CxJsonValue; |
86 typedef struct cx_json_value_s CxJsonValue; |
| 104 typedef double CxJsonNumber; |
92 typedef double CxJsonNumber; |
| 105 typedef enum cx_json_literal CxJsonLiteral; |
93 typedef enum cx_json_literal CxJsonLiteral; |
| 106 |
94 |
| 107 typedef struct cx_json_obj_value_s CxJsonObjValue; |
95 typedef struct cx_json_obj_value_s CxJsonObjValue; |
| 108 |
96 |
| 109 struct cx_json_token_s { |
|
| 110 CxJsonTokenType tokentype; |
|
| 111 const char *content; |
|
| 112 size_t length; |
|
| 113 size_t alloc; |
|
| 114 }; |
|
| 115 |
|
| 116 struct cx_json_s { |
|
| 117 const CxAllocator *allocator; |
|
| 118 const char *buffer; |
|
| 119 size_t size; |
|
| 120 size_t pos; |
|
| 121 |
|
| 122 CxJsonToken uncompleted; |
|
| 123 int tokenizer_escape; |
|
| 124 |
|
| 125 int *states; |
|
| 126 size_t nstates; |
|
| 127 size_t states_alloc; |
|
| 128 int states_internal[8]; |
|
| 129 |
|
| 130 CxJsonToken reader_token; |
|
| 131 CxJsonReaderType reader_type; |
|
| 132 int value_ready; |
|
| 133 char *value_name; |
|
| 134 size_t value_name_len; |
|
| 135 char *value_str; |
|
| 136 size_t value_str_len; |
|
| 137 int64_t value_int; |
|
| 138 double value_double; |
|
| 139 |
|
| 140 CxJsonValue **readvalue_stack; |
|
| 141 unsigned readvalue_nelm; |
|
| 142 unsigned readvalue_alloc; |
|
| 143 CxJsonValue *read_value; |
|
| 144 int readvalue_initialized; |
|
| 145 |
|
| 146 unsigned reader_array_alloc; |
|
| 147 |
|
| 148 int error; |
|
| 149 }; |
|
| 150 |
97 |
| 151 struct cx_json_array_s { |
98 struct cx_json_array_s { |
| 152 CX_ARRAY_DECLARE(CxJsonValue*, array); |
99 CX_ARRAY_DECLARE(CxJsonValue*, array); |
| 153 }; |
100 }; |
| 154 |
101 |
| 172 CxJsonNumber number; |
119 CxJsonNumber number; |
| 173 CxJsonLiteral literal; |
120 CxJsonLiteral literal; |
| 174 } value; |
121 } value; |
| 175 }; |
122 }; |
| 176 |
123 |
| 177 |
124 struct cx_json_token_s { |
| 178 cx_attr_nonnull_arg(2) |
125 CxJsonTokenType tokentype; |
| 179 void cxJsonInit(const CxAllocator *allocator, CxJson *json); |
126 const char *content; |
| |
127 size_t length; |
| |
128 size_t alloc; |
| |
129 }; |
| |
130 |
| |
131 struct cx_json_s { |
| |
132 const CxAllocator *allocator; |
| |
133 const char *buffer; |
| |
134 size_t size; |
| |
135 size_t pos; |
| |
136 |
| |
137 CxJsonToken uncompleted; |
| |
138 |
| |
139 /** |
| |
140 * A pointer to an intermediate state of the currently parsed value. |
| |
141 * |
| |
142 * Never access this value manually. |
| |
143 */ |
| |
144 CxJsonValue *parsed; |
| |
145 |
| |
146 /** |
| |
147 * State stack. |
| |
148 */ |
| |
149 CX_ARRAY_DECLARE_SIZED(int, states, unsigned); |
| |
150 |
| |
151 /** |
| |
152 * Value buffer stack. |
| |
153 */ |
| |
154 CX_ARRAY_DECLARE_SIZED(CxJsonValue*, vbuf, unsigned); |
| |
155 |
| |
156 /** |
| |
157 * Internally reserved memory for the state stack. |
| |
158 */ |
| |
159 int states_internal[8]; |
| |
160 |
| |
161 /** |
| |
162 * Internally reserved memory for the value buffer stack. |
| |
163 */ |
| |
164 CxJsonValue* vbuf_internal[8]; |
| |
165 |
| |
166 int error; // TODO: currently unused |
| |
167 bool tokenizer_escape; // TODO: check if it can be replaced with look-behind |
| |
168 }; |
| |
169 |
| |
170 cx_attr_nonnull_arg(1) |
| |
171 void cxJsonInit(CxJson *json, const CxAllocator *allocator); |
| 180 |
172 |
| 181 cx_attr_nonnull |
173 cx_attr_nonnull |
| 182 void cxJsonDestroy(CxJson *json); |
174 void cxJsonDestroy(CxJson *json); |
| 183 |
175 |
| 184 cx_attr_nonnull |
176 cx_attr_nonnull |