Re: kernel.org and GIT tree rebuilding
- From
- linux@horizon.com <linux@horizon.com>
- Date
- Jul 3, 2005, 00:17 UTC
- Message-ID
- <20050703025112.18758.qmail@science.horizon.com>
Show 12 quoted lines
> unsigned long size;
> unsigned char c;
>
> c = *pack++;
> size = c & 15;
> type = (c >> 4) & 7;
> while (c & 0x80) {
> c = *pack++;
> size = (size << 7) + (c & 0x7f);
> }
>
> or something. That's even denser.If you're going for density, you missed something. Try:
c = *pack++;
size = c & 15;
type = (c >> 4) & 7;
while (c & 0x80) {
c = *pack++;
size = (size << 7) + (c & 0x7f) + 16;
}Encoding is most easily done in little-endian order, such as:
static unsigned
encode(unsigned char *p, unsigned long x)
{
unsigned char *q = p;
unsigned char buf[5];
unsigned char *b = buf; while (x > 15) {
assert(b < buf+5);
x -= 16;
*b++ = x & 0x7f;
x >>= 7;
}
*b = x; while (b != buf)
*q++ = *b-- | 0x80;
*q++ = *b;
return (unsigned)(q - p);
}(You'll probably want to rewrite the above, but it's abandoned to the public domain in any case. Go nuts.)