You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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