1 // This file is part of Jiffy released under the MIT license.
2 // See the LICENSE file for more information.
3 
4 #ifndef JIFFY_H
5 #define JIFFY_H
6 
7 #include "erl_nif.h"
8 
9 #define DEFAULT_BYTES_PER_REDUCTION 20
10 #define DEFAULT_ERLANG_REDUCTION_COUNT 2000
11 
12 #define MAP_TYPE_PRESENT \
13     ((ERL_NIF_MAJOR_VERSION == 2 && ERL_NIF_MINOR_VERSION >= 6) \
14     || (ERL_NIF_MAJOR_VERSION > 2))
15 
16 #define CONSUME_TIMESLICE_PRESENT \
17         ((ERL_NIF_MAJOR_VERSION >= 2 && ERL_NIF_MINOR_VERSION >= 4))
18 
19 #define SCHEDULE_NIF_PRESENT \
20         ((ERL_NIF_MAJOR_VERSION >= 2 && ERL_NIF_MINOR_VERSION >= 7))
21 
22 typedef struct {
23     ERL_NIF_TERM    atom_ok;
24     ERL_NIF_TERM    atom_error;
25     ERL_NIF_TERM    atom_null;
26     ERL_NIF_TERM    atom_true;
27     ERL_NIF_TERM    atom_false;
28     ERL_NIF_TERM    atom_bignum;
29     ERL_NIF_TERM    atom_bignum_e;
30     ERL_NIF_TERM    atom_bigdbl;
31     ERL_NIF_TERM    atom_partial;
32     ERL_NIF_TERM    atom_uescape;
33     ERL_NIF_TERM    atom_pretty;
34     ERL_NIF_TERM    atom_force_utf8;
35     ERL_NIF_TERM    atom_iter;
36     ERL_NIF_TERM    atom_bytes_per_iter;
37     ERL_NIF_TERM    atom_bytes_per_red;
38     ERL_NIF_TERM    atom_return_maps;
39     ERL_NIF_TERM    atom_return_trailer;
40     ERL_NIF_TERM    atom_has_trailer;
41     ERL_NIF_TERM    atom_nil;
42     ERL_NIF_TERM    atom_use_nil;
43     ERL_NIF_TERM    atom_null_term;
44     ERL_NIF_TERM    atom_escape_forward_slashes;
45     ERL_NIF_TERM    atom_dedupe_keys;
46     ERL_NIF_TERM    atom_copy_strings;
47 
48     ERL_NIF_TERM    ref_object;
49     ERL_NIF_TERM    ref_array;
50 
51     ErlNifResourceType* res_dec;
52     ErlNifResourceType* res_enc;
53 } jiffy_st;
54 
55 ERL_NIF_TERM make_atom(ErlNifEnv* env, const char* name);
56 ERL_NIF_TERM make_ok(jiffy_st* st, ErlNifEnv* env, ERL_NIF_TERM data);
57 ERL_NIF_TERM make_error(jiffy_st* st, ErlNifEnv* env, const char* error);
58 ERL_NIF_TERM make_obj_error(jiffy_st* st, ErlNifEnv* env, const char* error,
59         ERL_NIF_TERM obj);
60 int get_bytes_per_iter(ErlNifEnv* env, ERL_NIF_TERM val, size_t* bpi);
61 int get_bytes_per_red(ErlNifEnv* env, ERL_NIF_TERM val, size_t* bpr);
62 int get_null_term(ErlNifEnv* env, ERL_NIF_TERM val, ERL_NIF_TERM *null_term);
63 int should_yield(size_t used, size_t bytes_per_red);
64 void bump_used_reds(ErlNifEnv* env, size_t used, size_t bytes_per_red);
65 
66 ERL_NIF_TERM decode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
67 ERL_NIF_TERM decode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
68 ERL_NIF_TERM encode_init(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
69 ERL_NIF_TERM encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
70 
71 void dec_destroy(ErlNifEnv* env, void* obj);
72 void enc_destroy(ErlNifEnv* env, void* obj);
73 
74 int make_object(ErlNifEnv* env, ERL_NIF_TERM pairs, ERL_NIF_TERM* out,
75         int ret_map, int dedupe_keys);
76 
77 int int_from_hex(const unsigned char* p);
78 int int_to_hex(int val, unsigned char* p);
79 int utf8_len(int c);
80 int utf8_esc_len(int c);
81 int utf8_validate(unsigned char* data, size_t size);
82 int utf8_to_unicode(unsigned char* buf, size_t size);
83 int unicode_to_utf8(int c, unsigned char* buf);
84 int unicode_from_pair(int hi, int lo);
85 int unicode_uescape(int c, unsigned char* buf);
86 int double_to_shortest(unsigned char *buf, size_t size, size_t* len, double val);
87 
88 #endif // Included JIFFY_H
89