load.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. /*
  2. * Copyright (c) 2009-2011 Petri Lehtinen <petri@digip.org>
  3. *
  4. * Jansson is free software; you can redistribute it and/or modify
  5. * it under the terms of the MIT license. See LICENSE for details.
  6. */
  7. #define _GNU_SOURCE
  8. #include <ctype.h>
  9. #include <errno.h>
  10. #include <limits.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <assert.h>
  15. #include <jansson.h>
  16. #include "jansson_private.h"
  17. #include "strbuffer.h"
  18. #include "utf.h"
  19. #define STREAM_STATE_OK 0
  20. #define STREAM_STATE_EOF -1
  21. #define STREAM_STATE_ERROR -2
  22. #define TOKEN_INVALID -1
  23. #define TOKEN_EOF 0
  24. #define TOKEN_STRING 256
  25. #define TOKEN_INTEGER 257
  26. #define TOKEN_REAL 258
  27. #define TOKEN_TRUE 259
  28. #define TOKEN_FALSE 260
  29. #define TOKEN_NULL 261
  30. /* Read one byte from stream, convert to unsigned char, then int, and
  31. return. return EOF on end of file. This corresponds to the
  32. behaviour of fgetc(). */
  33. typedef int (*get_func)(void *data);
  34. typedef struct {
  35. get_func get;
  36. void *data;
  37. char buffer[5];
  38. int buffer_pos;
  39. int state;
  40. int line;
  41. int column, last_column;
  42. size_t position;
  43. } stream_t;
  44. typedef struct {
  45. stream_t stream;
  46. strbuffer_t saved_text;
  47. int token;
  48. union {
  49. char *string;
  50. json_int_t integer;
  51. double real;
  52. } value;
  53. } lex_t;
  54. #define stream_to_lex(stream) container_of(stream, lex_t, stream)
  55. /*** error reporting ***/
  56. static void error_set(json_error_t *error, const lex_t *lex,
  57. const char *msg, ...)
  58. {
  59. va_list ap;
  60. char msg_text[JSON_ERROR_TEXT_LENGTH];
  61. int line = -1, col = -1;
  62. size_t pos = 0;
  63. const char *result = msg_text;
  64. if(!error)
  65. return;
  66. va_start(ap, msg);
  67. vsnprintf(msg_text, JSON_ERROR_TEXT_LENGTH, msg, ap);
  68. va_end(ap);
  69. if(lex)
  70. {
  71. const char *saved_text = strbuffer_value(&lex->saved_text);
  72. char msg_with_context[JSON_ERROR_TEXT_LENGTH];
  73. line = lex->stream.line;
  74. col = lex->stream.column;
  75. pos = lex->stream.position;
  76. if(saved_text && saved_text[0])
  77. {
  78. if(lex->saved_text.length <= 20) {
  79. snprintf(msg_with_context, JSON_ERROR_TEXT_LENGTH,
  80. "%s near '%s'", msg_text, saved_text);
  81. result = msg_with_context;
  82. }
  83. }
  84. else
  85. {
  86. if(lex->stream.state == STREAM_STATE_ERROR) {
  87. /* No context for UTF-8 decoding errors */
  88. result = msg_text;
  89. }
  90. else {
  91. snprintf(msg_with_context, JSON_ERROR_TEXT_LENGTH,
  92. "%s near end of file", msg_text);
  93. result = msg_with_context;
  94. }
  95. }
  96. }
  97. jsonp_error_set(error, line, col, pos, "%s", result);
  98. }
  99. /*** lexical analyzer ***/
  100. static void
  101. stream_init(stream_t *stream, get_func get, void *data)
  102. {
  103. stream->get = get;
  104. stream->data = data;
  105. stream->buffer[0] = '\0';
  106. stream->buffer_pos = 0;
  107. stream->state = STREAM_STATE_OK;
  108. stream->line = 1;
  109. stream->column = 0;
  110. stream->position = 0;
  111. }
  112. static int stream_get(stream_t *stream, json_error_t *error)
  113. {
  114. int c;
  115. if(stream->state != STREAM_STATE_OK)
  116. return stream->state;
  117. if(!stream->buffer[stream->buffer_pos])
  118. {
  119. c = stream->get(stream->data);
  120. if(c == EOF) {
  121. stream->state = STREAM_STATE_EOF;
  122. return STREAM_STATE_EOF;
  123. }
  124. stream->buffer[0] = c;
  125. stream->buffer_pos = 0;
  126. if(0x80 <= c && c <= 0xFF)
  127. {
  128. /* multi-byte UTF-8 sequence */
  129. int i, count;
  130. count = utf8_check_first(c);
  131. if(!count)
  132. goto out;
  133. assert(count >= 2);
  134. for(i = 1; i < count; i++)
  135. stream->buffer[i] = stream->get(stream->data);
  136. if(!utf8_check_full(stream->buffer, count, NULL))
  137. goto out;
  138. stream->buffer[count] = '\0';
  139. }
  140. else
  141. stream->buffer[1] = '\0';
  142. }
  143. c = stream->buffer[stream->buffer_pos++];
  144. stream->position++;
  145. if(c == '\n') {
  146. stream->line++;
  147. stream->last_column = stream->column;
  148. stream->column = 0;
  149. }
  150. else if(utf8_check_first(c)) {
  151. /* track the Unicode character column, so increment only if
  152. this is the first character of a UTF-8 sequence */
  153. stream->column++;
  154. }
  155. return c;
  156. out:
  157. stream->state = STREAM_STATE_ERROR;
  158. error_set(error, stream_to_lex(stream), "unable to decode byte 0x%x", c);
  159. return STREAM_STATE_ERROR;
  160. }
  161. static void stream_unget(stream_t *stream, int c)
  162. {
  163. if(c == STREAM_STATE_EOF || c == STREAM_STATE_ERROR)
  164. return;
  165. stream->position--;
  166. if(c == '\n') {
  167. stream->line--;
  168. stream->column = stream->last_column;
  169. }
  170. else if(utf8_check_first(c))
  171. stream->column--;
  172. assert(stream->buffer_pos > 0);
  173. stream->buffer_pos--;
  174. assert(stream->buffer[stream->buffer_pos] == c);
  175. }
  176. static int lex_get(lex_t *lex, json_error_t *error)
  177. {
  178. return stream_get(&lex->stream, error);
  179. }
  180. static void lex_save(lex_t *lex, int c)
  181. {
  182. strbuffer_append_byte(&lex->saved_text, c);
  183. }
  184. static int lex_get_save(lex_t *lex, json_error_t *error)
  185. {
  186. int c = stream_get(&lex->stream, error);
  187. if(c != STREAM_STATE_EOF && c != STREAM_STATE_ERROR)
  188. lex_save(lex, c);
  189. return c;
  190. }
  191. static void lex_unget(lex_t *lex, int c)
  192. {
  193. stream_unget(&lex->stream, c);
  194. }
  195. static void lex_unget_unsave(lex_t *lex, int c)
  196. {
  197. if(c != STREAM_STATE_EOF && c != STREAM_STATE_ERROR) {
  198. char d;
  199. stream_unget(&lex->stream, c);
  200. d = strbuffer_pop(&lex->saved_text);
  201. assert(c == d);
  202. }
  203. }
  204. static void lex_save_cached(lex_t *lex)
  205. {
  206. while(lex->stream.buffer[lex->stream.buffer_pos] != '\0')
  207. {
  208. lex_save(lex, lex->stream.buffer[lex->stream.buffer_pos]);
  209. lex->stream.buffer_pos++;
  210. lex->stream.position++;
  211. }
  212. }
  213. /* assumes that str points to 'u' plus at least 4 valid hex digits */
  214. static int32_t decode_unicode_escape(const char *str)
  215. {
  216. int i;
  217. int32_t value = 0;
  218. assert(str[0] == 'u');
  219. for(i = 1; i <= 4; i++) {
  220. char c = str[i];
  221. value <<= 4;
  222. if(isdigit(c))
  223. value += c - '0';
  224. else if(islower(c))
  225. value += c - 'a' + 10;
  226. else if(isupper(c))
  227. value += c - 'A' + 10;
  228. else
  229. assert(0);
  230. }
  231. return value;
  232. }
  233. static void lex_scan_string(lex_t *lex, json_error_t *error)
  234. {
  235. int c;
  236. const char *p;
  237. char *t;
  238. int i;
  239. lex->value.string = NULL;
  240. lex->token = TOKEN_INVALID;
  241. c = lex_get_save(lex, error);
  242. while(c != '"') {
  243. if(c == STREAM_STATE_ERROR)
  244. goto out;
  245. else if(c == STREAM_STATE_EOF) {
  246. error_set(error, lex, "premature end of input");
  247. goto out;
  248. }
  249. else if(0 <= c && c <= 0x1F) {
  250. /* control character */
  251. lex_unget_unsave(lex, c);
  252. if(c == '\n')
  253. error_set(error, lex, "unexpected newline", c);
  254. else
  255. error_set(error, lex, "control character 0x%x", c);
  256. goto out;
  257. }
  258. else if(c == '\\') {
  259. c = lex_get_save(lex, error);
  260. if(c == 'u') {
  261. c = lex_get_save(lex, error);
  262. for(i = 0; i < 4; i++) {
  263. if(!isxdigit(c)) {
  264. error_set(error, lex, "invalid escape");
  265. goto out;
  266. }
  267. c = lex_get_save(lex, error);
  268. }
  269. }
  270. else if(c == '"' || c == '\\' || c == '/' || c == 'b' ||
  271. c == 'f' || c == 'n' || c == 'r' || c == 't')
  272. c = lex_get_save(lex, error);
  273. else {
  274. error_set(error, lex, "invalid escape");
  275. goto out;
  276. }
  277. }
  278. else
  279. c = lex_get_save(lex, error);
  280. }
  281. /* the actual value is at most of the same length as the source
  282. string, because:
  283. - shortcut escapes (e.g. "\t") (length 2) are converted to 1 byte
  284. - a single \uXXXX escape (length 6) is converted to at most 3 bytes
  285. - two \uXXXX escapes (length 12) forming an UTF-16 surrogate pair
  286. are converted to 4 bytes
  287. */
  288. lex->value.string = jsonp_malloc(lex->saved_text.length + 1);
  289. if(!lex->value.string) {
  290. /* this is not very nice, since TOKEN_INVALID is returned */
  291. goto out;
  292. }
  293. /* the target */
  294. t = lex->value.string;
  295. /* + 1 to skip the " */
  296. p = strbuffer_value(&lex->saved_text) + 1;
  297. while(*p != '"') {
  298. if(*p == '\\') {
  299. p++;
  300. if(*p == 'u') {
  301. char buffer[4];
  302. int length;
  303. int32_t value;
  304. value = decode_unicode_escape(p);
  305. p += 5;
  306. if(0xD800 <= value && value <= 0xDBFF) {
  307. /* surrogate pair */
  308. if(*p == '\\' && *(p + 1) == 'u') {
  309. int32_t value2 = decode_unicode_escape(++p);
  310. p += 5;
  311. if(0xDC00 <= value2 && value2 <= 0xDFFF) {
  312. /* valid second surrogate */
  313. value =
  314. ((value - 0xD800) << 10) +
  315. (value2 - 0xDC00) +
  316. 0x10000;
  317. }
  318. else {
  319. /* invalid second surrogate */
  320. error_set(error, lex,
  321. "invalid Unicode '\\u%04X\\u%04X'",
  322. value, value2);
  323. goto out;
  324. }
  325. }
  326. else {
  327. /* no second surrogate */
  328. error_set(error, lex, "invalid Unicode '\\u%04X'",
  329. value);
  330. goto out;
  331. }
  332. }
  333. else if(0xDC00 <= value && value <= 0xDFFF) {
  334. error_set(error, lex, "invalid Unicode '\\u%04X'", value);
  335. goto out;
  336. }
  337. else if(value == 0)
  338. {
  339. error_set(error, lex, "\\u0000 is not allowed");
  340. goto out;
  341. }
  342. if(utf8_encode(value, buffer, &length))
  343. assert(0);
  344. memcpy(t, buffer, length);
  345. t += length;
  346. }
  347. else {
  348. switch(*p) {
  349. case '"': case '\\': case '/':
  350. *t = *p; break;
  351. case 'b': *t = '\b'; break;
  352. case 'f': *t = '\f'; break;
  353. case 'n': *t = '\n'; break;
  354. case 'r': *t = '\r'; break;
  355. case 't': *t = '\t'; break;
  356. default: assert(0);
  357. }
  358. t++;
  359. p++;
  360. }
  361. }
  362. else
  363. *(t++) = *(p++);
  364. }
  365. *t = '\0';
  366. lex->token = TOKEN_STRING;
  367. return;
  368. out:
  369. jsonp_free(lex->value.string);
  370. }
  371. #if JSON_INTEGER_IS_LONG_LONG
  372. #define json_strtoint strtoll
  373. #else
  374. #define json_strtoint strtol
  375. #endif
  376. static int lex_scan_number(lex_t *lex, int c, json_error_t *error)
  377. {
  378. const char *saved_text;
  379. char *end;
  380. double value;
  381. lex->token = TOKEN_INVALID;
  382. if(c == '-')
  383. c = lex_get_save(lex, error);
  384. if(c == '0') {
  385. c = lex_get_save(lex, error);
  386. if(isdigit(c)) {
  387. lex_unget_unsave(lex, c);
  388. goto out;
  389. }
  390. }
  391. else if(isdigit(c)) {
  392. c = lex_get_save(lex, error);
  393. while(isdigit(c))
  394. c = lex_get_save(lex, error);
  395. }
  396. else {
  397. lex_unget_unsave(lex, c);
  398. goto out;
  399. }
  400. if(c != '.' && c != 'E' && c != 'e') {
  401. json_int_t value;
  402. lex_unget_unsave(lex, c);
  403. saved_text = strbuffer_value(&lex->saved_text);
  404. errno = 0;
  405. value = json_strtoint(saved_text, &end, 10);
  406. if(errno == ERANGE) {
  407. if(value < 0)
  408. error_set(error, lex, "too big negative integer");
  409. else
  410. error_set(error, lex, "too big integer");
  411. goto out;
  412. }
  413. assert(end == saved_text + lex->saved_text.length);
  414. lex->token = TOKEN_INTEGER;
  415. lex->value.integer = value;
  416. return 0;
  417. }
  418. if(c == '.') {
  419. c = lex_get(lex, error);
  420. if(!isdigit(c)) {
  421. lex_unget(lex, c);
  422. goto out;
  423. }
  424. lex_save(lex, c);
  425. c = lex_get_save(lex, error);
  426. while(isdigit(c))
  427. c = lex_get_save(lex, error);
  428. }
  429. if(c == 'E' || c == 'e') {
  430. c = lex_get_save(lex, error);
  431. if(c == '+' || c == '-')
  432. c = lex_get_save(lex, error);
  433. if(!isdigit(c)) {
  434. lex_unget_unsave(lex, c);
  435. goto out;
  436. }
  437. c = lex_get_save(lex, error);
  438. while(isdigit(c))
  439. c = lex_get_save(lex, error);
  440. }
  441. lex_unget_unsave(lex, c);
  442. saved_text = strbuffer_value(&lex->saved_text);
  443. errno = 0;
  444. value = strtod(saved_text, &end);
  445. assert(end == saved_text + lex->saved_text.length);
  446. if(errno == ERANGE && value != 0) {
  447. error_set(error, lex, "real number overflow");
  448. goto out;
  449. }
  450. lex->token = TOKEN_REAL;
  451. lex->value.real = value;
  452. return 0;
  453. out:
  454. return -1;
  455. }
  456. static int lex_scan(lex_t *lex, json_error_t *error)
  457. {
  458. int c;
  459. strbuffer_clear(&lex->saved_text);
  460. if(lex->token == TOKEN_STRING) {
  461. jsonp_free(lex->value.string);
  462. lex->value.string = NULL;
  463. }
  464. c = lex_get(lex, error);
  465. while(c == ' ' || c == '\t' || c == '\n' || c == '\r')
  466. c = lex_get(lex, error);
  467. if(c == STREAM_STATE_EOF) {
  468. lex->token = TOKEN_EOF;
  469. goto out;
  470. }
  471. if(c == STREAM_STATE_ERROR) {
  472. lex->token = TOKEN_INVALID;
  473. goto out;
  474. }
  475. lex_save(lex, c);
  476. if(c == '{' || c == '}' || c == '[' || c == ']' || c == ':' || c == ',')
  477. lex->token = c;
  478. else if(c == '"')
  479. lex_scan_string(lex, error);
  480. else if(isdigit(c) || c == '-') {
  481. if(lex_scan_number(lex, c, error))
  482. goto out;
  483. }
  484. else if(isupper(c) || islower(c)) {
  485. /* eat up the whole identifier for clearer error messages */
  486. const char *saved_text;
  487. c = lex_get_save(lex, error);
  488. while(isupper(c) || islower(c))
  489. c = lex_get_save(lex, error);
  490. lex_unget_unsave(lex, c);
  491. saved_text = strbuffer_value(&lex->saved_text);
  492. if(strcmp(saved_text, "true") == 0)
  493. lex->token = TOKEN_TRUE;
  494. else if(strcmp(saved_text, "false") == 0)
  495. lex->token = TOKEN_FALSE;
  496. else if(strcmp(saved_text, "null") == 0)
  497. lex->token = TOKEN_NULL;
  498. else
  499. lex->token = TOKEN_INVALID;
  500. }
  501. else {
  502. /* save the rest of the input UTF-8 sequence to get an error
  503. message of valid UTF-8 */
  504. lex_save_cached(lex);
  505. lex->token = TOKEN_INVALID;
  506. }
  507. out:
  508. return lex->token;
  509. }
  510. static char *lex_steal_string(lex_t *lex)
  511. {
  512. char *result = NULL;
  513. if(lex->token == TOKEN_STRING)
  514. {
  515. result = lex->value.string;
  516. lex->value.string = NULL;
  517. }
  518. return result;
  519. }
  520. static int lex_init(lex_t *lex, get_func get, void *data)
  521. {
  522. stream_init(&lex->stream, get, data);
  523. if(strbuffer_init(&lex->saved_text))
  524. return -1;
  525. lex->token = TOKEN_INVALID;
  526. return 0;
  527. }
  528. static void lex_close(lex_t *lex)
  529. {
  530. if(lex->token == TOKEN_STRING)
  531. jsonp_free(lex->value.string);
  532. strbuffer_close(&lex->saved_text);
  533. }
  534. /*** parser ***/
  535. static json_t *parse_value(lex_t *lex, size_t flags, json_error_t *error);
  536. static json_t *parse_object(lex_t *lex, size_t flags, json_error_t *error)
  537. {
  538. json_t *object = json_object();
  539. if(!object)
  540. return NULL;
  541. lex_scan(lex, error);
  542. if(lex->token == '}')
  543. return object;
  544. while(1) {
  545. char *key;
  546. json_t *value;
  547. if(lex->token != TOKEN_STRING) {
  548. error_set(error, lex, "string or '}' expected");
  549. goto error;
  550. }
  551. key = lex_steal_string(lex);
  552. if(!key)
  553. return NULL;
  554. if(flags & JSON_REJECT_DUPLICATES) {
  555. if(json_object_get(object, key)) {
  556. jsonp_free(key);
  557. error_set(error, lex, "duplicate object key");
  558. goto error;
  559. }
  560. }
  561. lex_scan(lex, error);
  562. if(lex->token != ':') {
  563. jsonp_free(key);
  564. error_set(error, lex, "':' expected");
  565. goto error;
  566. }
  567. lex_scan(lex, error);
  568. value = parse_value(lex, flags, error);
  569. if(!value) {
  570. jsonp_free(key);
  571. goto error;
  572. }
  573. if(json_object_set_nocheck(object, key, value)) {
  574. jsonp_free(key);
  575. json_decref(value);
  576. goto error;
  577. }
  578. json_decref(value);
  579. jsonp_free(key);
  580. lex_scan(lex, error);
  581. if(lex->token != ',')
  582. break;
  583. lex_scan(lex, error);
  584. }
  585. if(lex->token != '}') {
  586. error_set(error, lex, "'}' expected");
  587. goto error;
  588. }
  589. return object;
  590. error:
  591. json_decref(object);
  592. return NULL;
  593. }
  594. static json_t *parse_array(lex_t *lex, size_t flags, json_error_t *error)
  595. {
  596. json_t *array = json_array();
  597. if(!array)
  598. return NULL;
  599. lex_scan(lex, error);
  600. if(lex->token == ']')
  601. return array;
  602. while(lex->token) {
  603. json_t *elem = parse_value(lex, flags, error);
  604. if(!elem)
  605. goto error;
  606. if(json_array_append(array, elem)) {
  607. json_decref(elem);
  608. goto error;
  609. }
  610. json_decref(elem);
  611. lex_scan(lex, error);
  612. if(lex->token != ',')
  613. break;
  614. lex_scan(lex, error);
  615. }
  616. if(lex->token != ']') {
  617. error_set(error, lex, "']' expected");
  618. goto error;
  619. }
  620. return array;
  621. error:
  622. json_decref(array);
  623. return NULL;
  624. }
  625. static json_t *parse_value(lex_t *lex, size_t flags, json_error_t *error)
  626. {
  627. json_t *json;
  628. switch(lex->token) {
  629. case TOKEN_STRING: {
  630. json = json_string_nocheck(lex->value.string);
  631. break;
  632. }
  633. case TOKEN_INTEGER: {
  634. json = json_integer(lex->value.integer);
  635. break;
  636. }
  637. case TOKEN_REAL: {
  638. json = json_real(lex->value.real);
  639. break;
  640. }
  641. case TOKEN_TRUE:
  642. json = json_true();
  643. break;
  644. case TOKEN_FALSE:
  645. json = json_false();
  646. break;
  647. case TOKEN_NULL:
  648. json = json_null();
  649. break;
  650. case '{':
  651. json = parse_object(lex, flags, error);
  652. break;
  653. case '[':
  654. json = parse_array(lex, flags, error);
  655. break;
  656. case TOKEN_INVALID:
  657. error_set(error, lex, "invalid token");
  658. return NULL;
  659. default:
  660. error_set(error, lex, "unexpected token");
  661. return NULL;
  662. }
  663. if(!json)
  664. return NULL;
  665. return json;
  666. }
  667. static json_t *parse_json(lex_t *lex, size_t flags, json_error_t *error)
  668. {
  669. json_t *result;
  670. lex_scan(lex, error);
  671. if(lex->token != '[' && lex->token != '{') {
  672. error_set(error, lex, "'[' or '{' expected");
  673. return NULL;
  674. }
  675. result = parse_value(lex, flags, error);
  676. if(!result)
  677. return NULL;
  678. if(!(flags & JSON_DISABLE_EOF_CHECK)) {
  679. lex_scan(lex, error);
  680. if(lex->token != TOKEN_EOF) {
  681. error_set(error, lex, "end of file expected");
  682. json_decref(result);
  683. result = NULL;
  684. }
  685. }
  686. return result;
  687. }
  688. typedef struct
  689. {
  690. const char *data;
  691. int pos;
  692. } string_data_t;
  693. static int string_get(void *data)
  694. {
  695. char c;
  696. string_data_t *stream = (string_data_t *)data;
  697. c = stream->data[stream->pos];
  698. if(c == '\0')
  699. return EOF;
  700. else
  701. {
  702. stream->pos++;
  703. return (unsigned char)c;
  704. }
  705. }
  706. json_t *json_loads(const char *string, size_t flags, json_error_t *error)
  707. {
  708. lex_t lex;
  709. json_t *result;
  710. string_data_t stream_data;
  711. stream_data.data = string;
  712. stream_data.pos = 0;
  713. if(lex_init(&lex, string_get, (void *)&stream_data))
  714. return NULL;
  715. jsonp_error_init(error, "<string>");
  716. result = parse_json(&lex, flags, error);
  717. lex_close(&lex);
  718. return result;
  719. }
  720. typedef struct
  721. {
  722. const char *data;
  723. size_t len;
  724. size_t pos;
  725. } buffer_data_t;
  726. static int buffer_get(void *data)
  727. {
  728. char c;
  729. buffer_data_t *stream = data;
  730. if(stream->pos >= stream->len)
  731. return EOF;
  732. c = stream->data[stream->pos];
  733. stream->pos++;
  734. return (unsigned char)c;
  735. }
  736. json_t *json_loadb(const char *buffer, size_t buflen, size_t flags, json_error_t *error)
  737. {
  738. lex_t lex;
  739. json_t *result;
  740. buffer_data_t stream_data;
  741. stream_data.data = buffer;
  742. stream_data.pos = 0;
  743. stream_data.len = buflen;
  744. if(lex_init(&lex, buffer_get, (void *)&stream_data))
  745. return NULL;
  746. jsonp_error_init(error, "<buffer>");
  747. result = parse_json(&lex, flags, error);
  748. lex_close(&lex);
  749. return result;
  750. }
  751. json_t *json_loadf(FILE *input, size_t flags, json_error_t *error)
  752. {
  753. lex_t lex;
  754. const char *source;
  755. json_t *result;
  756. if(lex_init(&lex, (get_func)fgetc, input))
  757. return NULL;
  758. if(input == stdin)
  759. source = "<stdin>";
  760. else
  761. source = "<stream>";
  762. jsonp_error_init(error, source);
  763. result = parse_json(&lex, flags, error);
  764. lex_close(&lex);
  765. return result;
  766. }
  767. json_t *json_load_file(const char *path, size_t flags, json_error_t *error)
  768. {
  769. json_t *result;
  770. FILE *fp;
  771. jsonp_error_init(error, path);
  772. fp = fopen(path, "r");
  773. if(!fp)
  774. {
  775. error_set(error, NULL, "unable to open %s: %s",
  776. path, strerror(errno));
  777. return NULL;
  778. }
  779. result = json_loadf(fp, flags, error);
  780. fclose(fp);
  781. return result;
  782. }