--- parser3/src/lib/json/pa_json.C 2013/07/29 10:06:38 1.2 +++ parser3/src/lib/json/pa_json.C 2013/10/29 13:47:33 1.13 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Vincent Hanquez + * Copyright (C) 2009-2011 Vincent Hanquez * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published @@ -18,14 +18,7 @@ * the JSON compliance. */ -#include "json.h" - -#ifdef TRACING_ENABLE -#include -#define TRACING(fmt, ...) fprintf(stderr, "tracing: " fmt, ##__VA_ARGS__) -#else -#define TRACING(fmt, ...) ((void) 0) -#endif +#include "pa_json.h" enum classes { C_SPACE, /* space */ @@ -74,15 +67,6 @@ static uint8_t character_class[128] = { C_OTHER, C_OTHER, C_OTHER, C_LCURB, C_OTHER, C_RCURB, C_OTHER, C_OTHER }; -/* only the first 36 ascii characters need an escape */ -static char *character_escape[36] = { - "\\u0000", "\\u0001", "\\u0002", "\\u0003", "\\u0004", "\\u0005", "\\u0006", "\\u0007", /* 0-7 */ - "\\b" , "\\t", "\\n", "\\u000b", "\\f", "\\r", "\\u000e", "\\u000f", /* 8-f */ - "\\u0010", "\\u0011", "\\u0012", "\\u0013", "\\u0014", "\\u0015", "\\u0016", "\\u0017", /* 10-17 */ - "\\u0018", "\\u0019", "\\u001a", "\\u001b", "\\u001c", "\\u001d", "\\u001e", "\\u001f", /* 18-1f */ - " " , "!" , "\\\"" , "#", -}; - /* define all states and actions that will be taken on each transition. * * states are defined first because of the fact they are use as index in the @@ -95,12 +79,12 @@ static char *character_escape[36] = { enum states { STATE_GO, /* start */ STATE_OK, /* ok */ - STATE__O, /* object */ - STATE__K, /* key */ + STATE_OO, /* object */ + STATE_KK, /* key */ STATE_CO, /* colon */ - STATE__V, /* value */ - STATE__A, /* array */ - STATE__S, /* string */ + STATE_VV, /* value */ + STATE_AA, /* array */ + STATE_SS, /* string */ STATE_E0, /* escape */ STATE_U1, STATE_U2, STATE_U3, STATE_U4, /* unicode states */ STATE_M0, STATE_Z0, STATE_I0, /* number states */ @@ -156,14 +140,14 @@ static const uint8_t state_transition_ta /* sp nl | { } [ ] : , " \ / + - . 0 19 a b c d e f l n r s t u | E | * # */ /*GO*/ PT_(GO,GO,GO,OB,__,AB,__,__,__,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,YB), /*OK*/ PT_(OK,OK,OK,__,OE,__,AE,__,SP,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,YB), -/*_O*/ PT_(_O,_O,_O,__,OE,__,__,__,__,_S,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,YB), -/*_K*/ PT_(_K,_K,_K,__,__,__,__,__,__,_S,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,YB), +/*OO*/ PT_(OO,OO,OO,__,OE,__,__,__,__,SS,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,YB), +/*KK*/ PT_(KK,KK,KK,__,__,__,__,__,__,SS,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,YB), /*CO*/ PT_(CO,CO,CO,__,__,__,__,KS,__,__,__,CB,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,YB), -/*_V*/ PT_(_V,_V,_V,OB,__,AB,__,__,__,_S,__,CB,__,MX,__,ZX,IX,__,__,__,__,__,F1,__,N1,__,__,T1,__,__,__,__,__,YB), -/*_A*/ PT_(_A,_A,_A,OB,__,AB,AE,__,__,_S,__,CB,__,MX,__,ZX,IX,__,__,__,__,__,F1,__,N1,__,__,T1,__,__,__,__,__,YB), +/*VV*/ PT_(VV,VV,VV,OB,__,AB,__,__,__,SS,__,CB,__,MX,__,ZX,IX,__,__,__,__,__,F1,__,N1,__,__,T1,__,__,__,__,__,YB), +/*AA*/ PT_(AA,AA,AA,OB,__,AB,AE,__,__,SS,__,CB,__,MX,__,ZX,IX,__,__,__,__,__,F1,__,N1,__,__,T1,__,__,__,__,__,YB), /****************************************************************************************************************/ -/*_S*/ PT_(_S,__,__,_S,_S,_S,_S,_S,_S,SE,E0,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S,_S), -/*E0*/ PT_(__,__,__,__,__,__,__,__,__,_S,_S,_S,__,__,__,__,__,__,_S,__,__,__,_S,__,_S,_S,__,_S,U1,__,__,__,__,__), +/*SS*/ PT_(SS,__,__,SS,SS,SS,SS,SS,SS,SE,E0,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS,SS), +/*E0*/ PT_(__,__,__,__,__,__,__,__,__,SS,SS,SS,__,__,__,__,__,__,SS,__,__,__,SS,__,SS,SS,__,SS,U1,__,__,__,__,__), /*U1*/ PT_(__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,U2,U2,U2,U2,U2,U2,U2,U2,__,__,__,__,__,__,U2,U2,__,__,__), /*U2*/ PT_(__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,U3,U3,U3,U3,U3,U3,U3,U3,__,__,__,__,__,__,U3,U3,__,__,__), /*U3*/ PT_(__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,U4,U4,U4,U4,U4,U4,U4,U4,__,__,__,__,__,__,U4,U4,__,__,__), @@ -205,13 +189,13 @@ static const uint8_t buffer_policy_table /* sp nl | { } [ ] : , " \ / + - . 0 19 a b c d e f l n r s t u | E | * # */ /*GO*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /*OK*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/*_O*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/*_K*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +/*OO*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +/*KK*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /*CO*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/*_V*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, -/*_A*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +/*VV*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +/*AA*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /**************************************************************************************************************/ -/*_S*/ { 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, +/*SS*/ { 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /*E0*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0 }, /*U1*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, /*U2*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, @@ -264,7 +248,7 @@ static int state_grow(json_parser *parse ptr = parser_realloc(parser, parser->stack, newsize * sizeof(uint8_t)); if (!ptr) return JSON_ERROR_NO_MEMORY; - parser->stack = (uint8_t*)ptr; + parser->stack = (uint8_t *)ptr; parser->stack_size = newsize; return 0; } @@ -380,7 +364,7 @@ static int decode_unicode_char(json_pars { uint32_t uval; char *b = parser->buffer; - int offset = parser->buffer_offset; + uint32_t offset = parser->buffer_offset; uval = (hex(b[offset - 4]) << 12) | (hex(b[offset - 3]) << 8) | (hex(b[offset - 2]) << 4) | hex(b[offset - 1]); @@ -409,7 +393,7 @@ static int decode_unicode_char(json_pars if (IS_LOW_SURROGATE(uval)) return JSON_ERROR_UNICODE_UNEXPECTED_LOW_SURROGATE; if (IS_HIGH_SURROGATE(uval)) { - parser->unicode_multi = uval; + parser->unicode_multi = (uint16_t)uval; return 0; } @@ -442,17 +426,17 @@ static int buffer_push_escape(json_parse return buffer_push(parser, c); } -#define CHK(f) ({ ret = f; if (ret) return ret; }) +#define CHK(f) { ret = f; if (ret) return ret; } -int act_uc(json_parser *parser) +static int act_uc(json_parser *parser) { int ret; CHK(decode_unicode_char(parser)); - parser->state = (parser->unicode_multi) ? STATE_D1 : STATE__S; + parser->state = (uint8_t)((parser->unicode_multi) ? STATE_D1 : STATE_SS); return 0; } -int act_yb(json_parser *parser) +static int act_yb(json_parser *parser) { if (!parser->config.allow_yaml_comments) return JSON_ERROR_COMMENT_NOT_ALLOWED; @@ -460,7 +444,7 @@ int act_yb(json_parser *parser) return 0; } -int act_cb(json_parser *parser) +static int act_cb(json_parser *parser) { if (!parser->config.allow_c_comments) return JSON_ERROR_COMMENT_NOT_ALLOWED; @@ -468,13 +452,13 @@ int act_cb(json_parser *parser) return 0; } -int act_ce(json_parser *parser) +static int act_ce(json_parser *parser) { - parser->state = (parser->save_state > STATE__A) ? STATE_OK : parser->save_state; + parser->state = (uint8_t)((parser->save_state > STATE_AA) ? STATE_OK : parser->save_state); return 0; } -int act_ob(json_parser *parser) +static int act_ob(json_parser *parser) { int ret; CHK(do_callback(parser, JSON_OBJECT_BEGIN)); @@ -483,83 +467,83 @@ int act_ob(json_parser *parser) return 0; } -int act_oe(json_parser *parser) +static int act_oe(json_parser *parser) { int ret; - CHK(do_callback(parser, JSON_OBJECT_END)); CHK(state_pop(parser, MODE_OBJECT)); + CHK(do_callback(parser, JSON_OBJECT_END)); parser->expecting_key = 0; return 0; } -int act_ab(json_parser *parser) +static int act_ab(json_parser *parser) { int ret; CHK(do_callback(parser, JSON_ARRAY_BEGIN)); CHK(state_push(parser, MODE_ARRAY)); return 0; } -int act_ae(json_parser *parser) +static int act_ae(json_parser *parser) { int ret; - CHK(do_callback(parser, JSON_ARRAY_END)); CHK(state_pop(parser, MODE_ARRAY)); + CHK(do_callback(parser, JSON_ARRAY_END)); return 0; } -int act_se(json_parser *parser) +static int act_se(json_parser *parser) { int ret; CHK(do_callback_withbuf(parser, (parser->expecting_key) ? JSON_KEY : JSON_STRING)); parser->buffer_offset = 0; - parser->state = (parser->expecting_key) ? STATE_CO : STATE_OK; + parser->state = (uint8_t)((parser->expecting_key) ? STATE_CO : STATE_OK); parser->expecting_key = 0; return 0; } -int act_sp(json_parser *parser) +static int act_sp(json_parser *parser) { if (parser->stack_offset == 0) return JSON_ERROR_COMMA_OUT_OF_STRUCTURE; if (parser->stack[parser->stack_offset - 1] == MODE_OBJECT) { parser->expecting_key = 1; - parser->state = STATE__K; + parser->state = STATE_KK; } else - parser->state = STATE__V; + parser->state = STATE_VV; return 0; } struct action_descr { int (*call)(json_parser *parser); - uint8_t type; + json_type type; uint8_t state; /* 0 if we let the callback set the value it want */ uint8_t dobuffer; }; static struct action_descr actions_map[] = { - [STATE_MX & ~0x80] = { NULL, JSON_INT, STATE_M0, 0 }, - [STATE_ZX & ~0x80] = { NULL, JSON_INT, STATE_Z0, 0 }, - [STATE_IX & ~0x80] = { NULL, JSON_INT, STATE_I0, 0 }, - [STATE_DE & ~0x80] = { NULL, JSON_FLOAT, STATE_X1, 0 }, - [STATE_DF & ~0x80] = { NULL, JSON_FLOAT, STATE_R1, 0 }, - [STATE_NU & ~0x80] = { NULL, JSON_NULL, STATE_OK, 0 }, - [STATE_FA & ~0x80] = { NULL, JSON_FALSE, STATE_OK, 0 }, - [STATE_TR & ~0x80] = { NULL, JSON_TRUE, STATE_OK, 0 }, - [STATE_KS & ~0x80] = { NULL, JSON_NONE, STATE__V, 0 }, - [STATE_UC & ~0x80] = { act_uc, JSON_NONE, 0, 0 }, - [STATE_YB & ~0x80] = { act_yb, JSON_NONE, STATE_Y1, 1 }, - [STATE_CB & ~0x80] = { act_cb, JSON_NONE, STATE_C1, 1 }, - [STATE_CE & ~0x80] = { act_ce, JSON_NONE, 0, 0 }, - [STATE_OB & ~0x80] = { act_ob, JSON_NONE, STATE__O, 0 }, - [STATE_OE & ~0x80] = { act_oe, JSON_NONE, STATE_OK, 1 }, - [STATE_AB & ~0x80] = { act_ab, JSON_NONE, STATE__A, 0 }, - [STATE_AE & ~0x80] = { act_ae, JSON_NONE, STATE_OK, 1 }, - [STATE_SE & ~0x80] = { act_se, JSON_NONE, 0, 0 }, - [STATE_SP & ~0x80] = { act_sp, JSON_NONE, 0, 1 }, + { NULL, JSON_NONE, STATE_VV, 0 }, /* KS */ + { act_sp, JSON_NONE, 0, 1 }, /* SP */ + { act_ab, JSON_NONE, STATE_AA, 0 }, /* AB */ + { act_ae, JSON_NONE, STATE_OK, 1 }, /* AE */ + { act_ob, JSON_NONE, STATE_OO, 0 }, /* OB */ + { act_oe, JSON_NONE, STATE_OK, 1 }, /* OE */ + { act_cb, JSON_NONE, STATE_C1, 1 }, /* CB */ + { act_yb, JSON_NONE, STATE_Y1, 1 }, /* YB */ + { act_ce, JSON_NONE, 0, 0 }, /* CE */ + { NULL, JSON_FALSE, STATE_OK, 0 }, /* FA */ + { NULL, JSON_TRUE, STATE_OK, 0 }, /* TR */ + { NULL, JSON_NULL, STATE_OK, 0 }, /* NU */ + { NULL, JSON_FLOAT, STATE_X1, 0 }, /* DE */ + { NULL, JSON_FLOAT, STATE_R1, 0 }, /* DF */ + { act_se, JSON_NONE, 0, 0 }, /* SE */ + { NULL, JSON_INT, STATE_M0, 0 }, /* MX */ + { NULL, JSON_INT, STATE_Z0, 0 }, /* ZX */ + { NULL, JSON_INT, STATE_I0, 0 }, /* IX */ + { act_uc, JSON_NONE, 0, 0 }, /* UC */ }; -static int do_action(json_parser *parser, int next_state) +static int do_action(json_parser *parser, uint8_t next_state) { struct action_descr *descr = &actions_map[next_state & ~0x80]; @@ -598,7 +582,7 @@ int json_parser_init(json_parser *parser ? parser->config.max_nesting : LIBJSON_DEFAULT_STACK_SIZE; - parser->stack = parser_malloc(parser, parser->stack_size * sizeof(parser->stack[0])); + parser->stack = (uint8_t *)parser_malloc(parser, parser->stack_size * sizeof(parser->stack[0])); if (!parser->stack) return JSON_ERROR_NO_MEMORY; @@ -610,7 +594,7 @@ int json_parser_init(json_parser *parser if (parser->config.max_data > 0 && parser->buffer_size > parser->config.max_data) parser->buffer_size = parser->config.max_data; - parser->buffer = parser_malloc(parser, parser->buffer_size * sizeof(char)); + parser->buffer = (char *)parser_malloc(parser, parser->buffer_size * sizeof(char)); if (!parser->buffer) { parser_free(parser, parser->stack); return JSON_ERROR_NO_MEMORY; @@ -645,8 +629,8 @@ int json_parser_string(json_parser *pars uint32_t length, uint32_t *processed) { int ret; - int next_class, next_state; - int buffer_policy; + uint8_t next_class, next_state; + uint32_t buffer_policy; uint32_t i; ret = 0; @@ -654,7 +638,7 @@ int json_parser_string(json_parser *pars unsigned char ch = s[i]; ret = 0; - next_class = (ch >= 128) ? C_OTHER : character_class[ch]; + next_class = (uint8_t)((ch >= 128) ? C_OTHER : character_class[ch]); if (next_class == C_ERROR) { ret = JSON_ERROR_BAD_CHAR; break; @@ -662,8 +646,6 @@ int json_parser_string(json_parser *pars next_state = state_transition_table[parser->state][next_class]; buffer_policy = buffer_policy_table[parser->state][next_class]; - TRACING("addchar %d (current-state=%d, next-state=%d, buf-policy=%d)\n", - ch, parser->state, next_state, buffer_policy); if (next_state == STATE___) { ret = JSON_ERROR_UNEXPECTED_CHAR; break;