blob: f4d6e0c0ce98afd054c31cb0986272d78a63b8ed (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
/* copyright (c) 2007 magnus auvinen, see licence.txt for more info */
#include <base/system.h>
/* Format: ESDDDDDD EDDDDDDD EDD... Extended, Data, Sign */
unsigned char *vint_pack(unsigned char *dst, int i)
{
*dst = (i>>25)&0x40; /* set sign bit if i<0 */
i = i^(i>>31); /* if(i<0) i = ~i */
*dst |= i&0x3F; /* pack 6bit into dst */
i >>= 6; /* discard 6 bits */
if(i)
{
*dst |= 0x80; /* set extend bit */
while(1)
{
dst++;
*dst = i&(0x7F); /* pack 7bit */
i >>= 7; /* discard 7 bits */
*dst |= (i!=0)<<7; /* set extend bit (may branch) */
if(!i)
break;
}
}
dst++;
return dst;
}
const unsigned char *vint_unpack(const unsigned char *src, int *i)
{
int sign = (*src>>6)&1;
*i = *src&0x3F;
do
{
if(!(*src&0x80)) break;
src++;
*i |= (*src&(0x7F))<<(6);
if(!(*src&0x80)) break;
src++;
*i |= (*src&(0x7F))<<(6+7);
if(!(*src&0x80)) break;
src++;
*i |= (*src&(0x7F))<<(6+7+7);
if(!(*src&0x80)) break;
src++;
*i |= (*src&(0x7F))<<(6+7+7+7);
} while(0);
src++;
*i ^= -sign; /* if(sign) *i = ~(*i) */
return src;
}
long intpack_decompress(const void *src_, int size, void *dst_)
{
const unsigned char *src = (unsigned char *)src_;
const unsigned char *end = src + size;
int *dst = (int *)dst_;
while(src < end)
{
src = vint_unpack(src, dst);
dst++;
}
return (long)((unsigned char *)dst-(unsigned char *)dst_);
}
long intpack_compress(const void *src_, int size, void *dst_)
{
int *src = (int *)src_;
unsigned char *dst = (unsigned char *)dst_;
size /= 4;
while(size)
{
dst = vint_pack(dst, *src);
size--;
src++;
}
return (long)(dst-(unsigned char *)dst_);
}
|