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;
 | |
| }
 | |
| 
 |