Annotation of embedaddon/php/ext/sqlite/libsqlite/src/util.c, revision 1.1

1.1     ! misho       1: /*
        !             2: ** 2001 September 15
        !             3: **
        !             4: ** The author disclaims copyright to this source code.  In place of
        !             5: ** a legal notice, here is a blessing:
        !             6: **
        !             7: **    May you do good and not evil.
        !             8: **    May you find forgiveness for yourself and forgive others.
        !             9: **    May you share freely, never taking more than you give.
        !            10: **
        !            11: *************************************************************************
        !            12: ** Utility functions used throughout sqlite.
        !            13: **
        !            14: ** This file contains functions for allocating memory, comparing
        !            15: ** strings, and stuff like that.
        !            16: **
        !            17: ** $Id: util.c 203289 2005-12-20 15:26:26Z iliaa $
        !            18: */
        !            19: #include "sqliteInt.h"
        !            20: #include <stdarg.h>
        !            21: #include <ctype.h>
        !            22: 
        !            23: /*
        !            24: ** If malloc() ever fails, this global variable gets set to 1.
        !            25: ** This causes the library to abort and never again function.
        !            26: */
        !            27: int sqlite_malloc_failed = 0;
        !            28: 
        !            29: /*
        !            30: ** If MEMORY_DEBUG is defined, then use versions of malloc() and
        !            31: ** free() that track memory usage and check for buffer overruns.
        !            32: */
        !            33: #ifdef MEMORY_DEBUG
        !            34: 
        !            35: /*
        !            36: ** For keeping track of the number of mallocs and frees.   This
        !            37: ** is used to check for memory leaks.
        !            38: */
        !            39: int sqlite_nMalloc;         /* Number of sqliteMalloc() calls */
        !            40: int sqlite_nFree;           /* Number of sqliteFree() calls */
        !            41: int sqlite_iMallocFail;     /* Fail sqliteMalloc() after this many calls */
        !            42: #if MEMORY_DEBUG>1
        !            43: static int memcnt = 0;
        !            44: #endif
        !            45: 
        !            46: /*
        !            47: ** Number of 32-bit guard words
        !            48: */
        !            49: #define N_GUARD 1
        !            50: 
        !            51: /*
        !            52: ** Allocate new memory and set it to zero.  Return NULL if
        !            53: ** no memory is available.
        !            54: */
        !            55: void *sqliteMalloc_(int n, int bZero, char *zFile, int line){
        !            56:   void *p;
        !            57:   int *pi;
        !            58:   int i, k;
        !            59:   if( sqlite_iMallocFail>=0 ){
        !            60:     sqlite_iMallocFail--;
        !            61:     if( sqlite_iMallocFail==0 ){
        !            62:       sqlite_malloc_failed++;
        !            63: #if MEMORY_DEBUG>1
        !            64:       fprintf(stderr,"**** failed to allocate %d bytes at %s:%d\n",
        !            65:               n, zFile,line);
        !            66: #endif
        !            67:       sqlite_iMallocFail--;
        !            68:       return 0;
        !            69:     }
        !            70:   }
        !            71:   if( n==0 ) return 0;
        !            72:   k = (n+sizeof(int)-1)/sizeof(int);
        !            73:   pi = malloc( (N_GUARD*2+1+k)*sizeof(int));
        !            74:   if( pi==0 ){
        !            75:     sqlite_malloc_failed++;
        !            76:     return 0;
        !            77:   }
        !            78:   sqlite_nMalloc++;
        !            79:   for(i=0; i<N_GUARD; i++) pi[i] = 0xdead1122;
        !            80:   pi[N_GUARD] = n;
        !            81:   for(i=0; i<N_GUARD; i++) pi[k+1+N_GUARD+i] = 0xdead3344;
        !            82:   p = &pi[N_GUARD+1];
        !            83:   memset(p, bZero==0, n);
        !            84: #if MEMORY_DEBUG>1
        !            85:   fprintf(stderr,"%06d malloc %d bytes at 0x%x from %s:%d\n",
        !            86:       ++memcnt, n, (int)p, zFile,line);
        !            87: #endif
        !            88:   return p;
        !            89: }
        !            90: 
        !            91: /*
        !            92: ** Check to see if the given pointer was obtained from sqliteMalloc()
        !            93: ** and is able to hold at least N bytes.  Raise an exception if this
        !            94: ** is not the case.
        !            95: **
        !            96: ** This routine is used for testing purposes only.
        !            97: */
        !            98: void sqliteCheckMemory(void *p, int N){
        !            99:   int *pi = p;
        !           100:   int n, i, k;
        !           101:   pi -= N_GUARD+1;
        !           102:   for(i=0; i<N_GUARD; i++){
        !           103:     assert( pi[i]==0xdead1122 );
        !           104:   }
        !           105:   n = pi[N_GUARD];
        !           106:   assert( N>=0 && N<n );
        !           107:   k = (n+sizeof(int)-1)/sizeof(int);
        !           108:   for(i=0; i<N_GUARD; i++){
        !           109:     assert( pi[k+N_GUARD+1+i]==0xdead3344 );
        !           110:   }
        !           111: }
        !           112: 
        !           113: /*
        !           114: ** Free memory previously obtained from sqliteMalloc()
        !           115: */
        !           116: void sqliteFree_(void *p, char *zFile, int line){
        !           117:   if( p ){
        !           118:     int *pi, i, k, n;
        !           119:     pi = p;
        !           120:     pi -= N_GUARD+1;
        !           121:     sqlite_nFree++;
        !           122:     for(i=0; i<N_GUARD; i++){
        !           123:       if( pi[i]!=0xdead1122 ){
        !           124:         fprintf(stderr,"Low-end memory corruption at 0x%x\n", (int)p);
        !           125:         return;
        !           126:       }
        !           127:     }
        !           128:     n = pi[N_GUARD];
        !           129:     k = (n+sizeof(int)-1)/sizeof(int);
        !           130:     for(i=0; i<N_GUARD; i++){
        !           131:       if( pi[k+N_GUARD+1+i]!=0xdead3344 ){
        !           132:         fprintf(stderr,"High-end memory corruption at 0x%x\n", (int)p);
        !           133:         return;
        !           134:       }
        !           135:     }
        !           136:     memset(pi, 0xff, (k+N_GUARD*2+1)*sizeof(int));
        !           137: #if MEMORY_DEBUG>1
        !           138:     fprintf(stderr,"%06d free %d bytes at 0x%x from %s:%d\n",
        !           139:          ++memcnt, n, (int)p, zFile,line);
        !           140: #endif
        !           141:     free(pi);
        !           142:   }
        !           143: }
        !           144: 
        !           145: /*
        !           146: ** Resize a prior allocation.  If p==0, then this routine
        !           147: ** works just like sqliteMalloc().  If n==0, then this routine
        !           148: ** works just like sqliteFree().
        !           149: */
        !           150: void *sqliteRealloc_(void *oldP, int n, char *zFile, int line){
        !           151:   int *oldPi, *pi, i, k, oldN, oldK;
        !           152:   void *p;
        !           153:   if( oldP==0 ){
        !           154:     return sqliteMalloc_(n,1,zFile,line);
        !           155:   }
        !           156:   if( n==0 ){
        !           157:     sqliteFree_(oldP,zFile,line);
        !           158:     return 0;
        !           159:   }
        !           160:   oldPi = oldP;
        !           161:   oldPi -= N_GUARD+1;
        !           162:   if( oldPi[0]!=0xdead1122 ){
        !           163:     fprintf(stderr,"Low-end memory corruption in realloc at 0x%x\n", (int)oldP);
        !           164:     return 0;
        !           165:   }
        !           166:   oldN = oldPi[N_GUARD];
        !           167:   oldK = (oldN+sizeof(int)-1)/sizeof(int);
        !           168:   for(i=0; i<N_GUARD; i++){
        !           169:     if( oldPi[oldK+N_GUARD+1+i]!=0xdead3344 ){
        !           170:       fprintf(stderr,"High-end memory corruption in realloc at 0x%x\n",
        !           171:               (int)oldP);
        !           172:       return 0;
        !           173:     }
        !           174:   }
        !           175:   k = (n + sizeof(int) - 1)/sizeof(int);
        !           176:   pi = malloc( (k+N_GUARD*2+1)*sizeof(int) );
        !           177:   if( pi==0 ){
        !           178:     sqlite_malloc_failed++;
        !           179:     return 0;
        !           180:   }
        !           181:   for(i=0; i<N_GUARD; i++) pi[i] = 0xdead1122;
        !           182:   pi[N_GUARD] = n;
        !           183:   for(i=0; i<N_GUARD; i++) pi[k+N_GUARD+1+i] = 0xdead3344;
        !           184:   p = &pi[N_GUARD+1];
        !           185:   memcpy(p, oldP, n>oldN ? oldN : n);
        !           186:   if( n>oldN ){
        !           187:     memset(&((char*)p)[oldN], 0, n-oldN);
        !           188:   }
        !           189:   memset(oldPi, 0xab, (oldK+N_GUARD+2)*sizeof(int));
        !           190:   free(oldPi);
        !           191: #if MEMORY_DEBUG>1
        !           192:   fprintf(stderr,"%06d realloc %d to %d bytes at 0x%x to 0x%x at %s:%d\n",
        !           193:     ++memcnt, oldN, n, (int)oldP, (int)p, zFile, line);
        !           194: #endif
        !           195:   return p;
        !           196: }
        !           197: 
        !           198: /*
        !           199: ** Make a duplicate of a string into memory obtained from malloc()
        !           200: ** Free the original string using sqliteFree().
        !           201: **
        !           202: ** This routine is called on all strings that are passed outside of
        !           203: ** the SQLite library.  That way clients can free the string using free()
        !           204: ** rather than having to call sqliteFree().
        !           205: */
        !           206: void sqliteStrRealloc(char **pz){
        !           207:   char *zNew;
        !           208:   if( pz==0 || *pz==0 ) return;
        !           209:   zNew = malloc( strlen(*pz) + 1 );
        !           210:   if( zNew==0 ){
        !           211:     sqlite_malloc_failed++;
        !           212:     sqliteFree(*pz);
        !           213:     *pz = 0;
        !           214:   }
        !           215:   strcpy(zNew, *pz);
        !           216:   sqliteFree(*pz);
        !           217:   *pz = zNew;
        !           218: }
        !           219: 
        !           220: /*
        !           221: ** Make a copy of a string in memory obtained from sqliteMalloc()
        !           222: */
        !           223: char *sqliteStrDup_(const char *z, char *zFile, int line){
        !           224:   char *zNew;
        !           225:   if( z==0 ) return 0;
        !           226:   zNew = sqliteMalloc_(strlen(z)+1, 0, zFile, line);
        !           227:   if( zNew ) strcpy(zNew, z);
        !           228:   return zNew;
        !           229: }
        !           230: char *sqliteStrNDup_(const char *z, int n, char *zFile, int line){
        !           231:   char *zNew;
        !           232:   if( z==0 ) return 0;
        !           233:   zNew = sqliteMalloc_(n+1, 0, zFile, line);
        !           234:   if( zNew ){
        !           235:     memcpy(zNew, z, n);
        !           236:     zNew[n] = 0;
        !           237:   }
        !           238:   return zNew;
        !           239: }
        !           240: #endif /* MEMORY_DEBUG */
        !           241: 
        !           242: /*
        !           243: ** The following versions of malloc() and free() are for use in a
        !           244: ** normal build.
        !           245: */
        !           246: #if !defined(MEMORY_DEBUG)
        !           247: 
        !           248: /*
        !           249: ** Allocate new memory and set it to zero.  Return NULL if
        !           250: ** no memory is available.  See also sqliteMallocRaw().
        !           251: */
        !           252: void *sqliteMalloc(int n){
        !           253:   void *p;
        !           254:   if( (p = malloc(n))==0 ){
        !           255:     if( n>0 ) sqlite_malloc_failed++;
        !           256:   }else{
        !           257:     memset(p, 0, n);
        !           258:   }
        !           259:   return p;
        !           260: }
        !           261: 
        !           262: /*
        !           263: ** Allocate new memory but do not set it to zero.  Return NULL if
        !           264: ** no memory is available.  See also sqliteMalloc().
        !           265: */
        !           266: void *sqliteMallocRaw(int n){
        !           267:   void *p;
        !           268:   if( (p = malloc(n))==0 ){
        !           269:     if( n>0 ) sqlite_malloc_failed++;
        !           270:   }
        !           271:   return p;
        !           272: }
        !           273: 
        !           274: /*
        !           275: ** Free memory previously obtained from sqliteMalloc()
        !           276: */
        !           277: void sqliteFree(void *p){
        !           278:   if( p ){
        !           279:     free(p);
        !           280:   }
        !           281: }
        !           282: 
        !           283: /*
        !           284: ** Resize a prior allocation.  If p==0, then this routine
        !           285: ** works just like sqliteMalloc().  If n==0, then this routine
        !           286: ** works just like sqliteFree().
        !           287: */
        !           288: void *sqliteRealloc(void *p, int n){
        !           289:   void *p2;
        !           290:   if( p==0 ){
        !           291:     return sqliteMalloc(n);
        !           292:   }
        !           293:   if( n==0 ){
        !           294:     sqliteFree(p);
        !           295:     return 0;
        !           296:   }
        !           297:   p2 = realloc(p, n);
        !           298:   if( p2==0 ){
        !           299:     sqlite_malloc_failed++;
        !           300:   }
        !           301:   return p2;
        !           302: }
        !           303: 
        !           304: /*
        !           305: ** Make a copy of a string in memory obtained from sqliteMalloc()
        !           306: */
        !           307: char *sqliteStrDup(const char *z){
        !           308:   char *zNew;
        !           309:   if( z==0 ) return 0;
        !           310:   zNew = sqliteMallocRaw(strlen(z)+1);
        !           311:   if( zNew ) strcpy(zNew, z);
        !           312:   return zNew;
        !           313: }
        !           314: char *sqliteStrNDup(const char *z, int n){
        !           315:   char *zNew;
        !           316:   if( z==0 ) return 0;
        !           317:   zNew = sqliteMallocRaw(n+1);
        !           318:   if( zNew ){
        !           319:     memcpy(zNew, z, n);
        !           320:     zNew[n] = 0;
        !           321:   }
        !           322:   return zNew;
        !           323: }
        !           324: #endif /* !defined(MEMORY_DEBUG) */
        !           325: 
        !           326: /*
        !           327: ** Create a string from the 2nd and subsequent arguments (up to the
        !           328: ** first NULL argument), store the string in memory obtained from
        !           329: ** sqliteMalloc() and make the pointer indicated by the 1st argument
        !           330: ** point to that string.  The 1st argument must either be NULL or 
        !           331: ** point to memory obtained from sqliteMalloc().
        !           332: */
        !           333: void sqliteSetString(char **pz, ...){
        !           334:   va_list ap;
        !           335:   int nByte;
        !           336:   const char *z;
        !           337:   char *zResult;
        !           338: 
        !           339:   if( pz==0 ) return;
        !           340:   nByte = 1;
        !           341:   va_start(ap, pz);
        !           342:   while( (z = va_arg(ap, const char*))!=0 ){
        !           343:     nByte += strlen(z);
        !           344:   }
        !           345:   va_end(ap);
        !           346:   sqliteFree(*pz);
        !           347:   *pz = zResult = sqliteMallocRaw( nByte );
        !           348:   if( zResult==0 ){
        !           349:     return;
        !           350:   }
        !           351:   *zResult = 0;
        !           352:   va_start(ap, pz);
        !           353:   while( (z = va_arg(ap, const char*))!=0 ){
        !           354:     strcpy(zResult, z);
        !           355:     zResult += strlen(zResult);
        !           356:   }
        !           357:   va_end(ap);
        !           358: #ifdef MEMORY_DEBUG
        !           359: #if MEMORY_DEBUG>1
        !           360:   fprintf(stderr,"string at 0x%x is %s\n", (int)*pz, *pz);
        !           361: #endif
        !           362: #endif
        !           363: }
        !           364: 
        !           365: /*
        !           366: ** Works like sqliteSetString, but each string is now followed by
        !           367: ** a length integer which specifies how much of the source string 
        !           368: ** to copy (in bytes).  -1 means use the whole string.  The 1st 
        !           369: ** argument must either be NULL or point to memory obtained from 
        !           370: ** sqliteMalloc().
        !           371: */
        !           372: void sqliteSetNString(char **pz, ...){
        !           373:   va_list ap;
        !           374:   int nByte;
        !           375:   const char *z;
        !           376:   char *zResult;
        !           377:   int n;
        !           378: 
        !           379:   if( pz==0 ) return;
        !           380:   nByte = 0;
        !           381:   va_start(ap, pz);
        !           382:   while( (z = va_arg(ap, const char*))!=0 ){
        !           383:     n = va_arg(ap, int);
        !           384:     if( n<=0 ) n = strlen(z);
        !           385:     nByte += n;
        !           386:   }
        !           387:   va_end(ap);
        !           388:   sqliteFree(*pz);
        !           389:   *pz = zResult = sqliteMallocRaw( nByte + 1 );
        !           390:   if( zResult==0 ) return;
        !           391:   va_start(ap, pz);
        !           392:   while( (z = va_arg(ap, const char*))!=0 ){
        !           393:     n = va_arg(ap, int);
        !           394:     if( n<=0 ) n = strlen(z);
        !           395:     strncpy(zResult, z, n);
        !           396:     zResult += n;
        !           397:   }
        !           398:   *zResult = 0;
        !           399: #ifdef MEMORY_DEBUG
        !           400: #if MEMORY_DEBUG>1
        !           401:   fprintf(stderr,"string at 0x%x is %s\n", (int)*pz, *pz);
        !           402: #endif
        !           403: #endif
        !           404:   va_end(ap);
        !           405: }
        !           406: 
        !           407: /*
        !           408: ** Add an error message to pParse->zErrMsg and increment pParse->nErr.
        !           409: ** The following formatting characters are allowed:
        !           410: **
        !           411: **      %s      Insert a string
        !           412: **      %z      A string that should be freed after use
        !           413: **      %d      Insert an integer
        !           414: **      %T      Insert a token
        !           415: **      %S      Insert the first element of a SrcList
        !           416: */
        !           417: void sqliteErrorMsg(Parse *pParse, const char *zFormat, ...){
        !           418:   va_list ap;
        !           419:   pParse->nErr++;
        !           420:   sqliteFree(pParse->zErrMsg);
        !           421:   va_start(ap, zFormat);
        !           422:   pParse->zErrMsg = sqliteVMPrintf(zFormat, ap);
        !           423:   va_end(ap);
        !           424: }
        !           425: 
        !           426: /*
        !           427: ** Convert an SQL-style quoted string into a normal string by removing
        !           428: ** the quote characters.  The conversion is done in-place.  If the
        !           429: ** input does not begin with a quote character, then this routine
        !           430: ** is a no-op.
        !           431: **
        !           432: ** 2002-Feb-14: This routine is extended to remove MS-Access style
        !           433: ** brackets from around identifers.  For example:  "[a-b-c]" becomes
        !           434: ** "a-b-c".
        !           435: */
        !           436: void sqliteDequote(char *z){
        !           437:   int quote;
        !           438:   int i, j;
        !           439:   if( z==0 ) return;
        !           440:   quote = z[0];
        !           441:   switch( quote ){
        !           442:     case '\'':  break;
        !           443:     case '"':   break;
        !           444:     case '[':   quote = ']';  break;
        !           445:     default:    return;
        !           446:   }
        !           447:   for(i=1, j=0; z[i]; i++){
        !           448:     if( z[i]==quote ){
        !           449:       if( z[i+1]==quote ){
        !           450:         z[j++] = quote;
        !           451:         i++;
        !           452:       }else{
        !           453:         z[j++] = 0;
        !           454:         break;
        !           455:       }
        !           456:     }else{
        !           457:       z[j++] = z[i];
        !           458:     }
        !           459:   }
        !           460: }
        !           461: 
        !           462: /* An array to map all upper-case characters into their corresponding
        !           463: ** lower-case character. 
        !           464: */
        !           465: static unsigned char UpperToLower[] = {
        !           466:       0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
        !           467:      18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
        !           468:      36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
        !           469:      54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99,100,101,102,103,
        !           470:     104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,
        !           471:     122, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,
        !           472:     108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,
        !           473:     126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
        !           474:     144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,
        !           475:     162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,
        !           476:     180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,
        !           477:     198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,
        !           478:     216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,
        !           479:     234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,
        !           480:     252,253,254,255
        !           481: };
        !           482: 
        !           483: /*
        !           484: ** This function computes a hash on the name of a keyword.
        !           485: ** Case is not significant.
        !           486: */
        !           487: int sqliteHashNoCase(const char *z, int n){
        !           488:   int h = 0;
        !           489:   if( n<=0 ) n = strlen(z);
        !           490:   while( n > 0  ){
        !           491:     h = (h<<3) ^ h ^ UpperToLower[(unsigned char)*z++];
        !           492:     n--;
        !           493:   }
        !           494:   return h & 0x7fffffff;
        !           495: }
        !           496: 
        !           497: /*
        !           498: ** Some systems have stricmp().  Others have strcasecmp().  Because
        !           499: ** there is no consistency, we will define our own.
        !           500: */
        !           501: int sqliteStrICmp(const char *zLeft, const char *zRight){
        !           502:   register unsigned char *a, *b;
        !           503:   a = (unsigned char *)zLeft;
        !           504:   b = (unsigned char *)zRight;
        !           505:   while( *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; }
        !           506:   return UpperToLower[*a] - UpperToLower[*b];
        !           507: }
        !           508: int sqliteStrNICmp(const char *zLeft, const char *zRight, int N){
        !           509:   register unsigned char *a, *b;
        !           510:   a = (unsigned char *)zLeft;
        !           511:   b = (unsigned char *)zRight;
        !           512:   while( N-- > 0 && *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; }
        !           513:   return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b];
        !           514: }
        !           515: 
        !           516: /*
        !           517: ** Return TRUE if z is a pure numeric string.  Return FALSE if the
        !           518: ** string contains any character which is not part of a number.
        !           519: **
        !           520: ** Am empty string is considered non-numeric.
        !           521: */
        !           522: int sqliteIsNumber(const char *z){
        !           523:   if( *z=='-' || *z=='+' ) z++;
        !           524:   if( !isdigit(*z) ){
        !           525:     return 0;
        !           526:   }
        !           527:   z++;
        !           528:   while( isdigit(*z) ){ z++; }
        !           529:   if( *z=='.' ){
        !           530:     z++;
        !           531:     if( !isdigit(*z) ) return 0;
        !           532:     while( isdigit(*z) ){ z++; }
        !           533:   }
        !           534:   if( *z=='e' || *z=='E' ){
        !           535:     z++;
        !           536:     if( *z=='+' || *z=='-' ) z++;
        !           537:     if( !isdigit(*z) ) return 0;
        !           538:     while( isdigit(*z) ){ z++; }
        !           539:   }
        !           540:   return *z==0;
        !           541: }
        !           542: 
        !           543: /*
        !           544: ** The string z[] is an ascii representation of a real number.
        !           545: ** Convert this string to a double.
        !           546: **
        !           547: ** This routine assumes that z[] really is a valid number.  If it
        !           548: ** is not, the result is undefined.
        !           549: **
        !           550: ** This routine is used instead of the library atof() function because
        !           551: ** the library atof() might want to use "," as the decimal point instead
        !           552: ** of "." depending on how locale is set.  But that would cause problems
        !           553: ** for SQL.  So this routine always uses "." regardless of locale.
        !           554: */
        !           555: double sqliteAtoF(const char *z, const char **pzEnd){
        !           556:   int sign = 1;
        !           557:   LONGDOUBLE_TYPE v1 = 0.0;
        !           558:   if( *z=='-' ){
        !           559:     sign = -1;
        !           560:     z++;
        !           561:   }else if( *z=='+' ){
        !           562:     z++;
        !           563:   }
        !           564:   while( isdigit(*z) ){
        !           565:     v1 = v1*10.0 + (*z - '0');
        !           566:     z++;
        !           567:   }
        !           568:   if( *z=='.' ){
        !           569:     LONGDOUBLE_TYPE divisor = 1.0;
        !           570:     z++;
        !           571:     while( isdigit(*z) ){
        !           572:       v1 = v1*10.0 + (*z - '0');
        !           573:       divisor *= 10.0;
        !           574:       z++;
        !           575:     }
        !           576:     v1 /= divisor;
        !           577:   }
        !           578:   if( *z=='e' || *z=='E' ){
        !           579:     int esign = 1;
        !           580:     int eval = 0;
        !           581:     LONGDOUBLE_TYPE scale = 1.0;
        !           582:     z++;
        !           583:     if( *z=='-' ){
        !           584:       esign = -1;
        !           585:       z++;
        !           586:     }else if( *z=='+' ){
        !           587:       z++;
        !           588:     }
        !           589:     while( isdigit(*z) ){
        !           590:       eval = eval*10 + *z - '0';
        !           591:       z++;
        !           592:     }
        !           593:     while( eval>=64 ){ scale *= 1.0e+64; eval -= 64; }
        !           594:     while( eval>=16 ){ scale *= 1.0e+16; eval -= 16; }
        !           595:     while( eval>=4 ){ scale *= 1.0e+4; eval -= 4; }
        !           596:     while( eval>=1 ){ scale *= 1.0e+1; eval -= 1; }
        !           597:     if( esign<0 ){
        !           598:       v1 /= scale;
        !           599:     }else{
        !           600:       v1 *= scale;
        !           601:     }
        !           602:   }
        !           603:   if( pzEnd ) *pzEnd = z;
        !           604:   return sign<0 ? -v1 : v1;
        !           605: }
        !           606: 
        !           607: /*
        !           608: ** The string zNum represents an integer.  There might be some other
        !           609: ** information following the integer too, but that part is ignored.
        !           610: ** If the integer that the prefix of zNum represents will fit in a
        !           611: ** 32-bit signed integer, return TRUE.  Otherwise return FALSE.
        !           612: **
        !           613: ** This routine returns FALSE for the string -2147483648 even that
        !           614: ** that number will, in theory fit in a 32-bit integer.  But positive
        !           615: ** 2147483648 will not fit in 32 bits.  So it seems safer to return
        !           616: ** false.
        !           617: */
        !           618: int sqliteFitsIn32Bits(const char *zNum){
        !           619:   int i, c;
        !           620:   if( *zNum=='-' || *zNum=='+' ) zNum++;
        !           621:   for(i=0; (c=zNum[i])>='0' && c<='9'; i++){}
        !           622:   return i<10 || (i==10 && memcmp(zNum,"2147483647",10)<=0);
        !           623: }
        !           624: 
        !           625: /* This comparison routine is what we use for comparison operations
        !           626: ** between numeric values in an SQL expression.  "Numeric" is a little
        !           627: ** bit misleading here.  What we mean is that the strings have a
        !           628: ** type of "numeric" from the point of view of SQL.  The strings
        !           629: ** do not necessarily contain numbers.  They could contain text.
        !           630: **
        !           631: ** If the input strings both look like actual numbers then they
        !           632: ** compare in numerical order.  Numerical strings are always less 
        !           633: ** than non-numeric strings so if one input string looks like a
        !           634: ** number and the other does not, then the one that looks like
        !           635: ** a number is the smaller.  Non-numeric strings compare in 
        !           636: ** lexigraphical order (the same order as strcmp()).
        !           637: */
        !           638: int sqliteCompare(const char *atext, const char *btext){
        !           639:   int result;
        !           640:   int isNumA, isNumB;
        !           641:   if( atext==0 ){
        !           642:     return -1;
        !           643:   }else if( btext==0 ){
        !           644:     return 1;
        !           645:   }
        !           646:   isNumA = sqliteIsNumber(atext);
        !           647:   isNumB = sqliteIsNumber(btext);
        !           648:   if( isNumA ){
        !           649:     if( !isNumB ){
        !           650:       result = -1;
        !           651:     }else{
        !           652:       double rA, rB;
        !           653:       rA = sqliteAtoF(atext, 0);
        !           654:       rB = sqliteAtoF(btext, 0);
        !           655:       if( rA<rB ){
        !           656:         result = -1;
        !           657:       }else if( rA>rB ){
        !           658:         result = +1;
        !           659:       }else{
        !           660:         result = 0;
        !           661:       }
        !           662:     }
        !           663:   }else if( isNumB ){
        !           664:     result = +1;
        !           665:   }else {
        !           666:     result = strcmp(atext, btext);
        !           667:   }
        !           668:   return result; 
        !           669: }
        !           670: 
        !           671: /*
        !           672: ** This routine is used for sorting.  Each key is a list of one or more
        !           673: ** null-terminated elements.  The list is terminated by two nulls in
        !           674: ** a row.  For example, the following text is a key with three elements
        !           675: **
        !           676: **            Aone\000Dtwo\000Athree\000\000
        !           677: **
        !           678: ** All elements begin with one of the characters "+-AD" and end with "\000"
        !           679: ** with zero or more text elements in between.  Except, NULL elements
        !           680: ** consist of the special two-character sequence "N\000".
        !           681: **
        !           682: ** Both arguments will have the same number of elements.  This routine
        !           683: ** returns negative, zero, or positive if the first argument is less
        !           684: ** than, equal to, or greater than the first.  (Result is a-b).
        !           685: **
        !           686: ** Each element begins with one of the characters "+", "-", "A", "D".
        !           687: ** This character determines the sort order and collating sequence:
        !           688: **
        !           689: **     +      Sort numerically in ascending order
        !           690: **     -      Sort numerically in descending order
        !           691: **     A      Sort as strings in ascending order
        !           692: **     D      Sort as strings in descending order.
        !           693: **
        !           694: ** For the "+" and "-" sorting, pure numeric strings (strings for which the
        !           695: ** isNum() function above returns TRUE) always compare less than strings
        !           696: ** that are not pure numerics.  Non-numeric strings compare in memcmp()
        !           697: ** order.  This is the same sort order as the sqliteCompare() function
        !           698: ** above generates.
        !           699: **
        !           700: ** The last point is a change from version 2.6.3 to version 2.7.0.  In
        !           701: ** version 2.6.3 and earlier, substrings of digits compare in numerical 
        !           702: ** and case was used only to break a tie.
        !           703: **
        !           704: ** Elements that begin with 'A' or 'D' compare in memcmp() order regardless
        !           705: ** of whether or not they look like a number.
        !           706: **
        !           707: ** Note that the sort order imposed by the rules above is the same
        !           708: ** from the ordering defined by the "<", "<=", ">", and ">=" operators
        !           709: ** of expressions and for indices.  This was not the case for version
        !           710: ** 2.6.3 and earlier.
        !           711: */
        !           712: int sqliteSortCompare(const char *a, const char *b){
        !           713:   int res = 0;
        !           714:   int isNumA, isNumB;
        !           715:   int dir = 0;
        !           716: 
        !           717:   while( res==0 && *a && *b ){
        !           718:     if( a[0]=='N' || b[0]=='N' ){
        !           719:       if( a[0]==b[0] ){
        !           720:         a += 2;
        !           721:         b += 2;
        !           722:         continue;
        !           723:       }
        !           724:       if( a[0]=='N' ){
        !           725:         dir = b[0];
        !           726:         res = -1;
        !           727:       }else{
        !           728:         dir = a[0];
        !           729:         res = +1;
        !           730:       }
        !           731:       break;
        !           732:     }
        !           733:     assert( a[0]==b[0] );
        !           734:     if( (dir=a[0])=='A' || a[0]=='D' ){
        !           735:       res = strcmp(&a[1],&b[1]);
        !           736:       if( res ) break;
        !           737:     }else{
        !           738:       isNumA = sqliteIsNumber(&a[1]);
        !           739:       isNumB = sqliteIsNumber(&b[1]);
        !           740:       if( isNumA ){
        !           741:         double rA, rB;
        !           742:         if( !isNumB ){
        !           743:           res = -1;
        !           744:           break;
        !           745:         }
        !           746:         rA = sqliteAtoF(&a[1], 0);
        !           747:         rB = sqliteAtoF(&b[1], 0);
        !           748:         if( rA<rB ){
        !           749:           res = -1;
        !           750:           break;
        !           751:         }
        !           752:         if( rA>rB ){
        !           753:           res = +1;
        !           754:           break;
        !           755:         }
        !           756:       }else if( isNumB ){
        !           757:         res = +1;
        !           758:         break;
        !           759:       }else{
        !           760:         res = strcmp(&a[1],&b[1]);
        !           761:         if( res ) break;
        !           762:       }
        !           763:     }
        !           764:     a += strlen(&a[1]) + 2;
        !           765:     b += strlen(&b[1]) + 2;
        !           766:   }
        !           767:   if( dir=='-' || dir=='D' ) res = -res;
        !           768:   return res;
        !           769: }
        !           770: 
        !           771: /*
        !           772: ** Some powers of 64.  These constants are needed in the
        !           773: ** sqliteRealToSortable() routine below.
        !           774: */
        !           775: #define _64e3  (64.0 * 64.0 * 64.0)
        !           776: #define _64e4  (64.0 * 64.0 * 64.0 * 64.0)
        !           777: #define _64e15 (_64e3 * _64e4 * _64e4 * _64e4)
        !           778: #define _64e16 (_64e4 * _64e4 * _64e4 * _64e4)
        !           779: #define _64e63 (_64e15 * _64e16 * _64e16 * _64e16)
        !           780: #define _64e64 (_64e16 * _64e16 * _64e16 * _64e16)
        !           781: 
        !           782: /*
        !           783: ** The following procedure converts a double-precision floating point
        !           784: ** number into a string.  The resulting string has the property that
        !           785: ** two such strings comparied using strcmp() or memcmp() will give the
        !           786: ** same results as a numeric comparison of the original floating point
        !           787: ** numbers.
        !           788: **
        !           789: ** This routine is used to generate database keys from floating point
        !           790: ** numbers such that the keys sort in the same order as the original
        !           791: ** floating point numbers even though the keys are compared using
        !           792: ** memcmp().
        !           793: **
        !           794: ** The calling function should have allocated at least 14 characters
        !           795: ** of space for the buffer z[].
        !           796: */
        !           797: void sqliteRealToSortable(double r, char *z){
        !           798:   int neg;
        !           799:   int exp;
        !           800:   int cnt = 0;
        !           801: 
        !           802:   /* This array maps integers between 0 and 63 into base-64 digits.
        !           803:   ** The digits must be chosen such at their ASCII codes are increasing.
        !           804:   ** This means we can not use the traditional base-64 digit set. */
        !           805:   static const char zDigit[] = 
        !           806:      "0123456789"
        !           807:      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        !           808:      "abcdefghijklmnopqrstuvwxyz"
        !           809:      "|~";
        !           810:   if( r<0.0 ){
        !           811:     neg = 1;
        !           812:     r = -r;
        !           813:     *z++ = '-';
        !           814:   } else {
        !           815:     neg = 0;
        !           816:     *z++ = '0';
        !           817:   }
        !           818:   exp = 0;
        !           819: 
        !           820:   if( r==0.0 ){
        !           821:     exp = -1024;
        !           822:   }else if( r<(0.5/64.0) ){
        !           823:     while( r < 0.5/_64e64 && exp > -961  ){ r *= _64e64;  exp -= 64; }
        !           824:     while( r < 0.5/_64e16 && exp > -1009 ){ r *= _64e16;  exp -= 16; }
        !           825:     while( r < 0.5/_64e4  && exp > -1021 ){ r *= _64e4;   exp -= 4; }
        !           826:     while( r < 0.5/64.0   && exp > -1024 ){ r *= 64.0;    exp -= 1; }
        !           827:   }else if( r>=0.5 ){
        !           828:     while( r >= 0.5*_64e63 && exp < 960  ){ r *= 1.0/_64e64; exp += 64; }
        !           829:     while( r >= 0.5*_64e15 && exp < 1008 ){ r *= 1.0/_64e16; exp += 16; }
        !           830:     while( r >= 0.5*_64e3  && exp < 1020 ){ r *= 1.0/_64e4;  exp += 4; }
        !           831:     while( r >= 0.5        && exp < 1023 ){ r *= 1.0/64.0;   exp += 1; }
        !           832:   }
        !           833:   if( neg ){
        !           834:     exp = -exp;
        !           835:     r = -r;
        !           836:   }
        !           837:   exp += 1024;
        !           838:   r += 0.5;
        !           839:   if( exp<0 ) return;
        !           840:   if( exp>=2048 || r>=1.0 ){
        !           841:     strcpy(z, "~~~~~~~~~~~~");
        !           842:     return;
        !           843:   }
        !           844:   *z++ = zDigit[(exp>>6)&0x3f];
        !           845:   *z++ = zDigit[exp & 0x3f];
        !           846:   while( r>0.0 && cnt<10 ){
        !           847:     int digit;
        !           848:     r *= 64.0;
        !           849:     digit = (int)r;
        !           850:     assert( digit>=0 && digit<64 );
        !           851:     *z++ = zDigit[digit & 0x3f];
        !           852:     r -= digit;
        !           853:     cnt++;
        !           854:   }
        !           855:   *z = 0;
        !           856: }
        !           857: 
        !           858: #ifdef SQLITE_UTF8
        !           859: /*
        !           860: ** X is a pointer to the first byte of a UTF-8 character.  Increment
        !           861: ** X so that it points to the next character.  This only works right
        !           862: ** if X points to a well-formed UTF-8 string.
        !           863: */
        !           864: #define sqliteNextChar(X)  while( (0xc0&*++(X))==0x80 ){}
        !           865: #define sqliteCharVal(X)   sqlite_utf8_to_int(X)
        !           866: 
        !           867: #else /* !defined(SQLITE_UTF8) */
        !           868: /*
        !           869: ** For iso8859 encoding, the next character is just the next byte.
        !           870: */
        !           871: #define sqliteNextChar(X)  (++(X));
        !           872: #define sqliteCharVal(X)   ((int)*(X))
        !           873: 
        !           874: #endif /* defined(SQLITE_UTF8) */
        !           875: 
        !           876: 
        !           877: #ifdef SQLITE_UTF8
        !           878: /*
        !           879: ** Convert the UTF-8 character to which z points into a 31-bit
        !           880: ** UCS character.  This only works right if z points to a well-formed
        !           881: ** UTF-8 string.
        !           882: */
        !           883: static int sqlite_utf8_to_int(const unsigned char *z){
        !           884:   int c;
        !           885:   static const int initVal[] = {
        !           886:       0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
        !           887:      15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
        !           888:      30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
        !           889:      45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
        !           890:      60,  61,  62,  63,  64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,
        !           891:      75,  76,  77,  78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
        !           892:      90,  91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104,
        !           893:     105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
        !           894:     120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
        !           895:     135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
        !           896:     150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
        !           897:     165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
        !           898:     180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,   0,   1,   2,
        !           899:       3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,
        !           900:      18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,   0,
        !           901:       1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,
        !           902:       0,   1,   2,   3,   4,   5,   6,   7,   0,   1,   2,   3,   0,   1, 254,
        !           903:     255,
        !           904:   };
        !           905:   c = initVal[*(z++)];
        !           906:   while( (0xc0&*z)==0x80 ){
        !           907:     c = (c<<6) | (0x3f&*(z++));
        !           908:   }
        !           909:   return c;
        !           910: }
        !           911: #endif
        !           912: 
        !           913: /*
        !           914: ** Compare two UTF-8 strings for equality where the first string can
        !           915: ** potentially be a "glob" expression.  Return true (1) if they
        !           916: ** are the same and false (0) if they are different.
        !           917: **
        !           918: ** Globbing rules:
        !           919: **
        !           920: **      '*'       Matches any sequence of zero or more characters.
        !           921: **
        !           922: **      '?'       Matches exactly one character.
        !           923: **
        !           924: **     [...]      Matches one character from the enclosed list of
        !           925: **                characters.
        !           926: **
        !           927: **     [^...]     Matches one character not in the enclosed list.
        !           928: **
        !           929: ** With the [...] and [^...] matching, a ']' character can be included
        !           930: ** in the list by making it the first character after '[' or '^'.  A
        !           931: ** range of characters can be specified using '-'.  Example:
        !           932: ** "[a-z]" matches any single lower-case letter.  To match a '-', make
        !           933: ** it the last character in the list.
        !           934: **
        !           935: ** This routine is usually quick, but can be N**2 in the worst case.
        !           936: **
        !           937: ** Hints: to match '*' or '?', put them in "[]".  Like this:
        !           938: **
        !           939: **         abc[*]xyz        Matches "abc*xyz" only
        !           940: */
        !           941: int 
        !           942: sqliteGlobCompare(const unsigned char *zPattern, const unsigned char *zString){
        !           943:   register int c;
        !           944:   int invert;
        !           945:   int seen;
        !           946:   int c2;
        !           947: 
        !           948:   while( (c = *zPattern)!=0 ){
        !           949:     switch( c ){
        !           950:       case '*':
        !           951:         while( (c=zPattern[1]) == '*' || c == '?' ){
        !           952:           if( c=='?' ){
        !           953:             if( *zString==0 ) return 0;
        !           954:             sqliteNextChar(zString);
        !           955:           }
        !           956:           zPattern++;
        !           957:         }
        !           958:         if( c==0 ) return 1;
        !           959:         if( c=='[' ){
        !           960:           while( *zString && sqliteGlobCompare(&zPattern[1],zString)==0 ){
        !           961:             sqliteNextChar(zString);
        !           962:           }
        !           963:           return *zString!=0;
        !           964:         }else{
        !           965:           while( (c2 = *zString)!=0 ){
        !           966:             while( c2 != 0 && c2 != c ){ c2 = *++zString; }
        !           967:             if( c2==0 ) return 0;
        !           968:             if( sqliteGlobCompare(&zPattern[1],zString) ) return 1;
        !           969:             sqliteNextChar(zString);
        !           970:           }
        !           971:           return 0;
        !           972:         }
        !           973:       case '?': {
        !           974:         if( *zString==0 ) return 0;
        !           975:         sqliteNextChar(zString);
        !           976:         zPattern++;
        !           977:         break;
        !           978:       }
        !           979:       case '[': {
        !           980:         int prior_c = 0;
        !           981:         seen = 0;
        !           982:         invert = 0;
        !           983:         c = sqliteCharVal(zString);
        !           984:         if( c==0 ) return 0;
        !           985:         c2 = *++zPattern;
        !           986:         if( c2=='^' ){ invert = 1; c2 = *++zPattern; }
        !           987:         if( c2==']' ){
        !           988:           if( c==']' ) seen = 1;
        !           989:           c2 = *++zPattern;
        !           990:         }
        !           991:         while( (c2 = sqliteCharVal(zPattern))!=0 && c2!=']' ){
        !           992:           if( c2=='-' && zPattern[1]!=']' && zPattern[1]!=0 && prior_c>0 ){
        !           993:             zPattern++;
        !           994:             c2 = sqliteCharVal(zPattern);
        !           995:             if( c>=prior_c && c<=c2 ) seen = 1;
        !           996:             prior_c = 0;
        !           997:           }else if( c==c2 ){
        !           998:             seen = 1;
        !           999:             prior_c = c2;
        !          1000:           }else{
        !          1001:             prior_c = c2;
        !          1002:           }
        !          1003:           sqliteNextChar(zPattern);
        !          1004:         }
        !          1005:         if( c2==0 || (seen ^ invert)==0 ) return 0;
        !          1006:         sqliteNextChar(zString);
        !          1007:         zPattern++;
        !          1008:         break;
        !          1009:       }
        !          1010:       default: {
        !          1011:         if( c != *zString ) return 0;
        !          1012:         zPattern++;
        !          1013:         zString++;
        !          1014:         break;
        !          1015:       }
        !          1016:     }
        !          1017:   }
        !          1018:   return *zString==0;
        !          1019: }
        !          1020: 
        !          1021: /*
        !          1022: ** Compare two UTF-8 strings for equality using the "LIKE" operator of
        !          1023: ** SQL.  The '%' character matches any sequence of 0 or more
        !          1024: ** characters and '_' matches any single character.  Case is
        !          1025: ** not significant.
        !          1026: **
        !          1027: ** This routine is just an adaptation of the sqliteGlobCompare()
        !          1028: ** routine above.
        !          1029: */
        !          1030: int 
        !          1031: sqliteLikeCompare(const unsigned char *zPattern, const unsigned char *zString){
        !          1032:   register int c;
        !          1033:   int c2;
        !          1034: 
        !          1035:   while( (c = UpperToLower[*zPattern])!=0 ){
        !          1036:     switch( c ){
        !          1037:       case '%': {
        !          1038:         while( (c=zPattern[1]) == '%' || c == '_' ){
        !          1039:           if( c=='_' ){
        !          1040:             if( *zString==0 ) return 0;
        !          1041:             sqliteNextChar(zString);
        !          1042:           }
        !          1043:           zPattern++;
        !          1044:         }
        !          1045:         if( c==0 ) return 1;
        !          1046:         c = UpperToLower[c];
        !          1047:         while( (c2=UpperToLower[*zString])!=0 ){
        !          1048:           while( c2 != 0 && c2 != c ){ c2 = UpperToLower[*++zString]; }
        !          1049:           if( c2==0 ) return 0;
        !          1050:           if( sqliteLikeCompare(&zPattern[1],zString) ) return 1;
        !          1051:           sqliteNextChar(zString);
        !          1052:         }
        !          1053:         return 0;
        !          1054:       }
        !          1055:       case '_': {
        !          1056:         if( *zString==0 ) return 0;
        !          1057:         sqliteNextChar(zString);
        !          1058:         zPattern++;
        !          1059:         break;
        !          1060:       }
        !          1061:       default: {
        !          1062:         if( c != UpperToLower[*zString] ) return 0;
        !          1063:         zPattern++;
        !          1064:         zString++;
        !          1065:         break;
        !          1066:       }
        !          1067:     }
        !          1068:   }
        !          1069:   return *zString==0;
        !          1070: }
        !          1071: 
        !          1072: /*
        !          1073: ** Change the sqlite.magic from SQLITE_MAGIC_OPEN to SQLITE_MAGIC_BUSY.
        !          1074: ** Return an error (non-zero) if the magic was not SQLITE_MAGIC_OPEN
        !          1075: ** when this routine is called.
        !          1076: **
        !          1077: ** This routine is a attempt to detect if two threads use the
        !          1078: ** same sqlite* pointer at the same time.  There is a race 
        !          1079: ** condition so it is possible that the error is not detected.
        !          1080: ** But usually the problem will be seen.  The result will be an
        !          1081: ** error which can be used to debug the application that is
        !          1082: ** using SQLite incorrectly.
        !          1083: **
        !          1084: ** Ticket #202:  If db->magic is not a valid open value, take care not
        !          1085: ** to modify the db structure at all.  It could be that db is a stale
        !          1086: ** pointer.  In other words, it could be that there has been a prior
        !          1087: ** call to sqlite_close(db) and db has been deallocated.  And we do
        !          1088: ** not want to write into deallocated memory.
        !          1089: */
        !          1090: int sqliteSafetyOn(sqlite *db){
        !          1091:   if( db->magic==SQLITE_MAGIC_OPEN ){
        !          1092:     db->magic = SQLITE_MAGIC_BUSY;
        !          1093:     return 0;
        !          1094:   }else if( db->magic==SQLITE_MAGIC_BUSY || db->magic==SQLITE_MAGIC_ERROR
        !          1095:              || db->want_to_close ){
        !          1096:     db->magic = SQLITE_MAGIC_ERROR;
        !          1097:     db->flags |= SQLITE_Interrupt;
        !          1098:   }
        !          1099:   return 1;
        !          1100: }
        !          1101: 
        !          1102: /*
        !          1103: ** Change the magic from SQLITE_MAGIC_BUSY to SQLITE_MAGIC_OPEN.
        !          1104: ** Return an error (non-zero) if the magic was not SQLITE_MAGIC_BUSY
        !          1105: ** when this routine is called.
        !          1106: */
        !          1107: int sqliteSafetyOff(sqlite *db){
        !          1108:   if( db->magic==SQLITE_MAGIC_BUSY ){
        !          1109:     db->magic = SQLITE_MAGIC_OPEN;
        !          1110:     return 0;
        !          1111:   }else if( db->magic==SQLITE_MAGIC_OPEN || db->magic==SQLITE_MAGIC_ERROR
        !          1112:              || db->want_to_close ){
        !          1113:     db->magic = SQLITE_MAGIC_ERROR;
        !          1114:     db->flags |= SQLITE_Interrupt;
        !          1115:   }
        !          1116:   return 1;
        !          1117: }
        !          1118: 
        !          1119: /*
        !          1120: ** Check to make sure we are not currently executing an sqlite_exec().
        !          1121: ** If we are currently in an sqlite_exec(), return true and set
        !          1122: ** sqlite.magic to SQLITE_MAGIC_ERROR.  This will cause a complete
        !          1123: ** shutdown of the database.
        !          1124: **
        !          1125: ** This routine is used to try to detect when API routines are called
        !          1126: ** at the wrong time or in the wrong sequence.
        !          1127: */
        !          1128: int sqliteSafetyCheck(sqlite *db){
        !          1129:   if( db->pVdbe!=0 ){
        !          1130:     db->magic = SQLITE_MAGIC_ERROR;
        !          1131:     return 1;
        !          1132:   }
        !          1133:   return 0;
        !          1134: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>