/ Hex Artifact Content
Login

Artifact 0298100e6427a4b644f767ede12276fa7170fbb6:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 66 75 6e  *.** Utility fun
03b0: 63 74 69 6f 6e 73 20 75 73 65 64 20 74 68 72 6f  ctions used thro
03c0: 75 67 68 6f 75 74 20 73 71 6c 69 74 65 2e 0a 2a  ughout sqlite..*
03d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
03e0: 6f 6e 74 61 69 6e 73 20 66 75 6e 63 74 69 6f 6e  ontains function
03f0: 73 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  s for allocating
0400: 20 6d 65 6d 6f 72 79 2c 20 63 6f 6d 70 61 72 69   memory, compari
0410: 6e 67 0a 2a 2a 20 73 74 72 69 6e 67 73 2c 20 61  ng.** strings, a
0420: 6e 64 20 73 74 75 66 66 20 6c 69 6b 65 20 74 68  nd stuff like th
0430: 61 74 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 75  at..**.** $Id: u
0440: 74 69 6c 2e 63 2c 76 20 31 2e 31 37 20 32 30 30  til.c,v 1.17 200
0450: 30 2f 31 32 2f 31 30 20 31 38 3a 32 33 3a 35 31  0/12/10 18:23:51
0460: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0470: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0480: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h".#include <s
0490: 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdarg.h>.#includ
04a0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a  e <ctype.h>../*.
04b0: 2a 2a 20 49 66 20 4d 45 4d 4f 52 59 5f 44 45 42  ** If MEMORY_DEB
04c0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  UG is defined, t
04d0: 68 65 6e 20 75 73 65 20 76 65 72 73 69 6f 6e 73  hen use versions
04e0: 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64   of malloc() and
04f0: 0a 2a 2a 20 66 72 65 65 28 29 20 74 68 61 74 20  .** free() that 
0500: 74 72 61 63 6b 20 6d 65 6d 6f 72 79 20 75 73 61  track memory usa
0510: 67 65 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ge and check for
0520: 20 62 75 66 66 65 72 20 6f 76 65 72 72 75 6e 73   buffer overruns
0530: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 4d 45 4d 4f  ..*/.#ifdef MEMO
0540: 52 59 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20  RY_DEBUG../*.** 
0550: 46 6f 72 20 6b 65 65 70 69 6e 67 20 74 72 61 63  For keeping trac
0560: 6b 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  k of the number 
0570: 6f 66 20 6d 61 6c 6c 6f 63 73 20 61 6e 64 20 66  of mallocs and f
0580: 72 65 65 73 2e 20 20 20 54 68 69 73 0a 2a 2a 20  rees.   This.** 
0590: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
05a0: 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6c 65 61 6b   for memory leak
05b0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
05c0: 5f 6e 4d 61 6c 6c 6f 63 3b 20 20 20 20 20 20 20  _nMalloc;       
05d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
05e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 63 61  qliteMalloc() ca
05f0: 6c 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lls */.int sqlit
0600: 65 5f 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  e_nFree;        
0610: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0620: 73 71 6c 69 74 65 46 72 65 65 28 29 20 63 61 6c  sqliteFree() cal
0630: 6c 73 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ls */.int sqlite
0640: 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3b 20 20 20  _iMallocFail;   
0650: 20 20 2f 2a 20 46 61 69 6c 20 73 71 6c 69 74 65    /* Fail sqlite
0660: 4d 61 6c 6c 6f 63 28 29 20 61 66 74 65 72 20 74  Malloc() after t
0670: 68 69 73 20 6d 61 6e 79 20 63 61 6c 6c 73 20 2a  his many calls *
0680: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  /.../*.** Alloca
0690: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 61 6e  te new memory an
06a0: 64 20 73 65 74 20 69 74 20 74 6f 20 7a 65 72 6f  d set it to zero
06b0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
06c0: 66 0a 2a 2a 20 6e 6f 20 6d 65 6d 6f 72 79 20 69  f.** no memory i
06d0: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  s available..*/.
06e0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 4d 61 6c 6c  void *sqliteMall
06f0: 6f 63 5f 28 69 6e 74 20 6e 2c 20 63 68 61 72 20  oc_(int n, char 
0700: 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65  *zFile, int line
0710: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20 20  ){.  void *p;.  
0720: 69 6e 74 20 2a 70 69 3b 0a 20 20 69 6e 74 20 6b  int *pi;.  int k
0730: 3b 0a 20 20 73 71 6c 69 74 65 5f 6e 4d 61 6c 6c  ;.  sqlite_nMall
0740: 6f 63 2b 2b 3b 0a 20 20 69 66 28 20 73 71 6c 69  oc++;.  if( sqli
0750: 74 65 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 3d  te_iMallocFail>=
0760: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 5f  0 ){.    sqlite_
0770: 69 4d 61 6c 6c 6f 63 46 61 69 6c 2d 2d 3b 0a 20  iMallocFail--;. 
0780: 20 20 20 69 66 28 20 73 71 6c 69 74 65 5f 69 4d     if( sqlite_iM
0790: 61 6c 6c 6f 63 46 61 69 6c 3d 3d 30 20 29 20 72  allocFail==0 ) r
07a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6b  eturn 0;.  }.  k
07b0: 20 3d 20 28 6e 2b 73 69 7a 65 6f 66 28 69 6e 74   = (n+sizeof(int
07c0: 29 2d 31 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29  )-1)/sizeof(int)
07d0: 3b 0a 20 20 70 69 20 3d 20 6d 61 6c 6c 6f 63 28  ;.  pi = malloc(
07e0: 20 28 33 2b 6b 29 2a 73 69 7a 65 6f 66 28 69 6e   (3+k)*sizeof(in
07f0: 74 29 29 3b 0a 20 20 69 66 28 20 70 69 3d 3d 30  t));.  if( pi==0
0800: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
0810: 69 5b 30 5d 20 3d 20 30 78 64 65 61 64 31 31 32  i[0] = 0xdead112
0820: 32 3b 0a 20 20 70 69 5b 31 5d 20 3d 20 6e 3b 0a  2;.  pi[1] = n;.
0830: 20 20 70 69 5b 6b 2b 32 5d 20 3d 20 30 78 64 65    pi[k+2] = 0xde
0840: 61 64 33 33 34 34 3b 0a 20 20 70 20 3d 20 26 70  ad3344;.  p = &p
0850: 69 5b 32 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  i[2];.  memset(p
0860: 2c 20 30 2c 20 6e 29 3b 0a 23 69 66 20 4d 45 4d  , 0, n);.#if MEM
0870: 4f 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70  ORY_DEBUG>1.  fp
0880: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
0890: 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 20 61 74  lloc %d bytes at
08a0: 20 30 78 25 78 20 66 72 6f 6d 20 25 73 3a 25 64   0x%x from %s:%d
08b0: 5c 6e 22 2c 20 6e 2c 20 28 69 6e 74 29 70 2c 20  \n", n, (int)p, 
08c0: 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23 65 6e  zFile,line);.#en
08d0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  dif.  return p;.
08e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
08f0: 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79 20  mory previously 
0900: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
0910: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a  liteMalloc().*/.
0920: 76 6f 69 64 20 73 71 6c 69 74 65 46 72 65 65 5f  void sqliteFree_
0930: 28 76 6f 69 64 20 2a 70 2c 20 63 68 61 72 20 2a  (void *p, char *
0940: 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65 29  zFile, int line)
0950: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
0960: 20 69 6e 74 20 2a 70 69 2c 20 6b 2c 20 6e 3b 0a   int *pi, k, n;.
0970: 20 20 20 20 70 69 20 3d 20 70 3b 0a 20 20 20 20      pi = p;.    
0980: 70 69 20 2d 3d 20 32 3b 0a 20 20 20 20 73 71 6c  pi -= 2;.    sql
0990: 69 74 65 5f 6e 46 72 65 65 2b 2b 3b 0a 20 20 20  ite_nFree++;.   
09a0: 20 69 66 28 20 70 69 5b 30 5d 21 3d 30 78 64 65   if( pi[0]!=0xde
09b0: 61 64 31 31 32 32 20 29 7b 0a 20 20 20 20 20 20  ad1122 ){.      
09c0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
09d0: 4c 6f 77 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63  Low-end memory c
09e0: 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 30 78 25  orruption at 0x%
09f0: 78 5c 6e 22 2c 20 28 69 6e 74 29 70 29 3b 0a 20  x\n", (int)p);. 
0a00: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
0a10: 20 7d 0a 20 20 20 20 6e 20 3d 20 70 69 5b 31 5d   }.    n = pi[1]
0a20: 3b 0a 20 20 20 20 6b 20 3d 20 28 6e 2b 73 69 7a  ;.    k = (n+siz
0a30: 65 6f 66 28 69 6e 74 29 2d 31 29 2f 73 69 7a 65  eof(int)-1)/size
0a40: 6f 66 28 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  of(int);.    if(
0a50: 20 70 69 5b 6b 2b 32 5d 21 3d 30 78 64 65 61 64   pi[k+2]!=0xdead
0a60: 33 33 34 34 20 29 7b 0a 20 20 20 20 20 20 66 70  3344 ){.      fp
0a70: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 48 69  rintf(stderr,"Hi
0a80: 67 68 2d 65 6e 64 20 6d 65 6d 6f 72 79 20 63 6f  gh-end memory co
0a90: 72 72 75 70 74 69 6f 6e 20 61 74 20 30 78 25 78  rruption at 0x%x
0aa0: 5c 6e 22 2c 20 28 69 6e 74 29 70 29 3b 0a 20 20  \n", (int)p);.  
0ab0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
0ac0: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 69 2c  }.    memset(pi,
0ad0: 20 30 78 66 66 2c 20 28 6b 2b 33 29 2a 73 69 7a   0xff, (k+3)*siz
0ae0: 65 6f 66 28 69 6e 74 29 29 3b 0a 23 69 66 20 4d  eof(int));.#if M
0af0: 45 4d 4f 52 59 5f 44 45 42 55 47 3e 31 0a 20 20  EMORY_DEBUG>1.  
0b00: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
0b10: 2c 22 66 72 65 65 20 25 64 20 62 79 74 65 73 20  ,"free %d bytes 
0b20: 61 74 20 30 78 25 78 20 66 72 6f 6d 20 25 73 3a  at 0x%x from %s:
0b30: 25 64 5c 6e 22 2c 20 6e 2c 20 28 69 6e 74 29 70  %d\n", n, (int)p
0b40: 2c 20 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b 0a 23  , zFile,line);.#
0b50: 65 6e 64 69 66 0a 20 20 20 20 66 72 65 65 28 70  endif.    free(p
0b60: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  i);.  }.}../*.**
0b70: 20 52 65 73 69 7a 65 20 61 20 70 72 69 6f 72 20   Resize a prior 
0b80: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20  allocation.  If 
0b90: 70 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20  p==0, then this 
0ba0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73  routine.** works
0bb0: 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
0bc0: 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20 6e  eMalloc().  If n
0bd0: 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ==0, then this r
0be0: 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73 20  outine.** works 
0bf0: 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
0c00: 46 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Free()..*/.void 
0c10: 2a 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 5f 28  *sqliteRealloc_(
0c20: 76 6f 69 64 20 2a 6f 6c 64 50 2c 20 69 6e 74 20  void *oldP, int 
0c30: 6e 2c 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  n, char *zFile, 
0c40: 69 6e 74 20 6c 69 6e 65 29 7b 0a 20 20 69 6e 74  int line){.  int
0c50: 20 2a 6f 6c 64 50 69 2c 20 2a 70 69 2c 20 6b 2c   *oldPi, *pi, k,
0c60: 20 6f 6c 64 4e 2c 20 6f 6c 64 4b 3b 0a 20 20 76   oldN, oldK;.  v
0c70: 6f 69 64 20 2a 70 3b 0a 20 20 69 66 28 20 6f 6c  oid *p;.  if( ol
0c80: 64 50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  dP==0 ){.    ret
0c90: 75 72 6e 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  urn sqliteMalloc
0ca0: 5f 28 6e 2c 7a 46 69 6c 65 2c 6c 69 6e 65 29 3b  _(n,zFile,line);
0cb0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 30 20  .  }.  if( n==0 
0cc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
0cd0: 65 5f 28 6f 6c 64 50 2c 7a 46 69 6c 65 2c 6c 69  e_(oldP,zFile,li
0ce0: 6e 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ne);.    return 
0cf0: 30 3b 0a 20 20 7d 0a 20 20 6f 6c 64 50 69 20 3d  0;.  }.  oldPi =
0d00: 20 6f 6c 64 50 3b 0a 20 20 6f 6c 64 50 69 20 2d   oldP;.  oldPi -
0d10: 3d 20 32 3b 0a 20 20 69 66 28 20 6f 6c 64 50 69  = 2;.  if( oldPi
0d20: 5b 30 5d 21 3d 30 78 64 65 61 64 31 31 32 32 20  [0]!=0xdead1122 
0d30: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
0d40: 74 64 65 72 72 2c 22 4c 6f 77 2d 65 6e 64 20 6d  tderr,"Low-end m
0d50: 65 6d 6f 72 79 20 63 6f 72 72 75 70 74 69 6f 6e  emory corruption
0d60: 20 69 6e 20 72 65 61 6c 6c 6f 63 20 61 74 20 30   in realloc at 0
0d70: 78 25 78 5c 6e 22 2c 20 28 69 6e 74 29 70 29 3b  x%x\n", (int)p);
0d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
0d90: 20 7d 0a 20 20 6f 6c 64 4e 20 3d 20 6f 6c 64 50   }.  oldN = oldP
0da0: 69 5b 31 5d 3b 0a 20 20 6f 6c 64 4b 20 3d 20 28  i[1];.  oldK = (
0db0: 6f 6c 64 4e 2b 73 69 7a 65 6f 66 28 69 6e 74 29  oldN+sizeof(int)
0dc0: 2d 31 29 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b  -1)/sizeof(int);
0dd0: 0a 20 20 69 66 28 20 6f 6c 64 50 69 5b 6f 6c 64  .  if( oldPi[old
0de0: 4b 2b 32 5d 21 3d 30 78 64 65 61 64 33 33 34 34  K+2]!=0xdead3344
0df0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
0e00: 73 74 64 65 72 72 2c 22 48 69 67 68 2d 65 6e 64  stderr,"High-end
0e10: 20 6d 65 6d 6f 72 79 20 63 6f 72 72 75 70 74 69   memory corrupti
0e20: 6f 6e 20 69 6e 20 72 65 61 6c 6c 6f 63 20 61 74  on in realloc at
0e30: 20 30 78 25 78 5c 6e 22 2c 20 28 69 6e 74 29 70   0x%x\n", (int)p
0e40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
0e50: 0a 20 20 7d 0a 20 20 6b 20 3d 20 28 6e 20 2b 20  .  }.  k = (n + 
0e60: 73 69 7a 65 6f 66 28 69 6e 74 29 20 2d 20 31 29  sizeof(int) - 1)
0e70: 2f 73 69 7a 65 6f 66 28 69 6e 74 29 3b 0a 20 20  /sizeof(int);.  
0e80: 70 69 20 3d 20 6d 61 6c 6c 6f 63 28 20 28 6b 2b  pi = malloc( (k+
0e90: 33 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29  3)*sizeof(int) )
0ea0: 3b 0a 20 20 70 69 5b 30 5d 20 3d 20 30 78 64 65  ;.  pi[0] = 0xde
0eb0: 61 64 31 31 32 32 3b 0a 20 20 70 69 5b 31 5d 20  ad1122;.  pi[1] 
0ec0: 3d 20 6e 3b 0a 20 20 70 69 5b 6b 2b 32 5d 20 3d  = n;.  pi[k+2] =
0ed0: 20 30 78 64 65 61 64 33 33 34 34 3b 0a 20 20 70   0xdead3344;.  p
0ee0: 20 3d 20 26 70 69 5b 32 5d 3b 0a 20 20 6d 65 6d   = &pi[2];.  mem
0ef0: 63 70 79 28 70 2c 20 6f 6c 64 50 2c 20 6e 3e 6f  cpy(p, oldP, n>o
0f00: 6c 64 4e 20 3f 20 6f 6c 64 4e 20 3a 20 6e 29 3b  ldN ? oldN : n);
0f10: 0a 20 20 69 66 28 20 6e 3e 6f 6c 64 4e 20 29 7b  .  if( n>oldN ){
0f20: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
0f30: 68 61 72 2a 29 70 29 5b 6f 6c 64 4e 5d 2c 20 30  har*)p)[oldN], 0
0f40: 2c 20 6e 2d 6f 6c 64 4e 29 3b 0a 20 20 7d 0a 20  , n-oldN);.  }. 
0f50: 20 6d 65 6d 73 65 74 28 6f 6c 64 50 69 2c 20 30   memset(oldPi, 0
0f60: 2c 20 28 6f 6c 64 4b 2b 33 29 2a 73 69 7a 65 6f  , (oldK+3)*sizeo
0f70: 66 28 69 6e 74 29 29 3b 0a 20 20 66 72 65 65 28  f(int));.  free(
0f80: 6f 6c 64 50 69 29 3b 0a 23 69 66 20 4d 45 4d 4f  oldPi);.#if MEMO
0f90: 52 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72  RY_DEBUG>1.  fpr
0fa0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 72 65 61  intf(stderr,"rea
0fb0: 6c 6c 6f 63 20 25 64 20 74 6f 20 25 64 20 62 79  lloc %d to %d by
0fc0: 74 65 73 20 61 74 20 30 78 25 78 20 74 6f 20 30  tes at 0x%x to 0
0fd0: 78 25 78 20 61 74 20 25 73 3a 25 64 5c 6e 22 2c  x%x at %s:%d\n",
0fe0: 20 6f 6c 64 4e 2c 20 6e 2c 0a 20 20 20 20 28 69   oldN, n,.    (i
0ff0: 6e 74 29 6f 6c 64 50 2c 20 28 69 6e 74 29 70 2c  nt)oldP, (int)p,
1000: 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 29 3b 0a 23   zFile, line);.#
1010: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
1020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1030: 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
1040: 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 6d 65 6d   string into mem
1050: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
1060: 6d 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 46 72  m malloc().** Fr
1070: 65 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ee the original 
1080: 73 74 72 69 6e 67 20 75 73 69 6e 67 20 73 71 6c  string using sql
1090: 69 74 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f  iteFree()..*/.vo
10a0: 69 64 20 73 71 6c 69 74 65 53 74 72 52 65 61 6c  id sqliteStrReal
10b0: 6c 6f 63 28 63 68 61 72 20 2a 2a 70 7a 29 7b 0a  loc(char **pz){.
10c0: 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20    char *zNew;.  
10d0: 69 66 28 20 70 7a 3d 3d 30 20 7c 7c 20 2a 70 7a  if( pz==0 || *pz
10e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10f0: 7a 4e 65 77 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  zNew = malloc( s
1100: 74 72 6c 65 6e 28 2a 70 7a 29 20 2b 20 31 20 29  trlen(*pz) + 1 )
1110: 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 20 73  ;.  if( zNew ) s
1120: 74 72 63 70 79 28 7a 4e 65 77 2c 20 2a 70 7a 29  trcpy(zNew, *pz)
1130: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a  ;.  sqliteFree(*
1140: 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a 4e 65  pz);.  *pz = zNe
1150: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  w;.}../*.** Make
1160: 20 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72   a copy of a str
1170: 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ing in memory ob
1180: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1190: 74 65 4d 61 6c 6c 6f 63 28 29 0a 2a 2f 0a 63 68  teMalloc().*/.ch
11a0: 61 72 20 2a 73 71 6c 69 74 65 53 74 72 44 75 70  ar *sqliteStrDup
11b0: 5f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  _(const char *z,
11c0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
11d0: 74 20 6c 69 6e 65 29 7b 0a 20 20 63 68 61 72 20  t line){.  char 
11e0: 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61  *zNew = sqliteMa
11f0: 6c 6c 6f 63 5f 28 73 74 72 6c 65 6e 28 7a 29 2b  lloc_(strlen(z)+
1200: 31 2c 20 7a 46 69 6c 65 2c 20 6c 69 6e 65 29 3b  1, zFile, line);
1210: 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 20 73 74  .  if( zNew ) st
1220: 72 63 70 79 28 7a 4e 65 77 2c 20 7a 29 3b 0a 20  rcpy(zNew, z);. 
1230: 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a   return zNew;.}.
1240: 63 68 61 72 20 2a 73 71 6c 69 74 65 53 74 72 4e  char *sqliteStrN
1250: 44 75 70 5f 28 63 6f 6e 73 74 20 63 68 61 72 20  Dup_(const char 
1260: 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  *z, int n, char 
1270: 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 6c 69 6e 65  *zFile, int line
1280: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 20  ){.  char *zNew 
1290: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 5f 28  = sqliteMalloc_(
12a0: 6e 2b 31 2c 20 7a 46 69 6c 65 2c 20 6c 69 6e 65  n+1, zFile, line
12b0: 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 7b  );.  if( zNew ){
12c0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77  .    memcpy(zNew
12d0: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7a 4e 65  , z, n);.    zNe
12e0: 77 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  w[n] = 0;.  }.  
12f0: 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d 0a 23  return zNew;.}.#
1300: 65 6e 64 69 66 20 2f 2a 20 4d 45 4d 4f 52 59 5f  endif /* MEMORY_
1310: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1320: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65  The following ve
1330: 72 73 69 6f 6e 73 20 6f 66 20 6d 61 6c 6c 6f 63  rsions of malloc
1340: 28 29 20 61 6e 64 20 66 72 65 65 28 29 20 61 72  () and free() ar
1350: 65 20 66 6f 72 20 75 73 65 20 69 6e 20 61 0a 2a  e for use in a.*
1360: 2a 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a  * normal build..
1370: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1380: 4d 45 4d 4f 52 59 5f 44 45 42 55 47 29 0a 0a 2f  MEMORY_DEBUG)../
1390: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 65  *.** Allocate ne
13a0: 77 20 6d 65 6d 6f 72 79 20 61 6e 64 20 73 65 74  w memory and set
13b0: 20 69 74 20 74 6f 20 7a 65 72 6f 2e 20 20 52 65   it to zero.  Re
13c0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
13d0: 6e 6f 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  no memory is ava
13e0: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ilable..*/.void 
13f0: 2a 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 69 6e  *sqliteMalloc(in
1400: 74 20 6e 29 7b 0a 20 20 76 6f 69 64 20 2a 70 20  t n){.  void *p 
1410: 3d 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 69  = malloc(n);.  i
1420: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1430: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20   0;.  memset(p, 
1440: 30 2c 20 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, n);.  return 
1450: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
1460: 20 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73   memory previous
1470: 6c 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ly obtained from
1480: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 0a   sqliteMalloc().
1490: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 46 72  */.void sqliteFr
14a0: 65 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 69  ee(void *p){.  i
14b0: 66 28 20 70 20 29 7b 0a 20 20 20 20 66 72 65 65  f( p ){.    free
14c0: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
14d0: 2a 20 52 65 73 69 7a 65 20 61 20 70 72 69 6f 72  * Resize a prior
14e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66   allocation.  If
14f0: 20 70 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73   p==0, then this
1500: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b   routine.** work
1510: 73 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69  s just like sqli
1520: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 49 66 20  teMalloc().  If 
1530: 6e 3d 3d 30 2c 20 74 68 65 6e 20 74 68 69 73 20  n==0, then this 
1540: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 6f 72 6b 73  routine.** works
1550: 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
1560: 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 76 6f 69 64  eFree()..*/.void
1570: 20 2a 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28   *sqliteRealloc(
1580: 76 6f 69 64 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  void *p, int n){
1590: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
15a0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
15b0: 4d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 7d 0a 20  Malloc(n);.  }. 
15c0: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
15d0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a   sqliteFree(p);.
15e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 61 6c 6c  }.  return reall
1600: 6f 63 28 70 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  oc(p, n);.}../*.
1610: 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ** Make a copy o
1620: 66 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  f a string in me
1630: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
1640: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
1650: 29 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ).*/.char *sqlit
1660: 65 53 74 72 44 75 70 28 63 6f 6e 73 74 20 63 68  eStrDup(const ch
1670: 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a  ar *z){.  char *
1680: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  zNew = sqliteMal
1690: 6c 6f 63 28 73 74 72 6c 65 6e 28 7a 29 2b 31 29  loc(strlen(z)+1)
16a0: 3b 0a 20 20 69 66 28 20 7a 4e 65 77 20 29 20 73  ;.  if( zNew ) s
16b0: 74 72 63 70 79 28 7a 4e 65 77 2c 20 7a 29 3b 0a  trcpy(zNew, z);.
16c0: 20 20 72 65 74 75 72 6e 20 7a 4e 65 77 3b 0a 7d    return zNew;.}
16d0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 53 74 72  .char *sqliteStr
16e0: 4e 44 75 70 28 63 6f 6e 73 74 20 63 68 61 72 20  NDup(const char 
16f0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 63 68  *z, int n){.  ch
1700: 61 72 20 2a 7a 4e 65 77 20 3d 20 73 71 6c 69 74  ar *zNew = sqlit
1710: 65 4d 61 6c 6c 6f 63 28 6e 2b 31 29 3b 0a 20 20  eMalloc(n+1);.  
1720: 69 66 28 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20  if( zNew ){.    
1730: 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 7a 2c 20  memcpy(zNew, z, 
1740: 6e 29 3b 0a 20 20 20 20 7a 4e 65 77 5b 6e 5d 20  n);.    zNew[n] 
1750: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1760: 6e 20 7a 4e 65 77 3b 0a 7d 0a 23 65 6e 64 69 66  n zNew;.}.#endif
1770: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4d 45 4d   /* !defined(MEM
1780: 4f 52 59 5f 44 45 42 55 47 29 20 2a 2f 0a 0a 2f  ORY_DEBUG) */../
1790: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 73 74  *.** Create a st
17a0: 72 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 32 6e  ring from the 2n
17b0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
17c0: 20 61 72 67 75 6d 65 6e 74 73 20 28 75 70 20 74   arguments (up t
17d0: 6f 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 4e  o the.** first N
17e0: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 29 2c 20 73  ULL argument), s
17f0: 74 6f 72 65 20 74 68 65 20 73 74 72 69 6e 67 20  tore the string 
1800: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
1810: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
1820: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 61  eMalloc() and ma
1830: 6b 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  ke the pointer i
1840: 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1850: 31 73 74 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  1st argument.** 
1860: 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 74  point to that st
1870: 72 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ring..*/.void sq
1880: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 63 68  liteSetString(ch
1890: 61 72 20 2a 2a 70 7a 2c 20 63 6f 6e 73 74 20 63  ar **pz, const c
18a0: 68 61 72 20 2a 7a 46 69 72 73 74 2c 20 2e 2e 2e  har *zFirst, ...
18b0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
18c0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
18d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
18e0: 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a   char *zResult;.
18f0: 0a 20 20 69 66 28 20 70 7a 3d 3d 30 20 29 20 72  .  if( pz==0 ) r
1900: 65 74 75 72 6e 3b 0a 20 20 6e 42 79 74 65 20 3d  eturn;.  nByte =
1910: 20 73 74 72 6c 65 6e 28 7a 46 69 72 73 74 29 20   strlen(zFirst) 
1920: 2b 20 31 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  + 1;.  va_start(
1930: 61 70 2c 20 7a 46 69 72 73 74 29 3b 0a 20 20 77  ap, zFirst);.  w
1940: 68 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72  hile( (z = va_ar
1950: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
1960: 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 42  *))!=0 ){.    nB
1970: 79 74 65 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29  yte += strlen(z)
1980: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
1990: 70 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  p);.  sqliteFree
19a0: 28 2a 70 7a 29 3b 0a 20 20 2a 70 7a 20 3d 20 7a  (*pz);.  *pz = z
19b0: 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 4d  Result = sqliteM
19c0: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
19d0: 20 20 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d 30    if( zResult==0
19e0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 74 72   ) return;.  str
19f0: 63 70 79 28 7a 52 65 73 75 6c 74 2c 20 7a 46 69  cpy(zResult, zFi
1a00: 72 73 74 29 3b 0a 20 20 7a 52 65 73 75 6c 74 20  rst);.  zResult 
1a10: 2b 3d 20 73 74 72 6c 65 6e 28 7a 52 65 73 75 6c  += strlen(zResul
1a20: 74 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  t);.  va_start(a
1a30: 70 2c 20 7a 46 69 72 73 74 29 3b 0a 20 20 77 68  p, zFirst);.  wh
1a40: 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72 67  ile( (z = va_arg
1a50: 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
1a60: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))!=0 ){.    str
1a70: 63 70 79 28 7a 52 65 73 75 6c 74 2c 20 7a 29 3b  cpy(zResult, z);
1a80: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 2b 3d 20  .    zResult += 
1a90: 73 74 72 6c 65 6e 28 7a 52 65 73 75 6c 74 29 3b  strlen(zResult);
1aa0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
1ab0: 29 3b 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52 59  );.#ifdef MEMORY
1ac0: 5f 44 45 42 55 47 0a 23 69 66 20 4d 45 4d 4f 52  _DEBUG.#if MEMOR
1ad0: 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72 69  Y_DEBUG>1.  fpri
1ae0: 6e 74 66 28 73 74 64 65 72 72 2c 22 73 74 72 69  ntf(stderr,"stri
1af0: 6e 67 20 61 74 20 30 78 25 78 20 69 73 20 25 73  ng at 0x%x is %s
1b00: 5c 6e 22 2c 20 28 69 6e 74 29 2a 70 7a 2c 20 2a  \n", (int)*pz, *
1b10: 70 7a 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  pz);.#endif.#end
1b20: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 6f 72 6b  if.}../*.** Work
1b30: 73 20 6c 69 6b 65 20 73 71 6c 69 74 65 53 65 74  s like sqliteSet
1b40: 53 74 72 69 6e 67 2c 20 62 75 74 20 65 61 63 68  String, but each
1b50: 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 77 20 66   string is now f
1b60: 6f 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 61 20  ollowed by.** a 
1b70: 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20  length integer. 
1b80: 20 2d 31 20 6d 65 61 6e 73 20 75 73 65 20 74 68   -1 means use th
1b90: 65 20 77 68 6f 6c 65 20 73 74 72 69 6e 67 2e 0a  e whole string..
1ba0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 53 65  */.void sqliteSe
1bb0: 74 4e 53 74 72 69 6e 67 28 63 68 61 72 20 2a 2a  tNString(char **
1bc0: 70 7a 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  pz, ...){.  va_l
1bd0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 6e 42  ist ap;.  int nB
1be0: 79 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  yte;.  const cha
1bf0: 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 52  r *z;.  char *zR
1c00: 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a  esult;.  int n;.
1c10: 0a 20 20 69 66 28 20 70 7a 3d 3d 30 20 29 20 72  .  if( pz==0 ) r
1c20: 65 74 75 72 6e 3b 0a 20 20 6e 42 79 74 65 20 3d  eturn;.  nByte =
1c30: 20 30 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   0;.  va_start(a
1c40: 70 2c 20 70 7a 29 3b 0a 20 20 77 68 69 6c 65 28  p, pz);.  while(
1c50: 20 28 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (z = va_arg(ap,
1c60: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 21 3d   const char*))!=
1c70: 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 76 61 5f  0 ){.    n = va_
1c80: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1c90: 20 20 69 66 28 20 6e 3c 3d 30 20 29 20 6e 20 3d    if( n<=0 ) n =
1ca0: 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20   strlen(z);.    
1cb0: 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 7d 0a  nByte += n;.  }.
1cc0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1cd0: 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 29 3b  sqliteFree(*pz);
1ce0: 0a 20 20 2a 70 7a 20 3d 20 7a 52 65 73 75 6c 74  .  *pz = zResult
1cf0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1d00: 20 6e 42 79 74 65 20 2b 20 31 20 29 3b 0a 20 20   nByte + 1 );.  
1d10: 69 66 28 20 7a 52 65 73 75 6c 74 3d 3d 30 20 29  if( zResult==0 )
1d20: 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74   return;.  va_st
1d30: 61 72 74 28 61 70 2c 20 70 7a 29 3b 0a 20 20 77  art(ap, pz);.  w
1d40: 68 69 6c 65 28 20 28 7a 20 3d 20 76 61 5f 61 72  hile( (z = va_ar
1d50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
1d60: 2a 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 20  *))!=0 ){.    n 
1d70: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1d80: 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 30 20  );.    if( n<=0 
1d90: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  ) n = strlen(z);
1da0: 0a 20 20 20 20 73 74 72 6e 63 70 79 28 7a 52 65  .    strncpy(zRe
1db0: 73 75 6c 74 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  sult, z, n);.   
1dc0: 20 7a 52 65 73 75 6c 74 20 2b 3d 20 6e 3b 0a 20   zResult += n;. 
1dd0: 20 7d 0a 20 20 2a 7a 52 65 73 75 6c 74 20 3d 20   }.  *zResult = 
1de0: 30 3b 0a 23 69 66 64 65 66 20 4d 45 4d 4f 52 59  0;.#ifdef MEMORY
1df0: 5f 44 45 42 55 47 0a 23 69 66 20 4d 45 4d 4f 52  _DEBUG.#if MEMOR
1e00: 59 5f 44 45 42 55 47 3e 31 0a 20 20 66 70 72 69  Y_DEBUG>1.  fpri
1e10: 6e 74 66 28 73 74 64 65 72 72 2c 22 73 74 72 69  ntf(stderr,"stri
1e20: 6e 67 20 61 74 20 30 78 25 78 20 69 73 20 25 73  ng at 0x%x is %s
1e30: 5c 6e 22 2c 20 28 69 6e 74 29 2a 70 7a 2c 20 2a  \n", (int)*pz, *
1e40: 70 7a 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  pz);.#endif.#end
1e50: 69 66 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  if.  va_end(ap);
1e60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1e70: 74 20 61 6e 20 53 51 4c 2d 73 74 79 6c 65 20 71  t an SQL-style q
1e80: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74  uoted string int
1e90: 6f 20 61 20 6e 6f 72 6d 61 6c 20 73 74 72 69 6e  o a normal strin
1ea0: 67 20 62 79 20 72 65 6d 6f 76 69 6e 67 0a 2a 2a  g by removing.**
1eb0: 20 74 68 65 20 71 75 6f 74 65 20 63 68 61 72 61   the quote chara
1ec0: 63 74 65 72 73 2e 20 20 54 68 65 20 63 6f 6e 76  cters.  The conv
1ed0: 65 72 73 69 6f 6e 20 69 73 20 64 6f 6e 65 20 69  ersion is done i
1ee0: 6e 2d 70 6c 61 63 65 2e 20 20 49 66 20 74 68 65  n-place.  If the
1ef0: 0a 2a 2a 20 69 6e 70 75 74 20 64 6f 65 73 20 6e  .** input does n
1f00: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
1f10: 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 2c  quote character,
1f20: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1f30: 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  ne.** is a no-op
1f40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f50: 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a 7a 29  Dequote(char *z)
1f60: 7b 0a 20 20 69 6e 74 20 71 75 6f 74 65 3b 0a 20  {.  int quote;. 
1f70: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 71 75 6f   int i, j;.  quo
1f80: 74 65 20 3d 20 7a 5b 30 5d 3b 0a 20 20 69 66 28  te = z[0];.  if(
1f90: 20 71 75 6f 74 65 21 3d 27 5c 27 27 20 26 26 20   quote!='\'' && 
1fa0: 71 75 6f 74 65 21 3d 27 22 27 20 29 20 72 65 74  quote!='"' ) ret
1fb0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 31 2c 20  urn;.  for(i=1, 
1fc0: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
1fd0: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 71  .    if( z[i]==q
1fe0: 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20 69 66  uote ){.      if
1ff0: 28 20 7a 5b 69 2b 31 5d 3d 3d 71 75 6f 74 65 20  ( z[i+1]==quote 
2000: 29 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  ){.        z[j++
2010: 5d 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 20  ] = quote;.     
2020: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65     i++;.      }e
2030: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
2040: 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ++] = 0;.       
2050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2060: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2070: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
2080: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
2090: 41 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 70 20  An array to map 
20a0: 61 6c 6c 20 75 70 70 65 72 2d 63 61 73 65 20 63  all upper-case c
20b0: 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20 74  haracters into t
20c0: 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
20d0: 6e 67 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61 73 65  ng.** lower-case
20e0: 20 63 68 61 72 61 63 74 65 72 2e 20 0a 2a 2f 0a   character. .*/.
20f0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
2100: 63 68 61 72 20 55 70 70 65 72 54 6f 4c 6f 77 65  char UpperToLowe
2110: 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c  r[] = {.      0,
2120: 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c    1,  2,  3,  4,
2130: 20 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 38 2c    5,  6,  7,  8,
2140: 20 20 39 2c 20 31 30 2c 20 31 31 2c 20 31 32 2c    9, 10, 11, 12,
2150: 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36 2c   13, 14, 15, 16,
2160: 20 31 37 2c 0a 20 20 20 20 20 31 38 2c 20 31 39   17,.     18, 19
2170: 2c 20 32 30 2c 20 32 31 2c 20 32 32 2c 20 32 33  , 20, 21, 22, 23
2180: 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 20 32 37  , 24, 25, 26, 27
2190: 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 20 33 31  , 28, 29, 30, 31
21a0: 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c 20 33 35  , 32, 33, 34, 35
21b0: 2c 0a 20 20 20 20 20 33 36 2c 20 33 37 2c 20 33  ,.     36, 37, 3
21c0: 38 2c 20 33 39 2c 20 34 30 2c 20 34 31 2c 20 34  8, 39, 40, 41, 4
21d0: 32 2c 20 34 33 2c 20 34 34 2c 20 34 35 2c 20 34  2, 43, 44, 45, 4
21e0: 36 2c 20 34 37 2c 20 34 38 2c 20 34 39 2c 20 35  6, 47, 48, 49, 5
21f0: 30 2c 20 35 31 2c 20 35 32 2c 20 35 33 2c 0a 20  0, 51, 52, 53,. 
2200: 20 20 20 20 35 34 2c 20 35 35 2c 20 35 36 2c 20      54, 55, 56, 
2210: 35 37 2c 20 35 38 2c 20 35 39 2c 20 36 30 2c 20  57, 58, 59, 60, 
2220: 36 31 2c 20 36 32 2c 20 36 33 2c 20 36 34 2c 20  61, 62, 63, 64, 
2230: 39 37 2c 20 39 38 2c 20 39 39 2c 31 30 30 2c 31  97, 98, 99,100,1
2240: 30 31 2c 31 30 32 2c 31 30 33 2c 0a 20 20 20 20  01,102,103,.    
2250: 31 30 34 2c 31 30 35 2c 31 30 36 2c 31 30 37 2c  104,105,106,107,
2260: 31 30 38 2c 31 30 39 2c 31 31 30 2c 31 31 31 2c  108,109,110,111,
2270: 31 31 32 2c 31 31 33 2c 31 31 34 2c 31 31 35 2c  112,113,114,115,
2280: 31 31 36 2c 31 31 37 2c 31 31 38 2c 31 31 39 2c  116,117,118,119,
2290: 31 32 30 2c 31 32 31 2c 0a 20 20 20 20 31 32 32  120,121,.    122
22a0: 2c 20 39 31 2c 20 39 32 2c 20 39 33 2c 20 39 34  , 91, 92, 93, 94
22b0: 2c 20 39 35 2c 20 39 36 2c 20 39 37 2c 20 39 38  , 95, 96, 97, 98
22c0: 2c 20 39 39 2c 31 30 30 2c 31 30 31 2c 31 30 32  , 99,100,101,102
22d0: 2c 31 30 33 2c 31 30 34 2c 31 30 35 2c 31 30 36  ,103,104,105,106
22e0: 2c 31 30 37 2c 0a 20 20 20 20 31 30 38 2c 31 30  ,107,.    108,10
22f0: 39 2c 31 31 30 2c 31 31 31 2c 31 31 32 2c 31 31  9,110,111,112,11
2300: 33 2c 31 31 34 2c 31 31 35 2c 31 31 36 2c 31 31  3,114,115,116,11
2310: 37 2c 31 31 38 2c 31 31 39 2c 31 32 30 2c 31 32  7,118,119,120,12
2320: 31 2c 31 32 32 2c 31 32 33 2c 31 32 34 2c 31 32  1,122,123,124,12
2330: 35 2c 0a 20 20 20 20 31 32 36 2c 31 32 37 2c 31  5,.    126,127,1
2340: 32 38 2c 31 32 39 2c 31 33 30 2c 31 33 31 2c 31  28,129,130,131,1
2350: 33 32 2c 31 33 33 2c 31 33 34 2c 31 33 35 2c 31  32,133,134,135,1
2360: 33 36 2c 31 33 37 2c 31 33 38 2c 31 33 39 2c 31  36,137,138,139,1
2370: 34 30 2c 31 34 31 2c 31 34 32 2c 31 34 33 2c 0a  40,141,142,143,.
2380: 20 20 20 20 31 34 34 2c 31 34 35 2c 31 34 36 2c      144,145,146,
2390: 31 34 37 2c 31 34 38 2c 31 34 39 2c 31 35 30 2c  147,148,149,150,
23a0: 31 35 31 2c 31 35 32 2c 31 35 33 2c 31 35 34 2c  151,152,153,154,
23b0: 31 35 35 2c 31 35 36 2c 31 35 37 2c 31 35 38 2c  155,156,157,158,
23c0: 31 35 39 2c 31 36 30 2c 31 36 31 2c 0a 20 20 20  159,160,161,.   
23d0: 20 31 36 32 2c 31 36 33 2c 31 36 34 2c 31 36 35   162,163,164,165
23e0: 2c 31 36 36 2c 31 36 37 2c 31 36 38 2c 31 36 39  ,166,167,168,169
23f0: 2c 31 37 30 2c 31 37 31 2c 31 37 32 2c 31 37 33  ,170,171,172,173
2400: 2c 31 37 34 2c 31 37 35 2c 31 37 36 2c 31 37 37  ,174,175,176,177
2410: 2c 31 37 38 2c 31 37 39 2c 0a 20 20 20 20 31 38  ,178,179,.    18
2420: 30 2c 31 38 31 2c 31 38 32 2c 31 38 33 2c 31 38  0,181,182,183,18
2430: 34 2c 31 38 35 2c 31 38 36 2c 31 38 37 2c 31 38  4,185,186,187,18
2440: 38 2c 31 38 39 2c 31 39 30 2c 31 39 31 2c 31 39  8,189,190,191,19
2450: 32 2c 31 39 33 2c 31 39 34 2c 31 39 35 2c 31 39  2,193,194,195,19
2460: 36 2c 31 39 37 2c 0a 20 20 20 20 31 39 38 2c 31  6,197,.    198,1
2470: 39 39 2c 32 30 30 2c 32 30 31 2c 32 30 32 2c 32  99,200,201,202,2
2480: 30 33 2c 32 30 34 2c 32 30 35 2c 32 30 36 2c 32  03,204,205,206,2
2490: 30 37 2c 32 30 38 2c 32 30 39 2c 32 31 30 2c 32  07,208,209,210,2
24a0: 31 31 2c 32 31 32 2c 32 31 33 2c 32 31 34 2c 32  11,212,213,214,2
24b0: 31 35 2c 0a 20 20 20 20 32 31 36 2c 32 31 37 2c  15,.    216,217,
24c0: 32 31 38 2c 32 31 39 2c 32 32 30 2c 32 32 31 2c  218,219,220,221,
24d0: 32 32 32 2c 32 32 33 2c 32 32 34 2c 32 32 35 2c  222,223,224,225,
24e0: 32 32 36 2c 32 32 37 2c 32 32 38 2c 32 32 39 2c  226,227,228,229,
24f0: 32 33 30 2c 32 33 31 2c 32 33 32 2c 32 33 33 2c  230,231,232,233,
2500: 0a 20 20 20 20 32 33 34 2c 32 33 35 2c 32 33 36  .    234,235,236
2510: 2c 32 33 37 2c 32 33 38 2c 32 33 39 2c 32 34 30  ,237,238,239,240
2520: 2c 32 34 31 2c 32 34 32 2c 32 34 33 2c 32 34 34  ,241,242,243,244
2530: 2c 32 34 35 2c 32 34 36 2c 32 34 37 2c 32 34 38  ,245,246,247,248
2540: 2c 32 34 39 2c 32 35 30 2c 32 35 31 2c 0a 20 20  ,249,250,251,.  
2550: 20 20 32 35 32 2c 32 35 33 2c 32 35 34 2c 32 35    252,253,254,25
2560: 35 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  5.};../*.** This
2570: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 75 74   function comput
2580: 65 73 20 61 20 68 61 73 68 20 6f 6e 20 74 68 65  es a hash on the
2590: 20 6e 61 6d 65 20 6f 66 20 61 20 6b 65 79 77 6f   name of a keywo
25a0: 72 64 2e 0a 2a 2a 20 43 61 73 65 20 69 73 20 6e  rd..** Case is n
25b0: 6f 74 20 73 69 67 6e 69 66 69 63 61 6e 74 2e 0a  ot significant..
25c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 48 61 73  */.int sqliteHas
25d0: 68 4e 6f 43 61 73 65 28 63 6f 6e 73 74 20 63 68  hNoCase(const ch
25e0: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
25f0: 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 69 6e   int h = 0;.  in
2600: 74 20 63 3b 0a 20 20 69 66 28 20 6e 3c 3d 30 20  t c;.  if( n<=0 
2610: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  ) n = strlen(z);
2620: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
2630: 30 20 26 26 20 28 63 20 3d 20 2a 7a 2b 2b 29 21  0 && (c = *z++)!
2640: 3d 30 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68  =0 ){.    h = (h
2650: 3c 3c 33 29 20 5e 20 68 20 5e 20 55 70 70 65 72  <<3) ^ h ^ Upper
2660: 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a 20 20 7d 0a  ToLower[c];.  }.
2670: 20 20 69 66 28 20 68 3c 30 20 29 20 68 20 3d 20    if( h<0 ) h = 
2680: 2d 68 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a  -h;.  return h;.
2690: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 73 79  }../*.** Some sy
26a0: 73 74 65 6d 73 20 68 61 76 65 20 73 74 72 69 63  stems have stric
26b0: 6d 70 28 29 2e 20 20 4f 74 68 65 72 73 20 68 61  mp().  Others ha
26c0: 76 65 20 73 74 72 63 61 73 65 63 6d 70 28 29 2e  ve strcasecmp().
26d0: 20 20 42 65 63 61 75 73 65 0a 2a 2a 20 74 68 65    Because.** the
26e0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 73 69 73 74  re is no consist
26f0: 65 6e 63 79 2c 20 77 65 20 77 69 6c 6c 20 64 65  ency, we will de
2700: 66 69 6e 65 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f  fine our own..*/
2710: 0a 69 6e 74 20 73 71 6c 69 74 65 53 74 72 49 43  .int sqliteStrIC
2720: 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  mp(const char *z
2730: 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Left, const char
2740: 20 2a 7a 52 69 67 68 74 29 7b 0a 20 20 72 65 67   *zRight){.  reg
2750: 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63  ister unsigned c
2760: 68 61 72 20 2a 61 2c 20 2a 62 3b 0a 20 20 61 20  har *a, *b;.  a 
2770: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
2780: 20 2a 29 7a 4c 65 66 74 3b 0a 20 20 62 20 3d 20   *)zLeft;.  b = 
2790: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
27a0: 29 7a 52 69 67 68 74 3b 0a 20 20 77 68 69 6c 65  )zRight;.  while
27b0: 28 20 2a 61 21 3d 30 20 26 26 20 55 70 70 65 72  ( *a!=0 && Upper
27c0: 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d 55 70 70  ToLower[*a]==Upp
27d0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 29 7b 20  erToLower[*b]){ 
27e0: 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20 20 72 65  a++; b++; }.  re
27f0: 74 75 72 6e 20 2a 61 20 2d 20 2a 62 3b 0a 7d 0a  turn *a - *b;.}.
2800: 69 6e 74 20 73 71 6c 69 74 65 53 74 72 4e 49 43  int sqliteStrNIC
2810: 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  mp(const char *z
2820: 4c 65 66 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Left, const char
2830: 20 2a 7a 52 69 67 68 74 2c 20 69 6e 74 20 4e 29   *zRight, int N)
2840: 7b 0a 20 20 72 65 67 69 73 74 65 72 20 75 6e 73  {.  register uns
2850: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 2c 20 2a  igned char *a, *
2860: 62 3b 0a 20 20 61 20 3d 20 28 75 6e 73 69 67 6e  b;.  a = (unsign
2870: 65 64 20 63 68 61 72 20 2a 29 7a 4c 65 66 74 3b  ed char *)zLeft;
2880: 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e 65 64  .  b = (unsigned
2890: 20 63 68 61 72 20 2a 29 7a 52 69 67 68 74 3b 0a   char *)zRight;.
28a0: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30    while( N-- > 0
28b0: 20 26 26 20 2a 61 21 3d 30 20 26 26 20 55 70 70   && *a!=0 && Upp
28c0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 61 5d 3d 3d 55  erToLower[*a]==U
28d0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 62 5d 29  pperToLower[*b])
28e0: 7b 20 61 2b 2b 3b 20 62 2b 2b 3b 20 7d 0a 20 20  { a++; b++; }.  
28f0: 72 65 74 75 72 6e 20 4e 3c 30 20 3f 20 30 20 3a  return N<0 ? 0 :
2900: 20 2a 61 20 2d 20 2a 62 3b 0a 7d 0a 0a 2f 2a 20   *a - *b;.}../* 
2910: 4e 6f 74 65 73 20 6f 6e 20 73 74 72 69 6e 67 20  Notes on string 
2920: 63 6f 6d 70 61 72 69 73 69 6f 6e 73 2e 0a 2a 2a  comparisions..**
2930: 0a 2a 2a 20 57 65 20 77 61 6e 74 20 74 68 65 20  .** We want the 
2940: 6d 61 69 6e 20 73 74 72 69 6e 67 20 63 6f 6d 70  main string comp
2950: 61 72 69 73 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  arision function
2960: 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
2970: 67 20 74 6f 0a 2a 2a 20 73 6f 72 74 20 62 6f 74  g to.** sort bot
2980: 68 20 6e 75 6d 62 65 72 73 20 61 6e 64 20 61 6c  h numbers and al
2990: 70 68 61 6e 75 6d 65 72 69 63 20 77 6f 72 64 73  phanumeric words
29a0: 20 69 6e 74 6f 20 74 68 65 20 63 6f 72 72 65 63   into the correc
29b0: 74 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 20 54  t sequence..** T
29c0: 68 65 20 73 61 6d 65 20 72 6f 75 74 69 6e 65 20  he same routine 
29d0: 73 68 6f 75 6c 64 20 64 6f 20 62 6f 74 68 20 77  should do both w
29e0: 69 74 68 6f 75 74 20 70 72 69 6f 72 20 6b 6e 6f  ithout prior kno
29f0: 77 6c 65 64 67 65 20 6f 66 20 77 68 69 63 68 0a  wledge of which.
2a00: 2a 2a 20 74 79 70 65 20 6f 66 20 74 65 78 74 20  ** type of text 
2a10: 74 68 65 20 69 6e 70 75 74 20 72 65 70 72 65 73  the input repres
2a20: 65 6e 74 73 2e 20 20 49 74 20 73 68 6f 75 6c 64  ents.  It should
2a30: 20 65 76 65 6e 20 77 6f 72 6b 20 66 6f 72 20 73   even work for s
2a40: 74 72 69 6e 67 73 0a 2a 2a 20 77 68 69 63 68 20  trings.** which 
2a50: 61 72 65 20 61 20 6d 69 78 74 75 72 65 20 6f 66  are a mixture of
2a60: 20 74 65 78 74 20 61 6e 64 20 6e 75 6d 62 65 72   text and number
2a70: 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 63 63 6f  s..**.** To acco
2a80: 6d 70 6c 69 73 68 20 74 68 69 73 2c 20 77 65 20  mplish this, we 
2a90: 6b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 61 20  keep track of a 
2aa0: 73 74 61 74 65 20 6e 75 6d 62 65 72 20 77 68 69  state number whi
2ab0: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 2a 2a 20 74  le scanning.** t
2ac0: 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 2e 20  he two strings. 
2ad0: 20 54 68 65 20 73 74 61 74 65 73 20 61 72 65 20   The states are 
2ae0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2af0: 2a 20 20 20 20 31 20 20 20 20 20 20 42 65 67 69  *    1      Begi
2b00: 6e 6e 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a  nning of word.**
2b10: 20 20 20 20 32 20 20 20 20 20 20 41 72 62 69 74      2      Arbit
2b20: 72 61 72 79 20 74 65 78 74 0a 2a 2a 20 20 20 20  rary text.**    
2b30: 33 20 20 20 20 20 20 49 6e 74 65 67 65 72 0a 2a  3      Integer.*
2b40: 2a 20 20 20 20 34 20 20 20 20 20 20 4e 65 67 61  *    4      Nega
2b50: 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20  tive integer.** 
2b60: 20 20 20 35 20 20 20 20 20 20 52 65 61 6c 20 6e     5      Real n
2b70: 75 6d 62 65 72 0a 2a 2a 20 20 20 20 36 20 20 20  umber.**    6   
2b80: 20 20 20 4e 65 67 61 74 69 76 65 20 72 65 61 6c     Negative real
2b90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e 20  .**.** The scan 
2ba0: 62 65 67 69 6e 73 20 69 6e 20 73 74 61 74 65 20  begins in state 
2bb0: 31 2c 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  1, beginning of 
2bc0: 77 6f 72 64 2e 20 20 54 72 61 6e 73 69 74 69 6f  word.  Transitio
2bd0: 6e 73 20 74 6f 20 6f 74 68 65 72 0a 2a 2a 20 73  ns to other.** s
2be0: 74 61 74 65 73 20 61 72 65 20 64 65 74 65 72 6d  tates are determ
2bf0: 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65  ined by characte
2c00: 72 73 20 73 65 65 6e 2c 20 61 73 20 73 68 6f 77  rs seen, as show
2c10: 6e 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n in the followi
2c20: 6e 67 0a 2a 2a 20 63 68 61 72 74 3a 0a 2a 2a 0a  ng.** chart:.**.
2c30: 2a 2a 20 20 20 20 20 20 43 75 72 72 65 6e 74 20  **      Current 
2c40: 53 74 61 74 65 20 20 20 20 20 20 20 20 20 43 68  State         Ch
2c50: 61 72 61 63 74 65 72 20 53 65 65 6e 20 20 4e 65  aracter Seen  Ne
2c60: 77 20 53 74 61 74 65 0a 2a 2a 20 20 20 20 20 20  w State.**      
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
2c90: 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
2cb0: 20 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66    0 Beginning of
2cc0: 20 77 6f 72 64 20 20 20 22 2d 22 20 20 20 20 20   word   "-"     
2cd0: 20 20 20 20 20 20 20 20 33 20 4e 65 67 61 74 69          3 Negati
2ce0: 76 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ve integer.**   
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 20 20 20 20 20 64 69 67 69 74 20 20           digit  
2d10: 20 20 20 20 20 20 20 20 20 32 20 49 6e 74 65 67           2 Integ
2d20: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 73 70 61 63 65 20 20 20 20 20 20 20 20 20 20   space          
2d50: 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20   0 Beginning of 
2d60: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
2d90: 20 20 20 31 20 41 72 62 69 74 72 61 72 79 20 74     1 Arbitrary t
2da0: 65 78 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  ext.**.**      1
2db0: 20 41 72 62 69 74 72 61 72 79 20 74 65 78 74 20   Arbitrary text 
2dc0: 20 20 20 20 20 73 70 61 63 65 20 20 20 20 20 20       space      
2dd0: 20 20 20 20 20 30 20 42 65 67 69 6e 6e 69 6e 67       0 Beginning
2de0: 20 6f 66 20 77 6f 72 64 0a 2a 2a 20 20 20 20 20   of word.**     
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 64 69 67 69 74 20 20 20 20         digit    
2e10: 20 20 20 20 20 20 20 32 20 49 6e 74 65 67 65 72         2 Integer
2e20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
2e40: 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20 31  therwise       1
2e50: 20 41 72 62 69 74 72 61 72 79 20 74 65 78 74 0a   Arbitrary text.
2e60: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 20 49 6e 74  **.**      2 Int
2e70: 65 67 65 72 20 20 20 20 20 20 20 20 20 20 20 20  eger            
2e80: 20 73 70 61 63 65 20 20 20 20 20 20 20 20 20 20   space          
2e90: 20 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20   0 Beginning of 
2ea0: 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 22 2e 22 20 20 20 20 20 20 20 20 20 20     "."          
2ed0: 20 20 20 34 20 52 65 61 6c 20 6e 75 6d 62 65 72     4 Real number
2ee0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
2f00: 69 67 69 74 20 20 20 20 20 20 20 20 20 20 20 32  igit           2
2f10: 20 49 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   Integer.**     
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 20 20 20 6f 74 68 65 72 77 69 73 65         otherwise
2f40: 20 20 20 20 20 20 20 31 20 41 72 62 69 74 72 61         1 Arbitra
2f50: 72 79 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 20 20  ry text.**.**   
2f60: 20 20 20 33 20 4e 65 67 61 74 69 76 65 20 69 6e     3 Negative in
2f70: 74 65 67 65 72 20 20 20 20 73 70 61 63 65 20 20  teger    space  
2f80: 20 20 20 20 20 20 20 20 20 30 20 42 65 67 69 6e           0 Begin
2f90: 6e 69 6e 67 20 6f 66 20 77 6f 72 64 0a 2a 2a 20  ning of word.** 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 22 2e 22 20 20             "."  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 35 20 4e 65 67             5 Neg
2fd0: 61 74 69 76 65 20 52 65 61 6c 20 6e 75 6d 0a 2a  ative Real num.*
2fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 67               dig
3000: 69 74 20 20 20 20 20 20 20 20 20 20 20 33 20 4e  it           3 N
3010: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a  egative integer.
3020: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74                ot
3040: 68 65 72 77 69 73 65 20 20 20 20 20 20 20 31 20  herwise       1 
3050: 41 72 62 69 74 72 61 72 79 20 74 65 78 74 0a 2a  Arbitrary text.*
3060: 2a 0a 2a 2a 20 20 20 20 20 20 34 20 52 65 61 6c  *.**      4 Real
3070: 20 6e 75 6d 62 65 72 20 20 20 20 20 20 20 20 20   number         
3080: 73 70 61 63 65 20 20 20 20 20 20 20 20 20 20 20  space           
3090: 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77  0 Beginning of w
30a0: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ord.**          
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 64 69 67 69 74 20 20 20 20 20 20 20 20 20    digit         
30d0: 20 20 34 20 52 65 61 6c 20 6e 75 6d 62 65 72 0a    4 Real number.
30e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74                ot
3100: 68 65 72 77 69 73 65 20 20 20 20 20 20 20 31 20  herwise       1 
3110: 41 72 62 69 74 72 61 72 79 20 74 65 78 74 0a 2a  Arbitrary text.*
3120: 2a 0a 2a 2a 20 20 20 20 20 20 35 20 4e 65 67 61  *.**      5 Nega
3130: 74 69 76 65 20 72 65 61 6c 20 6e 75 6d 20 20 20  tive real num   
3140: 73 70 61 63 65 20 20 20 20 20 20 20 20 20 20 20  space           
3150: 30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77  0 Beginning of w
3160: 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ord.**          
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 64 69 67 69 74 20 20 20 20 20 20 20 20 20    digit         
3190: 20 20 35 20 4e 65 67 61 74 69 76 65 20 72 65 61    5 Negative rea
31a0: 6c 20 6e 75 6d 0a 2a 2a 20 20 20 20 20 20 20 20  l num.**        
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20      otherwise   
31d0: 20 20 20 20 31 20 41 72 62 69 74 72 61 72 79 20      1 Arbitrary 
31e0: 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 6f 20 69 6d  text.**.** To im
31f0: 70 6c 65 6d 65 6e 74 20 74 68 69 73 20 73 74 61  plement this sta
3200: 74 65 20 6d 61 63 68 69 6e 65 2c 20 77 65 20 66  te machine, we f
3210: 69 72 73 74 20 63 6c 61 73 73 69 66 79 20 65 61  irst classify ea
3220: 63 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  ch character.** 
3230: 69 6e 74 6f 20 6f 6e 20 6f 66 20 74 68 65 20 66  into on of the f
3240: 6f 6c 6c 6f 77 69 6e 67 20 63 61 74 65 67 6f 72  ollowing categor
3250: 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ies:.**.**      
3260: 30 20 20 54 65 78 74 0a 2a 2a 20 20 20 20 20 20  0  Text.**      
3270: 31 20 20 53 70 61 63 65 0a 2a 2a 20 20 20 20 20  1  Space.**     
3280: 20 32 20 20 44 69 67 69 74 0a 2a 2a 20 20 20 20   2  Digit.**    
3290: 20 20 33 20 20 22 2d 22 0a 2a 2a 20 20 20 20 20    3  "-".**     
32a0: 20 34 20 20 22 2e 22 0a 2a 2a 0a 2a 2a 20 47 69   4  ".".**.** Gi
32b0: 76 65 6e 20 61 6e 20 61 72 62 69 74 72 61 72 79  ven an arbitrary
32c0: 20 63 68 61 72 61 63 74 65 72 2c 20 74 68 65 20   character, the 
32d0: 61 72 72 61 79 20 63 68 61 72 43 6c 61 73 73 5b  array charClass[
32e0: 5d 20 6d 61 70 73 20 74 68 61 74 20 63 68 61 72  ] maps that char
32f0: 61 63 74 65 72 0a 2a 2a 20 69 6e 74 6f 20 6f 6e  acter.** into on
3300: 65 20 6f 66 20 74 68 65 20 61 74 6f 76 65 20 63  e of the atove c
3310: 61 74 65 67 6f 72 69 65 73 2e 0a 2a 2f 0a 73 74  ategories..*/.st
3320: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
3330: 6e 65 64 20 63 68 61 72 20 63 68 61 72 43 6c 61  ned char charCla
3340: 73 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ss[] = {.       
3350: 20 2f 2a 20 78 30 20 78 31 20 78 32 20 78 33 20   /* x0 x1 x2 x3 
3360: 78 34 20 78 35 20 78 36 20 78 37 20 78 38 20 78  x4 x5 x6 x7 x8 x
3370: 39 20 78 41 20 78 42 20 78 43 20 78 44 20 78 45  9 xA xB xC xD xE
3380: 20 78 46 20 2a 2f 0a 2f 2a 20 30 78 20 2a 2f 20   xF */./* 0x */ 
3390: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
33a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
33b0: 31 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30  1, 0, 1, 0, 0, 0
33c0: 2c 0a 2f 2a 20 31 78 20 2a 2f 20 20 20 30 2c 20  ,./* 1x */   0, 
33d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
33e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
33f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20   0, 0, 0, 0,./* 
3400: 32 78 20 2a 2f 20 20 20 31 2c 20 30 2c 20 30 2c  2x */   1, 0, 0,
3410: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3420: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 33  0, 0, 0, 0, 0, 3
3430: 2c 20 34 2c 20 30 2c 0a 2f 2a 20 33 78 20 2a 2f  , 4, 0,./* 3x */
3440: 20 20 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32     2, 2, 2, 2, 2
3450: 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c 20 32 2c  , 2, 2, 2, 2, 2,
3460: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3470: 30 2c 0a 2f 2a 20 34 78 20 2a 2f 20 20 20 30 2c  0,./* 4x */   0,
3480: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3490: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
34a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a  , 0, 0, 0, 0,./*
34b0: 20 35 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30   5x */   0, 0, 0
34c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
34d0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
34e0: 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 36 78 20 2a  0, 0, 0,./* 6x *
34f0: 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  /   0, 0, 0, 0, 
3500: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3510: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3520: 20 30 2c 0a 2f 2a 20 37 78 20 2a 2f 20 20 20 30   0,./* 7x */   0
3530: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3540: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3550: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f  0, 0, 0, 0, 0,./
3560: 2a 20 38 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20  * 8x */   0, 0, 
3570: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3580: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3590: 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 39 78 20   0, 0, 0,./* 9x 
35a0: 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  */   0, 0, 0, 0,
35b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
35c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
35d0: 2c 20 30 2c 0a 2f 2a 20 41 78 20 2a 2f 20 20 20  , 0,./* Ax */   
35e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
35f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3600: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
3610: 2f 2a 20 42 78 20 2a 2f 20 20 20 30 2c 20 30 2c  /* Bx */   0, 0,
3620: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3630: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3640: 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 43 78  , 0, 0, 0,./* Cx
3650: 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   */   0, 0, 0, 0
3660: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3670: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
3680: 30 2c 20 30 2c 0a 2f 2a 20 44 78 20 2a 2f 20 20  0, 0,./* Dx */  
3690: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
36a0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
36b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
36c0: 0a 2f 2a 20 45 78 20 2a 2f 20 20 20 30 2c 20 30  ./* Ex */   0, 0
36d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
36e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
36f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 2f 2a 20 46  0, 0, 0, 0,./* F
3700: 78 20 2a 2f 20 20 20 30 2c 20 30 2c 20 30 2c 20  x */   0, 0, 0, 
3710: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
3720: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
3730: 20 30 2c 20 30 2c 0a 7d 3b 0a 23 64 65 66 69 6e   0, 0,.};.#defin
3740: 65 20 4e 5f 43 48 41 52 5f 43 4c 41 53 53 20 35  e N_CHAR_CLASS 5
3750: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
3760: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
3770: 6e 75 6d 62 65 72 20 28 30 20 74 68 72 75 20 35  number (0 thru 5
3780: 29 2c 20 74 68 69 73 20 61 72 72 61 79 20 66 69  ), this array fi
3790: 67 75 72 65 73 0a 2a 2a 20 74 68 65 20 6e 65 77  gures.** the new
37a0: 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 67 69   state number gi
37b0: 76 65 6e 20 74 68 65 20 63 68 61 72 61 63 74 65  ven the characte
37c0: 72 20 63 6c 61 73 73 2e 0a 2a 2f 0a 73 74 61 74  r class..*/.stat
37d0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
37e0: 64 20 63 68 61 72 20 73 74 61 74 65 4d 61 63 68  d char stateMach
37f0: 69 6e 65 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 54 65  ine[] = {. /* Te
3800: 78 74 2c 20 20 53 70 61 63 65 2c 20 44 69 67 69  xt,  Space, Digi
3810: 74 2c 20 22 2d 22 2c 20 22 2e 22 20 2a 2f 0a 20  t, "-", "." */. 
3820: 20 20 20 20 20 31 2c 20 20 20 20 20 20 30 2c 20       1,      0, 
3830: 20 20 20 32 2c 20 20 20 20 33 2c 20 20 20 31 2c     2,    3,   1,
3840: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 20 30        /* State 0
3850: 3a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 77  : Beginning of w
3860: 6f 72 64 20 2a 2f 0a 20 20 20 20 20 20 31 2c 20  ord */.      1, 
3870: 20 20 20 20 20 30 2c 20 20 20 20 32 2c 20 20 20       0,    2,   
3880: 20 31 2c 20 20 20 31 2c 20 20 20 20 20 20 2f 2a   1,   1,      /*
3890: 20 53 74 61 74 65 20 31 3a 20 41 72 62 69 74 72   State 1: Arbitr
38a0: 61 72 79 20 74 65 78 74 20 2a 2f 0a 20 20 20 20  ary text */.    
38b0: 20 20 31 2c 20 20 20 20 20 20 30 2c 20 20 20 20    1,      0,    
38c0: 32 2c 20 20 20 20 31 2c 20 20 20 34 2c 20 20 20  2,    1,   4,   
38d0: 20 20 20 2f 2a 20 53 74 61 74 65 20 32 3a 20 49     /* State 2: I
38e0: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
38f0: 31 2c 20 20 20 20 20 20 30 2c 20 20 20 20 33 2c  1,      0,    3,
3900: 20 20 20 20 31 2c 20 20 20 35 2c 20 20 20 20 20      1,   5,     
3910: 20 2f 2a 20 53 74 61 74 65 20 33 3a 20 4e 65 67   /* State 3: Neg
3920: 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 2a 2f  ative integer */
3930: 0a 20 20 20 20 20 20 31 2c 20 20 20 20 20 20 30  .      1,      0
3940: 2c 20 20 20 20 34 2c 20 20 20 20 31 2c 20 20 20  ,    4,    1,   
3950: 31 2c 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65  1,      /* State
3960: 20 34 3a 20 52 65 61 6c 20 6e 75 6d 62 65 72 20   4: Real number 
3970: 2a 2f 0a 20 20 20 20 20 20 31 2c 20 20 20 20 20  */.      1,     
3980: 20 30 2c 20 20 20 20 35 2c 20 20 20 20 31 2c 20   0,    5,    1, 
3990: 20 20 31 2c 20 20 20 20 20 20 2f 2a 20 53 74 61    1,      /* Sta
39a0: 74 65 20 35 3a 20 4e 65 67 61 74 69 76 65 20 72  te 5: Negative r
39b0: 65 61 6c 20 6e 75 6d 20 2a 2f 0a 7d 3b 0a 0a 2f  eal num */.};../
39c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
39d0: 6f 65 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e  oes a comparison
39e0: 20 6f 66 20 74 77 6f 20 73 74 72 69 6e 67 73 2e   of two strings.
39f0: 20 20 43 61 73 65 20 69 73 20 75 73 65 64 20 6f    Case is used o
3a00: 6e 6c 79 0a 2a 2a 20 69 66 20 75 73 65 43 61 73  nly.** if useCas
3a10: 65 21 3d 30 2e 20 20 4e 75 6d 62 65 72 73 20 63  e!=0.  Numbers c
3a20: 6f 6d 70 61 72 65 20 69 6e 20 6e 75 6d 65 72 69  ompare in numeri
3a30: 63 61 6c 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  cal order..*/.st
3a40: 61 74 69 63 20 69 6e 74 20 70 72 69 76 61 74 65  atic int private
3a50: 53 74 72 43 6d 70 28 63 6f 6e 73 74 20 63 68 61  StrCmp(const cha
3a60: 72 20 2a 61 74 65 78 74 2c 20 63 6f 6e 73 74 20  r *atext, const 
3a70: 63 68 61 72 20 2a 62 74 65 78 74 2c 20 69 6e 74  char *btext, int
3a80: 20 75 73 65 43 61 73 65 29 7b 0a 20 20 72 65 67   useCase){.  reg
3a90: 69 73 74 65 72 20 75 6e 73 69 67 6e 65 64 20 63  ister unsigned c
3aa0: 68 61 72 20 2a 61 2c 20 2a 62 2c 20 2a 6d 61 70  har *a, *b, *map
3ab0: 2c 20 63 61 2c 20 63 62 3b 0a 20 20 69 6e 74 20  , ca, cb;.  int 
3ac0: 72 65 73 75 6c 74 3b 0a 20 20 72 65 67 69 73 74  result;.  regist
3ad0: 65 72 20 69 6e 74 20 63 63 6c 61 73 73 20 3d 20  er int cclass = 
3ae0: 30 3b 0a 0a 20 20 61 20 3d 20 28 75 6e 73 69 67  0;..  a = (unsig
3af0: 6e 65 64 20 63 68 61 72 20 2a 29 61 74 65 78 74  ned char *)atext
3b00: 3b 0a 20 20 62 20 3d 20 28 75 6e 73 69 67 6e 65  ;.  b = (unsigne
3b10: 64 20 63 68 61 72 20 2a 29 62 74 65 78 74 3b 0a  d char *)btext;.
3b20: 20 20 69 66 28 20 75 73 65 43 61 73 65 20 29 7b    if( useCase ){
3b30: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
3b40: 66 28 20 28 63 61 3d 20 2a 61 2b 2b 29 21 3d 28  f( (ca= *a++)!=(
3b50: 63 62 3d 20 2a 62 2b 2b 29 20 29 20 62 72 65 61  cb= *b++) ) brea
3b60: 6b 3b 0a 20 20 20 20 20 20 63 63 6c 61 73 73 20  k;.      cclass 
3b70: 3d 20 73 74 61 74 65 4d 61 63 68 69 6e 65 5b 63  = stateMachine[c
3b80: 63 6c 61 73 73 2a 4e 5f 43 48 41 52 5f 43 4c 41  class*N_CHAR_CLA
3b90: 53 53 20 2b 20 63 68 61 72 43 6c 61 73 73 5b 63  SS + charClass[c
3ba0: 61 5d 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  a]];.    }while(
3bb0: 20 63 61 21 3d 30 20 29 3b 0a 20 20 7d 65 6c 73   ca!=0 );.  }els
3bc0: 65 7b 0a 20 20 20 20 6d 61 70 20 3d 20 55 70 70  e{.    map = Upp
3bd0: 65 72 54 6f 4c 6f 77 65 72 3b 0a 20 20 20 20 64  erToLower;.    d
3be0: 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 28 63 61  o{.      if( (ca
3bf0: 3d 6d 61 70 5b 2a 61 2b 2b 5d 29 21 3d 28 63 62  =map[*a++])!=(cb
3c00: 3d 6d 61 70 5b 2a 62 2b 2b 5d 29 20 29 20 62 72  =map[*b++]) ) br
3c10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 63 6c 61 73  eak;.      cclas
3c20: 73 20 3d 20 73 74 61 74 65 4d 61 63 68 69 6e 65  s = stateMachine
3c30: 5b 63 63 6c 61 73 73 2a 4e 5f 43 48 41 52 5f 43  [cclass*N_CHAR_C
3c40: 4c 41 53 53 20 2b 20 63 68 61 72 43 6c 61 73 73  LASS + charClass
3c50: 5b 63 61 5d 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  [ca]];.    }whil
3c60: 65 28 20 63 61 21 3d 30 20 29 3b 0a 20 20 7d 0a  e( ca!=0 );.  }.
3c70: 20 20 73 77 69 74 63 68 28 20 63 63 6c 61 73 73    switch( cclass
3c80: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a   ){.    case 0:.
3c90: 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
3ca0: 20 20 20 20 69 66 28 20 69 73 64 69 67 69 74 28      if( isdigit(
3cb0: 63 61 29 20 26 26 20 69 73 64 69 67 69 74 28 63  ca) && isdigit(c
3cc0: 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 63  b) ){.        cc
3cd0: 6c 61 73 73 20 3d 20 32 3b 0a 20 20 20 20 20 20  lass = 2;.      
3ce0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3cf0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
3d00: 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  : {.      break;
3d10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69  .    }.  }.  swi
3d20: 74 63 68 28 20 63 63 6c 61 73 73 20 29 7b 0a 20  tch( cclass ){. 
3d30: 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 63     case 2:.    c
3d40: 61 73 65 20 33 3a 20 7b 0a 20 20 20 20 20 20 69  ase 3: {.      i
3d50: 66 28 20 69 73 64 69 67 69 74 28 63 61 29 20 29  f( isdigit(ca) )
3d60: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  {.        if( is
3d70: 64 69 67 69 74 28 63 62 29 20 29 7b 0a 20 20 20  digit(cb) ){.   
3d80: 20 20 20 20 20 20 20 69 6e 74 20 61 63 6e 74 2c         int acnt,
3d90: 20 62 63 6e 74 3b 0a 20 20 20 20 20 20 20 20 20   bcnt;.         
3da0: 20 61 63 6e 74 20 3d 20 62 63 6e 74 20 3d 20 30   acnt = bcnt = 0
3db0: 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
3dc0: 65 28 20 69 73 64 69 67 69 74 28 2a 61 2b 2b 29  e( isdigit(*a++)
3dd0: 20 29 20 61 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   ) acnt++;.     
3de0: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69       while( isdi
3df0: 67 69 74 28 2a 62 2b 2b 29 20 29 20 62 63 6e 74  git(*b++) ) bcnt
3e00: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ++;.          re
3e10: 73 75 6c 74 20 3d 20 61 63 6e 74 20 2d 20 62 63  sult = acnt - bc
3e20: 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nt;.          if
3e30: 28 20 72 65 73 75 6c 74 3d 3d 30 20 29 20 72 65  ( result==0 ) re
3e40: 73 75 6c 74 20 3d 20 63 61 2d 63 62 3b 0a 20 20  sult = ca-cb;.  
3e50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3e60: 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20         result = 
3e70: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
3e80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 64     }else if( isd
3e90: 69 67 69 74 28 63 62 29 20 29 7b 0a 20 20 20 20  igit(cb) ){.    
3ea0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 2d 31 3b      result = -1;
3eb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
3ec0: 20 63 61 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20   ca=='.' ){.    
3ed0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a      result = 1;.
3ee0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3ef0: 63 62 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  cb=='.' ){.     
3f00: 20 20 20 72 65 73 75 6c 74 20 3d 20 2d 31 3b 0a     result = -1;.
3f10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3f20: 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 63 61       result = ca
3f30: 20 2d 20 63 62 3b 0a 20 20 20 20 20 20 20 20 63   - cb;.        c
3f40: 63 6c 61 73 73 20 3d 20 32 3b 0a 20 20 20 20 20  class = 2;.     
3f50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 63 6c   }.      if( ccl
3f60: 61 73 73 3d 3d 33 20 29 20 72 65 73 75 6c 74 20  ass==3 ) result 
3f70: 3d 20 2d 72 65 73 75 6c 74 3b 0a 20 20 20 20 20  = -result;.     
3f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3f90: 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61    case 0:.    ca
3fa0: 73 65 20 31 3a 0a 20 20 20 20 63 61 73 65 20 34  se 1:.    case 4
3fb0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74  : {.      result
3fc0: 20 3d 20 63 61 20 2d 20 63 62 3b 0a 20 20 20 20   = ca - cb;.    
3fd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3fe0: 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20     case 5: {.   
3ff0: 20 20 20 72 65 73 75 6c 74 20 3d 20 63 62 20 2d     result = cb -
4000: 20 63 61 3b 0a 20 20 20 20 7d 3b 0a 20 20 7d 0a   ca;.    };.  }.
4010: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
4020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63  .}../*.** Do a c
4030: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 70 75 72  omparison of pur
4040: 65 20 6e 75 6d 65 72 69 63 73 2e 20 20 49 66 20  e numerics.  If 
4050: 65 69 74 68 65 72 20 73 74 72 69 6e 67 20 69 73  either string is
4060: 20 6e 6f 74 20 61 20 70 75 72 65 0a 2a 2a 20 6e   not a pure.** n
4070: 75 6d 65 72 69 63 2c 20 74 68 65 6e 20 72 65 74  umeric, then ret
4080: 75 72 6e 20 30 2e 20 20 4f 74 68 65 72 77 69 73  urn 0.  Otherwis
4090: 65 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 73  e return 1 and s
40a0: 65 74 20 2a 70 52 65 73 75 6c 74 20 74 6f 20 62  et *pResult to b
40b0: 65 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a  e.** negative, z
40c0: 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
40d0: 69 66 20 74 68 65 20 66 69 72 73 74 20 73 74 72  if the first str
40e0: 69 6e 67 20 61 72 65 20 6e 75 6d 65 72 69 61 6c  ing are numerial
40f0: 6c 79 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  ly less than.** 
4100: 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
4110: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ater than the se
4120: 63 6f 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cond..*/.static 
4130: 69 6e 74 20 70 72 69 76 61 74 65 43 6f 6d 70 61  int privateCompa
4140: 72 65 4e 75 6d 28 63 6f 6e 73 74 20 63 68 61 72  reNum(const char
4150: 20 2a 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *a, const char 
4160: 2a 62 2c 20 69 6e 74 20 2a 70 52 65 73 75 6c 74  *b, int *pResult
4170: 29 7b 0a 20 20 63 68 61 72 20 2a 65 6e 64 50 74  ){.  char *endPt
4180: 72 3b 0a 20 20 64 6f 75 62 6c 65 20 72 41 2c 20  r;.  double rA, 
4190: 72 42 3b 0a 20 20 69 6e 74 20 69 73 4e 75 6d 41  rB;.  int isNumA
41a0: 2c 20 69 73 4e 75 6d 42 3b 0a 20 20 69 66 28 20  , isNumB;.  if( 
41b0: 69 73 64 69 67 69 74 28 2a 61 29 20 7c 7c 20 28  isdigit(*a) || (
41c0: 28 2a 61 3d 3d 27 2d 27 20 7c 7c 20 2a 61 3d 3d  (*a=='-' || *a==
41d0: 27 2b 27 29 20 26 26 20 69 73 64 69 67 69 74 28  '+') && isdigit(
41e0: 61 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 72 41  a[1])) ){.    rA
41f0: 20 3d 20 73 74 72 74 6f 64 28 61 2c 20 26 65 6e   = strtod(a, &en
4200: 64 50 74 72 29 3b 0a 20 20 20 20 69 73 4e 75 6d  dPtr);.    isNum
4210: 41 20 3d 20 2a 65 6e 64 50 74 72 3d 3d 30 3b 0a  A = *endPtr==0;.
4220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 4e    }else{.    isN
4230: 75 6d 41 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  umA = 0;.  }.  i
4240: 66 28 20 69 73 64 69 67 69 74 28 2a 62 29 20 7c  f( isdigit(*b) |
4250: 7c 20 28 28 2a 62 3d 3d 27 2d 27 20 7c 7c 20 2a  | ((*b=='-' || *
4260: 62 3d 3d 27 2b 27 29 20 26 26 20 69 73 64 69 67  b=='+') && isdig
4270: 69 74 28 62 5b 31 5d 29 29 20 29 7b 0a 20 20 20  it(b[1])) ){.   
4280: 20 72 42 20 3d 20 73 74 72 74 6f 64 28 62 2c 20   rB = strtod(b, 
4290: 26 65 6e 64 50 74 72 29 3b 0a 20 20 20 20 69 73  &endPtr);.    is
42a0: 4e 75 6d 42 20 3d 20 2a 65 6e 64 50 74 72 3d 3d  NumB = *endPtr==
42b0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
42c0: 69 73 4e 75 6d 42 20 3d 20 30 3b 0a 20 20 7d 0a  isNumB = 0;.  }.
42d0: 20 20 69 66 28 20 69 73 4e 75 6d 42 3d 3d 30 20    if( isNumB==0 
42e0: 26 26 20 69 73 4e 75 6d 41 3d 3d 30 20 29 20 72  && isNumA==0 ) r
42f0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69  eturn 0;.  if( i
4300: 73 4e 75 6d 41 21 3d 69 73 4e 75 6d 42 20 29 7b  sNumA!=isNumB ){
4310: 0a 20 20 20 20 2a 70 52 65 73 75 6c 74 20 3d 20  .    *pResult = 
4320: 20 69 73 4e 75 6d 41 20 2d 20 69 73 4e 75 6d 42   isNumA - isNumB
4330: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 41  ;.  }else if( rA
4340: 3c 72 42 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  <rB ){.    *pRes
4350: 75 6c 74 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  ult = -1;.  }els
4360: 65 20 69 66 28 20 72 41 3e 72 42 20 29 7b 0a 20  e if( rA>rB ){. 
4370: 20 20 20 2a 70 52 65 73 75 6c 74 20 3d 20 31 3b     *pResult = 1;
4380: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
4390: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 7d 0a  Result = 0;.  }.
43a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
43b0: 2a 20 54 68 69 73 20 63 6f 6d 70 61 72 69 73 6f  * This compariso
43c0: 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 77 68 61  n routine is wha
43d0: 74 20 77 65 20 75 73 65 20 66 6f 72 20 63 6f 6d  t we use for com
43e0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
43f0: 6e 73 0a 2a 2a 20 69 6e 20 61 6e 20 53 51 4c 20  ns.** in an SQL 
4400: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 28 45 78  expression.  (Ex
4410: 3a 20 20 6e 61 6d 65 3c 27 48 65 6c 6c 6f 27 20  :  name<'Hello' 
4420: 6f 72 20 76 61 6c 75 65 3c 35 29 2e 20 20 43 6f  or value<5).  Co
4430: 6d 70 61 72 65 20 74 77 6f 0a 2a 2a 20 73 74 72  mpare two.** str
4440: 69 6e 67 73 2e 20 20 55 73 65 20 63 61 73 65 20  ings.  Use case 
4450: 6f 6e 6c 79 20 61 73 20 61 20 74 69 65 2d 62 72  only as a tie-br
4460: 65 61 6b 65 72 2e 20 20 4e 75 6d 62 65 72 73 20  eaker.  Numbers 
4470: 63 6f 6d 70 61 72 65 20 69 6e 0a 2a 2a 20 6e 75  compare in.** nu
4480: 6d 65 72 69 63 61 6c 20 6f 72 64 65 72 2e 0a 2a  merical order..*
4490: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 43 6f 6d 70  /.int sqliteComp
44a0: 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  are(const char *
44b0: 61 74 65 78 74 2c 20 63 6f 6e 73 74 20 63 68 61  atext, const cha
44c0: 72 20 2a 62 74 65 78 74 29 7b 0a 20 20 69 6e 74  r *btext){.  int
44d0: 20 72 65 73 75 6c 74 3b 0a 20 20 69 66 28 20 21   result;.  if( !
44e0: 70 72 69 76 61 74 65 43 6f 6d 70 61 72 65 4e 75  privateCompareNu
44f0: 6d 28 61 74 65 78 74 2c 20 62 74 65 78 74 2c 20  m(atext, btext, 
4500: 26 72 65 73 75 6c 74 29 20 7c 7c 20 72 65 73 75  &result) || resu
4510: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 73  lt==0 ){.    res
4520: 75 6c 74 20 3d 20 70 72 69 76 61 74 65 53 74 72  ult = privateStr
4530: 43 6d 70 28 61 74 65 78 74 2c 20 62 74 65 78 74  Cmp(atext, btext
4540: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
4550: 73 75 6c 74 3d 3d 30 20 29 20 72 65 73 75 6c 74  sult==0 ) result
4560: 20 3d 20 70 72 69 76 61 74 65 53 74 72 43 6d 70   = privateStrCmp
4570: 28 61 74 65 78 74 2c 20 62 74 65 78 74 2c 20 31  (atext, btext, 1
4580: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4590: 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  result;.}../*.**
45a0: 20 49 66 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20   If you compile 
45b0: 6a 75 73 74 20 74 68 69 73 20 6f 6e 65 20 66 69  just this one fi
45c0: 6c 65 20 77 69 74 68 20 74 68 65 20 2d 44 54 45  le with the -DTE
45d0: 53 54 5f 43 4f 4d 50 41 52 45 3d 31 20 6f 70 74  ST_COMPARE=1 opt
45e0: 69 6f 6e 2c 0a 2a 2a 20 69 74 20 67 65 6e 65 72  ion,.** it gener
45f0: 61 74 65 73 20 61 20 70 72 6f 67 72 61 6d 20 74  ates a program t
4600: 6f 20 74 65 73 74 20 74 68 65 20 63 6f 6d 70 61  o test the compa
4610: 72 69 73 6f 6e 73 20 72 6f 75 74 69 6e 65 73 2e  risons routines.
4620: 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 54 45 53    .*/.#ifdef TES
4630: 54 5f 43 4f 4d 50 41 52 45 0a 23 69 6e 63 6c 75  T_COMPARE.#inclu
4640: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
4650: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>
4660: 0a 69 6e 74 20 73 6f 72 74 43 6d 70 28 63 6f 6e  .int sortCmp(con
4670: 73 74 20 63 68 61 72 20 2a 2a 61 2c 20 63 6f 6e  st char **a, con
4680: 73 74 20 63 68 61 72 20 2a 2a 62 29 7b 0a 20 20  st char **b){.  
4690: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 43 6f 6d  return sqliteCom
46a0: 70 61 72 65 28 2a 61 2c 20 2a 62 29 3b 0a 7d 0a  pare(*a, *b);.}.
46b0: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
46c0: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
46d0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
46e0: 6e 2c 20 63 6e 74 3b 0a 20 20 73 74 61 74 69 63  n, cnt;.  static
46f0: 20 63 68 61 72 20 2a 61 7a 53 74 72 5b 5d 20 3d   char *azStr[] =
4700: 20 7b 0a 20 20 20 20 20 22 61 62 63 22 2c 20 22   {.     "abc", "
4710: 61 42 63 22 2c 20 22 61 62 63 64 22 2c 20 22 61  aBc", "abcd", "a
4720: 42 63 64 22 2c 20 0a 20 20 20 20 20 22 31 32 33  Bcd", .     "123
4730: 22 2c 20 22 31 32 34 22 2c 20 22 31 32 33 34 22  ", "124", "1234"
4740: 2c 20 22 2d 31 32 33 22 2c 20 22 2d 31 32 34 22  , "-123", "-124"
4750: 2c 20 22 2d 31 32 33 34 22 2c 20 22 2b 31 32 34  , "-1234", "+124
4760: 22 2c 0a 20 20 20 20 20 22 31 32 33 2e 34 35 22  ",.     "123.45"
4770: 2c 20 22 31 32 33 2e 34 35 36 22 2c 20 22 31 32  , "123.456", "12
4780: 33 2e 34 36 22 2c 20 22 2d 31 32 33 2e 34 35 22  3.46", "-123.45"
4790: 2c 20 22 2d 31 32 33 2e 34 36 22 2c 20 22 2d 31  , "-123.46", "-1
47a0: 32 33 2e 34 35 36 22 2c 20 0a 20 20 20 20 20 22  23.456", .     "
47b0: 78 39 22 2c 20 22 78 31 30 22 2c 20 22 78 2d 39  x9", "x10", "x-9
47c0: 22 2c 20 22 78 2d 31 30 22 2c 20 22 58 39 22 2c  ", "x-10", "X9",
47d0: 20 22 58 31 30 22 2c 0a 20 20 20 20 20 22 31 2e   "X10",.     "1.
47e0: 32 33 34 65 2b 30 32 22 2c 20 22 2b 31 32 33 22  234e+02", "+123"
47f0: 2c 20 22 31 2e 32 33 45 32 22 2c 20 22 31 2e 32  , "1.23E2", "1.2
4800: 33 34 35 65 2b 32 22 2c 20 22 2d 31 2e 32 33 34  345e+2", "-1.234
4810: 35 65 32 22 2c 20 22 2b 77 22 0a 20 20 7d 3b 0a  5e2", "+w".  };.
4820: 20 20 6e 20 3d 20 73 69 7a 65 6f 66 28 61 7a 53    n = sizeof(azS
4830: 74 72 29 2f 73 69 7a 65 6f 66 28 61 7a 53 74 72  tr)/sizeof(azStr
4840: 5b 30 5d 29 3b 0a 20 20 71 73 6f 72 74 28 61 7a  [0]);.  qsort(az
4850: 53 74 72 2c 20 6e 2c 20 73 69 7a 65 6f 66 28 61  Str, n, sizeof(a
4860: 7a 53 74 72 5b 30 5d 29 2c 20 73 6f 72 74 43 6d  zStr[0]), sortCm
4870: 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p);.  for(i=0; i
4880: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72  <n; i++){.    pr
4890: 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61 7a 53  intf("%s\n", azS
48a0: 74 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 72  tr[i]);.  }.  pr
48b0: 69 6e 74 66 28 22 53 61 6e 69 74 79 31 2e 2e 2e  intf("Sanity1...
48c0: 22 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64  ");.  fflush(std
48d0: 6f 75 74 29 3b 0a 20 20 63 6e 74 20 3d 20 30 3b  out);.  cnt = 0;
48e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 2d  .  for(i=0; i<n-
48f0: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  1; i++){.    cha
4900: 72 20 2a 61 20 3d 20 61 7a 53 74 72 5b 69 5d 3b  r *a = azStr[i];
4910: 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
4920: 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<n; j++){.     
4930: 20 63 68 61 72 20 2a 62 20 3d 20 61 7a 53 74 72   char *b = azStr
4940: 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  [j];.      if( s
4950: 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 61 2c 62  qliteCompare(a,b
4960: 29 20 21 3d 20 2d 73 71 6c 69 74 65 43 6f 6d 70  ) != -sqliteComp
4970: 61 72 65 28 62 2c 61 29 20 29 7b 0a 20 20 20 20  are(b,a) ){.    
4980: 20 20 20 20 70 72 69 6e 74 66 28 22 46 61 69 6c      printf("Fail
4990: 65 64 21 20 20 5c 22 25 73 5c 22 20 76 73 20 5c  ed!  \"%s\" vs \
49a0: 22 25 73 5c 22 5c 6e 22 2c 20 61 2c 20 62 29 3b  "%s\"\n", a, b);
49b0: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 6a 20 3d  .        i = j =
49c0: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
49d0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
49e0: 20 7d 0a 20 20 69 66 28 20 69 3c 6e 20 29 7b 0a   }.  if( i<n ){.
49f0: 20 20 20 20 70 72 69 6e 74 66 28 22 20 4f 4b 20      printf(" OK 
4a00: 28 25 64 29 5c 6e 22 2c 20 63 6e 74 29 3b 0a 20  (%d)\n", cnt);. 
4a10: 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 53 61 6e   }.  printf("San
4a20: 69 74 79 32 2e 2e 2e 22 29 3b 0a 20 20 66 66 6c  ity2...");.  ffl
4a30: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 63  ush(stdout);.  c
4a40: 6e 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  nt = 0;.  for(i=
4a50: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
4a60: 20 20 63 68 61 72 20 2a 61 20 3d 20 61 7a 53 74    char *a = azSt
4a70: 72 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  r[i];.    for(j=
4a80: 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<n; j++){.  
4a90: 20 20 20 20 63 68 61 72 20 2a 62 20 3d 20 61 7a      char *b = az
4aa0: 53 74 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 66 6f  Str[j];.      fo
4ab0: 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29  r(k=0; k<n; k++)
4ac0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
4ad0: 63 20 3d 20 61 7a 53 74 72 5b 6b 5d 3b 0a 20 20  c = azStr[k];.  
4ae0: 20 20 20 20 20 20 69 6e 74 20 78 31 2c 20 78 32        int x1, x2
4af0: 2c 20 78 33 2c 20 73 75 63 63 65 73 73 3b 0a 20  , x3, success;. 
4b00: 20 20 20 20 20 20 20 78 31 20 3d 20 73 71 6c 69         x1 = sqli
4b10: 74 65 43 6f 6d 70 61 72 65 28 61 2c 62 29 3b 0a  teCompare(a,b);.
4b20: 20 20 20 20 20 20 20 20 78 32 20 3d 20 73 71 6c          x2 = sql
4b30: 69 74 65 43 6f 6d 70 61 72 65 28 62 2c 63 29 3b  iteCompare(b,c);
4b40: 0a 20 20 20 20 20 20 20 20 78 33 20 3d 20 73 71  .        x3 = sq
4b50: 6c 69 74 65 43 6f 6d 70 61 72 65 28 61 2c 63 29  liteCompare(a,c)
4b60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 31  ;.        if( x1
4b70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
4b80: 20 73 75 63 63 65 73 73 20 3d 20 78 32 3d 3d 78   success = x2==x
4b90: 33 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  3;.        }else
4ba0: 20 69 66 28 20 78 31 3c 30 20 29 7b 0a 20 20 20   if( x1<0 ){.   
4bb0: 20 20 20 20 20 20 20 73 75 63 63 65 73 73 20 3d         success =
4bc0: 20 28 78 32 3c 3d 30 20 26 26 20 78 33 3c 3d 30   (x2<=0 && x3<=0
4bd0: 29 20 7c 7c 20 78 32 3e 30 3b 0a 20 20 20 20 20  ) || x2>0;.     
4be0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4bf0: 20 20 20 20 73 75 63 63 65 73 73 20 3d 20 28 78      success = (x
4c00: 32 3e 3d 30 20 26 26 20 78 33 3e 3d 30 29 20 7c  2>=0 && x3>=0) |
4c10: 7c 20 78 32 3c 30 3b 0a 20 20 20 20 20 20 20 20  | x2<0;.        
4c20: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  }.        if( !s
4c30: 75 63 63 65 73 73 20 29 7b 0a 20 20 20 20 20 20  uccess ){.      
4c40: 20 20 20 20 70 72 69 6e 74 66 28 22 46 61 69 6c      printf("Fail
4c50: 65 64 21 20 20 5c 22 25 73 5c 22 20 76 73 20 5c  ed!  \"%s\" vs \
4c60: 22 25 73 5c 22 20 76 73 20 5c 22 25 73 5c 22 5c  "%s\" vs \"%s\"\
4c70: 6e 22 2c 20 61 2c 20 62 2c 20 63 29 3b 0a 20 20  n", a, b, c);.  
4c80: 20 20 20 20 20 20 20 20 69 20 3d 20 6a 20 3d 20          i = j = 
4c90: 6b 20 3d 20 6e 2b 31 3b 0a 20 20 20 20 20 20 20  k = n+1;.       
4ca0: 20 7d 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b   }.        cnt++
4cb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4cc0: 20 20 7d 0a 20 20 69 66 28 20 69 3c 6e 2b 31 20    }.  if( i<n+1 
4cd0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  ){.    printf(" 
4ce0: 4f 4b 20 28 25 64 29 5c 6e 22 2c 20 63 6e 74 29  OK (%d)\n", cnt)
4cf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4d00: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4d10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4d20: 73 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69  s used for sorti
4d30: 6e 67 2e 20 20 45 61 63 68 20 6b 65 79 20 69 73  ng.  Each key is
4d40: 20 61 20 6c 69 73 74 20 6f 66 20 6f 6e 65 20 6f   a list of one o
4d50: 72 20 6d 6f 72 65 0a 2a 2a 20 6e 75 6c 6c 2d 74  r more.** null-t
4d60: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
4d70: 73 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  s.  The list is 
4d80: 74 65 72 6d 69 6e 61 74 65 64 20 62 79 20 74 77  terminated by tw
4d90: 6f 20 6e 75 6c 6c 73 20 69 6e 0a 2a 2a 20 61 20  o nulls in.** a 
4da0: 72 6f 77 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  row.  For exampl
4db0: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
4dc0: 20 74 65 78 74 20 69 73 20 6b 65 79 20 77 69 74   text is key wit
4dd0: 68 20 74 68 72 65 65 20 73 74 72 69 6e 67 73 3a  h three strings:
4de0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
4df0: 20 20 2b 6f 6e 65 5c 30 30 30 2d 74 77 6f 5c 30    +one\000-two\0
4e00: 30 30 2b 74 68 72 65 65 5c 30 30 30 5c 30 30 30  00+three\000\000
4e10: 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 61 72 67 75  .**.** Both argu
4e20: 6d 65 6e 74 73 20 77 69 6c 6c 20 68 61 76 65 20  ments will have 
4e30: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
4e40: 6f 66 20 73 74 72 69 6e 67 73 2e 20 20 54 68 69  of strings.  Thi
4e50: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
4e60: 75 72 6e 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  urns negative, z
4e70: 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
4e80: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 72   if the first ar
4e90: 67 75 6d 65 6e 74 20 69 73 20 6c 65 73 73 0a 2a  gument is less.*
4ea0: 2a 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  * than, equal to
4eb0: 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
4ec0: 6e 20 74 68 65 20 66 69 72 73 74 2e 20 20 28 52  n the first.  (R
4ed0: 65 73 75 6c 74 20 69 73 20 61 2d 62 29 2e 0a 2a  esult is a-b)..*
4ee0: 2a 0a 2a 2a 20 45 76 65 72 79 20 73 74 72 69 6e  *.** Every strin
4ef0: 67 20 62 65 67 69 6e 73 20 77 69 74 68 20 65 69  g begins with ei
4f00: 74 68 65 72 20 61 20 22 2b 22 20 6f 72 20 22 2d  ther a "+" or "-
4f10: 22 20 63 68 61 72 61 63 74 65 72 2e 20 20 49 66  " character.  If
4f20: 20 74 68 65 0a 2a 2a 20 63 68 61 72 61 63 74 65   the.** characte
4f30: 72 20 69 73 20 22 2d 22 20 74 68 65 6e 20 74 68  r is "-" then th
4f40: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
4f50: 73 20 6e 65 67 61 74 65 64 2e 20 20 54 68 69 73  s negated.  This
4f60: 20 69 73 20 64 6f 6e 65 0a 2a 2a 20 74 6f 20 69   is done.** to i
4f70: 6d 70 6c 65 6d 65 6e 74 20 61 20 73 6f 72 74 20  mplement a sort 
4f80: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
4f90: 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  der..*/.int sqli
4fa0: 74 65 53 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f  teSortCompare(co
4fb0: 6e 73 74 20 63 68 61 72 20 2a 61 2c 20 63 6f 6e  nst char *a, con
4fc0: 73 74 20 63 68 61 72 20 2a 62 29 7b 0a 20 20 69  st char *b){.  i
4fd0: 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 72 65  nt len;.  int re
4fe0: 73 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  s = 0;..  while(
4ff0: 20 72 65 73 3d 3d 30 20 26 26 20 2a 61 20 26 26   res==0 && *a &&
5000: 20 2a 62 20 29 7b 0a 20 20 20 20 72 65 73 20 3d   *b ){.    res =
5010: 20 73 71 6c 69 74 65 43 6f 6d 70 61 72 65 28 26   sqliteCompare(&
5020: 61 5b 31 5d 2c 20 26 62 5b 31 5d 29 3b 0a 20 20  a[1], &b[1]);.  
5030: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
5040: 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c        len = strl
5050: 65 6e 28 61 29 20 2b 20 31 3b 0a 20 20 20 20 20  en(a) + 1;.     
5060: 20 61 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20   a += len;.     
5070: 20 62 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d   b += len;.    }
5080: 0a 20 20 7d 0a 20 20 69 66 28 20 2a 61 3d 3d 27  .  }.  if( *a=='
5090: 2d 27 20 29 20 72 65 73 20 3d 20 2d 72 65 73 3b  -' ) res = -res;
50a0: 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
50b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
50c0: 74 77 6f 20 73 74 72 69 6e 67 73 20 66 6f 72 20  two strings for 
50d0: 65 71 75 61 6c 69 74 79 20 77 68 65 72 65 20 74  equality where t
50e0: 68 65 20 66 69 72 73 74 20 73 74 72 69 6e 67 20  he first string 
50f0: 63 61 6e 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c  can.** potential
5100: 6c 79 20 62 65 20 61 20 22 67 6c 6f 62 22 20 65  ly be a "glob" e
5110: 78 70 72 65 73 73 69 6f 6e 2e 20 20 52 65 74 75  xpression.  Retu
5120: 72 6e 20 74 72 75 65 20 28 31 29 20 69 66 20 74  rn true (1) if t
5130: 68 65 79 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  hey.** are the s
5140: 61 6d 65 20 61 6e 64 20 66 61 6c 73 65 20 28 30  ame and false (0
5150: 29 20 69 66 20 74 68 65 79 20 61 72 65 20 64 69  ) if they are di
5160: 66 66 65 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 47  fferent..**.** G
5170: 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  lobbing rules:.*
5180: 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20  *.**      '*'   
5190: 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
51a0: 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f  sequence of zero
51b0: 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74   or more charact
51c0: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ers..**.**      
51d0: 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '?'       Matche
51e0: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68  s exactly one ch
51f0: 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  aracter..**.**  
5200: 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61     [...]      Ma
5210: 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
5220: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63  ter from the enc
5230: 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a  losed list of.**
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
5260: 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20  *     [^...]    
5270: 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
5280: 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68  racter not in th
5290: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e  e enclosed list.
52a0: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 74 68 65 20  .**.** With the 
52b0: 5b 2e 2e 2e 5d 20 61 6e 64 20 5b 5e 2e 2e 2e 5d  [...] and [^...]
52c0: 20 6d 61 74 63 68 69 6e 67 2c 20 61 20 27 5d 27   matching, a ']'
52d0: 20 63 68 61 72 61 63 74 65 72 20 63 61 6e 20 62   character can b
52e0: 65 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 69 6e  e included.** in
52f0: 20 74 68 65 20 6c 69 73 74 20 62 79 20 6d 61 6b   the list by mak
5300: 69 6e 67 20 69 74 20 74 68 65 20 66 69 72 73 74  ing it the first
5310: 20 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72   character after
5320: 20 27 5b 27 20 6f 72 20 27 5e 27 2e 20 20 41 0a   '[' or '^'.  A.
5330: 2a 2a 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72  ** range of char
5340: 61 63 74 65 72 73 20 63 61 6e 20 62 65 20 73 70  acters can be sp
5350: 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 27 2d  ecified using '-
5360: 27 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 20  '.  Example:.** 
5370: 22 5b 61 2d 7a 5d 22 20 6d 61 74 63 68 65 73 20  "[a-z]" matches 
5380: 61 6e 79 20 73 69 6e 67 6c 65 20 6c 6f 77 65 72  any single lower
5390: 2d 63 61 73 65 20 6c 65 74 74 65 72 2e 20 20 54  -case letter.  T
53a0: 6f 20 6d 61 74 63 68 20 61 20 27 2d 27 2c 20 6d  o match a '-', m
53b0: 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 6c 61  ake.** it the la
53c0: 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  st character in 
53d0: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  the list..**.** 
53e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
53f0: 75 73 75 61 6c 6c 79 20 71 75 69 63 6b 2c 20 62  usually quick, b
5400: 75 74 20 63 61 6e 20 62 65 20 4e 2a 2a 32 20 69  ut can be N**2 i
5410: 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65  n the worst case
5420: 2e 0a 2a 2a 0a 2a 2a 20 48 69 6e 74 73 3a 20 74  ..**.** Hints: t
5430: 6f 20 6d 61 74 63 68 20 27 2a 27 20 6f 72 20 27  o match '*' or '
5440: 3f 27 2c 20 70 75 74 20 74 68 65 6d 20 69 6e 20  ?', put them in 
5450: 22 5b 5d 22 2e 20 20 4c 69 6b 65 20 74 68 69 73  "[]".  Like this
5460: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
5470: 61 62 63 5b 2a 5d 78 79 7a 20 20 20 20 20 20 20  abc[*]xyz       
5480: 20 4d 61 74 63 68 65 73 20 22 61 62 63 2a 78 79   Matches "abc*xy
5490: 7a 22 20 6f 6e 6c 79 0a 2a 2f 0a 69 6e 74 20 73  z" only.*/.int s
54a0: 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70 61 72 65  qliteGlobCompare
54b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61  (const char *zPa
54c0: 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 63 68 61  ttern, const cha
54d0: 72 20 2a 7a 53 74 72 69 6e 67 29 7b 0a 20 20 72  r *zString){.  r
54e0: 65 67 69 73 74 65 72 20 63 68 61 72 20 63 3b 0a  egister char c;.
54f0: 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20    int invert;.  
5500: 69 6e 74 20 73 65 65 6e 3b 0a 20 20 63 68 61 72  int seen;.  char
5510: 20 63 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28   c2;..  while( (
5520: 63 20 3d 20 2a 7a 50 61 74 74 65 72 6e 29 21 3d  c = *zPattern)!=
5530: 30 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  0 ){.    switch(
5540: 20 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65   c ){.      case
5550: 20 27 2a 27 3a 0a 20 20 20 20 20 20 20 20 77 68   '*':.        wh
5560: 69 6c 65 28 20 7a 50 61 74 74 65 72 6e 5b 31 5d  ile( zPattern[1]
5570: 3d 3d 27 2a 27 20 29 20 7a 50 61 74 74 65 72 6e  =='*' ) zPattern
5580: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
5590: 7a 50 61 74 74 65 72 6e 5b 31 5d 3d 3d 30 20 29  zPattern[1]==0 )
55a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
55b0: 20 20 20 63 20 3d 20 7a 50 61 74 74 65 72 6e 5b     c = zPattern[
55c0: 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1];.        if( 
55d0: 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d 3d 27 3f 27  c=='[' || c=='?'
55e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
55f0: 69 6c 65 28 20 2a 7a 53 74 72 69 6e 67 20 26 26  ile( *zString &&
5600: 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f 6d 70 61   sqliteGlobCompa
5610: 72 65 28 26 7a 50 61 74 74 65 72 6e 5b 31 5d 2c  re(&zPattern[1],
5620: 7a 53 74 72 69 6e 67 29 3d 3d 30 20 29 7b 0a 20  zString)==0 ){. 
5630: 20 20 20 20 20 20 20 20 20 20 20 7a 53 74 72 69             zStri
5640: 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ng++;.          
5650: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  }.          retu
5660: 72 6e 20 2a 7a 53 74 72 69 6e 67 21 3d 30 3b 0a  rn *zString!=0;.
5670: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5680: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
5690: 28 63 32 20 3d 20 2a 7a 53 74 72 69 6e 67 29 21  (c2 = *zString)!
56a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
56b0: 20 20 77 68 69 6c 65 28 20 63 32 20 21 3d 20 30    while( c2 != 0
56c0: 20 26 26 20 63 32 20 21 3d 20 63 20 29 7b 20 63   && c2 != c ){ c
56d0: 32 20 3d 20 2a 2b 2b 7a 53 74 72 69 6e 67 3b 20  2 = *++zString; 
56e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
56f0: 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( c2==0 ) return
5700: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
5710: 69 66 28 20 73 71 6c 69 74 65 47 6c 6f 62 43 6f  if( sqliteGlobCo
5720: 6d 70 61 72 65 28 26 7a 50 61 74 74 65 72 6e 5b  mpare(&zPattern[
5730: 31 5d 2c 7a 53 74 72 69 6e 67 29 20 29 20 72 65  1],zString) ) re
5740: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
5750: 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20      zString++;. 
5760: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5770: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
5780: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63         }.      c
5790: 61 73 65 20 27 3f 27 3a 0a 20 20 20 20 20 20 20  ase '?':.       
57a0: 20 69 66 28 20 2a 7a 53 74 72 69 6e 67 3d 3d 30   if( *zString==0
57b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
57c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
57d0: 20 20 63 61 73 65 20 27 5b 27 3a 0a 20 20 20 20    case '[':.    
57e0: 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20      seen = 0;.  
57f0: 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30        invert = 0
5800: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a 7a  ;.        c = *z
5810: 53 74 72 69 6e 67 3b 0a 20 20 20 20 20 20 20 20  String;.        
5820: 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72  if( c==0 ) retur
5830: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 63 32 20  n 0;.        c2 
5840: 3d 20 2a 2b 2b 7a 50 61 74 74 65 72 6e 3b 0a 20  = *++zPattern;. 
5850: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27         if( c2=='
5860: 5e 27 20 29 7b 20 69 6e 76 65 72 74 20 3d 20 31  ^' ){ invert = 1
5870: 3b 20 63 32 20 3d 20 2a 2b 2b 7a 50 61 74 74 65  ; c2 = *++zPatte
5880: 72 6e 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  rn; }.        if
5890: 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20  ( c2==']' ){.   
58a0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d         if( c==']
58b0: 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  ' ) seen = 1;.  
58c0: 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 2b 2b          c2 = *++
58d0: 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  zPattern;.      
58e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 77 68 69 6c    }.        whil
58f0: 65 28 20 28 63 32 20 3d 20 2a 7a 50 61 74 74 65  e( (c2 = *zPatte
5900: 72 6e 29 21 3d 30 20 26 26 20 63 32 21 3d 27 5d  rn)!=0 && c2!=']
5910: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
5920: 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 50  f( c2=='-' && zP
5930: 61 74 74 65 72 6e 5b 31 5d 21 3d 27 5d 27 20 26  attern[1]!=']' &
5940: 26 20 7a 50 61 74 74 65 72 6e 5b 31 5d 21 3d 30  & zPattern[1]!=0
5950: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5960: 69 66 28 20 63 3e 7a 50 61 74 74 65 72 6e 5b 2d  if( c>zPattern[-
5970: 31 5d 20 26 26 20 63 3c 7a 50 61 74 74 65 72 6e  1] && c<zPattern
5980: 5b 31 5d 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  [1] ) seen = 1;.
5990: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
59a0: 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20  if( c==c2 ){.   
59b0: 20 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20           seen = 
59c0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
59d0: 20 20 20 20 20 20 20 20 20 7a 50 61 74 74 65 72           zPatter
59e0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n++;.        }. 
59f0: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30         if( c2==0
5a00: 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65   || (seen ^ inve
5a10: 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rt)==0 ) return 
5a20: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
5a30: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
5a40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 21  .        if( c !
5a50: 3d 20 2a 7a 53 74 72 69 6e 67 20 29 20 72 65 74  = *zString ) ret
5a60: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 62  urn 0;.        b
5a70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5a80: 7a 50 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20  zPattern++;.    
5a90: 7a 53 74 72 69 6e 67 2b 2b 3b 0a 20 20 7d 0a 20  zString++;.  }. 
5aa0: 20 72 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67   return *zString
5ab0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ==0;.}../*.** Co
5ac0: 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67  mpare two string
5ad0: 73 20 66 6f 72 20 65 71 75 61 6c 69 74 79 20 75  s for equality u
5ae0: 73 69 6e 67 20 74 68 65 20 22 4c 49 4b 45 22 20  sing the "LIKE" 
5af0: 6f 70 65 72 61 74 6f 72 20 6f 66 0a 2a 2a 20 53  operator of.** S
5b00: 51 4c 2e 20 20 54 68 65 20 27 25 27 20 63 68 61  QL.  The '%' cha
5b10: 72 61 63 74 65 72 20 6d 61 74 63 68 65 73 20 61  racter matches a
5b20: 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 30  ny sequence of 0
5b30: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 68 61 72   or more.** char
5b40: 61 63 74 65 72 73 20 61 6e 64 20 27 5f 27 20 6d  acters and '_' m
5b50: 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c  atches any singl
5b60: 65 20 63 68 61 72 61 63 74 65 72 2e 20 20 43 61  e character.  Ca
5b70: 73 65 20 69 73 0a 2a 2a 20 6e 6f 74 20 73 69 67  se is.** not sig
5b80: 6e 69 66 69 63 61 6e 74 2e 0a 2a 2a 0a 2a 2a 20  nificant..**.** 
5b90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5ba0: 6a 75 73 74 20 61 6e 20 61 64 61 70 74 61 74 69  just an adaptati
5bb0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
5bc0: 47 6c 6f 62 43 6f 6d 70 61 72 65 28 29 0a 2a 2a  GlobCompare().**
5bd0: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 0a   routine above..
5be0: 2a 2f 0a 69 6e 74 20 0a 73 71 6c 69 74 65 4c 69  */.int .sqliteLi
5bf0: 6b 65 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  keCompare(const 
5c00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
5c10: 50 61 74 74 65 72 6e 2c 20 63 6f 6e 73 74 20 75  Pattern, const u
5c20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
5c30: 74 72 69 6e 67 29 7b 0a 20 20 72 65 67 69 73 74  tring){.  regist
5c40: 65 72 20 63 68 61 72 20 63 3b 0a 20 20 63 68 61  er char c;.  cha
5c50: 72 20 63 32 3b 0a 0a 20 20 77 68 69 6c 65 28 20  r c2;..  while( 
5c60: 28 63 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65  (c = UpperToLowe
5c70: 72 5b 2a 7a 50 61 74 74 65 72 6e 5d 29 21 3d 30  r[*zPattern])!=0
5c80: 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20   ){.    switch( 
5c90: 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  c ){.      case 
5ca0: 27 25 27 3a 0a 20 20 20 20 20 20 20 20 77 68 69  '%':.        whi
5cb0: 6c 65 28 20 7a 50 61 74 74 65 72 6e 5b 31 5d 3d  le( zPattern[1]=
5cc0: 3d 27 25 27 20 29 20 7a 50 61 74 74 65 72 6e 2b  ='%' ) zPattern+
5cd0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  +;.        if( z
5ce0: 50 61 74 74 65 72 6e 5b 31 5d 3d 3d 30 20 29 20  Pattern[1]==0 ) 
5cf0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
5d00: 20 20 63 20 3d 20 55 70 70 65 72 54 6f 4c 6f 77    c = UpperToLow
5d10: 65 72 5b 30 78 66 66 20 26 20 7a 50 61 74 74 65  er[0xff & zPatte
5d20: 72 6e 5b 31 5d 5d 3b 0a 20 20 20 20 20 20 20 20  rn[1]];.        
5d30: 69 66 28 20 63 3d 3d 27 5f 27 20 29 7b 0a 20 20  if( c=='_' ){.  
5d40: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
5d50: 7a 53 74 72 69 6e 67 20 26 26 20 73 71 6c 69 74  zString && sqlit
5d60: 65 4c 69 6b 65 43 6f 6d 70 61 72 65 28 26 7a 50  eLikeCompare(&zP
5d70: 61 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e  attern[1],zStrin
5d80: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
5d90: 20 20 20 20 20 7a 53 74 72 69 6e 67 2b 2b 3b 0a       zString++;.
5da0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5db0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2a 7a 53        return *zS
5dc0: 74 72 69 6e 67 21 3d 30 3b 0a 20 20 20 20 20 20  tring!=0;.      
5dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5de0: 20 20 20 77 68 69 6c 65 28 20 28 63 32 20 3d 20     while( (c2 = 
5df0: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 53  UpperToLower[*zS
5e00: 74 72 69 6e 67 5d 29 21 3d 30 20 29 7b 0a 20 20  tring])!=0 ){.  
5e10: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
5e20: 20 63 32 20 21 3d 20 30 20 26 26 20 63 32 20 21   c2 != 0 && c2 !
5e30: 3d 20 63 20 29 7b 20 63 32 20 3d 20 55 70 70 65  = c ){ c2 = Uppe
5e40: 72 54 6f 4c 6f 77 65 72 5b 2a 2b 2b 7a 53 74 72  rToLower[*++zStr
5e50: 69 6e 67 5d 3b 20 7d 0a 20 20 20 20 20 20 20 20  ing]; }.        
5e60: 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20      if( c2==0 ) 
5e70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
5e80: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5e90: 4c 69 6b 65 43 6f 6d 70 61 72 65 28 26 7a 50 61  LikeCompare(&zPa
5ea0: 74 74 65 72 6e 5b 31 5d 2c 7a 53 74 72 69 6e 67  ttern[1],zString
5eb0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
5ec0: 20 20 20 20 20 20 20 20 20 20 7a 53 74 72 69 6e            zStrin
5ed0: 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  g++;.          }
5ee0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
5ef0: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
5f00: 20 20 20 20 20 63 61 73 65 20 27 5f 27 3a 0a 20       case '_':. 
5f10: 20 20 20 20 20 20 20 69 66 28 20 2a 7a 53 74 72         if( *zStr
5f20: 69 6e 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ing==0 ) return 
5f30: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
5f40: 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ;.      default:
5f50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 21  .        if( c !
5f60: 3d 20 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  = UpperToLower[*
5f70: 7a 53 74 72 69 6e 67 5d 20 29 20 72 65 74 75 72  zString] ) retur
5f80: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65  n 0;.        bre
5f90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  ak;.    }.    zP
5fa0: 61 74 74 65 72 6e 2b 2b 3b 0a 20 20 20 20 7a 53  attern++;.    zS
5fb0: 74 72 69 6e 67 2b 2b 3b 0a 20 20 7d 0a 20 20 72  tring++;.  }.  r
5fc0: 65 74 75 72 6e 20 2a 7a 53 74 72 69 6e 67 3d 3d  eturn *zString==
5fd0: 30 3b 0a 7d 0a                                   0;.}.