Changeset 6914


Ignore:
Timestamp:
Oct 15, 2008, 8:00:09 PM (13 years ago)
Author:
charles
Message:

update snapshot of Jean Gressmann's JSON parser

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/JSON_parser.c

    r6912 r6914  
    44
    55/*
    6    Copyright (c) 2005 JSON.org
    7 
    8    Permission is hereby granted, free of charge, to any person obtaining a copy
    9    of this software and associated documentation files (the "Software"), to deal
    10    in the Software without restriction, including without limitation the rights
    11    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    12    copies of the Software, and to permit persons to whom the Software is
    13    furnished to do so, subject to the following conditions:
    14 
    15    The above copyright notice and this permission notice shall be included in
    16    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     Callbacks, comments, Unicode handling by Jean Gressmann (jean@0x42.de),
    32    2007-2008.
    33 
     6Copyright (c) 2005 JSON.org
     7
     8Permission is hereby granted, free of charge, to any person obtaining a copy
     9of this software and associated documentation files (the "Software"), to deal
     10in the Software without restriction, including without limitation the rights
     11to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     12copies of the Software, and to permit persons to whom the Software is
     13furnished to do so, subject to the following conditions:
     14
     15The above copyright notice and this permission notice shall be included in all
     16copies or substantial portions of the Software.
     17
     18The Software shall be used for Good, not Evil.
     19
     20THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     21IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     22FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     23AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     24LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     25OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     26SOFTWARE.
     27*/
     28
     29/*
     30    Callbacks, comments, Unicode handling by Jean Gressmann (jean@0x42.de), 2007-2008.
     31   
    3432    For the added features the license above applies also.
    35 
     33   
    3634    Changelog:
    37         2008/07/19
    38             - Removed some duplicate code & debugging variable
    39    (Charles.Kerr@noaa.gov)
    40 
    41         2008/05/28
    42             - Made JSON_value structure ansi C compliant. This bug was report by
     35        2008/10/14
     36            - Renamed states.IN to states.IT to avoid name clash which IN macro
     37              defined in windef.h (alexey.pelykh@gmail.com)
     38           
     39        2008/07/19
     40            - Removed some duplicate code & debugging variable (Charles.Kerr@noaa.gov)
     41       
     42        2008/05/28
     43            - Made JSON_value structure ansi C compliant. This bug was report by
    4344              trisk@acm.jhu.edu
    44 
    45         2008/05/20
    46             - Fixed bug reported by Charles.Kerr@noaa.gov where the switching
    47               from static to dynamic parse buffer did not copy the static parse
     45       
     46        2008/05/20 
     47            - Fixed bug reported by Charles.Kerr@noaa.gov where the switching 
     48              from static to dynamic parse buffer did not copy the static parse 
    4849              buffer's content.
    49  */
     50*/
     51
    5052
    5153
     
    6264
    6365#if _MSC_VER >= 1400 /* Visual Studio 2005 and up */
    64  #pragma warning(disable:4996) /* unsecure sscanf */
     66#       pragma warning(disable:4996) // unsecure sscanf
    6567#endif
    6668
     
    7274/* values chosen so that the object size is approx equal to one page (4K) */
    7375#ifndef JSON_PARSER_STACK_SIZE
    74  #define JSON_PARSER_STACK_SIZE 128
     76#   define JSON_PARSER_STACK_SIZE 128
    7577#endif
    7678
    7779#ifndef JSON_PARSER_PARSE_BUFFER_SIZE
    78  #define JSON_PARSER_PARSE_BUFFER_SIZE 3500
     80#   define JSON_PARSER_PARSE_BUFFER_SIZE 3500
    7981#endif
    8082
    8183
    82 typedef struct JSON_parser_struct
    83 {
    84     JSON_parser_callback    callback;
    85     void*                   ctx;
    86     signed char             state, before_comment_state, type, escaped,
    87                             comment, allow_comments, handle_floats_manually;
    88     UTF16                   utf16_decode_buffer[2];
    89     long                    depth;
    90     long                    top;
    91     signed char*            stack;
    92     long                    stack_capacity;
    93     signed char             static_stack[JSON_PARSER_STACK_SIZE];
    94     char*                   parse_buffer;
    95     size_t                  parse_buffer_capacity;
    96     size_t                  parse_buffer_count;
    97     size_t                  comment_begin_offset;
    98     char                    static_parse_buffer[
    99         JSON_PARSER_PARSE_BUFFER_SIZE];
     84typedef struct JSON_parser_struct {
     85    JSON_parser_callback callback;
     86    void* ctx;
     87    signed char state, before_comment_state, type, escaped, comment, allow_comments, handle_floats_manually;
     88    UTF16 utf16_decode_buffer[2];
     89    long depth;
     90    long top;
     91    signed char* stack;
     92    long stack_capacity;
     93    signed char static_stack[JSON_PARSER_STACK_SIZE];
     94    char* parse_buffer;
     95    size_t parse_buffer_capacity;
     96    size_t parse_buffer_count;
     97    size_t comment_begin_offset;
     98    char static_parse_buffer[JSON_PARSER_PARSE_BUFFER_SIZE];
    10099} * JSON_parser;
    101100
    102 #define COUNTOF( x ) ( sizeof( x ) / sizeof( x[0] ) )
     101#define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
    103102
    104103/*
    105104    Characters are mapped into these 31 character classes. This allows for
    106105    a significant reduction in the size of the state transition table.
    107  */
    108 
    109 
    110 enum classes
    111 {
     106*/
     107
     108
     109
     110enum classes {
    112111    C_SPACE,  /* space */
    113112    C_WHITE,  /* other whitespace */
     
    124123    C_MINUS,  /* - */
    125124    C_POINT,  /* . */
    126     C_ZERO,   /* 0 */
     125    C_ZERO ,  /* 0 */
    127126    C_DIGIT,  /* 123456789 */
    128127    C_LOW_A,  /* a */
     
    141140    C_E,      /* E */
    142141    C_ETC,    /* everything else */
    143     C_STAR,   /* * */
     142    C_STAR,   /* * */   
    144143    NR_CLASSES
    145144};
     
    150149    The remaining Unicode characters should be mapped to C_ETC.
    151150    Non-whitespace control characters are errors.
    152  */
    153     __,      __,           __,             __,             __,          __,
    154     __,          __,
    155     __,      C_WHITE,      C_WHITE,   __,        __,        C_WHITE,
    156     __,          __,
    157     __,      __,           __,        __,        __,        __,
    158     __,          __,
    159     __,      __,           __,        __,        __,        __,
    160     __,          __,
    161 
    162     C_SPACE, C_ETC,        C_QUOTE,   C_ETC,     C_ETC,     C_ETC,
    163     C_ETC,       C_ETC,
    164     C_ETC,   C_ETC,        C_STAR,    C_PLUS,    C_COMMA,   C_MINUS,
    165     C_POINT,     C_SLASH,
    166     C_ZERO,  C_DIGIT,      C_DIGIT,   C_DIGIT,   C_DIGIT,   C_DIGIT,
    167     C_DIGIT,     C_DIGIT,
    168     C_DIGIT, C_DIGIT,      C_COLON,   C_ETC,     C_ETC,     C_ETC,
    169     C_ETC,       C_ETC,
    170 
    171     C_ETC,   C_ABCDF,      C_ABCDF,   C_ABCDF,   C_ABCDF,   C_E,
    172     C_ABCDF,     C_ETC,
    173     C_ETC,   C_ETC,        C_ETC,     C_ETC,     C_ETC,     C_ETC,
    174     C_ETC,       C_ETC,
    175     C_ETC,   C_ETC,        C_ETC,     C_ETC,     C_ETC,     C_ETC,
    176     C_ETC,       C_ETC,
    177     C_ETC,   C_ETC,        C_ETC,     C_LSQRB,   C_BACKS,   C_RSQRB,
    178     C_ETC,       C_ETC,
    179 
    180     C_ETC,   C_LOW_A,      C_LOW_B,   C_LOW_C,   C_LOW_D,   C_LOW_E,
    181     C_LOW_F,     C_ETC,
    182     C_ETC,   C_ETC,        C_ETC,     C_ETC,     C_LOW_L,   C_ETC,
    183     C_LOW_N,     C_ETC,
    184     C_ETC,   C_ETC,        C_LOW_R,   C_LOW_S,   C_LOW_T,   C_LOW_U,
    185     C_ETC,       C_ETC,
    186     C_ETC,   C_ETC,        C_ETC,     C_LCURB,   C_ETC,     C_RCURB,
    187     C_ETC,       C_ETC
     151*/
     152    __,      __,      __,      __,      __,      __,      __,      __,
     153    __,      C_WHITE, C_WHITE, __,      __,      C_WHITE, __,      __,
     154    __,      __,      __,      __,      __,      __,      __,      __,
     155    __,      __,      __,      __,      __,      __,      __,      __,
     156
     157    C_SPACE, C_ETC,   C_QUOTE, C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,
     158    C_ETC,   C_ETC,   C_STAR,   C_PLUS,  C_COMMA, C_MINUS, C_POINT, C_SLASH,
     159    C_ZERO,  C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT,
     160    C_DIGIT, C_DIGIT, C_COLON, C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,
     161
     162    C_ETC,   C_ABCDF, C_ABCDF, C_ABCDF, C_ABCDF, C_E,     C_ABCDF, C_ETC,
     163    C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,
     164    C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,
     165    C_ETC,   C_ETC,   C_ETC,   C_LSQRB, C_BACKS, C_RSQRB, C_ETC,   C_ETC,
     166
     167    C_ETC,   C_LOW_A, C_LOW_B, C_LOW_C, C_LOW_D, C_LOW_E, C_LOW_F, C_ETC,
     168    C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_LOW_L, C_ETC,   C_LOW_N, C_ETC,
     169    C_ETC,   C_ETC,   C_LOW_R, C_LOW_S, C_LOW_T, C_LOW_U, C_ETC,   C_ETC,
     170    C_ETC,   C_ETC,   C_ETC,   C_LCURB, C_ETC,   C_RCURB, C_ETC,   C_ETC
    188171};
    189172
    190 // Temporary fix for Win32 target
    191 #if defined(WIN32) && defined(_WIN32) && defined(IN)
    192 #undef IN
    193 #endif
    194173
    195174/*
    196175    The state codes.
    197  */
    198 enum states
    199 {
     176*/
     177enum states {
    200178    GO,  /* start    */
    201179    OK,  /* ok       */
     
    213191    MI,  /* minus    */
    214192    ZE,  /* zero     */
    215     IN,  /* integer  */
     193    IT,  /* integer  */
    216194    FR,  /* fraction */
    217195    E1,  /* e        */
     
    262240    state is OK and if the mode is MODE_DONE.
    263241
    264                  white                                      1-9
    265                                      ABCDF  etc
    266              space |  {  }  [  ]  :  ,  "  \  /  +  -  .  0  |  a  b  c  d  e  f
    267     l  n  r  s  t  u  |  E  |  * */
    268 /*start  GO*/ {GO, GO, -6, __, -5, __, __, __, __, __, CB, __, __, __, __,
    269                __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    270                __, __},
    271 /*ok     OK*/ {OK, OK, __, -8, __, -7, __, -3, __, __, CB, __, __, __, __,
    272                __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    273                __, __},
    274 /*object OB*/ {OB, OB, __, -9, __, __, __, __, SB, __, CB, __, __, __, __,
    275                __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    276                __, __},
    277 /*key    KE*/ {KE, KE, __, __, __, __, __, __, SB, __, CB, __, __, __, __,
    278                __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    279                __, __},
    280 /*colon  CO*/ {CO, CO, __, __, __, __, -2, __, __, __, CB, __, __, __, __,
    281                __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    282                __, __},
    283 /*value  VA*/ {VA, VA, -6, __, -5, __, __, __, SB, __, CB, __, MX, __, ZX,
    284                IX, __, __, __, __, __, FA, __, NU, __, __, TR, __, __, __,
    285                __, __},
    286 /*array  AR*/ {AR, AR, -6, __, -5, -7, __, __, SB, __, CB, __, MX, __, ZX,
    287                IX, __, __, __, __, __, FA, __, NU, __, __, TR, __, __, __,
    288                __, __},
    289 /*string ST*/ {ST, __, ST, ST, ST, ST, ST, ST, -4, EX, ST, ST, ST, ST, ST,
    290                ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST,
    291                ST, ST},
    292 /*escape ES*/ {__, __, __, __, __, __, __, __, ST, ST, ST, __, __, __, __,
    293                __, __, ST, __, __, __, ST, __, ST, ST, __, ST, U1, __, __,
    294                __, __},
    295 /*u1     U1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U2,
    296                U2, U2, U2, U2, U2, U2, U2, __, __, __, __, __, __, U2, U2,
    297                __, __},
    298 /*u2     U2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U3,
    299                U3, U3, U3, U3, U3, U3, U3, __, __, __, __, __, __, U3, U3,
    300                __, __},
    301 /*u3     U3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U4,
    302                U4, U4, U4, U4, U4, U4, U4, __, __, __, __, __, __, U4, U4,
    303                __, __},
    304 /*u4     U4*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, UC,
    305                UC, UC, UC, UC, UC, UC, UC, __, __, __, __, __, __, UC, UC,
    306                __, __},
    307 /*minus  MI*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, ZE,
    308                IN, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    309                __, __},
    310 /*zero   ZE*/ {OK, OK, __, -8, __, -7, __, -3, __, __, CB, __, __, DF, __,
    311                __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    312                __, __},
    313 /*int    IN*/ {OK, OK, __, -8, __, -7, __, -3, __, __, CB, __, __, DF, IN,
    314                IN, __, __, __, __, DE, __, __, __, __, __, __, __, __, DE,
    315                __, __},
    316 /*frac   FR*/ {OK, OK, __, -8, __, -7, __, -3, __, __, CB, __, __, __, FR,
    317                FR, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1,
    318                __, __},
    319 /*e      E1*/ {__, __, __, __, __, __, __, __, __, __, __, E2, E2, __, E3,
    320                E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    321                __, __},
    322 /*ex     E2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, E3,
    323                E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    324                __, __},
    325 /*exp    E3*/ {OK, OK, __, -8, __, -7, __, -3, __, __, __, __, __, __, E3,
    326                E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    327                __, __},
    328 /*tr     T1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    329                __, __, __, __, __, __, __, __, __, T2, __, __, __, __, __,
    330                __, __},
    331 /*tru    T2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    332                __, __, __, __, __, __, __, __, __, __, __, __, T3, __, __,
    333                __, __},
    334 /*true   T3*/ {__, __, __, __, __, __, __, __, __, __, CB, __, __, __, __,
    335                __, __, __, __, __, OK, __, __, __, __, __, __, __, __, __,
    336                __, __},
    337 /*fa     F1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    338                __, F2, __, __, __, __, __, __, __, __, __, __, __, __, __,
    339                __, __},
    340 /*fal    F2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    341                __, __, __, __, __, __, __, F3, __, __, __, __, __, __, __,
    342                __, __},
    343 /*fals   F3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    344                __, __, __, __, __, __, __, __, __, __, F4, __, __, __, __,
    345                __, __},
    346 /*false  F4*/ {__, __, __, __, __, __, __, __, __, __, CB, __, __, __, __,
    347                __, __, __, __, __, OK, __, __, __, __, __, __, __, __, __,
    348                __, __},
    349 /*nu     N1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    350                __, __, __, __, __, __, __, __, __, __, __, __, N2, __, __,
    351                __, __},
    352 /*nul    N2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    353                __, __, __, __, __, __, __, N3, __, __, __, __, __, __, __,
    354                __, __},
    355 /*null   N3*/ {__, __, __, __, __, __, __, __, __, __, CB, __, __, __, __,
    356                __, __, __, __, __, __, __, OK, __, __, __, __, __, __, __,
    357                __, __},
    358 /*/      C1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    359                __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    360                __, C2},
    361 /*/*     C2*/ {C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2,
    362                C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2,
    363                C2, C3},
    364 /**      C3*/ {C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, CE, C2, C2, C2, C2,
    365                C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2,
    366                C2, C3},
    367 /*_.     FX*/ {OK, OK, __, -8, __, -7, __, -3, __, __, __, __, __, __, FR,
    368                FR, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1,
    369                __, __},
    370 /*\      D1*/ {__, __, __, __, __, __, __, __, __, D2, __, __, __, __, __,
    371                __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    372                __, __},
    373 /*\      D2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
    374                __, __, __, __, __, __, __, __, __, __, __, __, U1, __, __,
    375                __, __},
     242                 white                                      1-9                                   ABCDF  etc
     243             space |  {  }  [  ]  :  ,  "  \  /  +  -  .  0  |  a  b  c  d  e  f  l  n  r  s  t  u  |  E  |  * */
     244/*start  GO*/ {GO,GO,-6,__,-5,__,__,__,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     245/*ok     OK*/ {OK,OK,__,-8,__,-7,__,-3,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     246/*object OB*/ {OB,OB,__,-9,__,__,__,__,SB,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     247/*key    KE*/ {KE,KE,__,__,__,__,__,__,SB,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     248/*colon  CO*/ {CO,CO,__,__,__,__,-2,__,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     249/*value  VA*/ {VA,VA,-6,__,-5,__,__,__,SB,__,CB,__,MX,__,ZX,IX,__,__,__,__,__,FA,__,NU,__,__,TR,__,__,__,__,__},
     250/*array  AR*/ {AR,AR,-6,__,-5,-7,__,__,SB,__,CB,__,MX,__,ZX,IX,__,__,__,__,__,FA,__,NU,__,__,TR,__,__,__,__,__},
     251/*string ST*/ {ST,__,ST,ST,ST,ST,ST,ST,-4,EX,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST,ST},
     252/*escape ES*/ {__,__,__,__,__,__,__,__,ST,ST,ST,__,__,__,__,__,__,ST,__,__,__,ST,__,ST,ST,__,ST,U1,__,__,__,__},
     253/*u1     U1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,U2,U2,U2,U2,U2,U2,U2,U2,__,__,__,__,__,__,U2,U2,__,__},
     254/*u2     U2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,U3,U3,U3,U3,U3,U3,U3,U3,__,__,__,__,__,__,U3,U3,__,__},
     255/*u3     U3*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,U4,U4,U4,U4,U4,U4,U4,U4,__,__,__,__,__,__,U4,U4,__,__},
     256/*u4     U4*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,UC,UC,UC,UC,UC,UC,UC,UC,__,__,__,__,__,__,UC,UC,__,__},
     257/*minus  MI*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,ZE,IT,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     258/*zero   ZE*/ {OK,OK,__,-8,__,-7,__,-3,__,__,CB,__,__,DF,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     259/*int    IT*/ {OK,OK,__,-8,__,-7,__,-3,__,__,CB,__,__,DF,IT,IT,__,__,__,__,DE,__,__,__,__,__,__,__,__,DE,__,__},
     260/*frac   FR*/ {OK,OK,__,-8,__,-7,__,-3,__,__,CB,__,__,__,FR,FR,__,__,__,__,E1,__,__,__,__,__,__,__,__,E1,__,__},
     261/*e      E1*/ {__,__,__,__,__,__,__,__,__,__,__,E2,E2,__,E3,E3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     262/*ex     E2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,E3,E3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     263/*exp    E3*/ {OK,OK,__,-8,__,-7,__,-3,__,__,__,__,__,__,E3,E3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     264/*tr     T1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,T2,__,__,__,__,__,__,__},
     265/*tru    T2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,T3,__,__,__,__},
     266/*true   T3*/ {__,__,__,__,__,__,__,__,__,__,CB,__,__,__,__,__,__,__,__,__,OK,__,__,__,__,__,__,__,__,__,__,__},
     267/*fa     F1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,F2,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     268/*fal    F2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,F3,__,__,__,__,__,__,__,__,__},
     269/*fals   F3*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,F4,__,__,__,__,__,__},
     270/*false  F4*/ {__,__,__,__,__,__,__,__,__,__,CB,__,__,__,__,__,__,__,__,__,OK,__,__,__,__,__,__,__,__,__,__,__},
     271/*nu     N1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,N2,__,__,__,__},
     272/*nul    N2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,N3,__,__,__,__,__,__,__,__,__},
     273/*null   N3*/ {__,__,__,__,__,__,__,__,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,OK,__,__,__,__,__,__,__,__,__},
     274/*/      C1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,C2},
     275/*/*     C2*/ {C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C3},
     276/**      C3*/ {C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,CE,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C2,C3},
     277/*_.     FX*/ {OK,OK,__,-8,__,-7,__,-3,__,__,__,__,__,__,FR,FR,__,__,__,__,E1,__,__,__,__,__,__,__,__,E1,__,__},
     278/*\      D1*/ {__,__,__,__,__,__,__,__,__,D2,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
     279/*\      D2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,U1,__,__,__,__},
    376280};
    377281
     
    379283/*
    380284    These modes can be pushed on the stack.
    381  */
    382 enum modes
    383 {
    384     MODE_ARRAY = 1,
    385     MODE_DONE = 2,
    386     MODE_KEY = 3,
     285*/
     286enum modes {
     287    MODE_ARRAY = 1,
     288    MODE_DONE = 2, 
     289    MODE_KEY = 3,   
    387290    MODE_OBJECT = 4
    388291};
    389292
    390293static int
    391 push( JSON_parser jc,
    392       int         mode )
     294push(JSON_parser jc, int mode)
    393295{
    394296/*
    395297    Push a mode onto the stack. Return false if there is overflow.
    396  */
     298*/
    397299    jc->top += 1;
    398     if( jc->depth < 0 )
    399     {
    400         if( jc->top >= jc->stack_capacity )
    401         {
     300    if (jc->depth < 0) {
     301        if (jc->top >= jc->stack_capacity) {
    402302            size_t bytes_to_allocate;
    403303            jc->stack_capacity *= 2;
    404             bytes_to_allocate = jc->stack_capacity *
    405                                 sizeof( jc->static_stack[0] );
    406             if( jc->stack == &jc->static_stack[0] )
    407             {
    408                 jc->stack = (signed char*)malloc( bytes_to_allocate );
    409                 memcpy( jc->stack, jc->static_stack,
    410                        sizeof( jc->static_stack ) );
    411             }
    412             else
    413             {
    414                 jc->stack = (signed char*)realloc( jc->stack,
    415                                                    bytes_to_allocate );
    416             }
    417         }
    418     }
    419     else
    420     {
    421         if( jc->top >= jc->depth )
    422         {
     304            bytes_to_allocate = jc->stack_capacity * sizeof(jc->static_stack[0]);
     305            if (jc->stack == &jc->static_stack[0]) {
     306                jc->stack = (signed char*)malloc(bytes_to_allocate);
     307                memcpy(jc->stack, jc->static_stack, sizeof(jc->static_stack));
     308            } else {
     309                jc->stack = (signed char*)realloc(jc->stack, bytes_to_allocate);
     310            }
     311        }
     312    } else {
     313        if (jc->top >= jc->depth) {
    423314            return false;
    424315        }
    425316    }
    426 
     317   
    427318    jc->stack[jc->top] = mode;
    428319    return true;
    429320}
    430321
     322
    431323static int
    432 pop( JSON_parser jc,
    433      int         mode )
     324pop(JSON_parser jc, int mode)
    434325{
    435326/*
    436327    Pop the stack, assuring that the current mode matches the expectation.
    437328    Return false if there is underflow or if the modes mismatch.
    438  */
    439     if( jc->top < 0 || jc->stack[jc->top] != mode )
    440     {
     329*/
     330    if (jc->top < 0 || jc->stack[jc->top] != mode) {
    441331        return false;
    442332    }
     
    445335}
    446336
    447 #define parse_buffer_clear( jc ) \
    448     do { \
    449         jc->parse_buffer_count = 0; \
    450         jc->parse_buffer[0] = 0; \
    451     } while( 0 )
    452 
    453 #define parse_buffer_pop_back_char( jc ) \
    454     do { \
    455         assert( jc->parse_buffer_count >= 1 ); \
    456         --jc->parse_buffer_count; \
    457         jc->parse_buffer[jc->parse_buffer_count] = 0; \
    458     } while( 0 )
    459 
    460 void
    461 delete_JSON_parser( JSON_parser jc )
    462 {
    463     if( jc )
    464     {
    465         if( jc->stack != &jc->static_stack[0] )
    466         {
    467             free( (void*)jc->stack );
    468         }
    469         if( jc->parse_buffer != &jc->static_parse_buffer[0] )
    470         {
    471             free( (void*)jc->parse_buffer );
    472         }
    473         free( (void*)jc );
    474     }
    475 }
     337
     338#define parse_buffer_clear(jc) \
     339    do {\
     340        jc->parse_buffer_count = 0;\
     341        jc->parse_buffer[0] = 0;\
     342    } while (0)
     343   
     344#define parse_buffer_pop_back_char(jc)\
     345    do {\
     346        assert(jc->parse_buffer_count >= 1);\
     347        --jc->parse_buffer_count;\
     348        jc->parse_buffer[jc->parse_buffer_count] = 0;\
     349    } while (0)   
     350   
     351void delete_JSON_parser(JSON_parser jc)
     352{
     353    if (jc) {
     354        if (jc->stack != &jc->static_stack[0]) {
     355            free((void*)jc->stack);
     356        }
     357        if (jc->parse_buffer != &jc->static_parse_buffer[0]) {
     358            free((void*)jc->parse_buffer);
     359        }
     360        free((void*)jc);
     361     }   
     362}
     363
    476364
    477365JSON_parser
    478 new_JSON_parser( JSON_config* config )
     366new_JSON_parser(JSON_config* config)
    479367{
    480368/*
     
    486374    JSON text, and then call JSON_parser_done to obtain the final result.
    487375    These functions are fully reentrant.
    488  */
    489 
    490     int         depth = 0;
     376*/
     377
     378    int depth = 0;
    491379    JSON_config default_config;
    492 
    493     JSON_parser jc = malloc( sizeof( struct JSON_parser_struct ) );
    494 
    495     memset( jc, 0, sizeof( *jc ) );
    496 
    497 
     380   
     381    JSON_parser jc = malloc(sizeof(struct JSON_parser_struct));
     382   
     383    memset(jc, 0, sizeof(*jc));
     384   
     385   
    498386    /* initialize configuration */
    499     init_JSON_config( &default_config );
    500 
     387    init_JSON_config(&default_config);
     388   
    501389    /* set to default configuration if none was provided */
    502     if( config == NULL )
    503     {
     390    if (config == NULL) {
    504391        config = &default_config;
    505392    }
    506393
    507394    depth = config->depth;
    508 
     395   
    509396    /* We need to be able to push at least one object */
    510     if( depth == 0 )
    511     {
     397    if (depth == 0) {
    512398        depth = 1;
    513399    }
    514 
     400   
    515401    jc->state = GO;
    516402    jc->top = -1;
    517 
     403   
    518404    /* Do we want non-bound stack? */
    519     if( depth > 0 )
    520     {
     405    if (depth > 0) {
    521406        jc->stack_capacity = depth;
    522407        jc->depth = depth;
    523         if( depth <= (int)COUNTOF( jc->static_stack ) )
    524         {
     408        if (depth <= (int)COUNTOF(jc->static_stack)) {
    525409            jc->stack = &jc->static_stack[0];
    526         }
    527         else
    528         {
    529             jc->stack =
    530                 (signed char*)malloc( jc->stack_capacity *
    531                                      sizeof( jc->static_stack[0] ) );
    532         }
    533     }
    534     else
    535     {
    536         jc->stack_capacity = COUNTOF( jc->static_stack );
     410        } else {
     411            jc->stack = (signed char*)malloc(jc->stack_capacity * sizeof(jc->static_stack[0]));
     412        }
     413    } else {
     414        jc->stack_capacity = COUNTOF(jc->static_stack);
    537415        jc->depth = -1;
    538416        jc->stack = &jc->static_stack[0];
    539417    }
    540 
     418   
    541419    /* set parser to start */
    542     push( jc, MODE_DONE );
    543 
     420    push(jc, MODE_DONE);
     421   
    544422    /* set up the parse buffer */
    545423    jc->parse_buffer = &jc->static_parse_buffer[0];
    546     jc->parse_buffer_capacity = COUNTOF( jc->static_parse_buffer );
    547     parse_buffer_clear( jc );
    548 
     424    jc->parse_buffer_capacity = COUNTOF(jc->static_parse_buffer);
     425    parse_buffer_clear(jc);
     426   
    549427    /* set up callback, comment & float handling */
    550428    jc->callback = config->callback;
     
    555433}
    556434
    557 static void
    558 grow_parse_buffer( JSON_parser jc )
     435static void grow_parse_buffer(JSON_parser jc)
    559436{
    560437    size_t bytes_to_allocate;
    561 
    562438    jc->parse_buffer_capacity *= 2;
    563     bytes_to_allocate = jc->parse_buffer_capacity *
    564                         sizeof( jc->parse_buffer[0] );
    565     if( jc->parse_buffer == &jc->static_parse_buffer[0] )
    566     {
    567         jc->parse_buffer = (char*)malloc( bytes_to_allocate );
    568         memcpy( jc->parse_buffer, jc->static_parse_buffer,
    569                 jc->parse_buffer_count );
    570     }
    571     else
    572     {
    573         jc->parse_buffer = (char*)realloc( jc->parse_buffer,
    574                                            bytes_to_allocate );
    575     }
    576 }
    577 
    578 #define parse_buffer_push_back_char( jc, c ) \
    579     do { \
    580         if( jc->parse_buffer_count + 1 >=\
    581             jc->parse_buffer_capacity ) grow_parse_buffer( jc );\
    582         jc->parse_buffer[jc->parse_buffer_count++] = c; \
    583         jc->parse_buffer[jc->parse_buffer_count]   = 0; \
    584     } while( 0 )
    585 
    586 
    587 static int
    588 parse_parse_buffer( JSON_parser jc )
    589 {
    590     if( jc->callback )
    591     {
     439    bytes_to_allocate = jc->parse_buffer_capacity * sizeof(jc->parse_buffer[0]);
     440    if (jc->parse_buffer == &jc->static_parse_buffer[0]) {
     441        jc->parse_buffer = (char*)malloc(bytes_to_allocate);
     442        memcpy(jc->parse_buffer, jc->static_parse_buffer, jc->parse_buffer_count);
     443    } else {
     444        jc->parse_buffer = (char*)realloc(jc->parse_buffer, bytes_to_allocate);
     445    }
     446}
     447
     448#define parse_buffer_push_back_char(jc, c)\
     449    do {\
     450        if (jc->parse_buffer_count + 1 >= jc->parse_buffer_capacity) grow_parse_buffer(jc);\
     451        jc->parse_buffer[jc->parse_buffer_count++] = c;\
     452        jc->parse_buffer[jc->parse_buffer_count]   = 0;\
     453    } while (0)
     454
     455
     456static int parse_parse_buffer(JSON_parser jc)
     457{
     458    if (jc->callback) {
    592459        JSON_value value, *arg = NULL;
    593 
    594         if( jc->type != JSON_T_NONE )
    595         {
     460       
     461        if (jc->type != JSON_T_NONE) {
    596462            assert(
    597                 jc->type == JSON_T_NULL
    598                   || jc->type == JSON_T_FALSE
    599                   || jc->type == JSON_T_TRUE
    600                   || jc->type == JSON_T_FLOAT
    601                   || jc->type == JSON_T_INTEGER
    602                   || jc->type == JSON_T_STRING );
    603 
    604             switch( jc->type )
    605             {
     463                jc->type == JSON_T_NULL ||
     464                jc->type == JSON_T_FALSE ||
     465                jc->type == JSON_T_TRUE ||
     466                jc->type == JSON_T_FLOAT ||
     467                jc->type == JSON_T_INTEGER ||
     468                jc->type == JSON_T_STRING);
     469       
     470            switch(jc->type) {
    606471                case JSON_T_FLOAT:
    607472                    arg = &value;
    608                     if( jc->handle_floats_manually )
    609                     {
     473                    if (jc->handle_floats_manually) {
    610474                        value.vu.str.value = jc->parse_buffer;
    611475                        value.vu.str.length = jc->parse_buffer_count;
    612                     }
    613                     else
    614                     {
    615                         sscanf( jc->parse_buffer, "%Lf",
    616                                 &value.vu.float_value );
     476                    } else {
     477                        sscanf(jc->parse_buffer, "%Lf", &value.vu.float_value);
    617478                    }
    618479                    break;
    619 
    620480                case JSON_T_INTEGER:
    621481                    arg = &value;
    622                     sscanf( jc->parse_buffer,
    623                             JSON_PARSER_INTEGER_SSCANF_TOKEN,
    624                             &value.vu.integer_value );
     482                    sscanf(jc->parse_buffer, JSON_PARSER_INTEGER_SSCANF_TOKEN, &value.vu.integer_value);
    625483                    break;
    626 
    627484                case JSON_T_STRING:
    628485                    arg = &value;
     
    631488                    break;
    632489            }
    633 
    634             if( !( *jc->callback )( jc->ctx, jc->type, arg ) )
    635             {
    636                 return false;
    637             }
    638         }
    639     }
    640 
    641     parse_buffer_clear( jc );
    642 
     490           
     491            if (!(*jc->callback)(jc->ctx, jc->type, arg)) {
     492                return false;
     493            }
     494        }
     495    }
     496   
     497    parse_buffer_clear(jc);
     498   
    643499    return true;
    644500}
    645501
    646 static int
    647 decode_unicode_char( JSON_parser jc )
     502static int decode_unicode_char(JSON_parser jc)
    648503{
    649504    const unsigned chars = jc->utf16_decode_buffer[0] ? 2 : 1;
    650     int            i;
    651     UTF16 *        uc = chars ==
    652                         1 ? &jc->utf16_decode_buffer[0] : &jc->
    653                         utf16_decode_buffer[1];
    654     UTF16          x;
    655     char*          p;
    656 
    657     assert( jc->parse_buffer_count >= 6 );
    658 
     505    int i;
     506    UTF16 *uc = chars == 1 ? &jc->utf16_decode_buffer[0] : &jc->utf16_decode_buffer[1];
     507    UTF16 x;
     508    char* p;
     509   
     510    assert(jc->parse_buffer_count >= 6);
     511   
    659512    p = &jc->parse_buffer[jc->parse_buffer_count - 4];
    660 
    661     for( i = 0; i < 4; ++i, ++p )
    662     {
     513   
     514    for (i = 0; i < 4; ++i, ++p) {
    663515        x = *p;
    664 
    665         if( x >= 'a' )
    666         {
    667             x -= ( 'a' - 10 );
    668         }
    669         else if( x >= 'A' )
    670         {
    671             x -= ( 'A' - 10 );
    672         }
    673         else
    674         {
    675             x &= ~( (UTF16) 0x30 );
    676         }
    677 
    678         assert( x < 16 );
    679 
    680         *uc |= x << ( ( 3u - i ) << 2 );
    681     }
    682 
     516       
     517        if (x >= 'a') {
     518            x -= ('a' - 10);
     519        } else if (x >= 'A') {
     520            x -= ('A' - 10);
     521        } else {
     522            x &= ~((UTF16) 0x30);
     523        }
     524       
     525        assert(x < 16);
     526       
     527        *uc |= x << ((3u - i) << 2);
     528    }
     529   
    683530    /* clear UTF-16 char form buffer */
    684531    jc->parse_buffer_count -= 6;
    685532    jc->parse_buffer[jc->parse_buffer_count] = 0;
    686 
     533   
    687534    /* attempt decoding ... */
    688535    {
    689         UTF8*                  dec_start =
    690             (UTF8*)&jc->parse_buffer[jc->parse_buffer_count];
    691         UTF8*                  dec_start_dup = dec_start;
    692         UTF8*                  dec_end = dec_start + 6;
    693 
    694         const UTF16*           enc_start = &jc->utf16_decode_buffer[0];
    695         const UTF16*           enc_end = enc_start + chars;
    696 
     536        UTF8* dec_start = (UTF8*)&jc->parse_buffer[jc->parse_buffer_count];
     537        UTF8* dec_start_dup = dec_start;
     538        UTF8* dec_end = dec_start + 6;
     539       
     540        const UTF16* enc_start = &jc->utf16_decode_buffer[0];
     541        const UTF16* enc_end = enc_start + chars;
     542   
    697543        const ConversionResult result = ConvertUTF16toUTF8(
    698             &enc_start, enc_end, &dec_start, dec_end, strictConversion );
    699 
    700         const size_t           new_chars = dec_start - dec_start_dup;
    701 
     544            &enc_start, enc_end, &dec_start, dec_end, strictConversion);
     545       
     546        const size_t new_chars = dec_start - dec_start_dup;
     547       
    702548        /* was it a surrogate UTF-16 char? */
    703         if( chars == 1 && result == sourceExhausted )
    704         {
     549        if (chars == 1 && result == sourceExhausted) {
    705550            return true;
    706551        }
    707 
    708         if( result != conversionOK )
    709         {
     552       
     553        if (result != conversionOK) {
    710554            return false;
    711555        }
    712 
     556       
    713557        /* NOTE: clear decode buffer to resume string reading,
    714558           otherwise we continue to read UTF-16 */
    715559        jc->utf16_decode_buffer[0] = 0;
    716 
    717         assert( new_chars <= 6 );
    718 
     560       
     561        assert(new_chars <= 6);
     562       
    719563        jc->parse_buffer_count += new_chars;
    720564        jc->parse_buffer[jc->parse_buffer_count] = 0;
    721565    }
    722 
     566   
    723567    return true;
    724568}
    725569
     570
    726571int
    727 JSON_parser_char( JSON_parser jc,
    728                   int         next_char )
     572JSON_parser_char(JSON_parser jc, int next_char)
    729573{
    730574/*
     
    733577    UTF-32. It returns true if things are looking ok so far. If it rejects the
    734578    text, it returns false.
    735  */
     579*/
    736580    int next_class, next_state;
    737 
     581   
    738582/*
    739583    Determine the character's class.
    740  */
    741     if( next_char < 0 )
    742     {
     584*/
     585    if (next_char < 0) {
    743586        return false;
    744587    }
    745     if( next_char >= 128 )
    746     {
     588    if (next_char >= 128) {
    747589        next_class = C_ETC;
    748     }
    749     else
    750     {
     590    } else {
    751591        next_class = ascii_class[next_char];
    752         if( next_class <= __ )
    753         {
     592        if (next_class <= __) {
    754593            return false;
    755594        }
    756595    }
    757 
    758     if( jc->escaped )
    759     {
     596   
     597    if (jc->escaped) {
    760598        jc->escaped = 0;
    761599        /* remove the backslash */
    762         parse_buffer_pop_back_char( jc );
    763         switch( next_char )
    764         {
    765             case 'b':
    766                 parse_buffer_push_back_char( jc, '\b' );
    767                 break;
    768 
    769             case 'f':
    770                 parse_buffer_push_back_char( jc, '\f' );
    771                 break;
    772 
    773             case 'n':
    774                 parse_buffer_push_back_char( jc, '\n' );
    775                 break;
    776 
    777             case 'r':
    778                 parse_buffer_push_back_char( jc, '\r' );
    779                 break;
    780 
    781             case 't':
    782                 parse_buffer_push_back_char( jc, '\t' );
    783                 break;
    784 
    785             case '"':
    786                 parse_buffer_push_back_char( jc, '"' );
    787                 break;
    788 
    789             case '\\':
    790                 parse_buffer_push_back_char( jc, '\\' );
    791                 break;
    792 
    793             case '/':
    794                 parse_buffer_push_back_char( jc, '/' );
    795                 break;
    796 
    797             case 'u':
    798                 parse_buffer_push_back_char( jc, '\\' );
    799                 parse_buffer_push_back_char( jc, 'u' );
    800                 break;
    801 
    802             default:
    803                 return false;
    804         }
    805     }
    806     else if( !jc->comment )
    807     {
    808         if( jc->type != JSON_T_NONE
    809           || !( next_class == C_SPACE || next_class == C_WHITE ) /*
    810                                                                    non-white-space
    811                                                                    */                  )
    812         {
    813             parse_buffer_push_back_char( jc, (char)next_char );
    814         }
    815     }
    816 
    817 
     600        parse_buffer_pop_back_char(jc);
     601        switch(next_char) {
     602        case 'b':
     603            parse_buffer_push_back_char(jc, '\b');
     604            break;
     605        case 'f':
     606            parse_buffer_push_back_char(jc, '\f');
     607            break;
     608        case 'n':
     609            parse_buffer_push_back_char(jc, '\n');
     610            break;
     611        case 'r':
     612            parse_buffer_push_back_char(jc, '\r');
     613            break;
     614        case 't':
     615            parse_buffer_push_back_char(jc, '\t');
     616            break;
     617        case '"':
     618            parse_buffer_push_back_char(jc, '"');
     619            break;
     620        case '\\':
     621            parse_buffer_push_back_char(jc, '\\');
     622            break;
     623        case '/':
     624            parse_buffer_push_back_char(jc, '/');
     625            break;
     626        case 'u':
     627            parse_buffer_push_back_char(jc, '\\');
     628            parse_buffer_push_back_char(jc, 'u');
     629            break;
     630        default:
     631            return false;
     632        }
     633    } else if (!jc->comment) {
     634        if (jc->type != JSON_T_NONE || !(next_class == C_SPACE || next_class == C_WHITE) /* non-white-space */) {
     635            parse_buffer_push_back_char(jc, (char)next_char);
     636        }
     637    }
     638   
     639   
     640   
    818641/*
    819642    Get the next state from the state transition table.
    820  */
     643*/
    821644    next_state = state_transition_table[jc->state][next_class];
    822     if( next_state >= 0 )
    823     {
     645    if (next_state >= 0) {
    824646/*
    825647    Change the state.
    826  */
     648*/
    827649        jc->state = next_state;
    828     }
    829     else
    830     {
     650    } else {
    831651/*
    832652    Or perform one of the actions.
    833  */
    834         switch( next_state )
    835         {
    836 /* Unicode character */
    837             case UC:
    838                 if( !decode_unicode_char( jc ) )
    839                 {
    840                     return false;
    841                 }
    842                 /* check if we need to read a second UTF-16 char */
    843                 if( jc->utf16_decode_buffer[0] )
    844                 {
    845                     jc->state = D1;
    846                 }
    847                 else
    848                 {
    849                     jc->state = ST;
     653*/
     654        switch (next_state) {
     655/* Unicode character */       
     656        case UC:
     657            if(!decode_unicode_char(jc)) {
     658                return false;
     659            }
     660            /* check if we need to read a second UTF-16 char */
     661            if (jc->utf16_decode_buffer[0]) {
     662                jc->state = D1;
     663            } else {
     664                jc->state = ST;
     665            }
     666            break;
     667/* escaped char */
     668        case EX:
     669            jc->escaped = 1;
     670            jc->state = ES;
     671            break;
     672/* integer detected by minus */
     673        case MX:
     674            jc->type = JSON_T_INTEGER;
     675            jc->state = MI;
     676            break; 
     677/* integer detected by zero */           
     678        case ZX:
     679            jc->type = JSON_T_INTEGER;
     680            jc->state = ZE;
     681            break; 
     682/* integer detected by 1-9 */           
     683        case IX:
     684            jc->type = JSON_T_INTEGER;
     685            jc->state = IT;
     686            break; 
     687           
     688/* floating point number detected by exponent*/
     689        case DE:
     690            assert(jc->type != JSON_T_FALSE);
     691            assert(jc->type != JSON_T_TRUE);
     692            assert(jc->type != JSON_T_NULL);
     693            assert(jc->type != JSON_T_STRING);
     694            jc->type = JSON_T_FLOAT;
     695            jc->state = E1;
     696            break;   
     697       
     698/* floating point number detected by fraction */
     699        case DF:
     700            assert(jc->type != JSON_T_FALSE);
     701            assert(jc->type != JSON_T_TRUE);
     702            assert(jc->type != JSON_T_NULL);
     703            assert(jc->type != JSON_T_STRING);
     704            jc->type = JSON_T_FLOAT;
     705            jc->state = FX;
     706            break;   
     707/* string begin " */
     708        case SB:
     709            parse_buffer_clear(jc);
     710            assert(jc->type == JSON_T_NONE);
     711            jc->type = JSON_T_STRING;
     712            jc->state = ST;
     713            break;       
     714       
     715/* n */
     716        case NU:
     717            assert(jc->type == JSON_T_NONE);
     718            jc->type = JSON_T_NULL;
     719            jc->state = N1;
     720            break;       
     721/* f */
     722        case FA:
     723            assert(jc->type == JSON_T_NONE);
     724            jc->type = JSON_T_FALSE;
     725            jc->state = F1;
     726            break;       
     727/* t */
     728        case TR:
     729            assert(jc->type == JSON_T_NONE);
     730            jc->type = JSON_T_TRUE;
     731            jc->state = T1;
     732            break;       
     733       
     734/* closing comment */
     735        case CE:
     736            jc->comment = 0;
     737            assert(jc->parse_buffer_count == 0);
     738            assert(jc->type == JSON_T_NONE);
     739            jc->state = jc->before_comment_state;
     740            break;       
     741       
     742/* opening comment  */
     743        case CB:
     744            if (!jc->allow_comments) {
     745                return false;
     746            }
     747            parse_buffer_pop_back_char(jc);
     748            if (!parse_parse_buffer(jc)) {
     749                return false;
     750            }
     751            assert(jc->parse_buffer_count == 0);
     752            assert(jc->type != JSON_T_STRING);
     753            switch (jc->stack[jc->top]) {
     754            case MODE_ARRAY:
     755            case MODE_OBJECT:   
     756                switch(jc->state) {
     757                case VA:
     758                case AR:
     759                    jc->before_comment_state = jc->state;
     760                    break;
     761                default:
     762                    jc->before_comment_state = OK;
     763                    break;
    850764                }
    851765                break;
    852 
    853 /* escaped char */
    854             case EX:
    855                 jc->escaped = 1;
    856                 jc->state = ES;
     766            default:
     767                jc->before_comment_state = jc->state;
    857768                break;
    858 
    859 /* integer detected by minus */
    860             case MX:
    861                 jc->type = JSON_T_INTEGER;
    862                 jc->state = MI;
     769            }
     770            jc->type = JSON_T_NONE;
     771            jc->state = C1;
     772            jc->comment = 1;
     773            break;
     774/* empty } */
     775        case -9:       
     776            parse_buffer_clear(jc);
     777            if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_OBJECT_END, NULL)) {
     778                return false;
     779            }
     780            if (!pop(jc, MODE_KEY)) {
     781                return false;
     782            }
     783            jc->state = OK;
     784            break;
     785
     786/* } */ case -8:
     787            parse_buffer_pop_back_char(jc);
     788            if (!parse_parse_buffer(jc)) {
     789                return false;
     790            }
     791            if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_OBJECT_END, NULL)) {
     792                return false;
     793            }
     794            if (!pop(jc, MODE_OBJECT)) {
     795                return false;
     796            }
     797            jc->type = JSON_T_NONE;
     798            jc->state = OK;
     799            break;
     800
     801/* ] */ case -7:
     802            parse_buffer_pop_back_char(jc);
     803            if (!parse_parse_buffer(jc)) {
     804                return false;
     805            }
     806            if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_ARRAY_END, NULL)) {
     807                return false;
     808            }
     809            if (!pop(jc, MODE_ARRAY)) {
     810                return false;
     811            }
     812           
     813            jc->type = JSON_T_NONE;
     814            jc->state = OK;
     815            break;
     816
     817/* { */ case -6:
     818            parse_buffer_pop_back_char(jc);
     819            if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_OBJECT_BEGIN, NULL)) {
     820                return false;
     821            }
     822            if (!push(jc, MODE_KEY)) {
     823                return false;
     824            }
     825            assert(jc->type == JSON_T_NONE);
     826            jc->state = OB;
     827            break;
     828
     829/* [ */ case -5:
     830            parse_buffer_pop_back_char(jc);
     831            if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_ARRAY_BEGIN, NULL)) {
     832                return false;
     833            }
     834            if (!push(jc, MODE_ARRAY)) {
     835                return false;
     836            }
     837            assert(jc->type == JSON_T_NONE);
     838            jc->state = AR;
     839            break;
     840
     841/* string end " */ case -4:
     842            parse_buffer_pop_back_char(jc);
     843            switch (jc->stack[jc->top]) {
     844            case MODE_KEY:
     845                assert(jc->type == JSON_T_STRING);
     846                jc->type = JSON_T_NONE;
     847                jc->state = CO;
     848               
     849                if (jc->callback) {
     850                    JSON_value value;
     851                    value.vu.str.value = jc->parse_buffer;
     852                    value.vu.str.length = jc->parse_buffer_count;
     853                    if (!(*jc->callback)(jc->ctx, JSON_T_KEY, &value)) {
     854                        return false;
     855                    }
     856                }
     857                parse_buffer_clear(jc);
    863858                break;
    864 
    865 /* integer detected by zero */
    866             case ZX:
    867                 jc->type = JSON_T_INTEGER;
    868                 jc->state = ZE;
    869                 break;
    870 
    871 /* integer detected by 1-9 */
    872             case IX:
    873                 jc->type = JSON_T_INTEGER;
    874                 jc->state = IN;
    875                 break;
    876 
    877 /* floating point number detected by exponent*/
    878             case DE:
    879                 assert( jc->type != JSON_T_FALSE );
    880                 assert( jc->type != JSON_T_TRUE );
    881                 assert( jc->type != JSON_T_NULL );
    882                 assert( jc->type != JSON_T_STRING );
    883                 jc->type = JSON_T_FLOAT;
    884                 jc->state = E1;
    885                 break;
    886 
    887 /* floating point number detected by fraction */
    888             case DF:
    889                 assert( jc->type != JSON_T_FALSE );
    890                 assert( jc->type != JSON_T_TRUE );
    891                 assert( jc->type != JSON_T_NULL );
    892                 assert( jc->type != JSON_T_STRING );
    893                 jc->type = JSON_T_FLOAT;
    894                 jc->state = FX;
    895                 break;
    896 
    897 /* string begin " */
    898             case SB:
    899                 parse_buffer_clear( jc );
    900                 assert( jc->type == JSON_T_NONE );
    901                 jc->type = JSON_T_STRING;
    902                 jc->state = ST;
    903                 break;
    904 
    905 /* n */
    906             case NU:
    907                 assert( jc->type == JSON_T_NONE );
    908                 jc->type = JSON_T_NULL;
    909                 jc->state = N1;
    910                 break;
    911 
    912 /* f */
    913             case FA:
    914                 assert( jc->type == JSON_T_NONE );
    915                 jc->type = JSON_T_FALSE;
    916                 jc->state = F1;
    917                 break;
    918 
    919 /* t */
    920             case TR:
    921                 assert( jc->type == JSON_T_NONE );
    922                 jc->type = JSON_T_TRUE;
    923                 jc->state = T1;
    924                 break;
    925 
    926 /* closing comment */
    927             case CE:
    928                 jc->comment = 0;
    929                 assert( jc->parse_buffer_count == 0 );
    930                 assert( jc->type == JSON_T_NONE );
    931                 jc->state = jc->before_comment_state;
    932                 break;
    933 
    934 /* opening comment  */
    935             case CB:
    936                 if( !jc->allow_comments )
    937                 {
    938                     return false;
    939                 }
    940                 parse_buffer_pop_back_char( jc );
    941                 if( !parse_parse_buffer( jc ) )
    942                 {
    943                     return false;
    944                 }
    945                 assert( jc->parse_buffer_count == 0 );
    946                 assert( jc->type != JSON_T_STRING );
    947                 switch( jc->stack[jc->top] )
    948                 {
    949                     case MODE_ARRAY:
    950                     case MODE_OBJECT:
    951                         switch( jc->state )
    952                         {
    953                             case VA:
    954                             case AR:
    955                                 jc->before_comment_state = jc->state;
    956                                 break;
    957 
    958                             default:
    959                                 jc->before_comment_state = OK;
    960                                 break;
    961                         }
    962                         break;
    963 
    964                     default:
    965                         jc->before_comment_state = jc->state;
    966                         break;
    967                 }
    968                 jc->type = JSON_T_NONE;
    969                 jc->state = C1;
    970                 jc->comment = 1;
    971                 break;
    972 
    973 /* empty } */
    974             case - 9:
    975                 parse_buffer_clear( jc );
    976                 if( jc->callback
    977                   && !( *jc->callback )( jc->ctx, JSON_T_OBJECT_END, NULL ) )
    978                 {
    979                     return false;
    980                 }
    981                 if( !pop( jc, MODE_KEY ) )
    982                 {
    983                     return false;
    984                 }
    985                 jc->state = OK;
    986                 break;
    987 
    988 /* } */ case - 8:
    989                 parse_buffer_pop_back_char( jc );
    990                 if( !parse_parse_buffer( jc ) )
    991                 {
    992                     return false;
    993                 }
    994                 if( jc->callback
    995                   && !( *jc->callback )( jc->ctx, JSON_T_OBJECT_END, NULL ) )
    996                 {
    997                     return false;
    998                 }
    999                 if( !pop( jc, MODE_OBJECT ) )
    1000                 {
     859            case MODE_ARRAY:
     860            case MODE_OBJECT:
     861                assert(jc->type == JSON_T_STRING);
     862                if (!parse_parse_buffer(jc)) {
    1001863                    return false;
    1002864                }
     
    1004866                jc->state = OK;
    1005867                break;
    1006 
    1007 /* ] */ case - 7:
    1008                 parse_buffer_pop_back_char( jc );
    1009                 if( !parse_parse_buffer( jc ) )
    1010                 {
     868            default:
     869                return false;
     870            }
     871            break;
     872
     873/* , */ case -3:
     874            parse_buffer_pop_back_char(jc);
     875            if (!parse_parse_buffer(jc)) {
     876                return false;
     877            }
     878            switch (jc->stack[jc->top]) {
     879            case MODE_OBJECT:
     880/*
     881    A comma causes a flip from object mode to key mode.
     882*/
     883                if (!pop(jc, MODE_OBJECT) || !push(jc, MODE_KEY)) {
    1011884                    return false;
    1012885                }
    1013                 if( jc->callback
    1014                   && !( *jc->callback )( jc->ctx, JSON_T_ARRAY_END, NULL ) )
    1015                 {
    1016                     return false;
    1017                 }
    1018                 if( !pop( jc, MODE_ARRAY ) )
    1019                 {
    1020                     return false;
    1021                 }
    1022 
     886                assert(jc->type != JSON_T_STRING);
    1023887                jc->type = JSON_T_NONE;
    1024                 jc->state = OK;
     888                jc->state = KE;
    1025889                break;
    1026 
    1027 /* { */ case - 6:
    1028                 parse_buffer_pop_back_char( jc );
    1029                 if( jc->callback
    1030                   && !( *jc->callback )( jc->ctx, JSON_T_OBJECT_BEGIN, NULL ) )
    1031                 {
    1032                     return false;
    1033                 }
    1034                 if( !push( jc, MODE_KEY ) )
    1035                 {
    1036                     return false;
    1037                 }
    1038                 assert( jc->type == JSON_T_NONE );
    1039                 jc->state = OB;
    1040                 break;
    1041 
    1042 /* [ */ case - 5:
    1043                 parse_buffer_pop_back_char( jc );
    1044                 if( jc->callback
    1045                   && !( *jc->callback )( jc->ctx, JSON_T_ARRAY_BEGIN, NULL ) )
    1046                 {
    1047                     return false;
    1048                 }
    1049                 if( !push( jc, MODE_ARRAY ) )
    1050                 {
    1051                     return false;
    1052                 }
    1053                 assert( jc->type == JSON_T_NONE );
    1054                 jc->state = AR;
    1055                 break;
    1056 
    1057 /* string end " */ case - 4:
    1058                 parse_buffer_pop_back_char( jc );
    1059                 switch( jc->stack[jc->top] )
    1060                 {
    1061                     case MODE_KEY:
    1062                         assert( jc->type == JSON_T_STRING );
    1063                         jc->type = JSON_T_NONE;
    1064                         jc->state = CO;
    1065 
    1066                         if( jc->callback )
    1067                         {
    1068                             JSON_value value;
    1069                             value.vu.str.value = jc->parse_buffer;
    1070                             value.vu.str.length = jc->parse_buffer_count;
    1071                             if( !( *jc->callback )( jc->ctx, JSON_T_KEY,
    1072                                                     &value ) )
    1073                             {
    1074                                 return false;
    1075                             }
    1076                         }
    1077                         parse_buffer_clear( jc );
    1078                         break;
    1079 
    1080                     case MODE_ARRAY:
    1081                     case MODE_OBJECT:
    1082                         assert( jc->type == JSON_T_STRING );
    1083                         if( !parse_parse_buffer( jc ) )
    1084                         {
    1085                             return false;
    1086                         }
    1087                         jc->type = JSON_T_NONE;
    1088                         jc->state = OK;
    1089                         break;
    1090 
    1091                     default:
    1092                         return false;
    1093                 }
    1094                 break;
    1095 
    1096 /* , */ case - 3:
    1097                 parse_buffer_pop_back_char( jc );
    1098                 if( !parse_parse_buffer( jc ) )
    1099                 {
    1100                     return false;
    1101                 }
    1102                 switch( jc->stack[jc->top] )
    1103                 {
    1104                     case MODE_OBJECT:
    1105 /*
    1106     A comma causes a flip from object mode to key mode.
    1107  */
    1108                         if( !pop( jc, MODE_OBJECT ) || !push( jc, MODE_KEY ) )
    1109                         {
    1110                             return false;
    1111                         }
    1112                         assert( jc->type != JSON_T_STRING );
    1113                         jc->type = JSON_T_NONE;
    1114                         jc->state = KE;
    1115                         break;
    1116 
    1117                     case MODE_ARRAY:
    1118                         assert( jc->type != JSON_T_STRING );
    1119                         jc->type = JSON_T_NONE;
    1120                         jc->state = VA;
    1121                         break;
    1122 
    1123                     default:
    1124                         return false;
    1125                 }
    1126                 break;
    1127 
    1128 /* : */ case - 2:
    1129 /*
    1130     A colon causes a flip from key mode to object mode.
    1131  */
    1132                 parse_buffer_pop_back_char( jc );
    1133                 if( !pop( jc, MODE_KEY ) || !push( jc, MODE_OBJECT ) )
    1134                 {
    1135                     return false;
    1136                 }
    1137                 assert( jc->type == JSON_T_NONE );
     890            case MODE_ARRAY:
     891                assert(jc->type != JSON_T_STRING);
     892                jc->type = JSON_T_NONE;
    1138893                jc->state = VA;
    1139894                break;
    1140 
    1141             /*
    1142                 Bad action.
    1143              */
    1144895            default:
    1145896                return false;
     897            }
     898            break;
     899
     900/* : */ case -2:
     901/*
     902    A colon causes a flip from key mode to object mode.
     903*/
     904            parse_buffer_pop_back_char(jc);
     905            if (!pop(jc, MODE_KEY) || !push(jc, MODE_OBJECT)) {
     906                return false;
     907            }
     908            assert(jc->type == JSON_T_NONE);
     909            jc->state = VA;
     910            break;
     911/*
     912    Bad action.
     913*/
     914        default:
     915            return false;
    1146916        }
    1147917    }
     
    1149919}
    1150920
     921
    1151922int
    1152 JSON_parser_done( JSON_parser jc )
    1153 {
    1154     const int result = jc->state == OK && pop( jc, MODE_DONE );
     923JSON_parser_done(JSON_parser jc)
     924{
     925    const int result = jc->state == OK && pop(jc, MODE_DONE);
    1155926
    1156927    return result;
    1157928}
    1158929
    1159 int
    1160 JSON_parser_is_legal_white_space_string( const char* s )
     930
     931int JSON_parser_is_legal_white_space_string(const char* s)
    1161932{
    1162933    int c, char_class;
    1163 
    1164     if( s == NULL )
    1165     {
     934   
     935    if (s == NULL) {
    1166936        return false;
    1167937    }
    1168 
    1169     for( ; *s; ++s )
    1170     {
     938   
     939    for (; *s; ++s) {   
    1171940        c = *s;
    1172 
    1173         if( c < 0 || c >= 128 )
    1174         {
     941       
     942        if (c < 0 || c >= 128) {
    1175943            return false;
    1176944        }
    1177 
     945       
    1178946        char_class = ascii_class[c];
    1179 
    1180         if( char_class != C_SPACE && char_class != C_WHITE )
    1181         {
     947       
     948        if (char_class != C_SPACE && char_class != C_WHITE) {
    1182949            return false;
    1183950        }
    1184951    }
    1185 
     952   
    1186953    return true;
    1187954}
    1188955
    1189 void
    1190 init_JSON_config( JSON_config* config )
    1191 {
    1192     if( config )
    1193     {
    1194         memset( config, 0, sizeof( *config ) );
    1195 
     956
     957
     958void init_JSON_config(JSON_config* config)
     959{
     960    if (config) {
     961        memset(config, 0, sizeof(*config));
     962       
    1196963        config->depth = JSON_PARSER_STACK_SIZE - 1;
    1197964    }
    1198965}
    1199 
Note: See TracChangeset for help on using the changeset viewer.