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.

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