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.

934 lines
27 KiB

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