No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

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