Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1059 рядки
30 KiB

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