JSON_checker.c
Go to the documentation of this file.
1 /* JSON_checker.c */
2 
3 
4 /* 2005-12-30 */
5 
6 /*
7 Copyright (c) 2005 JSON.org
8 
9 Permission is hereby granted, free of charge, to any person obtaining a copy
10 of this software and associated documentation files (the "Software"), to deal
11 in the Software without restriction, including without limitation the rights
12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 copies of the Software, and to permit persons to whom the Software is
14 furnished to do so, subject to the following conditions:
15 
16 The above copyright notice and this permission notice shall be included in all
17 copies or substantial portions of the Software.
18 
19 The Software shall be used for Good, not Evil.
20 
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27 SOFTWARE.
28 */
29 
30 
31 #include "JSON_checker.h"
32 
33 #define true 1
34 #define false 0
35 
36 /*
37  Characters are mapped into these 32 symbol classes. This allows for
38  significant reductions in the size of the state transition table.
39 */
40 
41 /* error */
42 #define S_ERR -1
43 
44 /* space */
45 #define S_SPA 0
46 
47 /* other whitespace */
48 #define S_WSP 1
49 
50 /* { */
51 #define S_LBE 2
52 
53 /* } */
54 #define S_RBE 3
55 
56 /* [ */
57 #define S_LBT 4
58 
59 /* ] */
60 #define S_RBT 5
61 
62 /* : */
63 #define S_COL 6
64 
65 /* , */
66 #define S_COM 7
67 
68 /* " */
69 #define S_QUO 8
70 
71 /* \ */
72 #define S_BAC 9
73 
74 /* / */
75 #define S_SLA 10
76 
77 /* + */
78 #define S_PLU 11
79 
80 /* - */
81 #define S_MIN 12
82 
83 /* . */
84 #define S_DOT 13
85 
86 /* 0 */
87 #define S_ZER 14
88 
89 /* 123456789 */
90 #define S_DIG 15
91 
92 /* a */
93 #define S__A_ 16
94 
95 /* b */
96 #define S__B_ 17
97 
98 /* c */
99 #define S__C_ 18
100 
101 /* d */
102 #define S__D_ 19
103 
104 /* e */
105 #define S__E_ 20
106 
107 /* f */
108 #define S__F_ 21
109 
110 /* l */
111 #define S__L_ 22
112 
113 /* n */
114 #define S__N_ 23
115 
116 /* r */
117 #define S__R_ 24
118 
119 /* s */
120 #define S__S_ 25
121 
122 /* t */
123 #define S__T_ 26
124 
125 /* u */
126 #define S__U_ 27
127 
128 /* ABCDF */
129 #define S_A_F 28
130 
131 /* E */
132 #define S_E 29
133 
134 /* everything else */
135 #define S_ETC 30
136 
137 
138 /*
139  This table maps the 128 ASCII characters into the 32 character classes.
140  The remaining Unicode characters should be mapped to S_ETC.
141 */
142 static int ascii_class[128] = {
147 
152 
157 
161  S_ETC, S_ETC, S_ETC, S_LBE, S_ETC, S_RBE, S_ETC, S_ETC
162 };
163 
164 
165 /*
166  The state transition table takes the current state and the current symbol,
167  and returns either a new state or an action. A new state is a number between
168  0 and 29. An action is a negative number between -1 and -9. A JSON text is
169  accepted if the end of the text is in state 9 and mode is MODE_DONE.
170 */
171 static int state_transition_table[30][31] = {
172 /* 0*/ { 0, 0,-8,-1,-6,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
173 /* 1*/ { 1, 1,-1,-9,-1,-1,-1,-1, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
174 /* 2*/ { 2, 2,-8,-1,-6,-5,-1,-1, 3,-1,-1,-1,20,-1,21,22,-1,-1,-1,-1,-1,13,-1,17,-1,-1,10,-1,-1,-1,-1},
175 /* 3*/ { 3,-1, 3, 3, 3, 3, 3, 3,-4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3},
176 /* 4*/ {-1,-1,-1,-1,-1,-1,-1,-1, 3, 3, 3,-1,-1,-1,-1,-1,-1, 3,-1,-1,-1, 3,-1, 3, 3,-1, 3, 5,-1,-1,-1},
177 /* 5*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 6, 6, 6, 6, 6, 6, 6, 6,-1,-1,-1,-1,-1,-1, 6, 6,-1},
178 /* 6*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 7, 7, 7, 7, 7, 7, 7, 7,-1,-1,-1,-1,-1,-1, 7, 7,-1},
179 /* 7*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 8, 8, 8, 8, 8, 8, 8, 8,-1,-1,-1,-1,-1,-1, 8, 8,-1},
180 /* 8*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 3, 3, 3, 3, 3, 3, 3,-1,-1,-1,-1,-1,-1, 3, 3,-1},
181 /* 9*/ { 9, 9,-1,-7,-1,-5,-1,-3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
182 /*10*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1},
183 /*11*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,-1,-1,-1},
184 /*12*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
185 /*13*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
186 /*14*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1},
187 /*15*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16,-1,-1,-1,-1,-1},
188 /*16*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 9,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
189 /*17*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,18,-1,-1,-1},
190 /*18*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,19,-1,-1,-1,-1,-1,-1,-1,-1},
191 /*19*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 9,-1,-1,-1,-1,-1,-1,-1,-1},
192 /*20*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,21,22,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
193 /*21*/ { 9, 9,-1,-7,-1,-5,-1,-3,-1,-1,-1,-1,-1,23,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
194 /*22*/ { 9, 9,-1,-7,-1,-5,-1,-3,-1,-1,-1,-1,-1,23,22,22,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1},
195 /*23*/ { 9, 9,-1,-7,-1,-5,-1,-3,-1,-1,-1,-1,-1,-1,23,23,-1,-1,-1,-1,24,-1,-1,-1,-1,-1,-1,-1,-1,24,-1},
196 /*24*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,25,25,-1,26,26,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
197 /*25*/ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,26,26,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
198 /*26*/ { 9, 9,-1,-7,-1,-5,-1,-3,-1,-1,-1,-1,-1,-1,26,26,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
199 /*27*/ {27,27,-1,-1,-1,-1,-2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
200 /*28*/ {28,28,-8,-1,-6,-1,-1,-1, 3,-1,-1,-1,20,-1,21,22,-1,-1,-1,-1,-1,13,-1,17,-1,-1,10,-1,-1,-1,-1},
201 /*29*/ {29,29,-1,-1,-1,-1,-1,-1, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}
202 };
203 
204 
205 
206 /*
207  These modes can be pushed on the PDA stack.
208 */
209 #define MODE_DONE 1
210 #define MODE_KEY 2
211 #define MODE_OBJECT 3
212 #define MODE_ARRAY 4
213 
214 /*
215  A stack maintains the states of nested structures.
216 */
217 #define MAX_DEPTH 20
218 
219 static int the_state;
220 static int the_stack[MAX_DEPTH];
221 static int the_top;
222 
223 static int the_index = 0;
224 
225 /*
226  Push a mode onto the stack. Return false if there is overflow.
227 */
228 static int
229 push(int mode)
230 {
231  the_top += 1;
232  if (the_top >= MAX_DEPTH) {
233  return false;
234  }
235  the_stack[the_top] = mode;
236  return true;
237 }
238 
239 
240 /*
241  Pop the stack, assuring that the current mode matches the expectation.
242  Return false if there is underflow or if the modes mismatch.
243 */
244 static int
245 pop(int mode)
246 {
247  if (the_top < 0 || the_stack[the_top] != mode) {
248  return false;
249  }
250  the_stack[the_top] = 0;
251  the_top -= 1;
252  return true;
253 }
254 
255 int JSON_checker_push(int b);
256 
258  the_state = 0;
259  the_top = -1;
260  push(MODE_DONE);
261 }
262 
264  return the_state == 9 && pop(MODE_DONE);
265 }
266 
267 /*
268  The JSON_checker takes a UTF-16 encoded string and determines if it is a
269  syntactically correct JSON text.
270 
271  It is implemented as a Pushdown Automaton; that means it is a finite state
272  machine with a stack.
273 */
274 int
275 JSON_checker(unsigned short p[], int length)
276 {
278 
279  for (the_index = 0; the_index < length; the_index += 1) {
280  if(!(JSON_checker_push(p[the_index]))) return false;
281  }
282 
283  return JSON_checker_finished() ;
284 }
285 
286 
287 int JSON_checker_push(int b) {
288  int c; /* the next character class */
289  int s; /* the next state */
290  if ((b & 127) == b) {
291  c = ascii_class[b];
292  if (c <= S_ERR) {
293  return false;
294  }
295  } else {
296  c = S_ETC;
297  }
298 /*
299  Get the next state from the transition table.
300 */
302  if (s < 0) {
303 /*
304  Perform one of the predefined actions.
305 */
306  switch (s) {
307 /*
308  empty }
309 */
310  case -9:
311  if (!pop(MODE_KEY)) {
312  return false;
313  }
314  the_state = 9;
315  break;
316 /*
317  {
318 */
319  case -8:
320  if (!push(MODE_KEY)) {
321  return false;
322  }
323  the_state = 1;
324  break;
325 /*
326  }
327 */
328  case -7:
329  if (!pop(MODE_OBJECT)) {
330  return false;
331  }
332  the_state = 9;
333  break;
334 /*
335  [
336 */
337  case -6:
338  if (!push(MODE_ARRAY)) {
339  return false;
340  }
341  the_state = 2;
342  break;
343 /*
344  ]
345 */
346  case -5:
347  if (!pop(MODE_ARRAY)) {
348  return false;
349  }
350  the_state = 9;
351  break;
352 /*
353  "
354 */
355  case -4:
356  switch (the_stack[the_top]) {
357  case MODE_KEY:
358  the_state = 27;
359  break;
360  case MODE_ARRAY:
361  case MODE_OBJECT:
362  the_state = 9;
363  break;
364  default:
365  return false;
366  }
367  break;
368 /*
369  ,
370 */
371  case -3:
372  switch (the_stack[the_top]) {
373  case MODE_OBJECT:
374  if (pop(MODE_OBJECT) && push(MODE_KEY)) {
375  the_state = 29;
376  }
377  break;
378  case MODE_ARRAY:
379  the_state = 28;
380  break;
381  default:
382  return false;
383  }
384  break;
385 /*
386  :
387 */
388  case -2:
389  if (pop(MODE_KEY) && push(MODE_OBJECT)) {
390  the_state = 28;
391  break;
392  }
393 /*
394  syntax error
395 */
396  case -1:
397  return false;
398  }
399  } else {
400 /*
401  Change the state and iterate.
402 */
403  the_state = s;
404  }
405  return true;
406 }
407 /*
408  Get the current character number.
409 */
410 int
412 {
413  return the_index;
414 }
#define S_ETC
Definition: JSON_checker.c:135
#define S_QUO
Definition: JSON_checker.c:69
#define S_COL
Definition: JSON_checker.c:63
#define S_DOT
Definition: JSON_checker.c:84
static int the_stack[MAX_DEPTH]
Definition: JSON_checker.c:220
#define S_DIG
Definition: JSON_checker.c:90
#define S__A_
Definition: JSON_checker.c:93
#define S_LBT
Definition: JSON_checker.c:57
#define S__U_
Definition: JSON_checker.c:126
#define MAX_DEPTH
Definition: JSON_checker.c:217
#define S__B_
Definition: JSON_checker.c:96
#define S_MIN
Definition: JSON_checker.c:81
#define S__S_
Definition: JSON_checker.c:120
int JSON_checker_at_character()
Definition: JSON_checker.c:411
static int pop(int mode)
Definition: JSON_checker.c:245
#define S_E
Definition: JSON_checker.c:132
#define S_A_F
Definition: JSON_checker.c:129
static int the_state
Definition: JSON_checker.c:219
#define S__E_
Definition: JSON_checker.c:105
#define S_ZER
Definition: JSON_checker.c:87
static int ascii_class[128]
Definition: JSON_checker.c:142
int JSON_checker(unsigned short p[], int length)
Definition: JSON_checker.c:275
#define S_COM
Definition: JSON_checker.c:66
#define S_ERR
Definition: JSON_checker.c:42
static int state_transition_table[30][31]
Definition: JSON_checker.c:171
struct @0 p
#define MODE_ARRAY
Definition: JSON_checker.c:212
#define S_BAC
Definition: JSON_checker.c:72
int JSON_checker_finished()
Definition: JSON_checker.c:263
int JSON_checker_push(int b)
Definition: JSON_checker.c:287
#define MODE_KEY
Definition: JSON_checker.c:210
#define S_SPA
Definition: JSON_checker.c:45
#define S_WSP
Definition: JSON_checker.c:48
static int push(int mode)
Definition: JSON_checker.c:229
#define S__D_
Definition: JSON_checker.c:102
#define S__R_
Definition: JSON_checker.c:117
void JSON_checker_init()
Definition: JSON_checker.c:257
#define S__C_
Definition: JSON_checker.c:99
static int the_top
Definition: JSON_checker.c:221
#define S__N_
Definition: JSON_checker.c:114
#define S_LBE
Definition: JSON_checker.c:51
#define S__F_
Definition: JSON_checker.c:108
#define MODE_OBJECT
Definition: JSON_checker.c:211
#define S__T_
Definition: JSON_checker.c:123
#define S_SLA
Definition: JSON_checker.c:75
#define S_RBT
Definition: JSON_checker.c:60
static int the_index
Definition: JSON_checker.c:223
#define S_RBE
Definition: JSON_checker.c:54
#define MODE_DONE
Definition: JSON_checker.c:209
#define S__L_
Definition: JSON_checker.c:111
#define S_PLU
Definition: JSON_checker.c:78


csm
Author(s): Andrea Censi
autogenerated on Tue May 11 2021 02:18:23