選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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