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.

944 line
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. enum {
  15. st_value=0,
  16. st_object,
  17. st_array,
  18. st_key,
  19. st_colon,
  20. st_comma,
  21. st_done,
  22. st_invalid
  23. } JsonState;
  24. enum {
  25. nst_init=0,
  26. nst_sign,
  27. nst_mantissa,
  28. nst_frac0,
  29. nst_frac1,
  30. nst_frac,
  31. nst_esign,
  32. nst_edigit
  33. } JsonNumState;
  34. typedef struct {
  35. ErlNifEnv* env;
  36. jiffy_st* atoms;
  37. ERL_NIF_TERM arg;
  38. ErlNifBinary bin;
  39. int is_partial;
  40. char* p;
  41. unsigned char* u;
  42. int i;
  43. int len;
  44. char* st_data;
  45. int st_size;
  46. int st_top;
  47. } Decoder;
  48. void
  49. dec_init(Decoder* d, ErlNifEnv* env, ERL_NIF_TERM arg, ErlNifBinary* bin)
  50. {
  51. int i;
  52. d->env = env;
  53. d->atoms = enif_priv_data(env);
  54. d->arg = arg;
  55. d->is_partial = 0;
  56. d->p = (char*) bin->data;
  57. d->u = bin->data;
  58. d->len = bin->size;
  59. d->i = 0;
  60. d->st_data = (char*) enif_alloc(STACK_SIZE_INC * sizeof(char));
  61. d->st_size = STACK_SIZE_INC;
  62. d->st_top = 0;
  63. for(i = 0; i < d->st_size; i++) {
  64. d->st_data[i] = st_invalid;
  65. }
  66. d->st_data[0] = st_value;
  67. d->st_top++;
  68. }
  69. void
  70. dec_destroy(Decoder* d)
  71. {
  72. if(d->st_data != NULL) {
  73. enif_free(d->st_data);
  74. }
  75. }
  76. ERL_NIF_TERM
  77. dec_error(Decoder* d, const char* atom)
  78. {
  79. ERL_NIF_TERM pos = enif_make_int(d->env, d->i+1);
  80. ERL_NIF_TERM msg = make_atom(d->env, atom);
  81. ERL_NIF_TERM ret = enif_make_tuple2(d->env, pos, msg);
  82. return enif_make_tuple2(d->env, d->atoms->atom_error, ret);
  83. }
  84. char
  85. dec_curr(Decoder* d)
  86. {
  87. return d->st_data[d->st_top-1];
  88. }
  89. int
  90. dec_top(Decoder* d)
  91. {
  92. return d->st_top;
  93. }
  94. void
  95. dec_push(Decoder* d, char val)
  96. {
  97. char* tmp;
  98. int new_sz;
  99. int i;
  100. if(d->st_top >= d->st_size) {
  101. new_sz = d->st_size + STACK_SIZE_INC;
  102. tmp = (char*) enif_alloc(new_sz * sizeof(char));
  103. memcpy(tmp, d->st_data, d->st_size * sizeof(char));
  104. enif_free(d->st_data);
  105. d->st_data = tmp;
  106. d->st_size = new_sz;
  107. for(i = d->st_top; i < d->st_size; i++) {
  108. d->st_data[i] = st_invalid;
  109. }
  110. }
  111. d->st_data[d->st_top++] = val;
  112. }
  113. void
  114. dec_pop(Decoder* d, char val)
  115. {
  116. assert(d->st_data[d->st_top-1] == val && "popped invalid state.");
  117. d->st_data[d->st_top-1] = st_invalid;
  118. d->st_top--;
  119. }
  120. int
  121. dec_string(Decoder* d, ERL_NIF_TERM* value)
  122. {
  123. int has_escape = 0;
  124. int num_escapes = 0;
  125. int st;
  126. int ulen;
  127. int ui;
  128. int hi;
  129. int lo;
  130. char* chrbuf;
  131. int chrpos;
  132. if(d->p[d->i] != '\"') {
  133. return 0;
  134. }
  135. d->i++;
  136. st = d->i;
  137. while(d->i < d->len) {
  138. if(d->u[d->i] < 0x20) {
  139. return 0;
  140. } else if(d->p[d->i] == '\"') {
  141. d->i++;
  142. goto parse;
  143. } else if(d->p[d->i] == '\\') {
  144. if(d->i+1 >= d->len) {
  145. return 0;
  146. }
  147. has_escape = 1;
  148. num_escapes += 1;
  149. d->i++;
  150. switch(d->p[d->i]) {
  151. case '\"':
  152. case '\\':
  153. case '/':
  154. case 'b':
  155. case 'f':
  156. case 'n':
  157. case 'r':
  158. case 't':
  159. d->i++;
  160. break;
  161. case 'u':
  162. hi = 0;
  163. lo = 0;
  164. d->i++;
  165. if(d->i + 4 >= d->len) {
  166. return 0;
  167. }
  168. hi = int_from_hex(&(d->u[d->i]));
  169. d->i += 4;
  170. if(hi < 0) {
  171. return 0;
  172. }
  173. if(hi >= 0xD800 && hi < 0xDC00) {
  174. if(d->i + 6 >= d->len) {
  175. return 0;
  176. }
  177. if(d->p[d->i++] != '\\') {
  178. return 0;
  179. } else if(d->p[d->i++] != 'u') {
  180. return 0;
  181. }
  182. lo = int_from_hex(&(d->u[d->i]));
  183. if(lo < 0) {
  184. return 0;
  185. }
  186. hi = utf8_from_pair(hi, lo);
  187. if(hi < 0) {
  188. return 0;
  189. }
  190. }
  191. hi = utf8_len(hi);
  192. if(hi < 0) {
  193. return 0;
  194. }
  195. if(lo == 0) {
  196. num_escapes += 5 - hi;
  197. } else {
  198. num_escapes += 11 - hi;
  199. }
  200. break;
  201. default:
  202. return 0;
  203. }
  204. } else if(d->u[d->i] < 0x80) {
  205. d->i++;
  206. } else {
  207. ulen = -1;
  208. if((d->u[d->i] & 0xE0) == 0xC0) {
  209. ulen = 1;
  210. } else if((d->u[d->i] & 0xF0) == 0xE0) {
  211. ulen = 2;
  212. } else if((d->u[d->i] & 0xF8) == 0xF0) {
  213. ulen = 3;
  214. } else if((d->u[d->i] & 0xFC) == 0xF8) {
  215. ulen = 4;
  216. } else if((d->u[d->i] & 0xFE) == 0xFC) {
  217. ulen = 5;
  218. }
  219. if(ulen < 0) {
  220. return 0;
  221. }
  222. if(d->i + ulen >= d->len) {
  223. return 0;
  224. }
  225. for(ui = 0; ui < ulen; ui++) {
  226. if((d->u[d->i+1+ui] & 0xC0) != 0x80) {
  227. return 0;
  228. }
  229. }
  230. // Wikipedia says I have to check that a UTF-8 encoding
  231. // uses as few bits as possible. This means that we
  232. // can't do things like encode 't' in three bytes.
  233. // To check this all we need to ensure is that for each
  234. // of the following bit patterns that there is at least
  235. // one 1 bit in any of the x's
  236. // 11: 110xxxxy 10yyyyyy
  237. // 16: 1110xxxx 10xyyyyy 10yyyyyy
  238. // 21: 11110xxx 10xxyyyy 10yyyyyy 10yyyyyy
  239. // 26: 111110xx 10xxxyyy 10yyyyyy 10yyyyyy 10yyyyyy
  240. // 31: 1111110x 10xxxxyy 10yyyyyy 10yyyyyy 10yyyyyy 10yyyyyy
  241. if(ulen == 1) {
  242. if((d->u[d->i] & 0x1E) == 0) return 0;
  243. } else if(ulen == 2) {
  244. if((d->u[d->i] & 0x0F) + (d->u[d->i+1] & 0x20) == 0) return 0;
  245. } else if(ulen == 3) {
  246. if((d->u[d->i] & 0x07) + (d->u[d->i+1] & 0x30) == 0) return 0;
  247. } else if(ulen == 4) {
  248. if((d->u[d->i] & 0x03) + (d->u[d->i+1] & 0x38) == 0) return 0;
  249. } else if(ulen == 5) {
  250. if((d->u[d->i] & 0x01) + (d->u[d->i+1] & 0x3C) == 0) return 0;
  251. }
  252. d->i += 1 + ulen;
  253. }
  254. }
  255. parse:
  256. if(d->p[d->i-1] != '\"') {
  257. return 0;
  258. }
  259. if(!has_escape) {
  260. *value = enif_make_sub_binary(d->env, d->arg, st, (d->i - st - 1));
  261. return 1;
  262. }
  263. hi = 0;
  264. lo = 0;
  265. ulen = (d->i - 1) - st - num_escapes;
  266. chrbuf = (char*) enif_make_new_binary(d->env, ulen, value);
  267. chrpos = 0;
  268. ui = st;
  269. while(ui < d->i - 1) {
  270. if(d->p[ui] != '\\') {
  271. chrbuf[chrpos++] = d->p[ui++];
  272. continue;
  273. }
  274. ui++;
  275. switch(d->p[ui]) {
  276. case '\"':
  277. case '\\':
  278. case '/':
  279. chrbuf[chrpos++] = d->p[ui];
  280. ui++;
  281. break;
  282. case 'b':
  283. chrbuf[chrpos++] = '\b';
  284. ui++;
  285. break;
  286. case 'f':
  287. chrbuf[chrpos++] = '\f';
  288. ui++;
  289. break;
  290. case 'n':
  291. chrbuf[chrpos++] = '\n';
  292. ui++;
  293. break;
  294. case 'r':
  295. chrbuf[chrpos++] = '\r';
  296. ui++;
  297. break;
  298. case 't':
  299. chrbuf[chrpos++] = '\t';
  300. ui++;
  301. break;
  302. case 'u':
  303. ui++;
  304. hi = int_from_hex(&(d->u[ui]));
  305. if(hi >= 0xD800 && hi < 0xDC00) {
  306. lo = int_from_hex(&(d->u[ui+6]));
  307. hi = utf8_from_pair(hi, lo);
  308. ui += 10;
  309. } else {
  310. ui += 4;
  311. }
  312. hi = utf8_to_binary(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_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_object(ErlNifEnv* env, ERL_NIF_TERM pairs)
  556. {
  557. ERL_NIF_TERM ret = enif_make_list(env, 0);
  558. ERL_NIF_TERM key, val;
  559. while(enif_get_list_cell(env, pairs, &val, &pairs)) {
  560. if(!enif_get_list_cell(env, pairs, &key, &pairs)) {
  561. assert(0 == 1 && "Unbalanced object pairs.");
  562. }
  563. val = enif_make_tuple2(env, key, val);
  564. ret = enif_make_list_cell(env, val, ret);
  565. }
  566. return enif_make_tuple1(env, ret);
  567. }
  568. ERL_NIF_TERM
  569. make_array(ErlNifEnv* env, ERL_NIF_TERM list)
  570. {
  571. ERL_NIF_TERM ret = enif_make_list(env, 0);
  572. ERL_NIF_TERM item;
  573. while(enif_get_list_cell(env, list, &item, &list)) {
  574. ret = enif_make_list_cell(env, item, ret);
  575. }
  576. return ret;
  577. }
  578. ERL_NIF_TERM
  579. decode(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
  580. {
  581. Decoder dec;
  582. Decoder* d = &dec;
  583. ErlNifBinary bin;
  584. ERL_NIF_TERM objs = enif_make_list(env, 0);
  585. ERL_NIF_TERM curr = enif_make_list(env, 0);
  586. ERL_NIF_TERM val;
  587. ERL_NIF_TERM ret;
  588. if(argc != 1) {
  589. return enif_make_badarg(env);
  590. } else if(!enif_inspect_binary(env, argv[0], &bin)) {
  591. return enif_make_badarg(env);
  592. }
  593. dec_init(d, env, argv[0], &bin);
  594. //fprintf(stderr, "Parsing:\r\n");
  595. while(d->i < bin.size) {
  596. //fprintf(stderr, "state: %d\r\n", dec_curr(d));
  597. switch(dec_curr(d)) {
  598. case st_value:
  599. switch(d->p[d->i]) {
  600. case ' ':
  601. case '\n':
  602. case '\r':
  603. case '\t':
  604. d->i++;
  605. break;
  606. case 'n':
  607. if(d->i + 3 >= d->len) {
  608. ret = dec_error(d, "invalid_literal");
  609. goto done;
  610. }
  611. if(memcmp(&(d->p[d->i]), "null", 4) != 0) {
  612. ret = dec_error(d, "invalid_literal");
  613. goto done;
  614. }
  615. val = d->atoms->atom_null;
  616. dec_pop(d, st_value);
  617. d->i += 4;
  618. break;
  619. case 't':
  620. if(d->i + 3 >= d->len) {
  621. ret = dec_error(d, "invalid_literal");
  622. goto done;
  623. }
  624. if(memcmp(&(d->p[d->i]), "true", 4) != 0) {
  625. ret = dec_error(d, "invalid_literal");
  626. goto done;
  627. }
  628. val = d->atoms->atom_true;
  629. dec_pop(d, st_value);
  630. d->i += 4;
  631. break;
  632. case 'f':
  633. if(d->i + 4 >= bin.size) {
  634. ret = dec_error(d, "invalid_literal");
  635. goto done;
  636. }
  637. if(memcmp(&(d->p[d->i]), "false", 5) != 0) {
  638. ret = dec_error(d, "invalid_literal");
  639. goto done;
  640. }
  641. val = d->atoms->atom_false;
  642. dec_pop(d, st_value);
  643. d->i += 5;
  644. break;
  645. case '\"':
  646. if(!dec_string(d, &val)) {
  647. ret = dec_error(d, "invalid_string");
  648. goto done;
  649. }
  650. dec_pop(d, st_value);
  651. break;
  652. case '-':
  653. case '0':
  654. case '1':
  655. case '2':
  656. case '3':
  657. case '4':
  658. case '5':
  659. case '6':
  660. case '7':
  661. case '8':
  662. case '9':
  663. if(!dec_number(d, &val)) {
  664. ret = dec_error(d, "invalid_number");
  665. goto done;
  666. }
  667. dec_pop(d, st_value);
  668. break;
  669. case '{':
  670. dec_push(d, st_object);
  671. dec_push(d, st_key);
  672. objs = enif_make_list_cell(env, curr, objs);
  673. curr = enif_make_list(env, 0);
  674. d->i++;
  675. break;
  676. case '[':
  677. dec_push(d, st_array);
  678. dec_push(d, st_value);
  679. objs = enif_make_list_cell(env, curr, objs);
  680. curr = enif_make_list(env, 0);
  681. d->i++;
  682. break;
  683. case ']':
  684. if(!enif_is_empty_list(env, curr)) {
  685. ret = dec_error(d, "invalid_json");
  686. goto done;
  687. }
  688. dec_pop(d, st_value);
  689. if(dec_curr(d) != st_array) {
  690. ret = dec_error(d, "invalid_json");
  691. goto done;
  692. }
  693. dec_pop(d, st_array);
  694. dec_pop(d, st_value);
  695. val = curr; // curr is []
  696. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  697. ret = dec_error(d, "internal_error");
  698. goto done;
  699. }
  700. d->i++;
  701. break;
  702. default:
  703. ret = dec_error(d, "invalid_json");
  704. goto done;
  705. }
  706. if(dec_top(d) == 0) {
  707. dec_push(d, st_done);
  708. } else if(dec_curr(d) != st_value && dec_curr(d) != st_key) {
  709. dec_push(d, st_comma);
  710. curr = enif_make_list_cell(env, val, curr);
  711. }
  712. break;
  713. case st_key:
  714. switch(d->p[d->i]) {
  715. case ' ':
  716. case '\n':
  717. case '\r':
  718. case '\t':
  719. d->i++;
  720. break;
  721. case '\"':
  722. if(!dec_string(d, &val)) {
  723. ret = dec_error(d, "invalid_string");
  724. goto done;
  725. }
  726. dec_pop(d, st_key);
  727. dec_push(d, st_colon);
  728. curr = enif_make_list_cell(env, val, curr);
  729. break;
  730. case '}':
  731. if(!enif_is_empty_list(env, curr)) {
  732. ret = dec_error(d, "invalid_json");
  733. goto done;
  734. }
  735. dec_pop(d, st_key);
  736. dec_pop(d, st_object);
  737. dec_pop(d, st_value);
  738. val = enif_make_tuple1(env, curr);
  739. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  740. ret = dec_error(d, "internal_error");
  741. goto done;
  742. }
  743. if(dec_top(d) == 0) {
  744. dec_push(d, st_done);
  745. } else {
  746. dec_push(d, st_comma);
  747. curr = enif_make_list_cell(env, val, curr);
  748. }
  749. d->i++;
  750. break;
  751. default:
  752. ret = dec_error(d, "invalid_json");
  753. goto done;
  754. }
  755. break;
  756. case st_colon:
  757. switch(d->p[d->i]) {
  758. case ' ':
  759. case '\n':
  760. case '\r':
  761. case '\t':
  762. d->i++;
  763. break;
  764. case ':':
  765. dec_pop(d, st_colon);
  766. dec_push(d, st_value);
  767. d->i++;
  768. break;
  769. default:
  770. ret = dec_error(d, "invalid_json");
  771. goto done;
  772. }
  773. break;
  774. case st_comma:
  775. switch(d->p[d->i]) {
  776. case ' ':
  777. case '\n':
  778. case '\r':
  779. case '\t':
  780. d->i++;
  781. break;
  782. case ',':
  783. dec_pop(d, st_comma);
  784. switch(dec_curr(d)) {
  785. case st_object:
  786. dec_push(d, st_key);
  787. break;
  788. case st_array:
  789. dec_push(d, st_value);
  790. break;
  791. default:
  792. ret = dec_error(d, "internal_error");
  793. goto done;
  794. }
  795. d->i++;
  796. break;
  797. case '}':
  798. dec_pop(d, st_comma);
  799. if(dec_curr(d) != st_object) {
  800. ret = dec_error(d, "invalid_json");
  801. goto done;
  802. }
  803. dec_pop(d, st_object);
  804. dec_pop(d, st_value);
  805. val = make_object(env, curr);
  806. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  807. ret = dec_error(d, "internal_error");
  808. goto done;
  809. }
  810. if(dec_top(d) > 0) {
  811. dec_push(d, st_comma);
  812. curr = enif_make_list_cell(env, val, curr);
  813. } else {
  814. dec_push(d, st_done);
  815. }
  816. d->i++;
  817. break;
  818. case ']':
  819. dec_pop(d, st_comma);
  820. if(dec_curr(d) != st_array) {
  821. ret = dec_error(d, "invalid_json");
  822. goto done;
  823. }
  824. dec_pop(d, st_array);
  825. dec_pop(d, st_value);
  826. val = make_array(env, curr);
  827. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  828. ret = dec_error(d, "internal_error");
  829. goto done;
  830. }
  831. if(dec_top(d) > 0) {
  832. dec_push(d, st_comma);
  833. curr = enif_make_list_cell(env, val, curr);
  834. } else {
  835. dec_push(d, st_done);
  836. }
  837. d->i++;
  838. break;
  839. default:
  840. ret = dec_error(d, "invalid_json");
  841. goto done;
  842. }
  843. break;
  844. case st_done:
  845. switch(d->p[d->i]) {
  846. case ' ':
  847. case '\n':
  848. case '\r':
  849. case '\t':
  850. d->i++;
  851. break;
  852. default:
  853. ret = dec_error(d, "invalid_trailing_data");
  854. goto done;
  855. }
  856. break;
  857. default:
  858. ret = dec_error(d, "invalid_internal_state");
  859. goto done;
  860. }
  861. }
  862. if(dec_curr(d) != st_done) {
  863. ret = dec_error(d, "truncated_json");
  864. } else if(d->is_partial) {
  865. ret = enif_make_tuple2(env, d->atoms->atom_partial, val);
  866. } else {
  867. ret = val;
  868. }
  869. done:
  870. dec_destroy(d);
  871. return ret;
  872. }