SRL_STATIC_INLINE void srl_fill_header(pTHX_ srl_merger_t *mrg, const char *user_header, STRLEN user_header_len) { /* 4 byte magic string + proto version * + potentially uncompressed size varint * + 1 byte varint that indicates zero-length header */ GROW_BUF(&mrg->obuf, 128); if (expect_true(mrg->protocol_version > 2)) { srl_buf_cat_str_s_nocheck(&mrg->obuf, SRL_MAGIC_STRING_HIGHBIT); } else { srl_buf_cat_str_s_nocheck(&mrg->obuf, SRL_MAGIC_STRING); } srl_buf_cat_char_nocheck(&mrg->obuf, (U8) mrg->protocol_version); if (user_header == NULL) { srl_buf_cat_char_nocheck(&mrg->obuf, '\0'); } else { if (expect_false(mrg->protocol_version < 2)) croak("Cannot serialize user header data in Sereal protocol V1 mode!"); // TODO srl_buf_cat_varint_nocheck(aTHX_ &mrg->obuf, 0, (UV) (user_header_len + 1)); /* Encode header length, +1 for bit field */ srl_buf_cat_char_nocheck(&mrg->obuf, '\1'); /* Encode bitfield */ Copy(user_header, mrg->obuf.pos, user_header_len, char); /* Copy user header data */ mrg->obuf.pos += user_header_len; } SRL_UPDATE_BODY_POS(&mrg->obuf, mrg->protocol_version); }
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_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) */ }