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