static inline int sd_indexadd_keyvalue(sdindex *i, sr *r, sdbuild *build, sdindexpage *p, char *min, char *max) { assert(r->scheme->count <= 8); /* min */ sfv kv[8]; uint64_t offset; int total = 0; int part = 0; while (part < r->scheme->count) { /* read keytab offset */ min += ss_leb128read(min, &offset); /* read key */ sfv *k = &kv[part]; char *key = build->k.s + sd_buildref(build)->k + offset; uint64_t keysize; key += ss_leb128read(key, &keysize); k->key = key; k->r.size = keysize; k->r.offset = 0; total += keysize; part++; } p->sizemin = total + (r->scheme->count * sizeof(sfref)); int rc = ss_bufensure(&i->v, r->a, p->sizemin); if (ssunlikely(rc == -1)) return sr_oom(r->e); sf_write(SF_KV, i->v.p, kv, r->scheme->count, NULL, 0); ss_bufadvance(&i->v, p->sizemin); /* max */ total = 0; part = 0; while (part < r->scheme->count) { /* read keytab offset */ max += ss_leb128read(max, &offset); /* read key */ sfv *k = &kv[part]; char *key = build->k.s + sd_buildref(build)->k + offset; uint64_t keysize; key += ss_leb128read(key, &keysize); k->key = key; k->r.size = keysize; k->r.offset = 0; total += keysize; part++; } p->sizemax = total + (r->scheme->count * sizeof(sfref)); rc = ss_bufensure(&i->v, r->a, p->sizemax); if (ssunlikely(rc == -1)) return sr_oom(r->e); sf_write(SF_KV, i->v.p, kv, r->scheme->count, NULL, 0); ss_bufadvance(&i->v, p->sizemax); return 0; }
static void ssleb128_test(stc *cx) { char buffer[16]; int len; uint64_t value; len = ss_leb128write(buffer, INT8_MAX); t( len == 1 ); value = 0; len = ss_leb128read(buffer, &value); t( len == 1 ); t( value == INT8_MAX ); len = ss_leb128write(buffer, UINT8_MAX); t( len == 2 ); value = 0; len = ss_leb128read(buffer, &value); t( len == 2 ); t( value == UINT8_MAX ); len = ss_leb128write(buffer, INT16_MAX); t( len == 3 ); value = 0; len = ss_leb128read(buffer, &value); t( len == 3 ); t( value == INT16_MAX ); len = ss_leb128write(buffer, UINT16_MAX); t( len == 3 ); value = 0; len = ss_leb128read(buffer, &value); t( len == 3 ); t( value == UINT16_MAX ); len = ss_leb128write(buffer, INT32_MAX); t( len == 5 ); value = 0; len = ss_leb128read(buffer, &value); t( len == 5 ); t( value == INT32_MAX ); len = ss_leb128write(buffer, UINT32_MAX); t( len == 5 ); value = 0; len = ss_leb128read(buffer, &value); t( len == 5 ); t( value == UINT32_MAX ); len = ss_leb128write(buffer, INT64_MAX); t( len == 9 ); value = 0; len = ss_leb128read(buffer, &value); t( len == 9 ); t( value == INT64_MAX ); len = ss_leb128write(buffer, UINT64_MAX); t( len == 10 ); value = 0; len = ss_leb128read(buffer, &value); t( len == 10 ); t( value == UINT64_MAX ); }