persistentstorage/sql/SQLite/util.c
branchRCL_3
changeset 24 cc28652e0254
parent 23 26645d81f48d
equal deleted inserted replaced
23:26645d81f48d 24:cc28652e0254
   544   }
   544   }
   545   return sqlite3PutVarint(p, v);
   545   return sqlite3PutVarint(p, v);
   546 }
   546 }
   547 
   547 
   548 /*
   548 /*
   549 ** Bitmasks used by sqlite3GetVarint().  These precomputed constants
       
   550 ** are defined here rather than simply putting the constant expressions
       
   551 ** inline in order to work around bugs in the RVT compiler.
       
   552 **
       
   553 ** SLOT_2_0     A mask for  (0x7f<<14) | 0x7f
       
   554 **
       
   555 ** SLOT_4_2_0   A mask for  (0x7f<<28) | SLOT_2_0
       
   556 */
       
   557 #define SLOT_2_0     0x001fc07f
       
   558 #define SLOT_4_2_0   0xf01fc07f
       
   559 
       
   560 
       
   561 /*
       
   562 ** Read a 64-bit variable-length integer from memory starting at p[0].
   549 ** Read a 64-bit variable-length integer from memory starting at p[0].
   563 ** Return the number of bytes read.  The value is stored in *v.
   550 ** Return the number of bytes read.  The value is stored in *v.
   564 */
   551 */
   565 int sqlite3GetVarint(const unsigned char *p, u64 *v){
   552 int sqlite3GetVarint(const unsigned char *p, u64 *v){
   566   u32 a,b,s;
   553   u32 a,b,s;
   583     a |= b;
   570     a |= b;
   584     *v = a;
   571     *v = a;
   585     return 2;
   572     return 2;
   586   }
   573   }
   587 
   574 
   588   /* Verify that constants are precomputed correctly */
       
   589   assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) );
       
   590   assert( SLOT_4_2_0 == ((0xf<<28) | (0x7f<<14) | (0x7f)) );
       
   591 
       
   592   p++;
   575   p++;
   593   a = a<<14;
   576   a = a<<14;
   594   a |= *p;
   577   a |= *p;
   595   /* a: p0<<14 | p2 (unmasked) */
   578   /* a: p0<<14 | p2 (unmasked) */
   596   if (!(a&0x80))
   579   if (!(a&0x80))
   597   {
   580   {
   598     a &= SLOT_2_0;
   581     a &= (0x7f<<14)|(0x7f);
   599     b &= 0x7f;
   582     b &= 0x7f;
   600     b = b<<7;
   583     b = b<<7;
   601     a |= b;
   584     a |= b;
   602     *v = a;
   585     *v = a;
   603     return 3;
   586     return 3;
   604   }
   587   }
   605 
   588 
   606   /* CSE1 from below */
   589   /* CSE1 from below */
   607   a &= SLOT_2_0;
   590   a &= (0x7f<<14)|(0x7f);
   608   p++;
   591   p++;
   609   b = b<<14;
   592   b = b<<14;
   610   b |= *p;
   593   b |= *p;
   611   /* b: p1<<14 | p3 (unmasked) */
   594   /* b: p1<<14 | p3 (unmasked) */
   612   if (!(b&0x80))
   595   if (!(b&0x80))
   613   {
   596   {
   614     b &= SLOT_2_0;
   597     b &= (0x7f<<14)|(0x7f);
   615     /* moved CSE1 up */
   598     /* moved CSE1 up */
   616     /* a &= (0x7f<<14)|(0x7f); */
   599     /* a &= (0x7f<<14)|(0x7f); */
   617     a = a<<7;
   600     a = a<<7;
   618     a |= b;
   601     a |= b;
   619     *v = a;
   602     *v = a;
   623   /* a: p0<<14 | p2 (masked) */
   606   /* a: p0<<14 | p2 (masked) */
   624   /* b: p1<<14 | p3 (unmasked) */
   607   /* b: p1<<14 | p3 (unmasked) */
   625   /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
   608   /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
   626   /* moved CSE1 up */
   609   /* moved CSE1 up */
   627   /* a &= (0x7f<<14)|(0x7f); */
   610   /* a &= (0x7f<<14)|(0x7f); */
   628   b &= SLOT_2_0;
   611   b &= (0x7f<<14)|(0x7f);
   629   s = a;
   612   s = a;
   630   /* s: p0<<14 | p2 (masked) */
   613   /* s: p0<<14 | p2 (masked) */
   631 
   614 
   632   p++;
   615   p++;
   633   a = a<<14;
   616   a = a<<14;
   656   /* b: p1<<28 | p3<<14 | p5 (unmasked) */
   639   /* b: p1<<28 | p3<<14 | p5 (unmasked) */
   657   if (!(b&0x80))
   640   if (!(b&0x80))
   658   {
   641   {
   659     /* we can skip this cause it was (effectively) done above in calc'ing s */
   642     /* we can skip this cause it was (effectively) done above in calc'ing s */
   660     /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
   643     /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
   661     a &= SLOT_2_0;
   644     a &= (0x7f<<14)|(0x7f);
   662     a = a<<7;
   645     a = a<<7;
   663     a |= b;
   646     a |= b;
   664     s = s>>18;
   647     s = s>>18;
   665     *v = ((u64)s)<<32 | a;
   648     *v = ((u64)s)<<32 | a;
   666     return 6;
   649     return 6;
   670   a = a<<14;
   653   a = a<<14;
   671   a |= *p;
   654   a |= *p;
   672   /* a: p2<<28 | p4<<14 | p6 (unmasked) */
   655   /* a: p2<<28 | p4<<14 | p6 (unmasked) */
   673   if (!(a&0x80))
   656   if (!(a&0x80))
   674   {
   657   {
   675     a &= SLOT_4_2_0;
   658     a &= (0x7f<<28)|(0x7f<<14)|(0x7f);
   676     b &= SLOT_2_0;
   659     b &= (0x7f<<14)|(0x7f);
   677     b = b<<7;
   660     b = b<<7;
   678     a |= b;
   661     a |= b;
   679     s = s>>11;
   662     s = s>>11;
   680     *v = ((u64)s)<<32 | a;
   663     *v = ((u64)s)<<32 | a;
   681     return 7;
   664     return 7;
   682   }
   665   }
   683 
   666 
   684   /* CSE2 from below */
   667   /* CSE2 from below */
   685   a &= SLOT_2_0;
   668   a &= (0x7f<<14)|(0x7f);
   686   p++;
   669   p++;
   687   b = b<<14;
   670   b = b<<14;
   688   b |= *p;
   671   b |= *p;
   689   /* b: p3<<28 | p5<<14 | p7 (unmasked) */
   672   /* b: p3<<28 | p5<<14 | p7 (unmasked) */
   690   if (!(b&0x80))
   673   if (!(b&0x80))
   691   {
   674   {
   692     b &= SLOT_4_2_0;
   675     b &= (0x7f<<28)|(0x7f<<14)|(0x7f);
   693     /* moved CSE2 up */
   676     /* moved CSE2 up */
   694     /* a &= (0x7f<<14)|(0x7f); */
   677     /* a &= (0x7f<<14)|(0x7f); */
   695     a = a<<7;
   678     a = a<<7;
   696     a |= b;
   679     a |= b;
   697     s = s>>4;
   680     s = s>>4;
   704   a |= *p;
   687   a |= *p;
   705   /* a: p4<<29 | p6<<15 | p8 (unmasked) */
   688   /* a: p4<<29 | p6<<15 | p8 (unmasked) */
   706 
   689 
   707   /* moved CSE2 up */
   690   /* moved CSE2 up */
   708   /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */
   691   /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */
   709   b &= SLOT_2_0;
   692   b &= (0x7f<<14)|(0x7f);
   710   b = b<<8;
   693   b = b<<8;
   711   a |= b;
   694   a |= b;
   712 
   695 
   713   s = s<<4;
   696   s = s<<4;
   714   b = p[-4];
   697   b = p[-4];
   782   a = a<<14;
   765   a = a<<14;
   783   a |= *p;
   766   a |= *p;
   784   /* a: p0<<28 | p2<<14 | p4 (unmasked) */
   767   /* a: p0<<28 | p2<<14 | p4 (unmasked) */
   785   if (!(a&0x80))
   768   if (!(a&0x80))
   786   {
   769   {
   787     a &= SLOT_4_2_0;
   770     a &= (0x7f<<28)|(0x7f<<14)|(0x7f);
   788     b &= SLOT_4_2_0;
   771     b &= (0x7f<<28)|(0x7f<<14)|(0x7f);
   789     b = b<<7;
   772     b = b<<7;
   790     *v = a | b;
   773     *v = a | b;
   791     return 5;
   774     return 5;
   792   }
   775   }
   793 
   776