Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

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