xref: /llvm-project/llvm/test/tools/llvm-opt-report/Inputs/sr2.c (revision 4d6f3088c328c19e6ed122cc02f92f23fbe5e52d)
1*4d6f3088SHal Finkel /*
2*4d6f3088SHal Finkel ** Write a 64-bit variable-length integer to memory starting at p[0].
3*4d6f3088SHal Finkel ** The length of data write will be between 1 and 9 bytes.  The number
4*4d6f3088SHal Finkel ** of bytes written is returned.
5*4d6f3088SHal Finkel **
6*4d6f3088SHal Finkel ** A variable-length integer consists of the lower 7 bits of each byte
7*4d6f3088SHal Finkel ** for all bytes that have the 8th bit set and one byte with the 8th
8*4d6f3088SHal Finkel ** bit clear.  Except, if we get to the 9th byte, it stores the full
9*4d6f3088SHal Finkel ** 8 bits and is the last byte.
10*4d6f3088SHal Finkel */
sqlite3PutVarint(unsigned char * p,u64 v)11*4d6f3088SHal Finkel SQLITE_PRIVATE int sqlite3PutVarint(unsigned char *p, u64 v){
12*4d6f3088SHal Finkel   int i, j, n;
13*4d6f3088SHal Finkel   u8 buf[10];
14*4d6f3088SHal Finkel   if( v & (((u64)0xff000000)<<32) ){
15*4d6f3088SHal Finkel     p[8] = v;
16*4d6f3088SHal Finkel     v >>= 8;
17*4d6f3088SHal Finkel     for(i=7; i>=0; i--){
18*4d6f3088SHal Finkel       p[i] = (v & 0x7f) | 0x80;
19*4d6f3088SHal Finkel       v >>= 7;
20*4d6f3088SHal Finkel     }
21*4d6f3088SHal Finkel     return 9;
22*4d6f3088SHal Finkel   }
23*4d6f3088SHal Finkel   n = 0;
24*4d6f3088SHal Finkel   do{
25*4d6f3088SHal Finkel     buf[n++] = (v & 0x7f) | 0x80;
26*4d6f3088SHal Finkel     v >>= 7;
27*4d6f3088SHal Finkel   }while( v!=0 );
28*4d6f3088SHal Finkel   buf[0] &= 0x7f;
29*4d6f3088SHal Finkel   assert( n<=9 );
30*4d6f3088SHal Finkel   for(i=0, j=n-1; j>=0; j--, i++){
31*4d6f3088SHal Finkel     p[i] = buf[j];
32*4d6f3088SHal Finkel   }
33*4d6f3088SHal Finkel   return n;
34*4d6f3088SHal Finkel }
35*4d6f3088SHal Finkel 
36