Overview
Comment: | Allow numbers in JSON5 format. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
3e028f74796209daf1c2b4092c2ddad7 |
User & Date: | js on 2012-06-04 23:36:38 |
Other Links: | manifest | tags |
Context
2012-06-04
| ||
23:50 | JSON5: Allow strings split across multiple lines. check-in: 2002348e23 user: js tags: trunk | |
23:36 | Allow numbers in JSON5 format. check-in: 3e028f7479 user: js tags: trunk | |
22:32 | Initial JSON5 support. check-in: 54f80aba7a user: js tags: trunk | |
Changes
Modified src/OFString+JSONValue.m from [8ad19cb41d] to [81f47968cf].
︙ | ︙ | |||
353 354 355 356 357 358 359 360 361 362 363 364 | return dictionary; } static inline OFNumber* parseNumber(const char *restrict *pointer, const char *stop) { BOOL hasDecimal = NO; size_t i; OFString *string; OFNumber *number; | > | > > > | 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 | return dictionary; } static inline OFNumber* parseNumber(const char *restrict *pointer, const char *stop) { BOOL isHex = (*pointer + 1 < stop && (*pointer)[1] == 'x'); BOOL hasDecimal = NO; size_t i; OFString *string; OFNumber *number; for (i = 0; *pointer + i < stop; i++) { if ((*pointer)[i] == '.') hasDecimal = YES; if ((*pointer)[i] == ' ' || (*pointer)[i] == '\t' || (*pointer)[i] == '\r' || (*pointer)[i] == '\n' || (*pointer)[i] == ',' || (*pointer)[i] == ']' || (*pointer)[i] == '}') break; } string = [[OFString alloc] initWithUTF8String: *pointer length: i]; *pointer += i; @try { if (hasDecimal) number = [OFNumber numberWithDouble: [string doubleValue]]; else if (isHex) number = [OFNumber numberWithIntMax: [string hexadecimalValue]]; else number = [OFNumber numberWithIntMax: [string decimalValue]]; } @finally { [string release]; } |
︙ | ︙ | |||
444 445 446 447 448 449 450 451 452 453 454 455 456 457 | case '4': case '5': case '6': case '7': case '8': case '9': case '-': return parseNumber(pointer, stop); default: return nil; } } @implementation OFString (JSONValue) | > | 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 | case '4': case '5': case '6': case '7': case '8': case '9': case '-': case '.': return parseNumber(pointer, stop); default: return nil; } } @implementation OFString (JSONValue) |
︙ | ︙ |
Modified tests/OFJSONTests.m from [e8e782d6ff] to [ae9d04304d].
︙ | ︙ | |||
29 30 31 32 33 34 35 | static OFString *module = @"OFJSON"; @implementation TestsAppDelegate (JSONTests) - (void)JSONTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; | | | > | | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | static OFString *module = @"OFJSON"; @implementation TestsAppDelegate (JSONTests) - (void)JSONTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFString *s = @"{\"foo\"\t:'ba\\r', \"x\":/*foo*/ [.5\r,0xF,null//bar\n" @",\"foo\",false]}"; OFDictionary *d = [OFDictionary dictionaryWithKeysAndObjects: @"foo", @"ba\r", @"x", [OFArray arrayWithObjects: [OFNumber numberWithFloat: .5f], [OFNumber numberWithInt: 0xF], [OFNull null], @"foo", [OFNumber numberWithBool: NO], nil], nil]; TEST(@"-[JSONValue #1]", [[s JSONValue] isEqual: d]) TEST(@"-[JSONRepresentation]", [[d JSONRepresentation] isEqual: @"{\"foo\":\"ba\\r\",\"x\":[0.5,15,null,\"foo\",false]}"]) EXPECT_EXCEPTION(@"-[JSONValue #2]", OFInvalidEncodingException, [@"{" JSONValue]) EXPECT_EXCEPTION(@"-[JSONValue #3]", OFInvalidEncodingException, [@"]" JSONValue]) EXPECT_EXCEPTION(@"-[JSONValue #4]", OFInvalidEncodingException, [@"bar" JSONValue]) EXPECT_EXCEPTION(@"-[JSONValue #5]", OFInvalidEncodingException, [@"[\"a\" \"b\"]" JSONValue]) [pool drain]; } @end |