aJson is the attempt to port a complete JSON implementation to Arduino. It is based on the cJSON implementation, reduced in size and removing one or two feature. The current mbed implementation only supports FILE* as input so you will have to use a temporary file for parsing your json input. https://github.com/interactive-matter/aJson

Dependents:   WIZwikiREST20

Committer:
mimil
Date:
Tue Aug 28 08:16:29 2012 +0000
Revision:
1:6df1d1f1b372
Parent:
0:428cf9a51873
Child:
2:ece3b5c4afed
first release of aJSON library for mbed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mimil 1:6df1d1f1b372 1 /*
mimil 1:6df1d1f1b372 2 Copyright (c) 2001, Interactive Matter, Marcus Nowotny
mimil 1:6df1d1f1b372 3
mimil 1:6df1d1f1b372 4 Based on the cJSON Library, Copyright (C) 2009 Dave Gamble
mimil 1:6df1d1f1b372 5
mimil 1:6df1d1f1b372 6 Permission is hereby granted, free of charge, to any person obtaining a copy
mimil 1:6df1d1f1b372 7 of this software and associated documentation files (the "Software"), to deal
mimil 1:6df1d1f1b372 8 in the Software without restriction, including without limitation the rights
mimil 1:6df1d1f1b372 9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
mimil 1:6df1d1f1b372 10 copies of the Software, and to permit persons to whom the Software is
mimil 1:6df1d1f1b372 11 furnished to do so, subject to the following conditions:
mimil 1:6df1d1f1b372 12
mimil 1:6df1d1f1b372 13 The above copyright notice and this permission notice shall be included in
mimil 1:6df1d1f1b372 14 all copies or substantial portions of the Software.
mimil 1:6df1d1f1b372 15
mimil 1:6df1d1f1b372 16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
mimil 1:6df1d1f1b372 17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
mimil 1:6df1d1f1b372 18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
mimil 1:6df1d1f1b372 19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
mimil 1:6df1d1f1b372 20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
mimil 1:6df1d1f1b372 21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
mimil 1:6df1d1f1b372 22 THE SOFTWARE.
mimil 1:6df1d1f1b372 23 */
mimil 1:6df1d1f1b372 24
mimil 1:6df1d1f1b372 25 // aJSON
mimil 1:6df1d1f1b372 26 // aJson Library for Arduino.
mimil 1:6df1d1f1b372 27 // This library is suited for Atmega328 based Arduinos.
mimil 1:6df1d1f1b372 28 // The RAM on ATmega168 based Arduinos is too limited
mimil 1:6df1d1f1b372 29
mimil 1:6df1d1f1b372 30 /******************************************************************************
mimil 1:6df1d1f1b372 31 * Includes
mimil 1:6df1d1f1b372 32 ******************************************************************************/
mimil 1:6df1d1f1b372 33
mimil 1:6df1d1f1b372 34 #include <string.h>
mimil 1:6df1d1f1b372 35 #include <math.h>
mimil 1:6df1d1f1b372 36 #include <stdlib.h>
mimil 1:6df1d1f1b372 37 #include <float.h>
mimil 1:6df1d1f1b372 38 #include <ctype.h>
mimil 1:6df1d1f1b372 39 //#include <avr/pgmspace.h>
mimil 1:6df1d1f1b372 40 #include "aJSON.h"
mimil 1:6df1d1f1b372 41 #include "utility/streamhelper.h"
mimil 1:6df1d1f1b372 42 #include "utility/stringbuffer.h"
mimil 1:6df1d1f1b372 43
mimil 1:6df1d1f1b372 44 #include "compatibility.h"
mimil 1:6df1d1f1b372 45 #include "stdio.h"
mimil 1:6df1d1f1b372 46
mimil 1:6df1d1f1b372 47 /******************************************************************************
mimil 1:6df1d1f1b372 48 * Definitions
mimil 1:6df1d1f1b372 49 ******************************************************************************/
mimil 1:6df1d1f1b372 50 //Default buffer sizes - buffers get initialized and grow acc to that size
mimil 1:6df1d1f1b372 51 #define BUFFER_DEFAULT_SIZE 4
mimil 1:6df1d1f1b372 52
mimil 1:6df1d1f1b372 53 //how much digits after . for float
mimil 1:6df1d1f1b372 54 #define FLOAT_PRECISION 5
mimil 1:6df1d1f1b372 55
mimil 1:6df1d1f1b372 56
mimil 1:6df1d1f1b372 57
mimil 1:6df1d1f1b372 58
mimil 1:6df1d1f1b372 59
mimil 1:6df1d1f1b372 60
mimil 1:6df1d1f1b372 61 // Internal constructor.
mimil 1:6df1d1f1b372 62 aJsonObject*
mimil 1:6df1d1f1b372 63 aJsonClass::newItem()
mimil 1:6df1d1f1b372 64 {
mimil 1:6df1d1f1b372 65 aJsonObject* node = (aJsonObject*) malloc(sizeof(aJsonObject));
mimil 1:6df1d1f1b372 66 if (node)
mimil 1:6df1d1f1b372 67 memset(node, 0, sizeof(aJsonObject));
mimil 1:6df1d1f1b372 68 return node;
mimil 1:6df1d1f1b372 69 }
mimil 1:6df1d1f1b372 70
mimil 1:6df1d1f1b372 71 // Delete a aJsonObject structure.
mimil 1:6df1d1f1b372 72 void
mimil 1:6df1d1f1b372 73 aJsonClass::deleteItem(aJsonObject *c)
mimil 1:6df1d1f1b372 74 {
mimil 1:6df1d1f1b372 75 aJsonObject *next;
mimil 1:6df1d1f1b372 76 while (c)
mimil 1:6df1d1f1b372 77 {
mimil 1:6df1d1f1b372 78 next = c->next;
mimil 1:6df1d1f1b372 79 if (!(c->type & aJson_IsReference) && c->child)
mimil 1:6df1d1f1b372 80 {
mimil 1:6df1d1f1b372 81 deleteItem(c->child);
mimil 1:6df1d1f1b372 82 }
mimil 1:6df1d1f1b372 83 if ((c->type == aJson_String) && c->valuestring)
mimil 1:6df1d1f1b372 84 {
mimil 1:6df1d1f1b372 85 free(c->valuestring);
mimil 1:6df1d1f1b372 86 }
mimil 1:6df1d1f1b372 87 if (c->name)
mimil 1:6df1d1f1b372 88 {
mimil 1:6df1d1f1b372 89 free(c->name);
mimil 1:6df1d1f1b372 90 }
mimil 1:6df1d1f1b372 91 free(c);
mimil 1:6df1d1f1b372 92 c = next;
mimil 1:6df1d1f1b372 93 }
mimil 1:6df1d1f1b372 94 }
mimil 1:6df1d1f1b372 95
mimil 1:6df1d1f1b372 96 // Parse the input text to generate a number, and populate the result into item.
mimil 1:6df1d1f1b372 97 int
mimil 1:6df1d1f1b372 98 aJsonClass::parseNumber(aJsonObject *item, FILE* stream)
mimil 1:6df1d1f1b372 99 {
mimil 1:6df1d1f1b372 100 int i = 0;
mimil 1:6df1d1f1b372 101 char sign = 1;
mimil 1:6df1d1f1b372 102
mimil 1:6df1d1f1b372 103 int in = fgetc(stream);
mimil 1:6df1d1f1b372 104 if (in == EOF)
mimil 1:6df1d1f1b372 105 {
mimil 1:6df1d1f1b372 106 return EOF;
mimil 1:6df1d1f1b372 107 }
mimil 1:6df1d1f1b372 108 // It is easier to decode ourselves than to use sscnaf,
mimil 1:6df1d1f1b372 109 // since so we can easier decide between int & double
mimil 1:6df1d1f1b372 110 if (in == '-')
mimil 1:6df1d1f1b372 111 {
mimil 1:6df1d1f1b372 112 //it is a negative number
mimil 1:6df1d1f1b372 113 sign = -1;
mimil 1:6df1d1f1b372 114 in = fgetc(stream);
mimil 1:6df1d1f1b372 115 if (in == EOF)
mimil 1:6df1d1f1b372 116 {
mimil 1:6df1d1f1b372 117 return EOF;
mimil 1:6df1d1f1b372 118 }
mimil 1:6df1d1f1b372 119 }
mimil 1:6df1d1f1b372 120 if (in >= '0' && in <= '9')
mimil 1:6df1d1f1b372 121 do
mimil 1:6df1d1f1b372 122 {
mimil 1:6df1d1f1b372 123 i = (i * 10) + (in - '0');
mimil 1:6df1d1f1b372 124 in = fgetc(stream);
mimil 1:6df1d1f1b372 125 }
mimil 1:6df1d1f1b372 126 while (in >= '0' && in <= '9'); // Number?
mimil 1:6df1d1f1b372 127 //end of integer part &#65533; or isn't it?
mimil 1:6df1d1f1b372 128 if (!(in == '.' || in == 'e' || in == 'E'))
mimil 1:6df1d1f1b372 129 {
mimil 1:6df1d1f1b372 130 item->valueint = i * (int) sign;
mimil 1:6df1d1f1b372 131 item->type = aJson_Int;
mimil 1:6df1d1f1b372 132 }
mimil 1:6df1d1f1b372 133 //ok it seems to be a double
mimil 1:6df1d1f1b372 134 else
mimil 1:6df1d1f1b372 135 {
mimil 1:6df1d1f1b372 136 double n = (double) i;
mimil 1:6df1d1f1b372 137 int scale = 0;
mimil 1:6df1d1f1b372 138 int subscale = 0;
mimil 1:6df1d1f1b372 139 char signsubscale = 1;
mimil 1:6df1d1f1b372 140 if (in == '.')
mimil 1:6df1d1f1b372 141 {
mimil 1:6df1d1f1b372 142 in = fgetc(stream);
mimil 1:6df1d1f1b372 143 do
mimil 1:6df1d1f1b372 144 {
mimil 1:6df1d1f1b372 145 n = (n * 10.0) + (in - '0'), scale--;
mimil 1:6df1d1f1b372 146 in = fgetc(stream);
mimil 1:6df1d1f1b372 147 }
mimil 1:6df1d1f1b372 148 while (in >= '0' && in <= '9');
mimil 1:6df1d1f1b372 149 } // Fractional part?
mimil 1:6df1d1f1b372 150 if (in == 'e' || in == 'E') // Exponent?
mimil 1:6df1d1f1b372 151 {
mimil 1:6df1d1f1b372 152 in = fgetc(stream);
mimil 1:6df1d1f1b372 153 if (in == '+')
mimil 1:6df1d1f1b372 154 {
mimil 1:6df1d1f1b372 155 in = fgetc(stream);
mimil 1:6df1d1f1b372 156 }
mimil 1:6df1d1f1b372 157 else if (in == '-')
mimil 1:6df1d1f1b372 158 {
mimil 1:6df1d1f1b372 159 signsubscale = -1;
mimil 1:6df1d1f1b372 160 in = fgetc(stream);
mimil 1:6df1d1f1b372 161 }
mimil 1:6df1d1f1b372 162 while (in >= '0' && in <= '9')
mimil 1:6df1d1f1b372 163 {
mimil 1:6df1d1f1b372 164 subscale = (subscale * 10) + (in - '0'); // Number?
mimil 1:6df1d1f1b372 165 in = fgetc(stream);
mimil 1:6df1d1f1b372 166 }
mimil 1:6df1d1f1b372 167 }
mimil 1:6df1d1f1b372 168
mimil 1:6df1d1f1b372 169 n = sign * n * pow(10.0, ((double) scale + (double) subscale
mimil 1:6df1d1f1b372 170 * (double) signsubscale)); // number = +/- number.fraction * 10^+/- exponent
mimil 1:6df1d1f1b372 171
mimil 1:6df1d1f1b372 172 item->valuefloat = n;
mimil 1:6df1d1f1b372 173 item->type = aJson_Float;
mimil 1:6df1d1f1b372 174 }
mimil 1:6df1d1f1b372 175 //preserve the last character for the next routine
mimil 1:6df1d1f1b372 176 ungetc(in, stream);
mimil 1:6df1d1f1b372 177 return 0;
mimil 1:6df1d1f1b372 178 }
mimil 1:6df1d1f1b372 179
mimil 1:6df1d1f1b372 180 // Render the number nicely from the given item into a string.
mimil 1:6df1d1f1b372 181 int
mimil 1:6df1d1f1b372 182 aJsonClass::printInt(aJsonObject *item, FILE* stream)
mimil 1:6df1d1f1b372 183 {
mimil 1:6df1d1f1b372 184 if (item != NULL)
mimil 1:6df1d1f1b372 185 {
mimil 1:6df1d1f1b372 186 return fprintf_P(stream, PSTR("%d"), item->valueint);
mimil 1:6df1d1f1b372 187 }
mimil 1:6df1d1f1b372 188 //printing nothing is ok
mimil 1:6df1d1f1b372 189 return 0;
mimil 1:6df1d1f1b372 190 }
mimil 1:6df1d1f1b372 191
mimil 1:6df1d1f1b372 192 int
mimil 1:6df1d1f1b372 193 aJsonClass::printFloat(aJsonObject *item, FILE* stream)
mimil 1:6df1d1f1b372 194 {
mimil 1:6df1d1f1b372 195 if (item != NULL)
mimil 1:6df1d1f1b372 196 {
mimil 1:6df1d1f1b372 197 double d = item->valuefloat;
mimil 1:6df1d1f1b372 198 if (d<0.0) {
mimil 1:6df1d1f1b372 199 fprintf_P(stream,PSTR("-"));
mimil 1:6df1d1f1b372 200 d=-d;
mimil 1:6df1d1f1b372 201 }
mimil 1:6df1d1f1b372 202 //print the integer part
mimil 1:6df1d1f1b372 203 unsigned long integer_number = (unsigned long)d;
mimil 1:6df1d1f1b372 204 fprintf_P(stream,PSTR("%u."),integer_number);
mimil 1:6df1d1f1b372 205 //print the fractional part
mimil 1:6df1d1f1b372 206 double fractional_part = d - ((double)integer_number);
mimil 1:6df1d1f1b372 207 //we do a do-while since we want to print at least one zero
mimil 1:6df1d1f1b372 208 //we just support a certain number of digits after the '.'
mimil 1:6df1d1f1b372 209 int n = FLOAT_PRECISION;
mimil 1:6df1d1f1b372 210 fractional_part += 0.5/pow(10.0, FLOAT_PRECISION);
mimil 1:6df1d1f1b372 211 do {
mimil 1:6df1d1f1b372 212 //make the first digit non fractional(shift it before the '.'
mimil 1:6df1d1f1b372 213 fractional_part *= 10.0;
mimil 1:6df1d1f1b372 214 //create an int out of it
mimil 1:6df1d1f1b372 215 unsigned int digit = (unsigned int) fractional_part;
mimil 1:6df1d1f1b372 216 //print it
mimil 1:6df1d1f1b372 217 fprintf_P(stream,PSTR("%u"),digit);
mimil 1:6df1d1f1b372 218 //remove it from the number
mimil 1:6df1d1f1b372 219 fractional_part -= (double)digit;
mimil 1:6df1d1f1b372 220 n--;
mimil 1:6df1d1f1b372 221 } while ((fractional_part!=0) && (n>0));
mimil 1:6df1d1f1b372 222 }
mimil 1:6df1d1f1b372 223 //printing nothing is ok
mimil 1:6df1d1f1b372 224 return 0;
mimil 1:6df1d1f1b372 225 }
mimil 1:6df1d1f1b372 226
mimil 1:6df1d1f1b372 227 // Parse the input text into an unescaped cstring, and populate item.
mimil 1:6df1d1f1b372 228 int
mimil 1:6df1d1f1b372 229 aJsonClass::parseString(aJsonObject *item, FILE* stream)
mimil 1:6df1d1f1b372 230 {
mimil 1:6df1d1f1b372 231 //we do not need to skip here since the first byte should be '\"'
mimil 1:6df1d1f1b372 232 int in = fgetc(stream);
mimil 1:6df1d1f1b372 233 if (in != '\"')
mimil 1:6df1d1f1b372 234 {
mimil 1:6df1d1f1b372 235 return EOF; // not a string!
mimil 1:6df1d1f1b372 236 }
mimil 1:6df1d1f1b372 237 item->type = aJson_String;
mimil 1:6df1d1f1b372 238 //allocate a buffer & track how long it is and how much we have read
mimil 1:6df1d1f1b372 239 string_buffer* buffer = stringBufferCreate();
mimil 1:6df1d1f1b372 240 if (buffer == NULL)
mimil 1:6df1d1f1b372 241 {
mimil 1:6df1d1f1b372 242 //unable to allocate the string
mimil 1:6df1d1f1b372 243 return EOF;
mimil 1:6df1d1f1b372 244 }
mimil 1:6df1d1f1b372 245 in = fgetc(stream);
mimil 1:6df1d1f1b372 246 if (in == EOF)
mimil 1:6df1d1f1b372 247 {
mimil 1:6df1d1f1b372 248 stringBufferFree(buffer);
mimil 1:6df1d1f1b372 249 return EOF;
mimil 1:6df1d1f1b372 250 }
mimil 1:6df1d1f1b372 251 while (in != EOF)
mimil 1:6df1d1f1b372 252 {
mimil 1:6df1d1f1b372 253 while (in != '\"' && in >= 32)
mimil 1:6df1d1f1b372 254 {
mimil 1:6df1d1f1b372 255 if (in != '\\')
mimil 1:6df1d1f1b372 256 {
mimil 1:6df1d1f1b372 257 stringBufferAdd((char) in, buffer);
mimil 1:6df1d1f1b372 258 }
mimil 1:6df1d1f1b372 259 else
mimil 1:6df1d1f1b372 260 {
mimil 1:6df1d1f1b372 261 in = fgetc(stream);
mimil 1:6df1d1f1b372 262 if (in == EOF)
mimil 1:6df1d1f1b372 263 {
mimil 1:6df1d1f1b372 264 stringBufferFree(buffer);
mimil 1:6df1d1f1b372 265 return EOF;
mimil 1:6df1d1f1b372 266 }
mimil 1:6df1d1f1b372 267 switch (in)
mimil 1:6df1d1f1b372 268 {
mimil 1:6df1d1f1b372 269 case '\\':
mimil 1:6df1d1f1b372 270 stringBufferAdd('\\', buffer);
mimil 1:6df1d1f1b372 271 break;
mimil 1:6df1d1f1b372 272 case '\"':
mimil 1:6df1d1f1b372 273 stringBufferAdd('\"', buffer);
mimil 1:6df1d1f1b372 274 break;
mimil 1:6df1d1f1b372 275 case 'b':
mimil 1:6df1d1f1b372 276 stringBufferAdd('\b', buffer);
mimil 1:6df1d1f1b372 277 break;
mimil 1:6df1d1f1b372 278 case 'f':
mimil 1:6df1d1f1b372 279 stringBufferAdd('\f', buffer);
mimil 1:6df1d1f1b372 280 break;
mimil 1:6df1d1f1b372 281 case 'n':
mimil 1:6df1d1f1b372 282 stringBufferAdd('\n', buffer);
mimil 1:6df1d1f1b372 283 break;
mimil 1:6df1d1f1b372 284 case 'r':
mimil 1:6df1d1f1b372 285 stringBufferAdd('\r', buffer);
mimil 1:6df1d1f1b372 286 break;
mimil 1:6df1d1f1b372 287 case 't':
mimil 1:6df1d1f1b372 288 stringBufferAdd('\t', buffer);
mimil 1:6df1d1f1b372 289 break;
mimil 1:6df1d1f1b372 290 default:
mimil 1:6df1d1f1b372 291 //we do not understand it so we skip it
mimil 1:6df1d1f1b372 292 break;
mimil 1:6df1d1f1b372 293 }
mimil 1:6df1d1f1b372 294 }
mimil 1:6df1d1f1b372 295 in = fgetc(stream);
mimil 1:6df1d1f1b372 296 if (in == EOF)
mimil 1:6df1d1f1b372 297 {
mimil 1:6df1d1f1b372 298 stringBufferFree(buffer);
mimil 1:6df1d1f1b372 299 return EOF;
mimil 1:6df1d1f1b372 300 }
mimil 1:6df1d1f1b372 301 }
mimil 1:6df1d1f1b372 302 //the string ends here
mimil 1:6df1d1f1b372 303 item->valuestring = stringBufferToString(buffer);
mimil 1:6df1d1f1b372 304 return 0;
mimil 1:6df1d1f1b372 305 }
mimil 1:6df1d1f1b372 306 //we should not be here but it is ok
mimil 1:6df1d1f1b372 307 return 0;
mimil 1:6df1d1f1b372 308 }
mimil 1:6df1d1f1b372 309
mimil 1:6df1d1f1b372 310 // Render the cstring provided to an escaped version that can be printed.
mimil 1:6df1d1f1b372 311 int
mimil 1:6df1d1f1b372 312 aJsonClass::printStringPtr(const char *str, FILE* stream)
mimil 1:6df1d1f1b372 313 {
mimil 1:6df1d1f1b372 314 if (fputc('\"', stream) == EOF)
mimil 1:6df1d1f1b372 315 {
mimil 1:6df1d1f1b372 316 return EOF;
mimil 1:6df1d1f1b372 317 }
mimil 1:6df1d1f1b372 318 char* ptr = (char*) str;
mimil 1:6df1d1f1b372 319 if (ptr != NULL)
mimil 1:6df1d1f1b372 320 {
mimil 1:6df1d1f1b372 321 while (*ptr != 0)
mimil 1:6df1d1f1b372 322 {
mimil 1:6df1d1f1b372 323 if ((unsigned char) *ptr > 31 && *ptr != '\"' && *ptr != '\\')
mimil 1:6df1d1f1b372 324 {
mimil 1:6df1d1f1b372 325 if (fputc(*ptr, stream) == EOF)
mimil 1:6df1d1f1b372 326 {
mimil 1:6df1d1f1b372 327 return EOF;
mimil 1:6df1d1f1b372 328 }
mimil 1:6df1d1f1b372 329 ptr++;
mimil 1:6df1d1f1b372 330 }
mimil 1:6df1d1f1b372 331 else
mimil 1:6df1d1f1b372 332 {
mimil 1:6df1d1f1b372 333 if (fputc('\\', stream) == EOF)
mimil 1:6df1d1f1b372 334 {
mimil 1:6df1d1f1b372 335 return EOF;
mimil 1:6df1d1f1b372 336 }
mimil 1:6df1d1f1b372 337 switch (*ptr++)
mimil 1:6df1d1f1b372 338 {
mimil 1:6df1d1f1b372 339 case '\\':
mimil 1:6df1d1f1b372 340 if (fputc('\\', stream) == EOF)
mimil 1:6df1d1f1b372 341 {
mimil 1:6df1d1f1b372 342 return EOF;
mimil 1:6df1d1f1b372 343 }
mimil 1:6df1d1f1b372 344 break;
mimil 1:6df1d1f1b372 345 case '\"':
mimil 1:6df1d1f1b372 346 if (fputc('\"', stream) == EOF)
mimil 1:6df1d1f1b372 347 {
mimil 1:6df1d1f1b372 348 return EOF;
mimil 1:6df1d1f1b372 349 }
mimil 1:6df1d1f1b372 350 break;
mimil 1:6df1d1f1b372 351 case '\b':
mimil 1:6df1d1f1b372 352 if (fputc('b', stream) == EOF)
mimil 1:6df1d1f1b372 353 {
mimil 1:6df1d1f1b372 354 return EOF;
mimil 1:6df1d1f1b372 355 }
mimil 1:6df1d1f1b372 356 break;
mimil 1:6df1d1f1b372 357 case '\f':
mimil 1:6df1d1f1b372 358 if (fputc('f', stream) == EOF)
mimil 1:6df1d1f1b372 359 {
mimil 1:6df1d1f1b372 360 return EOF;
mimil 1:6df1d1f1b372 361 }
mimil 1:6df1d1f1b372 362 break;
mimil 1:6df1d1f1b372 363 case '\n':
mimil 1:6df1d1f1b372 364 if (fputc('n', stream) == EOF)
mimil 1:6df1d1f1b372 365 {
mimil 1:6df1d1f1b372 366 return EOF;
mimil 1:6df1d1f1b372 367 }
mimil 1:6df1d1f1b372 368 break;
mimil 1:6df1d1f1b372 369 case '\r':
mimil 1:6df1d1f1b372 370 if (fputc('r', stream) == EOF)
mimil 1:6df1d1f1b372 371 {
mimil 1:6df1d1f1b372 372 return EOF;
mimil 1:6df1d1f1b372 373 }
mimil 1:6df1d1f1b372 374 break;
mimil 1:6df1d1f1b372 375 case '\t':
mimil 1:6df1d1f1b372 376 if (fputc('t', stream) == EOF)
mimil 1:6df1d1f1b372 377 {
mimil 1:6df1d1f1b372 378 return EOF;
mimil 1:6df1d1f1b372 379 }
mimil 1:6df1d1f1b372 380 break;
mimil 1:6df1d1f1b372 381 default:
mimil 1:6df1d1f1b372 382 break; // eviscerate with prejudice.
mimil 1:6df1d1f1b372 383 }
mimil 1:6df1d1f1b372 384 }
mimil 1:6df1d1f1b372 385
mimil 1:6df1d1f1b372 386 }
mimil 1:6df1d1f1b372 387 }
mimil 1:6df1d1f1b372 388 if (fputc('\"', stream) == EOF)
mimil 1:6df1d1f1b372 389 {
mimil 1:6df1d1f1b372 390 return EOF;
mimil 1:6df1d1f1b372 391 }
mimil 1:6df1d1f1b372 392 return 0;
mimil 1:6df1d1f1b372 393 }
mimil 1:6df1d1f1b372 394
mimil 1:6df1d1f1b372 395 // Invote print_string_ptr (which is useful) on an item.
mimil 1:6df1d1f1b372 396 int
mimil 1:6df1d1f1b372 397 aJsonClass::printString(aJsonObject *item, FILE* stream)
mimil 1:6df1d1f1b372 398 {
mimil 1:6df1d1f1b372 399 return printStringPtr(item->valuestring, stream);
mimil 1:6df1d1f1b372 400 }
mimil 1:6df1d1f1b372 401
mimil 1:6df1d1f1b372 402 // Utility to jump whitespace and cr/lf
mimil 1:6df1d1f1b372 403 int
mimil 1:6df1d1f1b372 404 aJsonClass::skip(FILE* stream)
mimil 1:6df1d1f1b372 405 {
mimil 1:6df1d1f1b372 406 if (stream == NULL)
mimil 1:6df1d1f1b372 407 {
mimil 1:6df1d1f1b372 408 return EOF;
mimil 1:6df1d1f1b372 409 }
mimil 1:6df1d1f1b372 410 int in = fgetc(stream);
mimil 1:6df1d1f1b372 411 while (in != EOF && (in <= 32))
mimil 1:6df1d1f1b372 412 {
mimil 1:6df1d1f1b372 413 in = fgetc(stream);
mimil 1:6df1d1f1b372 414 }
mimil 1:6df1d1f1b372 415 if (in != EOF)
mimil 1:6df1d1f1b372 416 {
mimil 1:6df1d1f1b372 417 if (ungetc(in, stream) == EOF)
mimil 1:6df1d1f1b372 418 {
mimil 1:6df1d1f1b372 419 return EOF;
mimil 1:6df1d1f1b372 420 }
mimil 1:6df1d1f1b372 421 return 0;
mimil 1:6df1d1f1b372 422 }
mimil 1:6df1d1f1b372 423 return EOF;
mimil 1:6df1d1f1b372 424 }
mimil 1:6df1d1f1b372 425
mimil 1:6df1d1f1b372 426 // Parse an object - create a new root, and populate.
mimil 1:6df1d1f1b372 427 /*aJsonObject*
mimil 1:6df1d1f1b372 428 aJsonClass::parse(char *value)
mimil 1:6df1d1f1b372 429 {
mimil 1:6df1d1f1b372 430 FILE* string_input_stream = openStringInputStream(value);
mimil 1:6df1d1f1b372 431 aJsonObject* result = parse(string_input_stream, NULL);
mimil 1:6df1d1f1b372 432 closeStringInputStream(string_input_stream);
mimil 1:6df1d1f1b372 433 return result;
mimil 1:6df1d1f1b372 434 }*/
mimil 1:6df1d1f1b372 435
mimil 1:6df1d1f1b372 436 // Parse an object - create a new root, and populate.
mimil 1:6df1d1f1b372 437 aJsonObject*
mimil 1:6df1d1f1b372 438 aJsonClass::parse(FILE* stream)
mimil 1:6df1d1f1b372 439 {
mimil 1:6df1d1f1b372 440 return parse(stream, NULL);
mimil 1:6df1d1f1b372 441 }
mimil 1:6df1d1f1b372 442
mimil 1:6df1d1f1b372 443 // Parse an object - create a new root, and populate.
mimil 1:6df1d1f1b372 444 aJsonObject*
mimil 1:6df1d1f1b372 445 aJsonClass::parse(FILE* stream, char** filter)
mimil 1:6df1d1f1b372 446 {
mimil 1:6df1d1f1b372 447 if (stream == NULL)
mimil 1:6df1d1f1b372 448 {
mimil 1:6df1d1f1b372 449 return NULL;
mimil 1:6df1d1f1b372 450 }
mimil 1:6df1d1f1b372 451 aJsonObject *c = newItem();
mimil 1:6df1d1f1b372 452 if (!c)
mimil 1:6df1d1f1b372 453 return NULL; /* memory fail */
mimil 1:6df1d1f1b372 454
mimil 1:6df1d1f1b372 455 skip(stream);
mimil 1:6df1d1f1b372 456 if (parseValue(c, stream, filter) == EOF)
mimil 1:6df1d1f1b372 457 {
mimil 1:6df1d1f1b372 458 deleteItem(c);
mimil 1:6df1d1f1b372 459 return NULL;
mimil 1:6df1d1f1b372 460 }
mimil 1:6df1d1f1b372 461 return c;
mimil 1:6df1d1f1b372 462 }
mimil 1:6df1d1f1b372 463
mimil 1:6df1d1f1b372 464 // Render a aJsonObject item/entity/structure to text.
mimil 1:6df1d1f1b372 465 int
mimil 1:6df1d1f1b372 466 aJsonClass::print(aJsonObject* item, FILE* stream)
mimil 1:6df1d1f1b372 467 {
mimil 1:6df1d1f1b372 468 return printValue(item, stream);
mimil 1:6df1d1f1b372 469 }
mimil 1:6df1d1f1b372 470
mimil 1:6df1d1f1b372 471 /*char*
mimil 1:6df1d1f1b372 472 aJsonClass::print(aJsonObject* item)
mimil 1:6df1d1f1b372 473 {
mimil 1:6df1d1f1b372 474 FILE* stream = openStringOutputStream();
mimil 1:6df1d1f1b372 475 if (stream == NULL)
mimil 1:6df1d1f1b372 476 {
mimil 1:6df1d1f1b372 477 return NULL;
mimil 1:6df1d1f1b372 478 }
mimil 1:6df1d1f1b372 479 print(item, stream);
mimil 1:6df1d1f1b372 480 return closeStringOutputStream(stream);
mimil 1:6df1d1f1b372 481 }*/
mimil 1:6df1d1f1b372 482
mimil 1:6df1d1f1b372 483 // Parser core - when encountering text, process appropriately.
mimil 1:6df1d1f1b372 484 int
mimil 1:6df1d1f1b372 485 aJsonClass::parseValue(aJsonObject *item, FILE* stream, char** filter)
mimil 1:6df1d1f1b372 486 {
mimil 1:6df1d1f1b372 487 if (stream == NULL)
mimil 1:6df1d1f1b372 488 {
mimil 1:6df1d1f1b372 489 return EOF; // Fail on null.
mimil 1:6df1d1f1b372 490 }
mimil 1:6df1d1f1b372 491 if (skip(stream) == EOF)
mimil 1:6df1d1f1b372 492 {
mimil 1:6df1d1f1b372 493 return EOF;
mimil 1:6df1d1f1b372 494 }
mimil 1:6df1d1f1b372 495 //read the first byte from the stream
mimil 1:6df1d1f1b372 496 int in = fgetc(stream);
mimil 1:6df1d1f1b372 497 if (in == EOF)
mimil 1:6df1d1f1b372 498 {
mimil 1:6df1d1f1b372 499 return EOF;
mimil 1:6df1d1f1b372 500 }
mimil 1:6df1d1f1b372 501 if (ungetc(in, stream) == EOF)
mimil 1:6df1d1f1b372 502 {
mimil 1:6df1d1f1b372 503 return EOF;
mimil 1:6df1d1f1b372 504 }
mimil 1:6df1d1f1b372 505 if (in == '\"')
mimil 1:6df1d1f1b372 506 {
mimil 1:6df1d1f1b372 507 return parseString(item, stream);
mimil 1:6df1d1f1b372 508 }
mimil 1:6df1d1f1b372 509 else if (in == '-' || (in >= '0' && in <= '9'))
mimil 1:6df1d1f1b372 510 {
mimil 1:6df1d1f1b372 511 return parseNumber(item, stream);
mimil 1:6df1d1f1b372 512 }
mimil 1:6df1d1f1b372 513 else if (in == '[')
mimil 1:6df1d1f1b372 514 {
mimil 1:6df1d1f1b372 515 return parseArray(item, stream, filter);
mimil 1:6df1d1f1b372 516 }
mimil 1:6df1d1f1b372 517 else if (in == '{')
mimil 1:6df1d1f1b372 518 {
mimil 1:6df1d1f1b372 519 return parseObject(item, stream, filter);
mimil 1:6df1d1f1b372 520 }
mimil 1:6df1d1f1b372 521 //it can only be null, false or true
mimil 1:6df1d1f1b372 522 else if (in == 'n')
mimil 1:6df1d1f1b372 523 {
mimil 1:6df1d1f1b372 524 //a buffer to read the value
mimil 1:6df1d1f1b372 525 char buffer[] =
mimil 1:6df1d1f1b372 526 { 0, 0, 0, 0 };
mimil 1:6df1d1f1b372 527 if (fread(buffer, sizeof(char), 4, stream) != 4)
mimil 1:6df1d1f1b372 528 {
mimil 1:6df1d1f1b372 529 return EOF;
mimil 1:6df1d1f1b372 530 }
mimil 1:6df1d1f1b372 531 if (!strncmp(buffer, "null", 4))
mimil 1:6df1d1f1b372 532 {
mimil 1:6df1d1f1b372 533 item->type = aJson_NULL;
mimil 1:6df1d1f1b372 534 return 0;
mimil 1:6df1d1f1b372 535 }
mimil 1:6df1d1f1b372 536 else
mimil 1:6df1d1f1b372 537 {
mimil 1:6df1d1f1b372 538 return EOF;
mimil 1:6df1d1f1b372 539 }
mimil 1:6df1d1f1b372 540 }
mimil 1:6df1d1f1b372 541 else if (in == 'f')
mimil 1:6df1d1f1b372 542 {
mimil 1:6df1d1f1b372 543 //a buffer to read the value
mimil 1:6df1d1f1b372 544 char buffer[] =
mimil 1:6df1d1f1b372 545 { 0, 0, 0, 0, 0 };
mimil 1:6df1d1f1b372 546 if (fread(buffer, sizeof(char), 5, stream) != 5)
mimil 1:6df1d1f1b372 547 {
mimil 1:6df1d1f1b372 548 return EOF;
mimil 1:6df1d1f1b372 549 }
mimil 1:6df1d1f1b372 550 if (!strncmp(buffer, "false", 5))
mimil 1:6df1d1f1b372 551 {
mimil 1:6df1d1f1b372 552 item->type = aJson_False;
mimil 1:6df1d1f1b372 553 item->valuebool = 0;
mimil 1:6df1d1f1b372 554 return 0;
mimil 1:6df1d1f1b372 555 }
mimil 1:6df1d1f1b372 556 }
mimil 1:6df1d1f1b372 557 else if (in == 't')
mimil 1:6df1d1f1b372 558 {
mimil 1:6df1d1f1b372 559 //a buffer to read the value
mimil 1:6df1d1f1b372 560 char buffer[] =
mimil 1:6df1d1f1b372 561 { 0, 0, 0, 0 };
mimil 1:6df1d1f1b372 562 if (fread(buffer, sizeof(char), 4, stream) != 4)
mimil 1:6df1d1f1b372 563 {
mimil 1:6df1d1f1b372 564 return EOF;
mimil 1:6df1d1f1b372 565 }
mimil 1:6df1d1f1b372 566 if (!strncmp(buffer, "true", 4))
mimil 1:6df1d1f1b372 567 {
mimil 1:6df1d1f1b372 568 item->type = aJson_True;
mimil 1:6df1d1f1b372 569 item->valuebool = -1;
mimil 1:6df1d1f1b372 570 return 0;
mimil 1:6df1d1f1b372 571 }
mimil 1:6df1d1f1b372 572 }
mimil 1:6df1d1f1b372 573
mimil 1:6df1d1f1b372 574 return EOF; // failure.
mimil 1:6df1d1f1b372 575 }
mimil 1:6df1d1f1b372 576
mimil 1:6df1d1f1b372 577 // Render a value to text.
mimil 1:6df1d1f1b372 578 int
mimil 1:6df1d1f1b372 579 aJsonClass::printValue(aJsonObject *item, FILE* stream)
mimil 1:6df1d1f1b372 580 {
mimil 1:6df1d1f1b372 581 int result = 0;
mimil 1:6df1d1f1b372 582 if (item == NULL)
mimil 1:6df1d1f1b372 583 {
mimil 1:6df1d1f1b372 584 //nothing to do
mimil 1:6df1d1f1b372 585 return 0;
mimil 1:6df1d1f1b372 586 }
mimil 1:6df1d1f1b372 587 switch (item->type)
mimil 1:6df1d1f1b372 588 {
mimil 1:6df1d1f1b372 589 case aJson_NULL:
mimil 1:6df1d1f1b372 590 result = fprintf_P(stream, PSTR("null"));
mimil 1:6df1d1f1b372 591 break;
mimil 1:6df1d1f1b372 592 case aJson_False:
mimil 1:6df1d1f1b372 593 result = fprintf_P(stream, PSTR("false"));
mimil 1:6df1d1f1b372 594 break;
mimil 1:6df1d1f1b372 595 case aJson_True:
mimil 1:6df1d1f1b372 596 result = fprintf_P(stream, PSTR("true"));
mimil 1:6df1d1f1b372 597 break;
mimil 1:6df1d1f1b372 598 case aJson_Int:
mimil 1:6df1d1f1b372 599 result = printInt(item, stream);
mimil 1:6df1d1f1b372 600 break;
mimil 1:6df1d1f1b372 601 case aJson_Float:
mimil 1:6df1d1f1b372 602 result = printFloat(item, stream);
mimil 1:6df1d1f1b372 603 break;
mimil 1:6df1d1f1b372 604 case aJson_String:
mimil 1:6df1d1f1b372 605 result = printString(item, stream);
mimil 1:6df1d1f1b372 606 break;
mimil 1:6df1d1f1b372 607 case aJson_Array:
mimil 1:6df1d1f1b372 608 result = printArray(item, stream);
mimil 1:6df1d1f1b372 609 break;
mimil 1:6df1d1f1b372 610 case aJson_Object:
mimil 1:6df1d1f1b372 611 result = printObject(item, stream);
mimil 1:6df1d1f1b372 612 break;
mimil 1:6df1d1f1b372 613 }
mimil 1:6df1d1f1b372 614 //good time to flush the stream
mimil 1:6df1d1f1b372 615 fflush(stream);
mimil 1:6df1d1f1b372 616 return result;
mimil 1:6df1d1f1b372 617 }
mimil 1:6df1d1f1b372 618
mimil 1:6df1d1f1b372 619 // Build an array from input text.
mimil 1:6df1d1f1b372 620 int
mimil 1:6df1d1f1b372 621 aJsonClass::parseArray(aJsonObject *item, FILE* stream, char** filter)
mimil 1:6df1d1f1b372 622 {
mimil 1:6df1d1f1b372 623 int in = fgetc(stream);
mimil 1:6df1d1f1b372 624 if (in != '[')
mimil 1:6df1d1f1b372 625 {
mimil 1:6df1d1f1b372 626 return EOF; // not an array!
mimil 1:6df1d1f1b372 627 }
mimil 1:6df1d1f1b372 628
mimil 1:6df1d1f1b372 629 item->type = aJson_Array;
mimil 1:6df1d1f1b372 630 skip(stream);
mimil 1:6df1d1f1b372 631 in = fgetc(stream);
mimil 1:6df1d1f1b372 632 //check for empty array
mimil 1:6df1d1f1b372 633 if (in == ']')
mimil 1:6df1d1f1b372 634 {
mimil 1:6df1d1f1b372 635 return 0; // empty array.
mimil 1:6df1d1f1b372 636 }
mimil 1:6df1d1f1b372 637 //now put back the last character
mimil 1:6df1d1f1b372 638 ungetc(in, stream);
mimil 1:6df1d1f1b372 639 aJsonObject *child;
mimil 1:6df1d1f1b372 640 char first = -1;
mimil 1:6df1d1f1b372 641 while ((first) || (in == ','))
mimil 1:6df1d1f1b372 642 {
mimil 1:6df1d1f1b372 643 aJsonObject *new_item = newItem();
mimil 1:6df1d1f1b372 644 if (new_item == NULL)
mimil 1:6df1d1f1b372 645 {
mimil 1:6df1d1f1b372 646 return EOF; // memory fail
mimil 1:6df1d1f1b372 647 }
mimil 1:6df1d1f1b372 648 if (first)
mimil 1:6df1d1f1b372 649 {
mimil 1:6df1d1f1b372 650 item->child = new_item;
mimil 1:6df1d1f1b372 651 first = 0;
mimil 1:6df1d1f1b372 652 }
mimil 1:6df1d1f1b372 653 else
mimil 1:6df1d1f1b372 654 {
mimil 1:6df1d1f1b372 655 child->next = new_item;
mimil 1:6df1d1f1b372 656 new_item->prev = child;
mimil 1:6df1d1f1b372 657 }
mimil 1:6df1d1f1b372 658 child = new_item;
mimil 1:6df1d1f1b372 659 skip(stream);
mimil 1:6df1d1f1b372 660 if (parseValue(child, stream, filter))
mimil 1:6df1d1f1b372 661 {
mimil 1:6df1d1f1b372 662 return EOF;
mimil 1:6df1d1f1b372 663 }
mimil 1:6df1d1f1b372 664 skip(stream);
mimil 1:6df1d1f1b372 665 in = fgetc(stream);
mimil 1:6df1d1f1b372 666 }
mimil 1:6df1d1f1b372 667 if (in == ']')
mimil 1:6df1d1f1b372 668 {
mimil 1:6df1d1f1b372 669 return 0; // end of array
mimil 1:6df1d1f1b372 670 }
mimil 1:6df1d1f1b372 671 else
mimil 1:6df1d1f1b372 672 {
mimil 1:6df1d1f1b372 673 return EOF; // malformed.
mimil 1:6df1d1f1b372 674 }
mimil 1:6df1d1f1b372 675 }
mimil 1:6df1d1f1b372 676
mimil 1:6df1d1f1b372 677 // Render an array to text
mimil 1:6df1d1f1b372 678 int
mimil 1:6df1d1f1b372 679 aJsonClass::printArray(aJsonObject *item, FILE* stream)
mimil 1:6df1d1f1b372 680 {
mimil 1:6df1d1f1b372 681 if (item == NULL)
mimil 1:6df1d1f1b372 682 {
mimil 1:6df1d1f1b372 683 //nothing to do
mimil 1:6df1d1f1b372 684 return 0;
mimil 1:6df1d1f1b372 685 }
mimil 1:6df1d1f1b372 686 aJsonObject *child = item->child;
mimil 1:6df1d1f1b372 687 if (fputc('[', stream) == EOF)
mimil 1:6df1d1f1b372 688 {
mimil 1:6df1d1f1b372 689 return EOF;
mimil 1:6df1d1f1b372 690 }
mimil 1:6df1d1f1b372 691 while (child)
mimil 1:6df1d1f1b372 692 {
mimil 1:6df1d1f1b372 693 if (printValue(child, stream) == EOF)
mimil 1:6df1d1f1b372 694 {
mimil 1:6df1d1f1b372 695 return EOF;
mimil 1:6df1d1f1b372 696 }
mimil 1:6df1d1f1b372 697 child = child->next;
mimil 1:6df1d1f1b372 698 if (child)
mimil 1:6df1d1f1b372 699 {
mimil 1:6df1d1f1b372 700 if (fputc(',', stream) == EOF)
mimil 1:6df1d1f1b372 701 {
mimil 1:6df1d1f1b372 702 return EOF;
mimil 1:6df1d1f1b372 703 }
mimil 1:6df1d1f1b372 704 }
mimil 1:6df1d1f1b372 705 }
mimil 1:6df1d1f1b372 706 if (fputc(']', stream) == EOF)
mimil 1:6df1d1f1b372 707 {
mimil 1:6df1d1f1b372 708 return EOF;
mimil 1:6df1d1f1b372 709 }
mimil 1:6df1d1f1b372 710 return 0;
mimil 1:6df1d1f1b372 711 }
mimil 1:6df1d1f1b372 712
mimil 1:6df1d1f1b372 713 // Build an object from the text.
mimil 1:6df1d1f1b372 714 int
mimil 1:6df1d1f1b372 715 aJsonClass::parseObject(aJsonObject *item, FILE* stream, char** filter)
mimil 1:6df1d1f1b372 716 {
mimil 1:6df1d1f1b372 717 int in = fgetc(stream);
mimil 1:6df1d1f1b372 718 if (in != '{')
mimil 1:6df1d1f1b372 719 {
mimil 1:6df1d1f1b372 720 return EOF; // not an object!
mimil 1:6df1d1f1b372 721 }
mimil 1:6df1d1f1b372 722
mimil 1:6df1d1f1b372 723 item->type = aJson_Object;
mimil 1:6df1d1f1b372 724 skip(stream);
mimil 1:6df1d1f1b372 725 //check for an empty object
mimil 1:6df1d1f1b372 726 in = fgetc(stream);
mimil 1:6df1d1f1b372 727 if (in == '}')
mimil 1:6df1d1f1b372 728 {
mimil 1:6df1d1f1b372 729 return 0; // empty object.
mimil 1:6df1d1f1b372 730 }
mimil 1:6df1d1f1b372 731 //preserve the char for the next parser
mimil 1:6df1d1f1b372 732 ungetc(in, stream);
mimil 1:6df1d1f1b372 733
mimil 1:6df1d1f1b372 734 aJsonObject* child;
mimil 1:6df1d1f1b372 735 char first = -1;
mimil 1:6df1d1f1b372 736 while ((first) || (in == ','))
mimil 1:6df1d1f1b372 737 {
mimil 1:6df1d1f1b372 738 //in = fgetc(stream);
mimil 1:6df1d1f1b372 739 aJsonObject* new_item = newItem();
mimil 1:6df1d1f1b372 740 if (new_item == NULL)
mimil 1:6df1d1f1b372 741 {
mimil 1:6df1d1f1b372 742 return EOF; // memory fail
mimil 1:6df1d1f1b372 743 }
mimil 1:6df1d1f1b372 744 if (first)
mimil 1:6df1d1f1b372 745 {
mimil 1:6df1d1f1b372 746 first = 0;
mimil 1:6df1d1f1b372 747 item->child = new_item;
mimil 1:6df1d1f1b372 748 }
mimil 1:6df1d1f1b372 749 else
mimil 1:6df1d1f1b372 750 {
mimil 1:6df1d1f1b372 751 child->next = new_item;
mimil 1:6df1d1f1b372 752 new_item->prev = child;
mimil 1:6df1d1f1b372 753 }
mimil 1:6df1d1f1b372 754 child = new_item;
mimil 1:6df1d1f1b372 755 skip(stream);
mimil 1:6df1d1f1b372 756 if (parseString(child, stream) == EOF)
mimil 1:6df1d1f1b372 757 {
mimil 1:6df1d1f1b372 758 return EOF;
mimil 1:6df1d1f1b372 759 }
mimil 1:6df1d1f1b372 760 skip(stream);
mimil 1:6df1d1f1b372 761 child->name = child->valuestring;
mimil 1:6df1d1f1b372 762 child->valuestring = NULL;
mimil 1:6df1d1f1b372 763
mimil 1:6df1d1f1b372 764 in = fgetc(stream);
mimil 1:6df1d1f1b372 765 if (in != ':')
mimil 1:6df1d1f1b372 766 {
mimil 1:6df1d1f1b372 767 return EOF; // fail!
mimil 1:6df1d1f1b372 768 }
mimil 1:6df1d1f1b372 769 // skip any spacing, get the value.
mimil 1:6df1d1f1b372 770 skip(stream);
mimil 1:6df1d1f1b372 771 if (parseValue(child, stream, filter) == EOF)
mimil 1:6df1d1f1b372 772 {
mimil 1:6df1d1f1b372 773 return EOF;
mimil 1:6df1d1f1b372 774 }
mimil 1:6df1d1f1b372 775 in = fgetc(stream);
mimil 1:6df1d1f1b372 776 }
mimil 1:6df1d1f1b372 777
mimil 1:6df1d1f1b372 778 if (in == '}')
mimil 1:6df1d1f1b372 779 {
mimil 1:6df1d1f1b372 780 return 0; // end of array
mimil 1:6df1d1f1b372 781 }
mimil 1:6df1d1f1b372 782 else
mimil 1:6df1d1f1b372 783 {
mimil 1:6df1d1f1b372 784 return EOF; // malformed.
mimil 1:6df1d1f1b372 785 }
mimil 1:6df1d1f1b372 786 }
mimil 1:6df1d1f1b372 787
mimil 1:6df1d1f1b372 788 // Render an object to text.
mimil 1:6df1d1f1b372 789 int
mimil 1:6df1d1f1b372 790 aJsonClass::printObject(aJsonObject *item, FILE* stream)
mimil 1:6df1d1f1b372 791 {
mimil 1:6df1d1f1b372 792 if (item == NULL)
mimil 1:6df1d1f1b372 793 {
mimil 1:6df1d1f1b372 794 //nothing to do
mimil 1:6df1d1f1b372 795 return 0;
mimil 1:6df1d1f1b372 796 }
mimil 1:6df1d1f1b372 797 aJsonObject *child = item->child;
mimil 1:6df1d1f1b372 798 if (fputc('{', stream) == EOF)
mimil 1:6df1d1f1b372 799 {
mimil 1:6df1d1f1b372 800 return EOF;
mimil 1:6df1d1f1b372 801 }
mimil 1:6df1d1f1b372 802 while (child)
mimil 1:6df1d1f1b372 803 {
mimil 1:6df1d1f1b372 804 if (printStringPtr(child->name, stream) == EOF)
mimil 1:6df1d1f1b372 805 {
mimil 1:6df1d1f1b372 806 return EOF;
mimil 1:6df1d1f1b372 807 }
mimil 1:6df1d1f1b372 808 if (fputc(':', stream) == EOF)
mimil 1:6df1d1f1b372 809 {
mimil 1:6df1d1f1b372 810 return EOF;
mimil 1:6df1d1f1b372 811 }
mimil 1:6df1d1f1b372 812 if (printValue(child, stream) == EOF)
mimil 1:6df1d1f1b372 813 {
mimil 1:6df1d1f1b372 814 return EOF;
mimil 1:6df1d1f1b372 815 }
mimil 1:6df1d1f1b372 816 child = child->next;
mimil 1:6df1d1f1b372 817 if (child)
mimil 1:6df1d1f1b372 818 {
mimil 1:6df1d1f1b372 819 if (fputc(',', stream) == EOF)
mimil 1:6df1d1f1b372 820 {
mimil 1:6df1d1f1b372 821 return EOF;
mimil 1:6df1d1f1b372 822 }
mimil 1:6df1d1f1b372 823 }
mimil 1:6df1d1f1b372 824 }
mimil 1:6df1d1f1b372 825 if (fputc('}', stream) == EOF)
mimil 1:6df1d1f1b372 826 {
mimil 1:6df1d1f1b372 827 return EOF;
mimil 1:6df1d1f1b372 828 }
mimil 1:6df1d1f1b372 829 return 0;
mimil 1:6df1d1f1b372 830 }
mimil 1:6df1d1f1b372 831
mimil 1:6df1d1f1b372 832 // Get Array size/item / object item.
mimil 1:6df1d1f1b372 833 unsigned char
mimil 1:6df1d1f1b372 834 aJsonClass::getArraySize(aJsonObject *array)
mimil 1:6df1d1f1b372 835 {
mimil 1:6df1d1f1b372 836 aJsonObject *c = array->child;
mimil 1:6df1d1f1b372 837 unsigned char i = 0;
mimil 1:6df1d1f1b372 838 while (c)
mimil 1:6df1d1f1b372 839 i++, c = c->next;
mimil 1:6df1d1f1b372 840 return i;
mimil 1:6df1d1f1b372 841 }
mimil 1:6df1d1f1b372 842 aJsonObject*
mimil 1:6df1d1f1b372 843 aJsonClass::getArrayItem(aJsonObject *array, unsigned char item)
mimil 1:6df1d1f1b372 844 {
mimil 1:6df1d1f1b372 845 aJsonObject *c = array->child;
mimil 1:6df1d1f1b372 846 while (c && item > 0)
mimil 1:6df1d1f1b372 847 item--, c = c->next;
mimil 1:6df1d1f1b372 848 return c;
mimil 1:6df1d1f1b372 849 }
mimil 1:6df1d1f1b372 850 aJsonObject*
mimil 1:6df1d1f1b372 851 aJsonClass::getObjectItem(aJsonObject *object, const char *string)
mimil 1:6df1d1f1b372 852 {
mimil 1:6df1d1f1b372 853 aJsonObject *c = object->child;
mimil 1:6df1d1f1b372 854 while (c && strcasecmp(c->name, string))
mimil 1:6df1d1f1b372 855 c = c->next;
mimil 1:6df1d1f1b372 856 return c;
mimil 1:6df1d1f1b372 857 }
mimil 1:6df1d1f1b372 858
mimil 1:6df1d1f1b372 859 // Utility for array list handling.
mimil 1:6df1d1f1b372 860 void
mimil 1:6df1d1f1b372 861 aJsonClass::suffixObject(aJsonObject *prev, aJsonObject *item)
mimil 1:6df1d1f1b372 862 {
mimil 1:6df1d1f1b372 863 prev->next = item;
mimil 1:6df1d1f1b372 864 item->prev = prev;
mimil 1:6df1d1f1b372 865 }
mimil 1:6df1d1f1b372 866 // Utility for handling references.
mimil 1:6df1d1f1b372 867 aJsonObject*
mimil 1:6df1d1f1b372 868 aJsonClass::createReference(aJsonObject *item)
mimil 1:6df1d1f1b372 869 {
mimil 1:6df1d1f1b372 870 aJsonObject *ref = newItem();
mimil 1:6df1d1f1b372 871 if (!ref)
mimil 1:6df1d1f1b372 872 return 0;
mimil 1:6df1d1f1b372 873 memcpy(ref, item, sizeof(aJsonObject));
mimil 1:6df1d1f1b372 874 ref->name = 0;
mimil 1:6df1d1f1b372 875 ref->type |= aJson_IsReference;
mimil 1:6df1d1f1b372 876 ref->next = ref->prev = 0;
mimil 1:6df1d1f1b372 877 return ref;
mimil 1:6df1d1f1b372 878 }
mimil 1:6df1d1f1b372 879
mimil 1:6df1d1f1b372 880 // Add item to array/object.
mimil 1:6df1d1f1b372 881 void
mimil 1:6df1d1f1b372 882 aJsonClass::addItemToArray(aJsonObject *array, aJsonObject *item)
mimil 1:6df1d1f1b372 883 {
mimil 1:6df1d1f1b372 884 aJsonObject *c = array->child;
mimil 1:6df1d1f1b372 885 if (!item)
mimil 1:6df1d1f1b372 886 return;
mimil 1:6df1d1f1b372 887 if (!c)
mimil 1:6df1d1f1b372 888 {
mimil 1:6df1d1f1b372 889 array->child = item;
mimil 1:6df1d1f1b372 890 }
mimil 1:6df1d1f1b372 891 else
mimil 1:6df1d1f1b372 892 {
mimil 1:6df1d1f1b372 893 while (c && c->next)
mimil 1:6df1d1f1b372 894 c = c->next;
mimil 1:6df1d1f1b372 895 suffixObject(c, item);
mimil 1:6df1d1f1b372 896 }
mimil 1:6df1d1f1b372 897 }
mimil 1:6df1d1f1b372 898 void
mimil 1:6df1d1f1b372 899 aJsonClass::addItemToObject(aJsonObject *object, const char *string,
mimil 1:6df1d1f1b372 900 aJsonObject *item)
mimil 1:6df1d1f1b372 901 {
mimil 1:6df1d1f1b372 902 if (!item)
mimil 1:6df1d1f1b372 903 return;
mimil 1:6df1d1f1b372 904 if (item->name)
mimil 1:6df1d1f1b372 905 free(item->name);
mimil 1:6df1d1f1b372 906 item->name = strdup(string);
mimil 1:6df1d1f1b372 907 addItemToArray(object, item);
mimil 1:6df1d1f1b372 908 }
mimil 1:6df1d1f1b372 909 void
mimil 1:6df1d1f1b372 910 aJsonClass::addItemReferenceToArray(aJsonObject *array, aJsonObject *item)
mimil 1:6df1d1f1b372 911 {
mimil 1:6df1d1f1b372 912 addItemToArray(array, createReference(item));
mimil 1:6df1d1f1b372 913 }
mimil 1:6df1d1f1b372 914 void
mimil 1:6df1d1f1b372 915 aJsonClass::addItemReferenceToObject(aJsonObject *object, const char *string,
mimil 1:6df1d1f1b372 916 aJsonObject *item)
mimil 1:6df1d1f1b372 917 {
mimil 1:6df1d1f1b372 918 addItemToObject(object, string, createReference(item));
mimil 1:6df1d1f1b372 919 }
mimil 1:6df1d1f1b372 920
mimil 1:6df1d1f1b372 921 aJsonObject*
mimil 1:6df1d1f1b372 922 aJsonClass::detachItemFromArray(aJsonObject *array, unsigned char which)
mimil 1:6df1d1f1b372 923 {
mimil 1:6df1d1f1b372 924 aJsonObject *c = array->child;
mimil 1:6df1d1f1b372 925 while (c && which > 0)
mimil 1:6df1d1f1b372 926 c = c->next, which--;
mimil 1:6df1d1f1b372 927 if (!c)
mimil 1:6df1d1f1b372 928 return 0;
mimil 1:6df1d1f1b372 929 if (c->prev)
mimil 1:6df1d1f1b372 930 c->prev->next = c->next;
mimil 1:6df1d1f1b372 931 if (c->next)
mimil 1:6df1d1f1b372 932 c->next->prev = c->prev;
mimil 1:6df1d1f1b372 933 if (c == array->child)
mimil 1:6df1d1f1b372 934 array->child = c->next;
mimil 1:6df1d1f1b372 935 c->prev = c->next = 0;
mimil 1:6df1d1f1b372 936 return c;
mimil 1:6df1d1f1b372 937 }
mimil 1:6df1d1f1b372 938 void
mimil 1:6df1d1f1b372 939 aJsonClass::deleteItemFromArray(aJsonObject *array, unsigned char which)
mimil 1:6df1d1f1b372 940 {
mimil 1:6df1d1f1b372 941 deleteItem(detachItemFromArray(array, which));
mimil 1:6df1d1f1b372 942 }
mimil 1:6df1d1f1b372 943 aJsonObject*
mimil 1:6df1d1f1b372 944 aJsonClass::detachItemFromObject(aJsonObject *object, const char *string)
mimil 1:6df1d1f1b372 945 {
mimil 1:6df1d1f1b372 946 unsigned char i = 0;
mimil 1:6df1d1f1b372 947 aJsonObject *c = object->child;
mimil 1:6df1d1f1b372 948 while (c && strcasecmp(c->name, string))
mimil 1:6df1d1f1b372 949 i++, c = c->next;
mimil 1:6df1d1f1b372 950 if (c)
mimil 1:6df1d1f1b372 951 return detachItemFromArray(object, i);
mimil 1:6df1d1f1b372 952 return 0;
mimil 1:6df1d1f1b372 953 }
mimil 1:6df1d1f1b372 954 void
mimil 1:6df1d1f1b372 955 aJsonClass::deleteItemFromObject(aJsonObject *object, const char *string)
mimil 1:6df1d1f1b372 956 {
mimil 1:6df1d1f1b372 957 deleteItem(detachItemFromObject(object, string));
mimil 1:6df1d1f1b372 958 }
mimil 1:6df1d1f1b372 959
mimil 1:6df1d1f1b372 960 // Replace array/object items with new ones.
mimil 1:6df1d1f1b372 961 void
mimil 1:6df1d1f1b372 962 aJsonClass::replaceItemInArray(aJsonObject *array, unsigned char which,
mimil 1:6df1d1f1b372 963 aJsonObject *newitem)
mimil 1:6df1d1f1b372 964 {
mimil 1:6df1d1f1b372 965 aJsonObject *c = array->child;
mimil 1:6df1d1f1b372 966 while (c && which > 0)
mimil 1:6df1d1f1b372 967 c = c->next, which--;
mimil 1:6df1d1f1b372 968 if (!c)
mimil 1:6df1d1f1b372 969 return;
mimil 1:6df1d1f1b372 970 newitem->next = c->next;
mimil 1:6df1d1f1b372 971 newitem->prev = c->prev;
mimil 1:6df1d1f1b372 972 if (newitem->next)
mimil 1:6df1d1f1b372 973 newitem->next->prev = newitem;
mimil 1:6df1d1f1b372 974 if (c == array->child)
mimil 1:6df1d1f1b372 975 array->child = newitem;
mimil 1:6df1d1f1b372 976 else
mimil 1:6df1d1f1b372 977 newitem->prev->next = newitem;
mimil 1:6df1d1f1b372 978 c->next = c->prev = 0;
mimil 1:6df1d1f1b372 979 deleteItem(c);
mimil 1:6df1d1f1b372 980 }
mimil 1:6df1d1f1b372 981 void
mimil 1:6df1d1f1b372 982 aJsonClass::replaceItemInObject(aJsonObject *object, const char *string,
mimil 1:6df1d1f1b372 983 aJsonObject *newitem)
mimil 1:6df1d1f1b372 984 {
mimil 1:6df1d1f1b372 985 unsigned char i = 0;
mimil 1:6df1d1f1b372 986 aJsonObject *c = object->child;
mimil 1:6df1d1f1b372 987 while (c && strcasecmp(c->name, string))
mimil 1:6df1d1f1b372 988 i++, c = c->next;
mimil 1:6df1d1f1b372 989 if (c)
mimil 1:6df1d1f1b372 990 {
mimil 1:6df1d1f1b372 991 newitem->name = strdup(string);
mimil 1:6df1d1f1b372 992 replaceItemInArray(object, i, newitem);
mimil 1:6df1d1f1b372 993 }
mimil 1:6df1d1f1b372 994 }
mimil 1:6df1d1f1b372 995
mimil 1:6df1d1f1b372 996 // Create basic types:
mimil 1:6df1d1f1b372 997 aJsonObject*
mimil 1:6df1d1f1b372 998 aJsonClass::createNull()
mimil 1:6df1d1f1b372 999 {
mimil 1:6df1d1f1b372 1000 aJsonObject *item = newItem();
mimil 1:6df1d1f1b372 1001 if (item)
mimil 1:6df1d1f1b372 1002 item->type = aJson_NULL;
mimil 1:6df1d1f1b372 1003 return item;
mimil 1:6df1d1f1b372 1004 }
mimil 1:6df1d1f1b372 1005
mimil 1:6df1d1f1b372 1006 aJsonObject*
mimil 1:6df1d1f1b372 1007 aJsonClass::createTrue()
mimil 1:6df1d1f1b372 1008 {
mimil 1:6df1d1f1b372 1009 aJsonObject *item = newItem();
mimil 1:6df1d1f1b372 1010 if (item)
mimil 1:6df1d1f1b372 1011 {
mimil 1:6df1d1f1b372 1012 item->type = aJson_True;
mimil 1:6df1d1f1b372 1013 item->valuebool = -1;
mimil 1:6df1d1f1b372 1014 }
mimil 1:6df1d1f1b372 1015 return item;
mimil 1:6df1d1f1b372 1016 }
mimil 1:6df1d1f1b372 1017 aJsonObject*
mimil 1:6df1d1f1b372 1018 aJsonClass::createFalse()
mimil 1:6df1d1f1b372 1019 {
mimil 1:6df1d1f1b372 1020 aJsonObject *item = newItem();
mimil 1:6df1d1f1b372 1021 if (item)
mimil 1:6df1d1f1b372 1022 {
mimil 1:6df1d1f1b372 1023 item->type = aJson_False;
mimil 1:6df1d1f1b372 1024 item->valuebool = 0;
mimil 1:6df1d1f1b372 1025 }
mimil 1:6df1d1f1b372 1026 return item;
mimil 1:6df1d1f1b372 1027 }
mimil 1:6df1d1f1b372 1028 aJsonObject*
mimil 1:6df1d1f1b372 1029 aJsonClass::createItem(char b)
mimil 1:6df1d1f1b372 1030 {
mimil 1:6df1d1f1b372 1031 aJsonObject *item = newItem();
mimil 1:6df1d1f1b372 1032 if (item)
mimil 1:6df1d1f1b372 1033 {
mimil 1:6df1d1f1b372 1034 item->type = b ? aJson_True : aJson_False;
mimil 1:6df1d1f1b372 1035 item->valuebool = b ? -1 : 0;
mimil 1:6df1d1f1b372 1036 }
mimil 1:6df1d1f1b372 1037 return item;
mimil 1:6df1d1f1b372 1038 }
mimil 1:6df1d1f1b372 1039
mimil 1:6df1d1f1b372 1040 aJsonObject*
mimil 1:6df1d1f1b372 1041 aJsonClass::createItem(int num)
mimil 1:6df1d1f1b372 1042 {
mimil 1:6df1d1f1b372 1043 aJsonObject *item = newItem();
mimil 1:6df1d1f1b372 1044 if (item)
mimil 1:6df1d1f1b372 1045 {
mimil 1:6df1d1f1b372 1046 item->type = aJson_Int;
mimil 1:6df1d1f1b372 1047 item->valueint = (int) num;
mimil 1:6df1d1f1b372 1048 }
mimil 1:6df1d1f1b372 1049 return item;
mimil 1:6df1d1f1b372 1050 }
mimil 1:6df1d1f1b372 1051
mimil 1:6df1d1f1b372 1052 aJsonObject*
mimil 1:6df1d1f1b372 1053 aJsonClass::createItem(double num)
mimil 1:6df1d1f1b372 1054 {
mimil 1:6df1d1f1b372 1055 aJsonObject *item = newItem();
mimil 1:6df1d1f1b372 1056 if (item)
mimil 1:6df1d1f1b372 1057 {
mimil 1:6df1d1f1b372 1058 item->type = aJson_Float;
mimil 1:6df1d1f1b372 1059 item->valuefloat = num;
mimil 1:6df1d1f1b372 1060 }
mimil 1:6df1d1f1b372 1061 return item;
mimil 1:6df1d1f1b372 1062 }
mimil 1:6df1d1f1b372 1063
mimil 1:6df1d1f1b372 1064 aJsonObject*
mimil 1:6df1d1f1b372 1065 aJsonClass::createItem(const char *string)
mimil 1:6df1d1f1b372 1066 {
mimil 1:6df1d1f1b372 1067 aJsonObject *item = newItem();
mimil 1:6df1d1f1b372 1068 if (item)
mimil 1:6df1d1f1b372 1069 {
mimil 1:6df1d1f1b372 1070 item->type = aJson_String;
mimil 1:6df1d1f1b372 1071 item->valuestring = strdup(string);
mimil 1:6df1d1f1b372 1072 }
mimil 1:6df1d1f1b372 1073 return item;
mimil 1:6df1d1f1b372 1074 }
mimil 1:6df1d1f1b372 1075
mimil 1:6df1d1f1b372 1076 aJsonObject*
mimil 1:6df1d1f1b372 1077 aJsonClass::createArray()
mimil 1:6df1d1f1b372 1078 {
mimil 1:6df1d1f1b372 1079 aJsonObject *item = newItem();
mimil 1:6df1d1f1b372 1080 if (item)
mimil 1:6df1d1f1b372 1081 item->type = aJson_Array;
mimil 1:6df1d1f1b372 1082 return item;
mimil 1:6df1d1f1b372 1083 }
mimil 1:6df1d1f1b372 1084 aJsonObject*
mimil 1:6df1d1f1b372 1085 aJsonClass::createObject()
mimil 1:6df1d1f1b372 1086 {
mimil 1:6df1d1f1b372 1087 aJsonObject *item = newItem();
mimil 1:6df1d1f1b372 1088 if (item)
mimil 1:6df1d1f1b372 1089 item->type = aJson_Object;
mimil 1:6df1d1f1b372 1090 return item;
mimil 1:6df1d1f1b372 1091 }
mimil 1:6df1d1f1b372 1092
mimil 1:6df1d1f1b372 1093 // Create Arrays:
mimil 1:6df1d1f1b372 1094 aJsonObject*
mimil 1:6df1d1f1b372 1095 aJsonClass::createIntArray(int *numbers, unsigned char count)
mimil 1:6df1d1f1b372 1096 {
mimil 1:6df1d1f1b372 1097 unsigned char i;
mimil 1:6df1d1f1b372 1098 aJsonObject *n = 0, *p = 0, *a = createArray();
mimil 1:6df1d1f1b372 1099 for (i = 0; a && i < count; i++)
mimil 1:6df1d1f1b372 1100 {
mimil 1:6df1d1f1b372 1101 n = createItem(numbers[i]);
mimil 1:6df1d1f1b372 1102 if (!i)
mimil 1:6df1d1f1b372 1103 a->child = n;
mimil 1:6df1d1f1b372 1104 else
mimil 1:6df1d1f1b372 1105 suffixObject(p, n);
mimil 1:6df1d1f1b372 1106 p = n;
mimil 1:6df1d1f1b372 1107 }
mimil 1:6df1d1f1b372 1108 return a;
mimil 1:6df1d1f1b372 1109 }
mimil 1:6df1d1f1b372 1110
mimil 1:6df1d1f1b372 1111 aJsonObject*
mimil 1:6df1d1f1b372 1112 aJsonClass::createFloatArray(double *numbers, unsigned char count)
mimil 1:6df1d1f1b372 1113 {
mimil 1:6df1d1f1b372 1114 unsigned char i;
mimil 1:6df1d1f1b372 1115 aJsonObject *n = 0, *p = 0, *a = createArray();
mimil 1:6df1d1f1b372 1116 for (i = 0; a && i < count; i++)
mimil 1:6df1d1f1b372 1117 {
mimil 1:6df1d1f1b372 1118 n = createItem(numbers[i]);
mimil 1:6df1d1f1b372 1119 if (!i)
mimil 1:6df1d1f1b372 1120 a->child = n;
mimil 1:6df1d1f1b372 1121 else
mimil 1:6df1d1f1b372 1122 suffixObject(p, n);
mimil 1:6df1d1f1b372 1123 p = n;
mimil 1:6df1d1f1b372 1124 }
mimil 1:6df1d1f1b372 1125 return a;
mimil 1:6df1d1f1b372 1126 }
mimil 1:6df1d1f1b372 1127
mimil 1:6df1d1f1b372 1128 aJsonObject*
mimil 1:6df1d1f1b372 1129 aJsonClass::createDoubleArray(double *numbers, unsigned char count)
mimil 1:6df1d1f1b372 1130 {
mimil 1:6df1d1f1b372 1131 unsigned char i;
mimil 1:6df1d1f1b372 1132 aJsonObject *n = 0, *p = 0, *a = createArray();
mimil 1:6df1d1f1b372 1133 for (i = 0; a && i < count; i++)
mimil 1:6df1d1f1b372 1134 {
mimil 1:6df1d1f1b372 1135 n = createItem(numbers[i]);
mimil 1:6df1d1f1b372 1136 if (!i)
mimil 1:6df1d1f1b372 1137 a->child = n;
mimil 1:6df1d1f1b372 1138 else
mimil 1:6df1d1f1b372 1139 suffixObject(p, n);
mimil 1:6df1d1f1b372 1140 p = n;
mimil 1:6df1d1f1b372 1141 }
mimil 1:6df1d1f1b372 1142 return a;
mimil 1:6df1d1f1b372 1143 }
mimil 1:6df1d1f1b372 1144
mimil 1:6df1d1f1b372 1145 aJsonObject*
mimil 1:6df1d1f1b372 1146 aJsonClass::createStringArray(const char **strings, unsigned char count)
mimil 1:6df1d1f1b372 1147 {
mimil 1:6df1d1f1b372 1148 unsigned char i;
mimil 1:6df1d1f1b372 1149 aJsonObject *n = 0, *p = 0, *a = createArray();
mimil 1:6df1d1f1b372 1150 for (i = 0; a && i < count; i++)
mimil 1:6df1d1f1b372 1151 {
mimil 1:6df1d1f1b372 1152 n = createItem(strings[i]);
mimil 1:6df1d1f1b372 1153 if (!i)
mimil 1:6df1d1f1b372 1154 a->child = n;
mimil 1:6df1d1f1b372 1155 else
mimil 1:6df1d1f1b372 1156 suffixObject(p, n);
mimil 1:6df1d1f1b372 1157 p = n;
mimil 1:6df1d1f1b372 1158 }
mimil 1:6df1d1f1b372 1159 return a;
mimil 1:6df1d1f1b372 1160 }
mimil 1:6df1d1f1b372 1161
mimil 1:6df1d1f1b372 1162 void
mimil 1:6df1d1f1b372 1163 aJsonClass::addNullToObject(aJsonObject* object, const char* name)
mimil 1:6df1d1f1b372 1164 {
mimil 1:6df1d1f1b372 1165 addItemToObject(object, name, createNull());
mimil 1:6df1d1f1b372 1166 }
mimil 1:6df1d1f1b372 1167
mimil 1:6df1d1f1b372 1168 void
mimil 1:6df1d1f1b372 1169 aJsonClass::addTrueToObject(aJsonObject* object, const char* name)
mimil 1:6df1d1f1b372 1170 {
mimil 1:6df1d1f1b372 1171 addItemToObject(object, name, createTrue());
mimil 1:6df1d1f1b372 1172 }
mimil 1:6df1d1f1b372 1173
mimil 1:6df1d1f1b372 1174 void
mimil 1:6df1d1f1b372 1175 aJsonClass::addFalseToObject(aJsonObject* object, const char* name)
mimil 1:6df1d1f1b372 1176 {
mimil 1:6df1d1f1b372 1177 addItemToObject(object, name, createFalse());
mimil 1:6df1d1f1b372 1178 }
mimil 1:6df1d1f1b372 1179
mimil 1:6df1d1f1b372 1180 void
mimil 1:6df1d1f1b372 1181 aJsonClass::addNumberToObject(aJsonObject* object, const char* name, int n)
mimil 1:6df1d1f1b372 1182 {
mimil 1:6df1d1f1b372 1183 addItemToObject(object, name, createItem(n));
mimil 1:6df1d1f1b372 1184 }
mimil 1:6df1d1f1b372 1185
mimil 1:6df1d1f1b372 1186 void
mimil 1:6df1d1f1b372 1187 aJsonClass::addNumberToObject(aJsonObject* object, const char* name, double n)
mimil 1:6df1d1f1b372 1188 {
mimil 1:6df1d1f1b372 1189 addItemToObject(object, name, createItem(n));
mimil 1:6df1d1f1b372 1190 }
mimil 1:6df1d1f1b372 1191
mimil 1:6df1d1f1b372 1192 void
mimil 1:6df1d1f1b372 1193 aJsonClass::addStringToObject(aJsonObject* object, const char* name,
mimil 1:6df1d1f1b372 1194 const char* s)
mimil 1:6df1d1f1b372 1195 {
mimil 1:6df1d1f1b372 1196 addItemToObject(object, name, createItem(s));
mimil 1:6df1d1f1b372 1197 }
mimil 1:6df1d1f1b372 1198
mimil 1:6df1d1f1b372 1199 //TODO conversion routines btw. float & int types?
mimil 1:6df1d1f1b372 1200
mimil 1:6df1d1f1b372 1201 aJsonClass aJson;