Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

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