25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

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