Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(415)

Side by Side Diff: third_party/sqlite/sqlite-src-3100200/src/util.c

Issue 1610543003: [sql] Import reference version of SQLite 3.10.2. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 ** 2001 September 15 2 ** 2001 September 15
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
11 ************************************************************************* 11 *************************************************************************
12 ** Utility functions used throughout sqlite. 12 ** Utility functions used throughout sqlite.
13 ** 13 **
14 ** This file contains functions for allocating memory, comparing 14 ** This file contains functions for allocating memory, comparing
15 ** strings, and stuff like that. 15 ** strings, and stuff like that.
16 ** 16 **
17 */ 17 */
18 #include "sqliteInt.h" 18 #include "sqliteInt.h"
19 #include <stdarg.h> 19 #include <stdarg.h>
20 #ifdef SQLITE_HAVE_ISNAN 20 #if HAVE_ISNAN || SQLITE_HAVE_ISNAN
21 # include <math.h> 21 # include <math.h>
22 #endif 22 #endif
23 23
24 /* 24 /*
25 ** Routine needed to support the testcase() macro. 25 ** Routine needed to support the testcase() macro.
26 */ 26 */
27 #ifdef SQLITE_COVERAGE_TEST 27 #ifdef SQLITE_COVERAGE_TEST
28 void sqlite3Coverage(int x){ 28 void sqlite3Coverage(int x){
29 static unsigned dummy = 0; 29 static unsigned dummy = 0;
30 dummy += (unsigned)x; 30 dummy += (unsigned)x;
(...skipping 20 matching lines...) Expand all
51 51
52 #ifndef SQLITE_OMIT_FLOATING_POINT 52 #ifndef SQLITE_OMIT_FLOATING_POINT
53 /* 53 /*
54 ** Return true if the floating point value is Not a Number (NaN). 54 ** Return true if the floating point value is Not a Number (NaN).
55 ** 55 **
56 ** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN. 56 ** Use the math library isnan() function if compiled with SQLITE_HAVE_ISNAN.
57 ** Otherwise, we have our own implementation that works on most systems. 57 ** Otherwise, we have our own implementation that works on most systems.
58 */ 58 */
59 int sqlite3IsNaN(double x){ 59 int sqlite3IsNaN(double x){
60 int rc; /* The value return */ 60 int rc; /* The value return */
61 #if !defined(SQLITE_HAVE_ISNAN) 61 #if !SQLITE_HAVE_ISNAN && !HAVE_ISNAN
62 /* 62 /*
63 ** Systems that support the isnan() library function should probably 63 ** Systems that support the isnan() library function should probably
64 ** make use of it by compiling with -DSQLITE_HAVE_ISNAN. But we have 64 ** make use of it by compiling with -DSQLITE_HAVE_ISNAN. But we have
65 ** found that many systems do not have a working isnan() function so 65 ** found that many systems do not have a working isnan() function so
66 ** this implementation is provided as an alternative. 66 ** this implementation is provided as an alternative.
67 ** 67 **
68 ** This NaN test sometimes fails if compiled on GCC with -ffast-math. 68 ** This NaN test sometimes fails if compiled on GCC with -ffast-math.
69 ** On the other hand, the use of -ffast-math comes with the following 69 ** On the other hand, the use of -ffast-math comes with the following
70 ** warning: 70 ** warning:
71 ** 71 **
72 ** This option [-ffast-math] should never be turned on by any 72 ** This option [-ffast-math] should never be turned on by any
73 ** -O option since it can result in incorrect output for programs 73 ** -O option since it can result in incorrect output for programs
74 ** which depend on an exact implementation of IEEE or ISO 74 ** which depend on an exact implementation of IEEE or ISO
75 ** rules/specifications for math functions. 75 ** rules/specifications for math functions.
76 ** 76 **
77 ** Under MSVC, this NaN test may fail if compiled with a floating- 77 ** Under MSVC, this NaN test may fail if compiled with a floating-
78 ** point precision mode other than /fp:precise. From the MSDN 78 ** point precision mode other than /fp:precise. From the MSDN
79 ** documentation: 79 ** documentation:
80 ** 80 **
81 ** The compiler [with /fp:precise] will properly handle comparisons 81 ** The compiler [with /fp:precise] will properly handle comparisons
82 ** involving NaN. For example, x != x evaluates to true if x is NaN 82 ** involving NaN. For example, x != x evaluates to true if x is NaN
83 ** ... 83 ** ...
84 */ 84 */
85 #ifdef __FAST_MATH__ 85 #ifdef __FAST_MATH__
86 # error SQLite will not work correctly with the -ffast-math option of GCC. 86 # error SQLite will not work correctly with the -ffast-math option of GCC.
87 #endif 87 #endif
88 volatile double y = x; 88 volatile double y = x;
89 volatile double z = y; 89 volatile double z = y;
90 rc = (y!=z); 90 rc = (y!=z);
91 #else /* if defined(SQLITE_HAVE_ISNAN) */ 91 #else /* if HAVE_ISNAN */
92 rc = isnan(x); 92 rc = isnan(x);
93 #endif /* SQLITE_HAVE_ISNAN */ 93 #endif /* HAVE_ISNAN */
94 testcase( rc ); 94 testcase( rc );
95 return rc; 95 return rc;
96 } 96 }
97 #endif /* SQLITE_OMIT_FLOATING_POINT */ 97 #endif /* SQLITE_OMIT_FLOATING_POINT */
98 98
99 /* 99 /*
100 ** Compute a string length that is limited to what can be stored in 100 ** Compute a string length that is limited to what can be stored in
101 ** lower 30 bits of a 32-bit signed integer. 101 ** lower 30 bits of a 32-bit signed integer.
102 ** 102 **
103 ** The value returned will never be negative. Nor will it ever be greater 103 ** The value returned will never be negative. Nor will it ever be greater
104 ** than the actual length of the string. For very long strings (greater 104 ** than the actual length of the string. For very long strings (greater
105 ** than 1GiB) the value returned might be less than the true string length. 105 ** than 1GiB) the value returned might be less than the true string length.
106 */ 106 */
107 int sqlite3Strlen30(const char *z){ 107 int sqlite3Strlen30(const char *z){
108 const char *z2 = z;
109 if( z==0 ) return 0; 108 if( z==0 ) return 0;
110 while( *z2 ){ z2++; } 109 return 0x3fffffff & (int)strlen(z);
111 return 0x3fffffff & (int)(z2 - z);
112 } 110 }
113 111
114 /* 112 /*
115 ** Set the current error code to err_code and clear any prior error message. 113 ** Set the current error code to err_code and clear any prior error message.
116 */ 114 */
117 void sqlite3Error(sqlite3 *db, int err_code){ 115 void sqlite3Error(sqlite3 *db, int err_code){
118 assert( db!=0 ); 116 assert( db!=0 );
119 db->errCode = err_code; 117 db->errCode = err_code;
120 if( db->pErr ) sqlite3ValueSetNull(db->pErr); 118 if( db->pErr ) sqlite3ValueSetNull(db->pErr);
121 } 119 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 ** there is no consistency, we will define our own. 242 ** there is no consistency, we will define our own.
245 ** 243 **
246 ** IMPLEMENTATION-OF: R-30243-02494 The sqlite3_stricmp() and 244 ** IMPLEMENTATION-OF: R-30243-02494 The sqlite3_stricmp() and
247 ** sqlite3_strnicmp() APIs allow applications and extensions to compare 245 ** sqlite3_strnicmp() APIs allow applications and extensions to compare
248 ** the contents of two buffers containing UTF-8 strings in a 246 ** the contents of two buffers containing UTF-8 strings in a
249 ** case-independent fashion, using the same definition of "case 247 ** case-independent fashion, using the same definition of "case
250 ** independence" that SQLite uses internally when comparing identifiers. 248 ** independence" that SQLite uses internally when comparing identifiers.
251 */ 249 */
252 int sqlite3_stricmp(const char *zLeft, const char *zRight){ 250 int sqlite3_stricmp(const char *zLeft, const char *zRight){
253 register unsigned char *a, *b; 251 register unsigned char *a, *b;
252 if( zLeft==0 ){
253 return zRight ? -1 : 0;
254 }else if( zRight==0 ){
255 return 1;
256 }
254 a = (unsigned char *)zLeft; 257 a = (unsigned char *)zLeft;
255 b = (unsigned char *)zRight; 258 b = (unsigned char *)zRight;
256 while( *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } 259 while( *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; }
257 return UpperToLower[*a] - UpperToLower[*b]; 260 return UpperToLower[*a] - UpperToLower[*b];
258 } 261 }
259 int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ 262 int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){
260 register unsigned char *a, *b; 263 register unsigned char *a, *b;
264 if( zLeft==0 ){
265 return zRight ? -1 : 0;
266 }else if( zRight==0 ){
267 return 1;
268 }
261 a = (unsigned char *)zLeft; 269 a = (unsigned char *)zLeft;
262 b = (unsigned char *)zRight; 270 b = (unsigned char *)zRight;
263 while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } 271 while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; }
264 return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b]; 272 return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b];
265 } 273 }
266 274
267 /* 275 /*
268 ** The string z[] is an text representation of a real number. 276 ** The string z[] is an text representation of a real number.
269 ** Convert this string to a double and write it into *pResult. 277 ** Convert this string to a double and write it into *pResult.
270 ** 278 **
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 if( u>LARGEST_INT64 ){ 548 if( u>LARGEST_INT64 ){
541 *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; 549 *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64;
542 }else if( neg ){ 550 }else if( neg ){
543 *pNum = -(i64)u; 551 *pNum = -(i64)u;
544 }else{ 552 }else{
545 *pNum = (i64)u; 553 *pNum = (i64)u;
546 } 554 }
547 testcase( i==18 ); 555 testcase( i==18 );
548 testcase( i==19 ); 556 testcase( i==19 );
549 testcase( i==20 ); 557 testcase( i==20 );
550 if( (c!=0 && &zNum[i]<zEnd) || (i==0 && zStart==zNum) || i>19*incr || nonNum ) { 558 if( (c!=0 && &zNum[i]<zEnd) || (i==0 && zStart==zNum)
559 || i>19*incr || nonNum ){
551 /* zNum is empty or contains non-numeric text or is longer 560 /* zNum is empty or contains non-numeric text or is longer
552 ** than 19 digits (thus guaranteeing that it is too large) */ 561 ** than 19 digits (thus guaranteeing that it is too large) */
553 return 1; 562 return 1;
554 }else if( i<19*incr ){ 563 }else if( i<19*incr ){
555 /* Less than 19 digits, so we know that it fits in 64 bits */ 564 /* Less than 19 digits, so we know that it fits in 64 bits */
556 assert( u<=LARGEST_INT64 ); 565 assert( u<=LARGEST_INT64 );
557 return 0; 566 return 0;
558 }else{ 567 }else{
559 /* zNum is a 19-digit numbers. Compare it against 9223372036854775808. */ 568 /* zNum is a 19-digit numbers. Compare it against 9223372036854775808. */
560 c = compare2pow63(zNum, incr); 569 c = compare2pow63(zNum, incr);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 u = u*16 + sqlite3HexToInt(zNum[i]); 647 u = u*16 + sqlite3HexToInt(zNum[i]);
639 } 648 }
640 if( (u&0x80000000)==0 && sqlite3Isxdigit(zNum[i])==0 ){ 649 if( (u&0x80000000)==0 && sqlite3Isxdigit(zNum[i])==0 ){
641 memcpy(pValue, &u, 4); 650 memcpy(pValue, &u, 4);
642 return 1; 651 return 1;
643 }else{ 652 }else{
644 return 0; 653 return 0;
645 } 654 }
646 } 655 }
647 #endif 656 #endif
657 while( zNum[0]=='0' ) zNum++;
648 for(i=0; i<11 && (c = zNum[i] - '0')>=0 && c<=9; i++){ 658 for(i=0; i<11 && (c = zNum[i] - '0')>=0 && c<=9; i++){
649 v = v*10 + c; 659 v = v*10 + c;
650 } 660 }
651 661
652 /* The longest decimal representation of a 32 bit integer is 10 digits: 662 /* The longest decimal representation of a 32 bit integer is 10 digits:
653 ** 663 **
654 ** 1234567890 664 ** 1234567890
655 ** 2^31 -> 2147483648 665 ** 2^31 -> 2147483648
656 */ 666 */
657 testcase( i==10 ); 667 testcase( i==10 );
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 b &= SLOT_2_0; 838 b &= SLOT_2_0;
829 s = a; 839 s = a;
830 /* s: p0<<14 | p2 (masked) */ 840 /* s: p0<<14 | p2 (masked) */
831 841
832 p++; 842 p++;
833 a = a<<14; 843 a = a<<14;
834 a |= *p; 844 a |= *p;
835 /* a: p0<<28 | p2<<14 | p4 (unmasked) */ 845 /* a: p0<<28 | p2<<14 | p4 (unmasked) */
836 if (!(a&0x80)) 846 if (!(a&0x80))
837 { 847 {
838 /* we can skip these cause they were (effectively) done above in calc'ing s */ 848 /* we can skip these cause they were (effectively) done above
849 ** while calculating s */
839 /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ 850 /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */
840 /* b &= (0x7f<<14)|(0x7f); */ 851 /* b &= (0x7f<<14)|(0x7f); */
841 b = b<<7; 852 b = b<<7;
842 a |= b; 853 a |= b;
843 s = s>>18; 854 s = s>>18;
844 *v = ((u64)s)<<32 | a; 855 *v = ((u64)s)<<32 | a;
845 return 5; 856 return 5;
846 } 857 }
847 858
848 /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ 859 /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1049 return n; 1060 return n;
1050 } 1061 }
1051 #endif 1062 #endif
1052 } 1063 }
1053 1064
1054 /* 1065 /*
1055 ** Return the number of bytes that will be needed to store the given 1066 ** Return the number of bytes that will be needed to store the given
1056 ** 64-bit integer. 1067 ** 64-bit integer.
1057 */ 1068 */
1058 int sqlite3VarintLen(u64 v){ 1069 int sqlite3VarintLen(u64 v){
1059 int i = 0; 1070 int i;
1060 do{ 1071 for(i=1; (v >>= 7)!=0; i++){ assert( i<9 ); }
1061 i++;
1062 v >>= 7;
1063 }while( v!=0 && ALWAYS(i<9) );
1064 return i; 1072 return i;
1065 } 1073 }
1066 1074
1067 1075
1068 /* 1076 /*
1069 ** Read or write a four-byte big-endian integer value. 1077 ** Read or write a four-byte big-endian integer value.
1070 */ 1078 */
1071 u32 sqlite3Get4byte(const u8 *p){ 1079 u32 sqlite3Get4byte(const u8 *p){
1080 #if SQLITE_BYTEORDER==4321
1081 u32 x;
1082 memcpy(&x,p,4);
1083 return x;
1084 #elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \
1085 && defined(__GNUC__) && GCC_VERSION>=4003000
1086 u32 x;
1087 memcpy(&x,p,4);
1088 return __builtin_bswap32(x);
1089 #elif SQLITE_BYTEORDER==1234 && !defined(SQLITE_DISABLE_INTRINSIC) \
1090 && defined(_MSC_VER) && _MSC_VER>=1300
1091 u32 x;
1092 memcpy(&x,p,4);
1093 return _byteswap_ulong(x);
1094 #else
1072 testcase( p[0]&0x80 ); 1095 testcase( p[0]&0x80 );
1073 return ((unsigned)p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; 1096 return ((unsigned)p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
1097 #endif
1074 } 1098 }
1075 void sqlite3Put4byte(unsigned char *p, u32 v){ 1099 void sqlite3Put4byte(unsigned char *p, u32 v){
1100 #if SQLITE_BYTEORDER==4321
1101 memcpy(p,&v,4);
1102 #elif SQLITE_BYTEORDER==1234 && defined(__GNUC__) && GCC_VERSION>=4003000
1103 u32 x = __builtin_bswap32(v);
1104 memcpy(p,&x,4);
1105 #elif SQLITE_BYTEORDER==1234 && defined(_MSC_VER) && _MSC_VER>=1300
1106 u32 x = _byteswap_ulong(v);
1107 memcpy(p,&x,4);
1108 #else
1076 p[0] = (u8)(v>>24); 1109 p[0] = (u8)(v>>24);
1077 p[1] = (u8)(v>>16); 1110 p[1] = (u8)(v>>16);
1078 p[2] = (u8)(v>>8); 1111 p[2] = (u8)(v>>8);
1079 p[3] = (u8)v; 1112 p[3] = (u8)v;
1113 #endif
1080 } 1114 }
1081 1115
1082 1116
1083 1117
1084 /* 1118 /*
1085 ** Translate a single byte of Hex into an integer. 1119 ** Translate a single byte of Hex into an integer.
1086 ** This routine only works if h really is a valid hexadecimal 1120 ** This routine only works if h really is a valid hexadecimal
1087 ** character: 0..9a..fA..F 1121 ** character: 0..9a..fA..F
1088 */ 1122 */
1089 u8 sqlite3HexToInt(int h){ 1123 u8 sqlite3HexToInt(int h){
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
1355 if( x<10 ) return 1; 1389 if( x<10 ) return 1;
1356 n = x%10; 1390 n = x%10;
1357 x /= 10; 1391 x /= 10;
1358 if( n>=5 ) n -= 2; 1392 if( n>=5 ) n -= 2;
1359 else if( n>=1 ) n -= 1; 1393 else if( n>=1 ) n -= 1;
1360 if( x>=3 ){ 1394 if( x>=3 ){
1361 return x>60 ? (u64)LARGEST_INT64 : (n+8)<<(x-3); 1395 return x>60 ? (u64)LARGEST_INT64 : (n+8)<<(x-3);
1362 } 1396 }
1363 return (n+8)>>(3-x); 1397 return (n+8)>>(3-x);
1364 } 1398 }
OLDNEW
« no previous file with comments | « third_party/sqlite/sqlite-src-3100200/src/utf.c ('k') | third_party/sqlite/sqlite-src-3100200/src/vacuum.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698