Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

1057 righe
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_is_identical(val, d->atoms->atom_return_maps)) {
  611. #if MAP_TYPE_PRESENT
  612. d->return_maps = 1;
  613. #else
  614. return enif_make_badarg(env);
  615. #endif
  616. } else if(enif_is_identical(val, d->atoms->atom_return_trailer)) {
  617. d->return_trailer = 1;
  618. } else if(enif_is_identical(val, d->atoms->atom_dedupe_keys)) {
  619. d->dedupe_keys = 1;
  620. } else if(enif_is_identical(val, d->atoms->atom_copy_strings)) {
  621. d->copy_strings = 1;
  622. } else if(enif_is_identical(val, d->atoms->atom_use_nil)) {
  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 start;
  644. size_t bytes_processed = 0;
  645. if(argc != 5) {
  646. return enif_make_badarg(env);
  647. } else if(!enif_inspect_binary(env, argv[0], &bin)) {
  648. return enif_make_badarg(env);
  649. } else if(!enif_get_resource(env, argv[1], st->res_dec, (void**) &d)) {
  650. return enif_make_badarg(env);
  651. } else if(!enif_is_list(env, argv[3])) {
  652. return enif_make_badarg(env);
  653. } else if(!enif_is_list(env, argv[4])) {
  654. return enif_make_badarg(env);
  655. }
  656. dec_init(d, env, argv[0], &bin);
  657. objs = argv[3];
  658. curr = argv[4];
  659. start = d->i;
  660. while(d->i < bin.size) {
  661. bytes_processed = d->i - start;
  662. if(should_yield(env, bytes_processed, d->bytes_per_red)) {
  663. ERL_NIF_TERM tmp_argv[5];
  664. tmp_argv[0] = argv[0];
  665. tmp_argv[1] = argv[1];
  666. tmp_argv[2] = val;
  667. tmp_argv[3] = objs;
  668. tmp_argv[4] = curr;
  669. bump_used_reds(env, bytes_processed, d->bytes_per_red);
  670. return enif_schedule_nif(env,
  671. "nif_decode_iter",
  672. 0,
  673. decode_iter,
  674. 5,
  675. tmp_argv);
  676. }
  677. switch(dec_curr(d)) {
  678. case st_value:
  679. switch(d->p[d->i]) {
  680. case ' ':
  681. case '\n':
  682. case '\r':
  683. case '\t':
  684. d->i++;
  685. break;
  686. case 'n':
  687. if(d->i + 3 >= d->len) {
  688. ret = dec_error(d, "invalid_literal");
  689. goto done;
  690. }
  691. if(memcmp(&(d->p[d->i]), "null", 4) != 0) {
  692. ret = dec_error(d, "invalid_literal");
  693. goto done;
  694. }
  695. val = d->null_term;
  696. dec_pop(d, st_value);
  697. d->i += 4;
  698. break;
  699. case 't':
  700. if(d->i + 3 >= d->len) {
  701. ret = dec_error(d, "invalid_literal");
  702. goto done;
  703. }
  704. if(memcmp(&(d->p[d->i]), "true", 4) != 0) {
  705. ret = dec_error(d, "invalid_literal");
  706. goto done;
  707. }
  708. val = d->atoms->atom_true;
  709. dec_pop(d, st_value);
  710. d->i += 4;
  711. break;
  712. case 'f':
  713. if(d->i + 4 >= bin.size) {
  714. ret = dec_error(d, "invalid_literal");
  715. goto done;
  716. }
  717. if(memcmp(&(d->p[d->i]), "false", 5) != 0) {
  718. ret = dec_error(d, "invalid_literal");
  719. goto done;
  720. }
  721. val = d->atoms->atom_false;
  722. dec_pop(d, st_value);
  723. d->i += 5;
  724. break;
  725. case '\"':
  726. if(!dec_string(d, &val)) {
  727. ret = dec_error(d, "invalid_string");
  728. goto done;
  729. }
  730. dec_pop(d, st_value);
  731. break;
  732. case '-':
  733. case '0':
  734. case '1':
  735. case '2':
  736. case '3':
  737. case '4':
  738. case '5':
  739. case '6':
  740. case '7':
  741. case '8':
  742. case '9':
  743. if(!dec_number(d, &val)) {
  744. ret = dec_error(d, "invalid_number");
  745. goto done;
  746. }
  747. dec_pop(d, st_value);
  748. break;
  749. case '{':
  750. dec_push(d, st_object);
  751. dec_push(d, st_key);
  752. objs = enif_make_list_cell(env, curr, objs);
  753. curr = enif_make_list(env, 0);
  754. d->i++;
  755. break;
  756. case '[':
  757. dec_push(d, st_array);
  758. dec_push(d, st_value);
  759. objs = enif_make_list_cell(env, curr, objs);
  760. curr = enif_make_list(env, 0);
  761. d->i++;
  762. break;
  763. case ']':
  764. if(!enif_is_empty_list(env, curr)) {
  765. ret = dec_error(d, "invalid_json");
  766. goto done;
  767. }
  768. dec_pop(d, st_value);
  769. if(dec_curr(d) != st_array) {
  770. ret = dec_error(d, "invalid_json");
  771. goto done;
  772. }
  773. dec_pop(d, st_array);
  774. dec_pop(d, st_value);
  775. val = curr; // curr is []
  776. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  777. ret = dec_error(d, "internal_error");
  778. goto done;
  779. }
  780. d->i++;
  781. break;
  782. default:
  783. ret = dec_error(d, "invalid_json");
  784. goto done;
  785. }
  786. if(dec_top(d) == 0) {
  787. dec_push(d, st_done);
  788. } else if(dec_curr(d) != st_value && dec_curr(d) != st_key) {
  789. dec_push(d, st_comma);
  790. curr = enif_make_list_cell(env, val, curr);
  791. }
  792. break;
  793. case st_key:
  794. switch(d->p[d->i]) {
  795. case ' ':
  796. case '\n':
  797. case '\r':
  798. case '\t':
  799. d->i++;
  800. break;
  801. case '\"':
  802. if(!dec_string(d, &val)) {
  803. ret = dec_error(d, "invalid_string");
  804. goto done;
  805. }
  806. dec_pop(d, st_key);
  807. dec_push(d, st_colon);
  808. curr = enif_make_list_cell(env, val, curr);
  809. break;
  810. case '}':
  811. if(!enif_is_empty_list(env, curr)) {
  812. ret = dec_error(d, "invalid_json");
  813. goto done;
  814. }
  815. dec_pop(d, st_key);
  816. dec_pop(d, st_object);
  817. dec_pop(d, st_value);
  818. val = make_empty_object(env, d->return_maps);
  819. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  820. ret = dec_error(d, "internal_error");
  821. goto done;
  822. }
  823. if(dec_top(d) == 0) {
  824. dec_push(d, st_done);
  825. } else {
  826. dec_push(d, st_comma);
  827. curr = enif_make_list_cell(env, val, curr);
  828. }
  829. d->i++;
  830. break;
  831. default:
  832. ret = dec_error(d, "invalid_json");
  833. goto done;
  834. }
  835. break;
  836. case st_colon:
  837. switch(d->p[d->i]) {
  838. case ' ':
  839. case '\n':
  840. case '\r':
  841. case '\t':
  842. d->i++;
  843. break;
  844. case ':':
  845. dec_pop(d, st_colon);
  846. dec_push(d, st_value);
  847. d->i++;
  848. break;
  849. default:
  850. ret = dec_error(d, "invalid_json");
  851. goto done;
  852. }
  853. break;
  854. case st_comma:
  855. switch(d->p[d->i]) {
  856. case ' ':
  857. case '\n':
  858. case '\r':
  859. case '\t':
  860. d->i++;
  861. break;
  862. case ',':
  863. dec_pop(d, st_comma);
  864. switch(dec_curr(d)) {
  865. case st_object:
  866. dec_push(d, st_key);
  867. break;
  868. case st_array:
  869. dec_push(d, st_value);
  870. break;
  871. default:
  872. ret = dec_error(d, "internal_error");
  873. goto done;
  874. }
  875. d->i++;
  876. break;
  877. case '}':
  878. dec_pop(d, st_comma);
  879. if(dec_curr(d) != st_object) {
  880. ret = dec_error(d, "invalid_json");
  881. goto done;
  882. }
  883. dec_pop(d, st_object);
  884. dec_pop(d, st_value);
  885. if(!make_object(env, curr, &val,
  886. d->return_maps, d->dedupe_keys)) {
  887. ret = dec_error(d, "internal_object_error");
  888. goto done;
  889. }
  890. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  891. ret = dec_error(d, "internal_error");
  892. goto done;
  893. }
  894. if(dec_top(d) > 0) {
  895. dec_push(d, st_comma);
  896. curr = enif_make_list_cell(env, val, curr);
  897. } else {
  898. dec_push(d, st_done);
  899. }
  900. d->i++;
  901. break;
  902. case ']':
  903. dec_pop(d, st_comma);
  904. if(dec_curr(d) != st_array) {
  905. ret = dec_error(d, "invalid_json");
  906. goto done;
  907. }
  908. dec_pop(d, st_array);
  909. dec_pop(d, st_value);
  910. val = make_array(env, curr);
  911. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  912. ret = dec_error(d, "internal_error");
  913. goto done;
  914. }
  915. if(dec_top(d) > 0) {
  916. dec_push(d, st_comma);
  917. curr = enif_make_list_cell(env, val, curr);
  918. } else {
  919. dec_push(d, st_done);
  920. }
  921. d->i++;
  922. break;
  923. default:
  924. ret = dec_error(d, "invalid_json");
  925. goto done;
  926. }
  927. break;
  928. case st_done:
  929. switch(d->p[d->i]) {
  930. case ' ':
  931. case '\n':
  932. case '\r':
  933. case '\t':
  934. d->i++;
  935. break;
  936. default:
  937. goto decode_done;
  938. }
  939. break;
  940. default:
  941. ret = dec_error(d, "invalid_internal_state");
  942. goto done;
  943. }
  944. }
  945. decode_done:
  946. if(d->i < bin.size && d->return_trailer) {
  947. trailer = enif_make_sub_binary(env, argv[0], d->i, bin.size - d->i);
  948. val = enif_make_tuple3(env, d->atoms->atom_has_trailer, val, trailer);
  949. } else if(d->i < bin.size) {
  950. ret = dec_error(d, "invalid_trailing_data");
  951. goto done;
  952. }
  953. if(dec_curr(d) != st_done) {
  954. ret = dec_error(d, "truncated_json");
  955. } else if(d->is_partial) {
  956. ret = enif_make_tuple2(env, d->atoms->atom_partial, val);
  957. } else {
  958. ret = val;
  959. }
  960. done:
  961. bump_used_reds(env, bytes_processed, d->bytes_per_red);
  962. return ret;
  963. }