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