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.

937 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 32
  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 is_partial;
  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->is_partial = 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. ERL_NIF_TERM num_type = d->atoms->atom_error;
  323. char state = nst_init;
  324. char nbuf[NUM_BUF_LEN];
  325. int st = d->i;
  326. int has_frac = 0;
  327. int has_exp = 0;
  328. double dval;
  329. long lval;
  330. while(d->i < d->len) {
  331. switch(state) {
  332. case nst_init:
  333. switch(d->p[d->i]) {
  334. case '-':
  335. state = nst_sign;
  336. d->i++;
  337. break;
  338. case '0':
  339. state = nst_frac0;
  340. d->i++;
  341. break;
  342. case '1':
  343. case '2':
  344. case '3':
  345. case '4':
  346. case '5':
  347. case '6':
  348. case '7':
  349. case '8':
  350. case '9':
  351. state = nst_mantissa;
  352. d->i++;
  353. break;
  354. default:
  355. return 0;
  356. }
  357. break;
  358. case nst_sign:
  359. switch(d->p[d->i]) {
  360. case '0':
  361. state = nst_frac0;
  362. d->i++;
  363. break;
  364. case '1':
  365. case '2':
  366. case '3':
  367. case '4':
  368. case '5':
  369. case '6':
  370. case '7':
  371. case '8':
  372. case '9':
  373. state = nst_mantissa;
  374. d->i++;
  375. break;
  376. default:
  377. return 0;
  378. }
  379. break;
  380. case nst_mantissa:
  381. switch(d->p[d->i]) {
  382. case '.':
  383. state = nst_frac1;
  384. d->i++;
  385. break;
  386. case 'e':
  387. case 'E':
  388. state = nst_esign;
  389. d->i++;
  390. break;
  391. case '0':
  392. case '1':
  393. case '2':
  394. case '3':
  395. case '4':
  396. case '5':
  397. case '6':
  398. case '7':
  399. case '8':
  400. case '9':
  401. d->i++;
  402. break;
  403. default:
  404. goto parse;
  405. }
  406. break;
  407. case nst_frac0:
  408. switch(d->p[d->i]) {
  409. case '.':
  410. state = nst_frac1;
  411. d->i++;
  412. break;
  413. case 'e':
  414. case 'E':
  415. state = nst_esign;
  416. d->i++;
  417. break;
  418. default:
  419. goto parse;
  420. }
  421. break;
  422. case nst_frac1:
  423. has_frac = 1;
  424. switch(d->p[d->i]) {
  425. case '0':
  426. case '1':
  427. case '2':
  428. case '3':
  429. case '4':
  430. case '5':
  431. case '6':
  432. case '7':
  433. case '8':
  434. case '9':
  435. state = nst_frac;
  436. d->i++;
  437. break;
  438. default:
  439. goto parse;
  440. }
  441. break;
  442. case nst_frac:
  443. switch(d->p[d->i]) {
  444. case 'e':
  445. case 'E':
  446. state = nst_esign;
  447. d->i++;
  448. break;
  449. case '0':
  450. case '1':
  451. case '2':
  452. case '3':
  453. case '4':
  454. case '5':
  455. case '6':
  456. case '7':
  457. case '8':
  458. case '9':
  459. d->i++;
  460. break;
  461. default:
  462. goto parse;
  463. }
  464. break;
  465. case nst_esign:
  466. has_exp = 1;
  467. switch(d->p[d->i]) {
  468. case '-':
  469. case '+':
  470. case '0':
  471. case '1':
  472. case '2':
  473. case '3':
  474. case '4':
  475. case '5':
  476. case '6':
  477. case '7':
  478. case '8':
  479. case '9':
  480. state = nst_edigit;
  481. d->i++;
  482. break;
  483. default:
  484. return 0;
  485. }
  486. break;
  487. case nst_edigit:
  488. switch(d->p[d->i]) {
  489. case '0':
  490. case '1':
  491. case '2':
  492. case '3':
  493. case '4':
  494. case '5':
  495. case '6':
  496. case '7':
  497. case '8':
  498. case '9':
  499. d->i++;
  500. break;
  501. default:
  502. goto parse;
  503. }
  504. break;
  505. default:
  506. return 0;
  507. }
  508. }
  509. parse:
  510. switch(state) {
  511. case nst_init:
  512. case nst_sign:
  513. case nst_frac1:
  514. case nst_esign:
  515. return 0;
  516. default:
  517. break;
  518. }
  519. errno = 0;
  520. if(d->i - st < NUM_BUF_LEN) {
  521. memset(nbuf, 0, NUM_BUF_LEN);
  522. memcpy(nbuf, &(d->p[st]), d->i - st);
  523. if(has_frac || has_exp) {
  524. dval = strtod(nbuf, NULL);
  525. if(errno != ERANGE) {
  526. *value = enif_make_double(d->env, dval);
  527. return 1;
  528. }
  529. } else {
  530. lval = strtol(nbuf, NULL, 10);
  531. if(errno != ERANGE) {
  532. *value = enif_make_int64(d->env, lval);
  533. return 1;
  534. }
  535. }
  536. }
  537. if(!has_frac && !has_exp) {
  538. num_type = d->atoms->atom_bignum;
  539. } else if(has_exp) {
  540. num_type = d->atoms->atom_bignum_e;
  541. } else {
  542. num_type = d->atoms->atom_bigdbl;
  543. }
  544. d->is_partial = 1;
  545. *value = enif_make_sub_binary(d->env, d->arg, st, d->i - st);
  546. *value = enif_make_tuple2(d->env, num_type, *value);
  547. return 1;
  548. }
  549. ERL_NIF_TERM
  550. make_object(ErlNifEnv* env, ERL_NIF_TERM pairs)
  551. {
  552. ERL_NIF_TERM ret = enif_make_list(env, 0);
  553. ERL_NIF_TERM key, val;
  554. while(enif_get_list_cell(env, pairs, &val, &pairs)) {
  555. if(!enif_get_list_cell(env, pairs, &key, &pairs)) {
  556. assert(0 == 1 && "Unbalanced object pairs.");
  557. }
  558. val = enif_make_tuple2(env, key, val);
  559. ret = enif_make_list_cell(env, val, ret);
  560. }
  561. return enif_make_tuple1(env, ret);
  562. }
  563. ERL_NIF_TERM
  564. make_array(ErlNifEnv* env, ERL_NIF_TERM list)
  565. {
  566. ERL_NIF_TERM ret = enif_make_list(env, 0);
  567. ERL_NIF_TERM item;
  568. while(enif_get_list_cell(env, list, &item, &list)) {
  569. ret = enif_make_list_cell(env, item, ret);
  570. }
  571. return ret;
  572. }
  573. ERL_NIF_TERM
  574. decode(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
  575. {
  576. Decoder dec;
  577. Decoder* d = &dec;
  578. ErlNifBinary bin;
  579. ERL_NIF_TERM objs = enif_make_list(env, 0);
  580. ERL_NIF_TERM curr = enif_make_list(env, 0);
  581. ERL_NIF_TERM val;
  582. ERL_NIF_TERM ret;
  583. if(argc != 1) {
  584. return enif_make_badarg(env);
  585. } else if(!enif_inspect_binary(env, argv[0], &bin)) {
  586. return enif_make_badarg(env);
  587. }
  588. dec_init(d, env, argv[0], &bin);
  589. //fprintf(stderr, "Parsing:\r\n");
  590. while(d->i < bin.size) {
  591. //fprintf(stderr, "state: %d\r\n", dec_curr(d));
  592. switch(dec_curr(d)) {
  593. case st_value:
  594. switch(d->p[d->i]) {
  595. case ' ':
  596. case '\n':
  597. case '\r':
  598. case '\t':
  599. d->i++;
  600. break;
  601. case 'n':
  602. if(d->i + 3 >= d->len) {
  603. ret = dec_error(d, "invalid_literal");
  604. goto done;
  605. }
  606. if(memcmp(&(d->p[d->i]), "null", 4) != 0) {
  607. ret = dec_error(d, "invalid_literal");
  608. goto done;
  609. }
  610. val = d->atoms->atom_null;
  611. dec_pop(d, st_value);
  612. d->i += 4;
  613. break;
  614. case 't':
  615. if(d->i + 3 >= d->len) {
  616. ret = dec_error(d, "invalid_literal");
  617. goto done;
  618. }
  619. if(memcmp(&(d->p[d->i]), "true", 4) != 0) {
  620. ret = dec_error(d, "invalid_literal");
  621. goto done;
  622. }
  623. val = d->atoms->atom_true;
  624. dec_pop(d, st_value);
  625. d->i += 4;
  626. break;
  627. case 'f':
  628. if(d->i + 4 >= bin.size) {
  629. ret = dec_error(d, "invalid_literal");
  630. goto done;
  631. }
  632. if(memcmp(&(d->p[d->i]), "false", 5) != 0) {
  633. ret = dec_error(d, "invalid_literal");
  634. goto done;
  635. }
  636. val = d->atoms->atom_false;
  637. dec_pop(d, st_value);
  638. d->i += 5;
  639. break;
  640. case '\"':
  641. if(!dec_string(d, &val)) {
  642. ret = dec_error(d, "invalid_string");
  643. goto done;
  644. }
  645. dec_pop(d, st_value);
  646. break;
  647. case '-':
  648. case '0':
  649. case '1':
  650. case '2':
  651. case '3':
  652. case '4':
  653. case '5':
  654. case '6':
  655. case '7':
  656. case '8':
  657. case '9':
  658. if(!dec_number(d, &val)) {
  659. ret = dec_error(d, "invalid_number");
  660. goto done;
  661. }
  662. dec_pop(d, st_value);
  663. break;
  664. case '{':
  665. dec_push(d, st_object);
  666. dec_push(d, st_key);
  667. objs = enif_make_list_cell(env, curr, objs);
  668. curr = enif_make_list(env, 0);
  669. d->i++;
  670. break;
  671. case '[':
  672. dec_push(d, st_array);
  673. dec_push(d, st_value);
  674. objs = enif_make_list_cell(env, curr, objs);
  675. curr = enif_make_list(env, 0);
  676. d->i++;
  677. break;
  678. case ']':
  679. if(!enif_is_empty_list(env, curr)) {
  680. ret = dec_error(d, "invalid_json");
  681. goto done;
  682. }
  683. dec_pop(d, st_value);
  684. if(dec_curr(d) != st_array) {
  685. ret = dec_error(d, "invalid_json");
  686. goto done;
  687. }
  688. dec_pop(d, st_array);
  689. dec_pop(d, st_value);
  690. val = curr; // curr is []
  691. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  692. ret = dec_error(d, "internal_error");
  693. goto done;
  694. }
  695. d->i++;
  696. break;
  697. default:
  698. ret = dec_error(d, "invalid_json");
  699. goto done;
  700. }
  701. if(dec_top(d) == 0) {
  702. dec_push(d, st_done);
  703. } else if(dec_curr(d) != st_value && dec_curr(d) != st_key) {
  704. dec_push(d, st_comma);
  705. curr = enif_make_list_cell(env, val, curr);
  706. }
  707. break;
  708. case st_key:
  709. switch(d->p[d->i]) {
  710. case ' ':
  711. case '\n':
  712. case '\r':
  713. case '\t':
  714. d->i++;
  715. break;
  716. case '\"':
  717. if(!dec_string(d, &val)) {
  718. ret = dec_error(d, "invalid_string");
  719. goto done;
  720. }
  721. dec_pop(d, st_key);
  722. dec_push(d, st_colon);
  723. curr = enif_make_list_cell(env, val, curr);
  724. break;
  725. case '}':
  726. if(!enif_is_empty_list(env, curr)) {
  727. ret = dec_error(d, "invalid_json");
  728. goto done;
  729. }
  730. dec_pop(d, st_key);
  731. dec_pop(d, st_object);
  732. dec_pop(d, st_value);
  733. val = enif_make_tuple1(env, curr);
  734. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  735. ret = dec_error(d, "internal_error");
  736. goto done;
  737. }
  738. if(dec_top(d) == 0) {
  739. dec_push(d, st_done);
  740. } else {
  741. dec_push(d, st_comma);
  742. curr = enif_make_list_cell(env, val, curr);
  743. }
  744. d->i++;
  745. break;
  746. default:
  747. ret = dec_error(d, "invalid_json");
  748. goto done;
  749. }
  750. break;
  751. case st_colon:
  752. switch(d->p[d->i]) {
  753. case ' ':
  754. case '\n':
  755. case '\r':
  756. case '\t':
  757. d->i++;
  758. break;
  759. case ':':
  760. dec_pop(d, st_colon);
  761. dec_push(d, st_value);
  762. d->i++;
  763. break;
  764. default:
  765. ret = dec_error(d, "invalid_json");
  766. goto done;
  767. }
  768. break;
  769. case st_comma:
  770. switch(d->p[d->i]) {
  771. case ' ':
  772. case '\n':
  773. case '\r':
  774. case '\t':
  775. d->i++;
  776. break;
  777. case ',':
  778. dec_pop(d, st_comma);
  779. switch(dec_curr(d)) {
  780. case st_object:
  781. dec_push(d, st_key);
  782. break;
  783. case st_array:
  784. dec_push(d, st_value);
  785. break;
  786. default:
  787. ret = dec_error(d, "internal_error");
  788. goto done;
  789. }
  790. d->i++;
  791. break;
  792. case '}':
  793. dec_pop(d, st_comma);
  794. if(dec_curr(d) != st_object) {
  795. ret = dec_error(d, "invalid_json");
  796. goto done;
  797. }
  798. dec_pop(d, st_object);
  799. dec_pop(d, st_value);
  800. val = make_object(env, curr);
  801. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  802. ret = dec_error(d, "internal_error");
  803. goto done;
  804. }
  805. if(dec_top(d) > 0) {
  806. dec_push(d, st_comma);
  807. curr = enif_make_list_cell(env, val, curr);
  808. } else {
  809. dec_push(d, st_done);
  810. }
  811. d->i++;
  812. break;
  813. case ']':
  814. dec_pop(d, st_comma);
  815. if(dec_curr(d) != st_array) {
  816. ret = dec_error(d, "invalid_json");
  817. goto done;
  818. }
  819. dec_pop(d, st_array);
  820. dec_pop(d, st_value);
  821. val = make_array(env, curr);
  822. if(!enif_get_list_cell(env, objs, &curr, &objs)) {
  823. ret = dec_error(d, "internal_error");
  824. goto done;
  825. }
  826. if(dec_top(d) > 0) {
  827. dec_push(d, st_comma);
  828. curr = enif_make_list_cell(env, val, curr);
  829. } else {
  830. dec_push(d, st_done);
  831. }
  832. d->i++;
  833. break;
  834. default:
  835. ret = dec_error(d, "invalid_json");
  836. goto done;
  837. }
  838. break;
  839. case st_done:
  840. switch(d->p[d->i]) {
  841. case ' ':
  842. case '\n':
  843. case '\r':
  844. case '\t':
  845. d->i++;
  846. break;
  847. default:
  848. ret = dec_error(d, "invalid_trailing_data");
  849. goto done;
  850. }
  851. break;
  852. default:
  853. ret = dec_error(d, "invalid_internal_state");
  854. goto done;
  855. }
  856. }
  857. if(dec_curr(d) != st_done) {
  858. ret = dec_error(d, "truncated_json");
  859. } else if(d->is_partial) {
  860. ret = enif_make_tuple2(env, d->atoms->atom_partial, val);
  861. } else {
  862. ret = enif_make_tuple2(env, d->atoms->atom_ok, val);
  863. }
  864. done:
  865. dec_destroy(d);
  866. return ret;
  867. }