36 lines
868 B
C
36 lines
868 B
C
|
/*
|
||
|
** Write a 64-bit variable-length integer to memory starting at p[0].
|
||
|
** The length of data write will be between 1 and 9 bytes. The number
|
||
|
** of bytes written is returned.
|
||
|
**
|
||
|
** A variable-length integer consists of the lower 7 bits of each byte
|
||
|
** for all bytes that have the 8th bit set and one byte with the 8th
|
||
|
** bit clear. Except, if we get to the 9th byte, it stores the full
|
||
|
** 8 bits and is the last byte.
|
||
|
*/
|
||
|
SQLITE_PRIVATE int sqlite3PutVarint(unsigned char *p, u64 v){
|
||
|
int i, j, n;
|
||
|
u8 buf[10];
|
||
|
if( v & (((u64)0xff000000)<<32) ){
|
||
|
p[8] = v;
|
||
|
v >>= 8;
|
||
|
for(i=7; i>=0; i--){
|
||
|
p[i] = (v & 0x7f) | 0x80;
|
||
|
v >>= 7;
|
||
|
}
|
||
|
return 9;
|
||
|
}
|
||
|
n = 0;
|
||
|
do{
|
||
|
buf[n++] = (v & 0x7f) | 0x80;
|
||
|
v >>= 7;
|
||
|
}while( v!=0 );
|
||
|
buf[0] &= 0x7f;
|
||
|
assert( n<=9 );
|
||
|
for(i=0, j=n-1; j>=0; j--, i++){
|
||
|
p[i] = buf[j];
|
||
|
}
|
||
|
return n;
|
||
|
}
|
||
|
|