void* write_kv(void *buf, sized_buf key, sized_buf value) { uint8_t *dst = buf; *(raw_kv_length*)dst = encode_kv_length((uint32_t)key.size, (uint32_t)value.size); dst += sizeof(raw_kv_length); memcpy(dst, key.buf, key.size); dst += key.size; memcpy(dst, value.buf, value.size); dst += value.size; return dst; }
static size_t assemble_seq_index_value(DocInfo *docinfo, char *dst) { char* const start = dst; raw_seq_index_value *raw = (raw_seq_index_value*)dst; raw->sizes = encode_kv_length(docinfo->id.size, docinfo->size); raw->bp = encode_raw48(docinfo->bp | (docinfo->deleted ? 1LL<<47 : 0)); raw->content_meta = encode_raw08(docinfo->content_meta); raw->rev_seq = encode_raw48(docinfo->rev_seq); dst += sizeof(*raw); memcpy(dst, docinfo->id.buf, docinfo->id.size); dst += docinfo->id.size; memcpy(dst, docinfo->rev_meta.buf, docinfo->rev_meta.size); dst += docinfo->rev_meta.size; return dst - start; }
static void test_bitfield_fns(void) { uint8_t expected1[8] = {0x12, 0x34, 0x56, 0x78, 0x90}; uint8_t expected2[8] = {0x09, 0x87, 0x65, 0x43, 0x21}; uint8_t expected3[8] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB}; uint8_t expected4[8] = {0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}; struct { raw_08 a; raw_48 b; raw_16 c; raw_40 d; raw_32 e; raw_08 f; } packed; raw_kv_length kv; uint32_t klen, vlen; assert(sizeof(cs_off_t) == 8); assert(sizeof(raw_08) == 1); assert(sizeof(raw_16) == 2); assert(sizeof(raw_32) == 4); assert(sizeof(raw_40) == 5); assert(sizeof(raw_48) == 6); assert(sizeof(packed) == 19); assert(sizeof(kv) == 5); kv = encode_kv_length(1234, 123456); decode_kv_length(&kv, &klen, &vlen); assert(klen == 1234); assert(vlen == 123456); test_raw_08(0); test_raw_08(UINT8_MAX); test_raw_16(0); test_raw_16(12345); test_raw_16(UINT16_MAX); test_raw_32(0); test_raw_32(12345678); test_raw_32(UINT32_MAX); test_raw_40(INT64_C(0x1234567890), expected1); test_raw_40(INT64_C(0x0987654321), expected2); test_raw_48(INT64_C(0x1234567890AB), expected3); test_raw_48(INT64_C(0xBA9876543210), expected4); }