Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

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