Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

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