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