Ignore:
Timestamp:
Sep 23, 2008, 7:11:04 PM (13 years ago)
Author:
charles
Message:

run libT, cli, daemon, gtk through the source-code formatter "uncrustify" as promised/threatened

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/JSON_parser.c

    r6375 r6795  
    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 all
    16 copies or substantial portions of the Software.
    17 
    18 The Software shall be used for Good, not Evil.
    19 
    20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    21 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    22 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    23 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    24 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    25 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    26 SOFTWARE.
    27 */
    28 
    29 /*
    30     Callbacks, comments, Unicode handling by Jean Gressmann (jean@0x42.de), 2007-2008.
    31    
     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
    3234    For the added features the license above applies also.
    33    
     35
    3436    Changelog:
    35         2008/07/19
    36             - Removed some duplicate code & debugging variable (Charles.Kerr@noaa.gov)
    37        
    38         2008/05/28
    39             - Made JSON_value structure ansi C compliant. This bug was report by
     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
    4043              trisk@acm.jhu.edu
    41        
    42         2008/05/20 
    43             - Fixed bug reported by Charles.Kerr@noaa.gov where the switching 
    44               from static to dynamic parse buffer did not copy the static parse 
     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
    4548              buffer's content.
    46 */
    47 
     49 */
    4850
    4951
     
    6062
    6163#if _MSC_VER >= 1400 /* Visual Studio 2005 and up */
    62 #       pragma warning(disable:4996) // unsecure sscanf
     64 #pragma warning(disable:4996) /* unsecure sscanf */
    6365#endif
    6466
     
    7072/* values chosen so that the object size is approx equal to one page (4K) */
    7173#ifndef JSON_PARSER_STACK_SIZE
    72 #   define JSON_PARSER_STACK_SIZE 128
     74 #define JSON_PARSER_STACK_SIZE 128
    7375#endif
    7476
    7577#ifndef JSON_PARSER_PARSE_BUFFER_SIZE
    76 #   define JSON_PARSER_PARSE_BUFFER_SIZE 3500
     78 #define JSON_PARSER_PARSE_BUFFER_SIZE 3500
    7779#endif
    7880
    7981
    80 typedef struct JSON_parser_struct {
    81     JSON_parser_callback callback;
    82     void* ctx;
    83     signed char state, before_comment_state, type, escaped, comment, allow_comments, handle_floats_manually;
    84     UTF16 utf16_decode_buffer[2];
    85     long depth;
    86     long top;
    87     signed char* stack;
    88     long stack_capacity;
    89     signed char static_stack[JSON_PARSER_STACK_SIZE];
    90     char* parse_buffer;
    91     size_t parse_buffer_capacity;
    92     size_t parse_buffer_count;
    93     size_t comment_begin_offset;
    94     char static_parse_buffer[JSON_PARSER_PARSE_BUFFER_SIZE];
     82typedef 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];
    95100} * JSON_parser;
    96101
    97 #define COUNTOF(x) (sizeof(x)/sizeof(x[0]))
     102#define COUNTOF( x ) ( sizeof( x ) / sizeof( x[0] ) )
    98103
    99104/*
    100105    Characters are mapped into these 31 character classes. This allows for
    101106    a significant reduction in the size of the state transition table.
    102 */
    103 
    104 
    105 
    106 enum classes {
     107 */
     108
     109
     110enum classes
     111{
    107112    C_SPACE,  /* space */
    108113    C_WHITE,  /* other whitespace */
     
    119124    C_MINUS,  /* - */
    120125    C_POINT,  /* . */
    121     C_ZERO ,  /* 0 */
     126    C_ZERO,   /* 0 */
    122127    C_DIGIT,  /* 123456789 */
    123128    C_LOW_A,  /* a */
     
    136141    C_E,      /* E */
    137142    C_ETC,    /* everything else */
    138     C_STAR,   /* * */   
     143    C_STAR,   /* * */
    139144    NR_CLASSES
    140145};
     
    145150    The remaining Unicode characters should be mapped to C_ETC.
    146151    Non-whitespace control characters are errors.
    147 */
    148     __,      __,      __,      __,      __,      __,      __,      __,
    149     __,      C_WHITE, C_WHITE, __,      __,      C_WHITE, __,      __,
    150     __,      __,      __,      __,      __,      __,      __,      __,
    151     __,      __,      __,      __,      __,      __,      __,      __,
    152 
    153     C_SPACE, C_ETC,   C_QUOTE, C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,
    154     C_ETC,   C_ETC,   C_STAR,   C_PLUS,  C_COMMA, C_MINUS, C_POINT, C_SLASH,
    155     C_ZERO,  C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT,
    156     C_DIGIT, C_DIGIT, C_COLON, C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,
    157 
    158     C_ETC,   C_ABCDF, C_ABCDF, C_ABCDF, C_ABCDF, C_E,     C_ABCDF, C_ETC,
    159     C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,
    160     C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_ETC,
    161     C_ETC,   C_ETC,   C_ETC,   C_LSQRB, C_BACKS, C_RSQRB, C_ETC,   C_ETC,
    162 
    163     C_ETC,   C_LOW_A, C_LOW_B, C_LOW_C, C_LOW_D, C_LOW_E, C_LOW_F, C_ETC,
    164     C_ETC,   C_ETC,   C_ETC,   C_ETC,   C_LOW_L, C_ETC,   C_LOW_N, C_ETC,
    165     C_ETC,   C_ETC,   C_LOW_R, C_LOW_S, C_LOW_T, C_LOW_U, C_ETC,   C_ETC,
    166     C_ETC,   C_ETC,   C_ETC,   C_LCURB, C_ETC,   C_RCURB, C_ETC,   C_ETC
     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
    167188};
    168189
     
    170191/*
    171192    The state codes.
    172 */
    173 enum states {
     193 */
     194enum states
     195{
    174196    GO,  /* start    */
    175197    OK,  /* ok       */
     
    236258    state is OK and if the mode is MODE_DONE.
    237259
    238                  white                                      1-9                                   ABCDF  etc
    239              space |  {  }  [  ]  :  ,  "  \  /  +  -  .  0  |  a  b  c  d  e  f  l  n  r  s  t  u  |  E  |  * */
    240 /*start  GO*/ {GO,GO,-6,__,-5,__,__,__,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    241 /*ok     OK*/ {OK,OK,__,-8,__,-7,__,-3,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    242 /*object OB*/ {OB,OB,__,-9,__,__,__,__,SB,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    243 /*key    KE*/ {KE,KE,__,__,__,__,__,__,SB,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    244 /*colon  CO*/ {CO,CO,__,__,__,__,-2,__,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    245 /*value  VA*/ {VA,VA,-6,__,-5,__,__,__,SB,__,CB,__,MX,__,ZX,IX,__,__,__,__,__,FA,__,NU,__,__,TR,__,__,__,__,__},
    246 /*array  AR*/ {AR,AR,-6,__,-5,-7,__,__,SB,__,CB,__,MX,__,ZX,IX,__,__,__,__,__,FA,__,NU,__,__,TR,__,__,__,__,__},
    247 /*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},
    248 /*escape ES*/ {__,__,__,__,__,__,__,__,ST,ST,ST,__,__,__,__,__,__,ST,__,__,__,ST,__,ST,ST,__,ST,U1,__,__,__,__},
    249 /*u1     U1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,U2,U2,U2,U2,U2,U2,U2,U2,__,__,__,__,__,__,U2,U2,__,__},
    250 /*u2     U2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,U3,U3,U3,U3,U3,U3,U3,U3,__,__,__,__,__,__,U3,U3,__,__},
    251 /*u3     U3*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,U4,U4,U4,U4,U4,U4,U4,U4,__,__,__,__,__,__,U4,U4,__,__},
    252 /*u4     U4*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,UC,UC,UC,UC,UC,UC,UC,UC,__,__,__,__,__,__,UC,UC,__,__},
    253 /*minus  MI*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,ZE,IN,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    254 /*zero   ZE*/ {OK,OK,__,-8,__,-7,__,-3,__,__,CB,__,__,DF,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    255 /*int    IN*/ {OK,OK,__,-8,__,-7,__,-3,__,__,CB,__,__,DF,IN,IN,__,__,__,__,DE,__,__,__,__,__,__,__,__,DE,__,__},
    256 /*frac   FR*/ {OK,OK,__,-8,__,-7,__,-3,__,__,CB,__,__,__,FR,FR,__,__,__,__,E1,__,__,__,__,__,__,__,__,E1,__,__},
    257 /*e      E1*/ {__,__,__,__,__,__,__,__,__,__,__,E2,E2,__,E3,E3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    258 /*ex     E2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,E3,E3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    259 /*exp    E3*/ {OK,OK,__,-8,__,-7,__,-3,__,__,__,__,__,__,E3,E3,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    260 /*tr     T1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,T2,__,__,__,__,__,__,__},
    261 /*tru    T2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,T3,__,__,__,__},
    262 /*true   T3*/ {__,__,__,__,__,__,__,__,__,__,CB,__,__,__,__,__,__,__,__,__,OK,__,__,__,__,__,__,__,__,__,__,__},
    263 /*fa     F1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,F2,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    264 /*fal    F2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,F3,__,__,__,__,__,__,__,__,__},
    265 /*fals   F3*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,F4,__,__,__,__,__,__},
    266 /*false  F4*/ {__,__,__,__,__,__,__,__,__,__,CB,__,__,__,__,__,__,__,__,__,OK,__,__,__,__,__,__,__,__,__,__,__},
    267 /*nu     N1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,N2,__,__,__,__},
    268 /*nul    N2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,N3,__,__,__,__,__,__,__,__,__},
    269 /*null   N3*/ {__,__,__,__,__,__,__,__,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,OK,__,__,__,__,__,__,__,__,__},
    270 /*/      C1*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,C2},
    271 /*/*     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},
    272 /**      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},
    273 /*_.     FX*/ {OK,OK,__,-8,__,-7,__,-3,__,__,__,__,__,__,FR,FR,__,__,__,__,E1,__,__,__,__,__,__,__,__,E1,__,__},
    274 /*\      D1*/ {__,__,__,__,__,__,__,__,__,D2,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__},
    275 /*\      D2*/ {__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,U1,__,__,__,__},
     260                 white                                      1-9
     261                                     ABCDF  etc
     262             space |  {  }  [  ]  :  ,  "  \  /  +  -  .  0  |  a  b  c  d  e  f
     263    l  n  r  s  t  u  |  E  |  * */
     264/*start  GO*/ {GO, GO, -6, __, -5, __, __, __, __, __, CB, __, __, __, __,
     265               __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     266               __, __},
     267/*ok     OK*/ {OK, OK, __, -8, __, -7, __, -3, __, __, CB, __, __, __, __,
     268               __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     269               __, __},
     270/*object OB*/ {OB, OB, __, -9, __, __, __, __, SB, __, CB, __, __, __, __,
     271               __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     272               __, __},
     273/*key    KE*/ {KE, KE, __, __, __, __, __, __, SB, __, CB, __, __, __, __,
     274               __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     275               __, __},
     276/*colon  CO*/ {CO, CO, __, __, __, __, -2, __, __, __, CB, __, __, __, __,
     277               __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     278               __, __},
     279/*value  VA*/ {VA, VA, -6, __, -5, __, __, __, SB, __, CB, __, MX, __, ZX,
     280               IX, __, __, __, __, __, FA, __, NU, __, __, TR, __, __, __,
     281               __, __},
     282/*array  AR*/ {AR, AR, -6, __, -5, -7, __, __, SB, __, CB, __, MX, __, ZX,
     283               IX, __, __, __, __, __, FA, __, NU, __, __, TR, __, __, __,
     284               __, __},
     285/*string ST*/ {ST, __, ST, ST, ST, ST, ST, ST, -4, EX, ST, ST, ST, ST, ST,
     286               ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST,
     287               ST, ST},
     288/*escape ES*/ {__, __, __, __, __, __, __, __, ST, ST, ST, __, __, __, __,
     289               __, __, ST, __, __, __, ST, __, ST, ST, __, ST, U1, __, __,
     290               __, __},
     291/*u1     U1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U2,
     292               U2, U2, U2, U2, U2, U2, U2, __, __, __, __, __, __, U2, U2,
     293               __, __},
     294/*u2     U2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U3,
     295               U3, U3, U3, U3, U3, U3, U3, __, __, __, __, __, __, U3, U3,
     296               __, __},
     297/*u3     U3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U4,
     298               U4, U4, U4, U4, U4, U4, U4, __, __, __, __, __, __, U4, U4,
     299               __, __},
     300/*u4     U4*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, UC,
     301               UC, UC, UC, UC, UC, UC, UC, __, __, __, __, __, __, UC, UC,
     302               __, __},
     303/*minus  MI*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, ZE,
     304               IN, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     305               __, __},
     306/*zero   ZE*/ {OK, OK, __, -8, __, -7, __, -3, __, __, CB, __, __, DF, __,
     307               __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     308               __, __},
     309/*int    IN*/ {OK, OK, __, -8, __, -7, __, -3, __, __, CB, __, __, DF, IN,
     310               IN, __, __, __, __, DE, __, __, __, __, __, __, __, __, DE,
     311               __, __},
     312/*frac   FR*/ {OK, OK, __, -8, __, -7, __, -3, __, __, CB, __, __, __, FR,
     313               FR, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1,
     314               __, __},
     315/*e      E1*/ {__, __, __, __, __, __, __, __, __, __, __, E2, E2, __, E3,
     316               E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     317               __, __},
     318/*ex     E2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, E3,
     319               E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     320               __, __},
     321/*exp    E3*/ {OK, OK, __, -8, __, -7, __, -3, __, __, __, __, __, __, E3,
     322               E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     323               __, __},
     324/*tr     T1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     325               __, __, __, __, __, __, __, __, __, T2, __, __, __, __, __,
     326               __, __},
     327/*tru    T2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     328               __, __, __, __, __, __, __, __, __, __, __, __, T3, __, __,
     329               __, __},
     330/*true   T3*/ {__, __, __, __, __, __, __, __, __, __, CB, __, __, __, __,
     331               __, __, __, __, __, OK, __, __, __, __, __, __, __, __, __,
     332               __, __},
     333/*fa     F1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     334               __, F2, __, __, __, __, __, __, __, __, __, __, __, __, __,
     335               __, __},
     336/*fal    F2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     337               __, __, __, __, __, __, __, F3, __, __, __, __, __, __, __,
     338               __, __},
     339/*fals   F3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     340               __, __, __, __, __, __, __, __, __, __, F4, __, __, __, __,
     341               __, __},
     342/*false  F4*/ {__, __, __, __, __, __, __, __, __, __, CB, __, __, __, __,
     343               __, __, __, __, __, OK, __, __, __, __, __, __, __, __, __,
     344               __, __},
     345/*nu     N1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     346               __, __, __, __, __, __, __, __, __, __, __, __, N2, __, __,
     347               __, __},
     348/*nul    N2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     349               __, __, __, __, __, __, __, N3, __, __, __, __, __, __, __,
     350               __, __},
     351/*null   N3*/ {__, __, __, __, __, __, __, __, __, __, CB, __, __, __, __,
     352               __, __, __, __, __, __, __, OK, __, __, __, __, __, __, __,
     353               __, __},
     354/*/      C1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     355               __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     356               __, C2},
     357/*/*     C2*/ {C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2,
     358               C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2,
     359               C2, C3},
     360/**      C3*/ {C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, CE, C2, C2, C2, C2,
     361               C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2,
     362               C2, C3},
     363/*_.     FX*/ {OK, OK, __, -8, __, -7, __, -3, __, __, __, __, __, __, FR,
     364               FR, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1,
     365               __, __},
     366/*\      D1*/ {__, __, __, __, __, __, __, __, __, D2, __, __, __, __, __,
     367               __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     368               __, __},
     369/*\      D2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
     370               __, __, __, __, __, __, __, __, __, __, __, __, U1, __, __,
     371               __, __},
    276372};
    277373
     
    279375/*
    280376    These modes can be pushed on the stack.
    281 */
    282 enum modes {
    283     MODE_ARRAY = 1,
    284     MODE_DONE = 2, 
    285     MODE_KEY = 3,   
     377 */
     378enum modes
     379{
     380    MODE_ARRAY = 1,
     381    MODE_DONE = 2,
     382    MODE_KEY = 3,
    286383    MODE_OBJECT = 4
    287384};
    288385
    289386static int
    290 push(JSON_parser jc, int mode)
     387push( JSON_parser jc,
     388      int         mode )
    291389{
    292390/*
    293391    Push a mode onto the stack. Return false if there is overflow.
    294 */
     392 */
    295393    jc->top += 1;
    296     if (jc->depth < 0) {
    297         if (jc->top >= jc->stack_capacity) {
     394    if( jc->depth < 0 )
     395    {
     396        if( jc->top >= jc->stack_capacity )
     397        {
    298398            size_t bytes_to_allocate;
    299399            jc->stack_capacity *= 2;
    300             bytes_to_allocate = jc->stack_capacity * sizeof(jc->static_stack[0]);
    301             if (jc->stack == &jc->static_stack[0]) {
    302                 jc->stack = (signed char*)malloc(bytes_to_allocate);
    303                 memcpy(jc->stack, jc->static_stack, sizeof(jc->static_stack));
    304             } else {
    305                 jc->stack = (signed char*)realloc(jc->stack, bytes_to_allocate);
     400            bytes_to_allocate = jc->stack_capacity *
     401                                sizeof( jc->static_stack[0] );
     402            if( jc->stack == &jc->static_stack[0] )
     403            {
     404                jc->stack = (signed char*)malloc( bytes_to_allocate );
     405                memcpy( jc->stack, jc->static_stack,
     406                       sizeof( jc->static_stack ) );
    306407            }
    307         }
    308     } else {
    309         if (jc->top >= jc->depth) {
     408            else
     409            {
     410                jc->stack = (signed char*)realloc( jc->stack,
     411                                                   bytes_to_allocate );
     412            }
     413        }
     414    }
     415    else
     416    {
     417        if( jc->top >= jc->depth )
     418        {
    310419            return false;
    311420        }
    312421    }
    313    
     422
    314423    jc->stack[jc->top] = mode;
    315424    return true;
    316425}
    317426
    318 
    319427static int
    320 pop(JSON_parser jc, int mode)
     428pop( JSON_parser jc,
     429     int         mode )
    321430{
    322431/*
    323432    Pop the stack, assuring that the current mode matches the expectation.
    324433    Return false if there is underflow or if the modes mismatch.
    325 */
    326     if (jc->top < 0 || jc->stack[jc->top] != mode) {
     434 */
     435    if( jc->top < 0 || jc->stack[jc->top] != mode )
     436    {
    327437        return false;
    328438    }
     
    331441}
    332442
    333 
    334 #define parse_buffer_clear(jc) \
    335     do {\
    336         jc->parse_buffer_count = 0;\
    337         jc->parse_buffer[0] = 0;\
    338     } while (0)
    339    
    340 #define parse_buffer_pop_back_char(jc)\
    341     do {\
    342         assert(jc->parse_buffer_count >= 1);\
    343         --jc->parse_buffer_count;\
    344         jc->parse_buffer[jc->parse_buffer_count] = 0;\
    345     } while (0)   
    346    
    347 void delete_JSON_parser(JSON_parser jc)
    348 {
    349     if (jc) {
    350         if (jc->stack != &jc->static_stack[0]) {
    351             free((void*)jc->stack);
    352         }
    353         if (jc->parse_buffer != &jc->static_parse_buffer[0]) {
    354             free((void*)jc->parse_buffer);
    355         }
    356         free((void*)jc);
    357      }   
     443#define parse_buffer_clear( jc ) \
     444    do { \
     445        jc->parse_buffer_count = 0; \
     446        jc->parse_buffer[0] = 0; \
     447    } while( 0 )
     448
     449#define parse_buffer_pop_back_char( jc ) \
     450    do { \
     451        assert( jc->parse_buffer_count >= 1 ); \
     452        --jc->parse_buffer_count; \
     453        jc->parse_buffer[jc->parse_buffer_count] = 0; \
     454    } while( 0 )
     455
     456void
     457delete_JSON_parser( JSON_parser jc )
     458{
     459    if( jc )
     460    {
     461        if( jc->stack != &jc->static_stack[0] )
     462        {
     463            free( (void*)jc->stack );
     464        }
     465        if( jc->parse_buffer != &jc->static_parse_buffer[0] )
     466        {
     467            free( (void*)jc->parse_buffer );
     468        }
     469        free( (void*)jc );
     470    }
    358471}
    359472
    360 
    361473JSON_parser
    362 new_JSON_parser(JSON_config* config)
     474new_JSON_parser( JSON_config* config )
    363475{
    364476/*
     
    370482    JSON text, and then call JSON_parser_done to obtain the final result.
    371483    These functions are fully reentrant.
    372 */
    373 
    374     int depth = 0;
     484 */
     485
     486    int         depth = 0;
    375487    JSON_config default_config;
    376    
    377     JSON_parser jc = malloc(sizeof(struct JSON_parser_struct));
    378    
    379     memset(jc, 0, sizeof(*jc));
    380    
    381    
     488
     489    JSON_parser jc = malloc( sizeof( struct JSON_parser_struct ) );
     490
     491    memset( jc, 0, sizeof( *jc ) );
     492
     493
    382494    /* initialize configuration */
    383     init_JSON_config(&default_config);
    384    
     495    init_JSON_config( &default_config );
     496
    385497    /* set to default configuration if none was provided */
    386     if (config == NULL) {
     498    if( config == NULL )
     499    {
    387500        config = &default_config;
    388501    }
    389502
    390503    depth = config->depth;
    391    
     504
    392505    /* We need to be able to push at least one object */
    393     if (depth == 0) {
     506    if( depth == 0 )
     507    {
    394508        depth = 1;
    395509    }
    396    
     510
    397511    jc->state = GO;
    398512    jc->top = -1;
    399    
     513
    400514    /* Do we want non-bound stack? */
    401     if (depth > 0) {
     515    if( depth > 0 )
     516    {
    402517        jc->stack_capacity = depth;
    403518        jc->depth = depth;
    404         if (depth <= (int)COUNTOF(jc->static_stack)) {
     519        if( depth <= (int)COUNTOF( jc->static_stack ) )
     520        {
    405521            jc->stack = &jc->static_stack[0];
    406         } else {
    407             jc->stack = (signed char*)malloc(jc->stack_capacity * sizeof(jc->static_stack[0]));
    408         }
    409     } else {
    410         jc->stack_capacity = COUNTOF(jc->static_stack);
     522        }
     523        else
     524        {
     525            jc->stack =
     526                (signed char*)malloc( jc->stack_capacity *
     527                                     sizeof( jc->static_stack[0] ) );
     528        }
     529    }
     530    else
     531    {
     532        jc->stack_capacity = COUNTOF( jc->static_stack );
    411533        jc->depth = -1;
    412534        jc->stack = &jc->static_stack[0];
    413535    }
    414    
     536
    415537    /* set parser to start */
    416     push(jc, MODE_DONE);
    417    
     538    push( jc, MODE_DONE );
     539
    418540    /* set up the parse buffer */
    419541    jc->parse_buffer = &jc->static_parse_buffer[0];
    420     jc->parse_buffer_capacity = COUNTOF(jc->static_parse_buffer);
    421     parse_buffer_clear(jc);
    422    
     542    jc->parse_buffer_capacity = COUNTOF( jc->static_parse_buffer );
     543    parse_buffer_clear( jc );
     544
    423545    /* set up callback, comment & float handling */
    424546    jc->callback = config->callback;
     
    429551}
    430552
    431 static void grow_parse_buffer(JSON_parser jc)
     553static void
     554grow_parse_buffer( JSON_parser jc )
    432555{
    433556    size_t bytes_to_allocate;
     557
    434558    jc->parse_buffer_capacity *= 2;
    435     bytes_to_allocate = jc->parse_buffer_capacity * sizeof(jc->parse_buffer[0]);
    436     if (jc->parse_buffer == &jc->static_parse_buffer[0]) {
    437         jc->parse_buffer = (char*)malloc(bytes_to_allocate);
    438         memcpy(jc->parse_buffer, jc->static_parse_buffer, jc->parse_buffer_count);
    439     } else {
    440         jc->parse_buffer = (char*)realloc(jc->parse_buffer, bytes_to_allocate);
     559    bytes_to_allocate = jc->parse_buffer_capacity *
     560                        sizeof( jc->parse_buffer[0] );
     561    if( jc->parse_buffer == &jc->static_parse_buffer[0] )
     562    {
     563        jc->parse_buffer = (char*)malloc( bytes_to_allocate );
     564        memcpy( jc->parse_buffer, jc->static_parse_buffer,
     565                jc->parse_buffer_count );
     566    }
     567    else
     568    {
     569        jc->parse_buffer = (char*)realloc( jc->parse_buffer,
     570                                           bytes_to_allocate );
    441571    }
    442572}
    443573
    444 #define parse_buffer_push_back_char(jc, c)\
    445     do {\
    446         if (jc->parse_buffer_count + 1 >= jc->parse_buffer_capacity) grow_parse_buffer(jc);\
    447         jc->parse_buffer[jc->parse_buffer_count++] = c;\
    448         jc->parse_buffer[jc->parse_buffer_count]   = 0;\
    449     } while (0)
    450 
    451 
    452 static int parse_parse_buffer(JSON_parser jc)
    453 {
    454     if (jc->callback) {
     574#define parse_buffer_push_back_char( jc, c ) \
     575    do { \
     576        if( jc->parse_buffer_count + 1 >=\
     577            jc->parse_buffer_capacity ) grow_parse_buffer( jc );\
     578        jc->parse_buffer[jc->parse_buffer_count++] = c; \
     579        jc->parse_buffer[jc->parse_buffer_count]   = 0; \
     580    } while( 0 )
     581
     582
     583static int
     584parse_parse_buffer( JSON_parser jc )
     585{
     586    if( jc->callback )
     587    {
    455588        JSON_value value, *arg = NULL;
    456        
    457         if (jc->type != JSON_T_NONE) {
     589
     590        if( jc->type != JSON_T_NONE )
     591        {
    458592            assert(
    459                 jc->type == JSON_T_NULL ||
    460                 jc->type == JSON_T_FALSE ||
    461                 jc->type == JSON_T_TRUE ||
    462                 jc->type == JSON_T_FLOAT ||
    463                 jc->type == JSON_T_INTEGER ||
    464                 jc->type == JSON_T_STRING);
    465        
    466             switch(jc->type) {
     593                jc->type == JSON_T_NULL
     594                  || jc->type == JSON_T_FALSE
     595                  || jc->type == JSON_T_TRUE
     596                  || jc->type == JSON_T_FLOAT
     597                  || jc->type == JSON_T_INTEGER
     598                  || jc->type == JSON_T_STRING );
     599
     600            switch( jc->type )
     601            {
    467602                case JSON_T_FLOAT:
    468603                    arg = &value;
    469                     if (jc->handle_floats_manually) {
     604                    if( jc->handle_floats_manually )
     605                    {
    470606                        value.vu.str.value = jc->parse_buffer;
    471607                        value.vu.str.length = jc->parse_buffer_count;
    472                     } else {
    473                         sscanf(jc->parse_buffer, "%Lf", &value.vu.float_value);
     608                    }
     609                    else
     610                    {
     611                        sscanf( jc->parse_buffer, "%Lf",
     612                                &value.vu.float_value );
    474613                    }
    475614                    break;
     615
    476616                case JSON_T_INTEGER:
    477617                    arg = &value;
    478                     sscanf(jc->parse_buffer, JSON_PARSER_INTEGER_SSCANF_TOKEN, &value.vu.integer_value);
     618                    sscanf( jc->parse_buffer,
     619                            JSON_PARSER_INTEGER_SSCANF_TOKEN,
     620                            &value.vu.integer_value );
    479621                    break;
     622
    480623                case JSON_T_STRING:
    481624                    arg = &value;
     
    484627                    break;
    485628            }
    486            
    487             if (!(*jc->callback)(jc->ctx, jc->type, arg)) {
     629
     630            if( !( *jc->callback )( jc->ctx, jc->type, arg ) )
     631            {
    488632                return false;
    489633            }
    490634        }
    491635    }
    492    
    493     parse_buffer_clear(jc);
    494    
     636
     637    parse_buffer_clear( jc );
     638
    495639    return true;
    496640}
    497641
    498 static int decode_unicode_char(JSON_parser jc)
     642static int
     643decode_unicode_char( JSON_parser jc )
    499644{
    500645    const unsigned chars = jc->utf16_decode_buffer[0] ? 2 : 1;
    501     int i;
    502     UTF16 *uc = chars == 1 ? &jc->utf16_decode_buffer[0] : &jc->utf16_decode_buffer[1];
    503     UTF16 x;
    504     char* p;
    505    
    506     assert(jc->parse_buffer_count >= 6);
    507    
     646    int            i;
     647    UTF16 *        uc = chars ==
     648                        1 ? &jc->utf16_decode_buffer[0] : &jc->
     649                        utf16_decode_buffer[1];
     650    UTF16          x;
     651    char*          p;
     652
     653    assert( jc->parse_buffer_count >= 6 );
     654
    508655    p = &jc->parse_buffer[jc->parse_buffer_count - 4];
    509    
    510     for (i = 0; i < 4; ++i, ++p) {
     656
     657    for( i = 0; i < 4; ++i, ++p )
     658    {
    511659        x = *p;
    512        
    513         if (x >= 'a') {
    514             x -= ('a' - 10);
    515         } else if (x >= 'A') {
    516             x -= ('A' - 10);
    517         } else {
    518             x &= ~((UTF16) 0x30);
    519         }
    520        
    521         assert(x < 16);
    522        
    523         *uc |= x << ((3u - i) << 2);
    524     }
    525    
     660
     661        if( x >= 'a' )
     662        {
     663            x -= ( 'a' - 10 );
     664        }
     665        else if( x >= 'A' )
     666        {
     667            x -= ( 'A' - 10 );
     668        }
     669        else
     670        {
     671            x &= ~( (UTF16) 0x30 );
     672        }
     673
     674        assert( x < 16 );
     675
     676        *uc |= x << ( ( 3u - i ) << 2 );
     677    }
     678
    526679    /* clear UTF-16 char form buffer */
    527680    jc->parse_buffer_count -= 6;
    528681    jc->parse_buffer[jc->parse_buffer_count] = 0;
    529    
     682
    530683    /* attempt decoding ... */
    531684    {
    532         UTF8* dec_start = (UTF8*)&jc->parse_buffer[jc->parse_buffer_count];
    533         UTF8* dec_start_dup = dec_start;
    534         UTF8* dec_end = dec_start + 6;
    535        
    536         const UTF16* enc_start = &jc->utf16_decode_buffer[0];
    537         const UTF16* enc_end = enc_start + chars;
    538    
     685        UTF8*                  dec_start =
     686            (UTF8*)&jc->parse_buffer[jc->parse_buffer_count];
     687        UTF8*                  dec_start_dup = dec_start;
     688        UTF8*                  dec_end = dec_start + 6;
     689
     690        const UTF16*           enc_start = &jc->utf16_decode_buffer[0];
     691        const UTF16*           enc_end = enc_start + chars;
     692
    539693        const ConversionResult result = ConvertUTF16toUTF8(
    540             &enc_start, enc_end, &dec_start, dec_end, strictConversion);
    541        
    542         const size_t new_chars = dec_start - dec_start_dup;
    543        
     694            &enc_start, enc_end, &dec_start, dec_end, strictConversion );
     695
     696        const size_t           new_chars = dec_start - dec_start_dup;
     697
    544698        /* was it a surrogate UTF-16 char? */
    545         if (chars == 1 && result == sourceExhausted) {
     699        if( chars == 1 && result == sourceExhausted )
     700        {
    546701            return true;
    547702        }
    548        
    549         if (result != conversionOK) {
     703
     704        if( result != conversionOK )
     705        {
    550706            return false;
    551707        }
    552        
     708
    553709        /* NOTE: clear decode buffer to resume string reading,
    554710           otherwise we continue to read UTF-16 */
    555711        jc->utf16_decode_buffer[0] = 0;
    556        
    557         assert(new_chars <= 6);
    558        
     712
     713        assert( new_chars <= 6 );
     714
    559715        jc->parse_buffer_count += new_chars;
    560716        jc->parse_buffer[jc->parse_buffer_count] = 0;
    561717    }
    562    
     718
    563719    return true;
    564720}
    565721
    566 
    567722int
    568 JSON_parser_char(JSON_parser jc, int next_char)
     723JSON_parser_char( JSON_parser jc,
     724                  int         next_char )
    569725{
    570726/*
     
    573729    UTF-32. It returns true if things are looking ok so far. If it rejects the
    574730    text, it returns false.
    575 */
     731 */
    576732    int next_class, next_state;
    577    
     733
    578734/*
    579735    Determine the character's class.
    580 */
    581     if (next_char < 0) {
     736 */
     737    if( next_char < 0 )
     738    {
    582739        return false;
    583740    }
    584     if (next_char >= 128) {
     741    if( next_char >= 128 )
     742    {
    585743        next_class = C_ETC;
    586     } else {
     744    }
     745    else
     746    {
    587747        next_class = ascii_class[next_char];
    588         if (next_class <= __) {
     748        if( next_class <= __ )
     749        {
    589750            return false;
    590751        }
    591752    }
    592    
    593     if (jc->escaped) {
     753
     754    if( jc->escaped )
     755    {
    594756        jc->escaped = 0;
    595757        /* remove the backslash */
    596         parse_buffer_pop_back_char(jc);
    597         switch(next_char) {
    598         case 'b':
    599             parse_buffer_push_back_char(jc, '\b');
    600             break;
    601         case 'f':
    602             parse_buffer_push_back_char(jc, '\f');
    603             break;
    604         case 'n':
    605             parse_buffer_push_back_char(jc, '\n');
    606             break;
    607         case 'r':
    608             parse_buffer_push_back_char(jc, '\r');
    609             break;
    610         case 't':
    611             parse_buffer_push_back_char(jc, '\t');
    612             break;
    613         case '"':
    614             parse_buffer_push_back_char(jc, '"');
    615             break;
    616         case '\\':
    617             parse_buffer_push_back_char(jc, '\\');
    618             break;
    619         case '/':
    620             parse_buffer_push_back_char(jc, '/');
    621             break;
    622         case 'u':
    623             parse_buffer_push_back_char(jc, '\\');
    624             parse_buffer_push_back_char(jc, 'u');
    625             break;
    626         default:
    627             return false;
    628         }
    629     } else if (!jc->comment) {
    630         if (jc->type != JSON_T_NONE || !(next_class == C_SPACE || next_class == C_WHITE) /* non-white-space */) {
    631             parse_buffer_push_back_char(jc, (char)next_char);
    632         }
    633     }
    634    
    635    
    636    
     758        parse_buffer_pop_back_char( jc );
     759        switch( next_char )
     760        {
     761            case 'b':
     762                parse_buffer_push_back_char( jc, '\b' );
     763                break;
     764
     765            case 'f':
     766                parse_buffer_push_back_char( jc, '\f' );
     767                break;
     768
     769            case 'n':
     770                parse_buffer_push_back_char( jc, '\n' );
     771                break;
     772
     773            case 'r':
     774                parse_buffer_push_back_char( jc, '\r' );
     775                break;
     776
     777            case 't':
     778                parse_buffer_push_back_char( jc, '\t' );
     779                break;
     780
     781            case '"':
     782                parse_buffer_push_back_char( jc, '"' );
     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 'u':
     794                parse_buffer_push_back_char( jc, '\\' );
     795                parse_buffer_push_back_char( jc, 'u' );
     796                break;
     797
     798            default:
     799                return false;
     800        }
     801    }
     802    else if( !jc->comment )
     803    {
     804        if( jc->type != JSON_T_NONE
     805          || !( next_class == C_SPACE || next_class == C_WHITE ) /*
     806                                                                   non-white-space
     807                                                                   */                  )
     808        {
     809            parse_buffer_push_back_char( jc, (char)next_char );
     810        }
     811    }
     812
     813
    637814/*
    638815    Get the next state from the state transition table.
    639 */
     816 */
    640817    next_state = state_transition_table[jc->state][next_class];
    641     if (next_state >= 0) {
     818    if( next_state >= 0 )
     819    {
    642820/*
    643821    Change the state.
    644 */
     822 */
    645823        jc->state = next_state;
    646     } else {
     824    }
     825    else
     826    {
    647827/*
    648828    Or perform one of the actions.
    649 */
    650         switch (next_state) {
    651 /* Unicode character */       
    652         case UC:
    653             if(!decode_unicode_char(jc)) {
    654                 return false;
    655             }
    656             /* check if we need to read a second UTF-16 char */
    657             if (jc->utf16_decode_buffer[0]) {
    658                 jc->state = D1;
    659             } else {
     829 */
     830        switch( next_state )
     831        {
     832/* Unicode character */
     833            case UC:
     834                if( !decode_unicode_char( jc ) )
     835                {
     836                    return false;
     837                }
     838                /* check if we need to read a second UTF-16 char */
     839                if( jc->utf16_decode_buffer[0] )
     840                {
     841                    jc->state = D1;
     842                }
     843                else
     844                {
     845                    jc->state = ST;
     846                }
     847                break;
     848
     849/* escaped char */
     850            case EX:
     851                jc->escaped = 1;
     852                jc->state = ES;
     853                break;
     854
     855/* integer detected by minus */
     856            case MX:
     857                jc->type = JSON_T_INTEGER;
     858                jc->state = MI;
     859                break;
     860
     861/* integer detected by zero */
     862            case ZX:
     863                jc->type = JSON_T_INTEGER;
     864                jc->state = ZE;
     865                break;
     866
     867/* integer detected by 1-9 */
     868            case IX:
     869                jc->type = JSON_T_INTEGER;
     870                jc->state = IN;
     871                break;
     872
     873/* floating point number detected by exponent*/
     874            case DE:
     875                assert( jc->type != JSON_T_FALSE );
     876                assert( jc->type != JSON_T_TRUE );
     877                assert( jc->type != JSON_T_NULL );
     878                assert( jc->type != JSON_T_STRING );
     879                jc->type = JSON_T_FLOAT;
     880                jc->state = E1;
     881                break;
     882
     883/* floating point number detected by fraction */
     884            case DF:
     885                assert( jc->type != JSON_T_FALSE );
     886                assert( jc->type != JSON_T_TRUE );
     887                assert( jc->type != JSON_T_NULL );
     888                assert( jc->type != JSON_T_STRING );
     889                jc->type = JSON_T_FLOAT;
     890                jc->state = FX;
     891                break;
     892
     893/* string begin " */
     894            case SB:
     895                parse_buffer_clear( jc );
     896                assert( jc->type == JSON_T_NONE );
     897                jc->type = JSON_T_STRING;
    660898                jc->state = ST;
    661             }
    662             break;
    663 /* escaped char */
    664         case EX:
    665             jc->escaped = 1;
    666             jc->state = ES;
    667             break;
    668 /* integer detected by minus */
    669         case MX:
    670             jc->type = JSON_T_INTEGER;
    671             jc->state = MI;
    672             break; 
    673 /* integer detected by zero */           
    674         case ZX:
    675             jc->type = JSON_T_INTEGER;
    676             jc->state = ZE;
    677             break; 
    678 /* integer detected by 1-9 */           
    679         case IX:
    680             jc->type = JSON_T_INTEGER;
    681             jc->state = IN;
    682             break; 
    683            
    684 /* floating point number detected by exponent*/
    685         case DE:
    686             assert(jc->type != JSON_T_FALSE);
    687             assert(jc->type != JSON_T_TRUE);
    688             assert(jc->type != JSON_T_NULL);
    689             assert(jc->type != JSON_T_STRING);
    690             jc->type = JSON_T_FLOAT;
    691             jc->state = E1;
    692             break;   
    693        
    694 /* floating point number detected by fraction */
    695         case DF:
    696             assert(jc->type != JSON_T_FALSE);
    697             assert(jc->type != JSON_T_TRUE);
    698             assert(jc->type != JSON_T_NULL);
    699             assert(jc->type != JSON_T_STRING);
    700             jc->type = JSON_T_FLOAT;
    701             jc->state = FX;
    702             break;   
    703 /* string begin " */
    704         case SB:
    705             parse_buffer_clear(jc);
    706             assert(jc->type == JSON_T_NONE);
    707             jc->type = JSON_T_STRING;
    708             jc->state = ST;
    709             break;       
    710        
     899                break;
     900
    711901/* n */
    712         case NU:
    713             assert(jc->type == JSON_T_NONE);
    714             jc->type = JSON_T_NULL;
    715             jc->state = N1;
    716             break;       
     902            case NU:
     903                assert( jc->type == JSON_T_NONE );
     904                jc->type = JSON_T_NULL;
     905                jc->state = N1;
     906                break;
     907
    717908/* f */
    718         case FA:
    719             assert(jc->type == JSON_T_NONE);
    720             jc->type = JSON_T_FALSE;
    721             jc->state = F1;
    722             break;       
     909            case FA:
     910                assert( jc->type == JSON_T_NONE );
     911                jc->type = JSON_T_FALSE;
     912                jc->state = F1;
     913                break;
     914
    723915/* t */
    724         case TR:
    725             assert(jc->type == JSON_T_NONE);
    726             jc->type = JSON_T_TRUE;
    727             jc->state = T1;
    728             break;       
    729        
     916            case TR:
     917                assert( jc->type == JSON_T_NONE );
     918                jc->type = JSON_T_TRUE;
     919                jc->state = T1;
     920                break;
     921
    730922/* closing comment */
    731         case CE:
    732             jc->comment = 0;
    733             assert(jc->parse_buffer_count == 0);
    734             assert(jc->type == JSON_T_NONE);
    735             jc->state = jc->before_comment_state;
    736             break;       
    737        
     923            case CE:
     924                jc->comment = 0;
     925                assert( jc->parse_buffer_count == 0 );
     926                assert( jc->type == JSON_T_NONE );
     927                jc->state = jc->before_comment_state;
     928                break;
     929
    738930/* opening comment  */
    739         case CB:
    740             if (!jc->allow_comments) {
    741                 return false;
    742             }
    743             parse_buffer_pop_back_char(jc);
    744             if (!parse_parse_buffer(jc)) {
    745                 return false;
    746             }
    747             assert(jc->parse_buffer_count == 0);
    748             assert(jc->type != JSON_T_STRING);
    749             switch (jc->stack[jc->top]) {
    750             case MODE_ARRAY:
    751             case MODE_OBJECT:   
    752                 switch(jc->state) {
    753                 case VA:
    754                 case AR:
    755                     jc->before_comment_state = jc->state;
    756                     break;
    757                 default:
    758                     jc->before_comment_state = OK;
    759                     break;
    760                 }
    761                 break;
    762             default:
    763                 jc->before_comment_state = jc->state;
    764                 break;
    765             }
    766             jc->type = JSON_T_NONE;
    767             jc->state = C1;
    768             jc->comment = 1;
    769             break;
     931            case CB:
     932                if( !jc->allow_comments )
     933                {
     934                    return false;
     935                }
     936                parse_buffer_pop_back_char( jc );
     937                if( !parse_parse_buffer( jc ) )
     938                {
     939                    return false;
     940                }
     941                assert( jc->parse_buffer_count == 0 );
     942                assert( jc->type != JSON_T_STRING );
     943                switch( jc->stack[jc->top] )
     944                {
     945                    case MODE_ARRAY:
     946                    case MODE_OBJECT:
     947                        switch( jc->state )
     948                        {
     949                            case VA:
     950                            case AR:
     951                                jc->before_comment_state = jc->state;
     952                                break;
     953
     954                            default:
     955                                jc->before_comment_state = OK;
     956                                break;
     957                        }
     958                        break;
     959
     960                    default:
     961                        jc->before_comment_state = jc->state;
     962                        break;
     963                }
     964                jc->type = JSON_T_NONE;
     965                jc->state = C1;
     966                jc->comment = 1;
     967                break;
     968
    770969/* empty } */
    771         case -9:       
    772             parse_buffer_clear(jc);
    773             if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_OBJECT_END, NULL)) {
    774                 return false;
    775             }
    776             if (!pop(jc, MODE_KEY)) {
    777                 return false;
    778             }
    779             jc->state = OK;
    780             break;
    781 
    782 /* } */ case -8:
    783             parse_buffer_pop_back_char(jc);
    784             if (!parse_parse_buffer(jc)) {
    785                 return false;
    786             }
    787             if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_OBJECT_END, NULL)) {
    788                 return false;
    789             }
    790             if (!pop(jc, MODE_OBJECT)) {
    791                 return false;
    792             }
    793             jc->type = JSON_T_NONE;
    794             jc->state = OK;
    795             break;
    796 
    797 /* ] */ case -7:
    798             parse_buffer_pop_back_char(jc);
    799             if (!parse_parse_buffer(jc)) {
    800                 return false;
    801             }
    802             if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_ARRAY_END, NULL)) {
    803                 return false;
    804             }
    805             if (!pop(jc, MODE_ARRAY)) {
    806                 return false;
    807             }
    808            
    809             jc->type = JSON_T_NONE;
    810             jc->state = OK;
    811             break;
    812 
    813 /* { */ case -6:
    814             parse_buffer_pop_back_char(jc);
    815             if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_OBJECT_BEGIN, NULL)) {
    816                 return false;
    817             }
    818             if (!push(jc, MODE_KEY)) {
    819                 return false;
    820             }
    821             assert(jc->type == JSON_T_NONE);
    822             jc->state = OB;
    823             break;
    824 
    825 /* [ */ case -5:
    826             parse_buffer_pop_back_char(jc);
    827             if (jc->callback && !(*jc->callback)(jc->ctx, JSON_T_ARRAY_BEGIN, NULL)) {
    828                 return false;
    829             }
    830             if (!push(jc, MODE_ARRAY)) {
    831                 return false;
    832             }
    833             assert(jc->type == JSON_T_NONE);
    834             jc->state = AR;
    835             break;
    836 
    837 /* string end " */ case -4:
    838             parse_buffer_pop_back_char(jc);
    839             switch (jc->stack[jc->top]) {
    840             case MODE_KEY:
    841                 assert(jc->type == JSON_T_STRING);
    842                 jc->type = JSON_T_NONE;
    843                 jc->state = CO;
    844                
    845                 if (jc->callback) {
    846                     JSON_value value;
    847                     value.vu.str.value = jc->parse_buffer;
    848                     value.vu.str.length = jc->parse_buffer_count;
    849                     if (!(*jc->callback)(jc->ctx, JSON_T_KEY, &value)) {
    850                         return false;
    851                     }
    852                 }
    853                 parse_buffer_clear(jc);
    854                 break;
    855             case MODE_ARRAY:
    856             case MODE_OBJECT:
    857                 assert(jc->type == JSON_T_STRING);
    858                 if (!parse_parse_buffer(jc)) {
     970            case - 9:
     971                parse_buffer_clear( jc );
     972                if( jc->callback
     973                  && !( *jc->callback )( jc->ctx, JSON_T_OBJECT_END, NULL ) )
     974                {
     975                    return false;
     976                }
     977                if( !pop( jc, MODE_KEY ) )
     978                {
     979                    return false;
     980                }
     981                jc->state = OK;
     982                break;
     983
     984/* } */ case - 8:
     985                parse_buffer_pop_back_char( jc );
     986                if( !parse_parse_buffer( jc ) )
     987                {
     988                    return false;
     989                }
     990                if( jc->callback
     991                  && !( *jc->callback )( jc->ctx, JSON_T_OBJECT_END, NULL ) )
     992                {
     993                    return false;
     994                }
     995                if( !pop( jc, MODE_OBJECT ) )
     996                {
    859997                    return false;
    860998                }
     
    8621000                jc->state = OK;
    8631001                break;
     1002
     1003/* ] */ case - 7:
     1004                parse_buffer_pop_back_char( jc );
     1005                if( !parse_parse_buffer( jc ) )
     1006                {
     1007                    return false;
     1008                }
     1009                if( jc->callback
     1010                  && !( *jc->callback )( jc->ctx, JSON_T_ARRAY_END, NULL ) )
     1011                {
     1012                    return false;
     1013                }
     1014                if( !pop( jc, MODE_ARRAY ) )
     1015                {
     1016                    return false;
     1017                }
     1018
     1019                jc->type = JSON_T_NONE;
     1020                jc->state = OK;
     1021                break;
     1022
     1023/* { */ case - 6:
     1024                parse_buffer_pop_back_char( jc );
     1025                if( jc->callback
     1026                  && !( *jc->callback )( jc->ctx, JSON_T_OBJECT_BEGIN, NULL ) )
     1027                {
     1028                    return false;
     1029                }
     1030                if( !push( jc, MODE_KEY ) )
     1031                {
     1032                    return false;
     1033                }
     1034                assert( jc->type == JSON_T_NONE );
     1035                jc->state = OB;
     1036                break;
     1037
     1038/* [ */ case - 5:
     1039                parse_buffer_pop_back_char( jc );
     1040                if( jc->callback
     1041                  && !( *jc->callback )( jc->ctx, JSON_T_ARRAY_BEGIN, NULL ) )
     1042                {
     1043                    return false;
     1044                }
     1045                if( !push( jc, MODE_ARRAY ) )
     1046                {
     1047                    return false;
     1048                }
     1049                assert( jc->type == JSON_T_NONE );
     1050                jc->state = AR;
     1051                break;
     1052
     1053/* string end " */ case - 4:
     1054                parse_buffer_pop_back_char( jc );
     1055                switch( jc->stack[jc->top] )
     1056                {
     1057                    case MODE_KEY:
     1058                        assert( jc->type == JSON_T_STRING );
     1059                        jc->type = JSON_T_NONE;
     1060                        jc->state = CO;
     1061
     1062                        if( jc->callback )
     1063                        {
     1064                            JSON_value value;
     1065                            value.vu.str.value = jc->parse_buffer;
     1066                            value.vu.str.length = jc->parse_buffer_count;
     1067                            if( !( *jc->callback )( jc->ctx, JSON_T_KEY,
     1068                                                    &value ) )
     1069                            {
     1070                                return false;
     1071                            }
     1072                        }
     1073                        parse_buffer_clear( jc );
     1074                        break;
     1075
     1076                    case MODE_ARRAY:
     1077                    case MODE_OBJECT:
     1078                        assert( jc->type == JSON_T_STRING );
     1079                        if( !parse_parse_buffer( jc ) )
     1080                        {
     1081                            return false;
     1082                        }
     1083                        jc->type = JSON_T_NONE;
     1084                        jc->state = OK;
     1085                        break;
     1086
     1087                    default:
     1088                        return false;
     1089                }
     1090                break;
     1091
     1092/* , */ case - 3:
     1093                parse_buffer_pop_back_char( jc );
     1094                if( !parse_parse_buffer( jc ) )
     1095                {
     1096                    return false;
     1097                }
     1098                switch( jc->stack[jc->top] )
     1099                {
     1100                    case MODE_OBJECT:
     1101/*
     1102    A comma causes a flip from object mode to key mode.
     1103 */
     1104                        if( !pop( jc, MODE_OBJECT ) || !push( jc, MODE_KEY ) )
     1105                        {
     1106                            return false;
     1107                        }
     1108                        assert( jc->type != JSON_T_STRING );
     1109                        jc->type = JSON_T_NONE;
     1110                        jc->state = KE;
     1111                        break;
     1112
     1113                    case MODE_ARRAY:
     1114                        assert( jc->type != JSON_T_STRING );
     1115                        jc->type = JSON_T_NONE;
     1116                        jc->state = VA;
     1117                        break;
     1118
     1119                    default:
     1120                        return false;
     1121                }
     1122                break;
     1123
     1124/* : */ case - 2:
     1125/*
     1126    A colon causes a flip from key mode to object mode.
     1127 */
     1128                parse_buffer_pop_back_char( jc );
     1129                if( !pop( jc, MODE_KEY ) || !push( jc, MODE_OBJECT ) )
     1130                {
     1131                    return false;
     1132                }
     1133                assert( jc->type == JSON_T_NONE );
     1134                jc->state = VA;
     1135                break;
     1136
     1137            /*
     1138                Bad action.
     1139             */
    8641140            default:
    8651141                return false;
    866             }
    867             break;
    868 
    869 /* , */ case -3:
    870             parse_buffer_pop_back_char(jc);
    871             if (!parse_parse_buffer(jc)) {
    872                 return false;
    873             }
    874             switch (jc->stack[jc->top]) {
    875             case MODE_OBJECT:
    876 /*
    877     A comma causes a flip from object mode to key mode.
    878 */
    879                 if (!pop(jc, MODE_OBJECT) || !push(jc, MODE_KEY)) {
    880                     return false;
    881                 }
    882                 assert(jc->type != JSON_T_STRING);
    883                 jc->type = JSON_T_NONE;
    884                 jc->state = KE;
    885                 break;
    886             case MODE_ARRAY:
    887                 assert(jc->type != JSON_T_STRING);
    888                 jc->type = JSON_T_NONE;
    889                 jc->state = VA;
    890                 break;
    891             default:
    892                 return false;
    893             }
    894             break;
    895 
    896 /* : */ case -2:
    897 /*
    898     A colon causes a flip from key mode to object mode.
    899 */
    900             parse_buffer_pop_back_char(jc);
    901             if (!pop(jc, MODE_KEY) || !push(jc, MODE_OBJECT)) {
    902                 return false;
    903             }
    904             assert(jc->type == JSON_T_NONE);
    905             jc->state = VA;
    906             break;
    907 /*
    908     Bad action.
    909 */
    910         default:
    911             return false;
    9121142        }
    9131143    }
     
    9151145}
    9161146
    917 
    9181147int
    919 JSON_parser_done(JSON_parser jc)
    920 {
    921     const int result = jc->state == OK && pop(jc, MODE_DONE);
     1148JSON_parser_done( JSON_parser jc )
     1149{
     1150    const int result = jc->state == OK && pop( jc, MODE_DONE );
    9221151
    9231152    return result;
    9241153}
    9251154
    926 
    927 int JSON_parser_is_legal_white_space_string(const char* s)
     1155int
     1156JSON_parser_is_legal_white_space_string( const char* s )
    9281157{
    9291158    int c, char_class;
    930    
    931     if (s == NULL) {
     1159
     1160    if( s == NULL )
     1161    {
    9321162        return false;
    9331163    }
    934    
    935     for (; *s; ++s) {   
     1164
     1165    for( ; *s; ++s )
     1166    {
    9361167        c = *s;
    937        
    938         if (c < 0 || c >= 128) {
     1168
     1169        if( c < 0 || c >= 128 )
     1170        {
    9391171            return false;
    9401172        }
    941        
     1173
    9421174        char_class = ascii_class[c];
    943        
    944         if (char_class != C_SPACE && char_class != C_WHITE) {
     1175
     1176        if( char_class != C_SPACE && char_class != C_WHITE )
     1177        {
    9451178            return false;
    9461179        }
    9471180    }
    948    
     1181
    9491182    return true;
    9501183}
    9511184
    952 
    953 
    954 void init_JSON_config(JSON_config* config)
    955 {
    956     if (config) {
    957         memset(config, 0, sizeof(*config));
    958        
     1185void
     1186init_JSON_config( JSON_config* config )
     1187{
     1188    if( config )
     1189    {
     1190        memset( config, 0, sizeof( *config ) );
     1191
    9591192        config->depth = JSON_PARSER_STACK_SIZE - 1;
    9601193    }
    9611194}
     1195
Note: See TracChangeset for help on using the changeset viewer.