Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 5 #include "azure_c_shared_utility/crt_abstractions.h"
XinZhangMS 0:f7f1f0d76dd6 6
XinZhangMS 0:f7f1f0d76dd6 7 #include "jsondecoder.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include <stdio.h>
XinZhangMS 0:f7f1f0d76dd6 9 #include <string.h>
XinZhangMS 0:f7f1f0d76dd6 10 #include <ctype.h>
XinZhangMS 0:f7f1f0d76dd6 11 #include <stddef.h>
XinZhangMS 0:f7f1f0d76dd6 12
XinZhangMS 0:f7f1f0d76dd6 13 #define IsWhiteSpace(A) (((A) == 0x20) || ((A) == 0x09) || ((A) == 0x0A) || ((A) == 0x0D))
XinZhangMS 0:f7f1f0d76dd6 14
XinZhangMS 0:f7f1f0d76dd6 15 typedef struct PARSER_STATE_TAG
XinZhangMS 0:f7f1f0d76dd6 16 {
XinZhangMS 0:f7f1f0d76dd6 17 char* json;
XinZhangMS 0:f7f1f0d76dd6 18 } PARSER_STATE;
XinZhangMS 0:f7f1f0d76dd6 19
XinZhangMS 0:f7f1f0d76dd6 20 static JSON_DECODER_RESULT ParseArray(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode);
XinZhangMS 0:f7f1f0d76dd6 21 static JSON_DECODER_RESULT ParseObject(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode);
XinZhangMS 0:f7f1f0d76dd6 22
XinZhangMS 0:f7f1f0d76dd6 23 /* Codes_SRS_JSON_DECODER_99_049:[ JSONDecoder shall not allocate new string values for the leafs, but rather point to strings in the original JSON.] */
XinZhangMS 0:f7f1f0d76dd6 24 static void NoFreeFunction(void* value)
XinZhangMS 0:f7f1f0d76dd6 25 {
XinZhangMS 0:f7f1f0d76dd6 26 (void)value;
XinZhangMS 0:f7f1f0d76dd6 27 }
XinZhangMS 0:f7f1f0d76dd6 28
XinZhangMS 0:f7f1f0d76dd6 29 static int NOPCloneFunction(void** destination, const void* source)
XinZhangMS 0:f7f1f0d76dd6 30 {
XinZhangMS 0:f7f1f0d76dd6 31 *destination = (void**)source;
XinZhangMS 0:f7f1f0d76dd6 32 return 0;
XinZhangMS 0:f7f1f0d76dd6 33 }
XinZhangMS 0:f7f1f0d76dd6 34
XinZhangMS 0:f7f1f0d76dd6 35 void SkipWhiteSpaces(PARSER_STATE* parserState)
XinZhangMS 0:f7f1f0d76dd6 36 {
XinZhangMS 0:f7f1f0d76dd6 37 while ((*(parserState->json) != '\0') && IsWhiteSpace(*(parserState->json)))
XinZhangMS 0:f7f1f0d76dd6 38 {
XinZhangMS 0:f7f1f0d76dd6 39 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 40 }
XinZhangMS 0:f7f1f0d76dd6 41 }
XinZhangMS 0:f7f1f0d76dd6 42
XinZhangMS 0:f7f1f0d76dd6 43 static JSON_DECODER_RESULT ParseString(PARSER_STATE* parserState, char** stringBegin)
XinZhangMS 0:f7f1f0d76dd6 44 {
XinZhangMS 0:f7f1f0d76dd6 45 JSON_DECODER_RESULT result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 46 *stringBegin = parserState->json;
XinZhangMS 0:f7f1f0d76dd6 47
XinZhangMS 0:f7f1f0d76dd6 48 /* Codes_SRS_JSON_DECODER_99_028:[ A string begins and ends with quotation marks.] */
XinZhangMS 0:f7f1f0d76dd6 49 if (*(parserState->json) != '"')
XinZhangMS 0:f7f1f0d76dd6 50 {
XinZhangMS 0:f7f1f0d76dd6 51 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 52 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 53 }
XinZhangMS 0:f7f1f0d76dd6 54 else
XinZhangMS 0:f7f1f0d76dd6 55 {
XinZhangMS 0:f7f1f0d76dd6 56 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 57 while ((*(parserState->json) != '"') && (*(parserState->json) != '\0'))
XinZhangMS 0:f7f1f0d76dd6 58 {
XinZhangMS 0:f7f1f0d76dd6 59 /* Codes_SRS_JSON_DECODER_99_030:[ Any character may be escaped.] */
XinZhangMS 0:f7f1f0d76dd6 60 /* Codes_SRS_JSON_DECODER_99_033:[ Alternatively, there are two-character sequence escape representations of some popular characters. So, for example, a string containing only a single reverse solidus character may be represented more compactly as "\\".] */
XinZhangMS 0:f7f1f0d76dd6 61 if (*(parserState->json) == '\\')
XinZhangMS 0:f7f1f0d76dd6 62 {
XinZhangMS 0:f7f1f0d76dd6 63 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 64 if (
XinZhangMS 0:f7f1f0d76dd6 65 /* Codes_SRS_JSON_DECODER_99_051:[ %x5C / ; \ reverse solidus U+005C] */
XinZhangMS 0:f7f1f0d76dd6 66 (*parserState->json == '\\') ||
XinZhangMS 0:f7f1f0d76dd6 67 /* Codes_SRS_JSON_DECODER_99_050:[ %x22 / ; " quotation mark U+0022] */
XinZhangMS 0:f7f1f0d76dd6 68 (*parserState->json == '"') ||
XinZhangMS 0:f7f1f0d76dd6 69 /* Codes_SRS_JSON_DECODER_99_052:[ %x2F / ; / solidus U+002F] */
XinZhangMS 0:f7f1f0d76dd6 70 (*parserState->json == '/') ||
XinZhangMS 0:f7f1f0d76dd6 71 /* Codes_SRS_JSON_DECODER_99_053:[ %x62 / ; b backspace U+0008] */
XinZhangMS 0:f7f1f0d76dd6 72 (*parserState->json == 'b') ||
XinZhangMS 0:f7f1f0d76dd6 73 /* Codes_SRS_JSON_DECODER_99_054:[ %x66 / ; f form feed U+000C] */
XinZhangMS 0:f7f1f0d76dd6 74 (*parserState->json == 'f') ||
XinZhangMS 0:f7f1f0d76dd6 75 /* Codes_SRS_JSON_DECODER_99_055:[ %x6E / ; n line feed U+000A] */
XinZhangMS 0:f7f1f0d76dd6 76 (*parserState->json == 'n') ||
XinZhangMS 0:f7f1f0d76dd6 77 /* Codes_SRS_JSON_DECODER_99_056:[ %x72 / ; r carriage return U+000D] */
XinZhangMS 0:f7f1f0d76dd6 78 (*parserState->json == 'r') ||
XinZhangMS 0:f7f1f0d76dd6 79 /* Codes_SRS_JSON_DECODER_99_057:[ %x74 / ; t tab U+0009] */
XinZhangMS 0:f7f1f0d76dd6 80 (*parserState->json == 't'))
XinZhangMS 0:f7f1f0d76dd6 81 {
XinZhangMS 0:f7f1f0d76dd6 82 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 83 }
XinZhangMS 0:f7f1f0d76dd6 84 else
XinZhangMS 0:f7f1f0d76dd6 85 {
XinZhangMS 0:f7f1f0d76dd6 86 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 87 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 88 break;
XinZhangMS 0:f7f1f0d76dd6 89 }
XinZhangMS 0:f7f1f0d76dd6 90 }
XinZhangMS 0:f7f1f0d76dd6 91 else
XinZhangMS 0:f7f1f0d76dd6 92 {
XinZhangMS 0:f7f1f0d76dd6 93 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 94 }
XinZhangMS 0:f7f1f0d76dd6 95 }
XinZhangMS 0:f7f1f0d76dd6 96
XinZhangMS 0:f7f1f0d76dd6 97 if (*(parserState->json) != '"')
XinZhangMS 0:f7f1f0d76dd6 98 {
XinZhangMS 0:f7f1f0d76dd6 99 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 100 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 101 }
XinZhangMS 0:f7f1f0d76dd6 102 else
XinZhangMS 0:f7f1f0d76dd6 103 {
XinZhangMS 0:f7f1f0d76dd6 104 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 105 result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 106 }
XinZhangMS 0:f7f1f0d76dd6 107 }
XinZhangMS 0:f7f1f0d76dd6 108
XinZhangMS 0:f7f1f0d76dd6 109 return result;
XinZhangMS 0:f7f1f0d76dd6 110 }
XinZhangMS 0:f7f1f0d76dd6 111
XinZhangMS 0:f7f1f0d76dd6 112 static JSON_DECODER_RESULT ParseNumber(PARSER_STATE* parserState)
XinZhangMS 0:f7f1f0d76dd6 113 {
XinZhangMS 0:f7f1f0d76dd6 114 JSON_DECODER_RESULT result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 115 size_t digitCount = 0;
XinZhangMS 0:f7f1f0d76dd6 116
XinZhangMS 0:f7f1f0d76dd6 117 if (*(parserState->json) == '-')
XinZhangMS 0:f7f1f0d76dd6 118 {
XinZhangMS 0:f7f1f0d76dd6 119 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 120 }
XinZhangMS 0:f7f1f0d76dd6 121
XinZhangMS 0:f7f1f0d76dd6 122 /* Codes_SRS_JSON_DECODER_99_043:[ A number contains an integer component that may be prefixed with an optional minus sign, which may be followed by a fraction part and/or an exponent part.] */
XinZhangMS 0:f7f1f0d76dd6 123 while (*(parserState->json) != '\0')
XinZhangMS 0:f7f1f0d76dd6 124 {
XinZhangMS 0:f7f1f0d76dd6 125 /* Codes_SRS_JSON_DECODER_99_044:[ Octal and hex forms are not allowed.] */
XinZhangMS 0:f7f1f0d76dd6 126 if (ISDIGIT(*(parserState->json)))
XinZhangMS 0:f7f1f0d76dd6 127 {
XinZhangMS 0:f7f1f0d76dd6 128 digitCount++;
XinZhangMS 0:f7f1f0d76dd6 129 /* simply continue */
XinZhangMS 0:f7f1f0d76dd6 130 }
XinZhangMS 0:f7f1f0d76dd6 131 else
XinZhangMS 0:f7f1f0d76dd6 132 {
XinZhangMS 0:f7f1f0d76dd6 133 break;
XinZhangMS 0:f7f1f0d76dd6 134 }
XinZhangMS 0:f7f1f0d76dd6 135
XinZhangMS 0:f7f1f0d76dd6 136 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 137 }
XinZhangMS 0:f7f1f0d76dd6 138
XinZhangMS 0:f7f1f0d76dd6 139 if ((digitCount == 0) ||
XinZhangMS 0:f7f1f0d76dd6 140 /* Codes_SRS_JSON_DECODER_99_045:[ Leading zeros are not allowed.] */
XinZhangMS 0:f7f1f0d76dd6 141 ((digitCount > 1) && *(parserState->json - digitCount) == '0'))
XinZhangMS 0:f7f1f0d76dd6 142 {
XinZhangMS 0:f7f1f0d76dd6 143 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 144 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 145 }
XinZhangMS 0:f7f1f0d76dd6 146 else
XinZhangMS 0:f7f1f0d76dd6 147 {
XinZhangMS 0:f7f1f0d76dd6 148 /* Codes_SRS_JSON_DECODER_99_046:[ A fraction part is a decimal point followed by one or more digits.] */
XinZhangMS 0:f7f1f0d76dd6 149 if (*(parserState->json) == '.')
XinZhangMS 0:f7f1f0d76dd6 150 {
XinZhangMS 0:f7f1f0d76dd6 151 /* optional fractional part */
XinZhangMS 0:f7f1f0d76dd6 152 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 153 digitCount = 0;
XinZhangMS 0:f7f1f0d76dd6 154
XinZhangMS 0:f7f1f0d76dd6 155 while (*(parserState->json) != '\0')
XinZhangMS 0:f7f1f0d76dd6 156 {
XinZhangMS 0:f7f1f0d76dd6 157 /* Codes_SRS_JSON_DECODER_99_044:[ Octal and hex forms are not allowed.] */
XinZhangMS 0:f7f1f0d76dd6 158 if (ISDIGIT(*(parserState->json)))
XinZhangMS 0:f7f1f0d76dd6 159 {
XinZhangMS 0:f7f1f0d76dd6 160 digitCount++;
XinZhangMS 0:f7f1f0d76dd6 161 /* simply continue */
XinZhangMS 0:f7f1f0d76dd6 162 }
XinZhangMS 0:f7f1f0d76dd6 163 else
XinZhangMS 0:f7f1f0d76dd6 164 {
XinZhangMS 0:f7f1f0d76dd6 165 break;
XinZhangMS 0:f7f1f0d76dd6 166 }
XinZhangMS 0:f7f1f0d76dd6 167
XinZhangMS 0:f7f1f0d76dd6 168 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 169 }
XinZhangMS 0:f7f1f0d76dd6 170
XinZhangMS 0:f7f1f0d76dd6 171 if (digitCount == 0)
XinZhangMS 0:f7f1f0d76dd6 172 {
XinZhangMS 0:f7f1f0d76dd6 173 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 174 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 175 }
XinZhangMS 0:f7f1f0d76dd6 176 }
XinZhangMS 0:f7f1f0d76dd6 177
XinZhangMS 0:f7f1f0d76dd6 178 /* Codes_SRS_JSON_DECODER_99_047:[ An exponent part begins with the letter E in upper or lowercase, which may be followed by a plus or minus sign.] */
XinZhangMS 0:f7f1f0d76dd6 179 if ((*(parserState->json) == 'e') || (*(parserState->json) == 'E'))
XinZhangMS 0:f7f1f0d76dd6 180 {
XinZhangMS 0:f7f1f0d76dd6 181 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 182
XinZhangMS 0:f7f1f0d76dd6 183 /* optional sign */
XinZhangMS 0:f7f1f0d76dd6 184 if ((*(parserState->json) == '-') || (*(parserState->json) == '+'))
XinZhangMS 0:f7f1f0d76dd6 185 {
XinZhangMS 0:f7f1f0d76dd6 186 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 187 }
XinZhangMS 0:f7f1f0d76dd6 188
XinZhangMS 0:f7f1f0d76dd6 189 digitCount = 0;
XinZhangMS 0:f7f1f0d76dd6 190
XinZhangMS 0:f7f1f0d76dd6 191 /* Codes_SRS_JSON_DECODER_99_048:[ The E and optional sign are followed by one or more digits.] */
XinZhangMS 0:f7f1f0d76dd6 192 while (*(parserState->json) != '\0')
XinZhangMS 0:f7f1f0d76dd6 193 {
XinZhangMS 0:f7f1f0d76dd6 194 /* Codes_SRS_JSON_DECODER_99_044:[ Octal and hex forms are not allowed.] */
XinZhangMS 0:f7f1f0d76dd6 195 if (ISDIGIT(*(parserState->json)))
XinZhangMS 0:f7f1f0d76dd6 196 {
XinZhangMS 0:f7f1f0d76dd6 197 digitCount++;
XinZhangMS 0:f7f1f0d76dd6 198 /* simply continue */
XinZhangMS 0:f7f1f0d76dd6 199 }
XinZhangMS 0:f7f1f0d76dd6 200 else
XinZhangMS 0:f7f1f0d76dd6 201 {
XinZhangMS 0:f7f1f0d76dd6 202 break;
XinZhangMS 0:f7f1f0d76dd6 203 }
XinZhangMS 0:f7f1f0d76dd6 204
XinZhangMS 0:f7f1f0d76dd6 205 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 206 }
XinZhangMS 0:f7f1f0d76dd6 207
XinZhangMS 0:f7f1f0d76dd6 208 if (digitCount == 0)
XinZhangMS 0:f7f1f0d76dd6 209 {
XinZhangMS 0:f7f1f0d76dd6 210 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 211 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 212 }
XinZhangMS 0:f7f1f0d76dd6 213 }
XinZhangMS 0:f7f1f0d76dd6 214 }
XinZhangMS 0:f7f1f0d76dd6 215
XinZhangMS 0:f7f1f0d76dd6 216 return result;
XinZhangMS 0:f7f1f0d76dd6 217 }
XinZhangMS 0:f7f1f0d76dd6 218
XinZhangMS 0:f7f1f0d76dd6 219 static JSON_DECODER_RESULT ParseValue(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode, char** stringBegin)
XinZhangMS 0:f7f1f0d76dd6 220 {
XinZhangMS 0:f7f1f0d76dd6 221 JSON_DECODER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 222
XinZhangMS 0:f7f1f0d76dd6 223 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 224
XinZhangMS 0:f7f1f0d76dd6 225 if (*(parserState->json) == '"')
XinZhangMS 0:f7f1f0d76dd6 226 {
XinZhangMS 0:f7f1f0d76dd6 227 result = ParseString(parserState, stringBegin);
XinZhangMS 0:f7f1f0d76dd6 228 }
XinZhangMS 0:f7f1f0d76dd6 229 /* Codes_SRS_JSON_DECODER_99_018:[ A JSON value MUST be an object, array, number, or string, or one of the following three literal names: false null true] */
XinZhangMS 0:f7f1f0d76dd6 230 /* Codes_SRS_JSON_DECODER_99_019:[ The literal names MUST be lowercase.] */
XinZhangMS 0:f7f1f0d76dd6 231 /* Codes_SRS_JSON_DECODER_99_020:[ No other literal names are allowed.] */
XinZhangMS 0:f7f1f0d76dd6 232 else if (strncmp(parserState->json, "false", 5) == 0)
XinZhangMS 0:f7f1f0d76dd6 233 {
XinZhangMS 0:f7f1f0d76dd6 234 *stringBegin = parserState->json;
XinZhangMS 0:f7f1f0d76dd6 235 parserState->json += 5;
XinZhangMS 0:f7f1f0d76dd6 236 result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 237 }
XinZhangMS 0:f7f1f0d76dd6 238 else if (strncmp(parserState->json, "true", 4) == 0)
XinZhangMS 0:f7f1f0d76dd6 239 {
XinZhangMS 0:f7f1f0d76dd6 240 *stringBegin = parserState->json;
XinZhangMS 0:f7f1f0d76dd6 241 parserState->json += 4;
XinZhangMS 0:f7f1f0d76dd6 242 result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 243 }
XinZhangMS 0:f7f1f0d76dd6 244 else if (strncmp(parserState->json, "null", 4) == 0)
XinZhangMS 0:f7f1f0d76dd6 245 {
XinZhangMS 0:f7f1f0d76dd6 246 *stringBegin = parserState->json;
XinZhangMS 0:f7f1f0d76dd6 247 parserState->json += 4;
XinZhangMS 0:f7f1f0d76dd6 248 result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 249 }
XinZhangMS 0:f7f1f0d76dd6 250 /* Tests_SRS_JSON_DECODER_99_018:[ A JSON value MUST be an object, array, number, or string, or one of the following three literal names: false null true] */
XinZhangMS 0:f7f1f0d76dd6 251 else if (*(parserState->json) == '[')
XinZhangMS 0:f7f1f0d76dd6 252 {
XinZhangMS 0:f7f1f0d76dd6 253 result = ParseArray(parserState, currentNode);
XinZhangMS 0:f7f1f0d76dd6 254 *stringBegin = NULL;
XinZhangMS 0:f7f1f0d76dd6 255 }
XinZhangMS 0:f7f1f0d76dd6 256 else if (*(parserState->json) == '{')
XinZhangMS 0:f7f1f0d76dd6 257 {
XinZhangMS 0:f7f1f0d76dd6 258 result = ParseObject(parserState, currentNode);
XinZhangMS 0:f7f1f0d76dd6 259 *stringBegin = NULL;
XinZhangMS 0:f7f1f0d76dd6 260 }
XinZhangMS 0:f7f1f0d76dd6 261 else if (
XinZhangMS 0:f7f1f0d76dd6 262 (
XinZhangMS 0:f7f1f0d76dd6 263 ISDIGIT(*(parserState->json))
XinZhangMS 0:f7f1f0d76dd6 264 )
XinZhangMS 0:f7f1f0d76dd6 265 || (*(parserState->json) == '-'))
XinZhangMS 0:f7f1f0d76dd6 266 {
XinZhangMS 0:f7f1f0d76dd6 267 *stringBegin = parserState->json;
XinZhangMS 0:f7f1f0d76dd6 268 result = ParseNumber(parserState);
XinZhangMS 0:f7f1f0d76dd6 269 }
XinZhangMS 0:f7f1f0d76dd6 270 else
XinZhangMS 0:f7f1f0d76dd6 271 {
XinZhangMS 0:f7f1f0d76dd6 272 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 273 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 274 }
XinZhangMS 0:f7f1f0d76dd6 275
XinZhangMS 0:f7f1f0d76dd6 276 return result;
XinZhangMS 0:f7f1f0d76dd6 277 }
XinZhangMS 0:f7f1f0d76dd6 278
XinZhangMS 0:f7f1f0d76dd6 279 static JSON_DECODER_RESULT ParseColon(PARSER_STATE* parserState)
XinZhangMS 0:f7f1f0d76dd6 280 {
XinZhangMS 0:f7f1f0d76dd6 281 JSON_DECODER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 282
XinZhangMS 0:f7f1f0d76dd6 283 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 284 /* Codes_SRS_JSON_DECODER_99_023:[ A single colon comes after each name, separating the name from the value.] */
XinZhangMS 0:f7f1f0d76dd6 285 if (*(parserState->json) != ':')
XinZhangMS 0:f7f1f0d76dd6 286 {
XinZhangMS 0:f7f1f0d76dd6 287 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 288 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 289 }
XinZhangMS 0:f7f1f0d76dd6 290 else
XinZhangMS 0:f7f1f0d76dd6 291 {
XinZhangMS 0:f7f1f0d76dd6 292 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 293 result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 294 }
XinZhangMS 0:f7f1f0d76dd6 295
XinZhangMS 0:f7f1f0d76dd6 296 return result;
XinZhangMS 0:f7f1f0d76dd6 297 }
XinZhangMS 0:f7f1f0d76dd6 298
XinZhangMS 0:f7f1f0d76dd6 299 static JSON_DECODER_RESULT ParseOpenCurly(PARSER_STATE* parserState)
XinZhangMS 0:f7f1f0d76dd6 300 {
XinZhangMS 0:f7f1f0d76dd6 301 JSON_DECODER_RESULT result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 302
XinZhangMS 0:f7f1f0d76dd6 303 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 304
XinZhangMS 0:f7f1f0d76dd6 305 /* Codes_SRS_JSON_DECODER_99_021:[ An object structure is represented as a pair of curly brackets surrounding zero or more name/value pairs (or members).] */
XinZhangMS 0:f7f1f0d76dd6 306 if (*(parserState->json) != '{')
XinZhangMS 0:f7f1f0d76dd6 307 {
XinZhangMS 0:f7f1f0d76dd6 308 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 309 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 310 }
XinZhangMS 0:f7f1f0d76dd6 311 else
XinZhangMS 0:f7f1f0d76dd6 312 {
XinZhangMS 0:f7f1f0d76dd6 313 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 314 result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 315 }
XinZhangMS 0:f7f1f0d76dd6 316
XinZhangMS 0:f7f1f0d76dd6 317 return result;
XinZhangMS 0:f7f1f0d76dd6 318 }
XinZhangMS 0:f7f1f0d76dd6 319
XinZhangMS 0:f7f1f0d76dd6 320 static JSON_DECODER_RESULT ParseNameValuePair(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode)
XinZhangMS 0:f7f1f0d76dd6 321 {
XinZhangMS 0:f7f1f0d76dd6 322 JSON_DECODER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 323 char* memberNameBegin;
XinZhangMS 0:f7f1f0d76dd6 324
XinZhangMS 0:f7f1f0d76dd6 325 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 326
XinZhangMS 0:f7f1f0d76dd6 327 /* Codes_SRS_JSON_DECODER_99_022:[ A name is a string.] */
XinZhangMS 0:f7f1f0d76dd6 328 result = ParseString(parserState, &memberNameBegin);
XinZhangMS 0:f7f1f0d76dd6 329 if (result == JSON_DECODER_OK)
XinZhangMS 0:f7f1f0d76dd6 330 {
XinZhangMS 0:f7f1f0d76dd6 331 char* valueBegin;
XinZhangMS 0:f7f1f0d76dd6 332 MULTITREE_HANDLE childNode;
XinZhangMS 0:f7f1f0d76dd6 333 *(parserState->json - 1) = 0;
XinZhangMS 0:f7f1f0d76dd6 334
XinZhangMS 0:f7f1f0d76dd6 335 result = ParseColon(parserState);
XinZhangMS 0:f7f1f0d76dd6 336 if (result == JSON_DECODER_OK)
XinZhangMS 0:f7f1f0d76dd6 337 {
XinZhangMS 0:f7f1f0d76dd6 338 /* Codes_SRS_JSON_DECODER_99_025:[ The names within an object SHOULD be unique.] */
XinZhangMS 0:f7f1f0d76dd6 339 /* Multi Tree takes care of not having 2 children with the same name */
XinZhangMS 0:f7f1f0d76dd6 340 /* Codes_SRS_JSON_DECODER_99_002:[ JSONDecoder_JSON_To_MultiTree shall use the MultiTree APIs to create the multi tree and add leafs to the multi tree.] */
XinZhangMS 0:f7f1f0d76dd6 341 /* Codes_SRS_JSON_DECODER_99_003:[ When a JSON element is decoded from the JSON object then a leaf shall be added to the MultiTree.] */
XinZhangMS 0:f7f1f0d76dd6 342 /* Codes_SRS_JSON_DECODER_99_004:[ The leaf node name in the multi tree shall be the JSON element name.] */
XinZhangMS 0:f7f1f0d76dd6 343 if (MultiTree_AddChild(currentNode, memberNameBegin + 1, &childNode) != MULTITREE_OK)
XinZhangMS 0:f7f1f0d76dd6 344 {
XinZhangMS 0:f7f1f0d76dd6 345 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
XinZhangMS 0:f7f1f0d76dd6 346 result = JSON_DECODER_MULTITREE_FAILED;
XinZhangMS 0:f7f1f0d76dd6 347 }
XinZhangMS 0:f7f1f0d76dd6 348 else
XinZhangMS 0:f7f1f0d76dd6 349 {
XinZhangMS 0:f7f1f0d76dd6 350 result = ParseValue(parserState, childNode, &valueBegin);
XinZhangMS 0:f7f1f0d76dd6 351 if ((result == JSON_DECODER_OK) && (valueBegin != NULL))
XinZhangMS 0:f7f1f0d76dd6 352 {
XinZhangMS 0:f7f1f0d76dd6 353 /* Codes_SRS_JSON_DECODER_99_005:[ The leaf node added in the multi tree shall have the value the string value of the JSON element as parsed from the JSON object.] */
XinZhangMS 0:f7f1f0d76dd6 354 if (MultiTree_SetValue(childNode, valueBegin) != MULTITREE_OK)
XinZhangMS 0:f7f1f0d76dd6 355 {
XinZhangMS 0:f7f1f0d76dd6 356 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
XinZhangMS 0:f7f1f0d76dd6 357 result = JSON_DECODER_MULTITREE_FAILED;
XinZhangMS 0:f7f1f0d76dd6 358 }
XinZhangMS 0:f7f1f0d76dd6 359 }
XinZhangMS 0:f7f1f0d76dd6 360 }
XinZhangMS 0:f7f1f0d76dd6 361 }
XinZhangMS 0:f7f1f0d76dd6 362 }
XinZhangMS 0:f7f1f0d76dd6 363
XinZhangMS 0:f7f1f0d76dd6 364 return result;
XinZhangMS 0:f7f1f0d76dd6 365 }
XinZhangMS 0:f7f1f0d76dd6 366
XinZhangMS 0:f7f1f0d76dd6 367 static JSON_DECODER_RESULT ParseObject(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode)
XinZhangMS 0:f7f1f0d76dd6 368 {
XinZhangMS 0:f7f1f0d76dd6 369 JSON_DECODER_RESULT result = ParseOpenCurly(parserState);
XinZhangMS 0:f7f1f0d76dd6 370 if (result == JSON_DECODER_OK)
XinZhangMS 0:f7f1f0d76dd6 371 {
XinZhangMS 0:f7f1f0d76dd6 372 char jsonChar;
XinZhangMS 0:f7f1f0d76dd6 373
XinZhangMS 0:f7f1f0d76dd6 374 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 375
XinZhangMS 0:f7f1f0d76dd6 376 jsonChar = *(parserState->json);
XinZhangMS 0:f7f1f0d76dd6 377 while ((jsonChar != '}') && (jsonChar != '\0'))
XinZhangMS 0:f7f1f0d76dd6 378 {
XinZhangMS 0:f7f1f0d76dd6 379 char* valueEnd;
XinZhangMS 0:f7f1f0d76dd6 380
XinZhangMS 0:f7f1f0d76dd6 381 /* decode each value */
XinZhangMS 0:f7f1f0d76dd6 382 result = ParseNameValuePair(parserState, currentNode);
XinZhangMS 0:f7f1f0d76dd6 383 if (result != JSON_DECODER_OK)
XinZhangMS 0:f7f1f0d76dd6 384 {
XinZhangMS 0:f7f1f0d76dd6 385 break;
XinZhangMS 0:f7f1f0d76dd6 386 }
XinZhangMS 0:f7f1f0d76dd6 387
XinZhangMS 0:f7f1f0d76dd6 388 valueEnd = parserState->json;
XinZhangMS 0:f7f1f0d76dd6 389
XinZhangMS 0:f7f1f0d76dd6 390 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 391 jsonChar = *(parserState->json);
XinZhangMS 0:f7f1f0d76dd6 392 *valueEnd = 0;
XinZhangMS 0:f7f1f0d76dd6 393
XinZhangMS 0:f7f1f0d76dd6 394 /* Codes_SRS_JSON_DECODER_99_024:[ A single comma separates a value from a following name.] */
XinZhangMS 0:f7f1f0d76dd6 395 if (jsonChar == ',')
XinZhangMS 0:f7f1f0d76dd6 396 {
XinZhangMS 0:f7f1f0d76dd6 397 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 398 /* get the next name/value pair */
XinZhangMS 0:f7f1f0d76dd6 399 }
XinZhangMS 0:f7f1f0d76dd6 400 }
XinZhangMS 0:f7f1f0d76dd6 401
XinZhangMS 0:f7f1f0d76dd6 402 if (result != JSON_DECODER_OK)
XinZhangMS 0:f7f1f0d76dd6 403 {
XinZhangMS 0:f7f1f0d76dd6 404 /* already have error */
XinZhangMS 0:f7f1f0d76dd6 405 }
XinZhangMS 0:f7f1f0d76dd6 406 else
XinZhangMS 0:f7f1f0d76dd6 407 {
XinZhangMS 0:f7f1f0d76dd6 408 if (jsonChar != '}')
XinZhangMS 0:f7f1f0d76dd6 409 {
XinZhangMS 0:f7f1f0d76dd6 410 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 411 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 412 }
XinZhangMS 0:f7f1f0d76dd6 413 else
XinZhangMS 0:f7f1f0d76dd6 414 {
XinZhangMS 0:f7f1f0d76dd6 415 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 416 }
XinZhangMS 0:f7f1f0d76dd6 417 }
XinZhangMS 0:f7f1f0d76dd6 418 }
XinZhangMS 0:f7f1f0d76dd6 419
XinZhangMS 0:f7f1f0d76dd6 420 return result;
XinZhangMS 0:f7f1f0d76dd6 421 }
XinZhangMS 0:f7f1f0d76dd6 422
XinZhangMS 0:f7f1f0d76dd6 423 static JSON_DECODER_RESULT ParseArray(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode)
XinZhangMS 0:f7f1f0d76dd6 424 {
XinZhangMS 0:f7f1f0d76dd6 425 JSON_DECODER_RESULT result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 426
XinZhangMS 0:f7f1f0d76dd6 427 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 428
XinZhangMS 0:f7f1f0d76dd6 429 /* Codes_SRS_JSON_DECODER_99_026:[ An array structure is represented as square brackets surrounding zero or more values (or elements).] */
XinZhangMS 0:f7f1f0d76dd6 430 if (*(parserState->json) != '[')
XinZhangMS 0:f7f1f0d76dd6 431 {
XinZhangMS 0:f7f1f0d76dd6 432 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 433 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 434 }
XinZhangMS 0:f7f1f0d76dd6 435 else
XinZhangMS 0:f7f1f0d76dd6 436 {
XinZhangMS 0:f7f1f0d76dd6 437 char* stringBegin;
XinZhangMS 0:f7f1f0d76dd6 438 char jsonChar;
XinZhangMS 0:f7f1f0d76dd6 439 int arrayIndex = 0;
XinZhangMS 0:f7f1f0d76dd6 440 result = JSON_DECODER_OK;
XinZhangMS 0:f7f1f0d76dd6 441
XinZhangMS 0:f7f1f0d76dd6 442 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 443
XinZhangMS 0:f7f1f0d76dd6 444 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 445
XinZhangMS 0:f7f1f0d76dd6 446 jsonChar = *parserState->json;
XinZhangMS 0:f7f1f0d76dd6 447 while ((jsonChar != ']') && (jsonChar != '\0'))
XinZhangMS 0:f7f1f0d76dd6 448 {
XinZhangMS 0:f7f1f0d76dd6 449 char arrayIndexStr[22];
XinZhangMS 0:f7f1f0d76dd6 450 MULTITREE_HANDLE childNode;
XinZhangMS 0:f7f1f0d76dd6 451
XinZhangMS 0:f7f1f0d76dd6 452 /* Codes_SRS_JSON_DECODER_99_039:[ For array elements the multi tree node name shall be the string representation of the array index.] */
XinZhangMS 0:f7f1f0d76dd6 453 if (sprintf(arrayIndexStr, "%d", arrayIndex++) < 0)
XinZhangMS 0:f7f1f0d76dd6 454 {
XinZhangMS 0:f7f1f0d76dd6 455 result = JSON_DECODER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 456 break;
XinZhangMS 0:f7f1f0d76dd6 457 }
XinZhangMS 0:f7f1f0d76dd6 458 /* Codes_SRS_JSON_DECODER_99_003:[ When a JSON element is decoded from the JSON object then a leaf shall be added to the MultiTree.] */
XinZhangMS 0:f7f1f0d76dd6 459 else if (MultiTree_AddChild(currentNode, arrayIndexStr, &childNode) != MULTITREE_OK)
XinZhangMS 0:f7f1f0d76dd6 460 {
XinZhangMS 0:f7f1f0d76dd6 461 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
XinZhangMS 0:f7f1f0d76dd6 462 result = JSON_DECODER_MULTITREE_FAILED;
XinZhangMS 0:f7f1f0d76dd6 463 }
XinZhangMS 0:f7f1f0d76dd6 464 else
XinZhangMS 0:f7f1f0d76dd6 465 {
XinZhangMS 0:f7f1f0d76dd6 466 char* valueEnd;
XinZhangMS 0:f7f1f0d76dd6 467
XinZhangMS 0:f7f1f0d76dd6 468 /* decode each value */
XinZhangMS 0:f7f1f0d76dd6 469 result = ParseValue(parserState, childNode, &stringBegin);
XinZhangMS 0:f7f1f0d76dd6 470 if (result != JSON_DECODER_OK)
XinZhangMS 0:f7f1f0d76dd6 471 {
XinZhangMS 0:f7f1f0d76dd6 472 break;
XinZhangMS 0:f7f1f0d76dd6 473 }
XinZhangMS 0:f7f1f0d76dd6 474
XinZhangMS 0:f7f1f0d76dd6 475 if (stringBegin != NULL)
XinZhangMS 0:f7f1f0d76dd6 476 {
XinZhangMS 0:f7f1f0d76dd6 477 /* Codes_SRS_JSON_DECODER_99_005:[ The leaf node added in the multi tree shall have the value the string value of the JSON element as parsed from the JSON object.] */
XinZhangMS 0:f7f1f0d76dd6 478 if (MultiTree_SetValue(childNode, stringBegin) != MULTITREE_OK)
XinZhangMS 0:f7f1f0d76dd6 479 {
XinZhangMS 0:f7f1f0d76dd6 480 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
XinZhangMS 0:f7f1f0d76dd6 481 result = JSON_DECODER_MULTITREE_FAILED;
XinZhangMS 0:f7f1f0d76dd6 482 break;
XinZhangMS 0:f7f1f0d76dd6 483 }
XinZhangMS 0:f7f1f0d76dd6 484 }
XinZhangMS 0:f7f1f0d76dd6 485
XinZhangMS 0:f7f1f0d76dd6 486 valueEnd = parserState->json;
XinZhangMS 0:f7f1f0d76dd6 487
XinZhangMS 0:f7f1f0d76dd6 488 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 489 jsonChar = *(parserState->json);
XinZhangMS 0:f7f1f0d76dd6 490 *valueEnd = 0;
XinZhangMS 0:f7f1f0d76dd6 491
XinZhangMS 0:f7f1f0d76dd6 492 /* Codes_SRS_JSON_DECODER_99_027:[ Elements are separated by commas.] */
XinZhangMS 0:f7f1f0d76dd6 493 if (jsonChar == ',')
XinZhangMS 0:f7f1f0d76dd6 494 {
XinZhangMS 0:f7f1f0d76dd6 495 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 496 /* get the next value pair */
XinZhangMS 0:f7f1f0d76dd6 497 }
XinZhangMS 0:f7f1f0d76dd6 498 else if (jsonChar == ']')
XinZhangMS 0:f7f1f0d76dd6 499 {
XinZhangMS 0:f7f1f0d76dd6 500 break;
XinZhangMS 0:f7f1f0d76dd6 501 }
XinZhangMS 0:f7f1f0d76dd6 502 else
XinZhangMS 0:f7f1f0d76dd6 503 {
XinZhangMS 0:f7f1f0d76dd6 504 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 505 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 506 break;
XinZhangMS 0:f7f1f0d76dd6 507 }
XinZhangMS 0:f7f1f0d76dd6 508 }
XinZhangMS 0:f7f1f0d76dd6 509 }
XinZhangMS 0:f7f1f0d76dd6 510
XinZhangMS 0:f7f1f0d76dd6 511 if (result != JSON_DECODER_OK)
XinZhangMS 0:f7f1f0d76dd6 512 {
XinZhangMS 0:f7f1f0d76dd6 513 /* already have error */
XinZhangMS 0:f7f1f0d76dd6 514 }
XinZhangMS 0:f7f1f0d76dd6 515 else
XinZhangMS 0:f7f1f0d76dd6 516 {
XinZhangMS 0:f7f1f0d76dd6 517 if (jsonChar != ']')
XinZhangMS 0:f7f1f0d76dd6 518 {
XinZhangMS 0:f7f1f0d76dd6 519 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 520 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 521 }
XinZhangMS 0:f7f1f0d76dd6 522 else
XinZhangMS 0:f7f1f0d76dd6 523 {
XinZhangMS 0:f7f1f0d76dd6 524 parserState->json++;
XinZhangMS 0:f7f1f0d76dd6 525 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 526 }
XinZhangMS 0:f7f1f0d76dd6 527 }
XinZhangMS 0:f7f1f0d76dd6 528 }
XinZhangMS 0:f7f1f0d76dd6 529
XinZhangMS 0:f7f1f0d76dd6 530 return result;
XinZhangMS 0:f7f1f0d76dd6 531 }
XinZhangMS 0:f7f1f0d76dd6 532
XinZhangMS 0:f7f1f0d76dd6 533 /* Codes_SRS_JSON_DECODER_99_012:[ A JSON text is a serialized object or array.] */
XinZhangMS 0:f7f1f0d76dd6 534 static JSON_DECODER_RESULT ParseObjectOrArray(PARSER_STATE* parserState, MULTITREE_HANDLE currentNode)
XinZhangMS 0:f7f1f0d76dd6 535 {
XinZhangMS 0:f7f1f0d76dd6 536 JSON_DECODER_RESULT result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 537
XinZhangMS 0:f7f1f0d76dd6 538 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 539
XinZhangMS 0:f7f1f0d76dd6 540 if (*(parserState->json) == '{')
XinZhangMS 0:f7f1f0d76dd6 541 {
XinZhangMS 0:f7f1f0d76dd6 542 result = ParseObject(parserState, currentNode);
XinZhangMS 0:f7f1f0d76dd6 543 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 544 }
XinZhangMS 0:f7f1f0d76dd6 545 else if (*(parserState->json) == '[')
XinZhangMS 0:f7f1f0d76dd6 546 {
XinZhangMS 0:f7f1f0d76dd6 547 result = ParseArray(parserState, currentNode);
XinZhangMS 0:f7f1f0d76dd6 548 SkipWhiteSpaces(parserState);
XinZhangMS 0:f7f1f0d76dd6 549 }
XinZhangMS 0:f7f1f0d76dd6 550 else
XinZhangMS 0:f7f1f0d76dd6 551 {
XinZhangMS 0:f7f1f0d76dd6 552 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 553 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 554 }
XinZhangMS 0:f7f1f0d76dd6 555
XinZhangMS 0:f7f1f0d76dd6 556 if ((result == JSON_DECODER_OK) &&
XinZhangMS 0:f7f1f0d76dd6 557 (*(parserState->json) != '\0'))
XinZhangMS 0:f7f1f0d76dd6 558 {
XinZhangMS 0:f7f1f0d76dd6 559 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 560 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 561 }
XinZhangMS 0:f7f1f0d76dd6 562
XinZhangMS 0:f7f1f0d76dd6 563 return result;
XinZhangMS 0:f7f1f0d76dd6 564 }
XinZhangMS 0:f7f1f0d76dd6 565
XinZhangMS 0:f7f1f0d76dd6 566 static JSON_DECODER_RESULT ParseJSON(char* json, MULTITREE_HANDLE currentNode)
XinZhangMS 0:f7f1f0d76dd6 567 {
XinZhangMS 0:f7f1f0d76dd6 568 /* Codes_SRS_JSON_DECODER_99_009:[ On success, JSONDecoder_JSON_To_MultiTree shall return a handle to the multi tree it created in the multiTreeHandle argument and it shall return JSON_DECODER_OK.] */
XinZhangMS 0:f7f1f0d76dd6 569 PARSER_STATE parseState;
XinZhangMS 0:f7f1f0d76dd6 570 parseState.json = json;
XinZhangMS 0:f7f1f0d76dd6 571 return ParseObjectOrArray(&parseState, currentNode);
XinZhangMS 0:f7f1f0d76dd6 572 }
XinZhangMS 0:f7f1f0d76dd6 573
XinZhangMS 0:f7f1f0d76dd6 574 JSON_DECODER_RESULT JSONDecoder_JSON_To_MultiTree(char* json, MULTITREE_HANDLE* multiTreeHandle)
XinZhangMS 0:f7f1f0d76dd6 575 {
XinZhangMS 0:f7f1f0d76dd6 576 JSON_DECODER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 577
XinZhangMS 0:f7f1f0d76dd6 578 if ((json == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 579 (multiTreeHandle == NULL))
XinZhangMS 0:f7f1f0d76dd6 580 {
XinZhangMS 0:f7f1f0d76dd6 581 /* Codes_SRS_JSON_DECODER_99_001:[ If any of the parameters passed to the JSONDecoder_JSON_To_MultiTree function is NULL then the function call shall return JSON_DECODER_INVALID_ARG.] */
XinZhangMS 0:f7f1f0d76dd6 582 result = JSON_DECODER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 583 }
XinZhangMS 0:f7f1f0d76dd6 584 else if (*json == '\0')
XinZhangMS 0:f7f1f0d76dd6 585 {
XinZhangMS 0:f7f1f0d76dd6 586 /* Codes_SRS_JSON_DECODER_99_007:[ If parsing the JSON fails due to the JSON string being malformed, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_PARSE_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 587 result = JSON_DECODER_PARSE_ERROR;
XinZhangMS 0:f7f1f0d76dd6 588 }
XinZhangMS 0:f7f1f0d76dd6 589 else
XinZhangMS 0:f7f1f0d76dd6 590 {
XinZhangMS 0:f7f1f0d76dd6 591 /* Codes_SRS_JSON_DECODER_99_008:[ JSONDecoder_JSON_To_MultiTree shall create a multi tree based on the json string argument.] */
XinZhangMS 0:f7f1f0d76dd6 592 /* Codes_SRS_JSON_DECODER_99_002:[ JSONDecoder_JSON_To_MultiTree shall use the MultiTree APIs to create the multi tree and add leafs to the multi tree.] */
XinZhangMS 0:f7f1f0d76dd6 593 /* Codes_SRS_JSON_DECODER_99_009:[ On success, JSONDecoder_JSON_To_MultiTree shall return a handle to the multi tree it created in the multiTreeHandle argument and it shall return JSON_DECODER_OK.] */
XinZhangMS 0:f7f1f0d76dd6 594 *multiTreeHandle = MultiTree_Create(NOPCloneFunction, NoFreeFunction);
XinZhangMS 0:f7f1f0d76dd6 595 if (*multiTreeHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 596 {
XinZhangMS 0:f7f1f0d76dd6 597 /* Codes_SRS_JSON_DECODER_99_038:[ If any MultiTree API fails, JSONDecoder_JSON_To_MultiTree shall return JSON_DECODER_MULTITREE_FAILED.] */
XinZhangMS 0:f7f1f0d76dd6 598 result = JSON_DECODER_MULTITREE_FAILED;
XinZhangMS 0:f7f1f0d76dd6 599 }
XinZhangMS 0:f7f1f0d76dd6 600 else
XinZhangMS 0:f7f1f0d76dd6 601 {
XinZhangMS 0:f7f1f0d76dd6 602 result = ParseJSON(json, *multiTreeHandle);
XinZhangMS 0:f7f1f0d76dd6 603 if (result != JSON_DECODER_OK)
XinZhangMS 0:f7f1f0d76dd6 604 {
XinZhangMS 0:f7f1f0d76dd6 605 MultiTree_Destroy(*multiTreeHandle);
XinZhangMS 0:f7f1f0d76dd6 606 }
XinZhangMS 0:f7f1f0d76dd6 607 }
XinZhangMS 0:f7f1f0d76dd6 608 }
XinZhangMS 0:f7f1f0d76dd6 609
XinZhangMS 0:f7f1f0d76dd6 610 return result;
XinZhangMS 0:f7f1f0d76dd6 611 }