您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

1054 行
30 KiB

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