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.

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