Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

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