void srl_write_header(pTHX_ srl_encoder_t *enc) { /* 4th to 8th bit are flags. Using 4th for snappy flag. FIXME needs to go in spec. */ const U8 version_and_flags = SRL_PROTOCOL_VERSION | ( SRL_ENC_HAVE_OPTION(enc, SRL_F_COMPRESS_SNAPPY) ? SRL_PROTOCOL_ENCODING_SNAPPY : SRL_ENC_HAVE_OPTION(enc, SRL_F_COMPRESS_SNAPPY_INCREMENTAL) ? SRL_PROTOCOL_ENCODING_SNAPPY_INCREMENTAL : SRL_PROTOCOL_ENCODING_RAW ); /* 4 byte magic string + proto version * + potentially uncompressed size varint * + 1 byte varint that indicates zero-length header */ BUF_SIZE_ASSERT(enc, sizeof(SRL_MAGIC_STRING) + 1 + 1); srl_buf_cat_str_s_nocheck(enc, SRL_MAGIC_STRING); srl_buf_cat_char_nocheck(enc, version_and_flags); srl_buf_cat_char_nocheck(enc, '\0'); /* variable header length (0 right now) */ }
/* This is fired when we exit the Perl pseudo-block. * It frees our encoder and all. Put encoder-level cleanup * logic here so that we can simply use croak/longjmp for * exception handling. Makes life vastly easier! */ void srl_destructor_hook(pTHX_ void *p) { srl_encoder_t *enc = (srl_encoder_t *)p; /* Do not auto-destroy encoder if set to be re-used */ if (!SRL_ENC_HAVE_OPTION(enc, SRL_F_REUSE_ENCODER)) { /* Exception cleanup. Under normal operation, we should have * assigned NULL to buf_start after we're done. */ srl_destroy_encoder(aTHX_ enc); } else { srl_clear_encoder(aTHX_ enc); } }