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.

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