You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1055 lines
30 KiB

  1. // This file is part of Jiffy released under the MIT license.
  2. // See the LICENSE file for more information.
  3. #include <assert.h>
  4. #include <errno.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include "erl_nif.h"
  9. #include "jiffy.h"
  10. #define U(c) ((unsigned char) (c))
  11. #define ERROR(i, msg) make_error(st, env, msg)
  12. #define STACK_SIZE_INC 64
  13. #define NUM_BUF_LEN 32
  14. #if WINDOWS || WIN32
  15. #define snprintf _snprintf
  16. #endif
  17. enum {
  18. st_value=0,
  19. st_object,
  20. st_array,
  21. st_key,
  22. st_colon,
  23. st_comma,
  24. st_done,
  25. st_invalid
  26. } JsonState;
  27. enum {
  28. nst_init=0,
  29. nst_sign,
  30. nst_mantissa,
  31. nst_frac0,
  32. nst_frac1,
  33. nst_frac,
  34. nst_esign,
  35. nst_edigit
  36. } JsonNumState;
  37. typedef struct {
  38. ErlNifEnv* env;
  39. jiffy_st* atoms;
  40. ERL_NIF_TERM arg;
  41. ErlNifBinary bin;
  42. size_t bytes_per_iter;
  43. int is_partial;
  44. int return_maps;
  45. ERL_NIF_TERM null_term;
  46. char* p;
  47. unsigned char* u;
  48. int i;
  49. int len;
  50. char* st_data;
  51. int st_size;
  52. int st_top;
  53. } Decoder;
  54. Decoder*
  55. dec_new(ErlNifEnv* env)
  56. {
  57. jiffy_st* st = (jiffy_st*) enif_priv_data(env);
  58. Decoder* d = enif_alloc_resource(st->res_dec, sizeof(Decoder));
  59. int i;
  60. if(d == NULL) {
  61. return NULL;
  62. }
  63. d->atoms = st;
  64. d->bytes_per_iter = DEFAULT_BYTES_PER_ITER;
  65. d->is_partial = 0;
  66. d->return_maps = 0;
  67. d->null_term = d->atoms->atom_null;
  68. d->p = NULL;
  69. d->u = NULL;
  70. d->len = -1;
  71. d->i = -1;
  72. d->st_data = (char*) enif_alloc(STACK_SIZE_INC * sizeof(char));
  73. d->st_size = STACK_SIZE_INC;
  74. d->st_top = 0;
  75. for(i = 0; i < d->st_size; i++) {
  76. d->st_data[i] = st_invalid;
  77. }
  78. d->st_data[0] = st_value;
  79. d->st_top++;
  80. return d;
  81. }
  82. void
  83. dec_init(Decoder* d, ErlNifEnv* env, ERL_NIF_TERM arg, ErlNifBinary* bin)
  84. {
  85. d->env = env;
  86. d->arg = arg;
  87. d->p = (char*) bin->data;
  88. d->u = bin->data;
  89. d->len = bin->size;
  90. // I'd like to be more forceful on this check so that when
  91. // we run a second iteration of the decoder we are sure
  92. // that we're using the same binary. Unfortunately, I don't
  93. // think there's a value to base this assertion on.
  94. if(d->i < 0) {
  95. d->i = 0;
  96. } else {
  97. assert(d->i <= d->len && "mismatched binary lengths");
  98. }
  99. }
  100. void
  101. dec_destroy(ErlNifEnv* env, void* obj)
  102. {
  103. Decoder* d = (Decoder*) obj;
  104. if(d->st_data != NULL) {
  105. enif_free(d->st_data);
  106. }
  107. }
  108. ERL_NIF_TERM
  109. dec_error(Decoder* d, const char* atom)
  110. {
  111. ERL_NIF_TERM pos = enif_make_int(d->env, d->i+1);
  112. ERL_NIF_TERM msg = make_atom(d->env, atom);
  113. ERL_NIF_TERM ret = enif_make_tuple2(d->env, pos, msg);
  114. return enif_make_tuple2(d->env, d->atoms->atom_error, ret);
  115. }
  116. char
  117. dec_curr(Decoder* d)
  118. {
  119. return d->st_data[d->st_top-1];
  120. }
  121. int
  122. dec_top(Decoder* d)
  123. {
  124. return d->st_top;
  125. }
  126. void
  127. dec_push(Decoder* d, char val)
  128. {
  129. char* tmp;
  130. int new_sz;
  131. int i;
  132. if(d->st_top >= d->st_size) {
  133. new_sz = d->st_size + STACK_SIZE_INC;
  134. tmp = (char*) enif_alloc(new_sz * sizeof(char));
  135. memcpy(tmp, d->st_data, d->st_size * sizeof(char));
  136. enif_free(d->st_data);
  137. d->st_data = tmp;
  138. d->st_size = new_sz;
  139. for(i = d->st_top; i < d->st_size; i++) {
  140. d->st_data[i] = st_invalid;
  141. }
  142. }
  143. d->st_data[d->st_top++] = val;
  144. }
  145. void
  146. dec_pop(Decoder* d, char val)
  147. {
  148. assert(d->st_data[d->st_top-1] == val && "popped invalid state.");
  149. d->st_data[d->st_top-1] = st_invalid;
  150. d->st_top--;
  151. }
  152. int
  153. dec_string(Decoder* d, ERL_NIF_TERM* value)
  154. {
  155. int has_escape = 0;
  156. int num_escapes = 0;
  157. int st;
  158. int ulen;
  159. int ui;
  160. int hi;
  161. int lo;
  162. char* chrbuf;
  163. int chrpos;
  164. if(d->p[d->i] != '\"') {
  165. return 0;
  166. }
  167. d->i++;
  168. st = d->i;
  169. while(d->i < d->len) {
  170. if(d->u[d->i] < 0x20) {
  171. return 0;
  172. } else if(d->p[d->i] == '\"') {
  173. d->i++;
  174. goto parse;
  175. } else if(d->p[d->i] == '\\') {
  176. if(d->i+1 >= d->len) {
  177. return 0;
  178. }
  179. has_escape = 1;
  180. num_escapes += 1;
  181. d->i++;
  182. switch(d->p[d->i]) {
  183. case '\"':
  184. case '\\':
  185. case '/':
  186. case 'b':
  187. case 'f':
  188. case 'n':
  189. case 'r':
  190. case 't':
  191. d->i++;
  192. break;
  193. case 'u':
  194. hi = 0;
  195. lo = 0;
  196. d->i++;
  197. if(d->i + 4 >= d->len) {
  198. return 0;
  199. }
  200. hi = int_from_hex(&(d->u[d->i]));
  201. if(hi < 0) {
  202. return 0;
  203. }
  204. d->i += 4;
  205. if(hi >= 0xD800 && hi < 0xDC00) {
  206. if(d->i + 6 >= d->len) {
  207. return 0;
  208. }
  209. if(d->p[d->i++] != '\\') {
  210. return 0;
  211. } else if(d->p[d->i++] != 'u') {
  212. return 0;
  213. }
  214. lo = int_from_hex(&(d->u[d->i]));
  215. if(lo < 0) {
  216. return 0;
  217. }
  218. hi = unicode_from_pair(hi, lo);
  219. if(hi < 0) {
  220. return 0;
  221. }
  222. }
  223. hi = utf8_len(hi);
  224. if(hi < 0) {
  225. return 0;
  226. }
  227. if(lo == 0) {
  228. num_escapes += 5 - hi;
  229. } else {
  230. num_escapes += 11 - hi;
  231. }
  232. break;
  233. default:
  234. return 0;
  235. }
  236. } else if(d->u[d->i] < 0x80) {
  237. d->i++;
  238. } else {
  239. ulen = utf8_validate(&(d->u[d->i]), d->len - d->i);
  240. if(ulen < 0) {
  241. return 0;
  242. }
  243. d->i += ulen;
  244. }
  245. }
  246. // The goto above ensures that we only
  247. // hit this when a string is not terminated
  248. // correctly.
  249. return 0;
  250. parse:
  251. if(!has_escape) {
  252. *value = enif_make_sub_binary(d->env, d->arg, st, (d->i - st - 1));
  253. return 1;
  254. }
  255. hi = 0;
  256. lo = 0;
  257. ulen = (d->i - 1) - st - num_escapes;
  258. chrbuf = (char*) enif_make_new_binary(d->env, ulen, value);
  259. chrpos = 0;
  260. ui = st;
  261. while(ui < d->i - 1) {
  262. if(d->p[ui] != '\\') {
  263. chrbuf[chrpos++] = d->p[ui++];
  264. continue;
  265. }
  266. ui++;
  267. switch(d->p[ui]) {
  268. case '\"':
  269. case '\\':
  270. case '/':
  271. chrbuf[chrpos++] = d->p[ui];
  272. ui++;
  273. break;
  274. case 'b':
  275. chrbuf[chrpos++] = '\b';
  276. ui++;
  277. break;
  278. case 'f':
  279. chrbuf[chrpos++] = '\f';
  280. ui++;
  281. break;
  282. case 'n':
  283. chrbuf[chrpos++] = '\n';
  284. ui++;
  285. break;
  286. case 'r':
  287. chrbuf[chrpos++] = '\r';
  288. ui++;
  289. break;
  290. case 't':
  291. chrbuf[chrpos++] = '\t';
  292. ui++;
  293. break;
  294. case 'u':
  295. ui++;
  296. hi = int_from_hex(&(d->u[ui]));
  297. if(hi < 0) {
  298. return 0;
  299. }
  300. if(hi >= 0xD800 && hi < 0xDC00) {
  301. lo = int_from_hex(&(d->u[ui+6]));
  302. if(lo < 0) {
  303. return 0;
  304. }
  305. hi = unicode_from_pair(hi, lo);
  306. ui += 10;
  307. } else {
  308. ui += 4;
  309. }
  310. hi = unicode_to_utf8(hi, (unsigned char*) chrbuf+chrpos);
  311. if(hi < 0) {
  312. return 0;
  313. }
  314. chrpos += hi;
  315. break;
  316. default:
  317. return 0;
  318. }
  319. }
  320. return 1;
  321. }
  322. int
  323. dec_number(Decoder* d, ERL_NIF_TERM* value)
  324. {
  325. ERL_NIF_TERM num_type = d->atoms->atom_error;
  326. char state = nst_init;
  327. char nbuf[NUM_BUF_LEN];
  328. int st = d->i;
  329. int has_frac = 0;
  330. int has_exp = 0;
  331. double dval;
  332. long lval;
  333. while(d->i < d->len) {
  334. switch(state) {
  335. case nst_init:
  336. switch(d->p[d->i]) {
  337. case '-':
  338. state = nst_sign;
  339. d->i++;
  340. break;
  341. case '0':
  342. state = nst_frac0;
  343. d->i++;
  344. break;
  345. case '1':
  346. case '2':
  347. case '3':
  348. case '4':
  349. case '5':
  350. case '6':
  351. case '7':
  352. case '8':
  353. case '9':
  354. state = nst_mantissa;
  355. d->i++;
  356. break;
  357. default:
  358. return 0;
  359. }
  360. break;
  361. case nst_sign:
  362. switch(d->p[d->i]) {
  363. case '0':
  364. state = nst_frac0;
  365. d->i++;
  366. break;
  367. case '1':
  368. case '2':
  369. case '3':
  370. case '4':
  371. case '5':
  372. case '6':
  373. case '7':
  374. case '8':
  375. case '9':
  376. state = nst_mantissa;
  377. d->i++;
  378. break;
  379. default:
  380. return 0;
  381. }
  382. break;
  383. case nst_mantissa:
  384. switch(d->p[d->i]) {
  385. case '.':
  386. state = nst_frac1;
  387. d->i++;
  388. break;
  389. case 'e':
  390. case 'E':
  391. state = nst_esign;
  392. d->i++;
  393. break;
  394. case '0':
  395. case '1':
  396. case '2':
  397. case '3':
  398. case '4':
  399. case '5':
  400. case '6':
  401. case '7':
  402. case '8':
  403. case '9':
  404. d->i++;
  405. break;
  406. default:
  407. goto parse;
  408. }
  409. break;
  410. case nst_frac0:
  411. switch(d->p[d->i]) {
  412. case '.':
  413. state = nst_frac1;
  414. d->i++;
  415. break;
  416. case 'e':
  417. case 'E':
  418. state = nst_esign;
  419. d->i++;
  420. break;
  421. default:
  422. goto parse;
  423. }
  424. break;
  425. case nst_frac1:
  426. has_frac = 1;
  427. switch(d->p[d->i]) {
  428. case '0':
  429. case '1':
  430. case '2':
  431. case '3':
  432. case '4':
  433. case '5':
  434. case '6':
  435. case '7':
  436. case '8':
  437. case '9':
  438. state = nst_frac;
  439. d->i++;
  440. break;
  441. default:
  442. goto parse;
  443. }
  444. break;
  445. case nst_frac:
  446. switch(d->p[d->i]) {
  447. case 'e':
  448. case 'E':
  449. state = nst_esign;
  450. d->i++;
  451. break;
  452. case '0':
  453. case '1':
  454. case '2':
  455. case '3':
  456. case '4':
  457. case '5':
  458. case '6':
  459. case '7':
  460. case '8':
  461. case '9':
  462. d->i++;
  463. break;
  464. default:
  465. goto parse;
  466. }
  467. break;
  468. case nst_esign:
  469. has_exp = 1;
  470. switch(d->p[d->i]) {
  471. case '-':
  472. case '+':
  473. case '0':
  474. case '1':
  475. case '2':
  476. case '3':
  477. case '4':
  478. case '5':
  479. case '6':
  480. case '7':
  481. case '8':
  482. case '9':
  483. state = nst_edigit;
  484. d->i++;
  485. break;
  486. default:
  487. return 0;
  488. }
  489. break;
  490. case nst_edigit:
  491. switch(d->p[d->i]) {
  492. case '0':
  493. case '1':
  494. case '2':
  495. case '3':
  496. case '4':
  497. case '5':
  498. case '6':
  499. case '7':
  500. case '8':
  501. case '9':
  502. d->i++;
  503. break;
  504. default:
  505. goto parse;
  506. }
  507. break;
  508. default:
  509. return 0;
  510. }
  511. }
  512. parse:
  513. switch(state) {
  514. case nst_init:
  515. case nst_sign:
  516. case nst_frac1:
  517. case nst_esign:
  518. return 0;
  519. default:
  520. break;
  521. }
  522. errno = 0;
  523. if(d->i - st < NUM_BUF_LEN) {
  524. memset(nbuf, 0, NUM_BUF_LEN);
  525. memcpy(nbuf, &(d->p[st]), d->i - st);
  526. if(has_frac || has_exp) {
  527. dval = strtod(nbuf, NULL);
  528. if(errno != ERANGE) {
  529. *value = enif_make_double(d->env, dval);
  530. return 1;
  531. }
  532. } else {
  533. lval = strtol(nbuf, NULL, 10);
  534. if(errno != ERANGE) {
  535. *value = enif_make_int64(d->env, lval);
  536. return 1;
  537. }
  538. }
  539. }
  540. if(!has_frac && !has_exp) {
  541. num_type = d->atoms->atom_bignum;
  542. } else if(!has_frac && has_exp) {
  543. num_type = d->atoms->atom_bignum_e;
  544. } else {
  545. num_type = d->atoms->atom_bigdbl;
  546. }
  547. d->is_partial = 1;
  548. *value = enif_make_sub_binary(d->env, d->arg, st, d->i - st);
  549. *value = enif_make_tuple2(d->env, num_type, *value);
  550. return 1;
  551. }
  552. ERL_NIF_TERM
  553. make_empty_object(ErlNifEnv* env, int ret_map)
  554. {
  555. #if MAP_TYPE_PRESENT
  556. if(ret_map) {
  557. return enif_make_new_map(env);
  558. }
  559. #endif
  560. return enif_make_tuple1(env, enif_make_list(env, 0));
  561. }
  562. int
  563. make_object(ErlNifEnv* env, ERL_NIF_TERM pairs, ERL_NIF_TERM* out, int ret_map)
  564. {
  565. ERL_NIF_TERM ret;
  566. ERL_NIF_TERM key;
  567. ERL_NIF_TERM val;
  568. #if MAP_TYPE_PRESENT
  569. if(ret_map) {
  570. ret = enif_make_new_map(env);
  571. while(enif_get_list_cell(env, pairs, &val, &pairs)) {
  572. if(!enif_get_list_cell(env, pairs, &key, &pairs)) {
  573. assert(0 == 1 && "Unbalanced object pairs.");
  574. }
  575. if(!enif_make_map_put(env, ret, key, val, &ret)) {
  576. return 0;
  577. }
  578. }
  579. *out = ret;
  580. return 1;
  581. }
  582. #endif
  583. ret = enif_make_list(env, 0);
  584. while(enif_get_list_cell(env, pairs, &val, &pairs)) {
  585. if(!enif_get_list_cell(env, pairs, &key, &pairs)) {
  586. assert(0 == 1 && "Unbalanced object pairs.");
  587. }
  588. val = enif_make_tuple2(env, key, val);
  589. ret = enif_make_list_cell(env, val, ret);
  590. }
  591. *out = enif_make_tuple1(env, ret);
  592. return 1;
  593. }
  594. ERL_NIF_TERM
  595. make_array(ErlNifEnv* env, ERL_NIF_TERM list)
  596. {
  597. ERL_NIF_TERM ret = enif_make_list(env, 0);
  598. ERL_NIF_TERM item;
  599. while(enif_get_list_cell(env, list, &item, &list)) {
  600. ret = enif_make_list_cell(env, item, ret);
  601. }
  602. return ret;
  603. }
  604. ERL_NIF_TERM
  605. decode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
  606. {
  607. Decoder* d;
  608. jiffy_st* st = (jiffy_st*) enif_priv_data(env);
  609. ERL_NIF_TERM tmp_argv[5];
  610. ERL_NIF_TERM opts;
  611. ERL_NIF_TERM val;
  612. if(argc != 2) {
  613. return enif_make_badarg(env);
  614. }
  615. d = dec_new(env);
  616. if(d == NULL) {
  617. return make_error(st, env, "internal_error");
  618. }
  619. tmp_argv[0] = argv[0];
  620. tmp_argv[1] = enif_make_resource(env, d);
  621. tmp_argv[2] = st->atom_error;
  622. tmp_argv[3] = enif_make_list(env, 0);
  623. tmp_argv[4] = enif_make_list(env, 0);
  624. enif_release_resource(d);
  625. opts = argv[1];
  626. if(!enif_is_list(env, opts)) {
  627. return enif_make_badarg(env);
  628. }
  629. while(enif_get_list_cell(env, opts, &val, &opts)) {
  630. if(get_bytes_per_iter(env, val, &(d->bytes_per_iter))) {
  631. continue;
  632. } else if(enif_compare(val, d->atoms->atom_return_maps) == 0) {
  633. #if MAP_TYPE_PRESENT
  634. d->return_maps = 1;
  635. #else
  636. return enif_make_badarg(env);
  637. #endif
  638. } else if(enif_compare(val, d->atoms->atom_use_nil) == 0) {
  639. d->null_term = d->atoms->atom_nil;
  640. } else if(get_null_term(env, val, &(d->null_term))) {
  641. continue;
  642. } else {
  643. return enif_make_badarg(env);
  644. }
  645. }
  646. return decode_iter(env, 5, tmp_argv);
  647. }
  648. ERL_NIF_TERM
  649. decode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
  650. {
  651. Decoder* d;
  652. jiffy_st* st = (jiffy_st*) enif_priv_data(env);
  653. ErlNifBinary bin;
  654. ERL_NIF_TERM objs;
  655. ERL_NIF_TERM curr;
  656. ERL_NIF_TERM val = argv[2];
  657. ERL_NIF_TERM ret;
  658. size_t start;
  659. if(argc != 5) {
  660. return enif_make_badarg(env);
  661. } else if(!enif_inspect_binary(env, argv[0], &bin)) {
  662. return enif_make_badarg(env);
  663. } else if(!enif_get_resource(env, argv[1], st->res_dec, (void**) &d)) {
  664. return enif_make_badarg(env);
  665. } else if(!enif_is_list(env, argv[3])) {
  666. return enif_make_badarg(env);
  667. } else if(!enif_is_list(env, argv[4])) {
  668. return enif_make_badarg(env);
  669. }
  670. dec_init(d, env, argv[0], &bin);
  671. objs = argv[3];
  672. curr = argv[4];
  673. //fprintf(stderr, "Parsing:\r\n");
  674. start = d->i;
  675. while(d->i < bin.size) {
  676. //fprintf(stderr, "state: %d\r\n", dec_curr(d));
  677. if(should_yield(d->i - start, d->bytes_per_iter)) {
  678. consume_timeslice(env, d->i - start, d->bytes_per_iter);
  679. return enif_make_tuple5(
  680. env,
  681. st->atom_iter,
  682. argv[1],
  683. val,
  684. objs,
  685. curr
  686. );
  687. }
  688. switch(dec_curr(d)) {
  689. case st_value:
  690. switch(d->p[d->i]) {
  691. case ' ':
  692. case '\n':
  693. case '\r':
  694. case '\t':
  695. d->i++;
  696. break;
  697. case 'n':
  698. if(d->i + 3 >= d->len) {
  699. ret = dec_error(d, "invalid_literal");
  700. goto done;
  701. }
  702. if(memcmp(&(d->p[d->i]), "null", 4) != 0) {
  703. ret = dec_error(d, "invalid_literal");
  704. goto done;
  705. }
  706. val = d->null_term;
  707. dec_pop(d, st_value);
  708. d->i += 4;
  709. break;
  710. case 't':
  711. if(d->i + 3 >= d->len) {
  712. ret = dec_error(d, "invalid_literal");
  713. goto done;
  714. }
  715. if(memcmp(&(d->p[d->i]), "true", 4) != 0) {
  716. ret = dec_error(d, "invalid_literal");
  717. goto done;
  718. }
  719. val = d->atoms->atom_true;
  720. dec_pop(d, st_value);
  721. d->i += 4;
  722. break;
  723. case 'f':
  724. if(d->i + 4 >= bin.size) {
  725. ret = dec_error(d, "invalid_literal");
  726. goto done;
  727. }
  728. if(memcmp(&(d->p[d->i]), "false", 5) != 0) {
  729. ret = dec_error(d, "invalid_literal");
  730. goto done;
  731. }
  732. val = d->atoms->atom_false;
  733. dec_pop(d, st_value);
  734. d->i += 5;
  735. break;
  736. case '\"':
  737. if(!dec_string(d, &val)) {
  738. ret = dec_error(d, "invalid_string");
  739. goto done;
  740. }
  741. dec_pop(d, st_value);
  742. break;
  743. case '-':
  744. case '0':
  745. case '1':
  746. case '2':
  747. case '3':
  748. case '4':
  749. case '5':
  750. case '6':
  751. case '7':
  752. case '8':
  753. case '9':
  754. if(!dec_number(d, &val)) {
  755. ret = dec_error(d, "invalid_number");
  756. goto done;
  757. }
  758. dec_pop(d, st_value);
  759. break;
  760. case '{':
  761. dec_push(d, st_object);
  762. dec_push(d, st_key);
  763. objs = enif_make_list_cell(env, curr, objs);
  764. curr = enif_make_list(env, 0);
  765. d->i++;
  766. break;
  767. case '[':
  768. dec_push(d, st_array);
  769. dec_push(d, st_value);
  770. objs = enif_make_list_cell(env, curr, objs);
  771. curr = enif_make_list(env, 0);
  772. d->i++;
  773. break;
  774. case ']':
  775. if(!enif_is_empty_list(env, curr)) {
  776. ret = dec_error(d, "invalid_json");
  777. goto done;
  778. }
  779. dec_pop(d, st_value);
  780. if(dec_curr(d) != st_array) {
  781. ret = dec_error(d, "invalid_json");
  782. goto done;
  783. }
  784. dec_pop(d, st_array);
  785. dec_pop(d, st_value);
  786. val = curr; // curr is []
  787. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  788. ret = dec_error(d, "internal_error");
  789. goto done;
  790. }
  791. d->i++;
  792. break;
  793. default:
  794. ret = dec_error(d, "invalid_json");
  795. goto done;
  796. }
  797. if(dec_top(d) == 0) {
  798. dec_push(d, st_done);
  799. } else if(dec_curr(d) != st_value && dec_curr(d) != st_key) {
  800. dec_push(d, st_comma);
  801. curr = enif_make_list_cell(env, val, curr);
  802. }
  803. break;
  804. case st_key:
  805. switch(d->p[d->i]) {
  806. case ' ':
  807. case '\n':
  808. case '\r':
  809. case '\t':
  810. d->i++;
  811. break;
  812. case '\"':
  813. if(!dec_string(d, &val)) {
  814. ret = dec_error(d, "invalid_string");
  815. goto done;
  816. }
  817. dec_pop(d, st_key);
  818. dec_push(d, st_colon);
  819. curr = enif_make_list_cell(env, val, curr);
  820. break;
  821. case '}':
  822. if(!enif_is_empty_list(env, curr)) {
  823. ret = dec_error(d, "invalid_json");
  824. goto done;
  825. }
  826. dec_pop(d, st_key);
  827. dec_pop(d, st_object);
  828. dec_pop(d, st_value);
  829. val = make_empty_object(env, d->return_maps);
  830. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  831. ret = dec_error(d, "internal_error");
  832. goto done;
  833. }
  834. if(dec_top(d) == 0) {
  835. dec_push(d, st_done);
  836. } else {
  837. dec_push(d, st_comma);
  838. curr = enif_make_list_cell(env, val, curr);
  839. }
  840. d->i++;
  841. break;
  842. default:
  843. ret = dec_error(d, "invalid_json");
  844. goto done;
  845. }
  846. break;
  847. case st_colon:
  848. switch(d->p[d->i]) {
  849. case ' ':
  850. case '\n':
  851. case '\r':
  852. case '\t':
  853. d->i++;
  854. break;
  855. case ':':
  856. dec_pop(d, st_colon);
  857. dec_push(d, st_value);
  858. d->i++;
  859. break;
  860. default:
  861. ret = dec_error(d, "invalid_json");
  862. goto done;
  863. }
  864. break;
  865. case st_comma:
  866. switch(d->p[d->i]) {
  867. case ' ':
  868. case '\n':
  869. case '\r':
  870. case '\t':
  871. d->i++;
  872. break;
  873. case ',':
  874. dec_pop(d, st_comma);
  875. switch(dec_curr(d)) {
  876. case st_object:
  877. dec_push(d, st_key);
  878. break;
  879. case st_array:
  880. dec_push(d, st_value);
  881. break;
  882. default:
  883. ret = dec_error(d, "internal_error");
  884. goto done;
  885. }
  886. d->i++;
  887. break;
  888. case '}':
  889. dec_pop(d, st_comma);
  890. if(dec_curr(d) != st_object) {
  891. ret = dec_error(d, "invalid_json");
  892. goto done;
  893. }
  894. dec_pop(d, st_object);
  895. dec_pop(d, st_value);
  896. if(!make_object(env, curr, &val, d->return_maps)) {
  897. ret = dec_error(d, "internal_object_error");
  898. goto done;
  899. }
  900. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  901. ret = dec_error(d, "internal_error");
  902. goto done;
  903. }
  904. if(dec_top(d) > 0) {
  905. dec_push(d, st_comma);
  906. curr = enif_make_list_cell(env, val, curr);
  907. } else {
  908. dec_push(d, st_done);
  909. }
  910. d->i++;
  911. break;
  912. case ']':
  913. dec_pop(d, st_comma);
  914. if(dec_curr(d) != st_array) {
  915. ret = dec_error(d, "invalid_json");
  916. goto done;
  917. }
  918. dec_pop(d, st_array);
  919. dec_pop(d, st_value);
  920. val = make_array(env, curr);
  921. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  922. ret = dec_error(d, "internal_error");
  923. goto done;
  924. }
  925. if(dec_top(d) > 0) {
  926. dec_push(d, st_comma);
  927. curr = enif_make_list_cell(env, val, curr);
  928. } else {
  929. dec_push(d, st_done);
  930. }
  931. d->i++;
  932. break;
  933. default:
  934. ret = dec_error(d, "invalid_json");
  935. goto done;
  936. }
  937. break;
  938. case st_done:
  939. switch(d->p[d->i]) {
  940. case ' ':
  941. case '\n':
  942. case '\r':
  943. case '\t':
  944. d->i++;
  945. break;
  946. default:
  947. ret = dec_error(d, "invalid_trailing_data");
  948. goto done;
  949. }
  950. break;
  951. default:
  952. ret = dec_error(d, "invalid_internal_state");
  953. goto done;
  954. }
  955. }
  956. if(dec_curr(d) != st_done) {
  957. ret = dec_error(d, "truncated_json");
  958. } else if(d->is_partial) {
  959. ret = enif_make_tuple2(env, d->atoms->atom_partial, val);
  960. } else {
  961. ret = val;
  962. }
  963. done:
  964. consume_timeslice(env, d->i - start, d->bytes_per_iter);
  965. return ret;
  966. }