#ifndef SRL_ENC_H_
#define SRL_ENC_H_
#include "EXTERN.h"
#include "perl.h"
#ifdef MEMDEBUG
# define INITIALIZATION_SIZE 1
#else
# define INITIALIZATION_SIZE 64
#endif
#include "srl_inline.h"
#include "srl_buffer_types.h"
typedef
struct
PTABLE * ptable_ptr;
typedef
struct
{
srl_buffer_t buf;
srl_buffer_t tmp_buf;
U32 operational_flags;
U32 flags;
U32 protocol_version;
UV max_recursion_depth;
UV recursion_depth;
ptable_ptr ref_seenhash;
ptable_ptr weak_seenhash;
ptable_ptr str_seenhash;
ptable_ptr freezeobj_svhash;
HV *string_deduper_hv;
void
*snappy_workmem;
IV compress_threshold;
IV compress_level;
SV *sereal_string_sv;
SV *scratch_sv;
} srl_encoder_t;
typedef
struct
{
SV *sv;
U32 hash;
} sv_with_hash;
typedef
struct
{
union
{
SV *sv;
} key;
union
{
HE *he;
SV *sv;
} val;
} HE_SV;
srl_encoder_t *srl_build_encoder_struct(pTHX_ HV *opt, sv_with_hash *options);
srl_encoder_t *srl_build_encoder_struct_alike(pTHX_ srl_encoder_t *proto);
void
srl_clear_encoder(pTHX_ srl_encoder_t *enc);
void
srl_destroy_encoder(pTHX_ srl_encoder_t *enc);
void
srl_write_header(pTHX_ srl_encoder_t *enc, SV *user_header_src,
const
U32 compress_flags);
SV *srl_dump_data_structure_mortal_sv(pTHX_ srl_encoder_t *enc, SV *src, SV *user_header_src,
const
U32 flags);
#define SRL_F_SHARED_HASHKEYS 0x00001UL
#define SRL_F_REUSE_ENCODER 0x00002UL
#define SRL_F_CROAK_ON_BLESS 0x00004UL
#define SRL_F_UNDEF_UNKNOWN 0x00008UL
#define SRL_F_STRINGIFY_UNKNOWN 0x00010UL
#define SRL_F_WARN_UNKNOWN 0x00020UL
#define SRL_F_NOWARN_UNKNOWN_OVERLOAD 0x00200UL
#define SRL_F_SORT_KEYS 0x00400UL
#define SRL_F_DEDUPE_STRINGS 0x00800UL
#define SRL_F_ALIASED_DEDUPE_STRINGS 0x01000UL
#define SRL_F_NO_BLESS_OBJECTS 0x02000UL
#define SRL_F_ENABLE_FREEZE_SUPPORT 0x04000UL
#define SRL_F_CANONICAL_REFS 0x08000UL
#define SRL_F_SORT_KEYS_PERL 0x10000UL
#define SRL_F_SORT_KEYS_PERL_REV 0x20000UL
#define SRL_OF_ENCODER_DIRTY 1UL
#define SRL_ENC_HAVE_OPTION(enc, flag_num) ((enc)->flags & (flag_num))
#define SRL_ENC_SET_OPTION(enc, flag_num) STMT_START {(enc)->flags |= (flag_num);}STMT_END
#define SRL_ENC_RESET_OPTION(enc, flag_num) STMT_START {(enc)->flags &= ~(flag_num);}STMT_END
#define SRL_ENC_HAVE_OPER_FLAG(enc, flag_num) ((enc)->operational_flags & (flag_num))
#define SRL_ENC_SET_OPER_FLAG(enc, flag_num) STMT_START {(enc)->operational_flags |= (flag_num);}STMT_END
#define SRL_ENC_RESET_OPER_FLAG(enc, flag_num) STMT_START {(enc)->operational_flags &= ~(flag_num);}STMT_END
#define SRL_ENC_SV_COPY_ALWAYS 0x00000000UL
#define SRL_ENC_SV_REUSE_MAYBE 0x00000001UL
#define SRL_UNSUPPORTED_SvTYPE(svt) ( \
\
svt == SVt_PVGV || \
svt == SVt_PVCV || \
svt == SVt_PVFM || \
svt == SVt_PVIO || \
0 )
#if defined(SRL_ALLOW_LONG_DOUBLE) && defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
#define SRL_DO_LONG_DOUBLE 1
#else
#define SRL_DO_LONG_DOUBLE 0
#endif
#define SRL_INIT_OPTION(idx, str) STMT_START { \
MY_CXT.options[idx].sv = newSVpvn((str
""
), (
sizeof
(str) - 1)); \
PERL_HASH(MY_CXT.options[idx].hash, (str
""
), (
sizeof
(str) - 1)); \
} STMT_END
#define SRL_ENC_OPT_STR_ALIASED_DEDUPE_STRINGS "aliased_dedupe_strings"
#define SRL_ENC_OPT_IDX_ALIASED_DEDUPE_STRINGS 0
#define SRL_ENC_OPT_STR_CANONICAL "canonical"
#define SRL_ENC_OPT_IDX_CANONICAL 1
#define SRL_ENC_OPT_STR_CANONICAL_REFS "canonical_refs"
#define SRL_ENC_OPT_IDX_CANONICAL_REFS 2
#define SRL_ENC_OPT_STR_COMPRESS "compress"
#define SRL_ENC_OPT_IDX_COMPRESS 3
#define SRL_ENC_OPT_STR_COMPRESS_LEVEL "compress_level"
#define SRL_ENC_OPT_IDX_COMPRESS_LEVEL 4
#define SRL_ENC_OPT_STR_COMPRESS_THRESHOLD "compress_threshold"
#define SRL_ENC_OPT_IDX_COMPRESS_THRESHOLD 5
#define SRL_ENC_OPT_STR_CROAK_ON_BLESS "croak_on_bless"
#define SRL_ENC_OPT_IDX_CROAK_ON_BLESS 6
#define SRL_ENC_OPT_STR_DEDUPE_STRINGS "dedupe_strings"
#define SRL_ENC_OPT_IDX_DEDUPE_STRINGS 7
#define SRL_ENC_OPT_STR_FREEZE_CALLBACKS "freeze_callbacks"
#define SRL_ENC_OPT_IDX_FREEZE_CALLBACKS 8
#define SRL_ENC_OPT_STR_MAX_RECURSION_DEPTH "max_recursion_depth"
#define SRL_ENC_OPT_IDX_MAX_RECURSION_DEPTH 9
#define SRL_ENC_OPT_STR_NO_BLESS_OBJECTS "no_bless_objects"
#define SRL_ENC_OPT_IDX_NO_BLESS_OBJECTS 10
#define SRL_ENC_OPT_STR_NO_SHARED_HASHKEYS "no_shared_hashkeys"
#define SRL_ENC_OPT_IDX_NO_SHARED_HASHKEYS 11
#define SRL_ENC_OPT_STR_PROTOCOL_VERSION "protocol_version"
#define SRL_ENC_OPT_IDX_PROTOCOL_VERSION 12
#define SRL_ENC_OPT_STR_SNAPPY "snappy"
#define SRL_ENC_OPT_IDX_SNAPPY 13
#define SRL_ENC_OPT_STR_SNAPPY_INCR "snappy_incr"
#define SRL_ENC_OPT_IDX_SNAPPY_INCR 14
#define SRL_ENC_OPT_STR_SNAPPY_THRESHOLD "snappy_threshold"
#define SRL_ENC_OPT_IDX_SNAPPY_THRESHOLD 15
#define SRL_ENC_OPT_STR_SORT_KEYS "sort_keys"
#define SRL_ENC_OPT_IDX_SORT_KEYS 16
#define SRL_ENC_OPT_STR_STRINGIFY_UNKNOWN "stringify_unknown"
#define SRL_ENC_OPT_IDX_STRINGIFY_UNKNOWN 17
#define SRL_ENC_OPT_STR_UNDEF_UNKNOWN "undef_unknown"
#define SRL_ENC_OPT_IDX_UNDEF_UNKNOWN 18
#define SRL_ENC_OPT_STR_USE_PROTOCOL_V1 "use_protocol_v1"
#define SRL_ENC_OPT_IDX_USE_PROTOCOL_V1 19
#define SRL_ENC_OPT_STR_WARN_UNKNOWN "warn_unknown"
#define SRL_ENC_OPT_IDX_WARN_UNKNOWN 20
#define SRL_ENC_OPT_COUNT 21
#endif