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 FinkelSQLITE_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