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

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