/ Hex Artifact Content
Login

Artifact 5ed989693d4040f4d343316c338e25c5a6a1f05d:


0000: 2f 2a 0a 2a 2a 20 32 30 31 32 20 41 70 72 69 6c  /*.** 2012 April
0010: 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   10.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f  **.**.** This mo
0180: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  dule implements 
0190: 61 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  a VIRTUAL TABLE 
01a0: 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
01b0: 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 61 20   to search.** a 
01c0: 6c 61 72 67 65 20 76 6f 63 61 62 75 6c 61 72 79  large vocabulary
01d0: 20 66 6f 72 20 63 6c 6f 73 65 20 6d 61 74 63 68   for close match
01e0: 65 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  es.  For example
01f0: 2c 20 74 68 69 73 20 76 69 72 74 75 61 6c 0a 2a  , this virtual.*
0200: 2a 20 74 61 62 6c 65 20 63 61 6e 20 62 65 20 75  * table can be u
0210: 73 65 64 20 74 6f 20 73 75 67 67 65 73 74 20 63  sed to suggest c
0220: 6f 72 72 65 63 74 69 6f 6e 73 20 74 6f 20 6d 69  orrections to mi
0230: 73 73 70 65 6c 6c 65 64 20 77 6f 72 64 73 2e 20  sspelled words. 
0240: 20 4f 72 2c 0a 2a 2a 20 69 74 20 63 6f 75 6c 64   Or,.** it could
0250: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 46 54   be used with FT
0260: 53 34 20 74 6f 20 64 6f 20 66 75 6c 6c 2d 74 65  S4 to do full-te
0270: 78 74 20 73 65 61 72 63 68 20 75 73 69 6e 67 20  xt search using 
0280: 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d  potentially.** m
0290: 69 73 73 70 65 6c 6c 65 64 20 77 6f 72 64 73 2e  isspelled words.
02a0: 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  .**.** Create an
02b0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
02c0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
02d0: 68 69 73 20 77 61 79 3a 0a 2a 2a 0a 2a 2a 20 20  his way:.**.**  
02e0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
02f0: 20 54 41 42 4c 45 20 64 65 6d 6f 20 55 53 49 4e   TABLE demo USIN
0300: 47 20 73 70 65 6c 6c 66 69 78 31 3b 0a 2a 2a 0a  G spellfix1;.**.
0310: 2a 2a 20 54 68 65 20 22 73 70 65 6c 6c 66 69 78  ** The "spellfix
0320: 31 22 20 74 65 72 6d 20 69 73 20 74 68 65 20 6e  1" term is the n
0330: 61 6d 65 20 6f 66 20 74 68 69 73 20 6d 6f 64 75  ame of this modu
0340: 6c 65 2e 20 20 54 68 65 20 22 64 65 6d 6f 22 20  le.  The "demo" 
0350: 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f  is the.** name o
0360: 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
0370: 62 6c 65 20 79 6f 75 20 77 69 6c 6c 20 62 65 20  ble you will be 
0380: 63 72 65 61 74 69 6e 67 2e 20 20 54 68 65 20 74  creating.  The t
0390: 61 62 6c 65 20 69 73 20 69 6e 69 74 69 61 6c 6c  able is initiall
03a0: 79 0a 2a 2a 20 65 6d 70 74 79 2e 20 20 59 6f 75  y.** empty.  You
03b0: 20 68 61 76 65 20 74 6f 20 70 6f 70 75 6c 61 74   have to populat
03c0: 65 20 69 74 20 77 69 74 68 20 79 6f 75 72 20 76  e it with your v
03d0: 6f 63 61 62 75 6c 61 72 79 2e 20 20 53 75 70 70  ocabulary.  Supp
03e0: 6f 73 65 20 79 6f 75 0a 2a 2a 20 68 61 76 65 20  ose you.** have 
03f0: 61 20 6c 69 73 74 20 6f 66 20 77 6f 72 64 73 20  a list of words 
0400: 69 6e 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  in a table named
0410: 20 22 62 69 67 5f 76 6f 63 61 62 75 6c 61 72 79   "big_vocabulary
0420: 22 2e 20 20 54 68 65 6e 20 64 6f 20 74 68 69 73  ".  Then do this
0430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 53 45 52  :.**.**    INSER
0440: 54 20 49 4e 54 4f 20 64 65 6d 6f 28 77 6f 72 64  T INTO demo(word
0450: 29 20 53 45 4c 45 43 54 20 77 6f 72 64 20 46 52  ) SELECT word FR
0460: 4f 4d 20 62 69 67 5f 76 6f 63 61 62 75 6c 61 72  OM big_vocabular
0470: 79 3b 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  y;.**.** If you 
0480: 69 6e 74 65 6e 64 20 74 6f 20 75 73 65 20 74 68  intend to use th
0490: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
04a0: 20 69 6e 20 63 6f 6f 70 65 72 61 74 69 6f 6e 20   in cooperation 
04b0: 77 69 74 68 20 61 6e 20 46 54 53 34 0a 2a 2a 20  with an FTS4.** 
04c0: 74 61 62 6c 65 20 28 66 6f 72 20 73 70 65 6c 6c  table (for spell
04d0: 69 6e 67 20 63 6f 72 72 65 63 74 6c 79 20 6f 66  ing correctly of
04e0: 20 73 65 61 72 63 68 20 74 65 72 6d 73 29 20 74   search terms) t
04f0: 68 65 6e 20 79 6f 75 20 63 61 6e 20 65 78 74 72  hen you can extr
0500: 61 63 74 0a 2a 2a 20 74 68 65 20 76 6f 63 61 62  act.** the vocab
0510: 75 6c 61 72 79 20 75 73 69 6e 67 20 61 6e 20 66  ulary using an f
0520: 74 73 33 61 75 78 20 74 61 62 6c 65 3a 0a 2a 2a  ts3aux table:.**
0530: 0a 2a 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .**    INSERT IN
0540: 54 4f 20 64 65 6d 6f 28 77 6f 72 64 29 20 53 45  TO demo(word) SE
0550: 4c 45 43 54 20 74 65 72 6d 20 46 52 4f 4d 20 73  LECT term FROM s
0560: 65 61 72 63 68 5f 61 75 78 20 57 48 45 52 45 20  earch_aux WHERE 
0570: 63 6f 6c 3d 27 2a 27 3b 0a 2a 2a 0a 2a 2a 20 59  col='*';.**.** Y
0580: 6f 75 20 63 61 6e 20 61 6c 73 6f 20 70 72 6f 76  ou can also prov
0590: 69 64 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ide the virtual 
05a0: 74 61 62 6c 65 20 77 69 74 68 20 61 20 22 72 61  table with a "ra
05b0: 6e 6b 22 20 66 6f 72 20 65 61 63 68 20 77 6f 72  nk" for each wor
05c0: 64 2e 0a 2a 2a 20 54 68 65 20 22 72 61 6e 6b 22  d..** The "rank"
05d0: 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
05e0: 6f 66 20 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68  of how common th
05f0: 65 20 77 6f 72 64 20 69 73 2e 20 20 4c 61 72 67  e word is.  Larg
0600: 65 72 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 6d 65  er numbers.** me
0610: 61 6e 20 74 68 65 20 77 6f 72 64 20 69 73 20 6d  an the word is m
0620: 6f 72 65 20 63 6f 6d 6d 6f 6e 2e 20 20 49 66 20  ore common.  If 
0630: 79 6f 75 20 6f 6d 69 74 20 74 68 65 20 72 61 6e  you omit the ran
0640: 6b 20 77 68 65 6e 20 70 6f 70 75 6c 61 74 69 6e  k when populatin
0650: 67 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2c 20  g.** the table, 
0660: 74 68 65 6e 20 61 20 72 61 6e 6b 20 6f 66 20 31  then a rank of 1
0670: 20 69 73 20 61 73 73 75 6d 65 64 2e 20 20 42 75   is assumed.  Bu
0680: 74 20 69 66 20 79 6f 75 20 68 61 76 65 20 72 61  t if you have ra
0690: 6e 6b 20 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  nk .** informati
06a0: 6f 6e 2c 20 79 6f 75 20 63 61 6e 20 73 75 70 70  on, you can supp
06b0: 6c 79 20 69 74 20 61 6e 64 20 74 68 65 20 76 69  ly it and the vi
06c0: 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c  rtual table will
06d0: 20 73 68 6f 77 20 61 0a 2a 2a 20 73 6c 69 67 68   show a.** sligh
06e0: 74 20 70 72 65 66 65 72 65 6e 63 65 20 66 6f 72  t preference for
06f0: 20 73 65 6c 65 63 74 69 6e 67 20 6d 6f 72 65 20   selecting more 
0700: 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 74 65  commonly used te
0710: 72 6d 73 2e 20 20 54 6f 0a 2a 2a 20 70 6f 70 75  rms.  To.** popu
0720: 6c 61 74 65 20 74 68 65 20 72 61 6e 6b 20 66 72  late the rank fr
0730: 6f 6d 20 61 6e 20 66 74 73 34 61 75 78 20 74 61  om an fts4aux ta
0740: 62 6c 65 20 22 73 65 61 72 63 68 5f 61 75 78 22  ble "search_aux"
0750: 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   do something.**
0760: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
0770: 2a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  *    INSERT INTO
0780: 20 64 65 6d 6f 28 77 6f 72 64 2c 72 61 6e 6b 29   demo(word,rank)
0790: 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43  .**        SELEC
07a0: 54 20 74 65 72 6d 2c 20 64 6f 63 75 6d 65 6e 74  T term, document
07b0: 73 20 46 52 4f 4d 20 73 65 61 72 63 68 5f 61 75  s FROM search_au
07c0: 78 20 57 48 45 52 45 20 63 6f 6c 3d 27 2a 27 3b  x WHERE col='*';
07d0: 0a 2a 2a 0a 2a 2a 20 54 6f 20 71 75 65 72 79 20  .**.** To query 
07e0: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
07f0: 65 2c 20 69 6e 63 6c 75 64 65 20 61 20 4d 41 54  e, include a MAT
0800: 43 48 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 74  CH operator in t
0810: 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75  he WHERE.** clau
0820: 73 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  se.  For example
0830: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
0840: 54 20 77 6f 72 64 20 46 52 4f 4d 20 64 65 6d 6f  T word FROM demo
0850: 20 57 48 45 52 45 20 77 6f 72 64 20 4d 41 54 43   WHERE word MATC
0860: 48 20 27 6b 65 6e 6e 61 73 61 77 27 3b 0a 2a 2a  H 'kennasaw';.**
0870: 0a 2a 2a 20 55 73 69 6e 67 20 61 20 64 61 74 61  .** Using a data
0880: 73 65 74 20 6f 66 20 41 6d 65 72 69 63 61 6e 20  set of American 
0890: 70 6c 61 63 65 20 6e 61 6d 65 73 20 28 64 65 72  place names (der
08a0: 69 76 65 64 20 66 72 6f 6d 0a 2a 2a 20 68 74 74  ived from.** htt
08b0: 70 3a 2f 2f 67 65 6f 6e 61 6d 65 73 2e 75 73 67  p://geonames.usg
08c0: 73 2e 67 6f 76 2f 64 6f 6d 65 73 74 69 63 2f 64  s.gov/domestic/d
08d0: 6f 77 6e 6c 6f 61 64 5f 64 61 74 61 2e 68 74 6d  ownload_data.htm
08e0: 29 20 74 68 65 20 71 75 65 72 79 20 61 62 6f 76  ) the query abov
08f0: 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 32 30 20  e.** returns 20 
0900: 72 65 73 75 6c 74 73 20 62 65 67 69 6e 6e 69 6e  results beginnin
0910: 67 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  g with:.**.**   
0920: 20 6b 65 6e 6e 65 73 61 77 0a 2a 2a 20 20 20 20   kennesaw.**    
0930: 6b 65 6e 6f 73 68 61 0a 2a 2a 20 20 20 20 6b 65  kenosha.**    ke
0940: 6e 65 73 61 77 0a 2a 2a 20 20 20 20 6b 65 6e 61  nesaw.**    kena
0950: 67 61 0a 2a 2a 20 20 20 20 6b 65 61 6e 61 6b 0a  ga.**    keanak.
0960: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 61 70 70  **.** If you app
0970: 65 6e 64 20 74 68 65 20 63 68 61 72 61 63 74 65  end the characte
0980: 72 20 27 2a 27 20 74 6f 20 74 68 65 20 65 6e 64  r '*' to the end
0990: 20 6f 66 20 74 68 65 20 70 61 74 74 65 72 6e 2c   of the pattern,
09a0: 20 74 68 65 6e 0a 2a 2a 20 61 20 70 72 65 66 69   then.** a prefi
09b0: 78 20 73 65 61 72 63 68 20 69 73 20 70 65 72 66  x search is perf
09c0: 6f 72 6d 65 64 2e 20 20 46 6f 72 20 65 78 61 6d  ormed.  For exam
09d0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ple:.**.**    SE
09e0: 4c 45 43 54 20 77 6f 72 64 20 46 52 4f 4d 20 64  LECT word FROM d
09f0: 65 6d 6f 20 57 48 45 52 45 20 77 6f 72 64 20 4d  emo WHERE word M
0a00: 41 54 43 48 20 27 6b 65 6e 6e 65 73 2a 27 3b 0a  ATCH 'kennes*';.
0a10: 2a 2a 0a 2a 2a 20 59 69 65 6c 64 73 20 32 30 20  **.** Yields 20 
0a20: 72 65 73 75 6c 74 73 20 62 65 67 69 6e 6e 69 6e  results beginnin
0a30: 67 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  g with:.**.**   
0a40: 20 6b 65 6e 6e 65 73 61 77 0a 2a 2a 20 20 20 20   kennesaw.**    
0a50: 6b 65 6e 6e 65 73 74 6f 6e 65 0a 2a 2a 20 20 20  kennestone.**   
0a60: 20 6b 65 6e 6e 65 73 6f 6e 0a 2a 2a 20 20 20 20   kenneson.**    
0a70: 6b 65 6e 6e 65 79 73 0a 2a 2a 20 20 20 20 6b 65  kenneys.**    ke
0a80: 61 6e 65 73 0a 2a 2a 20 20 20 20 6b 65 65 6e 65  anes.**    keene
0a90: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74  s.**.** The virt
0aa0: 75 61 6c 20 74 61 62 6c 65 20 61 63 74 75 61 6c  ual table actual
0ab0: 6c 79 20 68 61 73 20 61 20 75 6e 69 71 75 65 20  ly has a unique 
0ac0: 72 6f 77 69 64 20 77 69 74 68 20 66 69 76 65 20  rowid with five 
0ad0: 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 20 74 68 72  columns plus thr
0ae0: 65 65 0a 2a 2a 20 65 78 74 72 61 20 68 69 64 64  ee.** extra hidd
0af0: 65 6e 20 63 6f 6c 75 6d 6e 73 2e 20 20 54 68 65  en columns.  The
0b00: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 61 73 20   columns are as 
0b10: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
0b20: 20 20 72 6f 77 69 64 20 20 20 20 20 20 20 20 20    rowid         
0b30: 41 20 75 6e 69 71 75 65 20 69 6e 74 65 67 65 72  A unique integer
0b40: 20 6e 75 6d 62 65 72 20 61 73 73 6f 63 69 61 74   number associat
0b50: 65 64 20 77 69 74 68 20 65 61 63 68 0a 2a 2a 20  ed with each.** 
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 20 76 6f 63 61 62 75 6c 61 72 79 20 69 74 65 6d   vocabulary item
0b80: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
0b90: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
0ba0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bb0: 20 20 20 20 20 61 73 20 61 20 66 6f 72 65 69 67       as a foreig
0bc0: 6e 20 6b 65 79 20 6f 6e 20 6f 74 68 65 72 20 74  n key on other t
0bd0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74  ables in the dat
0be0: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
0bf0: 77 6f 72 64 20 20 20 20 20 20 20 20 20 20 54 68  word          Th
0c00: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 77 6f  e text of the wo
0c10: 72 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  rd that matches 
0c20: 74 68 65 20 70 61 74 74 65 72 6e 2e 0a 2a 2a 20  the pattern..** 
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c40: 20 42 6f 74 68 20 77 6f 72 64 20 61 6e 64 20 70   Both word and p
0c50: 61 74 74 65 72 6e 20 63 61 6e 20 63 6f 6e 74 61  attern can conta
0c60: 69 6e 73 20 75 6e 69 63 6f 64 65 20 63 68 61 72  ins unicode char
0c70: 61 63 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  acters.**       
0c80: 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 63             and c
0c90: 61 6e 20 62 65 20 6d 69 78 65 64 20 63 61 73 65  an be mixed case
0ca0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 72 61 6e 6b 20  ..**.**    rank 
0cb0: 20 20 20 20 20 20 20 20 20 54 68 69 73 20 69 73           This is
0cc0: 20 74 68 65 20 72 61 6e 6b 20 6f 66 20 74 68 65   the rank of the
0cd0: 20 77 6f 72 64 2c 20 61 73 20 73 70 65 63 69 66   word, as specif
0ce0: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ied in the.**   
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
0d00: 72 69 67 69 6e 61 6c 20 49 4e 53 45 52 54 20 73  riginal INSERT s
0d10: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
0d20: 20 20 20 64 69 73 74 61 6e 63 65 20 20 20 20 20     distance     
0d30: 20 54 68 69 73 20 69 73 20 61 6e 20 65 64 69 74   This is an edit
0d40: 20 64 69 73 74 61 6e 63 65 20 6f 72 20 4c 65 76   distance or Lev
0d50: 65 6e 73 74 68 65 69 6e 20 64 69 73 74 61 6e 63  ensthein distanc
0d60: 65 20 67 6f 69 6e 67 0a 2a 2a 20 20 20 20 20 20  e going.**      
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
0d80: 20 74 68 65 20 70 61 74 74 65 72 6e 20 74 6f 20   the pattern to 
0d90: 74 68 65 20 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  the word..**.** 
0da0: 20 20 20 6c 61 6e 67 69 64 20 20 20 20 20 20 20     langid       
0db0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6c 61 6e   This is the lan
0dc0: 67 75 61 67 65 2d 69 64 20 6f 66 20 74 68 65 20  guage-id of the 
0dd0: 77 6f 72 64 2e 20 20 41 6c 6c 20 71 75 65 72 69  word.  All queri
0de0: 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20  es are.**       
0df0: 20 20 20 20 20 20 20 20 20 20 20 61 67 61 69 6e             again
0e00: 73 74 20 61 20 73 69 6e 67 6c 65 20 6c 61 6e 67  st a single lang
0e10: 75 61 67 65 2d 69 64 2c 20 77 68 69 63 68 20 64  uage-id, which d
0e20: 65 66 61 75 6c 74 73 20 74 6f 20 30 2e 0a 2a 2a  efaults to 0..**
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e 20    For any given 
0e50: 71 75 65 72 79 20 74 68 69 73 20 76 61 6c 75 65  query this value
0e60: 20 69 73 20 74 68 65 20 73 61 6d 65 20 6f 6e 20   is the same on 
0e70: 61 6c 6c 20 72 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20  all rows..**.** 
0e80: 20 20 20 73 63 6f 72 65 20 20 20 20 20 20 20 20     score        
0e90: 20 54 68 65 20 73 63 6f 72 65 20 69 73 20 61 20   The score is a 
0ea0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 72  combination of r
0eb0: 61 6e 6b 20 61 6e 64 20 64 69 73 74 61 6e 63 65  ank and distance
0ec0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 20 20 20 20  .  The.**       
0ed0: 20 20 20 20 20 20 20 20 20 20 20 69 64 65 61 20             idea 
0ee0: 69 73 20 74 68 61 74 20 61 20 6c 6f 77 65 72 20  is that a lower 
0ef0: 73 63 6f 72 65 20 69 73 20 62 65 74 74 65 72 2e  score is better.
0f00: 20 20 54 68 65 20 76 69 72 74 75 61 6c 20 74 61    The virtual ta
0f10: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
0f20: 20 20 20 20 20 20 20 20 61 74 74 65 6d 70 74 73          attempts
0f30: 20 74 6f 20 66 69 6e 64 20 77 6f 72 64 73 20 77   to find words w
0f40: 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20 73  ith the lowest s
0f50: 63 6f 72 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20  core and .**    
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 79                by
0f70: 20 64 65 66 61 75 6c 74 20 28 75 6e 6c 65 73 73   default (unless
0f80: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 4f   overridden by O
0f90: 52 44 45 52 20 42 59 29 20 72 65 74 75 72 6e 73  RDER BY) returns
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0fb0: 20 20 20 20 20 72 65 73 75 6c 74 73 20 69 6e 20       results in 
0fc0: 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73  order of increas
0fd0: 69 6e 67 20 73 63 6f 72 65 2e 0a 2a 2a 0a 2a 2a  ing score..**.**
0fe0: 20 20 20 20 6d 61 74 63 68 6c 65 6e 20 20 20 20      matchlen    
0ff0: 20 20 46 6f 72 20 70 72 65 66 69 78 20 71 75 65    For prefix que
1000: 72 69 65 73 2c 20 74 68 65 20 6e 75 6d 62 65 72  ries, the number
1010: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
1020: 6e 20 74 68 65 20 70 72 65 66 69 78 0a 2a 2a 20  n the prefix.** 
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
1050: 20 76 61 6c 75 65 20 28 77 6f 72 64 29 20 74 68   value (word) th
1060: 61 74 20 6d 61 74 63 68 65 64 20 74 68 65 20 71  at matched the q
1070: 75 65 72 79 20 74 65 72 6d 2e 0a 2a 2a 20 20 20  uery term..**   
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
1090: 6f 72 20 6e 6f 6e 2d 70 72 65 66 69 78 20 71 75  or non-prefix qu
10a0: 65 72 69 65 73 2c 20 74 68 65 20 6e 75 6d 62 65  eries, the numbe
10b0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
10c0: 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  in the .**      
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
10e0: 72 6e 65 64 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  rned value..**.*
10f0: 2a 20 20 20 20 74 6f 70 20 20 20 20 20 20 20 20  *    top        
1100: 20 20 20 28 48 49 44 44 45 4e 29 20 20 46 6f 72     (HIDDEN)  For
1110: 20 61 6e 79 20 71 75 65 72 79 2c 20 74 68 69 73   any query, this
1120: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
1130: 6d 65 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20  me on all.**    
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
1150: 77 73 2e 20 20 49 74 20 69 73 20 61 6e 20 69 6e  ws.  It is an in
1160: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1170: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
1180: 72 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  r of.**         
1190: 20 20 20 20 20 20 20 20 20 72 6f 77 73 20 74 68           rows th
11a0: 61 74 20 77 69 6c 6c 20 62 65 20 6f 75 74 70 75  at will be outpu
11b0: 74 2e 20 20 54 68 65 20 61 63 74 75 61 6c 6c 79  t.  The actually
11c0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a   number of rows.
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11e0: 20 20 20 20 6f 75 74 70 75 74 20 6d 69 67 68 74      output might
11f0: 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 74 68   be less than th
1200: 69 73 20 6e 75 6d 62 65 72 2c 20 62 75 74 20 69  is number, but i
1210: 74 20 77 69 6c 6c 20 6e 65 76 65 72 0a 2a 2a 20  t will never.** 
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 62 65 20 67 72 65 61 74 65 72 2e 20 20 54 68   be greater.  Th
1240: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
1250: 66 6f 72 20 74 6f 70 20 69 73 20 32 30 2c 20 62  for top is 20, b
1260: 75 74 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ut that.**      
1270: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6e 20              can 
1280: 62 65 20 63 68 61 6e 67 65 64 20 66 6f 72 20 65  be changed for e
1290: 61 63 68 20 71 75 65 72 79 20 62 79 20 69 6e 63  ach query by inc
12a0: 6c 75 64 69 6e 67 20 61 20 74 65 72 6d 20 6f 66  luding a term of
12b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12c0: 20 20 20 20 20 74 68 65 20 66 6f 72 6d 20 22 74       the form "t
12d0: 6f 70 3d 4e 22 20 69 6e 20 74 68 65 20 57 48 45  op=N" in the WHE
12e0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
12f0: 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
1300: 20 73 63 6f 70 65 20 20 20 20 20 20 20 20 20 28   scope         (
1310: 48 49 44 44 45 4e 29 20 20 46 6f 72 20 61 6e 79  HIDDEN)  For any
1320: 20 71 75 65 72 79 2c 20 74 68 69 73 20 76 61 6c   query, this val
1330: 75 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 6f  ue is the same o
1340: 6e 20 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20  n all.**        
1350: 20 20 20 20 20 20 20 20 20 20 72 6f 77 73 2e 20            rows. 
1360: 20 54 68 65 20 73 63 6f 70 65 20 69 73 20 61 20   The scope is a 
1370: 6d 65 61 73 75 72 65 20 6f 66 20 68 6f 77 20 77  measure of how w
1380: 69 64 65 6c 79 20 74 68 65 20 76 69 72 74 75 61  idely the virtua
1390: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
13a0: 20 20 20 20 20 20 74 61 62 6c 65 20 6c 6f 6f 6b        table look
13b0: 73 20 66 6f 72 20 6d 61 74 63 68 69 6e 67 20 77  s for matching w
13c0: 6f 72 64 73 2e 20 20 53 6d 61 6c 6c 65 72 20 76  ords.  Smaller v
13d0: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20  alues of.**     
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 63 6f               sco
13f0: 70 65 20 63 61 75 73 65 20 61 20 62 72 6f 61 64  pe cause a broad
1400: 65 72 20 73 65 61 72 63 68 2e 20 20 54 68 65 20  er search.  The 
1410: 73 63 6f 70 65 20 69 73 20 6e 6f 72 6d 61 6c 6c  scope is normall
1420: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
1430: 20 20 20 20 20 20 63 68 6f 6f 73 65 6e 20 61 75        choosen au
1440: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 6e 64 20  tomatically and 
1450: 69 73 20 63 61 70 70 65 64 20 61 74 20 34 2e 20  is capped at 4. 
1460: 20 41 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a   Applications.**
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65    can change the
1490: 20 73 63 6f 70 65 20 62 79 20 69 6e 63 6c 75 64   scope by includ
14a0: 69 6e 67 20 61 20 74 65 72 6d 20 6f 66 20 74 68  ing a term of th
14b0: 65 20 66 6f 72 6d 0a 2a 2a 20 20 20 20 20 20 20  e form.**       
14c0: 20 20 20 20 20 20 20 20 20 20 20 22 73 63 6f 70             "scop
14d0: 65 3d 4e 22 20 69 6e 20 74 68 65 20 57 48 45 52  e=N" in the WHER
14e0: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
14f0: 71 75 65 72 79 2e 20 20 49 6e 63 72 65 61 73 69  query.  Increasi
1500: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ng.**           
1510: 20 20 20 20 20 20 20 74 68 65 20 73 63 6f 70 65         the scope
1520: 20 77 69 6c 6c 20 6d 61 6b 65 20 74 68 65 20 71   will make the q
1530: 75 65 72 79 20 72 75 6e 20 66 61 73 74 65 72 2c  uery run faster,
1540: 20 62 75 74 20 77 69 6c 6c 20 72 65 64 75 63 65   but will reduce
1550: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1560: 20 20 20 20 20 74 68 65 20 70 6f 73 73 69 62 6c       the possibl
1570: 65 20 63 6f 72 72 65 63 74 69 6f 6e 73 2e 0a 2a  e corrections..*
1580: 2a 0a 2a 2a 20 20 20 20 73 72 63 68 63 6e 74 20  *.**    srchcnt 
1590: 20 20 20 20 20 20 28 48 49 44 44 45 4e 29 20 20        (HIDDEN)  
15a0: 46 6f 72 20 61 6e 79 20 71 75 65 72 79 2c 20 74  For any query, t
15b0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 74 68 65  his value is the
15c0: 20 73 61 6d 65 20 6f 6e 20 61 6c 6c 0a 2a 2a 20   same on all.** 
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 72 6f 77 73 2e 20 20 54 68 69 73 20 76 61 6c   rows.  This val
15f0: 75 65 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ue is an integer
1600: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1610: 6d 62 65 72 20 6f 66 0a 2a 2a 20 20 20 20 20 20  mber of.**      
1620: 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 77              of w
1630: 6f 72 64 73 20 65 78 61 6d 69 6e 65 64 20 75 73  ords examined us
1640: 69 6e 67 20 74 68 65 20 65 64 69 74 2d 64 69 73  ing the edit-dis
1650: 74 61 6e 63 65 20 61 6c 67 6f 72 69 74 68 6d 20  tance algorithm 
1660: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
1670: 20 20 20 20 20 20 20 66 69 6e 64 20 74 68 65 20         find the 
1680: 74 6f 70 20 6d 61 74 63 68 65 73 20 74 68 61 74  top matches that
1690: 20 61 72 65 20 75 6c 74 69 6d 61 74 65 6c 79 20   are ultimately 
16a0: 64 69 73 70 6c 61 79 65 64 2e 20 20 54 68 69 73  displayed.  This
16b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16c0: 20 20 20 20 20 76 61 6c 75 65 20 69 73 20 66 6f       value is fo
16d0: 72 20 64 69 61 67 6e 6f 73 74 69 63 20 75 73 65  r diagnostic use
16e0: 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   only..**.**    
16f0: 73 6f 75 6e 64 73 6c 69 6b 65 20 20 20 20 28 48  soundslike    (H
1700: 49 44 44 45 4e 29 20 20 57 68 65 6e 20 69 6e 73  IDDEN)  When ins
1710: 65 72 74 69 6e 67 20 76 6f 63 61 62 75 6c 61 72  erting vocabular
1720: 79 20 65 6e 74 72 69 65 73 2c 20 74 68 69 73 20  y entries, this 
1730: 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
1740: 20 20 20 20 20 20 20 20 20 20 63 61 6e 20 62 65            can be
1750: 20 73 65 74 20 74 6f 20 61 6e 20 73 70 65 6c 6c   set to an spell
1760: 69 6e 67 20 74 68 61 74 20 6d 61 74 63 68 65 73  ing that matches
1770: 20 77 68 61 74 20 74 68 65 20 77 6f 72 64 0a 2a   what the word.*
1780: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1790: 20 20 20 73 6f 75 6e 64 73 20 6c 69 6b 65 2e 20     sounds like. 
17a0: 20 53 65 65 20 74 68 65 20 44 45 41 4c 49 4e 47   See the DEALING
17b0: 20 57 49 54 48 20 55 4e 55 53 55 41 4c 20 41 4e   WITH UNUSUAL AN
17c0: 44 20 44 49 46 46 49 43 55 4c 54 0a 2a 2a 20 20  D DIFFICULT.**  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 53 50 45 4c 4c 49 4e 47 53 20 73 65 63 74 69 6f  SPELLINGS sectio
17f0: 6e 20 62 65 6c 6f 77 20 66 6f 72 20 64 65 74 61  n below for deta
1800: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ils..**.** When 
1810: 69 6e 73 65 72 74 69 6e 67 20 69 6e 74 6f 20 6f  inserting into o
1820: 72 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 76  r updating the v
1830: 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f 6e  irtual table, on
1840: 6c 79 20 74 68 65 20 72 6f 77 69 64 2c 20 77 6f  ly the rowid, wo
1850: 72 64 2c 0a 2a 2a 20 72 61 6e 6b 2c 20 61 6e 64  rd,.** rank, and
1860: 20 6c 61 6e 67 69 64 20 6d 61 79 20 62 65 20 63   langid may be c
1870: 68 61 6e 67 65 73 2e 20 20 41 6e 79 20 61 74 74  hanges.  Any att
1880: 65 6d 70 74 20 74 6f 20 73 65 74 20 6f 72 20 6d  empt to set or m
1890: 6f 64 69 66 79 20 74 68 65 20 76 61 6c 75 65 73  odify the values
18a0: 0a 2a 2a 20 6f 66 20 64 69 73 74 61 6e 63 65 2c  .** of distance,
18b0: 20 73 63 6f 72 65 2c 20 74 6f 70 2c 20 73 63 6f   score, top, sco
18c0: 70 65 2c 20 6f 72 20 73 72 63 68 63 6e 74 20 69  pe, or srchcnt i
18d0: 73 20 73 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72  s silently ignor
18e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49  ed..**.** ALGORI
18f0: 54 48 4d 0a 2a 2a 0a 2a 2a 20 41 20 73 68 61 64  THM.**.** A shad
1900: 6f 77 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22  ow table named "
1910: 25 5f 76 6f 63 61 62 22 20 28 77 68 65 72 65 20  %_vocab" (where 
1920: 74 68 65 20 25 20 69 73 20 72 65 70 6c 61 63 65  the % is replace
1930: 64 20 62 79 20 74 68 65 20 6e 61 6d 65 20 6f 66  d by the name of
1940: 0a 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20  .** the virtual 
1950: 74 61 62 6c 65 3b 20 45 78 3a 20 22 64 65 6d 6f  table; Ex: "demo
1960: 5f 76 6f 63 61 62 22 20 66 6f 72 20 74 68 65 20  _vocab" for the 
1970: 22 64 65 6d 6f 22 20 76 69 72 74 75 61 6c 20 74  "demo" virtual t
1980: 61 62 6c 65 29 20 69 73 0a 2a 2a 20 63 6f 6e 73  able) is.** cons
1990: 74 72 75 63 74 65 64 20 77 69 74 68 20 74 68 65  tructed with the
19a0: 73 65 20 63 6f 6c 75 6d 6e 73 3a 0a 2a 2a 0a 2a  se columns:.**.*
19b0: 2a 20 20 20 20 69 64 20 20 20 20 20 20 20 20 20  *    id         
19c0: 20 20 20 54 68 65 20 75 6e 69 71 75 65 20 69 64     The unique id
19d0: 20 28 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52   (INTEGER PRIMAR
19e0: 59 20 4b 45 59 29 0a 2a 2a 0a 2a 2a 20 20 20 20  Y KEY).**.**    
19f0: 72 61 6e 6b 20 20 20 20 20 20 20 20 20 20 54 68  rank          Th
1a00: 65 20 72 61 6e 6b 20 6f 66 20 77 6f 72 64 2e 0a  e rank of word..
1a10: 2a 2a 0a 2a 2a 20 20 20 20 6c 61 6e 67 69 64 20  **.**    langid 
1a20: 20 20 20 20 20 20 20 54 68 65 20 6c 61 6e 67 75         The langu
1a30: 61 67 65 20 69 64 20 66 6f 72 20 74 68 69 73 20  age id for this 
1a40: 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  entry..**.**    
1a50: 77 6f 72 64 20 20 20 20 20 20 20 20 20 20 54 68  word          Th
1a60: 65 20 6f 72 69 67 69 6e 61 6c 20 55 54 46 38 20  e original UTF8 
1a70: 74 65 78 74 20 6f 66 20 74 68 65 20 76 6f 63 61  text of the voca
1a80: 62 75 6c 61 72 79 20 77 6f 72 64 0a 2a 2a 0a 2a  bulary word.**.*
1a90: 2a 20 20 20 20 6b 31 20 20 20 20 20 20 20 20 20  *    k1         
1aa0: 20 20 20 54 68 65 20 77 6f 72 64 20 74 72 61 6e     The word tran
1ab0: 73 6c 69 74 65 72 61 74 65 64 20 69 6e 74 6f 20  sliterated into 
1ac0: 6c 6f 77 65 72 2d 63 61 73 65 20 41 53 43 49 49  lower-case ASCII
1ad0: 2e 20 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .  .**          
1ae0: 20 20 20 20 20 20 20 20 54 68 65 72 65 20 69 73          There is
1af0: 20 61 20 73 74 61 6e 64 61 72 64 20 74 61 62 6c   a standard tabl
1b00: 65 20 6f 66 20 6d 61 70 70 69 6e 67 73 20 66 72  e of mappings fr
1b10: 6f 6d 20 6e 6f 6e 2d 41 53 43 49 49 0a 2a 2a 20  om non-ASCII.** 
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f   characters into
1b40: 20 41 53 43 49 49 2e 20 20 45 78 61 6d 70 6c 65   ASCII.  Example
1b50: 73 3a 20 22 c3 a6 22 20 2d 3e 20 22 61 65 22 2c  s: ".." -> "ae",
1b60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b70: 20 20 20 20 20 22 c3 be 22 20 2d 3e 20 22 74 68       ".." -> "th
1b80: 22 2c 20 22 c3 9f 22 20 2d 3e 20 22 73 73 22 2c  ", ".." -> "ss",
1b90: 20 22 c3 a1 22 20 2d 3e 20 22 61 22 2c 20 2e 2e   ".." -> "a", ..
1ba0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 20 20 20 20  .  The.**       
1bb0: 20 20 20 20 20 20 20 20 20 20 20 61 63 63 65 73             acces
1bc0: 73 6f 72 79 20 66 75 6e 63 74 69 6f 6e 20 73 70  sory function sp
1bd0: 65 6c 6c 66 69 78 31 5f 74 72 61 6e 73 6c 69 74  ellfix1_translit
1be0: 28 58 29 20 77 69 6c 6c 20 64 6f 0a 2a 2a 20 20  (X) will do.**  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 74 68 65 20 6e 6f 6e 2d 41 53 43 49 49 20 74 6f  the non-ASCII to
1c10: 20 41 53 43 49 49 20 6d 61 70 70 69 6e 67 2e 20   ASCII mapping. 
1c20: 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 6c 6f   The built-in lo
1c30: 77 65 72 28 58 29 0a 2a 2a 20 20 20 20 20 20 20  wer(X).**       
1c40: 20 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74             funct
1c50: 69 6f 6e 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74  ion will convert
1c60: 20 74 6f 20 6c 6f 77 65 72 2d 63 61 73 65 2e 20   to lower-case. 
1c70: 20 54 68 75 73 3a 0a 2a 2a 20 20 20 20 20 20 20   Thus:.**       
1c80: 20 20 20 20 20 20 20 20 20 20 20 6b 31 20 3d 20             k1 = 
1c90: 6c 6f 77 65 72 28 73 70 65 6c 6c 66 69 78 31 5f  lower(spellfix1_
1ca0: 74 72 61 6e 73 6c 69 74 28 77 6f 72 64 29 29 2e  translit(word)).
1cb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 6b 32 20 20 20 20  .**.**    k2    
1cc0: 20 20 20 20 20 20 20 20 54 68 69 73 20 66 69 65          This fie
1cd0: 6c 64 20 68 6f 6c 64 73 20 61 20 70 68 6f 6e 65  ld holds a phone
1ce0: 74 69 63 20 63 6f 64 65 20 64 65 72 69 76 65 64  tic code derived
1cf0: 20 66 72 6f 6d 20 6b 31 2e 20 20 4c 65 74 74 65   from k1.  Lette
1d00: 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  rs.**           
1d10: 20 20 20 20 20 20 20 74 68 61 74 20 68 61 76 65         that have
1d20: 20 73 69 6d 69 6c 61 72 20 73 6f 75 6e 64 73 20   similar sounds 
1d30: 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
1d40: 74 68 65 20 73 61 6d 65 20 73 79 6d 62 6f 6c 2e  the same symbol.
1d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d60: 20 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65       For example
1d70: 2c 20 61 6c 6c 20 76 6f 77 65 6c 73 20 61 6e 64  , all vowels and
1d80: 20 76 6f 77 65 6c 20 63 6c 75 73 74 65 72 73 20   vowel clusters 
1d90: 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 20 20  become the.**   
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1db0: 69 6e 67 6c 65 20 73 79 6d 62 6f 6c 20 22 41 22  ingle symbol "A"
1dc0: 2e 20 20 41 6e 64 20 74 68 65 20 6c 65 74 74 65  .  And the lette
1dd0: 72 73 20 22 70 22 2c 20 22 62 22 2c 20 22 66 22  rs "p", "b", "f"
1de0: 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
1df0: 20 20 20 20 20 20 20 20 20 20 22 76 22 20 61 6c            "v" al
1e00: 6c 20 62 65 63 6f 6d 65 20 22 42 22 2e 20 20 41  l become "B".  A
1e10: 6c 6c 20 6e 61 73 61 6c 20 73 6f 75 6e 64 73 20  ll nasal sounds 
1e20: 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a  are represented.
1e30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1e40: 20 20 20 20 61 73 20 22 4e 22 2e 20 20 41 6e 64      as "N".  And
1e50: 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 65 20   so forth.  The 
1e60: 6d 61 70 70 69 6e 67 20 69 73 20 62 61 73 65 20  mapping is base 
1e70: 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  on.**           
1e80: 20 20 20 20 20 20 20 69 64 65 61 73 20 66 6f 75         ideas fou
1e90: 6e 64 20 69 6e 20 53 6f 75 6e 64 65 78 2c 20 4d  nd in Soundex, M
1ea0: 65 74 61 70 68 6f 6e 65 2c 20 61 6e 64 20 6f 74  etaphone, and ot
1eb0: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  her.**          
1ec0: 20 20 20 20 20 20 20 20 6c 6f 6e 67 2d 73 74 61          long-sta
1ed0: 6e 64 69 6e 67 20 70 68 6f 6e 65 74 69 63 20 6d  nding phonetic m
1ee0: 61 74 63 68 69 6e 67 20 73 79 73 74 65 6d 73 2e  atching systems.
1ef0: 20 20 54 68 69 73 20 6b 65 79 20 63 61 6e 0a 2a    This key can.*
1f00: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1f10: 20 20 20 62 65 20 67 65 6e 65 72 61 74 65 64 20     be generated 
1f20: 62 79 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  by the function 
1f30: 73 70 65 6c 6c 66 69 78 31 5f 70 68 6f 6e 65 68  spellfix1_phoneh
1f40: 61 73 68 28 58 29 2e 20 20 0a 2a 2a 20 20 20 20  ash(X).  .**    
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 48 65                He
1f60: 6e 63 65 3a 20 6b 32 20 3d 20 73 70 65 6c 6c 66  nce: k2 = spellf
1f70: 69 78 31 5f 70 68 6f 6e 65 68 61 73 68 28 6b 31  ix1_phonehash(k1
1f80: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ).**.** There is
1f90: 20 61 6c 73 6f 20 61 20 66 75 6e 63 74 69 6f 6e   also a function
1fa0: 20 66 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74   for computing t
1fb0: 68 65 20 57 61 67 6e 65 72 20 65 64 69 74 20 64  he Wagner edit d
1fc0: 69 73 74 61 6e 63 65 20 6f 72 20 74 68 65 0a 2a  istance or the.*
1fd0: 2a 20 4c 65 76 65 6e 73 68 74 65 69 6e 20 64 69  * Levenshtein di
1fe0: 73 74 61 6e 63 65 20 62 65 74 77 65 65 6e 20 61  stance between a
1ff0: 20 70 61 74 74 65 72 6e 20 61 6e 64 20 61 20 77   pattern and a w
2000: 6f 72 64 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ord.  This funct
2010: 69 6f 6e 0a 2a 2a 20 69 73 20 65 78 70 6f 73 65  ion.** is expose
2020: 64 20 61 73 20 73 70 65 6c 6c 66 69 78 31 5f 65  d as spellfix1_e
2030: 64 69 74 64 69 73 74 28 58 2c 59 29 2e 20 20 54  ditdist(X,Y).  T
2040: 68 65 20 65 64 69 74 20 64 69 73 74 61 6e 63 65  he edit distance
2050: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74   function.** ret
2060: 75 72 6e 73 20 74 68 65 20 22 63 6f 73 74 22 20  urns the "cost" 
2070: 6f 66 20 63 6f 6e 76 65 72 74 69 6e 67 20 58 20  of converting X 
2080: 69 6e 74 6f 20 59 2e 20 20 53 6f 6d 65 20 74 72  into Y.  Some tr
2090: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 0a 2a 2a  ansformations.**
20a0: 20 63 6f 73 74 20 6d 6f 72 65 20 74 68 61 6e 20   cost more than 
20b0: 6f 74 68 65 72 73 2e 20 20 43 68 61 6e 67 69 6e  others.  Changin
20c0: 67 20 6f 6e 65 20 76 6f 77 65 6c 20 69 6e 74 6f  g one vowel into
20d0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 76 6f 77   a different vow
20e0: 65 6c 2c 0a 2a 2a 20 66 6f 72 20 65 78 61 6d 70  el,.** for examp
20f0: 6c 65 20 69 73 20 72 65 6c 61 74 69 76 65 6c 79  le is relatively
2100: 20 63 68 65 61 70 2c 20 61 73 20 69 73 20 64 6f   cheap, as is do
2110: 75 62 6c 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e  ubling a constan
2120: 74 2c 20 6f 72 0a 2a 2a 20 6f 6d 69 74 74 69 6e  t, or.** omittin
2130: 67 20 74 68 65 20 73 65 63 6f 6e 64 20 63 68 61  g the second cha
2140: 72 61 63 74 65 72 20 6f 66 20 61 20 64 6f 75 62  racter of a doub
2150: 6c 65 2d 63 6f 6e 73 74 61 6e 74 2e 20 20 4f 74  le-constant.  Ot
2160: 68 65 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  her transformati
2170: 6f 6e 73 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 65  ons.** or more e
2180: 78 70 65 6e 73 69 76 65 2e 20 20 54 68 65 20 69  xpensive.  The i
2190: 64 65 61 20 69 73 20 74 68 61 74 20 74 68 65 20  dea is that the 
21a0: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 66 75  edit distance fu
21b0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
21c0: 2a 20 61 20 6c 6f 77 20 63 6f 73 74 20 6f 66 20  * a low cost of 
21d0: 77 6f 72 64 73 20 74 68 61 74 20 61 72 65 20 73  words that are s
21e0: 69 6d 69 6c 61 72 20 61 6e 64 20 61 20 68 69 67  imilar and a hig
21f0: 68 65 72 20 63 6f 73 74 20 66 6f 72 20 77 6f 72  her cost for wor
2200: 64 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 66  ds.** that are f
2210: 75 74 68 65 72 20 61 70 61 72 74 2e 20 20 49 6e  uther apart.  In
2220: 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
2230: 74 69 6f 6e 2c 20 74 68 65 20 6d 61 78 69 6d 75  tion, the maximu
2240: 6d 20 63 6f 73 74 0a 2a 2a 20 6f 66 20 61 6e 79  m cost.** of any
2250: 20 73 69 6e 67 6c 65 2d 63 68 61 72 61 63 74 65   single-characte
2260: 72 20 65 64 69 74 20 28 64 65 6c 65 74 65 2c 20  r edit (delete, 
2270: 69 6e 73 65 72 74 2c 20 6f 72 20 73 75 62 73 74  insert, or subst
2280: 69 74 75 74 65 29 20 69 73 20 31 30 30 2c 0a 2a  itute) is 100,.*
2290: 2a 20 77 69 74 68 20 6c 6f 77 65 72 20 63 6f 73  * with lower cos
22a0: 74 73 20 66 6f 72 20 73 6f 6d 65 20 65 64 69 74  ts for some edit
22b0: 73 20 28 73 75 63 68 20 61 73 20 74 72 61 6e 73  s (such as trans
22c0: 66 6f 72 6d 69 6e 67 20 76 6f 77 65 6c 73 29 2e  forming vowels).
22d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 73 63 6f 72  .**.** The "scor
22e0: 65 22 20 66 6f 72 20 61 20 63 6f 6d 70 61 72 69  e" for a compari
22f0: 73 6f 6e 20 69 73 20 74 68 65 20 65 64 69 74 20  son is the edit 
2300: 64 69 73 74 61 6e 63 65 20 62 65 74 77 65 65 6e  distance between
2310: 20 74 68 65 20 70 61 74 74 65 72 6e 0a 2a 2a 20   the pattern.** 
2320: 61 6e 64 20 74 68 65 20 77 6f 72 64 2c 20 61 64  and the word, ad
2330: 6a 75 73 74 65 64 20 64 6f 77 6e 20 62 79 20 74  justed down by t
2340: 68 65 20 62 61 73 65 2d 32 20 6c 6f 67 6f 72 69  he base-2 logori
2350: 74 68 6d 20 6f 66 20 74 68 65 20 77 6f 72 64 20  thm of the word 
2360: 72 61 6e 6b 2e 0a 2a 2a 20 46 6f 72 20 65 78 61  rank..** For exa
2370: 6d 70 6c 65 2c 20 61 20 6d 61 74 63 68 20 77 69  mple, a match wi
2380: 74 68 20 64 69 73 74 61 6e 63 65 20 31 30 30 20  th distance 100 
2390: 62 75 74 20 72 61 6e 6b 20 31 30 30 30 20 77 6f  but rank 1000 wo
23a0: 75 6c 64 20 68 61 76 65 20 61 0a 2a 2a 20 73 63  uld have a.** sc
23b0: 6f 72 65 20 6f 66 20 31 32 32 20 28 3d 20 31 30  ore of 122 (= 10
23c0: 30 20 2d 20 6c 6f 67 32 28 31 30 30 30 29 20 2b  0 - log2(1000) +
23d0: 20 33 32 29 20 77 68 65 72 65 20 61 73 20 61 20   32) where as a 
23e0: 6d 61 74 63 68 20 77 69 74 68 20 64 69 73 74 61  match with dista
23f0: 6e 63 65 0a 2a 2a 20 31 30 30 20 77 69 74 68 20  nce.** 100 with 
2400: 61 20 72 61 6e 6b 20 6f 66 20 31 20 77 6f 75 6c  a rank of 1 woul
2410: 64 20 68 61 76 65 20 61 20 73 63 6f 72 65 20 6f  d have a score o
2420: 66 20 31 33 31 20 28 31 30 30 20 2d 20 6c 6f 67  f 131 (100 - log
2430: 32 28 31 29 20 2b 20 33 32 29 2e 0a 2a 2a 20 28  2(1) + 32)..** (
2440: 4e 42 3a 20 20 54 68 65 20 63 6f 6e 73 74 61 6e  NB:  The constan
2450: 74 20 33 32 20 69 73 20 61 64 64 65 64 20 74 6f  t 32 is added to
2460: 20 65 61 63 68 20 73 63 6f 72 65 20 74 6f 20 6b   each score to k
2470: 65 65 70 20 69 74 20 66 72 6f 6d 20 67 6f 69 6e  eep it from goin
2480: 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 69 6e  g.** negative in
2490: 20 63 61 73 65 20 74 68 65 20 65 64 69 74 20 64   case the edit d
24a0: 69 73 74 61 6e 63 65 20 69 73 20 7a 65 72 6f 2e  istance is zero.
24b0: 29 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  )  In this way, 
24c0: 66 72 65 71 75 65 6e 74 6c 79 0a 2a 2a 20 75 73  frequently.** us
24d0: 65 64 20 77 6f 72 64 73 20 67 65 74 20 61 20 73  ed words get a s
24e0: 6c 69 67 68 74 6c 79 20 6c 6f 77 65 72 20 63 6f  lightly lower co
24f0: 73 74 20 77 68 69 63 68 20 74 65 6e 64 73 20 74  st which tends t
2500: 6f 20 6d 6f 76 65 20 74 68 65 6d 20 74 6f 77 61  o move them towa
2510: 72 64 0a 2a 2a 20 74 68 65 20 74 6f 70 20 6f 66  rd.** the top of
2520: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 74   the list of alt
2530: 65 72 6e 61 74 69 76 65 20 73 70 65 6c 6c 69 6e  ernative spellin
2540: 67 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 72 61  gs..**.** A stra
2550: 69 67 68 74 66 6f 72 77 61 72 64 20 69 6d 70 6c  ightforward impl
2560: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20  ementation of a 
2570: 73 70 65 6c 6c 69 6e 67 20 63 6f 72 72 65 63 74  spelling correct
2580: 6f 72 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 74  or would be.** t
2590: 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 20 73 65  o compare the se
25a0: 61 72 63 68 20 74 65 72 6d 20 61 67 61 69 6e 73  arch term agains
25b0: 74 20 65 76 65 72 79 20 77 6f 72 64 20 69 6e 20  t every word in 
25c0: 74 68 65 20 76 6f 63 61 62 75 6c 61 72 79 0a 2a  the vocabulary.*
25d0: 2a 20 61 6e 64 20 73 65 6c 65 63 74 20 74 68 65  * and select the
25e0: 20 32 30 20 77 69 74 68 20 74 68 65 20 6c 6f 77   20 with the low
25f0: 65 73 74 20 73 63 6f 72 65 73 2e 20 20 48 6f 77  est scores.  How
2600: 65 76 65 72 2c 20 74 68 65 72 65 20 77 69 6c 6c  ever, there will
2610: 20 0a 2a 2a 20 74 79 70 69 63 61 6c 6c 79 20 62   .** typically b
2620: 65 20 68 75 6e 64 72 65 64 73 20 6f 66 20 74 68  e hundreds of th
2630: 6f 75 73 61 6e 64 73 20 6f 72 20 6d 69 6c 6c 69  ousands or milli
2640: 6f 6e 73 20 6f 66 20 77 6f 72 64 73 20 69 6e 20  ons of words in 
2650: 74 68 65 0a 2a 2a 20 76 6f 63 61 62 75 6c 61 72  the.** vocabular
2660: 79 2c 20 61 6e 64 20 73 6f 20 74 68 69 73 20 61  y, and so this a
2670: 70 70 72 6f 61 63 68 20 69 73 20 6e 6f 74 20 66  pproach is not f
2680: 61 73 74 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a  ast enough..**.*
2690: 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 74 65  * Suppose the te
26a0: 72 6d 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  rm that is being
26b0: 20 73 70 65 6c 6c 2d 63 6f 72 72 65 63 74 65 64   spell-corrected
26c0: 20 69 73 20 58 2e 20 20 54 6f 20 6c 69 6d 69 74   is X.  To limit
26d0: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 73  .** the search s
26e0: 70 61 63 65 2c 20 58 20 69 73 20 63 6f 6e 76 65  pace, X is conve
26f0: 72 74 65 64 20 74 6f 20 61 20 6b 32 2d 6c 69 6b  rted to a k2-lik
2700: 65 20 6b 65 79 20 75 73 69 6e 67 20 74 68 65 0a  e key using the.
2710: 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6f 66  ** equivalent of
2720: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6b 65 79 20 3d  :.**.**    key =
2730: 20 73 70 65 6c 6c 66 69 78 31 5f 70 68 6f 6e 65   spellfix1_phone
2740: 68 61 73 68 28 6c 6f 77 65 72 28 73 70 65 6c 6c  hash(lower(spell
2750: 66 69 78 31 5f 74 72 61 6e 73 6c 69 74 28 58 29  fix1_translit(X)
2760: 29 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6b 65  )).**.** This ke
2770: 79 20 69 73 20 74 68 65 6e 20 6c 69 6d 69 74 65  y is then limite
2780: 64 20 74 6f 20 22 73 63 6f 70 65 22 20 63 68 61  d to "scope" cha
2790: 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 64 65  racters.  The de
27a0: 66 61 75 6c 74 20 73 63 6f 70 65 0a 2a 2a 20 76  fault scope.** v
27b0: 61 6c 75 65 20 69 73 20 34 2c 20 62 75 74 20 61  alue is 4, but a
27c0: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 63  n alternative sc
27d0: 6f 70 65 20 63 61 6e 20 62 65 20 73 70 65 63 69  ope can be speci
27e0: 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 0a 2a  fied using the.*
27f0: 2a 20 22 73 63 6f 70 65 3d 4e 22 20 74 65 72 6d  * "scope=N" term
2800: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2810: 61 75 73 65 2e 20 20 41 66 74 65 72 20 74 68 65  ause.  After the
2820: 20 6b 65 79 20 68 61 73 20 62 65 65 6e 20 74 72   key has been tr
2830: 75 6e 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20  uncated,.** the 
2840: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 69 73  edit distance is
2850: 20 72 75 6e 20 61 67 61 69 6e 73 74 20 65 76 65   run against eve
2860: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 76  ry term in the v
2870: 6f 63 61 62 75 6c 61 72 79 20 74 68 61 74 0a 2a  ocabulary that.*
2880: 2a 20 68 61 73 20 61 20 6b 32 20 76 61 6c 75 65  * has a k2 value
2890: 20 74 68 61 74 20 62 65 67 69 6e 73 20 77 69 74   that begins wit
28a0: 68 20 74 68 65 20 61 62 62 72 65 76 69 61 74 65  h the abbreviate
28b0: 64 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  d key..**.** For
28c0: 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
28d0: 65 20 74 68 65 20 69 6e 70 75 74 20 77 6f 72 64  e the input word
28e0: 20 69 73 20 22 50 61 73 6b 61 67 75 6c 61 22 2e   is "Paskagula".
28f0: 20 20 54 68 65 20 70 68 6f 6e 65 74 69 63 20 0a    The phonetic .
2900: 2a 2a 20 6b 65 79 20 69 73 20 22 42 41 43 41 43  ** key is "BACAC
2910: 41 4c 41 22 20 77 68 69 63 68 20 69 73 20 74 68  ALA" which is th
2920: 65 6e 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  en truncated to 
2930: 34 20 63 68 61 72 61 63 74 65 72 73 20 22 42 41  4 characters "BA
2940: 43 41 22 2e 0a 2a 2a 20 54 68 65 20 65 64 69 74  CA"..** The edit
2950: 20 64 69 73 74 61 6e 63 65 20 69 73 20 74 68 65   distance is the
2960: 6e 20 72 75 6e 20 6f 6e 20 74 68 65 20 34 39 38  n run on the 498
2970: 30 20 65 6e 74 72 69 65 73 20 28 6f 75 74 20 6f  0 entries (out o
2980: 66 0a 2a 2a 20 32 37 32 2c 35 39 37 20 65 6e 74  f.** 272,597 ent
2990: 72 69 65 73 20 74 6f 74 61 6c 29 20 6f 66 20 74  ries total) of t
29a0: 68 65 20 76 6f 63 61 62 75 6c 61 72 79 20 77 68  he vocabulary wh
29b0: 6f 73 65 20 6b 32 20 76 61 6c 75 65 73 20 62 65  ose k2 values be
29c0: 67 69 6e 20 77 69 74 68 0a 2a 2a 20 42 41 43 41  gin with.** BACA
29d0: 2c 20 79 69 65 6c 64 69 6e 67 20 22 50 61 73 63  , yielding "Pasc
29e0: 61 67 6f 75 6c 61 22 20 61 73 20 74 68 65 20 62  agoula" as the b
29f0: 65 73 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 0a 2a  est match..** .*
2a00: 2a 20 4f 6e 6c 79 20 74 65 72 6d 73 20 6f 66 20  * Only terms of 
2a10: 74 68 65 20 76 6f 63 61 62 75 6c 61 72 79 20 77  the vocabulary w
2a20: 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 20 6c  ith a matching l
2a30: 61 6e 67 69 64 20 61 72 65 20 73 65 61 72 63 68  angid are search
2a40: 65 64 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 74 68  ed..** Hence, th
2a50: 65 20 73 61 6d 65 20 74 61 62 6c 65 20 63 61 6e  e same table can
2a60: 20 63 6f 6e 74 61 69 6e 20 65 6e 74 72 69 65 73   contain entries
2a70: 20 66 72 6f 6d 20 6d 75 6c 74 69 70 6c 65 20 6c   from multiple l
2a80: 61 6e 67 75 61 67 65 73 0a 2a 2a 20 61 6e 64 20  anguages.** and 
2a90: 6f 6e 6c 79 20 74 68 65 20 72 65 71 75 65 73 74  only the request
2aa0: 65 64 20 6c 61 6e 67 75 61 67 65 20 77 69 6c 6c  ed language will
2ab0: 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 64   be used.  The d
2ac0: 65 66 61 75 6c 74 20 6c 61 6e 67 69 64 0a 2a 2a  efault langid.**
2ad0: 20 69 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 44 45 41   is 0..**.** DEA
2ae0: 4c 49 4e 47 20 57 49 54 48 20 55 4e 55 53 55 41  LING WITH UNUSUA
2af0: 4c 20 41 4e 44 20 44 49 46 46 49 43 55 4c 54 20  L AND DIFFICULT 
2b00: 53 50 45 4c 4c 49 4e 47 53 0a 2a 2a 0a 2a 2a 20  SPELLINGS.**.** 
2b10: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 61 62  The algorithm ab
2b20: 6f 76 65 20 77 6f 72 6b 73 20 71 75 69 74 65 20  ove works quite 
2b30: 77 65 6c 6c 20 66 6f 72 20 6d 6f 73 74 20 63 61  well for most ca
2b40: 73 65 73 2c 20 62 75 74 20 74 68 65 72 65 20 61  ses, but there a
2b50: 72 65 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 73  re.** exceptions
2b60: 2e 20 20 54 68 65 73 65 20 65 78 63 65 70 74 69  .  These excepti
2b70: 6f 6e 73 20 63 61 6e 20 62 65 20 64 65 61 6c 74  ons can be dealt
2b80: 20 77 69 74 68 20 62 79 20 6d 61 6b 69 6e 67 20   with by making 
2b90: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 65 6e  additional.** en
2ba0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 76 69 72  tries in the vir
2bb0: 74 75 61 6c 20 74 61 62 6c 65 20 75 73 69 6e 67  tual table using
2bc0: 20 74 68 65 20 22 73 6f 75 6e 64 73 6c 69 6b 65   the "soundslike
2bd0: 22 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  " column..**.** 
2be0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 6d 61 6e  For example, man
2bf0: 79 20 77 6f 72 64 73 20 6f 66 20 47 72 65 65 6b  y words of Greek
2c00: 20 6f 72 69 67 69 6e 20 62 65 67 69 6e 20 77 69   origin begin wi
2c10: 74 68 20 6c 65 74 74 65 72 73 20 22 70 73 22 20  th letters "ps" 
2c20: 77 68 65 72 65 0a 2a 2a 20 74 68 65 20 22 70 22  where.** the "p"
2c30: 20 69 73 20 73 69 6c 65 6e 74 2e 20 20 45 78 3a   is silent.  Ex:
2c40: 20 20 70 73 61 6c 6d 2c 20 70 73 65 75 64 6f 6e    psalm, pseudon
2c50: 79 6d 2c 20 70 73 6f 72 69 61 73 69 73 2c 20 70  ym, psoriasis, p
2c60: 73 79 63 68 65 2e 20 20 49 6e 0a 2a 2a 20 61 6e  syche.  In.** an
2c70: 6f 74 68 65 72 20 65 78 61 6d 70 6c 65 2c 20 6d  other example, m
2c80: 61 6e 79 20 53 63 6f 74 74 69 73 68 20 73 75 72  any Scottish sur
2c90: 6e 61 6d 65 73 20 63 61 6e 20 62 65 20 73 70 65  names can be spe
2ca0: 6c 6c 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  lled with an.** 
2cb0: 69 6e 69 74 69 61 6c 20 22 4d 61 63 22 20 6f 72  initial "Mac" or
2cc0: 20 22 4d 63 22 2e 20 20 54 68 75 73 2c 20 22 4d   "Mc".  Thus, "M
2cd0: 61 63 4b 61 79 22 20 61 6e 64 20 22 4d 63 4b 61  acKay" and "McKa
2ce0: 79 22 20 61 72 65 20 62 6f 74 68 20 70 72 6f 6e  y" are both pron
2cf0: 6f 75 6e 63 65 64 0a 2a 2a 20 74 68 65 20 73 61  ounced.** the sa
2d00: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 6f 6d 6d  me..**.** Accomm
2d10: 6f 64 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 6d  odation can be m
2d20: 61 64 65 20 66 6f 72 20 77 6f 72 64 73 20 74 68  ade for words th
2d30: 61 74 20 61 72 65 20 6e 6f 74 20 73 70 65 6c 6c  at are not spell
2d40: 65 64 20 61 73 20 74 68 65 79 0a 2a 2a 20 73 6f  ed as they.** so
2d50: 75 6e 64 20 62 79 20 6d 61 6b 69 6e 67 20 61 64  und by making ad
2d60: 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
2d70: 20 69 6e 74 6f 20 74 68 65 20 76 69 72 74 75 61   into the virtua
2d80: 6c 20 74 61 62 6c 65 20 66 6f 72 20 74 68 65 0a  l table for the.
2d90: 2a 2a 20 73 61 6d 65 20 77 6f 72 64 2c 20 62 75  ** same word, bu
2da0: 74 20 61 64 64 69 6e 67 20 61 6e 20 61 6c 74 65  t adding an alte
2db0: 72 6e 61 74 69 76 65 20 73 70 65 6c 6c 69 6e 67  rnative spelling
2dc0: 20 69 6e 20 74 68 65 20 22 73 6f 75 6e 64 73 6c   in the "soundsl
2dd0: 69 6b 65 22 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20  ike".** column. 
2de0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
2df0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 65 6e 74 72  e canonical entr
2e00: 79 20 66 6f 72 20 22 70 73 61 6c 6d 22 20 77 6f  y for "psalm" wo
2e10: 75 6c 64 20 62 65 20 74 68 69 73 3a 0a 2a 2a 0a  uld be this:.**.
2e20: 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  **   INSERT INTO
2e30: 20 64 65 6d 6f 28 77 6f 72 64 29 20 56 41 4c 55   demo(word) VALU
2e40: 45 53 28 27 70 73 61 6c 6d 27 29 3b 0a 2a 2a 0a  ES('psalm');.**.
2e50: 2a 2a 20 54 6f 20 65 6e 68 61 6e 63 65 20 74 68  ** To enhance th
2e60: 65 20 61 62 69 6c 69 74 79 20 74 6f 20 63 6f 72  e ability to cor
2e70: 72 65 63 74 20 74 68 65 20 73 70 65 6c 6c 69 6e  rect the spellin
2e80: 67 20 6f 66 20 22 73 61 6c 6d 22 20 69 6e 74 6f  g of "salm" into
2e90: 0a 2a 2a 20 22 70 73 61 6c 6d 22 2c 20 6d 61 6b  .** "psalm", mak
2ea0: 65 20 61 6e 20 61 64 64 69 74 69 6f 6e 20 65 6e  e an addition en
2eb0: 74 72 79 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  try like this:.*
2ec0: 2a 0a 2a 2a 20 20 20 49 4e 53 45 52 54 20 49 4e  *.**   INSERT IN
2ed0: 54 4f 20 64 65 6d 6f 28 77 6f 72 64 2c 73 6f 75  TO demo(word,sou
2ee0: 6e 64 73 6c 69 6b 65 29 20 56 41 4c 55 45 53 28  ndslike) VALUES(
2ef0: 27 70 73 61 6c 6d 27 2c 27 73 61 6c 6d 27 29 3b  'psalm','salm');
2f00: 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6f 6b 20  .**.** It is ok 
2f10: 74 6f 20 6d 61 6b 65 20 6d 75 6c 74 69 70 6c 65  to make multiple
2f20: 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
2f30: 20 73 61 6d 65 20 77 6f 72 64 20 61 73 20 6c 6f   same word as lo
2f40: 6e 67 20 61 73 0a 2a 2a 20 65 61 63 68 20 65 6e  ng as.** each en
2f50: 74 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72  try has a differ
2f60: 65 6e 74 20 73 6f 75 6e 64 73 6c 69 6b 65 20 76  ent soundslike v
2f70: 61 6c 75 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  alue.  Note that
2f80: 20 69 66 20 6e 6f 0a 2a 2a 20 73 6f 75 6e 64 73   if no.** sounds
2f90: 6c 69 6b 65 20 76 61 6c 75 65 20 69 73 20 73 70  like value is sp
2fa0: 65 63 69 66 69 65 64 2c 20 74 68 65 20 73 6f 75  ecified, the sou
2fb0: 6e 64 73 6c 69 6b 65 20 64 65 66 61 75 6c 74 73  ndslike defaults
2fc0: 20 74 6f 20 74 68 65 20 77 6f 72 64 0a 2a 2a 20   to the word.** 
2fd0: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 4c 69  itself..**.** Li
2fe0: 73 74 65 64 20 62 65 6c 6f 77 20 61 72 65 20 73  sted below are s
2ff0: 6f 6d 65 20 63 61 73 65 73 20 77 68 65 72 65 20  ome cases where 
3000: 69 74 20 6d 69 67 68 74 20 6d 61 6b 65 20 73 65  it might make se
3010: 6e 73 65 20 74 6f 20 61 64 64 20 61 64 64 69 74  nse to add addit
3020: 69 6f 6e 61 6c 0a 2a 2a 20 73 6f 75 6e 64 73 6c  ional.** soundsl
3030: 69 6b 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ike entries.  Th
3040: 65 20 73 70 65 63 69 66 69 63 20 65 6e 74 72 69  e specific entri
3050: 65 73 20 77 69 6c 6c 20 64 65 70 65 6e 64 20 6f  es will depend o
3060: 6e 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  n the applicatio
3070: 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 74 61 72  n.** and the tar
3080: 67 65 74 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  get language..**
3090: 0a 2a 2a 20 20 20 2a 20 20 20 53 69 6c 65 6e 74  .**   *   Silent
30a0: 20 22 70 22 20 69 6e 20 77 6f 72 64 73 20 62 65   "p" in words be
30b0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 22 70 73  ginning with "ps
30c0: 22 3a 20 20 70 73 61 6c 6d 2c 20 70 73 79 63 68  ":  psalm, psych
30d0: 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 20 53 69  e.**.**   *   Si
30e0: 6c 65 6e 74 20 22 70 22 20 69 6e 20 77 6f 72 64  lent "p" in word
30f0: 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  s beginning with
3100: 20 22 70 6e 22 3a 20 20 70 6e 65 75 6d 6f 6e 69   "pn":  pneumoni
3110: 61 2c 20 70 6e 65 75 6d 61 74 69 63 0a 2a 2a 0a  a, pneumatic.**.
3120: 2a 2a 20 20 20 2a 20 20 20 53 69 6c 65 6e 74 20  **   *   Silent 
3130: 22 70 22 20 69 6e 20 77 6f 72 64 73 20 62 65 67  "p" in words beg
3140: 69 6e 6e 69 6e 67 20 77 69 74 68 20 22 70 74 22  inning with "pt"
3150: 3a 20 20 70 74 65 72 6f 64 61 63 74 79 6c 2c 20  :  pterodactyl, 
3160: 70 74 6f 6c 65 6d 61 69 63 0a 2a 2a 0a 2a 2a 20  ptolemaic.**.** 
3170: 20 20 2a 20 20 20 53 69 6c 65 6e 74 20 22 64 22    *   Silent "d"
3180: 20 69 6e 20 77 6f 72 64 73 20 62 65 67 69 6e 6e   in words beginn
3190: 69 6e 67 20 77 69 74 68 20 22 64 6a 22 3a 20 20  ing with "dj":  
31a0: 64 6a 69 6e 6e 2c 20 44 6a 69 6b 61 72 74 61 0a  djinn, Djikarta.
31b0: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 20 53 69 6c 65  **.**   *   Sile
31c0: 6e 74 20 22 6b 22 20 69 6e 20 77 6f 72 64 73 20  nt "k" in words 
31d0: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 22  beginning with "
31e0: 6b 6e 22 3a 20 20 6b 6e 69 67 68 74 2c 20 4b 6e  kn":  knight, Kn
31f0: 75 74 68 73 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 2a  uthson.**.**   *
3200: 20 20 20 53 69 6c 65 6e 74 20 22 67 22 20 69 6e     Silent "g" in
3210: 20 77 6f 72 64 73 20 62 65 67 69 6e 6e 69 6e 67   words beginning
3220: 20 77 69 74 68 20 22 67 6e 22 3a 20 20 67 6e 61   with "gn":  gna
3230: 72 6c 79 2c 20 67 6e 6f 6d 65 2c 20 67 6e 61 74  rly, gnome, gnat
3240: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 20 22 4d 61  .**.**   *   "Ma
3250: 63 22 20 76 65 72 73 75 73 20 22 4d 63 22 20 62  c" versus "Mc" b
3260: 65 67 69 6e 6e 69 6e 67 20 53 63 6f 74 74 69 73  eginning Scottis
3270: 68 20 73 75 72 6e 61 6d 65 73 0a 2a 2a 0a 2a 2a  h surnames.**.**
3280: 20 20 20 2a 20 20 20 22 54 63 68 22 20 73 6f 75     *   "Tch" sou
3290: 6e 64 73 20 69 6e 20 53 6c 61 76 69 63 20 77 6f  nds in Slavic wo
32a0: 72 64 73 3a 20 20 54 63 68 61 69 6b 6f 76 73 6b  rds:  Tchaikovsk
32b0: 79 20 76 73 2e 20 43 68 61 79 6b 6f 76 73 6b 79  y vs. Chaykovsky
32c0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 20 54 68 65  .**.**   *   The
32d0: 20 6c 65 74 74 65 72 20 22 6a 22 20 70 72 6f 6e   letter "j" pron
32e0: 6f 75 6e 63 65 64 20 6c 69 6b 65 20 22 68 22 20  ounced like "h" 
32f0: 69 6e 20 53 70 61 6e 69 73 68 3a 20 20 4c 61 4a  in Spanish:  LaJ
3300: 6f 6c 6c 61 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  olla.**.**   *  
3310: 20 57 6f 72 64 73 20 62 65 67 69 6e 6e 69 6e 67   Words beginning
3320: 20 77 69 74 68 20 22 77 72 22 20 76 65 72 73 75   with "wr" versu
3330: 73 20 22 72 22 3a 20 20 77 72 69 74 65 20 76 73  s "r":  write vs
3340: 2e 20 72 69 74 65 0a 2a 2a 0a 2a 2a 20 20 20 2a  . rite.**.**   *
3350: 20 20 20 4d 69 73 63 65 6c 6c 61 6e 6f 75 73 20     Miscellanous 
3360: 70 72 6f 62 6c 65 6d 20 77 6f 72 64 73 20 73 75  problem words su
3370: 63 68 20 61 73 20 22 64 65 62 74 22 2c 20 22 74  ch as "debt", "t
3380: 73 65 74 73 65 22 2c 0a 2a 2a 20 20 20 20 20 20  setse",.**      
3390: 20 22 4e 67 75 79 65 6e 22 2c 20 22 56 61 6e 20   "Nguyen", "Van 
33a0: 4e 75 79 65 73 22 2e 0a 2a 2f 0a 23 69 66 20 53  Nuyes"..*/.#if S
33b0: 51 4c 49 54 45 5f 43 4f 52 45 0a 23 20 69 6e 63  QLITE_CORE.# inc
33c0: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
33d0: 68 22 0a 23 65 6c 73 65 0a 23 20 69 6e 63 6c 75  h".#else.# inclu
33e0: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20  de <string.h>.# 
33f0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68  include <stdio.h
3400: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 64  >.# include <std
3410: 6c 69 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  lib.h>.# include
3420: 20 22 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a   "sqlite3ext.h".
3430: 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
3440: 4f 4e 5f 49 4e 49 54 31 0a 23 65 6e 64 69 66 20  ON_INIT1.#endif 
3450: 2f 2a 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 20  /* !SQLITE_CORE 
3460: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79  */.#include <cty
3470: 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  pe.h>../*.** Cha
3480: 72 61 63 74 65 72 20 63 6c 61 73 73 65 73 20 66  racter classes f
3490: 6f 72 20 41 53 43 49 49 20 63 68 61 72 61 63 74  or ASCII charact
34a0: 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 20 20  ers:.**.**   0  
34b0: 20 27 27 20 20 20 20 20 20 20 20 53 69 6c 65 6e   ''        Silen
34c0: 74 20 6c 65 74 74 65 72 73 3a 20 20 20 48 20 57  t letters:   H W
34d0: 0a 2a 2a 20 20 20 31 20 20 20 27 41 27 20 20 20  .**   1   'A'   
34e0: 20 20 20 20 41 6e 79 20 76 6f 77 65 6c 3a 20 20      Any vowel:  
34f0: 20 41 20 45 20 49 20 4f 20 55 20 28 59 29 0a 2a   A E I O U (Y).*
3500: 2a 20 20 20 32 20 20 20 27 42 27 20 20 20 20 20  *   2   'B'     
3510: 20 20 41 20 62 69 6c 61 62 65 61 6c 20 73 74 6f    A bilabeal sto
3520: 70 20 6f 72 20 66 72 69 63 61 74 69 76 65 3a 20  p or fricative: 
3530: 20 42 20 46 20 50 20 56 0a 2a 2a 20 20 20 33 20   B F P V.**   3 
3540: 20 20 27 43 27 20 20 20 20 20 20 20 4f 74 68 65    'C'       Othe
3550: 72 20 66 72 69 63 61 74 69 76 65 73 20 6f 72 20  r fricatives or 
3560: 62 61 63 6b 20 73 74 6f 70 73 3a 20 20 43 20 47  back stops:  C G
3570: 20 4a 20 4b 20 51 20 53 20 58 20 5a 0a 2a 2a 20   J K Q S X Z.** 
3580: 20 20 34 20 20 20 27 44 27 20 20 20 20 20 20 20    4   'D'       
3590: 41 6c 76 65 6f 6c 61 72 20 73 74 6f 70 73 3a 20  Alveolar stops: 
35a0: 20 44 20 54 0a 2a 2a 20 20 20 35 20 20 20 27 48   D T.**   5   'H
35b0: 27 20 20 20 20 20 20 20 4c 65 74 74 65 72 20 48  '       Letter H
35c0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
35d0: 67 20 6f 66 20 61 20 77 6f 72 64 0a 2a 2a 20 20  g of a word.**  
35e0: 20 36 20 20 20 27 4c 27 20 20 20 20 20 20 20 47   6   'L'       G
35f0: 6c 69 64 65 3a 20 20 4c 0a 2a 2a 20 20 20 37 20  lide:  L.**   7 
3600: 20 20 27 52 27 20 20 20 20 20 20 20 53 65 6d 69    'R'       Semi
3610: 76 6f 77 65 6c 3a 20 20 52 0a 2a 2a 20 20 20 38  vowel:  R.**   8
3620: 20 20 20 27 4d 27 20 20 20 20 20 20 20 4e 61 73     'M'       Nas
3630: 61 6c 73 3a 20 20 4d 20 4e 0a 2a 2a 20 20 20 39  als:  M N.**   9
3640: 20 20 20 27 57 27 20 20 20 20 20 20 20 4c 65 74     'W'       Let
3650: 74 65 72 20 57 20 61 74 20 74 68 65 20 62 65 67  ter W at the beg
3660: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 77 6f 72 64  inning of a word
3670: 0a 2a 2a 20 20 20 31 30 20 20 27 59 27 20 20 20  .**   10  'Y'   
3680: 20 20 20 20 4c 65 74 74 65 72 20 59 20 61 74 20      Letter Y at 
3690: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
36a0: 20 61 20 77 6f 72 64 2e 0a 2a 2a 20 20 20 31 31   a word..**   11
36b0: 20 20 27 39 27 20 20 20 20 20 20 20 41 20 64 69    '9'       A di
36c0: 67 69 74 3a 20 30 20 31 20 32 20 33 20 34 20 35  git: 0 1 2 3 4 5
36d0: 20 36 20 37 20 38 20 39 0a 2a 2a 20 20 20 31 32   6 7 8 9.**   12
36e0: 20 20 27 20 27 20 20 20 20 20 20 20 57 68 69 74    ' '       Whit
36f0: 65 20 73 70 61 63 65 0a 2a 2a 20 20 20 31 33 20  e space.**   13 
3700: 20 27 3f 27 20 20 20 20 20 20 20 4f 74 68 65 72   '?'       Other
3710: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 43 4c  ..*/.#define CCL
3720: 41 53 53 5f 53 49 4c 45 4e 54 20 20 20 20 20 20  ASS_SILENT      
3730: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 43 43 4c     0.#define CCL
3740: 41 53 53 5f 56 4f 57 45 4c 20 20 20 20 20 20 20  ASS_VOWEL       
3750: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 43 43 4c     1.#define CCL
3760: 41 53 53 5f 42 20 20 20 20 20 20 20 20 20 20 20  ASS_B           
3770: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 43 43 4c     2.#define CCL
3780: 41 53 53 5f 43 20 20 20 20 20 20 20 20 20 20 20  ASS_C           
3790: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 43 43 4c     3.#define CCL
37a0: 41 53 53 5f 44 20 20 20 20 20 20 20 20 20 20 20  ASS_D           
37b0: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 43 43 4c     4.#define CCL
37c0: 41 53 53 5f 48 20 20 20 20 20 20 20 20 20 20 20  ASS_H           
37d0: 20 20 20 35 0a 23 64 65 66 69 6e 65 20 43 43 4c     5.#define CCL
37e0: 41 53 53 5f 4c 20 20 20 20 20 20 20 20 20 20 20  ASS_L           
37f0: 20 20 20 36 0a 23 64 65 66 69 6e 65 20 43 43 4c     6.#define CCL
3800: 41 53 53 5f 52 20 20 20 20 20 20 20 20 20 20 20  ASS_R           
3810: 20 20 20 37 0a 23 64 65 66 69 6e 65 20 43 43 4c     7.#define CCL
3820: 41 53 53 5f 4d 20 20 20 20 20 20 20 20 20 20 20  ASS_M           
3830: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 43 43 4c     8.#define CCL
3840: 41 53 53 5f 57 20 20 20 20 20 20 20 20 20 20 20  ASS_W           
3850: 20 20 20 39 0a 23 64 65 66 69 6e 65 20 43 43 4c     9.#define CCL
3860: 41 53 53 5f 59 20 20 20 20 20 20 20 20 20 20 20  ASS_Y           
3870: 20 20 31 30 0a 23 64 65 66 69 6e 65 20 43 43 4c    10.#define CCL
3880: 41 53 53 5f 44 49 47 49 54 20 20 20 20 20 20 20  ASS_DIGIT       
3890: 20 20 31 31 0a 23 64 65 66 69 6e 65 20 43 43 4c    11.#define CCL
38a0: 41 53 53 5f 53 50 41 43 45 20 20 20 20 20 20 20  ASS_SPACE       
38b0: 20 20 31 32 0a 23 64 65 66 69 6e 65 20 43 43 4c    12.#define CCL
38c0: 41 53 53 5f 4f 54 48 45 52 20 20 20 20 20 20 20  ASS_OTHER       
38d0: 20 20 31 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20    13../*.** The 
38e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
38f0: 67 69 76 65 73 20 74 68 65 20 63 68 61 72 61 63  gives the charac
3900: 74 65 72 20 63 6c 61 73 73 20 66 6f 72 20 6e 6f  ter class for no
3910: 6e 2d 69 6e 69 74 69 61 6c 20 41 53 43 49 49 0a  n-initial ASCII.
3920: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ** characters..*
3930: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
3940: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 69 64  nsigned char mid
3950: 43 6c 61 73 73 5b 5d 20 3d 20 7b 0a 20 2f 2a 20  Class[] = {. /* 
3960: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
3970: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
3980: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
3990: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
39a0: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
39b0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
39c0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
39d0: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
39e0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
39f0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
3a00: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
3a10: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
3a20: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
3a30: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
3a40: 41 53 53 5f 53 50 41 43 45 2c 20 20 20 20 2f 2a  ASS_SPACE,    /*
3a50: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
3a60: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
3a70: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
3a80: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43    */ CCLASS_SPAC
3a90: 45 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  E,    /*   */ CC
3aa0: 4c 41 53 53 5f 53 50 41 43 45 2c 20 20 20 2f 2a  LASS_SPACE,   /*
3ab0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
3ac0: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
3ad0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
3ae0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
3af0: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
3b00: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
3b10: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
3b20: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
3b30: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
3b40: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
3b50: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
3b60: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
3b70: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
3b80: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
3b90: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
3ba0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
3bb0: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
3bc0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
3bd0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
3be0: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
3bf0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
3c00: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
3c10: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
3c20: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
3c30: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
3c40: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
3c50: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
3c60: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41     */ CCLASS_SPA
3c70: 43 45 2c 0a 20 2f 2a 20 21 20 2a 2f 20 43 43 4c  CE,. /* ! */ CCL
3c80: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
3c90: 20 22 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   " */ CCLASS_OTH
3ca0: 45 52 2c 20 20 20 2f 2a 20 23 20 2a 2f 20 43 43  ER,   /* # */ CC
3cb0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
3cc0: 24 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  $ */ CCLASS_OTHE
3cd0: 52 2c 20 20 20 20 2f 2a 20 25 20 2a 2f 20 43 43  R,    /* % */ CC
3ce0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
3cf0: 20 26 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   & */ CCLASS_OTH
3d00: 45 52 2c 0a 20 2f 2a 20 27 20 2a 2f 20 43 43 4c  ER,. /* ' */ CCL
3d10: 41 53 53 5f 53 49 4c 45 4e 54 2c 20 20 20 2f 2a  ASS_SILENT,   /*
3d20: 20 28 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ( */ CCLASS_OTH
3d30: 45 52 2c 20 20 20 2f 2a 20 29 20 2a 2f 20 43 43  ER,   /* ) */ CC
3d40: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
3d50: 2a 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  * */ CCLASS_OTHE
3d60: 52 2c 20 20 20 20 2f 2a 20 2b 20 2a 2f 20 43 43  R,    /* + */ CC
3d70: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
3d80: 20 2c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   , */ CCLASS_OTH
3d90: 45 52 2c 0a 20 2f 2a 20 2d 20 2a 2f 20 43 43 4c  ER,. /* - */ CCL
3da0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
3db0: 20 2e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   . */ CCLASS_OTH
3dc0: 45 52 2c 20 20 20 2f 2a 20 2f 20 2a 2f 20 43 43  ER,   /* / */ CC
3dd0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
3de0: 30 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  0 */ CCLASS_DIGI
3df0: 54 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 20 43 43  T,    /* 1 */ CC
3e00: 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a  LASS_DIGIT,   /*
3e10: 20 32 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   2 */ CCLASS_DIG
3e20: 49 54 2c 0a 20 2f 2a 20 33 20 2a 2f 20 43 43 4c  IT,. /* 3 */ CCL
3e30: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a  ASS_DIGIT,    /*
3e40: 20 34 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   4 */ CCLASS_DIG
3e50: 49 54 2c 20 20 20 2f 2a 20 35 20 2a 2f 20 43 43  IT,   /* 5 */ CC
3e60: 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20  LASS_DIGIT,. /* 
3e70: 36 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  6 */ CCLASS_DIGI
3e80: 54 2c 20 20 20 20 2f 2a 20 37 20 2a 2f 20 43 43  T,    /* 7 */ CC
3e90: 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a  LASS_DIGIT,   /*
3ea0: 20 38 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   8 */ CCLASS_DIG
3eb0: 49 54 2c 0a 20 2f 2a 20 39 20 2a 2f 20 43 43 4c  IT,. /* 9 */ CCL
3ec0: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a  ASS_DIGIT,    /*
3ed0: 20 3a 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   : */ CCLASS_OTH
3ee0: 45 52 2c 20 20 20 2f 2a 20 3b 20 2a 2f 20 43 43  ER,   /* ; */ CC
3ef0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
3f00: 3c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  < */ CCLASS_OTHE
3f10: 52 2c 20 20 20 20 2f 2a 20 3d 20 2a 2f 20 43 43  R,    /* = */ CC
3f20: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
3f30: 20 3e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   > */ CCLASS_OTH
3f40: 45 52 2c 0a 20 2f 2a 20 3f 20 2a 2f 20 43 43 4c  ER,. /* ? */ CCL
3f50: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
3f60: 20 40 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   @ */ CCLASS_OTH
3f70: 45 52 2c 20 20 20 2f 2a 20 41 20 2a 2f 20 43 43  ER,   /* A */ CC
3f80: 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20  LASS_VOWEL,. /* 
3f90: 42 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20  B */ CCLASS_B,  
3fa0: 20 20 20 20 20 20 2f 2a 20 43 20 2a 2f 20 43 43        /* C */ CC
3fb0: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a  LASS_C,       /*
3fc0: 20 44 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a   D */ CCLASS_D,.
3fd0: 20 2f 2a 20 45 20 2a 2f 20 43 43 4c 41 53 53 5f   /* E */ CCLASS_
3fe0: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 46 20 2a  VOWEL,    /* F *
3ff0: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
4000: 20 20 2f 2a 20 47 20 2a 2f 20 43 43 4c 41 53 53    /* G */ CCLASS
4010: 5f 43 2c 0a 20 2f 2a 20 48 20 2a 2f 20 43 43 4c  _C,. /* H */ CCL
4020: 41 53 53 5f 53 49 4c 45 4e 54 2c 20 20 20 2f 2a  ASS_SILENT,   /*
4030: 20 49 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   I */ CCLASS_VOW
4040: 45 4c 2c 20 20 20 2f 2a 20 4a 20 2a 2f 20 43 43  EL,   /* J */ CC
4050: 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 4b 20 2a 2f  LASS_C,. /* K */
4060: 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20   CCLASS_C,      
4070: 20 20 2f 2a 20 4c 20 2a 2f 20 43 43 4c 41 53 53    /* L */ CCLASS
4080: 5f 4c 2c 20 20 20 20 20 20 20 2f 2a 20 4d 20 2a  _L,       /* M *
4090: 2f 20 43 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20  / CCLASS_M,. /* 
40a0: 4e 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 20 20  N */ CCLASS_M,  
40b0: 20 20 20 20 20 20 2f 2a 20 4f 20 2a 2f 20 43 43        /* O */ CC
40c0: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a  LASS_VOWEL,   /*
40d0: 20 50 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a   P */ CCLASS_B,.
40e0: 20 2f 2a 20 51 20 2a 2f 20 43 43 4c 41 53 53 5f   /* Q */ CCLASS_
40f0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 20 2a  C,        /* R *
4100: 2f 20 43 43 4c 41 53 53 5f 52 2c 20 20 20 20 20  / CCLASS_R,     
4110: 20 20 2f 2a 20 53 20 2a 2f 20 43 43 4c 41 53 53    /* S */ CCLASS
4120: 5f 43 2c 0a 20 2f 2a 20 54 20 2a 2f 20 43 43 4c  _C,. /* T */ CCL
4130: 41 53 53 5f 44 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_D,        /*
4140: 20 55 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   U */ CCLASS_VOW
4150: 45 4c 2c 20 20 20 2f 2a 20 56 20 2a 2f 20 43 43  EL,   /* V */ CC
4160: 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20 57 20 2a 2f  LASS_B,. /* W */
4170: 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c 20   CCLASS_SILENT, 
4180: 20 20 2f 2a 20 58 20 2a 2f 20 43 43 4c 41 53 53    /* X */ CCLASS
4190: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 59 20 2a  _C,       /* Y *
41a0: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a  / CCLASS_VOWEL,.
41b0: 20 2f 2a 20 5a 20 2a 2f 20 43 43 4c 41 53 53 5f   /* Z */ CCLASS_
41c0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 5b 20 2a  C,        /* [ *
41d0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
41e0: 20 20 2f 2a 20 5c 20 2a 2f 20 43 43 4c 41 53 53    /* \ */ CCLASS
41f0: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 5d 20 2a 2f  _OTHER,. /* ] */
4200: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
4210: 20 20 2f 2a 20 5e 20 2a 2f 20 43 43 4c 41 53 53    /* ^ */ CCLASS
4220: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 5f 20 2a  _OTHER,   /* _ *
4230: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
4240: 20 2f 2a 20 60 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ` */ CCLASS_
4250: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 61 20 2a  OTHER,    /* a *
4260: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
4270: 20 20 2f 2a 20 62 20 2a 2f 20 43 43 4c 41 53 53    /* b */ CCLASS
4280: 5f 42 2c 0a 20 2f 2a 20 63 20 2a 2f 20 43 43 4c  _B,. /* c */ CCL
4290: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_C,        /*
42a0: 20 64 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 20   d */ CCLASS_D, 
42b0: 20 20 20 20 20 20 2f 2a 20 65 20 2a 2f 20 43 43        /* e */ CC
42c0: 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20  LASS_VOWEL,. /* 
42d0: 66 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20  f */ CCLASS_B,  
42e0: 20 20 20 20 20 20 2f 2a 20 67 20 2a 2f 20 43 43        /* g */ CC
42f0: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a  LASS_C,       /*
4300: 20 68 20 2a 2f 20 43 43 4c 41 53 53 5f 53 49 4c   h */ CCLASS_SIL
4310: 45 4e 54 2c 0a 20 2f 2a 20 69 20 2a 2f 20 43 43  ENT,. /* i */ CC
4320: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 20 2f  LASS_VOWEL,    /
4330: 2a 20 6a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * j */ CCLASS_C,
4340: 20 20 20 20 20 20 20 2f 2a 20 6b 20 2a 2f 20 43         /* k */ C
4350: 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 6c 20 2a  CLASS_C,. /* l *
4360: 2f 20 43 43 4c 41 53 53 5f 4c 2c 20 20 20 20 20  / CCLASS_L,     
4370: 20 20 20 2f 2a 20 6d 20 2a 2f 20 43 43 4c 41 53     /* m */ CCLAS
4380: 53 5f 4d 2c 20 20 20 20 20 20 20 2f 2a 20 6e 20  S_M,       /* n 
4390: 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a  */ CCLASS_M,. /*
43a0: 20 6f 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   o */ CCLASS_VOW
43b0: 45 4c 2c 20 20 20 20 2f 2a 20 70 20 2a 2f 20 43  EL,    /* p */ C
43c0: 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20 2f  CLASS_B,       /
43d0: 2a 20 71 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * q */ CCLASS_C,
43e0: 0a 20 2f 2a 20 72 20 2a 2f 20 43 43 4c 41 53 53  . /* r */ CCLASS
43f0: 5f 52 2c 20 20 20 20 20 20 20 20 2f 2a 20 73 20  _R,        /* s 
4400: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20  */ CCLASS_C,    
4410: 20 20 20 2f 2a 20 74 20 2a 2f 20 43 43 4c 41 53     /* t */ CCLAS
4420: 53 5f 44 2c 0a 20 2f 2a 20 75 20 2a 2f 20 43 43  S_D,. /* u */ CC
4430: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 20 2f  LASS_VOWEL,    /
4440: 2a 20 76 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c  * v */ CCLASS_B,
4450: 20 20 20 20 20 20 20 2f 2a 20 77 20 2a 2f 20 43         /* w */ C
4460: 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c 0a 20 2f  CLASS_SILENT,. /
4470: 2a 20 78 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * x */ CCLASS_C,
4480: 20 20 20 20 20 20 20 20 2f 2a 20 79 20 2a 2f 20          /* y */ 
4490: 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20  CCLASS_VOWEL,   
44a0: 2f 2a 20 7a 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* z */ CCLASS_C
44b0: 2c 0a 20 2f 2a 20 7b 20 2a 2f 20 43 43 4c 41 53  ,. /* { */ CCLAS
44c0: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 7c  S_OTHER,    /* |
44d0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
44e0: 2c 20 20 20 2f 2a 20 7d 20 2a 2f 20 43 43 4c 41  ,   /* } */ CCLA
44f0: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 7e 20  SS_OTHER,. /* ~ 
4500: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
4510: 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41      /*   */ CCLA
4520: 53 53 5f 4f 54 48 45 52 2c 20 20 20 0a 7d 3b 0a  SS_OTHER,   .};.
4530: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 74 61 62 6c  /* .** This tabl
4540: 65 73 20 67 69 76 65 73 20 74 68 65 20 63 68 61  es gives the cha
4550: 72 61 63 74 65 72 20 63 6c 61 73 73 20 66 6f 72  racter class for
4560: 20 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72   ASCII character
4570: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 0a  s that form the.
4580: 2a 2a 20 69 6e 69 74 69 61 6c 20 63 68 61 72 61  ** initial chara
4590: 63 74 65 72 20 6f 66 20 61 20 77 6f 72 64 2e 20  cter of a word. 
45a0: 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72   The only differ
45b0: 65 6e 63 65 20 66 72 6f 6d 20 6d 69 64 43 6c 61  ence from midCla
45c0: 73 73 20 69 73 20 77 69 74 68 0a 2a 2a 20 74 68  ss is with.** th
45d0: 65 20 6c 65 74 74 65 72 73 20 48 2c 20 57 2c 20  e letters H, W, 
45e0: 61 6e 64 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  and Y..*/.static
45f0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4600: 63 68 61 72 20 69 6e 69 74 43 6c 61 73 73 5b 5d  char initClass[]
4610: 20 3d 20 7b 0a 20 2f 2a 20 20 20 2a 2f 20 43 43   = {. /*   */ CC
4620: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
4630: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
4640: 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43  HER,   /*   */ C
4650: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
4660: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
4670: 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43  ER,    /*   */ C
4680: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
4690: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
46a0: 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43  HER,. /*   */ CC
46b0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
46c0: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
46d0: 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43  HER,   /*   */ C
46e0: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
46f0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41     */ CCLASS_SPA
4700: 43 45 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43  CE,    /*   */ C
4710: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
4720: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
4730: 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43  HER,. /*   */ CC
4740: 4c 41 53 53 5f 53 50 41 43 45 2c 20 20 20 20 2f  LASS_SPACE,    /
4750: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50  *   */ CCLASS_SP
4760: 41 43 45 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43  ACE,   /*   */ C
4770: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
4780: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
4790: 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43  ER,    /*   */ C
47a0: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
47b0: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
47c0: 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43  HER,. /*   */ CC
47d0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
47e0: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
47f0: 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43  HER,   /*   */ C
4800: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
4810: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
4820: 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43  ER,    /*   */ C
4830: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
4840: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
4850: 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43  HER,. /*   */ CC
4860: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
4870: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
4880: 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43  HER,   /*   */ C
4890: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
48a0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
48b0: 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43  ER,    /*   */ C
48c0: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
48d0: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
48e0: 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43  HER,. /*   */ CC
48f0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
4900: 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  *   */ CCLASS_OT
4910: 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43  HER,   /*   */ C
4920: 43 4c 41 53 53 5f 53 50 41 43 45 2c 0a 20 2f 2a  CLASS_SPACE,. /*
4930: 20 21 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ! */ CCLASS_OTH
4940: 45 52 2c 20 20 20 20 2f 2a 20 22 20 2a 2f 20 43  ER,    /* " */ C
4950: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
4960: 2a 20 23 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * # */ CCLASS_OT
4970: 48 45 52 2c 0a 20 2f 2a 20 24 20 2a 2f 20 43 43  HER,. /* $ */ CC
4980: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
4990: 2a 20 25 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * % */ CCLASS_OT
49a0: 48 45 52 2c 20 20 20 2f 2a 20 26 20 2a 2f 20 43  HER,   /* & */ C
49b0: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
49c0: 20 27 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ' */ CCLASS_OTH
49d0: 45 52 2c 20 20 20 20 2f 2a 20 28 20 2a 2f 20 43  ER,    /* ( */ C
49e0: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
49f0: 2a 20 29 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * ) */ CCLASS_OT
4a00: 48 45 52 2c 0a 20 2f 2a 20 2a 20 2a 2f 20 43 43  HER,. /* * */ CC
4a10: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
4a20: 2a 20 2b 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * + */ CCLASS_OT
4a30: 48 45 52 2c 20 20 20 2f 2a 20 2c 20 2a 2f 20 43  HER,   /* , */ C
4a40: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
4a50: 20 2d 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   - */ CCLASS_OTH
4a60: 45 52 2c 20 20 20 20 2f 2a 20 2e 20 2a 2f 20 43  ER,    /* . */ C
4a70: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
4a80: 2a 20 2f 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * / */ CCLASS_OT
4a90: 48 45 52 2c 0a 20 2f 2a 20 30 20 2a 2f 20 43 43  HER,. /* 0 */ CC
4aa0: 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f  LASS_DIGIT,    /
4ab0: 2a 20 31 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49  * 1 */ CCLASS_DI
4ac0: 47 49 54 2c 20 20 20 2f 2a 20 32 20 2a 2f 20 43  GIT,   /* 2 */ C
4ad0: 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a  CLASS_DIGIT,. /*
4ae0: 20 33 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   3 */ CCLASS_DIG
4af0: 49 54 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 20 43  IT,    /* 4 */ C
4b00: 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f  CLASS_DIGIT,   /
4b10: 2a 20 35 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49  * 5 */ CCLASS_DI
4b20: 47 49 54 2c 0a 20 2f 2a 20 36 20 2a 2f 20 43 43  GIT,. /* 6 */ CC
4b30: 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f  LASS_DIGIT,    /
4b40: 2a 20 37 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49  * 7 */ CCLASS_DI
4b50: 47 49 54 2c 20 20 20 2f 2a 20 38 20 2a 2f 20 43  GIT,   /* 8 */ C
4b60: 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a  CLASS_DIGIT,. /*
4b70: 20 39 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   9 */ CCLASS_DIG
4b80: 49 54 2c 20 20 20 20 2f 2a 20 3a 20 2a 2f 20 43  IT,    /* : */ C
4b90: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
4ba0: 2a 20 3b 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * ; */ CCLASS_OT
4bb0: 48 45 52 2c 0a 20 2f 2a 20 3c 20 2a 2f 20 43 43  HER,. /* < */ CC
4bc0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
4bd0: 2a 20 3d 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * = */ CCLASS_OT
4be0: 48 45 52 2c 20 20 20 2f 2a 20 3e 20 2a 2f 20 43  HER,   /* > */ C
4bf0: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
4c00: 20 3f 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ? */ CCLASS_OTH
4c10: 45 52 2c 20 20 20 20 2f 2a 20 40 20 2a 2f 20 43  ER,    /* @ */ C
4c20: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
4c30: 2a 20 41 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f  * A */ CCLASS_VO
4c40: 57 45 4c 2c 0a 20 2f 2a 20 42 20 2a 2f 20 43 43  WEL,. /* B */ CC
4c50: 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20 20 2f  LASS_B,        /
4c60: 2a 20 43 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * C */ CCLASS_C,
4c70: 20 20 20 20 20 20 20 2f 2a 20 44 20 2a 2f 20 43         /* D */ C
4c80: 43 4c 41 53 53 5f 44 2c 0a 20 2f 2a 20 45 20 2a  CLASS_D,. /* E *
4c90: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
4ca0: 20 20 20 2f 2a 20 46 20 2a 2f 20 43 43 4c 41 53     /* F */ CCLAS
4cb0: 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 47 20  S_B,       /* G 
4cc0: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a  */ CCLASS_C,. /*
4cd0: 20 48 20 2a 2f 20 43 43 4c 41 53 53 5f 53 49 4c   H */ CCLASS_SIL
4ce0: 45 4e 54 2c 20 20 20 2f 2a 20 49 20 2a 2f 20 43  ENT,   /* I */ C
4cf0: 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f  CLASS_VOWEL,   /
4d00: 2a 20 4a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * J */ CCLASS_C,
4d10: 0a 20 2f 2a 20 4b 20 2a 2f 20 43 43 4c 41 53 53  . /* K */ CCLASS
4d20: 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 20  _C,        /* L 
4d30: 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c 20 20 20 20  */ CCLASS_L,    
4d40: 20 20 20 2f 2a 20 4d 20 2a 2f 20 43 43 4c 41 53     /* M */ CCLAS
4d50: 53 5f 4d 2c 0a 20 2f 2a 20 4e 20 2a 2f 20 43 43  S_M,. /* N */ CC
4d60: 4c 41 53 53 5f 4d 2c 20 20 20 20 20 20 20 20 2f  LASS_M,        /
4d70: 2a 20 4f 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f  * O */ CCLASS_VO
4d80: 57 45 4c 2c 20 20 20 2f 2a 20 50 20 2a 2f 20 43  WEL,   /* P */ C
4d90: 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20 51 20 2a  CLASS_B,. /* Q *
4da0: 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20  / CCLASS_C,     
4db0: 20 20 20 2f 2a 20 52 20 2a 2f 20 43 43 4c 41 53     /* R */ CCLAS
4dc0: 53 5f 52 2c 20 20 20 20 20 20 20 2f 2a 20 53 20  S_R,       /* S 
4dd0: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a  */ CCLASS_C,. /*
4de0: 20 54 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 20   T */ CCLASS_D, 
4df0: 20 20 20 20 20 20 20 2f 2a 20 55 20 2a 2f 20 43         /* U */ C
4e00: 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f  CLASS_VOWEL,   /
4e10: 2a 20 56 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c  * V */ CCLASS_B,
4e20: 0a 20 2f 2a 20 57 20 2a 2f 20 43 43 4c 41 53 53  . /* W */ CCLASS
4e30: 5f 57 2c 20 20 20 20 20 20 20 20 2f 2a 20 58 20  _W,        /* X 
4e40: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20  */ CCLASS_C,    
4e50: 20 20 20 2f 2a 20 59 20 2a 2f 20 43 43 4c 41 53     /* Y */ CCLAS
4e60: 53 5f 59 2c 0a 20 2f 2a 20 5a 20 2a 2f 20 43 43  S_Y,. /* Z */ CC
4e70: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f  LASS_C,        /
4e80: 2a 20 5b 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * [ */ CCLASS_OT
4e90: 48 45 52 2c 20 20 20 2f 2a 20 5c 20 2a 2f 20 43  HER,   /* \ */ C
4ea0: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
4eb0: 20 5d 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ] */ CCLASS_OTH
4ec0: 45 52 2c 20 20 20 20 2f 2a 20 5e 20 2a 2f 20 43  ER,    /* ^ */ C
4ed0: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
4ee0: 2a 20 5f 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * _ */ CCLASS_OT
4ef0: 48 45 52 2c 0a 20 2f 2a 20 60 20 2a 2f 20 43 43  HER,. /* ` */ CC
4f00: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
4f10: 2a 20 61 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f  * a */ CCLASS_VO
4f20: 57 45 4c 2c 20 20 20 2f 2a 20 62 20 2a 2f 20 43  WEL,   /* b */ C
4f30: 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20 63 20 2a  CLASS_B,. /* c *
4f40: 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20  / CCLASS_C,     
4f50: 20 20 20 2f 2a 20 64 20 2a 2f 20 43 43 4c 41 53     /* d */ CCLAS
4f60: 53 5f 44 2c 20 20 20 20 20 20 20 2f 2a 20 65 20  S_D,       /* e 
4f70: 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c  */ CCLASS_VOWEL,
4f80: 0a 20 2f 2a 20 66 20 2a 2f 20 43 43 4c 41 53 53  . /* f */ CCLASS
4f90: 5f 42 2c 20 20 20 20 20 20 20 20 2f 2a 20 67 20  _B,        /* g 
4fa0: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20  */ CCLASS_C,    
4fb0: 20 20 20 2f 2a 20 68 20 2a 2f 20 43 43 4c 41 53     /* h */ CCLAS
4fc0: 53 5f 53 49 4c 45 4e 54 2c 0a 20 2f 2a 20 69 20  S_SILENT,. /* i 
4fd0: 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c  */ CCLASS_VOWEL,
4fe0: 20 20 20 20 2f 2a 20 6a 20 2a 2f 20 43 43 4c 41      /* j */ CCLA
4ff0: 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 6b  SS_C,       /* k
5000: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f   */ CCLASS_C,. /
5010: 2a 20 6c 20 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c  * l */ CCLASS_L,
5020: 20 20 20 20 20 20 20 20 2f 2a 20 6d 20 2a 2f 20          /* m */ 
5030: 43 43 4c 41 53 53 5f 4d 2c 20 20 20 20 20 20 20  CCLASS_M,       
5040: 2f 2a 20 6e 20 2a 2f 20 43 43 4c 41 53 53 5f 4d  /* n */ CCLASS_M
5050: 2c 0a 20 2f 2a 20 6f 20 2a 2f 20 43 43 4c 41 53  ,. /* o */ CCLAS
5060: 53 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 70  S_VOWEL,    /* p
5070: 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20   */ CCLASS_B,   
5080: 20 20 20 20 2f 2a 20 71 20 2a 2f 20 43 43 4c 41      /* q */ CCLA
5090: 53 53 5f 43 2c 0a 20 2f 2a 20 72 20 2a 2f 20 43  SS_C,. /* r */ C
50a0: 43 4c 41 53 53 5f 52 2c 20 20 20 20 20 20 20 20  CLASS_R,        
50b0: 2f 2a 20 73 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* s */ CCLASS_C
50c0: 2c 20 20 20 20 20 20 20 2f 2a 20 74 20 2a 2f 20  ,       /* t */ 
50d0: 43 43 4c 41 53 53 5f 44 2c 0a 20 2f 2a 20 75 20  CCLASS_D,. /* u 
50e0: 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c  */ CCLASS_VOWEL,
50f0: 20 20 20 20 2f 2a 20 76 20 2a 2f 20 43 43 4c 41      /* v */ CCLA
5100: 53 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 77  SS_B,       /* w
5110: 20 2a 2f 20 43 43 4c 41 53 53 5f 57 2c 0a 20 2f   */ CCLASS_W,. /
5120: 2a 20 78 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * x */ CCLASS_C,
5130: 20 20 20 20 20 20 20 20 2f 2a 20 79 20 2a 2f 20          /* y */ 
5140: 43 43 4c 41 53 53 5f 59 2c 20 20 20 20 20 20 20  CCLASS_Y,       
5150: 2f 2a 20 7a 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* z */ CCLASS_C
5160: 2c 0a 20 2f 2a 20 7b 20 2a 2f 20 43 43 4c 41 53  ,. /* { */ CCLAS
5170: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 7c  S_OTHER,    /* |
5180: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
5190: 2c 20 20 20 2f 2a 20 7d 20 2a 2f 20 43 43 4c 41  ,   /* } */ CCLA
51a0: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 7e 20  SS_OTHER,. /* ~ 
51b0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
51c0: 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41      /*   */ CCLA
51d0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 0a 7d 3b 0a  SS_OTHER,   .};.
51e0: 0a 2f 2a 0a 2a 2a 20 4d 61 70 70 69 6e 67 20 66  ./*.** Mapping f
51f0: 72 6f 6d 20 74 68 65 20 63 68 61 72 61 63 74 65  rom the characte
5200: 72 20 63 6c 61 73 73 20 6e 75 6d 62 65 72 20 28  r class number (
5210: 30 2d 31 33 29 20 74 6f 20 61 20 73 79 6d 62 6f  0-13) to a symbo
5220: 6c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 68  l for each.** ch
5230: 61 72 61 63 74 65 72 20 63 6c 61 73 73 2e 20 20  aracter class.  
5240: 4e 6f 74 65 20 74 68 61 74 20 69 6e 69 74 43 6c  Note that initCl
5250: 61 73 73 5b 5d 20 63 61 6e 20 62 65 20 75 73 65  ass[] can be use
5260: 64 20 74 6f 20 6d 61 70 20 74 68 65 20 63 6c 61  d to map the cla
5270: 73 73 0a 2a 2a 20 73 79 6d 62 6f 6c 20 62 61 63  ss.** symbol bac
5280: 6b 20 69 6e 74 6f 20 74 68 65 20 63 6c 61 73 73  k into the class
5290: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
52a0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
52b0: 64 20 63 68 61 72 20 63 6c 61 73 73 4e 61 6d 65  d char className
52c0: 5b 5d 20 3d 20 22 2e 41 42 43 44 48 4c 52 4d 57  [] = ".ABCDHLRMW
52d0: 59 39 20 3f 22 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65  Y9 ?";../*.** Ge
52e0: 6e 65 72 61 74 65 20 61 20 22 70 68 6f 6e 65 74  nerate a "phonet
52f0: 69 63 20 68 61 73 68 22 20 66 72 6f 6d 20 61 20  ic hash" from a 
5300: 73 74 72 69 6e 67 20 6f 66 20 41 53 43 49 49 20  string of ASCII 
5310: 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e  characters.** in
5320: 20 7a 49 6e 5b 30 2e 2e 6e 49 6e 2d 31 5d 2e 0a   zIn[0..nIn-1]..
5330: 2a 2a 0a 2a 2a 20 20 20 2a 20 4d 61 70 20 63 68  **.**   * Map ch
5340: 61 72 61 63 74 65 72 73 20 62 79 20 63 68 61 72  aracters by char
5350: 61 63 74 65 72 20 63 6c 61 73 73 20 61 73 20 64  acter class as d
5360: 65 66 69 6e 65 64 20 61 62 6f 76 65 2e 0a 2a 2a  efined above..**
5370: 20 20 20 2a 20 4f 6d 69 74 20 64 6f 75 62 6c 65     * Omit double
5380: 2d 6c 65 74 74 65 72 73 0a 2a 2a 20 20 20 2a 20  -letters.**   * 
5390: 4f 6d 69 74 20 76 6f 77 65 6c 73 20 62 65 73 69  Omit vowels besi
53a0: 64 65 20 52 20 61 6e 64 20 4c 0a 2a 2a 20 20 20  de R and L.**   
53b0: 2a 20 4f 6d 69 74 20 54 20 77 68 65 6e 20 66 6f  * Omit T when fo
53c0: 6c 6c 6f 77 65 64 20 62 79 20 43 48 0a 2a 2a 20  llowed by CH.** 
53d0: 20 20 2a 20 4f 6d 69 74 20 57 20 77 68 65 6e 20    * Omit W when 
53e0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 52 0a 2a 2a  followed by R.**
53f0: 20 20 20 2a 20 4f 6d 69 74 20 44 20 77 68 65 6e     * Omit D when
5400: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 4a 20 6f   followed by J o
5410: 72 20 47 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20  r G.**   * Omit 
5420: 4b 20 69 6e 20 4b 4e 20 6f 72 20 47 20 69 6e 20  K in KN or G in 
5430: 47 4e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  GN at the beginn
5440: 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 0a 2a 2a  ing of a word.**
5450: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
5460: 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  d the result is 
5470: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5480: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 0a 2a  lite3_malloc().*
5490: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  *.** Return NULL
54a0: 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   if memory alloc
54b0: 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 20 0a 2a  ation fails.  .*
54c0: 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  /.static unsigne
54d0: 64 20 63 68 61 72 20 2a 70 68 6f 6e 65 74 69 63  d char *phonetic
54e0: 48 61 73 68 28 63 6f 6e 73 74 20 75 6e 73 69 67  Hash(const unsig
54f0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69  ned char *zIn, i
5500: 6e 74 20 6e 49 6e 29 7b 0a 20 20 75 6e 73 69 67  nt nIn){.  unsig
5510: 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ned char *zOut =
5520: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
5530: 20 6e 49 6e 20 2b 20 31 20 29 3b 0a 20 20 69 6e   nIn + 1 );.  in
5540: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20  t i;.  int nOut 
5550: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 50 72 65  = 0;.  char cPre
5560: 76 20 3d 20 30 78 37 37 3b 0a 20 20 63 68 61 72  v = 0x77;.  char
5570: 20 63 50 72 65 76 58 20 3d 20 30 78 37 37 3b 0a   cPrevX = 0x77;.
5580: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
5590: 20 63 68 61 72 20 2a 61 43 6c 61 73 73 20 3d 20   char *aClass = 
55a0: 69 6e 69 74 43 6c 61 73 73 3b 0a 0a 20 20 69 66  initClass;..  if
55b0: 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75  ( zOut==0 ) retu
55c0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 6e 49 6e 3e  rn 0;.  if( nIn>
55d0: 32 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  2 ){.    switch(
55e0: 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20   zIn[0] ){.     
55f0: 20 63 61 73 65 20 27 67 27 3a 20 0a 20 20 20 20   case 'g': .    
5600: 20 20 63 61 73 65 20 27 6b 27 3a 20 7b 0a 20 20    case 'k': {.  
5610: 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 31 5d        if( zIn[1]
5620: 3d 3d 27 6e 27 20 29 7b 20 7a 49 6e 2b 2b 3b 20  =='n' ){ zIn++; 
5630: 6e 49 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  nIn--; }.       
5640: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5650: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5660: 7a 49 6e 5b 30 5d 3d 3d 27 6b 27 20 26 26 20 7a  zIn[0]=='k' && z
5670: 49 6e 5b 31 5d 3d 3d 27 6e 27 20 29 7b 20 7a 49  In[1]=='n' ){ zI
5680: 6e 2b 2b 2c 20 6e 49 6e 2d 2d 3b 20 7d 0a 20 20  n++, nIn--; }.  
5690: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 3b 20  for(i=0; i<nIn; 
56a0: 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  i++){.    unsign
56b0: 65 64 20 63 68 61 72 20 63 20 3d 20 7a 49 6e 5b  ed char c = zIn[
56c0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 2b 31 3c  i];.    if( i+1<
56d0: 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nIn ){.      if(
56e0: 20 63 3d 3d 27 77 27 20 26 26 20 7a 49 6e 5b 69   c=='w' && zIn[i
56f0: 2b 31 5d 3d 3d 27 72 27 20 29 20 63 6f 6e 74 69  +1]=='r' ) conti
5700: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nue;.      if( c
5710: 3d 3d 27 64 27 20 26 26 20 28 7a 49 6e 5b 69 2b  =='d' && (zIn[i+
5720: 31 5d 3d 3d 27 6a 27 20 7c 7c 20 7a 49 6e 5b 69  1]=='j' || zIn[i
5730: 2b 31 5d 3d 3d 27 67 27 29 20 29 20 63 6f 6e 74  +1]=='g') ) cont
5740: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
5750: 69 2b 32 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 20  i+2<nIn ){.     
5760: 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26     if( c=='t' &&
5770: 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 63 27 20 26   zIn[i+1]=='c' &
5780: 26 20 7a 49 6e 5b 69 2b 32 5d 3d 3d 27 68 27 20  & zIn[i+2]=='h' 
5790: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
57a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 20    }.    }.    c 
57b0: 3d 20 61 43 6c 61 73 73 5b 63 26 30 78 37 66 5d  = aClass[c&0x7f]
57c0: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 43 43 4c  ;.    if( c==CCL
57d0: 41 53 53 5f 53 50 41 43 45 20 29 20 63 6f 6e 74  ASS_SPACE ) cont
57e0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 63 3d  inue;.    if( c=
57f0: 3d 43 43 4c 41 53 53 5f 4f 54 48 45 52 20 26 26  =CCLASS_OTHER &&
5800: 20 63 50 72 65 76 21 3d 43 43 4c 41 53 53 5f 44   cPrev!=CCLASS_D
5810: 49 47 49 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  IGIT ) continue;
5820: 0a 20 20 20 20 61 43 6c 61 73 73 20 3d 20 6d 69  .    aClass = mi
5830: 64 43 6c 61 73 73 3b 0a 20 20 20 20 69 66 28 20  dClass;.    if( 
5840: 63 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c 20  c==CCLASS_VOWEL 
5850: 26 26 20 28 63 50 72 65 76 58 3d 3d 43 43 4c 41  && (cPrevX==CCLA
5860: 53 53 5f 52 20 7c 7c 20 63 50 72 65 76 58 3d 3d  SS_R || cPrevX==
5870: 43 43 4c 41 53 53 5f 4c 29 20 29 7b 0a 20 20 20  CCLASS_L) ){.   
5880: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a      continue; /*
5890: 20 4e 6f 20 76 6f 77 65 6c 73 20 62 65 73 69 64   No vowels besid
58a0: 65 20 4c 20 6f 72 20 52 20 2a 2f 20 0a 20 20 20  e L or R */ .   
58b0: 20 7d 0a 20 20 20 20 69 66 28 20 28 63 3d 3d 43   }.    if( (c==C
58c0: 43 4c 41 53 53 5f 52 20 7c 7c 20 63 3d 3d 43 43  CLASS_R || c==CC
58d0: 4c 41 53 53 5f 4c 29 20 26 26 20 63 50 72 65 76  LASS_L) && cPrev
58e0: 58 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c 20  X==CCLASS_VOWEL 
58f0: 29 7b 0a 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d  ){.       nOut--
5900: 3b 20 20 20 2f 2a 20 4e 6f 20 76 6f 77 65 6c 73  ;   /* No vowels
5910: 20 62 65 73 69 64 65 20 4c 20 6f 72 20 52 20 2a   beside L or R *
5920: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 50 72 65  /.    }.    cPre
5930: 76 20 3d 20 63 3b 0a 20 20 20 20 69 66 28 20 63  v = c;.    if( c
5940: 3d 3d 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 20  ==CCLASS_SILENT 
5950: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5960: 63 50 72 65 76 58 20 3d 20 63 3b 0a 20 20 20 20  cPrevX = c;.    
5970: 63 20 3d 20 63 6c 61 73 73 4e 61 6d 65 5b 63 5d  c = className[c]
5980: 3b 0a 20 20 20 20 69 66 28 20 63 21 3d 7a 4f 75  ;.    if( c!=zOu
5990: 74 5b 6e 4f 75 74 2d 31 5d 20 29 20 7a 4f 75 74  t[nOut-1] ) zOut
59a0: 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [nOut++] = c;.  
59b0: 7d 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 5d 20 3d  }.  zOut[nOut] =
59c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75   0;.  return zOu
59d0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
59e0: 20 69 73 20 61 6e 20 53 51 4c 20 66 75 6e 63 74   is an SQL funct
59f0: 69 6f 6e 20 77 72 61 70 70 65 72 20 61 72 6f 75  ion wrapper arou
5a00: 6e 64 20 70 68 6f 6e 65 74 69 63 48 61 73 68 28  nd phoneticHash(
5a10: 29 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 64  ).  See.** the d
5a20: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 70 68  escription of ph
5a30: 6f 6e 65 74 69 63 48 61 73 68 28 29 20 66 6f 72  oneticHash() for
5a40: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
5a50: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
5a60: 69 63 20 76 6f 69 64 20 70 68 6f 6e 65 74 69 63  ic void phonetic
5a70: 48 61 73 68 53 71 6c 46 75 6e 63 28 0a 20 20 73  HashSqlFunc(.  s
5a80: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5a90: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
5aa0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
5ab0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
5ac0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5ad0: 63 68 61 72 20 2a 7a 49 6e 3b 0a 20 20 75 6e 73  char *zIn;.  uns
5ae0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74  igned char *zOut
5af0: 3b 0a 0a 20 20 7a 49 6e 20 3d 20 73 71 6c 69 74  ;..  zIn = sqlit
5b00: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
5b10: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 49  gv[0]);.  if( zI
5b20: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
5b30: 20 7a 4f 75 74 20 3d 20 70 68 6f 6e 65 74 69 63   zOut = phonetic
5b40: 48 61 73 68 28 7a 49 6e 2c 20 73 71 6c 69 74 65  Hash(zIn, sqlite
5b50: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
5b60: 67 76 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 7a  gv[0]));.  if( z
5b70: 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Out==0 ){.    sq
5b80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
5b90: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
5ba0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5bb0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5bc0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
5bd0: 61 72 2a 29 7a 4f 75 74 2c 20 2d 31 2c 20 73 71  ar*)zOut, -1, sq
5be0: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
5bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5c00: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 63   the character c
5c10: 6c 61 73 73 20 6e 75 6d 62 65 72 20 66 6f 72 20  lass number for 
5c20: 61 20 63 68 61 72 61 63 74 65 72 20 67 69 76 65  a character give
5c30: 6e 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 78 74  n its.** context
5c40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
5c50: 20 63 68 61 72 61 63 74 65 72 43 6c 61 73 73 28   characterClass(
5c60: 63 68 61 72 20 63 50 72 65 76 2c 20 63 68 61 72  char cPrev, char
5c70: 20 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 50   c){.  return cP
5c80: 72 65 76 3d 3d 30 20 3f 20 69 6e 69 74 43 6c 61  rev==0 ? initCla
5c90: 73 73 5b 63 26 30 78 37 66 5d 20 3a 20 6d 69 64  ss[c&0x7f] : mid
5ca0: 43 6c 61 73 73 5b 63 26 30 78 37 66 5d 3b 0a 7d  Class[c&0x7f];.}
5cb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5cc0: 68 65 20 63 6f 73 74 20 6f 66 20 69 6e 73 65 72  he cost of inser
5cd0: 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67  ting or deleting
5ce0: 20 63 68 61 72 61 63 74 65 72 20 63 20 69 6d 6d   character c imm
5cf0: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 66 6f 6c 6c  ediately.** foll
5d00: 6f 77 69 6e 67 20 63 68 61 72 61 63 74 65 72 20  owing character 
5d10: 63 50 72 65 76 2e 20 20 49 66 20 63 50 72 65 76  cPrev.  If cPrev
5d20: 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
5d30: 63 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  c is the first.*
5d40: 2a 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  * character of t
5d50: 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74  he word..*/.stat
5d60: 69 63 20 69 6e 74 20 69 6e 73 65 72 74 4f 72 44  ic int insertOrD
5d70: 65 6c 65 74 65 43 6f 73 74 28 63 68 61 72 20 63  eleteCost(char c
5d80: 50 72 65 76 2c 20 63 68 61 72 20 63 2c 20 63 68  Prev, char c, ch
5d90: 61 72 20 63 4e 65 78 74 29 7b 0a 20 20 63 68 61  ar cNext){.  cha
5da0: 72 20 63 6c 61 73 73 43 20 3d 20 63 68 61 72 61  r classC = chara
5db0: 63 74 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c  cterClass(cPrev,
5dc0: 20 63 29 3b 0a 20 20 63 68 61 72 20 63 6c 61 73   c);.  char clas
5dd0: 73 43 70 72 65 76 3b 0a 0a 20 20 69 66 28 20 63  sCprev;..  if( c
5de0: 6c 61 73 73 43 3d 3d 43 43 4c 41 53 53 5f 53 49  lassC==CCLASS_SI
5df0: 4c 45 4e 54 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LENT ){.    /* I
5e00: 6e 73 65 72 74 20 6f 72 20 64 65 6c 65 74 65 20  nsert or delete 
5e10: 22 73 69 6c 65 6e 74 22 20 63 68 61 72 61 63 74  "silent" charact
5e20: 65 72 73 20 73 75 63 68 20 61 73 20 48 20 6f 72  ers such as H or
5e30: 20 57 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e   W */.    return
5e40: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 50   1;.  }.  if( cP
5e50: 72 65 76 3d 3d 63 20 29 7b 0a 20 20 20 20 2f 2a  rev==c ){.    /*
5e60: 20 52 65 70 65 61 74 65 64 20 63 68 61 72 61 63   Repeated charac
5e70: 74 65 72 73 2c 20 6f 72 20 6d 69 73 73 20 61 20  ters, or miss a 
5e80: 72 65 70 65 61 74 20 2a 2f 0a 20 20 20 20 72 65  repeat */.    re
5e90: 74 75 72 6e 20 31 30 3b 0a 20 20 7d 0a 20 20 69  turn 10;.  }.  i
5ea0: 66 28 20 63 6c 61 73 73 43 3d 3d 43 43 4c 41 53  f( classC==CCLAS
5eb0: 53 5f 56 4f 57 45 4c 20 26 26 20 28 63 50 72 65  S_VOWEL && (cPre
5ec0: 76 3d 3d 27 72 27 20 7c 7c 20 63 4e 65 78 74 3d  v=='r' || cNext=
5ed0: 3d 27 72 27 29 20 29 7b 0a 20 20 20 20 72 65 74  ='r') ){.    ret
5ee0: 75 72 6e 20 32 30 3b 20 20 2f 2a 20 49 6e 73 65  urn 20;  /* Inse
5ef0: 72 74 20 61 20 76 6f 77 65 6c 20 62 65 66 6f 72  rt a vowel befor
5f00: 65 20 6f 72 20 61 66 74 65 72 20 27 72 27 20 2a  e or after 'r' *
5f10: 2f 0a 20 20 7d 0a 20 20 63 6c 61 73 73 43 70 72  /.  }.  classCpr
5f20: 65 76 20 3d 20 63 68 61 72 61 63 74 65 72 43 6c  ev = characterCl
5f30: 61 73 73 28 63 50 72 65 76 2c 20 63 50 72 65 76  ass(cPrev, cPrev
5f40: 29 3b 0a 20 20 69 66 28 20 63 6c 61 73 73 43 3d  );.  if( classC=
5f50: 3d 63 6c 61 73 73 43 70 72 65 76 20 29 7b 0a 20  =classCprev ){. 
5f60: 20 20 20 69 66 28 20 63 6c 61 73 73 43 3d 3d 43     if( classC==C
5f70: 43 4c 41 53 53 5f 56 4f 57 45 4c 20 29 7b 0a 20  CLASS_VOWEL ){. 
5f80: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 6f       /* Remove o
5f90: 72 20 61 64 64 20 61 20 6e 65 77 20 76 6f 77 65  r add a new vowe
5fa0: 6c 20 74 6f 20 61 20 76 6f 77 65 6c 20 63 6c 75  l to a vowel clu
5fb0: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  ster */.      re
5fc0: 74 75 72 6e 20 31 35 3b 0a 20 20 20 20 7d 65 6c  turn 15;.    }el
5fd0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d  se{.      /* Rem
5fe0: 6f 76 65 20 6f 72 20 61 64 64 20 61 20 63 6f 6e  ove or add a con
5ff0: 73 6f 6e 61 6e 74 20 6e 6f 74 20 69 6e 20 74 68  sonant not in th
6000: 65 20 73 61 6d 65 20 63 6c 61 73 73 20 2a 2f 0a  e same class */.
6010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 35 30 3b        return 50;
6020: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6030: 20 61 6e 79 20 6f 74 68 65 72 20 63 68 61 72 61   any other chara
6040: 63 74 65 72 20 69 6e 73 65 72 74 69 6f 6e 20 6f  cter insertion o
6050: 72 20 64 65 6c 65 74 69 6f 6e 20 2a 2f 0a 20 20  r deletion */.  
6060: 72 65 74 75 72 6e 20 31 30 30 3b 0a 7d 0a 0a 2f  return 100;.}../
6070: 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74 68 65 20  *.** Divide the 
6080: 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73 74 20 62  insertion cost b
6090: 79 20 74 68 69 73 20 66 61 63 74 6f 72 20 77 68  y this factor wh
60a0: 65 6e 20 61 70 70 65 6e 64 69 6e 67 20 74 6f 20  en appending to 
60b0: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
60c0: 65 20 77 6f 72 64 2e 0a 2a 2f 0a 23 64 65 66 69  e word..*/.#defi
60d0: 6e 65 20 46 49 4e 41 4c 5f 49 4e 53 5f 43 4f 53  ne FINAL_INS_COS
60e0: 54 5f 44 49 56 20 20 34 0a 0a 2f 2a 0a 2a 2a 20  T_DIV  4../*.** 
60f0: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20  Return the cost 
6100: 6f 66 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  of substituting 
6110: 63 54 6f 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  cTo in place of 
6120: 63 46 72 6f 6d 20 61 73 73 75 6d 69 6e 67 0a 2a  cFrom assuming.*
6130: 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  * the previous c
6140: 68 61 72 61 63 74 65 72 20 69 73 20 63 50 72 65  haracter is cPre
6150: 76 2e 20 20 49 66 20 63 50 72 65 76 3d 3d 30 20  v.  If cPrev==0 
6160: 74 68 65 6e 20 63 54 6f 20 69 73 20 74 68 65 20  then cTo is the 
6170: 66 69 72 73 74 0a 2a 2a 20 63 68 61 72 61 63 74  first.** charact
6180: 65 72 20 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a  er of the word..
6190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
61a0: 62 73 74 69 74 75 74 65 43 6f 73 74 28 63 68 61  bstituteCost(cha
61b0: 72 20 63 50 72 65 76 2c 20 63 68 61 72 20 63 46  r cPrev, char cF
61c0: 72 6f 6d 2c 20 63 68 61 72 20 63 54 6f 29 7b 0a  rom, char cTo){.
61d0: 20 20 63 68 61 72 20 63 6c 61 73 73 46 72 6f 6d    char classFrom
61e0: 2c 20 63 6c 61 73 73 54 6f 3b 0a 20 20 69 66 28  , classTo;.  if(
61f0: 20 63 46 72 6f 6d 3d 3d 63 54 6f 20 29 7b 0a 20   cFrom==cTo ){. 
6200: 20 20 20 2f 2a 20 45 78 61 63 74 20 6d 61 74 63     /* Exact matc
6210: 68 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  h */.    return 
6220: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 46 72  0;.  }.  if( cFr
6230: 6f 6d 3d 3d 28 63 54 6f 5e 30 78 32 30 29 20 26  om==(cTo^0x20) &
6240: 26 20 28 28 63 54 6f 3e 3d 27 41 27 20 26 26 20  & ((cTo>='A' && 
6250: 63 54 6f 3c 3d 27 5a 27 29 20 7c 7c 20 28 63 54  cTo<='Z') || (cT
6260: 6f 3e 3d 27 61 27 20 26 26 20 63 54 6f 3c 3d 27  o>='a' && cTo<='
6270: 7a 27 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 64  z')) ){.    /* d
6280: 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20 63 61  iffer only in ca
6290: 73 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  se */.    return
62a0: 20 30 3b 0a 20 20 7d 0a 20 20 63 6c 61 73 73 46   0;.  }.  classF
62b0: 72 6f 6d 20 3d 20 63 68 61 72 61 63 74 65 72 43  rom = characterC
62c0: 6c 61 73 73 28 63 50 72 65 76 2c 20 63 46 72 6f  lass(cPrev, cFro
62d0: 6d 29 3b 0a 20 20 63 6c 61 73 73 54 6f 20 3d 20  m);.  classTo = 
62e0: 63 68 61 72 61 63 74 65 72 43 6c 61 73 73 28 63  characterClass(c
62f0: 50 72 65 76 2c 20 63 54 6f 29 3b 0a 20 20 69 66  Prev, cTo);.  if
6300: 28 20 63 6c 61 73 73 46 72 6f 6d 3d 3d 63 6c 61  ( classFrom==cla
6310: 73 73 54 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 53  ssTo ){.    /* S
6320: 61 6d 65 20 63 68 61 72 61 63 74 65 72 20 63 6c  ame character cl
6330: 61 73 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ass */.    retur
6340: 6e 20 63 6c 61 73 73 46 72 6f 6d 3d 3d 27 41 27  n classFrom=='A'
6350: 20 3f 20 32 35 20 3a 20 34 30 3b 0a 20 20 7d 0a   ? 25 : 40;.  }.
6360: 20 20 69 66 28 20 63 6c 61 73 73 46 72 6f 6d 3e    if( classFrom>
6370: 3d 43 43 4c 41 53 53 5f 42 20 26 26 20 63 6c 61  =CCLASS_B && cla
6380: 73 73 46 72 6f 6d 3c 3d 43 43 4c 41 53 53 5f 59  ssFrom<=CCLASS_Y
6390: 0a 20 20 20 20 20 20 26 26 20 63 6c 61 73 73 54  .      && classT
63a0: 6f 3e 3d 43 43 4c 41 53 53 5f 42 20 26 26 20 63  o>=CCLASS_B && c
63b0: 6c 61 73 73 54 6f 3c 3d 43 43 4c 41 53 53 5f 59  lassTo<=CCLASS_Y
63c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65   ){.    /* Conve
63d0: 72 74 20 66 72 6f 6d 20 6f 6e 65 20 63 6f 6e 73  rt from one cons
63e0: 6f 6e 61 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72  onant to another
63f0: 2c 20 62 75 74 20 69 6e 20 61 20 64 69 66 66 65  , but in a diffe
6400: 72 65 6e 74 20 63 6c 61 73 73 20 2a 2f 0a 20 20  rent class */.  
6410: 20 20 72 65 74 75 72 6e 20 37 35 3b 0a 20 20 7d    return 75;.  }
6420: 0a 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20  .  /* Any other 
6430: 73 75 62 73 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  subsitution */. 
6440: 20 72 65 74 75 72 6e 20 31 30 30 3b 0a 7d 0a 0a   return 100;.}..
6450: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 77 6f 20  /*.** Given two 
6460: 73 74 72 69 6e 67 73 20 7a 41 20 61 6e 64 20 7a  strings zA and z
6470: 42 20 77 68 69 63 68 20 61 72 65 20 70 75 72 65  B which are pure
6480: 20 41 53 43 49 49 2c 20 72 65 74 75 72 6e 20 74   ASCII, return t
6490: 68 65 20 63 6f 73 74 0a 2a 2a 20 6f 66 20 74 72  he cost.** of tr
64a0: 61 6e 73 66 6f 72 6d 69 6e 67 20 7a 41 20 69 6e  ansforming zA in
64b0: 74 6f 20 7a 42 2e 20 20 49 66 20 7a 41 20 65 6e  to zB.  If zA en
64c0: 64 73 20 77 69 74 68 20 27 2a 27 20 61 73 73 75  ds with '*' assu
64d0: 6d 65 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  me that it is.**
64e0: 20 61 20 70 72 65 66 69 78 20 6f 66 20 7a 42 20   a prefix of zB 
64f0: 61 6e 64 20 67 69 76 65 20 6f 6e 6c 79 20 6d 69  and give only mi
6500: 6e 69 6d 61 6c 20 70 65 6e 61 6c 74 79 20 66 6f  nimal penalty fo
6510: 72 20 65 78 74 72 61 20 63 68 61 72 61 63 74 65  r extra characte
6520: 72 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 6e 64  rs.** on the end
6530: 20 6f 66 20 7a 42 2e 0a 2a 2a 0a 2a 2a 20 53 6d   of zB..**.** Sm
6540: 61 6c 6c 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  aller numbers me
6550: 61 6e 20 61 20 63 6c 6f 73 65 72 20 6d 61 74 63  an a closer matc
6560: 68 2e 0a 2a 2a 0a 2a 2a 20 4e 65 67 61 74 69 76  h..**.** Negativ
6570: 65 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74  e values indicat
6580: 65 20 61 6e 20 65 72 72 6f 72 3a 0a 2a 2a 20 20  e an error:.**  
6590: 20 20 2d 31 20 20 4f 6e 65 20 6f 66 20 74 68 65    -1  One of the
65a0: 20 69 6e 70 75 74 73 20 69 73 20 4e 55 4c 4c 0a   inputs is NULL.
65b0: 2a 2a 20 20 20 20 2d 32 20 20 4e 6f 6e 2d 41 53  **    -2  Non-AS
65c0: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 6f  CII characters o
65d0: 6e 20 69 6e 70 75 74 0a 2a 2a 20 20 20 20 2d 33  n input.**    -3
65e0: 20 20 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f    Unable to allo
65f0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 0a 2a 2a 0a  cate memory .**.
6600: 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69 73  ** If pnMatch is
6610: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
6620: 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74 20  *pnMatch is set 
6630: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
6640: 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 7a 42 20   bytes.** of zB 
6650: 74 68 61 74 20 6d 61 74 63 68 65 64 20 74 68 65  that matched the
6660: 20 70 61 74 74 65 72 6e 20 69 6e 20 7a 41 2e 20   pattern in zA. 
6670: 49 66 20 7a 41 20 64 6f 65 73 20 6e 6f 74 20 65  If zA does not e
6680: 6e 64 20 77 69 74 68 20 61 20 27 2a 27 2c 0a 2a  nd with a '*',.*
6690: 2a 20 74 68 65 6e 20 74 68 69 73 20 76 61 6c 75  * then this valu
66a0: 65 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  e is always the 
66b0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
66c0: 69 6e 20 7a 42 20 28 69 2e 65 2e 20 73 74 72 6c  in zB (i.e. strl
66d0: 65 6e 28 7a 42 29 29 2e 0a 2a 2a 20 49 66 20 7a  en(zB))..** If z
66e0: 41 20 64 6f 65 73 20 65 6e 64 20 69 6e 20 61 20  A does end in a 
66f0: 27 2a 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20  '*', then it is 
6700: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
6710: 74 65 73 20 69 6e 20 74 68 65 20 70 72 65 66 69  tes in the prefi
6720: 78 0a 2a 2a 20 6f 66 20 7a 42 20 74 68 61 74 20  x.** of zB that 
6730: 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20 6d 61  was deemed to ma
6740: 74 63 68 20 7a 41 2e 0a 2a 2f 0a 73 74 61 74 69  tch zA..*/.stati
6750: 63 20 69 6e 74 20 65 64 69 74 64 69 73 74 31 28  c int editdist1(
6760: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
6770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20  const char *zB, 
6780: 69 6e 74 20 69 4c 61 6e 67 49 64 2c 20 69 6e 74  int iLangId, int
6790: 20 2a 70 6e 4d 61 74 63 68 29 7b 0a 20 20 69 6e   *pnMatch){.  in
67a0: 74 20 6e 41 2c 20 6e 42 3b 20 20 20 20 20 20 20  t nA, nB;       
67b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
67c0: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
67d0: 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a 2f  zA[] and zB[] */
67e0: 0a 20 20 69 6e 74 20 78 41 2c 20 78 42 3b 20 20  .  int xA, xB;  
67f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
6800: 70 20 63 6f 75 6e 74 65 72 73 20 66 6f 72 20 7a  p counters for z
6810: 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a 2f 0a  A[] and zB[] */.
6820: 20 20 63 68 61 72 20 63 41 2c 20 63 42 3b 20 20    char cA, cB;  
6830: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
6840: 65 6e 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ent character of
6850: 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20 20   zA and zB */.  
6860: 63 68 61 72 20 63 41 70 72 65 76 2c 20 63 42 70  char cAprev, cBp
6870: 72 65 76 3b 20 20 20 2f 2a 20 50 72 65 76 69 6f  rev;   /* Previo
6880: 75 73 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  us character of 
6890: 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20 20 63  zA and zB */.  c
68a0: 68 61 72 20 63 41 6e 65 78 74 2c 20 63 42 6e 65  har cAnext, cBne
68b0: 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 63 68  xt;   /* Next ch
68c0: 61 72 61 63 74 65 72 20 69 6e 20 7a 41 20 61 6e  aracter in zA an
68d0: 64 20 7a 42 20 2a 2f 0a 20 20 69 6e 74 20 64 3b  d zB */.  int d;
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 2f 2a 20 4e 6f 72 74 68 2d 77 65 73 74 20 63   /* North-west c
6900: 6f 73 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ost value */.  i
6910: 6e 74 20 64 63 20 3d 20 30 3b 20 20 20 20 20 20  nt dc = 0;      
6920: 20 20 20 20 20 20 2f 2a 20 4e 6f 72 74 68 2d 77        /* North-w
6930: 65 73 74 20 63 68 61 72 61 63 74 65 72 20 76 61  est character va
6940: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  lue */.  int res
6950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6960: 2f 2a 20 46 69 6e 61 6c 20 72 65 73 75 6c 74 20  /* Final result 
6970: 2a 2f 0a 20 20 69 6e 74 20 2a 6d 3b 20 20 20 20  */.  int *m;    
6980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6990: 68 65 20 63 6f 73 74 20 6d 61 74 72 69 78 20 2a  he cost matrix *
69a0: 2f 0a 20 20 63 68 61 72 20 2a 63 78 3b 20 20 20  /.  char *cx;   
69b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
69c0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68 61 72  rresponding char
69d0: 61 63 74 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a  acter values */.
69e0: 20 20 69 6e 74 20 2a 74 6f 46 72 65 65 20 3d 20    int *toFree = 
69f0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c  0;       /* Mall
6a00: 6f 63 65 64 20 73 70 61 63 65 20 2a 2f 0a 20 20  oced space */.  
6a10: 69 6e 74 20 6d 53 74 61 63 6b 5b 36 30 2b 31 35  int mStack[60+15
6a20: 5d 3b 20 20 20 20 20 2f 2a 20 53 74 61 63 6b 20  ];     /* Stack 
6a30: 73 70 61 63 65 20 74 6f 20 75 73 65 20 69 66 20  space to use if 
6a40: 6e 6f 74 20 74 6f 6f 20 6d 75 63 68 20 69 73 20  not too much is 
6a50: 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  needed */.  int 
6a60: 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 0a 20 20 2f  nMatch = 0;..  /
6a70: 2a 20 45 61 72 6c 79 20 6f 75 74 20 69 66 20 65  * Early out if e
6a80: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
6a90: 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 7a 41 3d  ULL */.  if( zA=
6aa0: 3d 30 20 7c 7c 20 7a 42 3d 3d 30 20 29 20 72 65  =0 || zB==0 ) re
6ab0: 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 2f 2a 20 53  turn -1;..  /* S
6ac0: 6b 69 70 20 61 6e 79 20 63 6f 6d 6d 6f 6e 20 70  kip any common p
6ad0: 72 65 66 69 78 20 2a 2f 0a 20 20 77 68 69 6c 65  refix */.  while
6ae0: 28 20 7a 41 5b 30 5d 20 26 26 20 7a 41 5b 30 5d  ( zA[0] && zA[0]
6af0: 3d 3d 7a 42 5b 30 5d 20 29 7b 20 64 63 20 3d 20  ==zB[0] ){ dc = 
6b00: 7a 41 5b 30 5d 3b 20 7a 41 2b 2b 3b 20 7a 42 2b  zA[0]; zA++; zB+
6b10: 2b 3b 20 6e 4d 61 74 63 68 2b 2b 3b 20 7d 0a 20  +; nMatch++; }. 
6b20: 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29 20 2a   if( pnMatch ) *
6b30: 70 6e 4d 61 74 63 68 20 3d 20 6e 4d 61 74 63 68  pnMatch = nMatch
6b40: 3b 0a 20 20 69 66 28 20 7a 41 5b 30 5d 3d 3d 30  ;.  if( zA[0]==0
6b50: 20 26 26 20 7a 42 5b 30 5d 3d 3d 30 20 29 20 72   && zB[0]==0 ) r
6b60: 65 74 75 72 6e 20 30 3b 0a 0a 23 69 66 20 30 0a  eturn 0;..#if 0.
6b70: 20 20 70 72 69 6e 74 66 28 22 41 3d 5c 22 25 73    printf("A=\"%s
6b80: 5c 22 20 42 3d 5c 22 25 73 5c 22 20 64 63 3d 25  \" B=\"%s\" dc=%
6b90: 63 5c 6e 22 2c 20 7a 41 2c 20 7a 42 2c 20 64 63  c\n", zA, zB, dc
6ba0: 3f 64 63 3a 27 20 27 29 3b 0a 23 65 6e 64 69 66  ?dc:' ');.#endif
6bb0: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 69 6e  ..  /* Verify in
6bc0: 70 75 74 20 73 74 72 69 6e 67 73 20 61 6e 64 20  put strings and 
6bd0: 6d 65 61 73 75 72 65 20 74 68 65 69 72 20 6c 65  measure their le
6be0: 6e 67 74 68 73 20 2a 2f 0a 20 20 66 6f 72 28 6e  ngths */.  for(n
6bf0: 41 3d 30 3b 20 7a 41 5b 6e 41 5d 3b 20 6e 41 2b  A=0; zA[nA]; nA+
6c00: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 41 5b 6e  +){.    if( zA[n
6c10: 41 5d 3e 31 32 37 20 29 20 72 65 74 75 72 6e 20  A]>127 ) return 
6c20: 2d 32 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 42  -2;.  }.  for(nB
6c30: 3d 30 3b 20 7a 42 5b 6e 42 5d 3b 20 6e 42 2b 2b  =0; zB[nB]; nB++
6c40: 29 7b 0a 20 20 20 20 69 66 28 20 7a 42 5b 6e 42  ){.    if( zB[nB
6c50: 5d 3e 31 32 37 20 29 20 72 65 74 75 72 6e 20 2d  ]>127 ) return -
6c60: 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  2;.  }..  /* Spe
6c70: 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  cial processing 
6c80: 69 66 20 65 69 74 68 65 72 20 73 74 72 69 6e 67  if either string
6c90: 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 69   is empty */.  i
6ca0: 66 28 20 6e 41 3d 3d 30 20 29 7b 0a 20 20 20 20  f( nA==0 ){.    
6cb0: 63 42 70 72 65 76 20 3d 20 64 63 3b 0a 20 20 20  cBprev = dc;.   
6cc0: 20 66 6f 72 28 78 42 3d 72 65 73 3d 30 3b 20 28   for(xB=res=0; (
6cd0: 63 42 20 3d 20 7a 42 5b 78 42 5d 29 21 3d 30 3b  cB = zB[xB])!=0;
6ce0: 20 78 42 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65   xB++){.      re
6cf0: 73 20 2b 3d 20 69 6e 73 65 72 74 4f 72 44 65 6c  s += insertOrDel
6d00: 65 74 65 43 6f 73 74 28 63 42 70 72 65 76 2c 20  eteCost(cBprev, 
6d10: 63 42 2c 20 7a 42 5b 78 42 2b 31 5d 29 2f 46 49  cB, zB[xB+1])/FI
6d20: 4e 41 4c 5f 49 4e 53 5f 43 4f 53 54 5f 44 49 56  NAL_INS_COST_DIV
6d30: 3b 0a 20 20 20 20 20 20 63 42 70 72 65 76 20 3d  ;.      cBprev =
6d40: 20 63 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   cB;.    }.    r
6d50: 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d 0a 20  eturn res;.  }. 
6d60: 20 69 66 28 20 6e 42 3d 3d 30 20 29 7b 0a 20 20   if( nB==0 ){.  
6d70: 20 20 63 41 70 72 65 76 20 3d 20 64 63 3b 0a 20    cAprev = dc;. 
6d80: 20 20 20 66 6f 72 28 78 41 3d 72 65 73 3d 30 3b     for(xA=res=0;
6d90: 20 28 63 41 20 3d 20 7a 41 5b 78 41 5d 29 21 3d   (cA = zA[xA])!=
6da0: 30 3b 20 78 41 2b 2b 29 7b 0a 20 20 20 20 20 20  0; xA++){.      
6db0: 72 65 73 20 2b 3d 20 69 6e 73 65 72 74 4f 72 44  res += insertOrD
6dc0: 65 6c 65 74 65 43 6f 73 74 28 63 41 70 72 65 76  eleteCost(cAprev
6dd0: 2c 20 63 41 2c 20 7a 41 5b 78 41 2b 31 5d 29 3b  , cA, zA[xA+1]);
6de0: 0a 20 20 20 20 20 20 63 41 70 72 65 76 20 3d 20  .      cAprev = 
6df0: 63 41 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  cA;.    }.    re
6e00: 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d 0a 0a 20  turn res;.  }.. 
6e10: 20 2f 2a 20 41 20 69 73 20 61 20 70 72 65 66 69   /* A is a prefi
6e20: 78 20 6f 66 20 42 20 2a 2f 0a 20 20 69 66 28 20  x of B */.  if( 
6e30: 7a 41 5b 30 5d 3d 3d 27 2a 27 20 26 26 20 7a 41  zA[0]=='*' && zA
6e40: 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [1]==0 ) return 
6e50: 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  0;..  /* Allocat
6e60: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
6e70: 20 74 68 65 20 57 61 67 6e 65 72 20 6d 61 74 72   the Wagner matr
6e80: 69 78 20 2a 2f 0a 20 20 69 66 28 20 6e 42 3c 28  ix */.  if( nB<(
6e90: 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b 29 2a 34  sizeof(mStack)*4
6ea0: 29 2f 28 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b  )/(sizeof(mStack
6eb0: 5b 30 5d 29 2a 35 29 20 29 7b 0a 20 20 20 20 6d  [0])*5) ){.    m
6ec0: 20 3d 20 6d 53 74 61 63 6b 3b 0a 20 20 7d 65 6c   = mStack;.  }el
6ed0: 73 65 7b 0a 20 20 20 20 6d 20 3d 20 74 6f 46 72  se{.    m = toFr
6ee0: 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ee = sqlite3_mal
6ef0: 6c 6f 63 28 20 28 6e 42 2b 31 29 2a 35 2a 73 69  loc( (nB+1)*5*si
6f00: 7a 65 6f 66 28 6d 5b 30 5d 29 2f 34 20 29 3b 0a  zeof(m[0])/4 );.
6f10: 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 20 72      if( m==0 ) r
6f20: 65 74 75 72 6e 20 2d 33 3b 0a 20 20 7d 0a 20 20  eturn -3;.  }.  
6f30: 63 78 20 3d 20 28 63 68 61 72 2a 29 26 6d 5b 6e  cx = (char*)&m[n
6f40: 42 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  B+1];..  /* Comp
6f50: 75 74 65 20 74 68 65 20 57 61 67 6e 65 72 20 65  ute the Wagner e
6f60: 64 69 74 20 64 69 73 74 61 6e 63 65 20 2a 2f 0a  dit distance */.
6f70: 20 20 6d 5b 30 5d 20 3d 20 30 3b 0a 20 20 63 78    m[0] = 0;.  cx
6f80: 5b 30 5d 20 3d 20 64 63 3b 0a 20 20 63 42 70 72  [0] = dc;.  cBpr
6f90: 65 76 20 3d 20 64 63 3b 0a 20 20 66 6f 72 28 78  ev = dc;.  for(x
6fa0: 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b  B=1; xB<=nB; xB+
6fb0: 2b 29 7b 0a 20 20 20 20 63 42 6e 65 78 74 20 3d  +){.    cBnext =
6fc0: 20 7a 42 5b 78 42 5d 3b 0a 20 20 20 20 63 42 20   zB[xB];.    cB 
6fd0: 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20 20 20  = zB[xB-1];.    
6fe0: 63 78 5b 78 42 5d 20 3d 20 63 42 3b 0a 20 20 20  cx[xB] = cB;.   
6ff0: 20 6d 5b 78 42 5d 20 3d 20 6d 5b 78 42 2d 31 5d   m[xB] = m[xB-1]
7000: 20 2b 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74   + insertOrDelet
7010: 65 43 6f 73 74 28 63 42 70 72 65 76 2c 20 63 42  eCost(cBprev, cB
7020: 2c 20 63 42 6e 65 78 74 29 3b 0a 20 20 20 20 63  , cBnext);.    c
7030: 42 70 72 65 76 20 3d 20 63 42 3b 0a 20 20 7d 0a  Bprev = cB;.  }.
7040: 20 20 63 41 70 72 65 76 20 3d 20 64 63 3b 0a 20    cAprev = dc;. 
7050: 20 66 6f 72 28 78 41 3d 31 3b 20 78 41 3c 3d 6e   for(xA=1; xA<=n
7060: 41 3b 20 78 41 2b 2b 29 7b 0a 20 20 20 20 69 6e  A; xA++){.    in
7070: 74 20 6c 61 73 74 41 20 3d 20 28 78 41 3d 3d 6e  t lastA = (xA==n
7080: 41 29 3b 0a 20 20 20 20 63 41 20 3d 20 7a 41 5b  A);.    cA = zA[
7090: 78 41 2d 31 5d 3b 0a 20 20 20 20 63 41 6e 65 78  xA-1];.    cAnex
70a0: 74 20 3d 20 7a 41 5b 78 41 5d 3b 0a 20 20 20 20  t = zA[xA];.    
70b0: 69 66 28 20 63 41 3d 3d 27 2a 27 20 26 26 20 6c  if( cA=='*' && l
70c0: 61 73 74 41 20 29 20 62 72 65 61 6b 3b 0a 20 20  astA ) break;.  
70d0: 20 20 64 20 3d 20 6d 5b 30 5d 3b 0a 20 20 20 20    d = m[0];.    
70e0: 64 63 20 3d 20 63 78 5b 30 5d 3b 0a 20 20 20 20  dc = cx[0];.    
70f0: 6d 5b 30 5d 20 3d 20 64 20 2b 20 69 6e 73 65 72  m[0] = d + inser
7100: 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63 41  tOrDeleteCost(cA
7110: 70 72 65 76 2c 20 63 41 2c 20 63 41 6e 65 78 74  prev, cA, cAnext
7120: 29 3b 0a 20 20 20 20 63 42 70 72 65 76 20 3d 20  );.    cBprev = 
7130: 30 3b 0a 20 20 20 20 66 6f 72 28 78 42 3d 31 3b  0;.    for(xB=1;
7140: 20 78 42 3c 3d 6e 42 3b 20 78 42 2b 2b 29 7b 0a   xB<=nB; xB++){.
7150: 20 20 20 20 20 20 69 6e 74 20 74 6f 74 61 6c 43        int totalC
7160: 6f 73 74 2c 20 69 6e 73 43 6f 73 74 2c 20 64 65  ost, insCost, de
7170: 6c 43 6f 73 74 2c 20 73 75 62 43 6f 73 74 2c 20  lCost, subCost, 
7180: 6e 63 78 3b 0a 20 20 20 20 20 20 63 42 20 3d 20  ncx;.      cB = 
7190: 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20 20 20 20 20  zB[xB-1];.      
71a0: 63 42 6e 65 78 74 20 3d 20 7a 42 5b 78 42 5d 3b  cBnext = zB[xB];
71b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20  ..      /* Cost 
71c0: 74 6f 20 69 6e 73 65 72 74 20 63 42 20 2a 2f 0a  to insert cB */.
71d0: 20 20 20 20 20 20 69 6e 73 43 6f 73 74 20 3d 20        insCost = 
71e0: 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f  insertOrDeleteCo
71f0: 73 74 28 63 78 5b 78 42 2d 31 5d 2c 20 63 42 2c  st(cx[xB-1], cB,
7200: 20 63 42 6e 65 78 74 29 3b 0a 20 20 20 20 20 20   cBnext);.      
7210: 69 66 28 20 6c 61 73 74 41 20 29 20 69 6e 73 43  if( lastA ) insC
7220: 6f 73 74 20 2f 3d 20 46 49 4e 41 4c 5f 49 4e 53  ost /= FINAL_INS
7230: 5f 43 4f 53 54 5f 44 49 56 3b 0a 0a 20 20 20 20  _COST_DIV;..    
7240: 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64 65 6c    /* Cost to del
7250: 65 74 65 20 63 41 20 2a 2f 0a 20 20 20 20 20 20  ete cA */.      
7260: 64 65 6c 43 6f 73 74 20 3d 20 69 6e 73 65 72 74  delCost = insert
7270: 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63 78 5b  OrDeleteCost(cx[
7280: 78 42 5d 2c 20 63 41 2c 20 63 42 6e 65 78 74 29  xB], cA, cBnext)
7290: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 73 74  ;..      /* Cost
72a0: 20 74 6f 20 73 75 62 73 74 69 74 75 74 65 20 63   to substitute c
72b0: 41 2d 3e 63 42 20 2a 2f 0a 20 20 20 20 20 20 73  A->cB */.      s
72c0: 75 62 43 6f 73 74 20 3d 20 73 75 62 73 74 69 74  ubCost = substit
72d0: 75 74 65 43 6f 73 74 28 63 78 5b 78 42 2d 31 5d  uteCost(cx[xB-1]
72e0: 2c 20 63 41 2c 20 63 42 29 3b 0a 0a 20 20 20 20  , cA, cB);..    
72f0: 20 20 2f 2a 20 42 65 73 74 20 63 6f 73 74 20 2a    /* Best cost *
7300: 2f 0a 20 20 20 20 20 20 74 6f 74 61 6c 43 6f 73  /.      totalCos
7310: 74 20 3d 20 69 6e 73 43 6f 73 74 20 2b 20 6d 5b  t = insCost + m[
7320: 78 42 2d 31 5d 3b 0a 20 20 20 20 20 20 6e 63 78  xB-1];.      ncx
7330: 20 3d 20 63 42 3b 0a 20 20 20 20 20 20 69 66 28   = cB;.      if(
7340: 20 28 64 65 6c 43 6f 73 74 20 2b 20 6d 5b 78 42   (delCost + m[xB
7350: 5d 29 3c 74 6f 74 61 6c 43 6f 73 74 20 29 7b 0a  ])<totalCost ){.
7360: 20 20 20 20 20 20 20 20 74 6f 74 61 6c 43 6f 73          totalCos
7370: 74 20 3d 20 64 65 6c 43 6f 73 74 20 2b 20 6d 5b  t = delCost + m[
7380: 78 42 5d 3b 0a 20 20 20 20 20 20 20 20 6e 63 78  xB];.        ncx
7390: 20 3d 20 63 41 3b 0a 20 20 20 20 20 20 7d 0a 20   = cA;.      }. 
73a0: 20 20 20 20 20 69 66 28 20 28 73 75 62 43 6f 73       if( (subCos
73b0: 74 20 2b 20 64 29 3c 74 6f 74 61 6c 43 6f 73 74  t + d)<totalCost
73c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 74 61   ){.        tota
73d0: 6c 43 6f 73 74 20 3d 20 73 75 62 43 6f 73 74 20  lCost = subCost 
73e0: 2b 20 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 23 69  + d;.      }..#i
73f0: 66 20 30 0a 20 20 20 20 20 20 70 72 69 6e 74 66  f 0.      printf
7400: 28 22 25 64 2c 25 64 20 64 3d 25 34 64 20 75 3d  ("%d,%d d=%4d u=
7410: 25 34 64 20 72 3d 25 34 64 20 64 63 3d 25 63 20  %4d r=%4d dc=%c 
7420: 63 41 3d 25 63 20 63 42 3d 25 63 22 0a 20 20 20  cA=%c cB=%c".   
7430: 20 20 20 20 20 20 20 20 20 20 22 20 69 6e 73 3d            " ins=
7440: 25 34 64 20 64 65 6c 3d 25 34 64 20 73 75 62 3d  %4d del=%4d sub=
7450: 25 34 64 20 74 3d 25 34 64 20 6e 63 78 3d 25 63  %4d t=%4d ncx=%c
7460: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
7470: 20 20 78 41 2c 20 78 42 2c 20 64 2c 20 6d 5b 78    xA, xB, d, m[x
7480: 42 5d 2c 20 6d 5b 78 42 2d 31 5d 2c 20 64 63 3f  B], m[xB-1], dc?
7490: 64 63 3a 27 20 27 2c 20 63 41 2c 20 63 42 2c 0a  dc:' ', cA, cB,.
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 73               ins
74b0: 43 6f 73 74 2c 20 64 65 6c 43 6f 73 74 2c 20 73  Cost, delCost, s
74c0: 75 62 43 6f 73 74 2c 20 74 6f 74 61 6c 43 6f 73  ubCost, totalCos
74d0: 74 2c 20 6e 63 78 3f 6e 63 78 3a 27 20 27 29 3b  t, ncx?ncx:' ');
74e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
74f0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 6d 61 74  * Update the mat
7500: 72 69 78 20 2a 2f 0a 20 20 20 20 20 20 64 20 3d  rix */.      d =
7510: 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20 64 63   m[xB];.      dc
7520: 20 3d 20 63 78 5b 78 42 5d 3b 0a 20 20 20 20 20   = cx[xB];.     
7530: 20 6d 5b 78 42 5d 20 3d 20 74 6f 74 61 6c 43 6f   m[xB] = totalCo
7540: 73 74 3b 0a 20 20 20 20 20 20 63 78 5b 78 42 5d  st;.      cx[xB]
7550: 20 3d 20 6e 63 78 3b 0a 20 20 20 20 20 20 63 42   = ncx;.      cB
7560: 70 72 65 76 20 3d 20 63 42 3b 0a 20 20 20 20 7d  prev = cB;.    }
7570: 0a 20 20 20 20 63 41 70 72 65 76 20 3d 20 63 41  .    cAprev = cA
7580: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
7590: 20 74 68 65 20 77 61 67 6e 65 72 20 6d 61 74 72   the wagner matr
75a0: 69 78 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ix and return th
75b0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 66  e result */.  if
75c0: 28 20 63 41 3d 3d 27 2a 27 20 29 7b 0a 20 20 20  ( cA=='*' ){.   
75d0: 20 72 65 73 20 3d 20 6d 5b 31 5d 3b 0a 20 20 20   res = m[1];.   
75e0: 20 66 6f 72 28 78 42 3d 31 3b 20 78 42 3c 3d 6e   for(xB=1; xB<=n
75f0: 42 3b 20 78 42 2b 2b 29 7b 0a 20 20 20 20 20 20  B; xB++){.      
7600: 69 66 28 20 6d 5b 78 42 5d 3c 72 65 73 20 29 7b  if( m[xB]<res ){
7610: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d  .        res = m
7620: 5b 78 42 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  [xB];.        if
7630: 28 20 70 6e 4d 61 74 63 68 20 29 20 2a 70 6e 4d  ( pnMatch ) *pnM
7640: 61 74 63 68 20 3d 20 78 42 2b 6e 4d 61 74 63 68  atch = xB+nMatch
7650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7660: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73    }else{.    res
7670: 20 3d 20 6d 5b 6e 42 5d 3b 0a 20 20 20 20 69 66   = m[nB];.    if
7680: 28 20 70 6e 4d 61 74 63 68 20 29 20 2a 70 6e 4d  ( pnMatch ) *pnM
7690: 61 74 63 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  atch = -1;.  }. 
76a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 74 6f   sqlite3_free(to
76b0: 46 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Free);.  return 
76c0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75  res;.}../*.** Fu
76d0: 6e 63 74 69 6f 6e 3a 20 20 20 20 65 64 69 74 64  nction:    editd
76e0: 69 73 74 28 41 2c 42 29 0a 2a 2a 20 20 20 20 20  ist(A,B).**     
76f0: 20 20 20 20 20 20 20 20 20 65 64 69 74 64 69 73           editdis
7700: 74 28 41 2c 42 2c 6c 61 6e 67 69 64 29 0a 2a 2a  t(A,B,langid).**
7710: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
7720: 6f 73 74 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ost of transform
7730: 69 6e 67 20 73 74 72 69 6e 67 20 41 20 69 6e 74  ing string A int
7740: 6f 20 73 74 72 69 6e 67 20 42 2e 20 20 42 6f 74  o string B.  Bot
7750: 68 20 73 74 72 69 6e 67 73 0a 2a 2a 20 6d 75 73  h strings.** mus
7760: 74 20 62 65 20 70 75 72 65 20 41 53 43 49 49 20  t be pure ASCII 
7770: 74 65 78 74 2e 20 20 49 66 20 41 20 65 6e 64 73  text.  If A ends
7780: 20 77 69 74 68 20 27 2a 27 20 74 68 65 6e 20 69   with '*' then i
7790: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
77a0: 62 65 0a 2a 2a 20 61 20 70 72 65 66 69 78 20 6f  be.** a prefix o
77b0: 66 20 42 20 61 6e 64 20 65 78 74 72 61 20 63 68  f B and extra ch
77c0: 61 72 61 63 74 65 72 73 20 6f 6e 20 74 68 65 20  aracters on the 
77d0: 65 6e 64 20 6f 66 20 42 20 68 61 76 65 20 6d 69  end of B have mi
77e0: 6e 69 6d 61 6c 20 61 64 64 69 74 69 6f 6e 61 6c  nimal additional
77f0: 0a 2a 2a 20 63 6f 73 74 2e 0a 2a 2f 0a 73 74 61  .** cost..*/.sta
7800: 74 69 63 20 76 6f 69 64 20 65 64 69 74 64 69 73  tic void editdis
7810: 74 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  tSqlFunc(.  sqli
7820: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7830: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
7840: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7850: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
7860: 74 20 6c 61 6e 67 69 64 20 3d 20 61 72 67 63 3d  t langid = argc=
7870: 3d 32 20 3f 20 30 20 3a 20 73 71 6c 69 74 65 33  =2 ? 0 : sqlite3
7880: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7890: 32 5d 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  2]);.  int res =
78a0: 20 65 64 69 74 64 69 73 74 31 28 0a 20 20 20 20   editdist1(.    
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
78d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
78e0: 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20  argv[0]),.      
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
7900: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
7910: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7920: 67 76 5b 31 5d 29 2c 0a 20 20 20 20 20 20 20 20  gv[1]),.        
7930: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 6e 67              lang
7940: 69 64 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65  id, 0);.  if( re
7950: 73 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72  s<0 ){.    if( r
7960: 65 73 3d 3d 28 2d 33 29 20 29 7b 0a 20 20 20 20  es==(-3) ){.    
7970: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7980: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
7990: 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  text);.    }else
79a0: 20 69 66 28 20 72 65 73 3d 3d 28 2d 32 29 20 29   if( res==(-2) )
79b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
79c0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
79d0: 74 65 78 74 2c 20 22 6e 6f 6e 2d 41 53 43 49 49  text, "non-ASCII
79e0: 20 69 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69   input to editdi
79f0: 73 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20  st()", -1);.    
7a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7a10: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
7a20: 72 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c  r(context, "NULL
7a30: 20 69 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69   input to editdi
7a40: 73 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20  st()", -1);.    
7a50: 7d 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  }.  }else{ .    
7a60: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
7a70: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 29  nt(context, res)
7a80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 45 6e 64 20  ;.  }.}../* End 
7a90: 6f 66 20 74 68 65 20 66 69 78 65 64 2d 63 6f 73  of the fixed-cos
7aa0: 74 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20  t edit distance 
7ab0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a  implementation.*
7ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
7b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
7b60: 65 67 69 6e 3a 20 43 6f 6e 66 69 67 75 72 61 62  egin: Configurab
7b70: 6c 65 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20  le cost unicode 
7b80: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f  edit distance ro
7b90: 75 74 69 6e 65 73 0a 2a 2f 0a 2f 2a 20 46 6f 72  utines.*/./* For
7ba0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
7bb0: 20 6f 66 20 73 74 72 75 63 74 75 72 65 73 20 2a   of structures *
7bc0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
7bd0: 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 45   EditDist3Cost E
7be0: 64 69 74 44 69 73 74 33 43 6f 73 74 3b 0a 74 79  ditDist3Cost;.ty
7bf0: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69  pedef struct Edi
7c00: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 45 64 69  tDist3Config Edi
7c10: 74 44 69 73 74 33 43 6f 6e 66 69 67 3b 0a 74 79  tDist3Config;.ty
7c20: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69  pedef struct Edi
7c30: 74 44 69 73 74 33 50 6f 69 6e 74 20 45 64 69 74  tDist3Point Edit
7c40: 44 69 73 74 33 50 6f 69 6e 74 3b 0a 74 79 70 65  Dist3Point;.type
7c50: 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44  def struct EditD
7c60: 69 73 74 33 46 72 6f 6d 20 45 64 69 74 44 69 73  ist3From EditDis
7c70: 74 33 46 72 6f 6d 3b 0a 74 79 70 65 64 65 66 20  t3From;.typedef 
7c80: 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33  struct EditDist3
7c90: 46 72 6f 6d 53 74 72 69 6e 67 20 45 64 69 74 44  FromString EditD
7ca0: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 3b 0a  ist3FromString;.
7cb0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
7cc0: 64 69 74 44 69 73 74 33 54 6f 20 45 64 69 74 44  ditDist3To EditD
7cd0: 69 73 74 33 54 6f 3b 0a 74 79 70 65 64 65 66 20  ist3To;.typedef 
7ce0: 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33  struct EditDist3
7cf0: 54 6f 53 74 72 69 6e 67 20 45 64 69 74 44 69 73  ToString EditDis
7d00: 74 33 54 6f 53 74 72 69 6e 67 3b 0a 74 79 70 65  t3ToString;.type
7d10: 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44  def struct EditD
7d20: 69 73 74 33 4c 61 6e 67 20 45 64 69 74 44 69 73  ist3Lang EditDis
7d30: 74 33 4c 61 6e 67 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  t3Lang;.../*.** 
7d40: 41 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  An entry in the 
7d50: 65 64 69 74 20 63 6f 73 74 20 74 61 62 6c 65 0a  edit cost table.
7d60: 2a 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44 69  */.struct EditDi
7d70: 73 74 33 43 6f 73 74 20 7b 0a 20 20 45 64 69 74  st3Cost {.  Edit
7d80: 44 69 73 74 33 43 6f 73 74 20 2a 70 4e 65 78 74  Dist3Cost *pNext
7d90: 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f  ;     /* Next co
7da0: 73 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  st element */.  
7db0: 75 38 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20  u8 nFrom;       
7dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7dd0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
7de0: 61 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 6e 54  aFrom */.  u8 nT
7df0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
7e00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e10: 66 20 62 79 74 65 73 20 69 6e 20 61 54 6f 20 2a  f bytes in aTo *
7e20: 2f 0a 20 20 75 31 36 20 69 43 6f 73 74 3b 20 20  /.  u16 iCost;  
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e40: 20 43 6f 73 74 20 6f 66 20 74 68 69 73 20 74 72   Cost of this tr
7e50: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a  ansformation */.
7e60: 20 20 63 68 61 72 20 61 5b 34 5d 20 20 20 20 3b    char a[4]    ;
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
7e80: 52 4f 4d 20 73 74 72 69 6e 67 20 66 6f 6c 6c 6f  ROM string follo
7e90: 77 65 64 20 62 79 20 54 4f 20 73 74 72 69 6e 67  wed by TO string
7ea0: 20 2a 2f 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f   */.  /* Additio
7eb0: 6e 61 6c 20 54 4f 20 61 6e 64 20 46 52 4f 4d 20  nal TO and FROM 
7ec0: 73 74 72 69 6e 67 20 62 79 74 65 73 20 61 70 70  string bytes app
7ed0: 65 6e 64 65 64 20 61 73 20 6e 65 63 65 73 73 61  ended as necessa
7ee0: 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ry */.};../*.** 
7ef0: 45 64 69 74 20 63 6f 73 74 73 20 66 6f 72 20 61  Edit costs for a
7f00: 20 70 61 72 74 69 63 75 6c 61 72 20 6c 61 6e 67   particular lang
7f10: 75 61 67 65 20 49 44 20 0a 2a 2f 0a 73 74 72 75  uage ID .*/.stru
7f20: 63 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  ct EditDist3Lang
7f30: 20 7b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20   {.  int iLang; 
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7f50: 61 6e 67 75 61 67 65 20 49 44 20 2a 2f 0a 20 20  anguage ID */.  
7f60: 69 6e 74 20 69 49 6e 73 43 6f 73 74 3b 20 20 20  int iInsCost;   
7f70: 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
7f80: 74 20 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73 74  t insertion cost
7f90: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 65 6c 43 6f   */.  int iDelCo
7fa0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
7fb0: 44 65 66 61 75 6c 74 20 64 65 6c 65 74 69 6f 6e  Default deletion
7fc0: 20 63 6f 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   cost */.  int i
7fd0: 53 75 62 43 6f 73 74 3b 20 20 20 20 20 20 20 20  SubCost;        
7fe0: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 75 62    /* Default sub
7ff0: 73 74 69 74 75 74 69 6f 6e 20 63 6f 73 74 20 2a  stitution cost *
8000: 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73  /.  EditDist3Cos
8010: 74 20 2a 70 43 6f 73 74 3b 20 20 2f 2a 20 43 6f  t *pCost;  /* Co
8020: 73 74 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  sts */.};.../*.*
8030: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 45 64  * The default Ed
8040: 69 74 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a 65  itDist3Lang obje
8050: 63 74 2c 20 77 69 74 68 20 64 65 66 61 75 6c 74  ct, with default
8060: 20 63 6f 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69   costs..*/.stati
8070: 63 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74  c const EditDist
8080: 33 4c 61 6e 67 20 65 64 69 74 44 69 73 74 33 4c  3Lang editDist3L
8090: 61 6e 67 20 3d 20 7b 20 30 2c 20 31 30 30 2c 20  ang = { 0, 100, 
80a0: 31 30 30 2c 20 31 35 30 2c 20 30 20 7d 3b 0a 0a  100, 150, 0 };..
80b0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 6c 65 74 65 20 63  /*.** Complete c
80c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2f 0a  onfiguration.*/.
80d0: 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33  struct EditDist3
80e0: 43 6f 6e 66 69 67 20 7b 0a 20 20 69 6e 74 20 6e  Config {.  int n
80f0: 4c 61 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20  Lang;           
8100: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
8110: 61 6e 67 75 61 67 65 20 49 44 73 2e 20 20 53 69  anguage IDs.  Si
8120: 7a 65 20 6f 66 20 61 5b 5d 20 2a 2f 0a 20 20 45  ze of a[] */.  E
8130: 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 61 3b  ditDist3Lang *a;
8140: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 66 6f 72        /* One for
8150: 20 65 61 63 68 20 64 69 73 74 69 6e 63 74 20 6c   each distinct l
8160: 61 6e 67 75 61 67 65 20 49 44 20 2a 2f 0a 7d 3b  anguage ID */.};
8170: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 20 69 6e  ../*.** Extra in
8180: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
8190: 65 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69  each character i
81a0: 6e 20 74 68 65 20 46 52 4f 4d 20 73 74 72 69 6e  n the FROM strin
81b0: 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69  g..*/.struct Edi
81c0: 74 44 69 73 74 33 46 72 6f 6d 20 7b 0a 20 20 69  tDist3From {.  i
81d0: 6e 74 20 6e 53 75 62 73 74 3b 20 20 20 20 20 20  nt nSubst;      
81e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81f0: 72 20 6f 66 20 73 75 62 73 74 69 74 75 74 69 6f  r of substitutio
8200: 6e 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a  n cost entries *
8210: 2f 0a 20 20 69 6e 74 20 6e 44 65 6c 3b 20 20 20  /.  int nDel;   
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8230: 4e 75 6d 62 65 72 20 6f 66 20 64 65 6c 65 74 69  Number of deleti
8240: 6f 6e 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20  on cost entries 
8250: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8270: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
8280: 20 69 6e 20 74 68 69 73 20 63 68 61 72 61 63 74   in this charact
8290: 65 72 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74  er */.  EditDist
82a0: 33 43 6f 73 74 20 2a 2a 61 70 53 75 62 73 74 3b  3Cost **apSubst;
82b0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
82c0: 73 74 69 74 75 74 69 6f 6e 20 63 6f 73 74 73 20  stitution costs 
82d0: 66 6f 72 20 74 68 69 73 20 65 6c 65 6d 65 6e 74  for this element
82e0: 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43   */.  EditDist3C
82f0: 6f 73 74 20 2a 2a 61 70 44 65 6c 3b 20 20 20 2f  ost **apDel;   /
8300: 2a 20 41 72 72 61 79 20 6f 66 20 64 65 6c 65 74  * Array of delet
8310: 69 6f 6e 20 63 6f 73 74 20 65 6e 74 72 69 65 73  ion cost entries
8320: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
8330: 70 72 65 63 6f 6d 70 69 6c 65 64 20 46 52 4f 4d  precompiled FROM
8340: 20 73 74 72 69 6e 67 2e 0a 2a 0a 2a 2a 20 49 6e   string..*.** In
8350: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
8360: 20 77 65 20 65 78 70 65 63 74 20 74 68 65 20 46   we expect the F
8370: 52 4f 4d 20 73 74 72 69 6e 67 20 74 6f 20 62 65  ROM string to be
8380: 20 72 65 75 73 65 64 20 6d 75 6c 74 69 70 6c 65   reused multiple
8390: 20 74 69 6d 65 73 2e 0a 2a 2a 20 49 6e 20 6f 74   times..** In ot
83a0: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
83b0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 69 6c 6c 20  ommon case will 
83c0: 62 65 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68  be to measure th
83d0: 65 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 0a  e edit distance.
83e0: 2a 2a 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ** from a single
83f0: 20 6f 72 69 67 69 6e 20 73 74 72 69 6e 67 20 74   origin string t
8400: 6f 20 6d 75 6c 74 69 70 6c 65 20 74 61 72 67 65  o multiple targe
8410: 74 20 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74  t strings..*/.st
8420: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 46 72  ruct EditDist3Fr
8430: 6f 6d 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61  omString {.  cha
8440: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
8450: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
8460: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
8470: 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f  e FROM string */
8480: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
8490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
84a0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
84b0: 65 72 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ers in the FROM 
84c0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  string */.  int 
84d0: 69 73 50 72 65 66 69 78 3b 20 20 20 20 20 20 20  isPrefix;       
84e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
84f0: 65 6e 64 73 20 77 69 74 68 20 27 2a 27 20 63 68  ends with '*' ch
8500: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 45 64 69  aracter */.  Edi
8510: 74 44 69 73 74 33 46 72 6f 6d 20 2a 61 3b 20 20  tDist3From *a;  
8520: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 69        /* Extra i
8530: 6e 66 6f 20 61 62 6f 75 74 20 65 61 63 68 20 63  nfo about each c
8540: 68 61 72 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  har of the FROM 
8550: 73 74 72 69 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  string */.};../*
8560: 0a 2a 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d  .** Extra inform
8570: 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68  ation about each
8580: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
8590: 65 20 54 4f 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  e TO string..*/.
85a0: 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33  struct EditDist3
85b0: 54 6f 20 7b 0a 20 20 69 6e 74 20 6e 49 6e 73 3b  To {.  int nIns;
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 73  /* Number of ins
85e0: 65 72 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74 72  ertion cost entr
85f0: 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ies */.  int nBy
8600: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
8610: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
8620: 79 74 65 73 20 69 6e 20 74 68 69 73 20 63 68 61  ytes in this cha
8630: 72 61 63 74 65 72 20 2a 2f 0a 20 20 45 64 69 74  racter */.  Edit
8640: 44 69 73 74 33 43 6f 73 74 20 2a 2a 61 70 49 6e  Dist3Cost **apIn
8650: 73 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  s;   /* Array of
8660: 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65   deletion cost e
8670: 6e 74 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ntries */.};../*
8680: 0a 2a 2a 20 41 20 70 72 65 63 6f 6d 70 69 6c 65  .** A precompile
8690: 64 20 46 52 4f 4d 20 73 74 72 69 6e 67 0a 2a 2f  d FROM string.*/
86a0: 0a 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74  .struct EditDist
86b0: 33 54 6f 53 74 72 69 6e 67 20 7b 0a 20 20 63 68  3ToString {.  ch
86c0: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
86d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
86e0: 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
86f0: 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a  he TO string */.
8700: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
8710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8720: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
8730: 72 73 20 69 6e 20 74 68 65 20 54 4f 20 73 74 72  rs in the TO str
8740: 69 6e 67 20 2a 2f 0a 20 20 45 64 69 74 44 69 73  ing */.  EditDis
8750: 74 33 54 6f 20 2a 61 3b 20 20 20 20 20 20 20 20  t3To *a;        
8760: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 20    /* Extra info 
8770: 61 62 6f 75 74 20 65 61 63 68 20 63 68 61 72 20  about each char 
8780: 6f 66 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67  of the TO string
8790: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c   */.};../*.** Cl
87a0: 65 61 72 20 6f 72 20 64 65 6c 65 74 65 20 61 6e  ear or delete an
87b0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
87c0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 72 65 63   object that rec
87d0: 6f 72 64 73 20 61 6c 6c 20 65 64 69 74 2d 64 69  ords all edit-di
87e0: 73 74 61 6e 63 65 0a 2a 2a 20 77 65 69 67 68 74  stance.** weight
87f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
8800: 64 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69  d editDist3Confi
8810: 67 43 6c 65 61 72 28 45 64 69 74 44 69 73 74 33  gClear(EditDist3
8820: 43 6f 6e 66 69 67 20 2a 70 29 7b 0a 20 20 69 6e  Config *p){.  in
8830: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
8840: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8850: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 61 6e 67 3b  i=0; i<p->nLang;
8860: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 64 69 74 44   i++){.    EditD
8870: 69 73 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 2c  ist3Cost *pCost,
8880: 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 70 43 6f   *pNext;.    pCo
8890: 73 74 20 3d 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f  st = p->a[i].pCo
88a0: 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  st;.    while( p
88b0: 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4e  Cost ){.      pN
88c0: 65 78 74 20 3d 20 70 43 6f 73 74 2d 3e 70 4e 65  ext = pCost->pNe
88d0: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
88e0: 33 5f 66 72 65 65 28 70 43 6f 73 74 29 3b 0a 20  3_free(pCost);. 
88f0: 20 20 20 20 20 70 43 6f 73 74 20 3d 20 70 4e 65       pCost = pNe
8900: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  xt;.    }.  }.  
8910: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
8920: 61 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  a);.  memset(p, 
8930: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
8940: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 64  }.static void ed
8950: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c  itDist3ConfigDel
8960: 65 74 65 28 76 6f 69 64 20 2a 70 49 6e 29 7b 0a  ete(void *pIn){.
8970: 20 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69    EditDist3Confi
8980: 67 20 2a 70 20 3d 20 28 45 64 69 74 44 69 73 74  g *p = (EditDist
8990: 33 43 6f 6e 66 69 67 2a 29 70 49 6e 3b 0a 20 20  3Config*)pIn;.  
89a0: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43  editDist3ConfigC
89b0: 6c 65 61 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  lear(p);.  sqlit
89c0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  e3_free(p);.}../
89d0: 2a 0a 2a 2a 20 4c 6f 61 64 20 61 6c 6c 20 65 64  *.** Load all ed
89e0: 69 74 2d 64 69 73 74 61 6e 63 65 20 77 65 69 67  it-distance weig
89f0: 68 74 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  hts from a table
8a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8a10: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c  editDist3ConfigL
8a20: 6f 61 64 28 0a 20 20 45 64 69 74 44 69 73 74 33  oad(.  EditDist3
8a30: 43 6f 6e 66 69 67 20 2a 70 2c 20 20 20 20 20 20  Config *p,      
8a40: 2f 2a 20 54 68 65 20 65 64 69 74 20 64 69 73 74  /* The edit dist
8a50: 61 6e 63 65 20 63 6f 6e 66 69 67 75 72 61 74 69  ance configurati
8a60: 6f 6e 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20  on to load */.  
8a70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
8a80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
8a90: 66 72 6f 6d 20 74 68 69 73 20 64 61 74 61 62 61  from this databa
8aa0: 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  se */.  const ch
8ab0: 61 72 20 2a 7a 54 61 62 6c 65 20 20 20 20 20 20  ar *zTable      
8ac0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
8ad0: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
8ae0: 74 6f 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  to load */.){.  
8af0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
8b00: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
8b10: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
8b20: 6e 74 20 69 4c 61 6e 67 50 72 65 76 20 3d 20 2d  nt iLangPrev = -
8b30: 39 39 39 39 3b 0a 20 20 45 64 69 74 44 69 73 74  9999;.  EditDist
8b40: 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 3b 0a 0a 20  3Lang *pLang;.. 
8b50: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
8b60: 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
8b70: 69 4c 61 6e 67 2c 20 63 46 72 6f 6d 2c 20 63 54  iLang, cFrom, cT
8b80: 6f 2c 20 69 43 6f 73 74 22 0a 20 20 20 20 20 20  o, iCost".      
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 22 20 46 52 4f 4d 20 5c 22 25 77 5c 22     " FROM \"%w\"
8bb0: 20 57 48 45 52 45 20 69 4c 61 6e 67 3e 3d 30 20   WHERE iLang>=0 
8bc0: 4f 52 44 45 52 20 42 59 20 69 4c 61 6e 67 22 2c  ORDER BY iLang",
8bd0: 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20   zTable);.  if( 
8be0: 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
8bf0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8c00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
8c10: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
8c20: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
8c30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8c40: 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Sql);.  if( rc )
8c50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 65 64   return rc;.  ed
8c60: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43 6c 65  itDist3ConfigCle
8c70: 61 72 28 70 29 3b 0a 20 20 77 68 69 6c 65 28 20  ar(p);.  while( 
8c80: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
8c90: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
8ca0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67  ){.    int iLang
8cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
8cc0: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
8cd0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8ce0: 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20  *zFrom = (const 
8cf0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
8d00: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
8d10: 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 46 72   1);.    int nFr
8d20: 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  om = sqlite3_col
8d30: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
8d40: 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
8d50: 68 61 72 20 2a 7a 54 6f 20 3d 20 28 63 6f 6e 73  har *zTo = (cons
8d60: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
8d70: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
8d80: 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 6e  t, 2);.    int n
8d90: 54 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  To = sqlite3_col
8da0: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
8db0: 20 32 29 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f   2);.    int iCo
8dc0: 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  st = sqlite3_col
8dd0: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33  umn_int(pStmt, 3
8de0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 46 72 6f  );..    if( nFro
8df0: 6d 3e 31 30 30 20 7c 7c 20 6e 46 72 6f 6d 3c 30  m>100 || nFrom<0
8e00: 20 7c 7c 20 6e 54 6f 3e 31 30 30 20 7c 7c 20 6e   || nTo>100 || n
8e10: 54 6f 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  To<0 ) continue;
8e20: 0a 20 20 20 20 69 66 28 20 69 43 6f 73 74 3c 30  .    if( iCost<0
8e30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8e40: 20 69 66 28 20 69 4c 61 6e 67 21 3d 69 4c 61 6e   if( iLang!=iLan
8e50: 67 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 45  gPrev ){.      E
8e60: 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70 4e  ditDist3Lang *pN
8e70: 65 77 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 61  ew;.      p->nLa
8e80: 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 70 4e 65 77  ng++;.      pNew
8e90: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
8ea0: 6f 63 28 70 2d 3e 61 2c 20 70 2d 3e 6e 4c 61 6e  oc(p->a, p->nLan
8eb0: 67 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  g*sizeof(p->a[0]
8ec0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  ));.      if( pN
8ed0: 65 77 3d 3d 30 20 29 7b 20 72 63 20 3d 20 53 51  ew==0 ){ rc = SQ
8ee0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20 62 72 65 61  LITE_NOMEM; brea
8ef0: 6b 3b 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 20  k; }.      p->a 
8f00: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4c  = pNew;.      pL
8f10: 61 6e 67 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  ang = &p->a[p->n
8f20: 4c 61 6e 67 2d 31 5d 3b 0a 20 20 20 20 20 20 70  Lang-1];.      p
8f30: 4c 61 6e 67 2d 3e 69 4c 61 6e 67 20 3d 20 69 4c  Lang->iLang = iL
8f40: 61 6e 67 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67  ang;.      pLang
8f50: 2d 3e 69 49 6e 73 43 6f 73 74 20 3d 20 31 30 30  ->iInsCost = 100
8f60: 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  ;.      pLang->i
8f70: 44 65 6c 43 6f 73 74 20 3d 20 31 30 30 3b 0a 20  DelCost = 100;. 
8f80: 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 53 75 62       pLang->iSub
8f90: 43 6f 73 74 20 3d 20 32 30 30 3b 0a 20 20 20 20  Cost = 200;.    
8fa0: 20 20 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 20 3d    pLang->pCost =
8fb0: 20 30 3b 0a 20 20 20 20 20 20 69 4c 61 6e 67 50   0;.      iLangP
8fc0: 72 65 76 20 3d 20 69 4c 61 6e 67 3b 0a 20 20 20  rev = iLang;.   
8fd0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 6f 6d   }.    if( nFrom
8fe0: 3d 3d 31 20 26 26 20 7a 46 72 6f 6d 5b 30 5d 3d  ==1 && zFrom[0]=
8ff0: 3d 27 3f 27 20 26 26 20 6e 54 6f 3d 3d 30 20 29  ='?' && nTo==0 )
9000: 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  {.      pLang->i
9010: 44 65 6c 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b  DelCost = iCost;
9020: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
9030: 46 72 6f 6d 3d 3d 30 20 26 26 20 6e 54 6f 3d 3d  From==0 && nTo==
9040: 31 20 26 26 20 7a 54 6f 5b 30 5d 3d 3d 27 3f 27  1 && zTo[0]=='?'
9050: 20 29 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d   ){.      pLang-
9060: 3e 69 49 6e 73 43 6f 73 74 20 3d 20 69 43 6f 73  >iInsCost = iCos
9070: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
9080: 20 6e 46 72 6f 6d 3d 3d 31 20 26 26 20 6e 54 6f   nFrom==1 && nTo
9090: 3d 3d 31 20 26 26 20 7a 46 72 6f 6d 5b 30 5d 3d  ==1 && zFrom[0]=
90a0: 3d 27 3f 27 20 26 26 20 7a 54 6f 5b 30 5d 3d 3d  ='?' && zTo[0]==
90b0: 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 70 4c 61  '?' ){.      pLa
90c0: 6e 67 2d 3e 69 53 75 62 43 6f 73 74 20 3d 20 69  ng->iSubCost = i
90d0: 43 6f 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Cost;.    }else{
90e0: 0a 20 20 20 20 20 20 45 64 69 74 44 69 73 74 33  .      EditDist3
90f0: 43 6f 73 74 20 2a 70 43 6f 73 74 3b 0a 20 20 20  Cost *pCost;.   
9100: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20     int nExtra = 
9110: 6e 46 72 6f 6d 20 2b 20 6e 54 6f 20 2d 20 34 3b  nFrom + nTo - 4;
9120: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 78 74 72  .      if( nExtr
9130: 61 3c 30 20 29 20 6e 45 78 74 72 61 20 3d 20 30  a<0 ) nExtra = 0
9140: 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 20 3d 20  ;.      pCost = 
9150: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
9160: 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 20 2b  sizeof(*pCost) +
9170: 20 6e 45 78 74 72 61 20 29 3b 0a 20 20 20 20 20   nExtra );.     
9180: 20 69 66 28 20 70 43 6f 73 74 3d 3d 30 20 29 7b   if( pCost==0 ){
9190: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
91a0: 45 4d 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  EM; break; }.   
91b0: 20 20 20 70 43 6f 73 74 2d 3e 6e 46 72 6f 6d 20     pCost->nFrom 
91c0: 3d 20 6e 46 72 6f 6d 3b 0a 20 20 20 20 20 20 70  = nFrom;.      p
91d0: 43 6f 73 74 2d 3e 6e 54 6f 20 3d 20 6e 54 6f 3b  Cost->nTo = nTo;
91e0: 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 69 43  .      pCost->iC
91f0: 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a 20 20 20  ost = iCost;.   
9200: 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 73 74 2d     memcpy(pCost-
9210: 3e 61 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d  >a, zFrom, nFrom
9220: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
9230: 70 43 6f 73 74 2d 3e 61 20 2b 20 6e 46 72 6f 6d  pCost->a + nFrom
9240: 2c 20 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20  , zTo, nTo);.   
9250: 20 20 20 70 43 6f 73 74 2d 3e 70 4e 65 78 74 20     pCost->pNext 
9260: 3d 20 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 3b 0a  = pLang->pCost;.
9270: 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 70 43 6f        pLang->pCo
9280: 73 74 20 3d 20 70 43 6f 73 74 3b 20 0a 20 20 20  st = pCost; .   
9290: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
92a0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
92b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
92c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
92d0: 68 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79  he length (in by
92e0: 74 65 73 29 20 6f 66 20 61 20 75 74 66 2d 38 20  tes) of a utf-8 
92f0: 63 68 61 72 61 63 74 65 72 2e 20 20 4f 72 20 72  character.  Or r
9300: 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 0a  eturn a maximum.
9310: 2a 2a 20 6f 66 20 4e 2e 0a 2a 2f 0a 73 74 61 74  ** of N..*/.stat
9320: 69 63 20 69 6e 74 20 75 74 66 38 4c 65 6e 28 75  ic int utf8Len(u
9330: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 2c 20  nsigned char c, 
9340: 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6c 65  int N){.  int le
9350: 6e 20 3d 20 31 3b 0a 20 20 69 66 28 20 63 3e 30  n = 1;.  if( c>0
9360: 78 37 66 20 29 7b 0a 20 20 20 20 69 66 28 20 28  x7f ){.    if( (
9370: 63 26 30 78 65 30 29 3d 3d 30 78 63 30 20 29 7b  c&0xe0)==0xc0 ){
9380: 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 32 3b 0a  .      len = 2;.
9390: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
93a0: 26 30 78 66 30 29 3d 3d 30 78 65 30 20 29 7b 0a  &0xf0)==0xe0 ){.
93b0: 20 20 20 20 20 20 6c 65 6e 20 3d 20 33 3b 0a 20        len = 3;. 
93c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
93d0: 6c 65 6e 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  len = 4;.    }. 
93e0: 20 7d 0a 20 20 69 66 28 20 6c 65 6e 3e 4e 20 29   }.  if( len>N )
93f0: 20 6c 65 6e 20 3d 20 4e 3b 0a 20 20 72 65 74 75   len = N;.  retu
9400: 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn len;.}../*.**
9410: 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
9420: 6e 2d 7a 65 72 6f 29 20 6f 66 20 74 68 65 20 54  n-zero) of the T
9430: 6f 20 73 69 64 65 20 6f 66 20 74 68 65 20 67 69  o side of the gi
9440: 76 65 6e 20 63 6f 73 74 20 6d 61 74 63 68 65 73  ven cost matches
9450: 0a 2a 2a 20 74 68 65 20 67 69 76 65 6e 20 73 74  .** the given st
9460: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
9470: 69 6e 74 20 6d 61 74 63 68 54 6f 28 45 64 69 74  int matchTo(Edit
9480: 44 69 73 74 33 43 6f 73 74 20 2a 70 2c 20 63 6f  Dist3Cost *p, co
9490: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
94a0: 20 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 54   n){.  if( p->nT
94b0: 6f 3e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  o>n ) return 0;.
94c0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 2d 3e    if( memcmp(p->
94d0: 61 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 7a 2c 20 70  a+p->nFrom, z, p
94e0: 2d 3e 6e 54 6f 29 21 3d 30 20 29 20 72 65 74 75  ->nTo)!=0 ) retu
94f0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
9500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9510: 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
9520: 29 20 6f 66 20 74 68 65 20 54 6f 20 73 69 64 65  ) of the To side
9530: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f   of the given co
9540: 73 74 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68  st matches.** th
9550: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 0a  e given string..
9560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
9570: 74 63 68 46 72 6f 6d 28 45 64 69 74 44 69 73 74  tchFrom(EditDist
9580: 33 43 6f 73 74 20 2a 70 2c 20 63 6f 6e 73 74 20  3Cost *p, const 
9590: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
95a0: 0a 20 20 69 66 28 20 70 2d 3e 6e 46 72 6f 6d 3e  .  if( p->nFrom>
95b0: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
95c0: 69 66 28 20 6d 65 6d 63 6d 70 28 70 2d 3e 61 2c  if( memcmp(p->a,
95d0: 20 7a 2c 20 70 2d 3e 6e 46 72 6f 6d 29 21 3d 30   z, p->nFrom)!=0
95e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
95f0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
9600: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e  * Return TRUE (n
9610: 6f 6e 2d 7a 65 72 6f 29 20 6f 66 20 74 68 65 20  on-zero) of the 
9620: 6e 65 78 74 20 46 52 4f 4d 20 63 68 61 72 61 63  next FROM charac
9630: 74 65 72 20 61 6e 64 20 74 68 65 20 6e 65 78 74  ter and the next
9640: 20 54 4f 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   TO.** character
9650: 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a   are the same..*
9660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
9670: 63 68 46 72 6f 6d 54 6f 28 0a 20 20 45 64 69 74  chFromTo(.  Edit
9680: 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20  Dist3FromString 
9690: 2a 70 53 74 72 2c 20 20 2f 2a 20 4c 65 66 74 20  *pStr,  /* Left 
96a0: 68 61 6e 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20  hand string */. 
96b0: 20 69 6e 74 20 6e 31 2c 20 20 20 20 20 20 20 20   int n1,        
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
96d0: 49 6e 64 65 78 20 6f 66 20 63 6f 6d 70 61 72 69  Index of compari
96e0: 73 6f 6e 20 63 68 61 72 61 63 74 65 72 20 6f 6e  son character on
96f0: 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 63   the left */.  c
9700: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 2c 20 20  onst char *z2,  
9710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
9720: 67 68 74 2d 68 61 6e 64 6c 20 63 6f 6d 70 61 72  ght-handl compar
9730: 69 73 6f 6e 20 63 68 61 72 61 63 74 65 72 20 2a  ison character *
9740: 2f 0a 20 20 69 6e 74 20 6e 32 20 20 20 20 20 20  /.  int n2      
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 2f 2a 20 42 79 74 65 73 20 72 65 6d 61 69 6e 69  /* Bytes remaini
9770: 6e 67 20 69 6e 20 7a 32 5b 5d 20 2a 2f 0a 29 7b  ng in z2[] */.){
9780: 0a 20 20 69 6e 74 20 62 31 20 3d 20 70 53 74 72  .  int b1 = pStr
9790: 2d 3e 61 5b 6e 31 5d 2e 6e 42 79 74 65 3b 0a 20  ->a[n1].nByte;. 
97a0: 20 69 66 28 20 62 31 3e 6e 32 20 29 20 72 65 74   if( b1>n2 ) ret
97b0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6d 65 6d  urn 0;.  if( mem
97c0: 63 6d 70 28 70 53 74 72 2d 3e 7a 2b 6e 31 2c 20  cmp(pStr->z+n1, 
97d0: 7a 32 2c 20 62 31 29 21 3d 30 20 29 20 72 65 74  z2, b1)!=0 ) ret
97e0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
97f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  1;.}../*.** Dele
9800: 74 65 20 61 6e 20 45 64 69 74 44 69 73 74 33 46  te an EditDist3F
9810: 72 6f 6d 53 74 72 69 6e 67 20 6f 62 6a 65 63 63  romString objecc
9820: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
9830: 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   editDist3FromSt
9840: 72 69 6e 67 44 65 6c 65 74 65 28 45 64 69 74 44  ringDelete(EditD
9850: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a  ist3FromString *
9860: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
9870: 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  f( p ){.    for(
9880: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 3b 20 69 2b 2b  i=0; i<p->n; i++
9890: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
98a0: 5f 66 72 65 65 28 70 2d 3e 61 5b 69 5d 2e 61 70  _free(p->a[i].ap
98b0: 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Del);.      sqli
98c0: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 5b 69 5d  te3_free(p->a[i]
98d0: 2e 61 70 53 75 62 73 74 29 3b 0a 20 20 20 20 7d  .apSubst);.    }
98e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
98f0: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
9900: 2a 2a 20 43 72 65 61 74 65 20 61 20 45 64 69 74  ** Create a Edit
9910: 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20  Dist3FromString 
9920: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
9930: 63 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53  c EditDist3FromS
9940: 74 72 69 6e 67 20 2a 65 64 69 74 44 69 73 74 33  tring *editDist3
9950: 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 0a 20  FromStringNew(. 
9960: 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33   const EditDist3
9970: 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 0a 20 20 63  Lang *pLang,.  c
9980: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 0a 20 20  onst char *z,.  
9990: 69 6e 74 20 6e 0a 29 7b 0a 20 20 45 64 69 74 44  int n.){.  EditD
99a0: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a  ist3FromString *
99b0: 70 53 74 72 3b 0a 20 20 45 64 69 74 44 69 73 74  pStr;.  EditDist
99c0: 33 43 6f 73 74 20 2a 70 3b 0a 20 20 69 6e 74 20  3Cost *p;.  int 
99d0: 69 3b 0a 0a 20 20 69 66 28 20 6e 3c 30 20 29 20  i;..  if( n<0 ) 
99e0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
99f0: 7a 29 3b 0a 20 20 70 53 74 72 20 3d 20 73 71 6c  z);.  pStr = sql
9a00: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
9a10: 65 6f 66 28 2a 70 53 74 72 29 20 2b 20 73 69 7a  eof(*pStr) + siz
9a20: 65 6f 66 28 70 53 74 72 2d 3e 61 5b 30 5d 29 2a  eof(pStr->a[0])*
9a30: 6e 20 2b 20 6e 20 2b 20 31 20 29 3b 0a 20 20 69  n + n + 1 );.  i
9a40: 66 28 20 70 53 74 72 3d 3d 30 20 29 20 72 65 74  f( pStr==0 ) ret
9a50: 75 72 6e 20 30 3b 0a 20 20 70 53 74 72 2d 3e 61  urn 0;.  pStr->a
9a60: 20 3d 20 28 45 64 69 74 44 69 73 74 33 46 72 6f   = (EditDist3Fro
9a70: 6d 2a 29 26 70 53 74 72 5b 31 5d 3b 0a 20 20 70  m*)&pStr[1];.  p
9a80: 53 74 72 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 53  Str->n = n;.  pS
9a90: 74 72 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 26  tr->z = (char*)&
9aa0: 70 53 74 72 2d 3e 61 5b 6e 5d 3b 0a 20 20 6d 65  pStr->a[n];.  me
9ab0: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
9ac0: 20 6e 2b 31 29 3b 0a 20 20 69 66 28 20 6e 20 26   n+1);.  if( n &
9ad0: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b  & z[n-1]=='*' ){
9ae0: 0a 20 20 20 20 70 53 74 72 2d 3e 69 73 50 72 65  .    pStr->isPre
9af0: 66 69 78 20 3d 20 31 3b 0a 20 20 20 20 6e 2d 2d  fix = 1;.    n--
9b00: 3b 0a 20 20 20 20 70 53 74 72 2d 3e 6e 2d 2d 3b  ;.    pStr->n--;
9b10: 0a 20 20 20 20 70 53 74 72 2d 3e 7a 5b 6e 5d 20  .    pStr->z[n] 
9b20: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
9b30: 20 20 70 53 74 72 2d 3e 69 73 50 72 65 66 69 78    pStr->isPrefix
9b40: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72   = 0;.  }..  for
9b50: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
9b60: 0a 20 20 20 20 45 64 69 74 44 69 73 74 33 46 72  .    EditDist3Fr
9b70: 6f 6d 20 2a 70 46 72 6f 6d 20 3d 20 26 70 53 74  om *pFrom = &pSt
9b80: 72 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d  r->a[i];.    mem
9b90: 73 65 74 28 70 46 72 6f 6d 2c 20 30 2c 20 73 69  set(pFrom, 0, si
9ba0: 7a 65 6f 66 28 2a 70 46 72 6f 6d 29 29 3b 0a 20  zeof(*pFrom));. 
9bb0: 20 20 20 70 46 72 6f 6d 2d 3e 6e 42 79 74 65 20     pFrom->nByte 
9bc0: 3d 20 75 74 66 38 4c 65 6e 28 28 75 6e 73 69 67  = utf8Len((unsig
9bd0: 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 2c 20 6e  ned char)z[i], n
9be0: 2d 69 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  -i);.    for(p=p
9bf0: 4c 61 6e 67 2d 3e 70 43 6f 73 74 3b 20 70 3b 20  Lang->pCost; p; 
9c00: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
9c10: 20 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74     EditDist3Cost
9c20: 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20 20 20   **apNew;.      
9c30: 69 66 28 20 69 2b 70 2d 3e 6e 46 72 6f 6d 3e 6e  if( i+p->nFrom>n
9c40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9c50: 20 20 20 69 66 28 20 6d 61 74 63 68 46 72 6f 6d     if( matchFrom
9c60: 28 70 2c 20 7a 2b 69 2c 20 6e 2d 69 29 3d 3d 30  (p, z+i, n-i)==0
9c70: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9c80: 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 3d 3d 30     if( p->nTo==0
9c90: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 4e 65   ){.        apNe
9ca0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
9cb0: 6c 6f 63 28 70 46 72 6f 6d 2d 3e 61 70 44 65 6c  loc(pFrom->apDel
9cc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 73 69 7a 65 6f 66 28 2a 61 70 4e 65 77 29    sizeof(*apNew)
9cf0: 2a 28 70 46 72 6f 6d 2d 3e 6e 44 65 6c 2b 31 29  *(pFrom->nDel+1)
9d00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
9d10: 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pNew==0 ) break;
9d20: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
9d30: 61 70 44 65 6c 20 3d 20 61 70 4e 65 77 3b 0a 20  apDel = apNew;. 
9d40: 20 20 20 20 20 20 20 61 70 4e 65 77 5b 70 46 72         apNew[pFr
9d50: 6f 6d 2d 3e 6e 44 65 6c 2b 2b 5d 20 3d 20 70 3b  om->nDel++] = p;
9d60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9d70: 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 73 71        apNew = sq
9d80: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 46  lite3_realloc(pF
9d90: 72 6f 6d 2d 3e 61 70 53 75 62 73 74 2c 0a 20 20  rom->apSubst,.  
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
9dc0: 7a 65 6f 66 28 2a 61 70 4e 65 77 29 2a 28 70 46  zeof(*apNew)*(pF
9dd0: 72 6f 6d 2d 3e 6e 53 75 62 73 74 2b 31 29 29 3b  rom->nSubst+1));
9de0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 4e  .        if( apN
9df0: 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ew==0 ) break;. 
9e00: 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 61 70         pFrom->ap
9e10: 53 75 62 73 74 20 3d 20 61 70 4e 65 77 3b 0a 20  Subst = apNew;. 
9e20: 20 20 20 20 20 20 20 61 70 4e 65 77 5b 70 46 72         apNew[pFr
9e30: 6f 6d 2d 3e 6e 53 75 62 73 74 2b 2b 5d 20 3d 20  om->nSubst++] = 
9e40: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
9e50: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
9e60: 20 20 20 20 65 64 69 74 44 69 73 74 33 46 72 6f      editDist3Fro
9e70: 6d 53 74 72 69 6e 67 44 65 6c 65 74 65 28 70 53  mStringDelete(pS
9e80: 74 72 29 3b 0a 20 20 20 20 20 20 70 53 74 72 20  tr);.      pStr 
9e90: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
9ea0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9eb0: 74 75 72 6e 20 70 53 74 72 3b 0a 7d 0a 0a 23 69  turn pStr;.}..#i
9ec0: 66 20 30 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72  f 0 /* No longer
9ed0: 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52   used */./*.** R
9ee0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
9ef0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
9f00: 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 6f   common prefix o
9f10: 66 20 74 77 6f 20 55 54 46 38 20 73 74 72 69 6e  f two UTF8 strin
9f20: 67 73 2e 0a 2a 2a 20 4f 6e 6c 79 20 63 6f 6d 70  gs..** Only comp
9f30: 6c 65 74 65 20 63 68 61 72 61 63 74 65 72 73 20  lete characters 
9f40: 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a  are considered..
9f50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64  */.static int ed
9f60: 69 74 44 69 73 74 33 50 72 65 66 69 78 4c 65 6e  itDist3PrefixLen
9f70: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c  (const char *z1,
9f80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 29   const char *z2)
9f90: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
9fa0: 20 77 68 69 6c 65 28 20 7a 31 5b 6e 5d 20 26 26   while( z1[n] &&
9fb0: 20 7a 31 5b 6e 5d 3d 3d 7a 32 5b 6e 5d 20 29 7b   z1[n]==z2[n] ){
9fc0: 20 6e 2b 2b 3b 20 7d 0a 20 20 77 68 69 6c 65 28   n++; }.  while(
9fd0: 20 6e 20 26 26 20 28 7a 31 5b 6e 5d 26 30 78 63   n && (z1[n]&0xc
9fe0: 30 29 3d 3d 30 78 38 30 20 29 7b 20 6e 2d 2d 3b  0)==0x80 ){ n--;
9ff0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
a000: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a010: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
a020: 65 73 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  es in the common
a030: 20 73 75 66 66 69 78 20 6f 66 20 74 77 6f 20 55   suffix of two U
a040: 54 46 38 20 73 74 72 69 6e 67 73 2e 0a 2a 2a 20  TF8 strings..** 
a050: 4f 6e 6c 79 20 63 6f 6d 70 6c 65 74 65 20 63 68  Only complete ch
a060: 61 72 61 63 74 65 72 73 20 61 72 65 20 63 6f 6e  aracters are con
a070: 73 69 64 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  sidered..*/.stat
a080: 69 63 20 69 6e 74 20 65 64 69 74 44 69 73 74 33  ic int editDist3
a090: 53 75 66 66 69 78 4c 65 6e 28 63 6f 6e 73 74 20  SuffixLen(const 
a0a0: 63 68 61 72 20 2a 7a 31 2c 20 69 6e 74 20 6e 31  char *z1, int n1
a0b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32  , const char *z2
a0c0: 2c 20 69 6e 74 20 6e 32 29 7b 0a 20 20 69 6e 74  , int n2){.  int
a0d0: 20 6f 72 69 67 4e 31 20 3d 20 6e 31 3b 0a 20 20   origN1 = n1;.  
a0e0: 77 68 69 6c 65 28 20 6e 31 3e 30 20 26 26 20 6e  while( n1>0 && n
a0f0: 32 3e 30 20 26 26 20 7a 31 5b 6e 31 2d 31 5d 3d  2>0 && z1[n1-1]=
a100: 3d 7a 32 5b 6e 32 2d 31 5d 20 29 7b 20 6e 31 2d  =z2[n2-1] ){ n1-
a110: 2d 3b 20 6e 32 2d 2d 3b 20 7d 0a 20 20 77 68 69  -; n2--; }.  whi
a120: 6c 65 28 20 6e 31 3c 6f 72 69 67 4e 31 20 26 26  le( n1<origN1 &&
a130: 20 28 7a 31 5b 6e 31 5d 26 30 78 63 30 29 3d 3d   (z1[n1]&0xc0)==
a140: 30 78 38 30 20 29 7b 20 6e 31 2b 2b 3b 20 6e 32  0x80 ){ n1++; n2
a150: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ++; }.  return o
a160: 72 69 67 4e 31 20 2d 20 6e 31 3b 0a 7d 0a 23 65  rigN1 - n1;.}.#e
a170: 6e 64 69 66 20 2f 2a 20 30 20 2a 2f 0a 0a 2f 2a  ndif /* 0 */../*
a180: 0a 2a 2a 20 55 70 64 61 74 65 20 65 6e 74 72 79  .** Update entry
a190: 20 6d 5b 69 5d 20 73 75 63 68 20 74 68 61 74 20   m[i] such that 
a1a0: 69 74 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  it is the minimu
a1b0: 6d 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  m of its current
a1c0: 20 76 61 6c 75 65 0a 2a 2a 20 61 6e 64 20 6d 5b   value.** and m[
a1d0: 6a 5d 2b 69 43 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20  j]+iCost..**.** 
a1e0: 49 66 20 74 68 65 20 69 43 6f 73 74 20 69 73 20  If the iCost is 
a1f0: 31 2c 30 30 30 2c 30 30 30 20 6f 72 20 67 72 65  1,000,000 or gre
a200: 61 74 65 72 2c 20 74 68 65 6e 20 63 6f 6e 73 69  ater, then consi
a210: 64 65 72 20 74 68 65 20 63 6f 73 74 20 74 6f 20  der the cost to 
a220: 62 65 0a 2a 2a 20 69 6e 66 69 6e 69 74 65 20 61  be.** infinite a
a230: 6e 64 20 73 6b 69 70 20 74 68 65 20 75 70 64 61  nd skip the upda
a240: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
a250: 69 64 20 75 70 64 61 74 65 43 6f 73 74 28 0a 20  id updateCost(. 
a260: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6d   unsigned int *m
a270: 2c 0a 20 20 69 6e 74 20 69 2c 0a 20 20 69 6e 74  ,.  int i,.  int
a280: 20 6a 2c 0a 20 20 69 6e 74 20 69 43 6f 73 74 0a   j,.  int iCost.
a290: 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
a2a0: 28 20 69 43 6f 73 74 3c 31 30 30 30 30 20 29 7b  ( iCost<10000 ){
a2b0: 0a 20 20 20 20 62 20 3d 20 6d 5b 6a 5d 20 2b 20  .    b = m[j] + 
a2c0: 69 43 6f 73 74 3b 0a 20 20 20 20 69 66 28 20 62  iCost;.    if( b
a2d0: 3c 6d 5b 69 5d 20 29 20 6d 5b 69 5d 20 3d 20 62  <m[i] ) m[i] = b
a2e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  ;.  }.}../* Comp
a2f0: 75 74 65 20 74 68 65 20 65 64 69 74 20 64 69 73  ute the edit dis
a300: 74 61 6e 63 65 20 62 65 74 77 65 65 6e 20 74 77  tance between tw
a310: 6f 20 73 74 72 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a  o strings..**.**
a320: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
a330: 75 72 73 2c 20 72 65 74 75 72 6e 20 61 20 6e 65  urs, return a ne
a340: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 77 68  gative number wh
a350: 69 63 68 20 69 73 20 74 68 65 20 65 72 72 6f 72  ich is the error
a360: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   code..**.** If 
a370: 70 6e 4d 61 74 63 68 20 69 73 20 6e 6f 74 20 4e  pnMatch is not N
a380: 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 6e 4d 61 74  ULL, then *pnMat
a390: 63 68 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ch is set to the
a3a0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
a3b0: 63 74 65 72 73 0a 2a 2a 20 28 6e 6f 74 20 62 79  cters.** (not by
a3c0: 74 65 73 29 20 69 6e 20 7a 32 20 74 68 61 74 20  tes) in z2 that 
a3d0: 6d 61 74 63 68 65 64 20 74 68 65 20 73 65 61 72  matched the sear
a3e0: 63 68 20 70 61 74 74 65 72 6e 20 69 6e 20 2a 70  ch pattern in *p
a3f0: 46 72 6f 6d 2e 20 49 66 20 70 46 72 6f 6d 20 64  From. If pFrom d
a400: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
a410: 69 6e 20 74 68 65 20 70 61 74 74 65 72 6e 20 66  in the pattern f
a420: 6f 72 20 61 20 70 72 65 66 69 78 2d 73 65 61 72  or a prefix-sear
a430: 63 68 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  ch, then this is
a440: 20 61 6c 77 61 79 73 20 74 68 65 20 6e 75 6d 62   always the numb
a450: 65 72 0a 2a 2a 20 6f 66 20 63 68 61 72 61 63 74  er.** of charact
a460: 65 72 73 20 69 6e 20 7a 32 2e 20 49 66 20 70 46  ers in z2. If pF
a470: 72 6f 6d 20 64 6f 65 73 20 63 6f 6e 74 61 69 6e  rom does contain
a480: 20 61 20 70 72 65 66 69 78 20 73 65 61 72 63 68   a prefix search
a490: 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 0a 2a   pattern, then.*
a4a0: 2a 20 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62  * it is the numb
a4b0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
a4c0: 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 20 6f   in the prefix o
a4d0: 66 20 7a 32 20 74 68 61 74 20 77 61 73 20 64 65  f z2 that was de
a4e0: 65 6d 65 64 20 74 6f 20 0a 2a 2a 20 6d 61 74 63  emed to .** matc
a4f0: 68 20 70 46 72 6f 6d 2e 0a 2a 2f 0a 73 74 61 74  h pFrom..*/.stat
a500: 69 63 20 69 6e 74 20 65 64 69 74 44 69 73 74 33  ic int editDist3
a510: 43 6f 72 65 28 0a 20 20 45 64 69 74 44 69 73 74  Core(.  EditDist
a520: 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 46 72  3FromString *pFr
a530: 6f 6d 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  om,  /* The FROM
a540: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e   string */.  con
a550: 73 74 20 63 68 61 72 20 2a 7a 32 2c 20 20 20 20  st char *z2,    
a560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a570: 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20   TO string */.  
a580: 69 6e 74 20 6e 32 2c 20 20 20 20 20 20 20 20 20  int n2,         
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5a0: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 54 4f  Length of the TO
a5b0: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e   string */.  con
a5c0: 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  st EditDist3Lang
a5d0: 20 2a 70 4c 61 6e 67 2c 20 20 2f 2a 20 45 64 69   *pLang,  /* Edi
a5e0: 74 20 77 65 69 67 68 74 73 20 66 6f 72 20 61 20  t weights for a 
a5f0: 70 61 72 74 69 63 75 6c 61 72 20 6c 61 6e 67 75  particular langu
a600: 61 67 65 20 49 44 20 2a 2f 0a 20 20 69 6e 74 20  age ID */.  int 
a610: 2a 70 6e 4d 61 74 63 68 20 20 20 20 20 20 20 20  *pnMatch        
a620: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
a630: 20 43 68 61 72 61 63 74 65 72 73 20 69 6e 20 6d   Characters in m
a640: 61 74 63 68 65 64 20 70 72 65 66 69 78 20 2a 2f  atched prefix */
a650: 0a 29 7b 0a 20 20 69 6e 74 20 6b 2c 20 6e 3b 0a  .){.  int k, n;.
a660: 20 20 69 6e 74 20 69 31 2c 20 62 31 3b 0a 20 20    int i1, b1;.  
a670: 69 6e 74 20 69 32 2c 20 62 32 3b 0a 20 20 45 64  int i2, b2;.  Ed
a680: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
a690: 67 20 66 20 3d 20 2a 70 46 72 6f 6d 3b 0a 20 20  g f = *pFrom;.  
a6a0: 45 64 69 74 44 69 73 74 33 54 6f 20 2a 61 32 3b  EditDist3To *a2;
a6b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
a6c0: 2a 6d 3b 0a 20 20 69 6e 74 20 73 7a 52 6f 77 3b  *m;.  int szRow;
a6d0: 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74  .  EditDist3Cost
a6e0: 20 2a 70 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a   *p;.  int res;.
a6f0: 0a 23 69 66 20 30 0a 20 20 2f 2a 20 52 65 6d 6f  .#if 0.  /* Remo
a700: 76 65 20 63 6f 6d 6d 65 6e 74 20 70 72 65 66 69  ve comment prefi
a710: 78 20 61 6e 64 20 73 75 66 66 69 78 20 2a 2f 0a  x and suffix */.
a720: 20 20 6e 20 3d 20 65 64 69 74 44 69 73 74 33 50    n = editDist3P
a730: 72 65 66 69 78 4c 65 6e 28 66 2e 7a 2c 20 7a 32  refixLen(f.z, z2
a740: 29 3b 0a 20 20 69 66 28 20 66 2e 6e 3d 3d 6e 32  );.  if( f.n==n2
a750: 20 26 26 20 6e 32 3d 3d 6e 20 29 20 72 65 74 75   && n2==n ) retu
a760: 72 6e 20 30 3b 20 20 2f 2a 20 49 64 65 6e 74 69  rn 0;  /* Identi
a770: 63 61 6c 20 73 74 72 69 6e 67 73 20 2a 2f 0a 20  cal strings */. 
a780: 20 66 2e 6e 20 2d 3d 20 6e 3b 0a 20 20 66 2e 7a   f.n -= n;.  f.z
a790: 20 2b 3d 20 6e 3b 0a 20 20 66 2e 61 20 2b 3d 20   += n;.  f.a += 
a7a0: 6e 3b 0a 20 20 6e 32 20 2d 3d 20 6e 3b 0a 20 20  n;.  n2 -= n;.  
a7b0: 7a 32 20 2b 3d 20 6e 3b 0a 20 20 69 66 28 20 66  z2 += n;.  if( f
a7c0: 2e 69 73 50 72 65 66 69 78 3d 3d 30 20 29 7b 0a  .isPrefix==0 ){.
a7d0: 20 20 20 20 6e 20 3d 20 65 64 69 74 44 69 73 74      n = editDist
a7e0: 33 53 75 66 66 69 78 4c 65 6e 28 66 2e 7a 2c 20  3SuffixLen(f.z, 
a7f0: 66 2e 6e 2c 20 7a 32 2c 20 6e 32 29 3b 0a 20 20  f.n, z2, n2);.  
a800: 20 20 66 2e 6e 20 2d 3d 20 6e 3b 0a 20 20 20 20    f.n -= n;.    
a810: 6e 32 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 23 65 6e  n2 -= n;.  }.#en
a820: 64 69 66 0a 0a 20 20 2f 2a 20 61 6c 6c 6f 63 61  dif..  /* alloca
a830: 74 65 20 74 68 65 20 57 61 67 6e 65 72 20 6d 61  te the Wagner ma
a840: 74 72 69 78 20 61 6e 64 20 74 68 65 20 61 54 6f  trix and the aTo
a850: 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 74 68 65  [] array for the
a860: 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20   TO string */.  
a870: 6e 20 3d 20 28 66 2e 6e 2b 31 29 2a 28 6e 32 2b  n = (f.n+1)*(n2+
a880: 31 29 3b 0a 20 20 6e 20 3d 20 28 6e 2b 31 29 26  1);.  n = (n+1)&
a890: 7e 31 3b 0a 20 20 6d 20 3d 20 73 71 6c 69 74 65  ~1;.  m = sqlite
a8a0: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2a 73 69 7a 65  3_malloc( n*size
a8b0: 6f 66 28 6d 5b 30 5d 29 20 2b 20 73 69 7a 65 6f  of(m[0]) + sizeo
a8c0: 66 28 61 32 5b 30 5d 29 2a 6e 32 20 29 3b 0a 20  f(a2[0])*n2 );. 
a8d0: 20 69 66 28 20 6d 3d 3d 30 20 29 20 72 65 74 75   if( m==0 ) retu
a8e0: 72 6e 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20  rn -1;          
a8f0: 20 20 2f 2a 20 4f 75 74 20 6f 66 20 6d 65 6d 6f    /* Out of memo
a900: 72 79 20 2a 2f 0a 20 20 61 32 20 3d 20 28 45 64  ry */.  a2 = (Ed
a910: 69 74 44 69 73 74 33 54 6f 2a 29 26 6d 5b 6e 5d  itDist3To*)&m[n]
a920: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 32 2c 20 30  ;.  memset(a2, 0
a930: 2c 20 73 69 7a 65 6f 66 28 61 32 5b 30 5d 29 2a  , sizeof(a2[0])*
a940: 6e 32 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  n2);..  /* Fill 
a950: 69 6e 20 74 68 65 20 61 31 5b 5d 20 6d 61 74 72  in the a1[] matr
a960: 69 78 20 66 6f 72 20 61 6c 6c 20 63 68 61 72 61  ix for all chara
a970: 63 74 65 72 73 20 6f 66 20 74 68 65 20 54 4f 20  cters of the TO 
a980: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 66 6f 72 28  string */.  for(
a990: 69 32 3d 30 3b 20 69 32 3c 6e 32 3b 20 69 32 2b  i2=0; i2<n2; i2+
a9a0: 2b 29 7b 0a 20 20 20 20 61 32 5b 69 32 5d 2e 6e  +){.    a2[i2].n
a9b0: 42 79 74 65 20 3d 20 75 74 66 38 4c 65 6e 28 28  Byte = utf8Len((
a9c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 32  unsigned char)z2
a9d0: 5b 69 32 5d 2c 20 6e 32 2d 69 32 29 3b 0a 20 20  [i2], n2-i2);.  
a9e0: 20 20 66 6f 72 28 70 3d 70 4c 61 6e 67 2d 3e 70    for(p=pLang->p
a9f0: 43 6f 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Cost; p; p=p->pN
aa00: 65 78 74 29 7b 0a 20 20 20 20 20 20 45 64 69 74  ext){.      Edit
aa10: 44 69 73 74 33 43 6f 73 74 20 2a 2a 61 70 4e 65  Dist3Cost **apNe
aa20: 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  w;.      if( p->
aa30: 6e 46 72 6f 6d 3e 30 20 29 20 63 6f 6e 74 69 6e  nFrom>0 ) contin
aa40: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 32  ue;.      if( i2
aa50: 2b 70 2d 3e 6e 54 6f 3e 6e 32 20 29 20 63 6f 6e  +p->nTo>n2 ) con
aa60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
aa70: 20 6d 61 74 63 68 54 6f 28 70 2c 20 7a 32 2b 69   matchTo(p, z2+i
aa80: 32 2c 20 6e 32 2d 69 32 29 3d 3d 30 20 29 20 63  2, n2-i2)==0 ) c
aa90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
aaa0: 32 5b 69 32 5d 2e 6e 49 6e 73 2b 2b 3b 0a 20 20  2[i2].nIns++;.  
aab0: 20 20 20 20 61 70 4e 65 77 20 3d 20 73 71 6c 69      apNew = sqli
aac0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 32 5b 69  te3_realloc(a2[i
aad0: 32 5d 2e 61 70 49 6e 73 2c 20 73 69 7a 65 6f 66  2].apIns, sizeof
aae0: 28 2a 61 70 4e 65 77 29 2a 61 32 5b 69 32 5d 2e  (*apNew)*a2[i2].
aaf0: 6e 49 6e 73 29 3b 0a 20 20 20 20 20 20 69 66 28  nIns);.      if(
ab00: 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20   apNew==0 ){.   
ab10: 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 20 20       res = -1;  
ab20: 2f 2a 20 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* Out of memory
ab30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
ab40: 20 65 64 69 74 44 69 73 74 33 41 62 6f 72 74 3b   editDist3Abort;
ab50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
ab60: 32 5b 69 32 5d 2e 61 70 49 6e 73 20 3d 20 61 70  2[i2].apIns = ap
ab70: 4e 65 77 3b 0a 20 20 20 20 20 20 61 32 5b 69 32  New;.      a2[i2
ab80: 5d 2e 61 70 49 6e 73 5b 61 32 5b 69 32 5d 2e 6e  ].apIns[a2[i2].n
ab90: 49 6e 73 2d 31 5d 20 3d 20 70 3b 0a 20 20 20 20  Ins-1] = p;.    
aba0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70  }.  }..  /* Prep
abb0: 61 72 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  are to compute t
abc0: 68 65 20 6d 69 6e 69 6d 75 6d 20 65 64 69 74 20  he minimum edit 
abd0: 64 69 73 74 61 6e 63 65 20 2a 2f 0a 20 20 73 7a  distance */.  sz
abe0: 52 6f 77 20 3d 20 66 2e 6e 2b 31 3b 0a 20 20 6d  Row = f.n+1;.  m
abf0: 65 6d 73 65 74 28 6d 2c 20 30 78 30 31 2c 20 28  emset(m, 0x01, (
ac00: 6e 32 2b 31 29 2a 73 7a 52 6f 77 2a 73 69 7a 65  n2+1)*szRow*size
ac10: 6f 66 28 6d 5b 30 5d 29 29 3b 0a 20 20 6d 5b 30  of(m[0]));.  m[0
ac20: 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 72  ] = 0;..  /* Fir
ac30: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 74  st fill in the t
ac40: 6f 70 2d 72 6f 77 20 6f 66 20 74 68 65 20 6d 61  op-row of the ma
ac50: 74 72 69 78 20 77 69 74 68 20 46 52 4f 4d 20 64  trix with FROM d
ac60: 65 6c 65 74 69 6f 6e 20 63 6f 73 74 73 20 2a 2f  eletion costs */
ac70: 0a 20 20 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c  .  for(i1=0; i1<
ac80: 66 2e 6e 3b 20 69 31 20 2b 3d 20 62 31 29 7b 0a  f.n; i1 += b1){.
ac90: 20 20 20 20 62 31 20 3d 20 66 2e 61 5b 69 31 5d      b1 = f.a[i1]
aca0: 2e 6e 42 79 74 65 3b 0a 20 20 20 20 75 70 64 61  .nByte;.    upda
acb0: 74 65 43 6f 73 74 28 6d 2c 20 69 31 2b 62 31 2c  teCost(m, i1+b1,
acc0: 20 69 31 2c 20 70 4c 61 6e 67 2d 3e 69 44 65 6c   i1, pLang->iDel
acd0: 43 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72 28 6b  Cost);.    for(k
ace0: 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 44  =0; k<f.a[i1].nD
acf0: 65 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  el; k++){.      
ad00: 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70 44 65  p = f.a[i1].apDe
ad10: 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 75 70 64 61  l[k];.      upda
ad20: 74 65 43 6f 73 74 28 6d 2c 20 69 31 2b 70 2d 3e  teCost(m, i1+p->
ad30: 6e 46 72 6f 6d 2c 20 69 31 2c 20 70 2d 3e 69 43  nFrom, i1, p->iC
ad40: 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ost);.    }.  }.
ad50: 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 61 6c  .  /* Fill in al
ad60: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77  l subsequent row
ad70: 73 2c 20 74 6f 70 2d 74 6f 2d 62 6f 74 74 6f 6d  s, top-to-bottom
ad80: 2c 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20  , left-to-right 
ad90: 2a 2f 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20 69  */.  for(i2=0; i
ada0: 32 3c 6e 32 3b 20 69 32 20 2b 3d 20 62 32 29 7b  2<n2; i2 += b2){
adb0: 0a 20 20 20 20 69 6e 74 20 72 78 3b 20 20 20 20  .    int rx;    
adc0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 69 6e    /* Starting in
add0: 64 65 78 20 66 6f 72 20 63 75 72 72 65 6e 74 20  dex for current 
ade0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  row */.    int r
adf0: 78 70 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74  xp;     /* Start
ae00: 69 6e 67 20 69 6e 64 65 78 20 66 6f 72 20 70 72  ing index for pr
ae10: 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20  evious row */.  
ae20: 20 20 62 32 20 3d 20 61 32 5b 69 32 5d 2e 6e 42    b2 = a2[i2].nB
ae30: 79 74 65 3b 0a 20 20 20 20 72 78 20 3d 20 73 7a  yte;.    rx = sz
ae40: 52 6f 77 2a 28 69 32 2b 62 32 29 3b 0a 20 20 20  Row*(i2+b2);.   
ae50: 20 72 78 70 20 3d 20 73 7a 52 6f 77 2a 69 32 3b   rxp = szRow*i2;
ae60: 0a 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28  .    updateCost(
ae70: 6d 2c 20 72 78 2c 20 72 78 70 2c 20 70 4c 61 6e  m, rx, rxp, pLan
ae80: 67 2d 3e 69 49 6e 73 43 6f 73 74 29 3b 0a 20 20  g->iInsCost);.  
ae90: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 61 32 5b    for(k=0; k<a2[
aea0: 69 32 5d 2e 6e 49 6e 73 3b 20 6b 2b 2b 29 7b 0a  i2].nIns; k++){.
aeb0: 20 20 20 20 20 20 70 20 3d 20 61 32 5b 69 32 5d        p = a2[i2]
aec0: 2e 61 70 49 6e 73 5b 6b 5d 3b 0a 20 20 20 20 20  .apIns[k];.     
aed0: 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 73   updateCost(m, s
aee0: 7a 52 6f 77 2a 28 69 32 2b 70 2d 3e 6e 54 6f 29  zRow*(i2+p->nTo)
aef0: 2c 20 72 78 70 2c 20 70 2d 3e 69 43 6f 73 74 29  , rxp, p->iCost)
af00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
af10: 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20 69 31  i1=0; i1<f.n; i1
af20: 2b 3d 62 31 29 7b 0a 20 20 20 20 20 20 69 6e 74  +=b1){.      int
af30: 20 63 78 3b 20 20 20 20 2f 2a 20 49 6e 64 65 78   cx;    /* Index
af40: 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   of current cell
af50: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 78   */.      int cx
af60: 70 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  p;   /* Index of
af70: 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
af80: 79 20 74 6f 20 74 68 65 20 6c 65 66 74 20 2a 2f  y to the left */
af90: 0a 20 20 20 20 20 20 69 6e 74 20 63 78 64 3b 20  .      int cxd; 
afa0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65    /* Index of ce
afb0: 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ll to the left a
afc0: 6e 64 20 6f 6e 65 20 72 6f 77 20 61 62 6f 76 65  nd one row above
afd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 78   */.      int cx
afe0: 75 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  u;   /* Index of
aff0: 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
b000: 79 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20  y above */.     
b010: 20 62 31 20 3d 20 66 2e 61 5b 69 31 5d 2e 6e 42   b1 = f.a[i1].nB
b020: 79 74 65 3b 0a 20 20 20 20 20 20 63 78 70 20 3d  yte;.      cxp =
b030: 20 72 78 20 2b 20 69 31 3b 0a 20 20 20 20 20 20   rx + i1;.      
b040: 63 78 20 3d 20 63 78 70 20 2b 20 62 31 3b 0a 20  cx = cxp + b1;. 
b050: 20 20 20 20 20 63 78 64 20 3d 20 72 78 70 20 2b       cxd = rxp +
b060: 20 69 31 3b 0a 20 20 20 20 20 20 63 78 75 20 3d   i1;.      cxu =
b070: 20 63 78 64 20 2b 20 62 31 3b 0a 20 20 20 20 20   cxd + b1;.     
b080: 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63   updateCost(m, c
b090: 78 2c 20 63 78 70 2c 20 70 4c 61 6e 67 2d 3e 69  x, cxp, pLang->i
b0a0: 44 65 6c 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  DelCost);.      
b0b0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b 69  for(k=0; k<f.a[i
b0c0: 31 5d 2e 6e 44 65 6c 3b 20 6b 2b 2b 29 7b 0a 20  1].nDel; k++){. 
b0d0: 20 20 20 20 20 20 20 70 20 3d 20 66 2e 61 5b 69         p = f.a[i
b0e0: 31 5d 2e 61 70 44 65 6c 5b 6b 5d 3b 0a 20 20 20  1].apDel[k];.   
b0f0: 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28       updateCost(
b100: 6d 2c 20 63 78 70 2b 70 2d 3e 6e 46 72 6f 6d 2c  m, cxp+p->nFrom,
b110: 20 63 78 70 2c 20 70 2d 3e 69 43 6f 73 74 29 3b   cxp, p->iCost);
b120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
b130: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 2c  pdateCost(m, cx,
b140: 20 63 78 75 2c 20 70 4c 61 6e 67 2d 3e 69 49 6e   cxu, pLang->iIn
b150: 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 69 66  sCost);.      if
b160: 28 20 6d 61 74 63 68 46 72 6f 6d 54 6f 28 26 66  ( matchFromTo(&f
b170: 2c 20 69 31 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d  , i1, z2+i2, n2-
b180: 69 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  i2) ){.        u
b190: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 2c  pdateCost(m, cx,
b1a0: 20 63 78 64 2c 20 30 29 3b 0a 20 20 20 20 20 20   cxd, 0);.      
b1b0: 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65 43 6f  }.      updateCo
b1c0: 73 74 28 6d 2c 20 63 78 2c 20 63 78 64 2c 20 70  st(m, cx, cxd, p
b1d0: 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73 74 29 3b  Lang->iSubCost);
b1e0: 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
b1f0: 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 53 75 62 73 74  k<f.a[i1].nSubst
b200: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
b210: 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70 53 75  p = f.a[i1].apSu
b220: 62 73 74 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  bst[k];.        
b230: 69 66 28 20 6d 61 74 63 68 54 6f 28 70 2c 20 7a  if( matchTo(p, z
b240: 32 2b 69 32 2c 20 6e 32 2d 69 32 29 20 29 7b 0a  2+i2, n2-i2) ){.
b250: 20 20 20 20 20 20 20 20 20 20 75 70 64 61 74 65            update
b260: 43 6f 73 74 28 6d 2c 20 63 78 64 2b 70 2d 3e 6e  Cost(m, cxd+p->n
b270: 46 72 6f 6d 2b 73 7a 52 6f 77 2a 70 2d 3e 6e 54  From+szRow*p->nT
b280: 6f 2c 20 63 78 64 2c 20 70 2d 3e 69 43 6f 73 74  o, cxd, p->iCost
b290: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b2a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
b2b0: 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22  #if 0.  printf("
b2c0: 20 20 20 20 20 20 20 20 20 5e 22 29 3b 0a 20 20           ^");.  
b2d0: 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e  for(i1=0; i1<f.n
b2e0: 3b 20 69 31 2b 2b 29 20 70 72 69 6e 74 66 28 22  ; i1++) printf("
b2f0: 20 25 63 2d 25 32 78 22 2c 20 66 2e 7a 5b 69 31   %c-%2x", f.z[i1
b300: 5d 2c 20 66 2e 7a 5b 69 31 5d 26 30 78 66 66 29  ], f.z[i1]&0xff)
b310: 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 20 20  ;.  printf("\n  
b320: 20 5e 3a 22 29 3b 0a 20 20 66 6f 72 28 69 31 3d   ^:");.  for(i1=
b330: 30 3b 20 69 31 3c 73 7a 52 6f 77 3b 20 69 31 2b  0; i1<szRow; i1+
b340: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20  +){.    int v = 
b350: 6d 5b 69 31 5d 3b 0a 20 20 20 20 69 66 28 20 76  m[i1];.    if( v
b360: 3e 39 39 39 39 20 29 20 70 72 69 6e 74 66 28 22  >9999 ) printf("
b370: 20 2a 2a 2a 2a 22 29 3b 0a 20 20 20 20 65 6c 73   ****");.    els
b380: 65 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  e         printf
b390: 28 22 20 25 34 64 22 2c 20 76 29 3b 0a 20 20 7d  (" %4d", v);.  }
b3a0: 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b  .  printf("\n");
b3b0: 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c  .  for(i2=0; i2<
b3c0: 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20 20 20 20 70  n2; i2++){.    p
b3d0: 72 69 6e 74 66 28 22 25 63 2d 25 30 32 78 3a 22  rintf("%c-%02x:"
b3e0: 2c 20 7a 32 5b 69 32 5d 2c 20 7a 32 5b 69 32 5d  , z2[i2], z2[i2]
b3f0: 26 30 78 66 66 29 3b 0a 20 20 20 20 66 6f 72 28  &0xff);.    for(
b400: 69 31 3d 30 3b 20 69 31 3c 73 7a 52 6f 77 3b 20  i1=0; i1<szRow; 
b410: 69 31 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  i1++){.      int
b420: 20 76 20 3d 20 6d 5b 28 69 32 2b 31 29 2a 73 7a   v = m[(i2+1)*sz
b430: 52 6f 77 2b 69 31 5d 3b 0a 20 20 20 20 20 20 69  Row+i1];.      i
b440: 66 28 20 76 3e 39 39 39 39 20 29 20 70 72 69 6e  f( v>9999 ) prin
b450: 74 66 28 22 20 2a 2a 2a 2a 22 29 3b 0a 20 20 20  tf(" ****");.   
b460: 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
b470: 70 72 69 6e 74 66 28 22 20 25 34 64 22 2c 20 76  printf(" %4d", v
b480: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
b490: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 23  ntf("\n");.  }.#
b4a0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 72 65 65  endif..  /* Free
b4b0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
b4c0: 6f 6e 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ons and return t
b4d0: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 72  he result */.  r
b4e0: 65 73 20 3d 20 28 69 6e 74 29 6d 5b 73 7a 52 6f  es = (int)m[szRo
b4f0: 77 2a 28 6e 32 2b 31 29 2d 31 5d 3b 0a 20 20 6e  w*(n2+1)-1];.  n
b500: 20 3d 20 6e 32 3b 0a 20 20 69 66 28 20 66 2e 69   = n2;.  if( f.i
b510: 73 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 66  sPrefix ){.    f
b520: 6f 72 28 69 32 3d 31 3b 20 69 32 3c 3d 6e 32 3b  or(i2=1; i2<=n2;
b530: 20 69 32 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e   i2++){.      in
b540: 74 20 62 20 3d 20 6d 5b 73 7a 52 6f 77 2a 69 32  t b = m[szRow*i2
b550: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 62  -1];.      if( b
b560: 3c 3d 72 65 73 20 29 7b 20 0a 20 20 20 20 20 20  <=res ){ .      
b570: 20 20 72 65 73 20 3d 20 62 3b 0a 20 20 20 20 20    res = b;.     
b580: 20 20 20 6e 20 3d 20 69 32 20 2d 20 31 3b 0a 20     n = i2 - 1;. 
b590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b5a0: 0a 20 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29  .  if( pnMatch )
b5b0: 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  {.    int nExtra
b5c0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d   = 0;.    for(k=
b5d0: 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 7b 0a 20 20  0; k<n; k++){.  
b5e0: 20 20 20 20 69 66 28 20 28 7a 32 5b 6b 5d 20 26      if( (z2[k] &
b5f0: 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e   0xc0)==0x80 ) n
b600: 45 78 74 72 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Extra++;.    }. 
b610: 20 20 20 2a 70 6e 4d 61 74 63 68 20 3d 20 6e 20     *pnMatch = n 
b620: 2d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 65  - nExtra;.  }..e
b630: 64 69 74 44 69 73 74 33 41 62 6f 72 74 3a 0a 20  ditDist3Abort:. 
b640: 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32   for(i2=0; i2<n2
b650: 3b 20 69 32 2b 2b 29 20 73 71 6c 69 74 65 33 5f  ; i2++) sqlite3_
b660: 66 72 65 65 28 61 32 5b 69 32 5d 2e 61 70 49 6e  free(a2[i2].apIn
b670: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  s);.  sqlite3_fr
b680: 65 65 28 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(m);.  return 
b690: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  res;.}../*.** Ge
b6a0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
b6b0: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 6f   EditDist3Lang o
b6c0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
b6d0: 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33   const EditDist3
b6e0: 4c 61 6e 67 20 2a 65 64 69 74 44 69 73 74 33 46  Lang *editDist3F
b6f0: 69 6e 64 4c 61 6e 67 28 0a 20 20 45 64 69 74 44  indLang(.  EditD
b700: 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  ist3Config *pCon
b710: 66 69 67 2c 0a 20 20 69 6e 74 20 69 4c 61 6e 67  fig,.  int iLang
b720: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
b730: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69  or(i=0; i<pConfi
b740: 67 2d 3e 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a  g->nLang; i++){.
b750: 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
b760: 3e 61 5b 69 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61  >a[i].iLang==iLa
b770: 6e 67 20 29 20 72 65 74 75 72 6e 20 26 70 43 6f  ng ) return &pCo
b780: 6e 66 69 67 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  nfig->a[i];.  }.
b790: 20 20 72 65 74 75 72 6e 20 26 65 64 69 74 44 69    return &editDi
b7a0: 73 74 33 4c 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  st3Lang;.}../*.*
b7b0: 2a 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65  * Function:    e
b7c0: 64 69 74 64 69 73 74 33 28 41 2c 42 2c 69 4c 61  ditdist3(A,B,iLa
b7d0: 6e 67 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ng).**          
b7e0: 20 20 20 20 65 64 69 74 64 69 73 74 33 28 74 61      editdist3(ta
b7f0: 62 6c 65 6e 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52  blename).**.** R
b800: 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
b810: 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 73  f transforming s
b820: 74 72 69 6e 67 20 41 20 69 6e 74 6f 20 73 74 72  tring A into str
b830: 69 6e 67 20 42 20 75 73 69 6e 67 20 65 64 69 74  ing B using edit
b840: 0a 2a 2a 20 77 65 69 67 68 74 73 20 66 6f 72 20  .** weights for 
b850: 69 4c 61 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iLang..**.** The
b860: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61   second form loa
b870: 64 73 20 65 64 69 74 20 77 65 69 67 68 74 73 20  ds edit weights 
b880: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  into memory from
b890: 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61   a table..*/.sta
b8a0: 74 69 63 20 76 6f 69 64 20 65 64 69 74 44 69 73  tic void editDis
b8b0: 74 33 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c  t3SqlFunc(.  sql
b8c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
b8d0: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
b8e0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
b8f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 45  ue **argv.){.  E
b900: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a  ditDist3Config *
b910: 70 43 6f 6e 66 69 67 20 3d 20 28 45 64 69 74 44  pConfig = (EditD
b920: 69 73 74 33 43 6f 6e 66 69 67 2a 29 73 71 6c 69  ist3Config*)sqli
b930: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
b940: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
b950: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
b960: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
b970: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 6e  e(context);.  in
b980: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
b990: 3d 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==1 ){.    const
b9a0: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20   char *zTable = 
b9b0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
b9c0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
b9d0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 63  argv[0]);.    rc
b9e0: 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66   = editDist3Conf
b9f0: 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20  igLoad(pConfig, 
ba00: 64 62 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  db, zTable);.   
ba10: 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65   if( rc ) sqlite
ba20: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
ba30: 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29  ode(context, rc)
ba40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
ba50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 20 3d 20  onst char *zA = 
ba60: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
ba70: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
ba80: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 63 6f  argv[0]);.    co
ba90: 6e 73 74 20 63 68 61 72 20 2a 7a 42 20 3d 20 28  nst char *zB = (
baa0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
bab0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
bac0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 6e 74  rgv[1]);.    int
bad0: 20 6e 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   nA = sqlite3_va
bae0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
baf0: 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 42 20 3d  ]);.    int nB =
bb00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
bb10: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
bb20: 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 61     int iLang = a
bb30: 72 67 63 3d 3d 33 20 3f 20 73 71 6c 69 74 65 33  rgc==3 ? sqlite3
bb40: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
bb50: 32 5d 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e  2]) : 0;.    con
bb60: 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  st EditDist3Lang
bb70: 20 2a 70 4c 61 6e 67 20 3d 20 65 64 69 74 44 69   *pLang = editDi
bb80: 73 74 33 46 69 6e 64 4c 61 6e 67 28 70 43 6f 6e  st3FindLang(pCon
bb90: 66 69 67 2c 20 69 4c 61 6e 67 29 3b 0a 20 20 20  fig, iLang);.   
bba0: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
bbb0: 72 69 6e 67 20 2a 70 46 72 6f 6d 3b 0a 20 20 20  ring *pFrom;.   
bbc0: 20 69 6e 74 20 64 69 73 74 3b 0a 0a 20 20 20 20   int dist;..    
bbd0: 70 46 72 6f 6d 20 3d 20 65 64 69 74 44 69 73 74  pFrom = editDist
bbe0: 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 70  3FromStringNew(p
bbf0: 4c 61 6e 67 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20  Lang, zA, nA);. 
bc00: 20 20 20 69 66 28 20 70 46 72 6f 6d 3d 3d 30 20     if( pFrom==0 
bc10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bc20: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
bc30: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
bc40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bc50: 7d 0a 20 20 20 20 64 69 73 74 20 3d 20 65 64 69  }.    dist = edi
bc60: 74 44 69 73 74 33 43 6f 72 65 28 70 46 72 6f 6d  tDist3Core(pFrom
bc70: 2c 20 7a 42 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c  , zB, nB, pLang,
bc80: 20 30 29 3b 0a 20 20 20 20 65 64 69 74 44 69 73   0);.    editDis
bc90: 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65  t3FromStringDele
bca0: 74 65 28 70 46 72 6f 6d 29 3b 0a 20 20 20 20 73  te(pFrom);.    s
bcb0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
bcc0: 74 28 63 6f 6e 74 65 78 74 2c 20 64 69 73 74 29  t(context, dist)
bcd0: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  } .}../*.** 
bce0: 52 65 67 69 73 74 65 72 20 74 68 65 20 65 64 69  Register the edi
bcf0: 74 44 69 73 74 33 20 66 75 6e 63 74 69 6f 6e 20  tDist3 function 
bd00: 77 69 74 68 20 53 51 4c 69 74 65 0a 2a 2f 0a 73  with SQLite.*/.s
bd10: 74 61 74 69 63 20 69 6e 74 20 65 64 69 74 44 69  tatic int editDi
bd20: 73 74 33 49 6e 73 74 61 6c 6c 28 73 71 6c 69 74  st3Install(sqlit
bd30: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
bd40: 63 3b 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  c;.  EditDist3Co
bd50: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
bd60: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
bd70: 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66 69 67 29  sizeof(*pConfig)
bd80: 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e 66 69   );.  if( pConfi
bd90: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  g==0 ) return SQ
bda0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
bdb0: 6d 73 65 74 28 70 43 6f 6e 66 69 67 2c 20 30 2c  mset(pConfig, 0,
bdc0: 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66 69 67   sizeof(*pConfig
bdd0: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
bde0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
bdf0: 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69 74 64  on_v2(db, "editd
be00: 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20  ist3",.         
be10: 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45 5f 55       2, SQLITE_U
be20: 54 46 38 2c 20 70 43 6f 6e 66 69 67 2c 20 65 64  TF8, pConfig, ed
be30: 69 74 44 69 73 74 33 53 71 6c 46 75 6e 63 2c 20  itDist3SqlFunc, 
be40: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
be50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
be60: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
be70: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
be80: 6e 5f 76 32 28 64 62 2c 20 22 65 64 69 74 64 69  n_v2(db, "editdi
be90: 73 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20 20  st3",.          
bea0: 20 20 20 20 20 20 33 2c 20 53 51 4c 49 54 45 5f        3, SQLITE_
beb0: 55 54 46 38 2c 20 70 43 6f 6e 66 69 67 2c 20 65  UTF8, pConfig, e
bec0: 64 69 74 44 69 73 74 33 53 71 6c 46 75 6e 63 2c  ditDist3SqlFunc,
bed0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
bee0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bef0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
bf00: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
bf10: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65  nction_v2(db, "e
bf20: 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20  ditdist3",.     
bf30: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 53 51             1, SQ
bf40: 4c 49 54 45 5f 55 54 46 38 2c 20 70 43 6f 6e 66  LITE_UTF8, pConf
bf50: 69 67 2c 20 65 64 69 74 44 69 73 74 33 53 71 6c  ig, editDist3Sql
bf60: 46 75 6e 63 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Func, 0, 0,.    
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
bf80: 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74  Dist3ConfigDelet
bf90: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
bfa0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
bfb0: 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 20 20 72 65  onfig);.  }.  re
bfc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e  turn rc;.}./* En
bfd0: 64 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 20 63  d configurable c
bfe0: 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64 69 74  ost unicode edit
bff0: 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74 69 6e   distance routin
c000: 65 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  es.*************
c010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c050: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
c060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c0a0: 0a 2a 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 6c  .** Begin transl
c0b0: 69 74 65 72 61 74 65 20 75 6e 69 63 6f 64 65 2d  iterate unicode-
c0c0: 74 6f 2d 61 73 63 69 69 20 69 6d 70 6c 65 6d 65  to-ascii impleme
c0d0: 6e 74 61 74 69 6f 6e 0a 2a 2f 0a 0a 23 69 66 20  ntation.*/..#if 
c0e0: 21 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41  !SQLITE_AMALGAMA
c0f0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TION./*.** This 
c100: 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69 73 20  lookup table is 
c110: 75 73 65 64 20 74 6f 20 68 65 6c 70 20 64 65 63  used to help dec
c120: 6f 64 65 20 74 68 65 20 66 69 72 73 74 20 62 79  ode the first by
c130: 74 65 20 6f 66 0a 2a 2a 20 61 20 6d 75 6c 74 69  te of.** a multi
c140: 2d 62 79 74 65 20 55 54 46 38 20 63 68 61 72 61  -byte UTF8 chara
c150: 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
c160: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
c170: 68 61 72 20 73 71 6c 69 74 65 33 55 74 66 38 54  har sqlite3Utf8T
c180: 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20 30 78  rans1[] = {.  0x
c190: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20  00, 0x01, 0x02, 
c1a0: 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35  0x03, 0x04, 0x05
c1b0: 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20  , 0x06, 0x07,.  
c1c0: 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61  0x08, 0x09, 0x0a
c1d0: 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78  , 0x0b, 0x0c, 0x
c1e0: 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a  0d, 0x0e, 0x0f,.
c1f0: 20 20 30 78 31 30 2c 20 30 78 31 31 2c 20 30 78    0x10, 0x11, 0x
c200: 31 32 2c 20 30 78 31 33 2c 20 30 78 31 34 2c 20  12, 0x13, 0x14, 
c210: 30 78 31 35 2c 20 30 78 31 36 2c 20 30 78 31 37  0x15, 0x16, 0x17
c220: 2c 0a 20 20 30 78 31 38 2c 20 30 78 31 39 2c 20  ,.  0x18, 0x19, 
c230: 30 78 31 61 2c 20 30 78 31 62 2c 20 30 78 31 63  0x1a, 0x1b, 0x1c
c240: 2c 20 30 78 31 64 2c 20 30 78 31 65 2c 20 30 78  , 0x1d, 0x1e, 0x
c250: 31 66 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31  1f,.  0x00, 0x01
c260: 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78  , 0x02, 0x03, 0x
c270: 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20  04, 0x05, 0x06, 
c280: 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78  0x07,.  0x08, 0x
c290: 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20  09, 0x0a, 0x0b, 
c2a0: 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65  0x0c, 0x0d, 0x0e
c2b0: 2c 20 30 78 30 66 2c 0a 20 20 30 78 30 30 2c 20  , 0x0f,.  0x00, 
c2c0: 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33  0x01, 0x02, 0x03
c2d0: 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78  , 0x04, 0x05, 0x
c2e0: 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 30  06, 0x07,.  0x00
c2f0: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
c300: 30 33 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20  03, 0x00, 0x01, 
c310: 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d 3b 0a 23  0x00, 0x00,.};.#
c320: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
c330: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
c340: 20 74 68 65 20 66 69 72 73 74 20 55 54 46 2d 38   the first UTF-8
c350: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
c360: 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
c370: 74 69 63 20 69 6e 74 20 75 74 66 38 52 65 61 64  tic int utf8Read
c380: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
c390: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
c3a0: 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  int *pSize){.  i
c3b0: 6e 74 20 63 2c 20 69 3b 0a 0a 20 20 69 66 28 20  nt c, i;..  if( 
c3c0: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  n==0 ){.    c = 
c3d0: 69 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  i = 0;.  }else{.
c3e0: 20 20 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20      c = z[0];.  
c3f0: 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 69 66 28    i = 1;.    if(
c400: 20 63 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20   c>=0xc0 ){.    
c410: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66    c = sqlite3Utf
c420: 38 54 72 61 6e 73 31 5b 63 2d 30 78 63 30 5d 3b  8Trans1[c-0xc0];
c430: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
c440: 6e 20 26 26 20 28 7a 5b 69 5d 20 26 20 30 78 63  n && (z[i] & 0xc
c450: 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  0)==0x80 ){.    
c460: 20 20 20 20 63 20 3d 20 28 63 3c 3c 36 29 20 2b      c = (c<<6) +
c470: 20 28 30 78 33 66 20 26 20 7a 5b 69 2b 2b 5d 29   (0x3f & z[i++])
c480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c490: 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 69    }.  *pSize = i
c4a0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
c4b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
c4c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
c4d0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 75 74  acters in the ut
c4e0: 66 2d 38 20 73 74 72 69 6e 67 20 69 6e 20 74 68  f-8 string in th
c4f0: 65 20 6e 49 6e 20 62 79 74 65 0a 2a 2a 20 62 75  e nIn byte.** bu
c500: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
c510: 62 79 20 7a 49 6e 2e 0a 2a 2f 0a 73 74 61 74 69  by zIn..*/.stati
c520: 63 20 69 6e 74 20 75 74 66 38 43 68 61 72 6c 65  c int utf8Charle
c530: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  n(const char *zI
c540: 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69  n, int nIn){.  i
c550: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 68 61  nt i;.  int nCha
c560: 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  r = 0;.  for(i=0
c570: 3b 20 69 3c 6e 49 6e 3b 20 6e 43 68 61 72 2b 2b  ; i<nIn; nChar++
c580: 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  ){.    int sz;. 
c590: 20 20 20 75 74 66 38 52 65 61 64 28 28 63 6f 6e     utf8Read((con
c5a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
c5b0: 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49 6e 2d   *)&zIn[i], nIn-
c5c0: 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 20 2b  i, &sz);.    i +
c5d0: 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = sz;.  }.  retu
c5e0: 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a  rn nChar;.}../*.
c5f0: 2a 2a 20 54 61 62 6c 65 20 6f 66 20 74 72 61 6e  ** Table of tran
c600: 73 6c 61 74 69 6f 6e 73 20 66 72 6f 6d 20 75 6e  slations from un
c610: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73  icode characters
c620: 20 69 6e 74 6f 20 41 53 43 49 49 2e 0a 2a 2f 0a   into ASCII..*/.
c630: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
c640: 75 63 74 20 7b 0a 20 75 6e 73 69 67 6e 65 64 20  uct {. unsigned 
c650: 73 68 6f 72 74 20 69 6e 74 20 63 46 72 6f 6d 3b  short int cFrom;
c660: 0a 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  . unsigned char 
c670: 63 54 6f 30 2c 20 63 54 6f 31 3b 0a 7d 20 74 72  cTo0, cTo1;.} tr
c680: 61 6e 73 6c 69 74 5b 5d 20 3d 20 7b 0a 20 20 7b  anslit[] = {.  {
c690: 20 30 78 30 30 41 30 2c 20 20 30 78 32 30 2c 20   0x00A0,  0x20, 
c6a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c2 a0 20 74  0x00 },  /* .. t
c6b0: 6f 20 20 20 2a 2f 0a 20 20 7b 20 30 78 30 30 42  o   */.  { 0x00B
c6c0: 35 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d  5,  0x75, 0x00 }
c6d0: 2c 20 20 2f 2a 20 c2 b5 20 74 6f 20 75 20 2a 2f  ,  /* .. to u */
c6e0: 0a 20 20 7b 20 30 78 30 30 43 30 2c 20 20 30 78  .  { 0x00C0,  0x
c6f0: 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  41, 0x00 },  /* 
c700: c3 80 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30  .. to A */.  { 0
c710: 78 30 30 43 31 2c 20 20 30 78 34 31 2c 20 30 78  x00C1,  0x41, 0x
c720: 30 30 20 7d 2c 20 20 2f 2a 20 c3 81 20 74 6f 20  00 },  /* .. to 
c730: 41 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 32 2c  A */.  { 0x00C2,
c740: 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20    0x41, 0x00 }, 
c750: 20 2f 2a 20 c3 82 20 74 6f 20 41 20 2a 2f 0a 20   /* .. to A */. 
c760: 20 7b 20 30 78 30 30 43 33 2c 20 20 30 78 34 31   { 0x00C3,  0x41
c770: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 83  , 0x00 },  /* ..
c780: 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30   to A */.  { 0x0
c790: 30 43 34 2c 20 20 30 78 34 31 2c 20 30 78 36 35  0C4,  0x41, 0x65
c7a0: 20 7d 2c 20 20 2f 2a 20 c3 84 20 74 6f 20 41 65   },  /* .. to Ae
c7b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 35 2c 20   */.  { 0x00C5, 
c7c0: 20 30 78 34 31 2c 20 30 78 36 31 20 7d 2c 20 20   0x41, 0x61 },  
c7d0: 2f 2a 20 c3 85 20 74 6f 20 41 61 20 2a 2f 0a 20  /* .. to Aa */. 
c7e0: 20 7b 20 30 78 30 30 43 36 2c 20 20 30 78 34 31   { 0x00C6,  0x41
c7f0: 2c 20 30 78 34 35 20 7d 2c 20 20 2f 2a 20 c3 86  , 0x45 },  /* ..
c800: 20 74 6f 20 41 45 20 2a 2f 0a 20 20 7b 20 30 78   to AE */.  { 0x
c810: 30 30 43 37 2c 20 20 30 78 34 33 2c 20 30 78 30  00C7,  0x43, 0x0
c820: 30 20 7d 2c 20 20 2f 2a 20 c3 87 20 74 6f 20 43  0 },  /* .. to C
c830: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 38 2c 20   */.  { 0x00C8, 
c840: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
c850: 2f 2a 20 c3 88 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
c860: 7b 20 30 78 30 30 43 39 2c 20 20 30 78 34 35 2c  { 0x00C9,  0x45,
c870: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 89 20   0x00 },  /* .. 
c880: 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to E */.  { 0x00
c890: 43 41 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20  CA,  0x45, 0x00 
c8a0: 7d 2c 20 20 2f 2a 20 c3 8a 20 74 6f 20 45 20 2a  },  /* .. to E *
c8b0: 2f 0a 20 20 7b 20 30 78 30 30 43 42 2c 20 20 30  /.  { 0x00CB,  0
c8c0: 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x45, 0x00 },  /*
c8d0: 20 c3 8b 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
c8e0: 30 78 30 30 43 43 2c 20 20 30 78 34 39 2c 20 30  0x00CC,  0x49, 0
c8f0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8c 20 74 6f  x00 },  /* .. to
c900: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 44   I */.  { 0x00CD
c910: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
c920: 20 20 2f 2a 20 c3 8d 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
c930: 20 20 7b 20 30 78 30 30 43 45 2c 20 20 30 78 34    { 0x00CE,  0x4
c940: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  9, 0x00 },  /* .
c950: 8e 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
c960: 30 30 43 46 2c 20 20 30 78 34 39 2c 20 30 78 30  00CF,  0x49, 0x0
c970: 30 20 7d 2c 20 20 2f 2a 20 c3 8f 20 74 6f 20 49  0 },  /* .. to I
c980: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 30 2c 20   */.  { 0x00D0, 
c990: 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x44, 0x00 },  
c9a0: 2f 2a 20 c3 90 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
c9b0: 7b 20 30 78 30 30 44 31 2c 20 20 30 78 34 45 2c  { 0x00D1,  0x4E,
c9c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 91 20   0x00 },  /* .. 
c9d0: 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to N */.  { 0x00
c9e0: 44 32 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20  D2,  0x4F, 0x00 
c9f0: 7d 2c 20 20 2f 2a 20 c3 92 20 74 6f 20 4f 20 2a  },  /* .. to O *
ca00: 2f 0a 20 20 7b 20 30 78 30 30 44 33 2c 20 20 30  /.  { 0x00D3,  0
ca10: 78 34 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4F, 0x00 },  /*
ca20: 20 c3 93 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
ca30: 30 78 30 30 44 34 2c 20 20 30 78 34 46 2c 20 30  0x00D4,  0x4F, 0
ca40: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 94 20 74 6f  x00 },  /* .. to
ca50: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 35   O */.  { 0x00D5
ca60: 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c  ,  0x4F, 0x00 },
ca70: 20 20 2f 2a 20 c3 95 20 74 6f 20 4f 20 2a 2f 0a    /* .. to O */.
ca80: 20 20 7b 20 30 78 30 30 44 36 2c 20 20 30 78 34    { 0x00D6,  0x4
ca90: 46 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3  F, 0x65 },  /* .
caa0: 96 20 74 6f 20 4f 65 20 2a 2f 0a 20 20 7b 20 30  . to Oe */.  { 0
cab0: 78 30 30 44 37 2c 20 20 30 78 37 38 2c 20 30 78  x00D7,  0x78, 0x
cac0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 97 20 74 6f 20  00 },  /* .. to 
cad0: 78 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 38 2c  x */.  { 0x00D8,
cae0: 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c 20    0x4F, 0x00 }, 
caf0: 20 2f 2a 20 c3 98 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
cb00: 20 7b 20 30 78 30 30 44 39 2c 20 20 30 78 35 35   { 0x00D9,  0x55
cb10: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 99  , 0x00 },  /* ..
cb20: 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30   to U */.  { 0x0
cb30: 30 44 41 2c 20 20 30 78 35 35 2c 20 30 78 30 30  0DA,  0x55, 0x00
cb40: 20 7d 2c 20 20 2f 2a 20 c3 9a 20 74 6f 20 55 20   },  /* .. to U 
cb50: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 42 2c 20 20  */.  { 0x00DB,  
cb60: 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x55, 0x00 },  /
cb70: 2a 20 c3 9b 20 74 6f 20 55 20 2a 2f 0a 20 20 7b  * .. to U */.  {
cb80: 20 30 78 30 30 44 43 2c 20 20 30 78 35 35 2c 20   0x00DC,  0x55, 
cb90: 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 9c 20 74  0x65 },  /* .. t
cba0: 6f 20 55 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o Ue */.  { 0x00
cbb0: 44 44 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20  DD,  0x59, 0x00 
cbc0: 7d 2c 20 20 2f 2a 20 c3 9d 20 74 6f 20 59 20 2a  },  /* .. to Y *
cbd0: 2f 0a 20 20 7b 20 30 78 30 30 44 45 2c 20 20 30  /.  { 0x00DE,  0
cbe0: 78 35 34 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a  x54, 0x68 },  /*
cbf0: 20 c3 9e 20 74 6f 20 54 68 20 2a 2f 0a 20 20 7b   .. to Th */.  {
cc00: 20 30 78 30 30 44 46 2c 20 20 30 78 37 33 2c 20   0x00DF,  0x73, 
cc10: 30 78 37 33 20 7d 2c 20 20 2f 2a 20 c3 9f 20 74  0x73 },  /* .. t
cc20: 6f 20 73 73 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o ss */.  { 0x00
cc30: 45 30 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20  E0,  0x61, 0x00 
cc40: 7d 2c 20 20 2f 2a 20 c3 a0 20 74 6f 20 61 20 2a  },  /* .. to a *
cc50: 2f 0a 20 20 7b 20 30 78 30 30 45 31 2c 20 20 30  /.  { 0x00E1,  0
cc60: 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x61, 0x00 },  /*
cc70: 20 c3 a1 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20   .. to a */.  { 
cc80: 30 78 30 30 45 32 2c 20 20 30 78 36 31 2c 20 30  0x00E2,  0x61, 0
cc90: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a2 20 74 6f  x00 },  /* .. to
cca0: 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 33   a */.  { 0x00E3
ccb0: 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c  ,  0x61, 0x00 },
ccc0: 20 20 2f 2a 20 c3 a3 20 74 6f 20 61 20 2a 2f 0a    /* .. to a */.
ccd0: 20 20 7b 20 30 78 30 30 45 34 2c 20 20 30 78 36    { 0x00E4,  0x6
cce0: 31 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3  1, 0x65 },  /* .
ccf0: a4 20 74 6f 20 61 65 20 2a 2f 0a 20 20 7b 20 30  . to ae */.  { 0
cd00: 78 30 30 45 35 2c 20 20 30 78 36 31 2c 20 30 78  x00E5,  0x61, 0x
cd10: 36 31 20 7d 2c 20 20 2f 2a 20 c3 a5 20 74 6f 20  61 },  /* .. to 
cd20: 61 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 36  aa */.  { 0x00E6
cd30: 2c 20 20 30 78 36 31 2c 20 30 78 36 35 20 7d 2c  ,  0x61, 0x65 },
cd40: 20 20 2f 2a 20 c3 a6 20 74 6f 20 61 65 20 2a 2f    /* .. to ae */
cd50: 0a 20 20 7b 20 30 78 30 30 45 37 2c 20 20 30 78  .  { 0x00E7,  0x
cd60: 36 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  63, 0x00 },  /* 
cd70: c3 a7 20 74 6f 20 63 20 2a 2f 0a 20 20 7b 20 30  .. to c */.  { 0
cd80: 78 30 30 45 38 2c 20 20 30 78 36 35 2c 20 30 78  x00E8,  0x65, 0x
cd90: 30 30 20 7d 2c 20 20 2f 2a 20 c3 a8 20 74 6f 20  00 },  /* .. to 
cda0: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 39 2c  e */.  { 0x00E9,
cdb0: 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20    0x65, 0x00 }, 
cdc0: 20 2f 2a 20 c3 a9 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
cdd0: 20 7b 20 30 78 30 30 45 41 2c 20 20 30 78 36 35   { 0x00EA,  0x65
cde0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 aa  , 0x00 },  /* ..
cdf0: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
ce00: 30 45 42 2c 20 20 30 78 36 35 2c 20 30 78 30 30  0EB,  0x65, 0x00
ce10: 20 7d 2c 20 20 2f 2a 20 c3 ab 20 74 6f 20 65 20   },  /* .. to e 
ce20: 2a 2f 0a 20 20 7b 20 30 78 30 30 45 43 2c 20 20  */.  { 0x00EC,  
ce30: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
ce40: 2a 20 c3 ac 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
ce50: 20 30 78 30 30 45 44 2c 20 20 30 78 36 39 2c 20   0x00ED,  0x69, 
ce60: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ad 20 74  0x00 },  /* .. t
ce70: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45  o i */.  { 0x00E
ce80: 45 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d  E,  0x69, 0x00 }
ce90: 2c 20 20 2f 2a 20 c3 ae 20 74 6f 20 69 20 2a 2f  ,  /* .. to i */
cea0: 0a 20 20 7b 20 30 78 30 30 45 46 2c 20 20 30 78  .  { 0x00EF,  0x
ceb0: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
cec0: c3 af 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
ced0: 78 30 30 46 30 2c 20 20 30 78 36 34 2c 20 30 78  x00F0,  0x64, 0x
cee0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 b0 20 74 6f 20  00 },  /* .. to 
cef0: 64 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 31 2c  d */.  { 0x00F1,
cf00: 20 20 30 78 36 45 2c 20 30 78 30 30 20 7d 2c 20    0x6E, 0x00 }, 
cf10: 20 2f 2a 20 c3 b1 20 74 6f 20 6e 20 2a 2f 0a 20   /* .. to n */. 
cf20: 20 7b 20 30 78 30 30 46 32 2c 20 20 30 78 36 46   { 0x00F2,  0x6F
cf30: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b2  , 0x00 },  /* ..
cf40: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
cf50: 30 46 33 2c 20 20 30 78 36 46 2c 20 30 78 30 30  0F3,  0x6F, 0x00
cf60: 20 7d 2c 20 20 2f 2a 20 c3 b3 20 74 6f 20 6f 20   },  /* .. to o 
cf70: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 34 2c 20 20  */.  { 0x00F4,  
cf80: 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6F, 0x00 },  /
cf90: 2a 20 c3 b4 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b  * .. to o */.  {
cfa0: 20 30 78 30 30 46 35 2c 20 20 30 78 36 46 2c 20   0x00F5,  0x6F, 
cfb0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b5 20 74  0x00 },  /* .. t
cfc0: 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46  o o */.  { 0x00F
cfd0: 36 2c 20 20 30 78 36 46 2c 20 30 78 36 35 20 7d  6,  0x6F, 0x65 }
cfe0: 2c 20 20 2f 2a 20 c3 b6 20 74 6f 20 6f 65 20 2a  ,  /* .. to oe *
cff0: 2f 0a 20 20 7b 20 30 78 30 30 46 37 2c 20 20 30  /.  { 0x00F7,  0
d000: 78 33 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x3A, 0x00 },  /*
d010: 20 c3 b7 20 74 6f 20 3a 20 2a 2f 0a 20 20 7b 20   .. to : */.  { 
d020: 30 78 30 30 46 38 2c 20 20 30 78 36 46 2c 20 30  0x00F8,  0x6F, 0
d030: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b8 20 74 6f  x00 },  /* .. to
d040: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 39   o */.  { 0x00F9
d050: 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c  ,  0x75, 0x00 },
d060: 20 20 2f 2a 20 c3 b9 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
d070: 20 20 7b 20 30 78 30 30 46 41 2c 20 20 30 78 37    { 0x00FA,  0x7
d080: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  5, 0x00 },  /* .
d090: ba 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78  . to u */.  { 0x
d0a0: 30 30 46 42 2c 20 20 30 78 37 35 2c 20 30 78 30  00FB,  0x75, 0x0
d0b0: 30 20 7d 2c 20 20 2f 2a 20 c3 bb 20 74 6f 20 75  0 },  /* .. to u
d0c0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 43 2c 20   */.  { 0x00FC, 
d0d0: 20 30 78 37 35 2c 20 30 78 36 35 20 7d 2c 20 20   0x75, 0x65 },  
d0e0: 2f 2a 20 c3 bc 20 74 6f 20 75 65 20 2a 2f 0a 20  /* .. to ue */. 
d0f0: 20 7b 20 30 78 30 30 46 44 2c 20 20 30 78 37 39   { 0x00FD,  0x79
d100: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bd  , 0x00 },  /* ..
d110: 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30   to y */.  { 0x0
d120: 30 46 45 2c 20 20 30 78 37 34 2c 20 30 78 36 38  0FE,  0x74, 0x68
d130: 20 7d 2c 20 20 2f 2a 20 c3 be 20 74 6f 20 74 68   },  /* .. to th
d140: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 46 2c 20   */.  { 0x00FF, 
d150: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
d160: 2f 2a 20 c3 bf 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
d170: 7b 20 30 78 30 31 30 30 2c 20 20 30 78 34 31 2c  { 0x0100,  0x41,
d180: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 80 20   0x00 },  /* .. 
d190: 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to A */.  { 0x01
d1a0: 30 31 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20  01,  0x61, 0x00 
d1b0: 7d 2c 20 20 2f 2a 20 c4 81 20 74 6f 20 61 20 2a  },  /* .. to a *
d1c0: 2f 0a 20 20 7b 20 30 78 30 31 30 32 2c 20 20 30  /.  { 0x0102,  0
d1d0: 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x41, 0x00 },  /*
d1e0: 20 c4 82 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
d1f0: 30 78 30 31 30 33 2c 20 20 30 78 36 31 2c 20 30  0x0103,  0x61, 0
d200: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 83 20 74 6f  x00 },  /* .. to
d210: 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 34   a */.  { 0x0104
d220: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
d230: 20 20 2f 2a 20 c4 84 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
d240: 20 20 7b 20 30 78 30 31 30 35 2c 20 20 30 78 36    { 0x0105,  0x6
d250: 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  1, 0x00 },  /* .
d260: 85 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78  . to a */.  { 0x
d270: 30 31 30 36 2c 20 20 30 78 34 33 2c 20 30 78 30  0106,  0x43, 0x0
d280: 30 20 7d 2c 20 20 2f 2a 20 c4 86 20 74 6f 20 43  0 },  /* .. to C
d290: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 37 2c 20   */.  { 0x0107, 
d2a0: 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x63, 0x00 },  
d2b0: 2f 2a 20 c4 87 20 74 6f 20 63 20 2a 2f 0a 20 20  /* .. to c */.  
d2c0: 7b 20 30 78 30 31 30 38 2c 20 20 30 78 34 33 2c  { 0x0108,  0x43,
d2d0: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 88 20   0x68 },  /* .. 
d2e0: 74 6f 20 43 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Ch */.  { 0x0
d2f0: 31 30 39 2c 20 20 30 78 36 33 2c 20 30 78 36 38  109,  0x63, 0x68
d300: 20 7d 2c 20 20 2f 2a 20 c4 89 20 74 6f 20 63 68   },  /* .. to ch
d310: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 41 2c 20   */.  { 0x010A, 
d320: 20 30 78 34 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x43, 0x00 },  
d330: 2f 2a 20 c4 8a 20 74 6f 20 43 20 2a 2f 0a 20 20  /* .. to C */.  
d340: 7b 20 30 78 30 31 30 42 2c 20 20 30 78 36 33 2c  { 0x010B,  0x63,
d350: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8b 20   0x00 },  /* .. 
d360: 74 6f 20 63 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to c */.  { 0x01
d370: 30 43 2c 20 20 30 78 34 33 2c 20 30 78 30 30 20  0C,  0x43, 0x00 
d380: 7d 2c 20 20 2f 2a 20 c4 8c 20 74 6f 20 43 20 2a  },  /* .. to C *
d390: 2f 0a 20 20 7b 20 30 78 30 31 30 44 2c 20 20 30  /.  { 0x010D,  0
d3a0: 78 36 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x63, 0x00 },  /*
d3b0: 20 c4 8d 20 74 6f 20 63 20 2a 2f 0a 20 20 7b 20   .. to c */.  { 
d3c0: 30 78 30 31 30 45 2c 20 20 30 78 34 34 2c 20 30  0x010E,  0x44, 0
d3d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8e 20 74 6f  x00 },  /* .. to
d3e0: 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 46   D */.  { 0x010F
d3f0: 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c  ,  0x64, 0x00 },
d400: 20 20 2f 2a 20 c4 8f 20 74 6f 20 64 20 2a 2f 0a    /* .. to d */.
d410: 20 20 7b 20 30 78 30 31 31 30 2c 20 20 30 78 34    { 0x0110,  0x4
d420: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  4, 0x00 },  /* .
d430: 90 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78  . to D */.  { 0x
d440: 30 31 31 31 2c 20 20 30 78 36 34 2c 20 30 78 30  0111,  0x64, 0x0
d450: 30 20 7d 2c 20 20 2f 2a 20 c4 91 20 74 6f 20 64  0 },  /* .. to d
d460: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 32 2c 20   */.  { 0x0112, 
d470: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
d480: 2f 2a 20 c4 92 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
d490: 7b 20 30 78 30 31 31 33 2c 20 20 30 78 36 35 2c  { 0x0113,  0x65,
d4a0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 93 20   0x00 },  /* .. 
d4b0: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to e */.  { 0x01
d4c0: 31 34 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20  14,  0x45, 0x00 
d4d0: 7d 2c 20 20 2f 2a 20 c4 94 20 74 6f 20 45 20 2a  },  /* .. to E *
d4e0: 2f 0a 20 20 7b 20 30 78 30 31 31 35 2c 20 20 30  /.  { 0x0115,  0
d4f0: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
d500: 20 c4 95 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
d510: 30 78 30 31 31 36 2c 20 20 30 78 34 35 2c 20 30  0x0116,  0x45, 0
d520: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 96 20 74 6f  x00 },  /* .. to
d530: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 37   E */.  { 0x0117
d540: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
d550: 20 20 2f 2a 20 c4 97 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
d560: 20 20 7b 20 30 78 30 31 31 38 2c 20 20 30 78 34    { 0x0118,  0x4
d570: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  5, 0x00 },  /* .
d580: 98 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
d590: 30 31 31 39 2c 20 20 30 78 36 35 2c 20 30 78 30  0119,  0x65, 0x0
d5a0: 30 20 7d 2c 20 20 2f 2a 20 c4 99 20 74 6f 20 65  0 },  /* .. to e
d5b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 41 2c 20   */.  { 0x011A, 
d5c0: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
d5d0: 2f 2a 20 c4 9a 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
d5e0: 7b 20 30 78 30 31 31 42 2c 20 20 30 78 36 35 2c  { 0x011B,  0x65,
d5f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9b 20   0x00 },  /* .. 
d600: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to e */.  { 0x01
d610: 31 43 2c 20 20 30 78 34 37 2c 20 30 78 36 38 20  1C,  0x47, 0x68 
d620: 7d 2c 20 20 2f 2a 20 c4 9c 20 74 6f 20 47 68 20  },  /* .. to Gh 
d630: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 44 2c 20 20  */.  { 0x011D,  
d640: 30 78 36 37 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x67, 0x68 },  /
d650: 2a 20 c4 9d 20 74 6f 20 67 68 20 2a 2f 0a 20 20  * .. to gh */.  
d660: 7b 20 30 78 30 31 31 45 2c 20 20 30 78 34 37 2c  { 0x011E,  0x47,
d670: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9e 20   0x00 },  /* .. 
d680: 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to G */.  { 0x01
d690: 31 46 2c 20 20 30 78 36 37 2c 20 30 78 30 30 20  1F,  0x67, 0x00 
d6a0: 7d 2c 20 20 2f 2a 20 c4 9f 20 74 6f 20 67 20 2a  },  /* .. to g *
d6b0: 2f 0a 20 20 7b 20 30 78 30 31 32 30 2c 20 20 30  /.  { 0x0120,  0
d6c0: 78 34 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x47, 0x00 },  /*
d6d0: 20 c4 a0 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20   .. to G */.  { 
d6e0: 30 78 30 31 32 31 2c 20 20 30 78 36 37 2c 20 30  0x0121,  0x67, 0
d6f0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a1 20 74 6f  x00 },  /* .. to
d700: 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 32   g */.  { 0x0122
d710: 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c  ,  0x47, 0x00 },
d720: 20 20 2f 2a 20 c4 a2 20 74 6f 20 47 20 2a 2f 0a    /* .. to G */.
d730: 20 20 7b 20 30 78 30 31 32 33 2c 20 20 30 78 36    { 0x0123,  0x6
d740: 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  7, 0x00 },  /* .
d750: a3 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78  . to g */.  { 0x
d760: 30 31 32 34 2c 20 20 30 78 34 38 2c 20 30 78 36  0124,  0x48, 0x6
d770: 38 20 7d 2c 20 20 2f 2a 20 c4 a4 20 74 6f 20 48  8 },  /* .. to H
d780: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 35 2c  h */.  { 0x0125,
d790: 20 20 30 78 36 38 2c 20 30 78 36 38 20 7d 2c 20    0x68, 0x68 }, 
d7a0: 20 2f 2a 20 c4 a5 20 74 6f 20 68 68 20 2a 2f 0a   /* .. to hh */.
d7b0: 20 20 7b 20 30 78 30 31 32 36 2c 20 20 30 78 34    { 0x0126,  0x4
d7c0: 38 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  8, 0x00 },  /* .
d7d0: a6 20 74 6f 20 48 20 2a 2f 0a 20 20 7b 20 30 78  . to H */.  { 0x
d7e0: 30 31 32 37 2c 20 20 30 78 36 38 2c 20 30 78 30  0127,  0x68, 0x0
d7f0: 30 20 7d 2c 20 20 2f 2a 20 c4 a7 20 74 6f 20 68  0 },  /* .. to h
d800: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 38 2c 20   */.  { 0x0128, 
d810: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
d820: 2f 2a 20 c4 a8 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
d830: 7b 20 30 78 30 31 32 39 2c 20 20 30 78 36 39 2c  { 0x0129,  0x69,
d840: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a9 20   0x00 },  /* .. 
d850: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to i */.  { 0x01
d860: 32 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  2A,  0x49, 0x00 
d870: 7d 2c 20 20 2f 2a 20 c4 aa 20 74 6f 20 49 20 2a  },  /* .. to I *
d880: 2f 0a 20 20 7b 20 30 78 30 31 32 42 2c 20 20 30  /.  { 0x012B,  0
d890: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
d8a0: 20 c4 ab 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
d8b0: 30 78 30 31 32 43 2c 20 20 30 78 34 39 2c 20 30  0x012C,  0x49, 0
d8c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ac 20 74 6f  x00 },  /* .. to
d8d0: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 44   I */.  { 0x012D
d8e0: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
d8f0: 20 20 2f 2a 20 c4 ad 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
d900: 20 20 7b 20 30 78 30 31 32 45 2c 20 20 30 78 34    { 0x012E,  0x4
d910: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  9, 0x00 },  /* .
d920: ae 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
d930: 30 31 32 46 2c 20 20 30 78 36 39 2c 20 30 78 30  012F,  0x69, 0x0
d940: 30 20 7d 2c 20 20 2f 2a 20 c4 af 20 74 6f 20 69  0 },  /* .. to i
d950: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 30 2c 20   */.  { 0x0130, 
d960: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
d970: 2f 2a 20 c4 b0 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
d980: 7b 20 30 78 30 31 33 31 2c 20 20 30 78 36 39 2c  { 0x0131,  0x69,
d990: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b1 20   0x00 },  /* .. 
d9a0: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to i */.  { 0x01
d9b0: 33 32 2c 20 20 30 78 34 39 2c 20 30 78 34 41 20  32,  0x49, 0x4A 
d9c0: 7d 2c 20 20 2f 2a 20 c4 b2 20 74 6f 20 49 4a 20  },  /* .. to IJ 
d9d0: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 33 2c 20 20  */.  { 0x0133,  
d9e0: 30 78 36 39 2c 20 30 78 36 41 20 7d 2c 20 20 2f  0x69, 0x6A },  /
d9f0: 2a 20 c4 b3 20 74 6f 20 69 6a 20 2a 2f 0a 20 20  * .. to ij */.  
da00: 7b 20 30 78 30 31 33 34 2c 20 20 30 78 34 41 2c  { 0x0134,  0x4A,
da10: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 b4 20   0x68 },  /* .. 
da20: 74 6f 20 4a 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Jh */.  { 0x0
da30: 31 33 35 2c 20 20 30 78 36 41 2c 20 30 78 36 38  135,  0x6A, 0x68
da40: 20 7d 2c 20 20 2f 2a 20 c4 b5 20 74 6f 20 6a 68   },  /* .. to jh
da50: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 36 2c 20   */.  { 0x0136, 
da60: 20 30 78 34 42 2c 20 30 78 30 30 20 7d 2c 20 20   0x4B, 0x00 },  
da70: 2f 2a 20 c4 b6 20 74 6f 20 4b 20 2a 2f 0a 20 20  /* .. to K */.  
da80: 7b 20 30 78 30 31 33 37 2c 20 20 30 78 36 42 2c  { 0x0137,  0x6B,
da90: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b7 20   0x00 },  /* .. 
daa0: 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to k */.  { 0x01
dab0: 33 38 2c 20 20 30 78 36 42 2c 20 30 78 30 30 20  38,  0x6B, 0x00 
dac0: 7d 2c 20 20 2f 2a 20 c4 b8 20 74 6f 20 6b 20 2a  },  /* .. to k *
dad0: 2f 0a 20 20 7b 20 30 78 30 31 33 39 2c 20 20 30  /.  { 0x0139,  0
dae0: 78 34 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4C, 0x00 },  /*
daf0: 20 c4 b9 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20   .. to L */.  { 
db00: 30 78 30 31 33 41 2c 20 20 30 78 36 43 2c 20 30  0x013A,  0x6C, 0
db10: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ba 20 74 6f  x00 },  /* .. to
db20: 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 42   l */.  { 0x013B
db30: 2c 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d 2c  ,  0x4C, 0x00 },
db40: 20 20 2f 2a 20 c4 bb 20 74 6f 20 4c 20 2a 2f 0a    /* .. to L */.
db50: 20 20 7b 20 30 78 30 31 33 43 2c 20 20 30 78 36    { 0x013C,  0x6
db60: 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  C, 0x00 },  /* .
db70: bc 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78  . to l */.  { 0x
db80: 30 31 33 44 2c 20 20 30 78 34 43 2c 20 30 78 30  013D,  0x4C, 0x0
db90: 30 20 7d 2c 20 20 2f 2a 20 c4 bd 20 74 6f 20 4c  0 },  /* .. to L
dba0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 45 2c 20   */.  { 0x013E, 
dbb0: 20 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20 20   0x6C, 0x00 },  
dbc0: 2f 2a 20 c4 be 20 74 6f 20 6c 20 2a 2f 0a 20 20  /* .. to l */.  
dbd0: 7b 20 30 78 30 31 33 46 2c 20 20 30 78 34 43 2c  { 0x013F,  0x4C,
dbe0: 20 30 78 32 45 20 7d 2c 20 20 2f 2a 20 c4 bf 20   0x2E },  /* .. 
dbf0: 74 6f 20 4c 2e 20 2a 2f 0a 20 20 7b 20 30 78 30  to L. */.  { 0x0
dc00: 31 34 30 2c 20 20 30 78 36 43 2c 20 30 78 32 45  140,  0x6C, 0x2E
dc10: 20 7d 2c 20 20 2f 2a 20 c5 80 20 74 6f 20 6c 2e   },  /* .. to l.
dc20: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 31 2c 20   */.  { 0x0141, 
dc30: 20 30 78 34 43 2c 20 30 78 30 30 20 7d 2c 20 20   0x4C, 0x00 },  
dc40: 2f 2a 20 c5 81 20 74 6f 20 4c 20 2a 2f 0a 20 20  /* .. to L */.  
dc50: 7b 20 30 78 30 31 34 32 2c 20 20 30 78 36 43 2c  { 0x0142,  0x6C,
dc60: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 82 20   0x00 },  /* .. 
dc70: 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to l */.  { 0x01
dc80: 34 33 2c 20 20 30 78 34 45 2c 20 30 78 30 30 20  43,  0x4E, 0x00 
dc90: 7d 2c 20 20 2f 2a 20 c5 83 20 74 6f 20 4e 20 2a  },  /* .. to N *
dca0: 2f 0a 20 20 7b 20 30 78 30 31 34 34 2c 20 20 30  /.  { 0x0144,  0
dcb0: 78 36 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6E, 0x00 },  /*
dcc0: 20 c5 84 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20   .. to n */.  { 
dcd0: 30 78 30 31 34 35 2c 20 20 30 78 34 45 2c 20 30  0x0145,  0x4E, 0
dce0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 85 20 74 6f  x00 },  /* .. to
dcf0: 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 36   N */.  { 0x0146
dd00: 2c 20 20 30 78 36 45 2c 20 30 78 30 30 20 7d 2c  ,  0x6E, 0x00 },
dd10: 20 20 2f 2a 20 c5 86 20 74 6f 20 6e 20 2a 2f 0a    /* .. to n */.
dd20: 20 20 7b 20 30 78 30 31 34 37 2c 20 20 30 78 34    { 0x0147,  0x4
dd30: 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  E, 0x00 },  /* .
dd40: 87 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78  . to N */.  { 0x
dd50: 30 31 34 38 2c 20 20 30 78 36 45 2c 20 30 78 30  0148,  0x6E, 0x0
dd60: 30 20 7d 2c 20 20 2f 2a 20 c5 88 20 74 6f 20 6e  0 },  /* .. to n
dd70: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 39 2c 20   */.  { 0x0149, 
dd80: 20 30 78 32 37 2c 20 30 78 36 45 20 7d 2c 20 20   0x27, 0x6E },  
dd90: 2f 2a 20 c5 89 20 74 6f 20 27 6e 20 2a 2f 0a 20  /* .. to 'n */. 
dda0: 20 7b 20 30 78 30 31 34 41 2c 20 20 30 78 34 45   { 0x014A,  0x4E
ddb0: 2c 20 30 78 34 37 20 7d 2c 20 20 2f 2a 20 c5 8a  , 0x47 },  /* ..
ddc0: 20 74 6f 20 4e 47 20 2a 2f 0a 20 20 7b 20 30 78   to NG */.  { 0x
ddd0: 30 31 34 42 2c 20 20 30 78 36 45 2c 20 30 78 36  014B,  0x6E, 0x6
dde0: 37 20 7d 2c 20 20 2f 2a 20 c5 8b 20 74 6f 20 6e  7 },  /* .. to n
ddf0: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 43 2c  g */.  { 0x014C,
de00: 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c 20    0x4F, 0x00 }, 
de10: 20 2f 2a 20 c5 8c 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
de20: 20 7b 20 30 78 30 31 34 44 2c 20 20 30 78 36 46   { 0x014D,  0x6F
de30: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8d  , 0x00 },  /* ..
de40: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
de50: 31 34 45 2c 20 20 30 78 34 46 2c 20 30 78 30 30  14E,  0x4F, 0x00
de60: 20 7d 2c 20 20 2f 2a 20 c5 8e 20 74 6f 20 4f 20   },  /* .. to O 
de70: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 46 2c 20 20  */.  { 0x014F,  
de80: 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6F, 0x00 },  /
de90: 2a 20 c5 8f 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b  * .. to o */.  {
dea0: 20 30 78 30 31 35 30 2c 20 20 30 78 34 46 2c 20   0x0150,  0x4F, 
deb0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 90 20 74  0x00 },  /* .. t
dec0: 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35  o O */.  { 0x015
ded0: 31 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d  1,  0x6F, 0x00 }
dee0: 2c 20 20 2f 2a 20 c5 91 20 74 6f 20 6f 20 2a 2f  ,  /* .. to o */
def0: 0a 20 20 7b 20 30 78 30 31 35 32 2c 20 20 30 78  .  { 0x0152,  0x
df00: 34 46 2c 20 30 78 34 35 20 7d 2c 20 20 2f 2a 20  4F, 0x45 },  /* 
df10: c5 92 20 74 6f 20 4f 45 20 2a 2f 0a 20 20 7b 20  .. to OE */.  { 
df20: 30 78 30 31 35 33 2c 20 20 30 78 36 46 2c 20 30  0x0153,  0x6F, 0
df30: 78 36 35 20 7d 2c 20 20 2f 2a 20 c5 93 20 74 6f  x65 },  /* .. to
df40: 20 6f 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35   oe */.  { 0x015
df50: 34 2c 20 20 30 78 35 32 2c 20 30 78 30 30 20 7d  4,  0x52, 0x00 }
df60: 2c 20 20 2f 2a 20 c5 94 20 74 6f 20 52 20 2a 2f  ,  /* .. to R */
df70: 0a 20 20 7b 20 30 78 30 31 35 35 2c 20 20 30 78  .  { 0x0155,  0x
df80: 37 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  72, 0x00 },  /* 
df90: c5 95 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30  .. to r */.  { 0
dfa0: 78 30 31 35 36 2c 20 20 30 78 35 32 2c 20 30 78  x0156,  0x52, 0x
dfb0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 96 20 74 6f 20  00 },  /* .. to 
dfc0: 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 37 2c  R */.  { 0x0157,
dfd0: 20 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20    0x72, 0x00 }, 
dfe0: 20 2f 2a 20 c5 97 20 74 6f 20 72 20 2a 2f 0a 20   /* .. to r */. 
dff0: 20 7b 20 30 78 30 31 35 38 2c 20 20 30 78 35 32   { 0x0158,  0x52
e000: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 98  , 0x00 },  /* ..
e010: 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30   to R */.  { 0x0
e020: 31 35 39 2c 20 20 30 78 37 32 2c 20 30 78 30 30  159,  0x72, 0x00
e030: 20 7d 2c 20 20 2f 2a 20 c5 99 20 74 6f 20 72 20   },  /* .. to r 
e040: 2a 2f 0a 20 20 7b 20 30 78 30 31 35 41 2c 20 20  */.  { 0x015A,  
e050: 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x53, 0x00 },  /
e060: 2a 20 c5 9a 20 74 6f 20 53 20 2a 2f 0a 20 20 7b  * .. to S */.  {
e070: 20 30 78 30 31 35 42 2c 20 20 30 78 37 33 2c 20   0x015B,  0x73, 
e080: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9b 20 74  0x00 },  /* .. t
e090: 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35  o s */.  { 0x015
e0a0: 43 2c 20 20 30 78 35 33 2c 20 30 78 36 38 20 7d  C,  0x53, 0x68 }
e0b0: 2c 20 20 2f 2a 20 c5 9c 20 74 6f 20 53 68 20 2a  ,  /* .. to Sh *
e0c0: 2f 0a 20 20 7b 20 30 78 30 31 35 44 2c 20 20 30  /.  { 0x015D,  0
e0d0: 78 37 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a  x73, 0x68 },  /*
e0e0: 20 c5 9d 20 74 6f 20 73 68 20 2a 2f 0a 20 20 7b   .. to sh */.  {
e0f0: 20 30 78 30 31 35 45 2c 20 20 30 78 35 33 2c 20   0x015E,  0x53, 
e100: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9e 20 74  0x00 },  /* .. t
e110: 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35  o S */.  { 0x015
e120: 46 2c 20 20 30 78 37 33 2c 20 30 78 30 30 20 7d  F,  0x73, 0x00 }
e130: 2c 20 20 2f 2a 20 c5 9f 20 74 6f 20 73 20 2a 2f  ,  /* .. to s */
e140: 0a 20 20 7b 20 30 78 30 31 36 30 2c 20 20 30 78  .  { 0x0160,  0x
e150: 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  53, 0x00 },  /* 
e160: c5 a0 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30  .. to S */.  { 0
e170: 78 30 31 36 31 2c 20 20 30 78 37 33 2c 20 30 78  x0161,  0x73, 0x
e180: 30 30 20 7d 2c 20 20 2f 2a 20 c5 a1 20 74 6f 20  00 },  /* .. to 
e190: 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 32 2c  s */.  { 0x0162,
e1a0: 20 20 30 78 35 34 2c 20 30 78 30 30 20 7d 2c 20    0x54, 0x00 }, 
e1b0: 20 2f 2a 20 c5 a2 20 74 6f 20 54 20 2a 2f 0a 20   /* .. to T */. 
e1c0: 20 7b 20 30 78 30 31 36 33 2c 20 20 30 78 37 34   { 0x0163,  0x74
e1d0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a3  , 0x00 },  /* ..
e1e0: 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30   to t */.  { 0x0
e1f0: 31 36 34 2c 20 20 30 78 35 34 2c 20 30 78 30 30  164,  0x54, 0x00
e200: 20 7d 2c 20 20 2f 2a 20 c5 a4 20 74 6f 20 54 20   },  /* .. to T 
e210: 2a 2f 0a 20 20 7b 20 30 78 30 31 36 35 2c 20 20  */.  { 0x0165,  
e220: 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x74, 0x00 },  /
e230: 2a 20 c5 a5 20 74 6f 20 74 20 2a 2f 0a 20 20 7b  * .. to t */.  {
e240: 20 30 78 30 31 36 36 2c 20 20 30 78 35 34 2c 20   0x0166,  0x54, 
e250: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a6 20 74  0x00 },  /* .. t
e260: 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36  o T */.  { 0x016
e270: 37 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d  7,  0x74, 0x00 }
e280: 2c 20 20 2f 2a 20 c5 a7 20 74 6f 20 74 20 2a 2f  ,  /* .. to t */
e290: 0a 20 20 7b 20 30 78 30 31 36 38 2c 20 20 30 78  .  { 0x0168,  0x
e2a0: 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  55, 0x00 },  /* 
e2b0: c5 a8 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30  .. to U */.  { 0
e2c0: 78 30 31 36 39 2c 20 20 30 78 37 35 2c 20 30 78  x0169,  0x75, 0x
e2d0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 a9 20 74 6f 20  00 },  /* .. to 
e2e0: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 41 2c  u */.  { 0x016A,
e2f0: 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20    0x55, 0x00 }, 
e300: 20 2f 2a 20 c5 aa 20 74 6f 20 55 20 2a 2f 0a 20   /* .. to U */. 
e310: 20 7b 20 30 78 30 31 36 42 2c 20 20 30 78 37 35   { 0x016B,  0x75
e320: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ab  , 0x00 },  /* ..
e330: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
e340: 31 36 43 2c 20 20 30 78 35 35 2c 20 30 78 30 30  16C,  0x55, 0x00
e350: 20 7d 2c 20 20 2f 2a 20 c5 ac 20 74 6f 20 55 20   },  /* .. to U 
e360: 2a 2f 0a 20 20 7b 20 30 78 30 31 36 44 2c 20 20  */.  { 0x016D,  
e370: 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x75, 0x00 },  /
e380: 2a 20 c5 ad 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
e390: 20 30 78 30 31 36 45 2c 20 20 30 78 35 35 2c 20   0x016E,  0x55, 
e3a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ae 20 74  0x00 },  /* .. t
e3b0: 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36  o U */.  { 0x016
e3c0: 46 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d  F,  0x75, 0x00 }
e3d0: 2c 20 20 2f 2a 20 c5 af 20 74 6f 20 75 20 2a 2f  ,  /* .. to u */
e3e0: 0a 20 20 7b 20 30 78 30 31 37 30 2c 20 20 30 78  .  { 0x0170,  0x
e3f0: 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  55, 0x00 },  /* 
e400: c5 b0 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30  .. to U */.  { 0
e410: 78 30 31 37 31 2c 20 20 30 78 37 35 2c 20 30 78  x0171,  0x75, 0x
e420: 30 30 20 7d 2c 20 20 2f 2a 20 c5 b1 20 74 6f 20  00 },  /* .. to 
e430: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 32 2c  u */.  { 0x0172,
e440: 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20    0x55, 0x00 }, 
e450: 20 2f 2a 20 c5 b2 20 74 6f 20 55 20 2a 2f 0a 20   /* .. to U */. 
e460: 20 7b 20 30 78 30 31 37 33 2c 20 20 30 78 37 35   { 0x0173,  0x75
e470: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b3  , 0x00 },  /* ..
e480: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
e490: 31 37 34 2c 20 20 30 78 35 37 2c 20 30 78 30 30  174,  0x57, 0x00
e4a0: 20 7d 2c 20 20 2f 2a 20 c5 b4 20 74 6f 20 57 20   },  /* .. to W 
e4b0: 2a 2f 0a 20 20 7b 20 30 78 30 31 37 35 2c 20 20  */.  { 0x0175,  
e4c0: 30 78 37 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x77, 0x00 },  /
e4d0: 2a 20 c5 b5 20 74 6f 20 77 20 2a 2f 0a 20 20 7b  * .. to w */.  {
e4e0: 20 30 78 30 31 37 36 2c 20 20 30 78 35 39 2c 20   0x0176,  0x59, 
e4f0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b6 20 74  0x00 },  /* .. t
e500: 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37  o Y */.  { 0x017
e510: 37 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d  7,  0x79, 0x00 }
e520: 2c 20 20 2f 2a 20 c5 b7 20 74 6f 20 79 20 2a 2f  ,  /* .. to y */
e530: 0a 20 20 7b 20 30 78 30 31 37 38 2c 20 20 30 78  .  { 0x0178,  0x
e540: 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  59, 0x00 },  /* 
e550: c5 b8 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30  .. to Y */.  { 0
e560: 78 30 31 37 39 2c 20 20 30 78 35 41 2c 20 30 78  x0179,  0x5A, 0x
e570: 30 30 20 7d 2c 20 20 2f 2a 20 c5 b9 20 74 6f 20  00 },  /* .. to 
e580: 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 41 2c  Z */.  { 0x017A,
e590: 20 20 30 78 37 41 2c 20 30 78 30 30 20 7d 2c 20    0x7A, 0x00 }, 
e5a0: 20 2f 2a 20 c5 ba 20 74 6f 20 7a 20 2a 2f 0a 20   /* .. to z */. 
e5b0: 20 7b 20 30 78 30 31 37 42 2c 20 20 30 78 35 41   { 0x017B,  0x5A
e5c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bb  , 0x00 },  /* ..
e5d0: 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30   to Z */.  { 0x0
e5e0: 31 37 43 2c 20 20 30 78 37 41 2c 20 30 78 30 30  17C,  0x7A, 0x00
e5f0: 20 7d 2c 20 20 2f 2a 20 c5 bc 20 74 6f 20 7a 20   },  /* .. to z 
e600: 2a 2f 0a 20 20 7b 20 30 78 30 31 37 44 2c 20 20  */.  { 0x017D,  
e610: 30 78 35 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x5A, 0x00 },  /
e620: 2a 20 c5 bd 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b  * .. to Z */.  {
e630: 20 30 78 30 31 37 45 2c 20 20 30 78 37 41 2c 20   0x017E,  0x7A, 
e640: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 be 20 74  0x00 },  /* .. t
e650: 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37  o z */.  { 0x017
e660: 46 2c 20 20 30 78 37 33 2c 20 30 78 30 30 20 7d  F,  0x73, 0x00 }
e670: 2c 20 20 2f 2a 20 c5 bf 20 74 6f 20 73 20 2a 2f  ,  /* .. to s */
e680: 0a 20 20 7b 20 30 78 30 31 39 32 2c 20 20 30 78  .  { 0x0192,  0x
e690: 36 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  66, 0x00 },  /* 
e6a0: c6 92 20 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30  .. to f */.  { 0
e6b0: 78 30 32 31 38 2c 20 20 30 78 35 33 2c 20 30 78  x0218,  0x53, 0x
e6c0: 30 30 20 7d 2c 20 20 2f 2a 20 c8 98 20 74 6f 20  00 },  /* .. to 
e6d0: 53 20 2a 2f 0a 20 20 7b 20 30 78 30 32 31 39 2c  S */.  { 0x0219,
e6e0: 20 20 30 78 37 33 2c 20 30 78 30 30 20 7d 2c 20    0x73, 0x00 }, 
e6f0: 20 2f 2a 20 c8 99 20 74 6f 20 73 20 2a 2f 0a 20   /* .. to s */. 
e700: 20 7b 20 30 78 30 32 31 41 2c 20 20 30 78 35 34   { 0x021A,  0x54
e710: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9a  , 0x00 },  /* ..
e720: 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30   to T */.  { 0x0
e730: 32 31 42 2c 20 20 30 78 37 34 2c 20 30 78 30 30  21B,  0x74, 0x00
e740: 20 7d 2c 20 20 2f 2a 20 c8 9b 20 74 6f 20 74 20   },  /* .. to t 
e750: 2a 2f 0a 20 20 7b 20 30 78 30 33 38 36 2c 20 20  */.  { 0x0386,  
e760: 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x41, 0x00 },  /
e770: 2a 20 ce 86 20 74 6f 20 41 20 2a 2f 0a 20 20 7b  * .. to A */.  {
e780: 20 30 78 30 33 38 38 2c 20 20 30 78 34 35 2c 20   0x0388,  0x45, 
e790: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 88 20 74  0x00 },  /* .. t
e7a0: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38  o E */.  { 0x038
e7b0: 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  9,  0x49, 0x00 }
e7c0: 2c 20 20 2f 2a 20 ce 89 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
e7d0: 0a 20 20 7b 20 30 78 30 33 38 41 2c 20 20 30 78  .  { 0x038A,  0x
e7e0: 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  49, 0x00 },  /* 
e7f0: ce 8a 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
e800: 78 30 33 38 43 2c 20 20 30 78 34 66 2c 20 30 78  x038C,  0x4f, 0x
e810: 30 30 20 7d 2c 20 20 2f 2a 20 ce 8c 20 74 6f 20  00 },  /* .. to 
e820: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 45 2c  O */.  { 0x038E,
e830: 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20    0x59, 0x00 }, 
e840: 20 2f 2a 20 ce 8e 20 74 6f 20 59 20 2a 2f 0a 20   /* .. to Y */. 
e850: 20 7b 20 30 78 30 33 38 46 2c 20 20 30 78 34 66   { 0x038F,  0x4f
e860: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 8f  , 0x00 },  /* ..
e870: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
e880: 33 39 30 2c 20 20 30 78 36 39 2c 20 30 78 30 30  390,  0x69, 0x00
e890: 20 7d 2c 20 20 2f 2a 20 ce 90 20 74 6f 20 69 20   },  /* .. to i 
e8a0: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 31 2c 20 20  */.  { 0x0391,  
e8b0: 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x41, 0x00 },  /
e8c0: 2a 20 ce 91 20 74 6f 20 41 20 2a 2f 0a 20 20 7b  * .. to A */.  {
e8d0: 20 30 78 30 33 39 32 2c 20 20 30 78 34 32 2c 20   0x0392,  0x42, 
e8e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 92 20 74  0x00 },  /* .. t
e8f0: 6f 20 42 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39  o B */.  { 0x039
e900: 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d  3,  0x47, 0x00 }
e910: 2c 20 20 2f 2a 20 ce 93 20 74 6f 20 47 20 2a 2f  ,  /* .. to G */
e920: 0a 20 20 7b 20 30 78 30 33 39 34 2c 20 20 30 78  .  { 0x0394,  0x
e930: 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  44, 0x00 },  /* 
e940: ce 94 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30  .. to D */.  { 0
e950: 78 30 33 39 35 2c 20 20 30 78 34 35 2c 20 30 78  x0395,  0x45, 0x
e960: 30 30 20 7d 2c 20 20 2f 2a 20 ce 95 20 74 6f 20  00 },  /* .. to 
e970: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 36 2c  E */.  { 0x0396,
e980: 20 20 30 78 35 61 2c 20 30 78 30 30 20 7d 2c 20    0x5a, 0x00 }, 
e990: 20 2f 2a 20 ce 96 20 74 6f 20 5a 20 2a 2f 0a 20   /* .. to Z */. 
e9a0: 20 7b 20 30 78 30 33 39 37 2c 20 20 30 78 34 39   { 0x0397,  0x49
e9b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 97  , 0x00 },  /* ..
e9c0: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
e9d0: 33 39 38 2c 20 20 30 78 35 34 2c 20 30 78 36 38  398,  0x54, 0x68
e9e0: 20 7d 2c 20 20 2f 2a 20 ce 98 20 74 6f 20 54 68   },  /* .. to Th
e9f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 39 2c 20   */.  { 0x0399, 
ea00: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
ea10: 2f 2a 20 ce 99 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
ea20: 7b 20 30 78 30 33 39 41 2c 20 20 30 78 34 62 2c  { 0x039A,  0x4b,
ea30: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9a 20   0x00 },  /* .. 
ea40: 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to K */.  { 0x03
ea50: 39 42 2c 20 20 30 78 34 63 2c 20 30 78 30 30 20  9B,  0x4c, 0x00 
ea60: 7d 2c 20 20 2f 2a 20 ce 9b 20 74 6f 20 4c 20 2a  },  /* .. to L *
ea70: 2f 0a 20 20 7b 20 30 78 30 33 39 43 2c 20 20 30  /.  { 0x039C,  0
ea80: 78 34 64 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4d, 0x00 },  /*
ea90: 20 ce 9c 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b 20   .. to M */.  { 
eaa0: 30 78 30 33 39 44 2c 20 20 30 78 34 65 2c 20 30  0x039D,  0x4e, 0
eab0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9d 20 74 6f  x00 },  /* .. to
eac0: 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 45   N */.  { 0x039E
ead0: 2c 20 20 30 78 35 38 2c 20 30 78 30 30 20 7d 2c  ,  0x58, 0x00 },
eae0: 20 20 2f 2a 20 ce 9e 20 74 6f 20 58 20 2a 2f 0a    /* .. to X */.
eaf0: 20 20 7b 20 30 78 30 33 39 46 2c 20 20 30 78 34    { 0x039F,  0x4
eb00: 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  f, 0x00 },  /* .
eb10: 9f 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
eb20: 30 33 41 30 2c 20 20 30 78 35 30 2c 20 30 78 30  03A0,  0x50, 0x0
eb30: 30 20 7d 2c 20 20 2f 2a 20 ce a0 20 74 6f 20 50  0 },  /* .. to P
eb40: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 31 2c 20   */.  { 0x03A1, 
eb50: 20 30 78 35 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x52, 0x00 },  
eb60: 2f 2a 20 ce a1 20 74 6f 20 52 20 2a 2f 0a 20 20  /* .. to R */.  
eb70: 7b 20 30 78 30 33 41 33 2c 20 20 30 78 35 33 2c  { 0x03A3,  0x53,
eb80: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a3 20   0x00 },  /* .. 
eb90: 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to S */.  { 0x03
eba0: 41 34 2c 20 20 30 78 35 34 2c 20 30 78 30 30 20  A4,  0x54, 0x00 
ebb0: 7d 2c 20 20 2f 2a 20 ce a4 20 74 6f 20 54 20 2a  },  /* .. to T *
ebc0: 2f 0a 20 20 7b 20 30 78 30 33 41 35 2c 20 20 30  /.  { 0x03A5,  0
ebd0: 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x59, 0x00 },  /*
ebe0: 20 ce a5 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20   .. to Y */.  { 
ebf0: 30 78 30 33 41 36 2c 20 20 30 78 34 36 2c 20 30  0x03A6,  0x46, 0
ec00: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a6 20 74 6f  x00 },  /* .. to
ec10: 20 46 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 37   F */.  { 0x03A7
ec20: 2c 20 20 30 78 34 33 2c 20 30 78 36 38 20 7d 2c  ,  0x43, 0x68 },
ec30: 20 20 2f 2a 20 ce a7 20 74 6f 20 43 68 20 2a 2f    /* .. to Ch */
ec40: 0a 20 20 7b 20 30 78 30 33 41 38 2c 20 20 30 78  .  { 0x03A8,  0x
ec50: 35 30 2c 20 30 78 37 33 20 7d 2c 20 20 2f 2a 20  50, 0x73 },  /* 
ec60: ce a8 20 74 6f 20 50 73 20 2a 2f 0a 20 20 7b 20  .. to Ps */.  { 
ec70: 30 78 30 33 41 39 2c 20 20 30 78 34 66 2c 20 30  0x03A9,  0x4f, 0
ec80: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a9 20 74 6f  x00 },  /* .. to
ec90: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 41   O */.  { 0x03AA
eca0: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
ecb0: 20 20 2f 2a 20 ce aa 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
ecc0: 20 20 7b 20 30 78 30 33 41 42 2c 20 20 30 78 35    { 0x03AB,  0x5
ecd0: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  9, 0x00 },  /* .
ece0: ab 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78  . to Y */.  { 0x
ecf0: 30 33 41 43 2c 20 20 30 78 36 31 2c 20 30 78 30  03AC,  0x61, 0x0
ed00: 30 20 7d 2c 20 20 2f 2a 20 ce ac 20 74 6f 20 61  0 },  /* .. to a
ed10: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 44 2c 20   */.  { 0x03AD, 
ed20: 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x65, 0x00 },  
ed30: 2f 2a 20 ce ad 20 74 6f 20 65 20 2a 2f 0a 20 20  /* .. to e */.  
ed40: 7b 20 30 78 30 33 41 45 2c 20 20 30 78 36 39 2c  { 0x03AE,  0x69,
ed50: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ae 20   0x00 },  /* .. 
ed60: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to i */.  { 0x03
ed70: 41 46 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  AF,  0x69, 0x00 
ed80: 7d 2c 20 20 2f 2a 20 ce af 20 74 6f 20 69 20 2a  },  /* .. to i *
ed90: 2f 0a 20 20 7b 20 30 78 30 33 42 31 2c 20 20 30  /.  { 0x03B1,  0
eda0: 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x61, 0x00 },  /*
edb0: 20 ce b1 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20   .. to a */.  { 
edc0: 30 78 30 33 42 32 2c 20 20 30 78 36 32 2c 20 30  0x03B2,  0x62, 0
edd0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b2 20 74 6f  x00 },  /* .. to
ede0: 20 62 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 33   b */.  { 0x03B3
edf0: 2c 20 20 30 78 36 37 2c 20 30 78 30 30 20 7d 2c  ,  0x67, 0x00 },
ee00: 20 20 2f 2a 20 ce b3 20 74 6f 20 67 20 2a 2f 0a    /* .. to g */.
ee10: 20 20 7b 20 30 78 30 33 42 34 2c 20 20 30 78 36    { 0x03B4,  0x6
ee20: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  4, 0x00 },  /* .
ee30: b4 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78  . to d */.  { 0x
ee40: 30 33 42 35 2c 20 20 30 78 36 35 2c 20 30 78 30  03B5,  0x65, 0x0
ee50: 30 20 7d 2c 20 20 2f 2a 20 ce b5 20 74 6f 20 65  0 },  /* .. to e
ee60: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 36 2c 20   */.  { 0x03B6, 
ee70: 20 30 78 37 61 2c 20 30 78 30 30 20 7d 2c 20 20   0x7a, 0x00 },  
ee80: 2f 2a 20 ce b6 20 74 6f 20 7a 20 2a 2f 0a 20 20  /* .. to z */.  
ee90: 7b 20 30 78 30 33 42 37 2c 20 20 30 78 36 39 2c  { 0x03B7,  0x69,
eea0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b7 20   0x00 },  /* .. 
eeb0: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to i */.  { 0x03
eec0: 42 38 2c 20 20 30 78 37 34 2c 20 30 78 36 38 20  B8,  0x74, 0x68 
eed0: 7d 2c 20 20 2f 2a 20 ce b8 20 74 6f 20 74 68 20  },  /* .. to th 
eee0: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 39 2c 20 20  */.  { 0x03B9,  
eef0: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
ef00: 2a 20 ce b9 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
ef10: 20 30 78 30 33 42 41 2c 20 20 30 78 36 62 2c 20   0x03BA,  0x6b, 
ef20: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ba 20 74  0x00 },  /* .. t
ef30: 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o k */.  { 0x03B
ef40: 42 2c 20 20 30 78 36 63 2c 20 30 78 30 30 20 7d  B,  0x6c, 0x00 }
ef50: 2c 20 20 2f 2a 20 ce bb 20 74 6f 20 6c 20 2a 2f  ,  /* .. to l */
ef60: 0a 20 20 7b 20 30 78 30 33 42 43 2c 20 20 30 78  .  { 0x03BC,  0x
ef70: 36 64 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6d, 0x00 },  /* 
ef80: ce bc 20 74 6f 20 6d 20 2a 2f 0a 20 20 7b 20 30  .. to m */.  { 0
ef90: 78 30 33 42 44 2c 20 20 30 78 36 65 2c 20 30 78  x03BD,  0x6e, 0x
efa0: 30 30 20 7d 2c 20 20 2f 2a 20 ce bd 20 74 6f 20  00 },  /* .. to 
efb0: 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 45 2c  n */.  { 0x03BE,
efc0: 20 20 30 78 37 38 2c 20 30 78 30 30 20 7d 2c 20    0x78, 0x00 }, 
efd0: 20 2f 2a 20 ce be 20 74 6f 20 78 20 2a 2f 0a 20   /* .. to x */. 
efe0: 20 7b 20 30 78 30 33 42 46 2c 20 20 30 78 36 66   { 0x03BF,  0x6f
eff0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bf  , 0x00 },  /* ..
f000: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
f010: 33 43 30 2c 20 20 30 78 37 30 2c 20 30 78 30 30  3C0,  0x70, 0x00
f020: 20 7d 2c 20 20 2f 2a 20 cf 80 20 74 6f 20 70 20   },  /* .. to p 
f030: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 31 2c 20 20  */.  { 0x03C1,  
f040: 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x72, 0x00 },  /
f050: 2a 20 cf 81 20 74 6f 20 72 20 2a 2f 0a 20 20 7b  * .. to r */.  {
f060: 20 30 78 30 33 43 33 2c 20 20 30 78 37 33 2c 20   0x03C3,  0x73, 
f070: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 83 20 74  0x00 },  /* .. t
f080: 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43  o s */.  { 0x03C
f090: 34 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d  4,  0x74, 0x00 }
f0a0: 2c 20 20 2f 2a 20 cf 84 20 74 6f 20 74 20 2a 2f  ,  /* .. to t */
f0b0: 0a 20 20 7b 20 30 78 30 33 43 35 2c 20 20 30 78  .  { 0x03C5,  0x
f0c0: 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  79, 0x00 },  /* 
f0d0: cf 85 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30  .. to y */.  { 0
f0e0: 78 30 33 43 36 2c 20 20 30 78 36 36 2c 20 30 78  x03C6,  0x66, 0x
f0f0: 30 30 20 7d 2c 20 20 2f 2a 20 cf 86 20 74 6f 20  00 },  /* .. to 
f100: 66 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 37 2c  f */.  { 0x03C7,
f110: 20 20 30 78 36 33 2c 20 30 78 36 38 20 7d 2c 20    0x63, 0x68 }, 
f120: 20 2f 2a 20 cf 87 20 74 6f 20 63 68 20 2a 2f 0a   /* .. to ch */.
f130: 20 20 7b 20 30 78 30 33 43 38 2c 20 20 30 78 37    { 0x03C8,  0x7
f140: 30 2c 20 30 78 37 33 20 7d 2c 20 20 2f 2a 20 cf  0, 0x73 },  /* .
f150: 88 20 74 6f 20 70 73 20 2a 2f 0a 20 20 7b 20 30  . to ps */.  { 0
f160: 78 30 33 43 39 2c 20 20 30 78 36 66 2c 20 30 78  x03C9,  0x6f, 0x
f170: 30 30 20 7d 2c 20 20 2f 2a 20 cf 89 20 74 6f 20  00 },  /* .. to 
f180: 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 41 2c  o */.  { 0x03CA,
f190: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
f1a0: 20 2f 2a 20 cf 8a 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
f1b0: 20 7b 20 30 78 30 33 43 42 2c 20 20 30 78 37 39   { 0x03CB,  0x79
f1c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8b  , 0x00 },  /* ..
f1d0: 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30   to y */.  { 0x0
f1e0: 33 43 43 2c 20 20 30 78 36 66 2c 20 30 78 30 30  3CC,  0x6f, 0x00
f1f0: 20 7d 2c 20 20 2f 2a 20 cf 8c 20 74 6f 20 6f 20   },  /* .. to o 
f200: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 44 2c 20 20  */.  { 0x03CD,  
f210: 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x79, 0x00 },  /
f220: 2a 20 cf 8d 20 74 6f 20 79 20 2a 2f 0a 20 20 7b  * .. to y */.  {
f230: 20 30 78 30 33 43 45 2c 20 20 30 78 36 39 2c 20   0x03CE,  0x69, 
f240: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8e 20 74  0x00 },  /* .. t
f250: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30  o i */.  { 0x040
f260: 30 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  0,  0x45, 0x00 }
f270: 2c 20 20 2f 2a 20 d0 80 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
f280: 0a 20 20 7b 20 30 78 30 34 30 31 2c 20 20 30 78  .  { 0x0401,  0x
f290: 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  45, 0x00 },  /* 
f2a0: d0 81 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
f2b0: 78 30 34 30 32 2c 20 20 30 78 34 34 2c 20 30 78  x0402,  0x44, 0x
f2c0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 82 20 74 6f 20  00 },  /* .. to 
f2d0: 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 33 2c  D */.  { 0x0403,
f2e0: 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c 20    0x47, 0x00 }, 
f2f0: 20 2f 2a 20 d0 83 20 74 6f 20 47 20 2a 2f 0a 20   /* .. to G */. 
f300: 20 7b 20 30 78 30 34 30 34 2c 20 20 30 78 34 35   { 0x0404,  0x45
f310: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 84  , 0x00 },  /* ..
f320: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
f330: 34 30 35 2c 20 20 30 78 35 61 2c 20 30 78 30 30  405,  0x5a, 0x00
f340: 20 7d 2c 20 20 2f 2a 20 d0 85 20 74 6f 20 5a 20   },  /* .. to Z 
f350: 2a 2f 0a 20 20 7b 20 30 78 30 34 30 36 2c 20 20  */.  { 0x0406,  
f360: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
f370: 2a 20 d0 86 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
f380: 20 30 78 30 34 30 37 2c 20 20 30 78 34 39 2c 20   0x0407,  0x49, 
f390: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 87 20 74  0x00 },  /* .. t
f3a0: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30  o I */.  { 0x040
f3b0: 38 2c 20 20 30 78 34 61 2c 20 30 78 30 30 20 7d  8,  0x4a, 0x00 }
f3c0: 2c 20 20 2f 2a 20 d0 88 20 74 6f 20 4a 20 2a 2f  ,  /* .. to J */
f3d0: 0a 20 20 7b 20 30 78 30 34 30 39 2c 20 20 30 78  .  { 0x0409,  0x
f3e0: 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  49, 0x00 },  /* 
f3f0: d0 89 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
f400: 78 30 34 30 41 2c 20 20 30 78 34 65 2c 20 30 78  x040A,  0x4e, 0x
f410: 30 30 20 7d 2c 20 20 2f 2a 20 d0 8a 20 74 6f 20  00 },  /* .. to 
f420: 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 42 2c  N */.  { 0x040B,
f430: 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20    0x44, 0x00 }, 
f440: 20 2f 2a 20 d0 8b 20 74 6f 20 44 20 2a 2f 0a 20   /* .. to D */. 
f450: 20 7b 20 30 78 30 34 30 43 2c 20 20 30 78 34 62   { 0x040C,  0x4b
f460: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8c  , 0x00 },  /* ..
f470: 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30   to K */.  { 0x0
f480: 34 30 44 2c 20 20 30 78 34 39 2c 20 30 78 30 30  40D,  0x49, 0x00
f490: 20 7d 2c 20 20 2f 2a 20 d0 8d 20 74 6f 20 49 20   },  /* .. to I 
f4a0: 2a 2f 0a 20 20 7b 20 30 78 30 34 30 45 2c 20 20  */.  { 0x040E,  
f4b0: 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x55, 0x00 },  /
f4c0: 2a 20 d0 8e 20 74 6f 20 55 20 2a 2f 0a 20 20 7b  * .. to U */.  {
f4d0: 20 30 78 30 34 30 46 2c 20 20 30 78 34 34 2c 20   0x040F,  0x44, 
f4e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8f 20 74  0x00 },  /* .. t
f4f0: 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o D */.  { 0x041
f500: 30 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d  0,  0x41, 0x00 }
f510: 2c 20 20 2f 2a 20 d0 90 20 74 6f 20 41 20 2a 2f  ,  /* .. to A */
f520: 0a 20 20 7b 20 30 78 30 34 31 31 2c 20 20 30 78  .  { 0x0411,  0x
f530: 34 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  42, 0x00 },  /* 
f540: d0 91 20 74 6f 20 42 20 2a 2f 0a 20 20 7b 20 30  .. to B */.  { 0
f550: 78 30 34 31 32 2c 20 20 30 78 35 36 2c 20 30 78  x0412,  0x56, 0x
f560: 30 30 20 7d 2c 20 20 2f 2a 20 d0 92 20 74 6f 20  00 },  /* .. to 
f570: 56 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 33 2c  V */.  { 0x0413,
f580: 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c 20    0x47, 0x00 }, 
f590: 20 2f 2a 20 d0 93 20 74 6f 20 47 20 2a 2f 0a 20   /* .. to G */. 
f5a0: 20 7b 20 30 78 30 34 31 34 2c 20 20 30 78 34 34   { 0x0414,  0x44
f5b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 94  , 0x00 },  /* ..
f5c0: 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30   to D */.  { 0x0
f5d0: 34 31 35 2c 20 20 30 78 34 35 2c 20 30 78 30 30  415,  0x45, 0x00
f5e0: 20 7d 2c 20 20 2f 2a 20 d0 95 20 74 6f 20 45 20   },  /* .. to E 
f5f0: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 36 2c 20 20  */.  { 0x0416,  
f600: 30 78 35 61 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x5a, 0x68 },  /
f610: 2a 20 d0 96 20 74 6f 20 5a 68 20 2a 2f 0a 20 20  * .. to Zh */.  
f620: 7b 20 30 78 30 34 31 37 2c 20 20 30 78 35 61 2c  { 0x0417,  0x5a,
f630: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 97 20   0x00 },  /* .. 
f640: 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to Z */.  { 0x04
f650: 31 38 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  18,  0x49, 0x00 
f660: 7d 2c 20 20 2f 2a 20 d0 98 20 74 6f 20 49 20 2a  },  /* .. to I *
f670: 2f 0a 20 20 7b 20 30 78 30 34 31 39 2c 20 20 30  /.  { 0x0419,  0
f680: 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x49, 0x00 },  /*
f690: 20 d0 99 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20   .. to I */.  { 
f6a0: 30 78 30 34 31 41 2c 20 20 30 78 34 62 2c 20 30  0x041A,  0x4b, 0
f6b0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9a 20 74 6f  x00 },  /* .. to
f6c0: 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 42   K */.  { 0x041B
f6d0: 2c 20 20 30 78 34 63 2c 20 30 78 30 30 20 7d 2c  ,  0x4c, 0x00 },
f6e0: 20 20 2f 2a 20 d0 9b 20 74 6f 20 4c 20 2a 2f 0a    /* .. to L */.
f6f0: 20 20 7b 20 30 78 30 34 31 43 2c 20 20 30 78 34    { 0x041C,  0x4
f700: 64 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  d, 0x00 },  /* .
f710: 9c 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b 20 30 78  . to M */.  { 0x
f720: 30 34 31 44 2c 20 20 30 78 34 65 2c 20 30 78 30  041D,  0x4e, 0x0
f730: 30 20 7d 2c 20 20 2f 2a 20 d0 9d 20 74 6f 20 4e  0 },  /* .. to N
f740: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 45 2c 20   */.  { 0x041E, 
f750: 20 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20   0x4f, 0x00 },  
f760: 2f 2a 20 d0 9e 20 74 6f 20 4f 20 2a 2f 0a 20 20  /* .. to O */.  
f770: 7b 20 30 78 30 34 31 46 2c 20 20 30 78 35 30 2c  { 0x041F,  0x50,
f780: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9f 20   0x00 },  /* .. 
f790: 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to P */.  { 0x04
f7a0: 32 30 2c 20 20 30 78 35 32 2c 20 30 78 30 30 20  20,  0x52, 0x00 
f7b0: 7d 2c 20 20 2f 2a 20 d0 a0 20 74 6f 20 52 20 2a  },  /* .. to R *
f7c0: 2f 0a 20 20 7b 20 30 78 30 34 32 31 2c 20 20 30  /.  { 0x0421,  0
f7d0: 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x53, 0x00 },  /*
f7e0: 20 d0 a1 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20   .. to S */.  { 
f7f0: 30 78 30 34 32 32 2c 20 20 30 78 35 34 2c 20 30  0x0422,  0x54, 0
f800: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a2 20 74 6f  x00 },  /* .. to
f810: 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 33   T */.  { 0x0423
f820: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
f830: 20 20 2f 2a 20 d0 a3 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
f840: 20 20 7b 20 30 78 30 34 32 34 2c 20 20 30 78 34    { 0x0424,  0x4
f850: 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  6, 0x00 },  /* .
f860: a4 20 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78  . to F */.  { 0x
f870: 30 34 32 35 2c 20 20 30 78 34 62 2c 20 30 78 36  0425,  0x4b, 0x6
f880: 38 20 7d 2c 20 20 2f 2a 20 d0 a5 20 74 6f 20 4b  8 },  /* .. to K
f890: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 36 2c  h */.  { 0x0426,
f8a0: 20 20 30 78 35 34 2c 20 30 78 36 33 20 7d 2c 20    0x54, 0x63 }, 
f8b0: 20 2f 2a 20 d0 a6 20 74 6f 20 54 63 20 2a 2f 0a   /* .. to Tc */.
f8c0: 20 20 7b 20 30 78 30 34 32 37 2c 20 20 30 78 34    { 0x0427,  0x4
f8d0: 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0  3, 0x68 },  /* .
f8e0: a7 20 74 6f 20 43 68 20 2a 2f 0a 20 20 7b 20 30  . to Ch */.  { 0
f8f0: 78 30 34 32 38 2c 20 20 30 78 35 33 2c 20 30 78  x0428,  0x53, 0x
f900: 36 38 20 7d 2c 20 20 2f 2a 20 d0 a8 20 74 6f 20  68 },  /* .. to 
f910: 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 39  Sh */.  { 0x0429
f920: 2c 20 20 30 78 35 33 2c 20 30 78 36 38 20 7d 2c  ,  0x53, 0x68 },
f930: 20 20 2f 2a 20 d0 a9 20 74 6f 20 53 68 63 68 20    /* .. to Shch 
f940: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 41 2c 20 20  */.  { 0x042A,  
f950: 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x61, 0x00 },  /
f960: 2a 20 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30  *  to A */.  { 0
f970: 78 30 34 32 42 2c 20 20 30 78 35 39 2c 20 30 78  x042B,  0x59, 0x
f980: 30 30 20 7d 2c 20 20 2f 2a 20 d0 ab 20 74 6f 20  00 },  /* .. to 
f990: 59 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 43 2c  Y */.  { 0x042C,
f9a0: 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20    0x59, 0x00 }, 
f9b0: 20 2f 2a 20 20 74 6f 20 59 20 2a 2f 0a 20 20 7b   /*  to Y */.  {
f9c0: 20 30 78 30 34 32 44 2c 20 20 30 78 34 35 2c 20   0x042D,  0x45, 
f9d0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ad 20 74  0x00 },  /* .. t
f9e0: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32  o E */.  { 0x042
f9f0: 45 2c 20 20 30 78 34 39 2c 20 30 78 37 35 20 7d  E,  0x49, 0x75 }
fa00: 2c 20 20 2f 2a 20 d0 ae 20 74 6f 20 49 75 20 2a  ,  /* .. to Iu *
fa10: 2f 0a 20 20 7b 20 30 78 30 34 32 46 2c 20 20 30  /.  { 0x042F,  0
fa20: 78 34 39 2c 20 30 78 36 31 20 7d 2c 20 20 2f 2a  x49, 0x61 },  /*
fa30: 20 d0 af 20 74 6f 20 49 61 20 2a 2f 0a 20 20 7b   .. to Ia */.  {
fa40: 20 30 78 30 34 33 30 2c 20 20 30 78 36 31 2c 20   0x0430,  0x61, 
fa50: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b0 20 74  0x00 },  /* .. t
fa60: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33  o a */.  { 0x043
fa70: 31 2c 20 20 30 78 36 32 2c 20 30 78 30 30 20 7d  1,  0x62, 0x00 }
fa80: 2c 20 20 2f 2a 20 d0 b1 20 74 6f 20 62 20 2a 2f  ,  /* .. to b */
fa90: 0a 20 20 7b 20 30 78 30 34 33 32 2c 20 20 30 78  .  { 0x0432,  0x
faa0: 37 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  76, 0x00 },  /* 
fab0: d0 b2 20 74 6f 20 76 20 2a 2f 0a 20 20 7b 20 30  .. to v */.  { 0
fac0: 78 30 34 33 33 2c 20 20 30 78 36 37 2c 20 30 78  x0433,  0x67, 0x
fad0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 b3 20 74 6f 20  00 },  /* .. to 
fae0: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 34 2c  g */.  { 0x0434,
faf0: 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20    0x64, 0x00 }, 
fb00: 20 2f 2a 20 d0 b4 20 74 6f 20 64 20 2a 2f 0a 20   /* .. to d */. 
fb10: 20 7b 20 30 78 30 34 33 35 2c 20 20 30 78 36 35   { 0x0435,  0x65
fb20: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b5  , 0x00 },  /* ..
fb30: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
fb40: 34 33 36 2c 20 20 30 78 37 61 2c 20 30 78 36 38  436,  0x7a, 0x68
fb50: 20 7d 2c 20 20 2f 2a 20 d0 b6 20 74 6f 20 7a 68   },  /* .. to zh
fb60: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 37 2c 20   */.  { 0x0437, 
fb70: 20 30 78 37 61 2c 20 30 78 30 30 20 7d 2c 20 20   0x7a, 0x00 },  
fb80: 2f 2a 20 d0 b7 20 74 6f 20 7a 20 2a 2f 0a 20 20  /* .. to z */.  
fb90: 7b 20 30 78 30 34 33 38 2c 20 20 30 78 36 39 2c  { 0x0438,  0x69,
fba0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b8 20   0x00 },  /* .. 
fbb0: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to i */.  { 0x04
fbc0: 33 39 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  39,  0x69, 0x00 
fbd0: 7d 2c 20 20 2f 2a 20 d0 b9 20 74 6f 20 69 20 2a  },  /* .. to i *
fbe0: 2f 0a 20 20 7b 20 30 78 30 34 33 41 2c 20 20 30  /.  { 0x043A,  0
fbf0: 78 36 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6b, 0x00 },  /*
fc00: 20 d0 ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20   .. to k */.  { 
fc10: 30 78 30 34 33 42 2c 20 20 30 78 36 63 2c 20 30  0x043B,  0x6c, 0
fc20: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bb 20 74 6f  x00 },  /* .. to
fc30: 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 43   l */.  { 0x043C
fc40: 2c 20 20 30 78 36 64 2c 20 30 78 30 30 20 7d 2c  ,  0x6d, 0x00 },
fc50: 20 20 2f 2a 20 d0 bc 20 74 6f 20 6d 20 2a 2f 0a    /* .. to m */.
fc60: 20 20 7b 20 30 78 30 34 33 44 2c 20 20 30 78 36    { 0x043D,  0x6
fc70: 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  e, 0x00 },  /* .
fc80: bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78  . to n */.  { 0x
fc90: 30 34 33 45 2c 20 20 30 78 36 66 2c 20 30 78 30  043E,  0x6f, 0x0
fca0: 30 20 7d 2c 20 20 2f 2a 20 d0 be 20 74 6f 20 6f  0 },  /* .. to o
fcb0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 46 2c 20   */.  { 0x043F, 
fcc0: 20 30 78 37 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x70, 0x00 },  
fcd0: 2f 2a 20 d0 bf 20 74 6f 20 70 20 2a 2f 0a 20 20  /* .. to p */.  
fce0: 7b 20 30 78 30 34 34 30 2c 20 20 30 78 37 32 2c  { 0x0440,  0x72,
fcf0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 80 20   0x00 },  /* .. 
fd00: 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to r */.  { 0x04
fd10: 34 31 2c 20 20 30 78 37 33 2c 20 30 78 30 30 20  41,  0x73, 0x00 
fd20: 7d 2c 20 20 2f 2a 20 d1 81 20 74 6f 20 73 20 2a  },  /* .. to s *
fd30: 2f 0a 20 20 7b 20 30 78 30 34 34 32 2c 20 20 30  /.  { 0x0442,  0
fd40: 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x74, 0x00 },  /*
fd50: 20 d1 82 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20   .. to t */.  { 
fd60: 30 78 30 34 34 33 2c 20 20 30 78 37 35 2c 20 30  0x0443,  0x75, 0
fd70: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 83 20 74 6f  x00 },  /* .. to
fd80: 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 34   u */.  { 0x0444
fd90: 2c 20 20 30 78 36 36 2c 20 30 78 30 30 20 7d 2c  ,  0x66, 0x00 },
fda0: 20 20 2f 2a 20 d1 84 20 74 6f 20 66 20 2a 2f 0a    /* .. to f */.
fdb0: 20 20 7b 20 30 78 30 34 34 35 2c 20 20 30 78 36    { 0x0445,  0x6
fdc0: 62 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d1  b, 0x68 },  /* .
fdd0: 85 20 74 6f 20 6b 68 20 2a 2f 0a 20 20 7b 20 30  . to kh */.  { 0
fde0: 78 30 34 34 36 2c 20 20 30 78 37 34 2c 20 30 78  x0446,  0x74, 0x
fdf0: 36 33 20 7d 2c 20 20 2f 2a 20 d1 86 20 74 6f 20  63 },  /* .. to 
fe00: 74 63 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 37  tc */.  { 0x0447
fe10: 2c 20 20 30 78 36 33 2c 20 30 78 36 38 20 7d 2c  ,  0x63, 0x68 },
fe20: 20 20 2f 2a 20 d1 87 20 74 6f 20 63 68 20 2a 2f    /* .. to ch */
fe30: 0a 20 20 7b 20 30 78 30 34 34 38 2c 20 20 30 78  .  { 0x0448,  0x
fe40: 37 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  73, 0x68 },  /* 
fe50: d1 88 20 74 6f 20 73 68 20 2a 2f 0a 20 20 7b 20  .. to sh */.  { 
fe60: 30 78 30 34 34 39 2c 20 20 30 78 37 33 2c 20 30  0x0449,  0x73, 0
fe70: 78 36 38 20 7d 2c 20 20 2f 2a 20 d1 89 20 74 6f  x68 },  /* .. to
fe80: 20 73 68 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30   shch */.  { 0x0
fe90: 34 34 41 2c 20 20 30 78 36 31 2c 20 30 78 30 30  44A,  0x61, 0x00
fea0: 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 61 20 2a 2f   },  /*  to a */
feb0: 0a 20 20 7b 20 30 78 30 34 34 42 2c 20 20 30 78  .  { 0x044B,  0x
fec0: 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  79, 0x00 },  /* 
fed0: d1 8b 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30  .. to y */.  { 0
fee0: 78 30 34 34 43 2c 20 20 30 78 37 39 2c 20 30 78  x044C,  0x79, 0x
fef0: 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 79 20  00 },  /*  to y 
ff00: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 44 2c 20 20  */.  { 0x044D,  
ff10: 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x65, 0x00 },  /
ff20: 2a 20 d1 8d 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
ff30: 20 30 78 30 34 34 45 2c 20 20 30 78 36 39 2c 20   0x044E,  0x69, 
ff40: 30 78 37 35 20 7d 2c 20 20 2f 2a 20 d1 8e 20 74  0x75 },  /* .. t
ff50: 6f 20 69 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34  o iu */.  { 0x04
ff60: 34 46 2c 20 20 30 78 36 39 2c 20 30 78 36 31 20  4F,  0x69, 0x61 
ff70: 7d 2c 20 20 2f 2a 20 d1 8f 20 74 6f 20 69 61 20  },  /* .. to ia 
ff80: 2a 2f 0a 20 20 7b 20 30 78 30 34 35 30 2c 20 20  */.  { 0x0450,  
ff90: 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x65, 0x00 },  /
ffa0: 2a 20 d1 90 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
ffb0: 20 30 78 30 34 35 31 2c 20 20 30 78 36 35 2c 20   0x0451,  0x65, 
ffc0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 91 20 74  0x00 },  /* .. t
ffd0: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35  o e */.  { 0x045
ffe0: 32 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d  2,  0x64, 0x00 }
fff0: 2c 20 20 2f 2a 20 d1 92 20 74 6f 20 64 20 2a 2f  ,  /* .. to d */
10000 0a 20 20 7b 20 30 78 30 34 35 33 2c 20 20 30 78  .  { 0x0453,  0x
10010 36 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  67, 0x00 },  /* 
10020 d1 93 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30  .. to g */.  { 0
10030 78 30 34 35 34 2c 20 20 30 78 36 35 2c 20 30 78  x0454,  0x65, 0x
10040 30 30 20 7d 2c 20 20 2f 2a 20 d1 94 20 74 6f 20  00 },  /* .. to 
10050 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 35 2c  e */.  { 0x0455,
10060 20 20 30 78 37 61 2c 20 30 78 30 30 20 7d 2c 20    0x7a, 0x00 }, 
10070 20 2f 2a 20 d1 95 20 74 6f 20 7a 20 2a 2f 0a 20   /* .. to z */. 
10080 20 7b 20 30 78 30 34 35 36 2c 20 20 30 78 36 39   { 0x0456,  0x69
10090 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 96  , 0x00 },  /* ..
100a0 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
100b0 34 35 37 2c 20 20 30 78 36 39 2c 20 30 78 30 30  457,  0x69, 0x00
100c0 20 7d 2c 20 20 2f 2a 20 d1 97 20 74 6f 20 69 20   },  /* .. to i 
100d0 2a 2f 0a 20 20 7b 20 30 78 30 34 35 38 2c 20 20  */.  { 0x0458,  
100e0 30 78 36 61 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6a, 0x00 },  /
100f0 2a 20 d1 98 20 74 6f 20 6a 20 2a 2f 0a 20 20 7b  * .. to j */.  {
10100 20 30 78 30 34 35 39 2c 20 20 30 78 36 39 2c 20   0x0459,  0x69, 
10110 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 99 20 74  0x00 },  /* .. t
10120 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35  o i */.  { 0x045
10130 41 2c 20 20 30 78 36 65 2c 20 30 78 30 30 20 7d  A,  0x6e, 0x00 }
10140 2c 20 20 2f 2a 20 d1 9a 20 74 6f 20 6e 20 2a 2f  ,  /* .. to n */
10150 0a 20 20 7b 20 30 78 30 34 35 42 2c 20 20 30 78  .  { 0x045B,  0x
10160 36 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  64, 0x00 },  /* 
10170 d1 9b 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30  .. to d */.  { 0
10180 78 30 34 35 43 2c 20 20 30 78 36 62 2c 20 30 78  x045C,  0x6b, 0x
10190 30 30 20 7d 2c 20 20 2f 2a 20 d1 9c 20 74 6f 20  00 },  /* .. to 
101a0 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 44 2c  k */.  { 0x045D,
101b0 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
101c0 20 2f 2a 20 d1 9d 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
101d0 20 7b 20 30 78 30 34 35 45 2c 20 20 30 78 37 35   { 0x045E,  0x75
101e0 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9e  , 0x00 },  /* ..
101f0 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
10200 34 35 46 2c 20 20 30 78 36 34 2c 20 30 78 30 30  45F,  0x64, 0x00
10210 20 7d 2c 20 20 2f 2a 20 d1 9f 20 74 6f 20 64 20   },  /* .. to d 
10220 2a 2f 0a 20 20 7b 20 30 78 31 45 30 32 2c 20 20  */.  { 0x1E02,  
10230 30 78 34 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x42, 0x00 },  /
10240 2a 20 e1 b8 82 20 74 6f 20 42 20 2a 2f 0a 20 20  * ... to B */.  
10250 7b 20 30 78 31 45 30 33 2c 20 20 30 78 36 32 2c  { 0x1E03,  0x62,
10260 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 83   0x00 },  /* ...
10270 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78 31   to b */.  { 0x1
10280 45 30 41 2c 20 20 30 78 34 34 2c 20 30 78 30 30  E0A,  0x44, 0x00
10290 20 7d 2c 20 20 2f 2a 20 e1 b8 8a 20 74 6f 20 44   },  /* ... to D
102a0 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30 42 2c 20   */.  { 0x1E0B, 
102b0 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x64, 0x00 },  
102c0 2f 2a 20 e1 b8 8b 20 74 6f 20 64 20 2a 2f 0a 20  /* ... to d */. 
102d0 20 7b 20 30 78 31 45 31 45 2c 20 20 30 78 34 36   { 0x1E1E,  0x46
102e0 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8  , 0x00 },  /* ..
102f0 9e 20 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78  . to F */.  { 0x
10300 31 45 31 46 2c 20 20 30 78 36 36 2c 20 30 78 30  1E1F,  0x66, 0x0
10310 30 20 7d 2c 20 20 2f 2a 20 e1 b8 9f 20 74 6f 20  0 },  /* ... to 
10320 66 20 2a 2f 0a 20 20 7b 20 30 78 31 45 34 30 2c  f */.  { 0x1E40,
10330 20 20 30 78 34 44 2c 20 30 78 30 30 20 7d 2c 20    0x4D, 0x00 }, 
10340 20 2f 2a 20 e1 b9 80 20 74 6f 20 4d 20 2a 2f 0a   /* ... to M */.
10350 20 20 7b 20 30 78 31 45 34 31 2c 20 20 30 78 36    { 0x1E41,  0x6
10360 44 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  D, 0x00 },  /* .
10370 b9 81 20 74 6f 20 6d 20 2a 2f 0a 20 20 7b 20 30  .. to m */.  { 0
10380 78 31 45 35 36 2c 20 20 30 78 35 30 2c 20 30 78  x1E56,  0x50, 0x
10390 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 96 20 74 6f  00 },  /* ... to
103a0 20 50 20 2a 2f 0a 20 20 7b 20 30 78 31 45 35 37   P */.  { 0x1E57
103b0 2c 20 20 30 78 37 30 2c 20 30 78 30 30 20 7d 2c  ,  0x70, 0x00 },
103c0 20 20 2f 2a 20 e1 b9 97 20 74 6f 20 70 20 2a 2f    /* ... to p */
103d0 0a 20 20 7b 20 30 78 31 45 36 30 2c 20 20 30 78  .  { 0x1E60,  0x
103e0 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  53, 0x00 },  /* 
103f0 e1 b9 a0 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20  ... to S */.  { 
10400 30 78 31 45 36 31 2c 20 20 30 78 37 33 2c 20 30  0x1E61,  0x73, 0
10410 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 a1 20 74  x00 },  /* ... t
10420 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36  o s */.  { 0x1E6
10430 41 2c 20 20 30 78 35 34 2c 20 30 78 30 30 20 7d  A,  0x54, 0x00 }
10440 2c 20 20 2f 2a 20 e1 b9 aa 20 74 6f 20 54 20 2a  ,  /* ... to T *
10450 2f 0a 20 20 7b 20 30 78 31 45 36 42 2c 20 20 30  /.  { 0x1E6B,  0
10460 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x74, 0x00 },  /*
10470 20 e1 b9 ab 20 74 6f 20 74 20 2a 2f 0a 20 20 7b   ... to t */.  {
10480 20 30 78 31 45 38 30 2c 20 20 30 78 35 37 2c 20   0x1E80,  0x57, 
10490 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 80 20  0x00 },  /* ... 
104a0 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to W */.  { 0x1E
104b0 38 31 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20  81,  0x77, 0x00 
104c0 7d 2c 20 20 2f 2a 20 e1 ba 81 20 74 6f 20 77 20  },  /* ... to w 
104d0 2a 2f 0a 20 20 7b 20 30 78 31 45 38 32 2c 20 20  */.  { 0x1E82,  
104e0 30 78 35 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x57, 0x00 },  /
104f0 2a 20 e1 ba 82 20 74 6f 20 57 20 2a 2f 0a 20 20  * ... to W */.  
10500 7b 20 30 78 31 45 38 33 2c 20 20 30 78 37 37 2c  { 0x1E83,  0x77,
10510 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 83   0x00 },  /* ...
10520 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31   to w */.  { 0x1
10530 45 38 34 2c 20 20 30 78 35 37 2c 20 30 78 30 30  E84,  0x57, 0x00
10540 20 7d 2c 20 20 2f 2a 20 e1 ba 84 20 74 6f 20 57   },  /* ... to W
10550 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 35 2c 20   */.  { 0x1E85, 
10560 20 30 78 37 37 2c 20 30 78 30 30 20 7d 2c 20 20   0x77, 0x00 },  
10570 2f 2a 20 e1 ba 85 20 74 6f 20 77 20 2a 2f 0a 20  /* ... to w */. 
10580 20 7b 20 30 78 31 45 46 32 2c 20 20 30 78 35 39   { 0x1EF2,  0x59
10590 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 bb  , 0x00 },  /* ..
105a0 b2 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78  . to Y */.  { 0x
105b0 31 45 46 33 2c 20 20 30 78 37 39 2c 20 30 78 30  1EF3,  0x79, 0x0
105c0 30 20 7d 2c 20 20 2f 2a 20 e1 bb b3 20 74 6f 20  0 },  /* ... to 
105d0 79 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 30 2c  y */.  { 0xFB00,
105e0 20 20 30 78 36 36 2c 20 30 78 36 36 20 7d 2c 20    0x66, 0x66 }, 
105f0 20 2f 2a 20 ef ac 80 20 74 6f 20 66 66 20 2a 2f   /* ... to ff */
10600 0a 20 20 7b 20 30 78 46 42 30 31 2c 20 20 30 78  .  { 0xFB01,  0x
10610 36 36 2c 20 30 78 36 39 20 7d 2c 20 20 2f 2a 20  66, 0x69 },  /* 
10620 ef ac 81 20 74 6f 20 66 69 20 2a 2f 0a 20 20 7b  ... to fi */.  {
10630 20 30 78 46 42 30 32 2c 20 20 30 78 36 36 2c 20   0xFB02,  0x66, 
10640 30 78 36 43 20 7d 2c 20 20 2f 2a 20 ef ac 82 20  0x6C },  /* ... 
10650 74 6f 20 66 6c 20 2a 2f 0a 20 20 7b 20 30 78 46  to fl */.  { 0xF
10660 42 30 35 2c 20 20 30 78 37 33 2c 20 30 78 37 34  B05,  0x73, 0x74
10670 20 7d 2c 20 20 2f 2a 20 ef ac 85 20 74 6f 20 73   },  /* ... to s
10680 74 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 36 2c  t */.  { 0xFB06,
10690 20 20 30 78 37 33 2c 20 30 78 37 34 20 7d 2c 20    0x73, 0x74 }, 
106a0 20 2f 2a 20 ef ac 86 20 74 6f 20 73 74 20 2a 2f   /* ... to st */
106b0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
106c0 72 74 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  rt the input str
106d0 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38 20 69  ing from UTF-8 i
106e0 6e 74 6f 20 70 75 72 65 20 41 53 43 49 49 20 62  nto pure ASCII b
106f0 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 2a 2a 20  y converting.** 
10700 61 6c 6c 20 6e 6f 6e 2d 41 53 43 49 49 20 63 68  all non-ASCII ch
10710 61 72 61 63 74 65 72 73 20 74 6f 20 73 6f 6d 65  aracters to some
10720 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
10730 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
10740 65 0a 2a 2a 20 41 53 43 49 49 20 73 75 62 73 65  e.** ASCII subse
10750 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
10760 75 72 6e 65 64 20 73 74 72 69 6e 67 20 6d 69 67  urned string mig
10770 68 74 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20  ht contain more 
10780 63 68 61 72 61 63 74 65 72 73 20 74 68 61 6e 20  characters than 
10790 74 68 65 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a  the input..**.**
107a0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
107b0 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
107c0 6e 67 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 71  ng comes from sq
107d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
107e0 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  nd.** should be 
107f0 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
10800 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ler..*/.static u
10810 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 72  nsigned char *tr
10820 61 6e 73 6c 69 74 65 72 61 74 65 28 63 6f 6e 73  ansliterate(cons
10830 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
10840 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a  *zIn, int nIn){.
10850 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
10860 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f  *zOut = sqlite3_
10870 6d 61 6c 6c 6f 63 28 20 6e 49 6e 2a 34 20 2b 20  malloc( nIn*4 + 
10880 31 20 29 3b 0a 20 20 69 6e 74 20 69 2c 20 63 2c  1 );.  int i, c,
10890 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69 66 28   sz, nOut;.  if(
108a0 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72   zOut==0 ) retur
108b0 6e 20 30 3b 0a 20 20 69 20 3d 20 6e 4f 75 74 20  n 0;.  i = nOut 
108c0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c  = 0;.  while( i<
108d0 6e 49 6e 20 29 7b 0a 20 20 20 20 63 20 3d 20 75  nIn ){.    c = u
108e0 74 66 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e  tf8Read(zIn, nIn
108f0 2c 20 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20  , &sz);.    zIn 
10900 2b 3d 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d  += sz;.    nIn -
10910 3d 20 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c  = sz;.    if( c<
10920 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 7a 4f  =127 ){.      zO
10930 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a  ut[nOut++] = c;.
10940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10950 20 69 6e 74 20 78 54 6f 70 2c 20 78 42 74 6d 2c   int xTop, xBtm,
10960 20 78 3b 0a 20 20 20 20 20 20 78 54 6f 70 20 3d   x;.      xTop =
10970 20 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74   sizeof(translit
10980 29 2f 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69  )/sizeof(transli
10990 74 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20  t[0]) - 1;.     
109a0 20 78 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 20   xBtm = 0;.     
109b0 20 77 68 69 6c 65 28 20 78 54 6f 70 3e 3d 78 42   while( xTop>=xB
109c0 74 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  tm ){.        x 
109d0 3d 20 28 78 54 6f 70 20 2b 20 78 42 74 6d 29 2f  = (xTop + xBtm)/
109e0 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  2;.        if( t
109f0 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d  ranslit[x].cFrom
10a00 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==c ){.         
10a10 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20   zOut[nOut++] = 
10a20 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 30  translit[x].cTo0
10a30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10a40 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31  translit[x].cTo1
10a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10a60 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74  zOut[nOut++] = t
10a70 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 3b  ranslit[x].cTo1;
10a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
10a90 41 64 64 20 61 6e 20 65 78 74 72 61 20 22 63 68  Add an extra "ch
10aa0 22 20 61 66 74 65 72 20 74 68 65 20 22 73 68 22  " after the "sh"
10ab0 20 66 6f 72 20 d0 a9 20 61 6e 64 20 d1 89 20 2a   for .. and .. *
10ac0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
10ad0 28 20 63 3d 3d 30 78 30 34 32 39 20 7c 7c 20 63  ( c==0x0429 || c
10ae0 3d 3d 20 30 78 30 34 34 39 20 29 7b 0a 20 20 20  == 0x0449 ){.   
10af0 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b             zOut[
10b00 6e 4f 75 74 2b 2b 5d 20 3d 20 27 63 27 3b 0a 20  nOut++] = 'c';. 
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75               zOu
10b20 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 27 68 27 3b  t[nOut++] = 'h';
10b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
10b40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10b50 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
10b60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10b70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74       }else if( t
10b80 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d  ranslit[x].cFrom
10b90 3e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >c ){.          
10ba0 78 54 6f 70 20 3d 20 78 2d 31 3b 0a 20 20 20 20  xTop = x-1;.    
10bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10bc0 20 20 20 20 20 78 42 74 6d 20 3d 20 78 2b 31 3b       xBtm = x+1;
10bd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10be0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29   }.      if( c )
10bf0 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20   zOut[nOut++] = 
10c00 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  '?';.    }.  }. 
10c10 20 7a 4f 75 74 5b 6e 4f 75 74 5d 20 3d 20 30 3b   zOut[nOut] = 0;
10c20 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a  .  return zOut;.
10c30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10c40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
10c50 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
10c60 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20  shortest prefix 
10c70 6f 66 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20  of the input.** 
10c80 73 74 72 69 6e 67 20 74 68 61 74 20 74 72 61 6e  string that tran
10c90 73 6c 69 74 65 72 61 74 65 73 20 74 6f 20 61 6e  sliterates to an
10ca0 20 41 53 43 49 49 20 73 74 72 69 6e 67 20 6e 54   ASCII string nT
10cb0 72 61 6e 73 20 62 79 74 65 73 20 6f 72 20 6c 6f  rans bytes or lo
10cc0 6e 67 65 72 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  nger..** Or, if 
10cd0 74 68 65 20 74 72 61 6e 73 6c 69 74 65 72 61 74  the transliterat
10ce0 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ion of the input
10cf0 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 20   string is less 
10d00 74 68 61 6e 20 6e 54 72 61 6e 73 0a 2a 2a 20 62  than nTrans.** b
10d10 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 72 65  ytes in size, re
10d20 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
10d30 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
10d40 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
10d50 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
10d60 20 74 72 61 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61   translen_to_cha
10d70 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  rlen(const char 
10d80 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 2c 20 69  *zIn, int nIn, i
10d90 6e 74 20 6e 54 72 61 6e 73 29 7b 0a 20 20 69 6e  nt nTrans){.  in
10da0 74 20 69 2c 20 63 2c 20 73 7a 2c 20 6e 4f 75 74  t i, c, sz, nOut
10db0 3b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 0a  ;.  int nChar;..
10dc0 20 20 69 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a    i = nOut = 0;.
10dd0 20 20 66 6f 72 28 6e 43 68 61 72 3d 30 3b 20 69    for(nChar=0; i
10de0 3c 6e 49 6e 20 26 26 20 6e 4f 75 74 3c 6e 54 72  <nIn && nOut<nTr
10df0 61 6e 73 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20  ans; nChar++){. 
10e00 20 20 20 63 20 3d 20 75 74 66 38 52 65 61 64 28     c = utf8Read(
10e10 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
10e20 63 68 61 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20  char *)&zIn[i], 
10e30 6e 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20  nIn-i, &sz);.   
10e40 20 69 20 2b 3d 20 73 7a 3b 0a 0a 20 20 20 20 6e   i += sz;..    n
10e50 4f 75 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63  Out++;.    if( c
10e60 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 20 20 69  >=128 ){.      i
10e70 6e 74 20 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78  nt xTop, xBtm, x
10e80 3b 0a 20 20 20 20 20 20 78 54 6f 70 20 3d 20 73  ;.      xTop = s
10e90 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f  izeof(translit)/
10ea0 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b  sizeof(translit[
10eb0 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 78  0]) - 1;.      x
10ec0 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  Btm = 0;.      w
10ed0 68 69 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d  hile( xTop>=xBtm
10ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20   ){.        x = 
10ef0 28 78 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b  (xTop + xBtm)/2;
10f00 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61  .        if( tra
10f10 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d  nslit[x].cFrom==
10f20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  c ){.          i
10f30 66 28 20 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63  f( translit[x].c
10f40 54 6f 31 20 29 20 6e 4f 75 74 2b 2b 3b 0a 20 20  To1 ) nOut++;.  
10f50 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
10f60 78 30 34 32 39 20 7c 7c 20 63 3d 3d 20 30 78 30  x0429 || c== 0x0
10f70 34 34 39 20 29 20 6e 4f 75 74 20 2b 3d 20 32 3b  449 ) nOut += 2;
10f80 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10f90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10fa0 69 66 28 20 74 72 61 6e 73 6c 69 74 5b 78 5d 2e  if( translit[x].
10fb0 63 46 72 6f 6d 3e 63 20 29 7b 0a 20 20 20 20 20  cFrom>c ){.     
10fc0 20 20 20 20 20 78 54 6f 70 20 3d 20 78 2d 31 3b       xTop = x-1;
10fd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10fe0 20 20 20 20 20 20 20 20 20 20 78 42 74 6d 20 3d            xBtm =
10ff0 20 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   x+1;.        }.
11000 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11010 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61  }..  return nCha
11020 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  r;.}.../*.**    
11030 73 70 65 6c 6c 66 69 78 31 5f 74 72 61 6e 73 6c  spellfix1_transl
11040 69 74 28 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76  it(X).**.** Conv
11050 65 72 74 20 61 20 73 74 72 69 6e 67 20 74 68 61  ert a string tha
11060 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 41  t contains non-A
11070 53 43 49 49 20 52 6f 6d 61 6e 20 63 68 61 72 61  SCII Roman chara
11080 63 74 65 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 70  cters into .** p
11090 75 72 65 20 41 53 43 49 49 2e 0a 2a 2f 0a 73 74  ure ASCII..*/.st
110a0 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
110b0 69 74 65 72 61 74 65 53 71 6c 46 75 6e 63 28 0a  iterateSqlFunc(.
110c0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
110d0 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
110e0 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
110f0 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
11100 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
11110 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 73  ed char *zIn = s
11120 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11130 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  t(argv[0]);.  in
11140 74 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f  t nIn = sqlite3_
11150 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
11160 5b 30 5d 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64  [0]);.  unsigned
11170 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 74 72   char *zOut = tr
11180 61 6e 73 6c 69 74 65 72 61 74 65 28 7a 49 6e 2c  ansliterate(zIn,
11190 20 6e 49 6e 29 3b 0a 20 20 69 66 28 20 7a 4f 75   nIn);.  if( zOu
111a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
111b0 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
111c0 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
111d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
111e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
111f0 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
11200 2a 29 7a 4f 75 74 2c 20 2d 31 2c 20 73 71 6c 69  *)zOut, -1, sqli
11210 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d  te3_free);.  }.}
11220 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70 65 6c 6c  ../*.**    spell
11230 66 69 78 31 5f 73 63 72 69 70 74 63 6f 64 65 28  fix1_scriptcode(
11240 58 29 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  X).**.** Try to 
11250 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 6f  determine the do
11260 6d 69 6e 61 6e 74 20 73 63 72 69 70 74 20 75 73  minant script us
11270 65 64 20 62 79 20 74 68 65 20 77 6f 72 64 20 58  ed by the word X
11280 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 69   and return.** i
11290 74 73 20 49 53 4f 20 31 35 39 32 34 20 6e 75 6d  ts ISO 15924 num
112a0 65 72 69 63 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  eric code..**.**
112b0 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
112c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 6c 79  lementation only
112d0 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68 65   understands the
112e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 72 69 70   following scrip
112f0 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 32 31 35  ts:.**.**    215
11300 20 20 28 4c 61 74 69 6e 29 0a 2a 2a 20 20 20 20    (Latin).**    
11310 32 32 30 20 20 28 43 79 72 69 6c 6c 69 63 29 0a  220  (Cyrillic).
11320 2a 2a 20 20 20 20 32 30 30 20 20 28 47 72 65 65  **    200  (Gree
11330 6b 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k).**.** This ro
11340 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
11350 6e 20 39 39 38 20 69 66 20 74 68 65 20 69 6e 70  n 998 if the inp
11360 75 74 20 58 20 63 6f 6e 74 61 69 6e 73 20 63 68  ut X contains ch
11370 61 72 61 63 74 65 72 73 20 66 72 6f 6d 0a 2a 2a  aracters from.**
11380 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20   two or more of 
11390 74 68 65 20 61 62 6f 76 65 20 73 63 72 69 70 74  the above script
113a0 73 20 6f 72 20 39 39 39 20 69 66 20 58 20 63 6f  s or 999 if X co
113b0 6e 74 61 69 6e 73 20 6e 6f 20 63 68 61 72 61 63  ntains no charac
113c0 74 65 72 73 0a 2a 2a 20 66 72 6f 6d 20 61 6e 79  ters.** from any
113d0 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 73 63   of the above sc
113e0 72 69 70 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ripts..*/.static
113f0 20 76 6f 69 64 20 73 63 72 69 70 74 43 6f 64 65   void scriptCode
11400 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  SqlFunc(.  sqlit
11410 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
11420 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
11430 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
11440 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
11450 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
11460 20 2a 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f   *zIn = sqlite3_
11470 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
11480 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d  0]);.  int nIn =
11490 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
114a0 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
114b0 20 69 6e 74 20 63 2c 20 73 7a 3b 0a 20 20 69 6e   int c, sz;.  in
114c0 74 20 73 63 72 69 70 74 4d 61 73 6b 20 3d 20 30  t scriptMask = 0
114d0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 23 20 64  ;.  int res;.# d
114e0 65 66 69 6e 65 20 53 43 52 49 50 54 5f 4c 41 54  efine SCRIPT_LAT
114f0 49 4e 20 20 20 20 20 20 20 30 78 30 30 30 31 0a  IN       0x0001.
11500 23 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f  # define SCRIPT_
11510 43 59 52 49 4c 4c 49 43 20 20 20 20 30 78 30 30  CYRILLIC    0x00
11520 30 32 0a 23 20 64 65 66 69 6e 65 20 53 43 52 49  02.# define SCRI
11530 50 54 5f 47 52 45 45 4b 20 20 20 20 20 20 20 30  PT_GREEK       0
11540 78 30 30 30 34 0a 0a 20 20 77 68 69 6c 65 28 20  x0004..  while( 
11550 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 63 20 3d  nIn>0 ){.    c =
11560 20 75 74 66 38 52 65 61 64 28 7a 49 6e 2c 20 6e   utf8Read(zIn, n
11570 49 6e 2c 20 26 73 7a 29 3b 0a 20 20 20 20 7a 49  In, &sz);.    zI
11580 6e 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 6e 49 6e  n += sz;.    nIn
11590 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 69 66 28 20   -= sz;.    if( 
115a0 63 3c 30 78 30 32 61 66 20 29 7b 0a 20 20 20 20  c<0x02af ){.    
115b0 20 20 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20    scriptMask |= 
115c0 53 43 52 49 50 54 5f 4c 41 54 49 4e 3b 0a 20 20  SCRIPT_LATIN;.  
115d0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 30    }else if( c>=0
115e0 78 30 34 30 30 20 26 26 20 63 3c 3d 30 78 30 34  x0400 && c<=0x04
115f0 66 66 20 29 7b 0a 20 20 20 20 20 20 73 63 72 69  ff ){.      scri
11600 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52 49 50 54  ptMask |= SCRIPT
11610 5f 43 59 52 49 4c 4c 49 43 3b 0a 20 20 20 20 7d  _CYRILLIC;.    }
11620 65 6c 73 65 20 69 66 28 20 63 3e 3d 30 78 30 33  else if( c>=0x03
11630 38 36 20 26 26 20 63 3c 3d 30 78 30 33 63 65 20  86 && c<=0x03ce 
11640 29 7b 0a 20 20 20 20 20 20 73 63 72 69 70 74 4d  ){.      scriptM
11650 61 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 47 52  ask |= SCRIPT_GR
11660 45 45 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EEK;.    }.  }. 
11670 20 73 77 69 74 63 68 28 20 73 63 72 69 70 74 4d   switch( scriptM
11680 61 73 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ask ){.    case 
11690 30 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0:              
116a0 20 20 72 65 73 20 3d 20 39 39 39 3b 20 62 72 65    res = 999; bre
116b0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 43 52  ak;.    case SCR
116c0 49 50 54 5f 4c 41 54 49 4e 3a 20 20 20 20 20 72  IPT_LATIN:     r
116d0 65 73 20 3d 20 32 31 35 3b 20 62 72 65 61 6b 3b  es = 215; break;
116e0 0a 20 20 20 20 63 61 73 65 20 53 43 52 49 50 54  .    case SCRIPT
116f0 5f 43 59 52 49 4c 4c 49 43 3a 20 20 72 65 73 20  _CYRILLIC:  res 
11700 3d 20 32 32 30 3b 20 62 72 65 61 6b 3b 0a 20 20  = 220; break;.  
11710 20 20 63 61 73 65 20 53 43 52 49 50 54 5f 47 52    case SCRIPT_GR
11720 45 45 4b 3a 20 20 20 20 20 72 65 73 20 3d 20 32  EEK:     res = 2
11730 30 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  00; break;.    d
11740 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
11750 20 20 20 20 20 20 72 65 73 20 3d 20 39 39 38 3b        res = 998;
11760 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71   break;.  }.  sq
11770 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
11780 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b 0a  (context, res);.
11790 7d 0a 0a 2f 2a 20 45 6e 64 20 74 72 61 6e 73 6c  }../* End transl
117a0 69 74 65 72 61 74 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  iterate.********
117b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
11800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11840 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 50  *****.** Begin P
11850 6f 6c 6c 6f 63 20 26 20 5a 61 6d 6f 72 61 20 53  olloc & Zamora S
11860 50 45 45 44 43 4f 50 20 73 74 79 6c 65 20 6b 65  PEEDCOP style ke
11870 79 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ying functions..
11880 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 6f 6c  */./*.** The Pol
11890 6c 6f 63 6b 20 26 20 5a 61 6d 6f 72 61 20 73 6b  lock & Zamora sk
118a0 65 6c 65 74 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  eleton function.
118b0 20 20 4d 6f 76 65 20 61 6c 6c 20 63 6f 6e 73 6f    Move all conso
118c0 6e 61 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  nants to the.** 
118d0 66 72 6f 6e 74 20 61 6e 64 20 61 6c 6c 20 76 6f  front and all vo
118e0 77 65 6c 73 20 74 6f 20 74 68 65 20 65 6e 64 2c  wels to the end,
118f0 20 72 65 6d 6f 76 69 6e 67 20 64 75 70 6c 69 63   removing duplic
11900 61 74 65 73 2e 20 20 45 78 63 65 70 74 20 69 66  ates.  Except if
11910 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6c 65   the.** first le
11920 74 74 65 72 20 69 73 20 61 20 76 6f 77 65 6c 20  tter is a vowel 
11930 74 68 65 6e 20 69 74 20 72 65 6d 61 69 6e 73 20  then it remains 
11940 61 73 20 74 68 65 20 66 69 72 73 74 20 6c 65 74  as the first let
11950 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
11960 6f 69 64 20 70 6f 6c 6c 6f 63 6b 53 6b 65 6c 65  oid pollockSkele
11970 74 6f 6e 4b 65 79 28 63 6f 6e 73 74 20 63 68 61  tonKey(const cha
11980 72 20 2a 7a 49 6e 2c 20 63 68 61 72 20 2a 7a 4f  r *zIn, char *zO
11990 75 74 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ut){.  int i, j;
119a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
119b0 20 63 3b 0a 20 20 63 68 61 72 20 73 65 65 6e 5b   c;.  char seen[
119c0 32 36 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  26];.  static co
119d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
119e0 72 20 69 73 56 6f 77 65 6c 5b 5d 20 3d 20 7b 20  r isVowel[] = { 
119f0 31 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 30  1, 0, 0, 0, 1, 0
11a00 2c 20 30 2c 20 30 2c 20 31 2c 20 30 2c 20 30 2c  , 0, 0, 1, 0, 0,
11a10 0a 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 31 2c  .    0, 0, 0, 1,
11a20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
11a30 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  1, 0, 0, 0, 0, 0
11a40 20 7d 3b 0a 20 20 6d 65 6d 73 65 74 28 73 65 65   };.  memset(see
11a50 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 65 65  n, 0, sizeof(see
11a60 6e 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  n));.  for(i=j=0
11a70 3b 20 28 63 20 3d 20 28 75 6e 73 69 67 6e 65 64  ; (c = (unsigned
11a80 20 63 68 61 72 29 7a 49 6e 5b 69 5d 29 21 3d 30   char)zIn[i])!=0
11a90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11aa0 63 3c 27 61 27 20 7c 7c 20 63 3e 27 7a 27 20 29  c<'a' || c>'z' )
11ab0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
11ac0 66 28 20 6a 3e 30 20 7c 7c 20 69 73 56 6f 77 65  f( j>0 || isVowe
11ad0 6c 5b 63 2d 27 61 27 5d 20 29 20 63 6f 6e 74 69  l[c-'a'] ) conti
11ae0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 65 65  nue;.    if( see
11af0 6e 5b 63 2d 27 61 27 5d 20 29 20 63 6f 6e 74 69  n[c-'a'] ) conti
11b00 6e 75 65 3b 0a 20 20 20 20 73 65 65 6e 5b 63 2d  nue;.    seen[c-
11b10 27 61 27 5d 20 3d 20 31 3b 0a 20 20 20 20 7a 4f  'a'] = 1;.    zO
11b20 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d  ut[j++] = c;.  }
11b30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
11b40 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
11b50 7a 49 6e 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  zIn[i])!=0; i++)
11b60 7b 0a 20 20 20 20 69 66 28 20 63 3c 27 61 27 20  {.    if( c<'a' 
11b70 7c 7c 20 63 3e 27 7a 27 20 29 20 63 6f 6e 74 69  || c>'z' ) conti
11b80 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 65 65  nue;.    if( see
11b90 6e 5b 63 2d 27 61 27 5d 20 29 20 63 6f 6e 74 69  n[c-'a'] ) conti
11ba0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 69 73  nue;.    if( !is
11bb0 56 6f 77 65 6c 5b 63 2d 27 61 27 5d 20 29 20 63  Vowel[c-'a'] ) c
11bc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 65 65  ontinue;.    see
11bd0 6e 5b 63 2d 27 61 27 5d 20 3d 20 31 3b 0a 20 20  n[c-'a'] = 1;.  
11be0 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b    zOut[j++] = c;
11bf0 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6a 5d 20 3d  .  }.  zOut[j] =
11c00 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e   0;.}../*.** Fun
11c10 63 74 69 6f 6e 3a 20 20 20 20 70 6f 6c 6c 6f 63  ction:    polloc
11c20 6b 5f 73 6b 65 6c 65 74 6f 6e 28 58 29 0a 2a 2a  k_skeleton(X).**
11c30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
11c40 6f 6c 6c 6f 63 6b 20 61 6e 64 20 5a 61 6d 6f 72  ollock and Zamor
11c50 61 20 73 6b 65 6c 65 74 6f 6e 20 6b 65 79 20 66  a skeleton key f
11c60 6f 72 20 61 20 73 74 72 69 6e 67 20 58 20 6f 66  or a string X of
11c70 20 61 6c 6c 0a 2a 2a 20 6c 6f 77 65 72 2d 63 61   all.** lower-ca
11c80 73 65 20 6c 65 74 74 65 72 73 2e 0a 2a 2f 0a 73  se letters..*/.s
11c90 74 61 74 69 63 20 76 6f 69 64 20 70 6f 6c 6c 6f  tatic void pollo
11ca0 63 6b 53 6b 65 6c 65 74 6f 6e 53 71 6c 46 75 6e  ckSkeletonSqlFun
11cb0 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
11cc0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
11cd0 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
11ce0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
11cf0 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  v.){.  const cha
11d00 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20  r *zIn = (const 
11d10 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
11d20 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
11d30 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 73  );.  int nIn = s
11d40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
11d50 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63  es(argv[0]);.  c
11d60 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 69 66 28  har *zOut;.  if(
11d70 20 7a 49 6e 20 29 7b 0a 20 20 20 20 7a 4f 75 74   zIn ){.    zOut
11d80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
11d90 63 28 20 6e 49 6e 20 2b 20 31 20 29 3b 0a 20 20  c( nIn + 1 );.  
11da0 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b    if( zOut==0 ){
11db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
11dc0 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
11dd0 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
11de0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 6f 6c  }else{.      pol
11df0 6c 6f 63 6b 53 6b 65 6c 65 74 6f 6e 4b 65 79 28  lockSkeletonKey(
11e00 7a 49 6e 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  zIn, zOut);.    
11e10 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
11e20 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
11e30 63 68 61 72 2a 29 7a 4f 75 74 2c 20 2d 31 2c 20  char*)zOut, -1, 
11e40 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
11e50 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 0a 0a 2f 2a     }.  }.}  ../*
11e60 0a 2a 2a 20 54 68 65 20 50 6f 6c 6c 6f 63 6b 20  .** The Pollock 
11e70 26 20 5a 61 6d 6f 72 61 20 6f 6d 69 73 73 69 6f  & Zamora omissio
11e80 6e 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  n key..**.** The
11e90 20 6b 65 79 20 63 6f 6e 73 69 73 74 73 20 6f 66   key consists of
11ea0 20 75 6e 69 71 75 65 20 63 6f 6e 73 6f 6e 61 6e   unique consonan
11eb0 74 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ts in the follow
11ec0 69 6e 67 20 6f 72 64 65 72 3a 0a 2a 2a 0a 2a 2a  ing order:.**.**
11ed0 20 20 20 20 20 20 20 20 20 6a 6b 71 78 7a 76 77           jkqxzvw
11ee0 79 62 66 6d 67 70 64 68 63 6c 6e 74 73 72 0a 2a  ybfmgpdhclntsr.*
11ef0 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 66  *.** These are f
11f00 6f 6c 6c 6f 77 65 64 20 62 79 20 75 6e 69 71 75  ollowed by uniqu
11f10 65 20 76 6f 77 65 6c 73 20 69 6e 20 69 6e 70 75  e vowels in inpu
11f20 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  t order..*/.stat
11f30 69 63 20 76 6f 69 64 20 70 6f 6c 6c 6f 63 6b 4f  ic void pollockO
11f40 6d 69 73 73 69 6f 6e 4b 65 79 28 63 6f 6e 73 74  missionKey(const
11f50 20 63 68 61 72 20 2a 7a 49 6e 2c 20 63 68 61 72   char *zIn, char
11f60 20 2a 7a 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69   *zOut){.  int i
11f70 2c 20 6a 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  , j;.  unsigned 
11f80 63 68 61 72 20 63 3b 0a 20 20 63 68 61 72 20 73  char c;.  char s
11f90 65 65 6e 5b 32 36 5d 3b 0a 20 20 73 74 61 74 69  een[26];.  stati
11fa0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
11fb0 20 63 68 61 72 20 69 73 56 6f 77 65 6c 5b 5d 20   char isVowel[] 
11fc0 3d 20 7b 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20  = { 1, 0, 0, 0, 
11fd0 31 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 30  1, 0, 0, 0, 1, 0
11fe0 2c 20 30 2c 0a 20 20 20 20 30 2c 20 30 2c 20 30  , 0,.    0, 0, 0
11ff0 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 0, 0, 0, 0,
12000 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 1, 0, 0, 0, 
12010 30 2c 20 30 20 7d 3b 0a 20 20 73 74 61 74 69 63  0, 0 };.  static
12020 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
12030 63 68 61 72 20 63 6f 6e 73 74 4f 72 64 65 72 5b  char constOrder[
12040 5d 20 3d 20 22 6a 6b 71 78 7a 76 77 79 62 66 6d  ] = "jkqxzvwybfm
12050 67 70 64 68 63 6c 6e 74 73 72 22 3b 0a 0a 20 20  gpdhclntsr";..  
12060 6d 65 6d 73 65 74 28 73 65 65 6e 2c 20 30 2c 20  memset(seen, 0, 
12070 73 69 7a 65 6f 66 28 73 65 65 6e 29 29 3b 0a 20  sizeof(seen));. 
12080 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
12090 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
120a0 7a 49 6e 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  zIn[i])!=0; i++)
120b0 7b 0a 20 20 20 20 69 66 28 20 63 3c 27 61 27 20  {.    if( c<'a' 
120c0 7c 7c 20 63 3e 27 7a 27 20 29 20 63 6f 6e 74 69  || c>'z' ) conti
120d0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 69 73 56  nue;.    if( isV
120e0 6f 77 65 6c 5b 63 2d 27 61 27 5d 20 29 20 63 6f  owel[c-'a'] ) co
120f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
12100 73 65 65 6e 5b 63 2d 27 61 27 5d 20 29 20 63 6f  seen[c-'a'] ) co
12110 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 65 65 6e  ntinue;.    seen
12120 5b 63 2d 27 61 27 5d 20 3d 20 31 3b 0a 20 20 7d  [c-'a'] = 1;.  }
12130 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
12140 20 63 6f 6e 73 74 4f 72 64 65 72 5b 69 5d 29 21   constOrder[i])!
12150 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  =0; i++){.    if
12160 28 20 73 65 65 6e 5b 63 2d 27 61 27 5d 20 29 20  ( seen[c-'a'] ) 
12170 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  zOut[j++] = c;. 
12180 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63   }.  for(i=0; (c
12190 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
121a0 72 29 7a 49 6e 5b 69 5d 29 21 3d 30 3b 20 69 2b  r)zIn[i])!=0; i+
121b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3c 27 61  +){.    if( c<'a
121c0 27 20 7c 7c 20 63 3e 27 7a 27 20 29 20 63 6f 6e  ' || c>'z' ) con
121d0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
121e0 65 65 6e 5b 63 2d 27 61 27 5d 20 29 20 63 6f 6e  een[c-'a'] ) con
121f0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
12200 69 73 56 6f 77 65 6c 5b 63 2d 27 61 27 5d 20 29  isVowel[c-'a'] )
12210 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
12220 65 65 6e 5b 63 2d 27 61 27 5d 20 3d 20 31 3b 0a  een[c-'a'] = 1;.
12230 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
12240 63 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6a 5d  c;.  }.  zOut[j]
12250 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
12260 75 6e 63 74 69 6f 6e 3a 20 20 20 20 70 6f 6c 6c  unction:    poll
12270 6f 63 6b 5f 6f 6d 69 73 73 69 6f 6e 28 58 29 0a  ock_omission(X).
12280 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
12290 20 50 6f 6c 6c 6f 63 6b 20 61 6e 64 20 5a 61 6d   Pollock and Zam
122a0 6f 72 61 20 6f 6d 69 73 73 69 6f 6e 20 6b 65 79  ora omission key
122b0 20 66 6f 72 20 61 20 73 74 72 69 6e 67 20 58 20   for a string X 
122c0 6f 66 20 61 6c 6c 0a 2a 2a 20 6c 6f 77 65 72 2d  of all.** lower-
122d0 63 61 73 65 20 6c 65 74 74 65 72 73 2e 0a 2a 2f  case letters..*/
122e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 6c  .static void pol
122f0 6c 6f 63 6b 4f 6d 69 73 73 69 6f 6e 53 71 6c 46  lockOmissionSqlF
12300 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
12310 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
12320 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
12330 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
12340 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  rgv.){.  const c
12350 68 61 72 20 2a 7a 49 6e 20 3d 20 28 63 6f 6e 73  har *zIn = (cons
12360 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
12370 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
12380 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d  0]);.  int nIn =
12390 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
123a0 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
123b0 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 69   char *zOut;.  i
123c0 66 28 20 7a 49 6e 20 29 7b 0a 20 20 20 20 7a 4f  f( zIn ){.    zO
123d0 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ut = sqlite3_mal
123e0 6c 6f 63 28 20 6e 49 6e 20 2b 20 31 20 29 3b 0a  loc( nIn + 1 );.
123f0 20 20 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20      if( zOut==0 
12400 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12410 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
12420 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
12430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
12440 6f 6c 6c 6f 63 6b 4f 6d 69 73 73 69 6f 6e 4b 65  ollockOmissionKe
12450 79 28 7a 49 6e 2c 20 7a 4f 75 74 29 3b 0a 20 20  y(zIn, zOut);.  
12460 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
12470 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
12480 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20 2d 31   (char*)zOut, -1
12490 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
124a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 0a 0a  .    }.  }.}  ..
124b0 0a 2f 2a 20 45 6e 64 20 53 50 45 45 44 43 4f 50  ./* End SPEEDCOP
124c0 20 6b 65 79 69 6e 67 20 66 75 6e 63 74 69 6f 6e   keying function
124d0 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s.**************
124e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12520 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
12570 2a 2a 20 42 65 67 69 6e 20 73 70 65 6c 6c 66 69  ** Begin spellfi
12580 78 31 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  x1 virtual table
12590 2e 0a 2a 2f 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d  ..*/../* Maximum
125a0 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 70 68 6f   length of a pho
125b0 6e 65 68 61 73 68 20 75 73 65 64 20 66 6f 72 20  nehash used for 
125c0 71 75 65 72 79 69 6e 67 20 74 68 65 20 73 68 61  querying the sha
125d0 64 6f 77 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  dow table */.#de
125e0 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 4d 58  fine SPELLFIX_MX
125f0 5f 48 41 53 48 20 20 38 0a 0a 2f 2a 20 4d 61 78  _HASH  8../* Max
12600 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 68  imum number of h
12610 61 73 68 20 73 74 72 69 6e 67 73 20 74 6f 20 65  ash strings to e
12620 78 61 6d 69 6e 65 20 70 65 72 20 71 75 65 72 79  xamine per query
12630 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 45 4c   */.#define SPEL
12640 4c 46 49 58 5f 4d 58 5f 52 55 4e 20 20 20 38 0a  LFIX_MX_RUN   8.
12650 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
12660 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 73  spellfix1_vtab s
12670 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 3b 0a 74  pellfix1_vtab;.t
12680 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 70  ypedef struct sp
12690 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 73  ellfix1_cursor s
126a0 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 3b  pellfix1_cursor;
126b0 0a 0a 2f 2a 20 46 75 7a 7a 79 2d 73 65 61 72 63  ../* Fuzzy-searc
126c0 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  h virtual table 
126d0 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75 63 74  object */.struct
126e0 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20   spellfix1_vtab 
126f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
12700 20 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 2f   base;         /
12710 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d 20 6d  * Base class - m
12720 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a  ust be first */.
12730 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12750 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
12760 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
12770 44 62 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  DbName;         
12780 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64      /* Name of d
12790 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
127a0 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
127b0 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65  char *zTableName
127c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
127d0 6d 65 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  me of the virtua
127e0 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61  l table */.  cha
127f0 72 20 2a 7a 43 6f 73 74 54 61 62 6c 65 3b 20 20  r *zCostTable;  
12800 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
12810 20 68 6f 6c 64 69 6e 67 20 65 64 69 74 2d 64 69   holding edit-di
12820 73 74 61 6e 63 65 20 63 6f 73 74 20 6e 75 6d 62  stance cost numb
12830 65 72 73 20 2a 2f 0a 20 20 45 64 69 74 44 69 73  ers */.  EditDis
12840 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  t3Config *pConfi
12850 67 33 3b 20 2f 2a 20 50 61 72 73 65 64 20 65 64  g3; /* Parsed ed
12860 69 74 20 64 69 73 74 61 6e 63 65 20 63 6f 73 74  it distance cost
12870 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 75 7a 7a  s */.};../* Fuzz
12880 79 2d 73 65 61 72 63 68 20 63 75 72 73 6f 72 20  y-search cursor 
12890 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75 63 74  object */.struct
128a0 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
128b0 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  r {.  sqlite3_vt
128c0 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20  ab_cursor base; 
128d0 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
128e0 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74   - must be first
128f0 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f   */.  spellfix1_
12900 76 74 61 62 20 2a 70 56 54 61 62 3b 20 20 20 20  vtab *pVTab;    
12910 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
12920 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 63 75  to which this cu
12930 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  rsor belongs */.
12940 20 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e    char *zPattern
12950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12960 2a 20 72 68 73 20 6f 66 20 4d 41 54 43 48 20 63  * rhs of MATCH c
12970 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
12980 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
12990 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
129a0 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 63 6f 6e  r of rows of con
129b0 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  tent */.  int nA
129c0 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  lloc;           
129d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
129e0 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 72 6f   of allocated ro
129f0 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77  ws */.  int iRow
12a00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12a10 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
12a20 72 6f 77 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  row of content *
12a30 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20  /.  int iLang;  
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65   /* Value of the
12a60 20 6c 61 6e 67 3d 20 63 6f 6e 73 74 72 61 69 6e   lang= constrain
12a70 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b  t */.  int iTop;
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
12aa0 74 68 65 20 74 6f 70 3d 20 63 6f 6e 73 74 72 61  the top= constra
12ab0 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63  int */.  int iSc
12ac0 6f 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ope;            
12ad0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
12ae0 66 20 74 68 65 20 73 63 6f 70 65 3d 20 63 6f 6e  f the scope= con
12af0 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  straint */.  int
12b00 20 6e 53 65 61 72 63 68 3b 20 20 20 20 20 20 20   nSearch;       
12b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
12b20 62 65 72 20 6f 66 20 76 6f 63 61 62 75 6c 61 72  ber of vocabular
12b30 79 20 69 74 65 6d 73 20 63 68 65 63 6b 65 64 20  y items checked 
12b40 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 70 65 6c  */.  struct spel
12b50 6c 66 69 78 31 5f 72 6f 77 20 7b 20 20 20 20 20  lfix1_row {     
12b60 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 72 6f    /* For each ro
12b70 77 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  w of content */.
12b80 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
12b90 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20  4 iRowid;       
12ba0 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
12bb0 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 63  his row */.    c
12bc0 68 61 72 20 2a 7a 57 6f 72 64 3b 20 20 20 20 20  har *zWord;     
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12be0 54 65 78 74 20 66 6f 72 20 74 68 69 73 20 72 6f  Text for this ro
12bf0 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 61  w */.    int iRa
12c00 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nk;             
12c10 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 6b 20 66         /* Rank f
12c20 6f 72 20 74 68 69 73 20 72 6f 77 20 2a 2f 0a 20  or this row */. 
12c30 20 20 20 69 6e 74 20 69 44 69 73 74 61 6e 63 65     int iDistance
12c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c50 20 2f 2a 20 44 69 73 74 61 6e 63 65 20 66 72 6f   /* Distance fro
12c60 6d 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74 68  m pattern for th
12c70 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  is row */.    in
12c80 74 20 69 53 63 6f 72 65 3b 20 20 20 20 20 20 20  t iScore;       
12c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12ca0 63 6f 72 65 20 66 6f 72 20 73 6f 72 74 69 6e 67  core for sorting
12cb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4d 61 74   */.    int iMat
12cc0 63 68 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  chlen;          
12cd0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
12ce0 66 20 6d 61 74 63 68 6c 65 6e 20 63 6f 6c 75 6d  f matchlen colum
12cf0 6e 20 28 6f 72 20 2d 31 29 20 2a 2f 0a 20 20 20  n (or -1) */.   
12d00 20 63 68 61 72 20 7a 48 61 73 68 5b 53 50 45 4c   char zHash[SPEL
12d10 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 2f  LFIX_MX_HASH]; /
12d20 2a 20 74 68 65 20 70 68 6f 6e 65 68 61 73 68 20  * the phonehash 
12d30 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6d 61  used for this ma
12d40 74 63 68 20 2a 2f 0a 20 20 7d 20 2a 61 3b 20 0a  tch */.  } *a; .
12d50 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  };../*.** Constr
12d60 75 63 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  uct one or more 
12d70 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 66  SQL statements f
12d80 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 20 73  rom the format s
12d90 74 72 69 6e 67 20 67 69 76 65 6e 0a 2a 2a 20 61  tring given.** a
12da0 6e 64 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  nd then evaluate
12db0 20 74 68 6f 73 65 20 73 74 61 74 65 6d 65 6e 74   those statement
12dc0 73 2e 20 54 68 65 20 73 75 63 63 65 73 73 20 63  s. The success c
12dd0 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
12de0 2a 20 69 6e 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a  * into *pRc..**.
12df0 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 69 6e  ** If *pRc is in
12e00 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f  itially non-zero
12e10 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
12e20 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12e30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 70  /.static void sp
12e40 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 0a 20  ellfix1DbExec(. 
12e50 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
12e60 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65          /* Succe
12e70 73 73 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ss code */.  sql
12e80 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
12e90 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12ea0 69 6e 20 77 68 69 63 68 20 74 6f 20 72 75 6e 20  in which to run 
12eb0 53 51 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  SQL */.  const c
12ec0 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20  har *zFormat,   
12ed0 2f 2a 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67  /* Format string
12ee0 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e   for SQL */.  ..
12ef0 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f00 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
12f10 73 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20  s to the format 
12f20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76  string */.){.  v
12f30 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
12f40 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 2a  r *zSql;.  if( *
12f50 70 52 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRc ) return;.  
12f60 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
12f70 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
12f80 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
12f90 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
12fa0 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
12fb0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
12fc0 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
12fd0 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
12fe0 20 20 20 20 2a 70 52 63 20 3d 20 73 71 6c 69 74      *pRc = sqlit
12ff0 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
13000 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
13010 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
13020 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
13030 20 78 44 69 73 63 6f 6e 6e 65 63 74 2f 78 44 65   xDisconnect/xDe
13040 73 74 72 6f 79 20 6d 65 74 68 6f 64 20 66 6f 72  stroy method for
13050 20 74 68 65 20 66 75 7a 7a 79 2d 73 65 61 72 63   the fuzzy-searc
13060 68 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  h module..*/.sta
13070 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
13080 31 55 6e 69 6e 69 74 28 69 6e 74 20 69 73 44 65  1Uninit(int isDe
13090 73 74 72 6f 79 2c 20 73 71 6c 69 74 65 33 5f 76  stroy, sqlite3_v
130a0 74 61 62 20 2a 70 56 54 61 62 29 7b 0a 20 20 73  tab *pVTab){.  s
130b0 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70  pellfix1_vtab *p
130c0 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74   = (spellfix1_vt
130d0 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 69 6e 74  ab*)pVTab;.  int
130e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
130f0 0a 20 20 69 66 28 20 69 73 44 65 73 74 72 6f 79  .  if( isDestroy
13100 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
13110 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
13120 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63   spellfix1DbExec
13130 28 26 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20  (&rc, db, "DROP 
13140 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
13150 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
13160 62 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  b\"",.          
13170 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61          p->zDbNa
13180 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
13190 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
131a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
131b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
131c0 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  p->zTableName);.
131d0 20 20 20 20 65 64 69 74 44 69 73 74 33 43 6f 6e      editDist3Con
131e0 66 69 67 44 65 6c 65 74 65 28 70 2d 3e 70 43 6f  figDelete(p->pCo
131f0 6e 66 69 67 33 29 3b 0a 20 20 20 20 73 71 6c 69  nfig3);.    sqli
13200 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73  te3_free(p->zCos
13210 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c  tTable);.    sql
13220 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
13230 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13240 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
13250 6c 66 69 78 31 44 69 73 63 6f 6e 6e 65 63 74 28  lfix1Disconnect(
13260 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
13270 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Tab){.  return s
13280 70 65 6c 6c 66 69 78 31 55 6e 69 6e 69 74 28 30  pellfix1Uninit(0
13290 2c 20 70 56 54 61 62 29 3b 0a 7d 0a 73 74 61 74  , pVTab);.}.stat
132a0 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
132b0 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 5f  Destroy(sqlite3_
132c0 76 74 61 62 20 2a 70 56 54 61 62 29 7b 0a 20 20  vtab *pVTab){.  
132d0 72 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31  return spellfix1
132e0 55 6e 69 6e 69 74 28 31 2c 20 70 56 54 61 62 29  Uninit(1, pVTab)
132f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
13300 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69  a copy of a stri
13310 6e 67 2e 20 20 52 65 6d 6f 76 65 20 6c 65 61 64  ng.  Remove lead
13320 69 6e 67 20 61 6e 64 20 74 72 61 69 6c 69 6e 67  ing and trailing
13330 20 77 68 69 74 65 73 70 61 63 65 0a 2a 2a 20 61   whitespace.** a
13340 6e 64 20 64 65 71 75 6f 74 65 20 69 74 2e 0a 2a  nd dequote it..*
13350 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73  /.static char *s
13360 70 65 6c 6c 66 69 78 31 44 65 71 75 6f 74 65 28  pellfix1Dequote(
13370 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29  const char *zIn)
13380 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  {.  char *zOut;.
13390 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
133a0 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 69  ar c;.  while( i
133b0 73 73 70 61 63 65 28 7a 49 6e 5b 30 5d 29 20 29  sspace(zIn[0]) )
133c0 20 7a 49 6e 2b 2b 3b 0a 20 20 7a 4f 75 74 20 3d   zIn++;.  zOut =
133d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
133e0 28 22 25 73 22 2c 20 7a 49 6e 29 3b 0a 20 20 69  ("%s", zIn);.  i
133f0 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74  f( zOut==0 ) ret
13400 75 72 6e 20 30 3b 0a 20 20 69 20 3d 20 28 69 6e  urn 0;.  i = (in
13410 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a  t)strlen(zOut);.
13420 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
13430 69 73 73 70 61 63 65 28 7a 4f 75 74 5b 69 2d 31  isspace(zOut[i-1
13440 5d 29 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 7a  ]) ){ i--; }.  z
13450 4f 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 63 20  Out[i] = 0;.  c 
13460 3d 20 7a 4f 75 74 5b 30 5d 3b 0a 20 20 69 66 28  = zOut[0];.  if(
13470 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
13480 22 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  "' ){.    for(i=
13490 31 2c 20 6a 3d 30 3b 20 7a 4f 75 74 5b 69 5d 3b  1, j=0; zOut[i];
134a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 4f 75   i++){.      zOu
134b0 74 5b 6a 2b 2b 5d 20 3d 20 7a 4f 75 74 5b 69 5d  t[j++] = zOut[i]
134c0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74  ;.      if( zOut
134d0 5b 69 5d 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20  [i]==c ){.      
134e0 20 20 69 66 28 20 7a 4f 75 74 5b 69 2b 31 5d 3d    if( zOut[i+1]=
134f0 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =c ){.          
13500 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i++;.        }el
13510 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  se{.          zO
13520 75 74 5b 6a 2d 31 5d 20 3d 20 30 3b 0a 20 20 20  ut[j-1] = 0;.   
13530 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13560 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn zOut;.}.../*.
13570 2a 2a 20 78 43 6f 6e 6e 65 63 74 2f 78 43 72 65  ** xConnect/xCre
13580 61 74 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  ate method for t
13590 68 65 20 73 70 65 6c 6c 66 69 78 31 20 6d 6f 64  he spellfix1 mod
135a0 75 6c 65 2e 20 41 72 67 75 6d 65 6e 74 73 20 61  ule. Arguments a
135b0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76  re:.**.**   argv
135c0 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20  [0]   -> module 
135d0 6e 61 6d 65 20 20 28 22 73 70 65 6c 6c 66 69 78  name  ("spellfix
135e0 31 22 29 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d  1").**   argv[1]
135f0 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65 20 6e     -> database n
13600 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 32 5d  ame.**   argv[2]
13610 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61 6d 65     -> table name
13620 0a 2a 2a 20 20 20 61 72 67 76 5b 33 5d 2e 2e 20  .**   argv[3].. 
13630 2d 3e 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67 75  -> optional argu
13640 6d 65 6e 74 73 20 28 69 2e 65 2e 20 22 65 64 69  ments (i.e. "edi
13650 74 5f 63 6f 73 74 5f 74 61 62 6c 65 22 20 70 61  t_cost_table" pa
13660 72 61 6d 65 74 65 72 29 0a 2a 2f 0a 73 74 61 74  rameter).*/.stat
13670 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
13680 49 6e 69 74 28 0a 20 20 69 6e 74 20 69 73 43 72  Init(.  int isCr
13690 65 61 74 65 2c 0a 20 20 73 71 6c 69 74 65 33 20  eate,.  sqlite3 
136a0 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
136b0 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
136c0 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
136d0 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
136e0 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a  _vtab **ppVTab,.
136f0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
13700 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  {.  spellfix1_vt
13710 61 62 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  ab *pNew = 0;.  
13720 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64  const char *zMod
13730 75 6c 65 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20  ule = argv[0];. 
13740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
13750 4e 61 6d 65 20 3d 20 61 72 67 76 5b 31 5d 3b 0a  Name = argv[1];.
13760 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
13770 61 62 6c 65 4e 61 6d 65 20 3d 20 61 72 67 76 5b  ableName = argv[
13780 32 5d 3b 0a 20 20 69 6e 74 20 6e 44 62 4e 61 6d  2];.  int nDbNam
13790 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
137a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
137b0 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 33 20  ;..  if( argc<3 
137c0 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  ){.    *pzErr = 
137d0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
137e0 0a 20 20 20 20 20 20 20 20 22 25 73 3a 20 77 72  .        "%s: wr
137f0 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 43 52  ong number of CR
13800 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
13810 4c 45 20 61 72 67 75 6d 65 6e 74 73 22 2c 20 61  LE arguments", a
13820 72 67 76 5b 30 5d 0a 20 20 20 20 29 3b 0a 20 20  rgv[0].    );.  
13830 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
13840 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
13850 20 20 6e 44 62 4e 61 6d 65 20 3d 20 73 74 72 6c    nDbName = strl
13860 65 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 20  en(zDbName);.   
13870 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
13880 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
13890 70 4e 65 77 29 20 2b 20 6e 44 62 4e 61 6d 65 20  pNew) + nDbName 
138a0 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  + 1);.    if( pN
138b0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ew==0 ){.      r
138c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
138d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
138e0 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
138f0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
13900 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a  );.      pNew->z
13910 44 62 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  DbName = (char*)
13920 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 20 20  &pNew[1];.      
13930 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 44 62  memcpy(pNew->zDb
13940 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 2c 20 6e  Name, zDbName, n
13950 44 62 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 20  DbName+1);.     
13960 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e 61 6d   pNew->zTableNam
13970 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
13980 6e 74 66 28 22 25 73 22 2c 20 7a 54 61 62 6c 65  ntf("%s", zTable
13990 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 65  Name);.      pNe
139a0 77 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  w->db = db;.    
139b0 20 20 69 66 28 20 70 4e 65 77 2d 3e 7a 54 61 62    if( pNew->zTab
139c0 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  leName==0 ){.   
139d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
139e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
139f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
13a00 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  = sqlite3_declar
13a10 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20 20 20  e_vtab(db, .    
13a20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
13a30 20 54 41 42 4c 45 20 78 28 77 6f 72 64 2c 72 61   TABLE x(word,ra
13a40 6e 6b 2c 64 69 73 74 61 6e 63 65 2c 6c 61 6e 67  nk,distance,lang
13a50 69 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  id, ".          
13a60 20 20 20 22 73 63 6f 72 65 2c 20 6d 61 74 63 68     "score, match
13a70 6c 65 6e 2c 20 70 68 6f 6e 65 68 61 73 68 2c 20  len, phonehash, 
13a80 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
13a90 74 6f 70 20 48 49 44 44 45 4e 2c 20 73 63 6f 70  top HIDDEN, scop
13aa0 65 20 48 49 44 44 45 4e 2c 20 73 72 63 68 63 6e  e HIDDEN, srchcn
13ab0 74 20 48 49 44 44 45 4e 2c 20 22 0a 20 20 20 20  t HIDDEN, ".    
13ac0 20 20 20 20 20 20 20 20 20 22 73 6f 75 6e 64 73           "sounds
13ad0 6c 69 6b 65 20 48 49 44 44 45 4e 2c 20 63 6f 6d  like HIDDEN, com
13ae0 6d 61 6e 64 20 48 49 44 44 45 4e 29 22 0a 20 20  mand HIDDEN)".  
13af0 20 20 20 20 20 20 29 3b 0a 23 64 65 66 69 6e 65        );.#define
13b00 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f   SPELLFIX_COL_WO
13b10 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 0a  RD            0.
13b20 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
13b30 5f 43 4f 4c 5f 52 41 4e 4b 20 20 20 20 20 20 20  _COL_RANK       
13b40 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53       1.#define S
13b50 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49 53 54  PELLFIX_COL_DIST
13b60 41 4e 43 45 20 20 20 20 20 20 20 20 32 0a 23 64  ANCE        2.#d
13b70 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43  efine SPELLFIX_C
13b80 4f 4c 5f 4c 41 4e 47 49 44 20 20 20 20 20 20 20  OL_LANGID       
13b90 20 20 20 33 0a 23 64 65 66 69 6e 65 20 53 50 45     3.#define SPE
13ba0 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 20  LLFIX_COL_SCORE 
13bb0 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65 66            4.#def
13bc0 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
13bd0 5f 4d 41 54 43 48 4c 45 4e 20 20 20 20 20 20 20  _MATCHLEN       
13be0 20 35 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c   5.#define SPELL
13bf0 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e 45 48 41 53  FIX_COL_PHONEHAS
13c00 48 20 20 20 20 20 20 20 36 0a 23 64 65 66 69 6e  H       6.#defin
13c10 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54  e SPELLFIX_COL_T
13c20 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20 37  OP             7
13c30 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
13c40 58 5f 43 4f 4c 5f 53 43 4f 50 45 20 20 20 20 20  X_COL_SCOPE     
13c50 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20        8.#define 
13c60 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52 43  SPELLFIX_COL_SRC
13c70 48 43 4e 54 20 20 20 20 20 20 20 20 20 39 0a 23  HCNT         9.#
13c80 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
13c90 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 20 20  COL_SOUNDSLIKE  
13ca0 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53 50     10.#define SP
13cb0 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43 4f 4d 4d 41  ELLFIX_COL_COMMA
13cc0 4e 44 20 20 20 20 20 20 20 20 31 31 0a 20 20 20  ND        11.   
13cd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
13ce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13cf0 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
13d00 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
13d10 36 34 20 72 3b 0a 20 20 20 20 20 20 20 20 73 70  64 r;.        sp
13d20 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72  ellfix1DbExec(&r
13d30 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20  c, db,.         
13d40 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
13d50 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 5c 22  IF NOT EXISTS \"
13d60 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c  %w\".\"%w_vocab\
13d70 22 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  "(\n".          
13d80 20 22 20 20 69 64 20 49 4e 54 45 47 45 52 20 50   "  id INTEGER P
13d90 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20  RIMARY KEY,\n". 
13da0 20 20 20 20 20 20 20 20 20 20 22 20 20 72 61 6e            "  ran
13db0 6b 20 49 4e 54 2c 5c 6e 22 0a 20 20 20 20 20 20  k INT,\n".      
13dc0 20 20 20 20 20 22 20 20 6c 61 6e 67 69 64 20 49       "  langid I
13dd0 4e 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  NT,\n".         
13de0 20 20 22 20 20 77 6f 72 64 20 54 45 58 54 2c 5c    "  word TEXT,\
13df0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 20  n".           " 
13e00 20 6b 31 20 54 45 58 54 2c 5c 6e 22 0a 20 20 20   k1 TEXT,\n".   
13e10 20 20 20 20 20 20 20 20 22 20 20 6b 32 20 54 45          "  k2 TE
13e20 58 54 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  XT\n".          
13e30 20 22 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20   ");\n",.       
13e40 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
13e50 62 6c 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  bleName.        
13e60 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13e70 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
13e80 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
13e90 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44        spellfix1D
13ea0 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20  bExec(&rc, db,. 
13eb0 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
13ec0 45 20 49 4e 44 45 58 20 49 46 20 4e 4f 54 20 45  E INDEX IF NOT E
13ed0 58 49 53 54 53 20 5c 22 25 77 5c 22 2e 5c 22 25  XISTS \"%w\".\"%
13ee0 77 5f 69 6e 64 65 78 5f 25 6c 6c 78 5c 22 20 22  w_index_%llx\" "
13ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
13f00 4f 4e 20 5c 22 25 77 5f 76 6f 63 61 62 5c 22 28  ON \"%w_vocab\"(
13f10 6c 61 6e 67 69 64 2c 6b 32 29 3b 22 2c 0a 20 20  langid,k2);",.  
13f20 20 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65           zDbName
13f30 2c 20 7a 4d 6f 64 75 6c 65 2c 20 72 2c 20 7a 54  , zModule, r, zT
13f40 61 62 6c 65 4e 61 6d 65 0a 20 20 20 20 20 20 20  ableName.       
13f50 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
13f60 20 20 66 6f 72 28 69 3d 33 3b 20 72 63 3d 3d 53    for(i=3; rc==S
13f70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 61 72  QLITE_OK && i<ar
13f80 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gc; i++){.      
13f90 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 72 67    if( memcmp(arg
13fa0 76 5b 69 5d 2c 22 65 64 69 74 5f 63 6f 73 74 5f  v[i],"edit_cost_
13fb0 74 61 62 6c 65 3d 22 2c 31 36 29 3d 3d 30 20 26  table=",16)==0 &
13fc0 26 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62  & pNew->zCostTab
13fd0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
13fe0 20 20 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61     pNew->zCostTa
13ff0 62 6c 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 44  ble = spellfix1D
14000 65 71 75 6f 74 65 28 26 61 72 67 76 5b 69 5d 5b  equote(&argv[i][
14010 31 36 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  16]);.          
14020 69 66 28 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54  if( pNew->zCostT
14030 61 62 6c 65 3d 3d 30 20 29 20 72 63 20 3d 20 53  able==0 ) rc = S
14040 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14050 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
14060 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14070 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
14080 52 52 4f 52 3b 20 0a 20 20 20 20 20 20 7d 0a 20  RROR; .      }. 
14090 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 56     }.  }..  *ppV
140a0 54 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Tab = (sqlite3_v
140b0 74 61 62 20 2a 29 70 4e 65 77 3b 0a 20 20 72 65  tab *)pNew;.  re
140c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
140d0 2a 20 54 68 65 20 78 43 6f 6e 6e 65 63 74 20 61  * The xConnect a
140e0 6e 64 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f  nd xCreate metho
140f0 64 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ds.*/.static int
14100 20 73 70 65 6c 6c 66 69 78 31 43 6f 6e 6e 65 63   spellfix1Connec
14110 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
14120 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a  ,.  void *pAux,.
14130 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
14140 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
14150 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  gv,.  sqlite3_vt
14160 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a 20 20 63  ab **ppVTab,.  c
14170 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
14180 20 72 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78   return spellfix
14190 31 49 6e 69 74 28 30 2c 20 64 62 2c 20 70 41 75  1Init(0, db, pAu
141a0 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70  x, argc, argv, p
141b0 70 56 54 61 62 2c 20 70 7a 45 72 72 29 3b 0a 7d  pVTab, pzErr);.}
141c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
141d0 6c 66 69 78 31 43 72 65 61 74 65 28 0a 20 20 73  lfix1Create(.  s
141e0 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
141f0 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
14200 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
14210 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
14220 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
14230 70 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVTab,.  char **
14240 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75 72  pzErr.){.  retur
14250 6e 20 73 70 65 6c 6c 66 69 78 31 49 6e 69 74 28  n spellfix1Init(
14260 31 2c 20 64 62 2c 20 70 41 75 78 2c 20 61 72 67  1, db, pAux, arg
14270 63 2c 20 61 72 67 76 2c 20 70 70 56 54 61 62 2c  c, argv, ppVTab,
14280 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzErr);.}../*.*
14290 2a 20 43 6c 65 61 72 20 61 6c 6c 20 6f 66 20 74  * Clear all of t
142a0 68 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  he content from 
142b0 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  a cursor..*/.sta
142c0 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66 69  tic void spellfi
142d0 78 31 52 65 73 65 74 43 75 72 73 6f 72 28 73 70  x1ResetCursor(sp
142e0 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
142f0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCur){.  int i;.
14300 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75    for(i=0; i<pCu
14310 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20  r->nRow; i++){. 
14320 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14330 70 43 75 72 2d 3e 61 5b 69 5d 2e 7a 57 6f 72 64  pCur->a[i].zWord
14340 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 6e  );.  }.  pCur->n
14350 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Row = 0;.  pCur-
14360 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43 75  >iRow = 0;.  pCu
14370 72 2d 3e 6e 53 65 61 72 63 68 20 3d 20 30 3b 0a  r->nSearch = 0;.
14380 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  }../*.** Resize 
14390 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 68 6f  the cursor to ho
143a0 6c 64 20 75 70 20 74 6f 20 4e 20 72 6f 77 73 20  ld up to N rows 
143b0 6f 66 20 63 6f 6e 74 65 6e 74 0a 2a 2f 0a 73 74  of content.*/.st
143c0 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66  atic void spellf
143d0 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28  ix1ResizeCursor(
143e0 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
143f0 20 2a 70 43 75 72 2c 20 69 6e 74 20 4e 29 7b 0a   *pCur, int N){.
14400 20 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69    struct spellfi
14410 78 31 5f 72 6f 77 20 2a 61 4e 65 77 3b 0a 20 20  x1_row *aNew;.  
14420 61 73 73 65 72 74 28 20 4e 3e 3d 70 43 75 72 2d  assert( N>=pCur-
14430 3e 6e 52 6f 77 20 29 3b 0a 20 20 61 4e 65 77 20  >nRow );.  aNew 
14440 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
14450 63 28 70 43 75 72 2d 3e 61 2c 20 73 69 7a 65 6f  c(pCur->a, sizeo
14460 66 28 70 43 75 72 2d 3e 61 5b 30 5d 29 2a 4e 29  f(pCur->a[0])*N)
14470 3b 0a 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20  ;.  if( aNew==0 
14480 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 73 70  && N>0 ){.    sp
14490 65 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73  ellfix1ResetCurs
144a0 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 73 71  or(pCur);.    sq
144b0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
144c0 3e 61 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e  >a);.    pCur->n
144d0 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  Alloc = 0;.    p
144e0 43 75 72 2d 3e 61 20 3d 20 30 3b 0a 20 20 7d 65  Cur->a = 0;.  }e
144f0 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 6e  lse{.    pCur->n
14500 41 6c 6c 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70  Alloc = N;.    p
14510 43 75 72 2d 3e 61 20 3d 20 61 4e 65 77 3b 0a 20  Cur->a = aNew;. 
14520 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   }.}.../*.** Clo
14530 73 65 20 61 20 66 75 7a 7a 79 2d 73 65 61 72 63  se a fuzzy-searc
14540 68 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  h cursor..*/.sta
14550 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
14560 31 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  1Close(sqlite3_v
14570 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
14580 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  {.  spellfix1_cu
14590 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70  rsor *pCur = (sp
145a0 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
145b0 29 63 75 72 3b 0a 20 20 73 70 65 6c 6c 66 69 78  )cur;.  spellfix
145c0 31 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75  1ResetCursor(pCu
145d0 72 29 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52  r);.  spellfix1R
145e0 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72  esizeCursor(pCur
145f0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
14600 66 72 65 65 28 70 43 75 72 2d 3e 7a 50 61 74 74  free(pCur->zPatt
14610 65 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ern);.  sqlite3_
14620 66 72 65 65 28 70 43 75 72 29 3b 0a 20 20 72 65  free(pCur);.  re
14630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14640 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
14650 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
14660 73 65 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  se forms:.**.** 
14670 20 20 28 41 29 20 20 20 20 77 6f 72 64 20 4d 41    (A)    word MA
14680 54 43 48 20 24 73 74 72 0a 2a 2a 20 20 20 28 42  TCH $str.**   (B
14690 29 20 20 20 20 6c 61 6e 67 69 64 20 3d 3d 20 24  )    langid == $
146a0 6c 61 6e 67 69 64 0a 2a 2a 20 20 20 28 43 29 20  langid.**   (C) 
146b0 20 20 20 74 6f 70 20 3d 20 24 74 6f 70 0a 2a 2a     top = $top.**
146c0 20 20 20 28 44 29 20 20 20 20 73 63 6f 70 65 20     (D)    scope 
146d0 3d 20 24 73 63 6f 70 65 0a 2a 2a 20 20 20 28 45  = $scope.**   (E
146e0 29 20 20 20 20 64 69 73 74 61 6e 63 65 20 3c 20  )    distance < 
146f0 24 64 69 73 74 61 6e 63 65 0a 2a 2a 20 20 20 28  $distance.**   (
14700 46 29 20 20 20 20 64 69 73 74 61 6e 63 65 20 3c  F)    distance <
14710 3d 20 24 64 69 73 74 61 6e 63 65 0a 2a 2a 0a 2a  = $distance.**.*
14720 2a 20 54 68 65 20 70 6c 61 6e 20 6e 75 6d 62 65  * The plan numbe
14730 72 20 69 73 20 61 20 62 69 74 20 6d 61 73 6b 20  r is a bit mask 
14740 66 6f 72 6d 65 64 20 77 69 74 68 20 74 68 65 73  formed with thes
14750 65 20 62 69 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e bits:.**.**   
14760 30 78 30 31 20 20 20 28 41 29 20 69 73 20 66 6f  0x01   (A) is fo
14770 75 6e 64 0a 2a 2a 20 20 20 30 78 30 32 20 20 20  und.**   0x02   
14780 28 42 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20  (B) is found.** 
14790 20 20 30 78 30 34 20 20 20 28 43 29 20 69 73 20    0x04   (C) is 
147a0 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 30 38 20  found.**   0x08 
147b0 20 20 28 44 29 20 69 73 20 66 6f 75 6e 64 0a 2a    (D) is found.*
147c0 2a 20 20 20 30 78 31 30 20 20 20 28 45 29 20 69  *   0x10   (E) i
147d0 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 32  s found.**   0x2
147e0 30 20 20 20 28 46 29 20 69 73 20 66 6f 75 6e 64  0   (F) is found
147f0 0a 2a 2a 0a 2a 2a 20 66 69 6c 74 65 72 2e 61 72  .**.** filter.ar
14800 67 76 5b 2a 5d 20 76 61 6c 75 65 73 20 63 6f 6e  gv[*] values con
14810 74 61 69 6e 73 20 24 73 74 72 2c 20 24 6c 61 6e  tains $str, $lan
14820 67 69 64 2c 20 24 74 6f 70 2c 20 61 6e 64 20 24  gid, $top, and $
14830 73 63 6f 70 65 2c 0a 2a 2a 20 69 66 20 73 70 65  scope,.** if spe
14840 63 69 66 69 65 64 20 61 6e 64 20 69 6e 20 74 68  cified and in th
14850 61 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  at order..*/.sta
14860 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
14870 31 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  1BestIndex(sqlit
14880 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
14890 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
148a0 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 69   *pIdxInfo){.  i
148b0 6e 74 20 69 50 6c 61 6e 20 3d 20 30 3b 0a 20 20  nt iPlan = 0;.  
148c0 69 6e 74 20 69 4c 61 6e 67 54 65 72 6d 20 3d 20  int iLangTerm = 
148d0 2d 31 3b 0a 20 20 69 6e 74 20 69 54 6f 70 54 65  -1;.  int iTopTe
148e0 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  rm = -1;.  int i
148f0 53 63 6f 70 65 54 65 72 6d 20 3d 20 2d 31 3b 0a  ScopeTerm = -1;.
14900 20 20 69 6e 74 20 69 44 69 73 74 54 65 72 6d 20    int iDistTerm 
14910 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  = -1;.  int i;. 
14920 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
14930 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14940 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61  traint *pConstra
14950 69 6e 74 3b 0a 20 20 70 43 6f 6e 73 74 72 61 69  int;.  pConstrai
14960 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  nt = pIdxInfo->a
14970 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
14980 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
14990 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
149a0 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74  i++, pConstraint
149b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  ++){.    if( pCo
149c0 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65  nstraint->usable
149d0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
149e0 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
149f0 20 74 68 65 20 66 6f 72 6d 3a 20 20 77 6f 72 64   the form:  word
14a00 20 4d 41 54 43 48 20 24 73 74 72 20 2a 2f 0a 20   MATCH $str */. 
14a10 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
14a20 31 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  1)==0 .     && p
14a30 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
14a40 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f  umn==SPELLFIX_CO
14a50 4c 5f 57 4f 52 44 0a 20 20 20 20 20 26 26 20 70  L_WORD.     && p
14a60 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
14a70 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
14a80 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 0a 20 20  STRAINT_MATCH.  
14a90 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e    ){.      iPlan
14aa0 20 7c 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64   |= 1;.      pId
14ab0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
14ac0 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
14ad0 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  ndex = 1;.      
14ae0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
14af0 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
14b00 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  it = 1;.    }.. 
14b10 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74     /* Terms of t
14b20 68 65 20 66 6f 72 6d 3a 20 20 6c 61 6e 67 69 64  he form:  langid
14b30 20 3d 20 24 6c 61 6e 67 69 64 20 20 2a 2f 0a 20   = $langid  */. 
14b40 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
14b50 32 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43  2)==0.     && pC
14b60 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
14b70 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  mn==SPELLFIX_COL
14b80 5f 4c 41 4e 47 49 44 0a 20 20 20 20 20 26 26 20  _LANGID.     && 
14b90 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
14ba0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
14bb0 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20 20  NSTRAINT_EQ.    
14bc0 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c  ){.      iPlan |
14bd0 3d 20 32 3b 0a 20 20 20 20 20 20 69 4c 61 6e 67  = 2;.      iLang
14be0 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  Term = i;.    }.
14bf0 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
14c00 20 74 68 65 20 66 6f 72 6d 3a 20 20 74 6f 70 20   the form:  top 
14c10 3d 20 24 74 6f 70 20 2a 2f 0a 20 20 20 20 69 66  = $top */.    if
14c20 28 20 28 69 50 6c 61 6e 20 26 20 34 29 3d 3d 30  ( (iPlan & 4)==0
14c30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
14c40 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53  aint->iColumn==S
14c50 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54 4f 50 0a  PELLFIX_COL_TOP.
14c60 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
14c70 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  int->op==SQLITE_
14c80 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
14c90 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  _EQ.    ){.     
14ca0 20 69 50 6c 61 6e 20 7c 3d 20 34 3b 0a 20 20 20   iPlan |= 4;.   
14cb0 20 20 20 69 54 6f 70 54 65 72 6d 20 3d 20 69 3b     iTopTerm = i;
14cc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
14cd0 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
14ce0 3a 20 20 73 63 6f 70 65 20 3d 20 24 73 63 6f 70  :  scope = $scop
14cf0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50  e */.    if( (iP
14d00 6c 61 6e 20 26 20 38 29 3d 3d 30 0a 20 20 20 20  lan & 8)==0.    
14d10 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
14d20 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46  >iColumn==SPELLF
14d30 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 0a 20 20 20  IX_COL_SCOPE.   
14d40 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
14d50 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
14d60 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
14d70 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50  .    ){.      iP
14d80 6c 61 6e 20 7c 3d 20 38 3b 0a 20 20 20 20 20 20  lan |= 8;.      
14d90 69 53 63 6f 70 65 54 65 72 6d 20 3d 20 69 3b 0a  iScopeTerm = i;.
14da0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65      }..    /* Te
14db0 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  rms of the form:
14dc0 20 20 64 69 73 74 61 6e 63 65 20 3c 20 24 64 69    distance < $di
14dd0 73 74 20 6f 72 20 64 69 73 74 61 6e 63 65 20 3c  st or distance <
14de0 3d 20 24 64 69 73 74 20 2a 2f 0a 20 20 20 20 69  = $dist */.    i
14df0 66 28 20 28 69 50 6c 61 6e 20 26 20 28 31 36 7c  f( (iPlan & (16|
14e00 33 32 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  32))==0.     && 
14e10 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f  pConstraint->iCo
14e20 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43  lumn==SPELLFIX_C
14e30 4f 4c 5f 44 49 53 54 41 4e 43 45 0a 20 20 20 20  OL_DISTANCE.    
14e40 20 26 26 20 28 70 43 6f 6e 73 74 72 61 69 6e 74   && (pConstraint
14e50 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
14e60 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
14e70 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43  .          || pC
14e80 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53  onstraint->op==S
14e90 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14ea0 54 52 41 49 4e 54 5f 4c 45 29 0a 20 20 20 20 29  TRAINT_LE).    )
14eb0 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d  {.      iPlan |=
14ec0 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
14ed0 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14ee0 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 3f 20 31  ONSTRAINT_LT ? 1
14ef0 36 20 3a 20 33 32 3b 0a 20 20 20 20 20 20 69 44  6 : 32;.      iD
14f00 69 73 74 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20  istTerm = i;.   
14f10 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 50 6c   }.  }.  if( iPl
14f20 61 6e 26 31 20 29 7b 0a 20 20 20 20 69 6e 74 20  an&1 ){.    int 
14f30 69 64 78 20 3d 20 32 3b 0a 20 20 20 20 70 49 64  idx = 2;.    pId
14f40 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
14f50 69 50 6c 61 6e 3b 0a 20 20 20 20 69 66 28 20 70  iPlan;.    if( p
14f60 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
14f70 79 3d 3d 31 0a 20 20 20 20 20 26 26 20 70 49 64  y==1.     && pId
14f80 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b  xInfo->aOrderBy[
14f90 30 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d 34 0a 20 20  0].iColumn==4.  
14fa0 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e     && pIdxInfo->
14fb0 61 4f 72 64 65 72 42 79 5b 30 5d 2e 64 65 73 63  aOrderBy[0].desc
14fc0 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
14fd0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
14fe0 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 31 3b 20  ByConsumed = 1; 
14ff0 20 2f 2a 20 44 65 66 61 75 6c 74 20 6f 72 64 65   /* Default orde
15000 72 20 62 79 20 69 53 63 6f 72 65 20 2a 2f 0a 20  r by iScore */. 
15010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c     }.    if( iPl
15020 61 6e 26 32 20 29 7b 0a 20 20 20 20 20 20 70 49  an&2 ){.      pI
15030 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
15040 69 6e 74 55 73 61 67 65 5b 69 4c 61 6e 67 54 65  intUsage[iLangTe
15050 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  rm].argvIndex = 
15060 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64  idx++;.      pId
15070 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
15080 6e 74 55 73 61 67 65 5b 69 4c 61 6e 67 54 65 72  ntUsage[iLangTer
15090 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20  m].omit = 1;.   
150a0 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c 61 6e   }.    if( iPlan
150b0 26 34 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  &4 ){.      pIdx
150c0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
150d0 74 55 73 61 67 65 5b 69 54 6f 70 54 65 72 6d 5d  tUsage[iTopTerm]
150e0 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78  .argvIndex = idx
150f0 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  ++;.      pIdxIn
15100 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
15110 73 61 67 65 5b 69 54 6f 70 54 65 72 6d 5d 2e 6f  sage[iTopTerm].o
15120 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  mit = 1;.    }. 
15130 20 20 20 69 66 28 20 69 50 6c 61 6e 26 38 20 29     if( iPlan&8 )
15140 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  {.      pIdxInfo
15150 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
15160 67 65 5b 69 53 63 6f 70 65 54 65 72 6d 5d 2e 61  ge[iScopeTerm].a
15170 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b  rgvIndex = idx++
15180 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
15190 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
151a0 67 65 5b 69 53 63 6f 70 65 54 65 72 6d 5d 2e 6f  ge[iScopeTerm].o
151b0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  mit = 1;.    }. 
151c0 20 20 20 69 66 28 20 69 50 6c 61 6e 26 28 31 36     if( iPlan&(16
151d0 7c 33 32 29 20 29 7b 0a 20 20 20 20 20 20 70 49  |32) ){.      pI
151e0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
151f0 69 6e 74 55 73 61 67 65 5b 69 44 69 73 74 54 65  intUsage[iDistTe
15200 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  rm].argvIndex = 
15210 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64  idx++;.      pId
15220 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
15230 6e 74 55 73 61 67 65 5b 69 44 69 73 74 54 65 72  ntUsage[iDistTer
15240 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20  m].omit = 1;.   
15250 20 7d 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d   }.    pIdxInfo-
15260 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
15270 20 28 64 6f 75 62 6c 65 29 31 30 30 30 30 3b 0a   (double)10000;.
15280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
15290 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
152a0 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
152b0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
152c0 20 28 64 6f 75 62 6c 65 29 31 30 30 30 30 30 30   (double)1000000
152d0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
152e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
152f0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 66  .** Open a new f
15300 75 7a 7a 79 2d 73 65 61 72 63 68 20 63 75 72 73  uzzy-search curs
15310 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
15320 74 20 73 70 65 6c 6c 66 69 78 31 4f 70 65 6e 28  t spellfix1Open(
15330 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
15340 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61  Tab, sqlite3_vta
15350 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
15360 73 6f 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  sor){.  spellfix
15370 31 5f 76 74 61 62 20 2a 70 20 3d 20 28 73 70 65  1_vtab *p = (spe
15380 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29 70 56 54  llfix1_vtab*)pVT
15390 61 62 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  ab;.  spellfix1_
153a0 63 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  cursor *pCur;.  
153b0 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCur = sqlite3_m
153c0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
153d0 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
153e0 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ur==0 ) return S
153f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
15400 65 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73  emset(pCur, 0, s
15410 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20  izeof(*pCur));. 
15420 20 70 43 75 72 2d 3e 70 56 54 61 62 20 3d 20 70   pCur->pVTab = p
15430 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20  ;.  *ppCursor = 
15440 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72  &pCur->base;.  r
15450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
15470 20 61 20 64 69 73 74 61 6e 63 65 20 6d 65 61 73   a distance meas
15480 75 72 65 6d 65 6e 74 20 62 79 20 74 68 65 20 77  urement by the w
15490 6f 72 64 73 20 72 61 6e 6b 20 69 6e 20 6f 72 64  ords rank in ord
154a0 65 72 20 74 6f 20 73 68 6f 77 0a 2a 2a 20 70 72  er to show.** pr
154b0 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6d 6d  eference to comm
154c0 6f 6e 20 77 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61  on words..*/.sta
154d0 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
154e0 31 53 63 6f 72 65 28 69 6e 74 20 69 44 69 73 74  1Score(int iDist
154f0 61 6e 63 65 2c 20 69 6e 74 20 69 52 61 6e 6b 29  ance, int iRank)
15500 7b 0a 20 20 69 6e 74 20 69 4c 6f 67 32 3b 0a 20  {.  int iLog2;. 
15510 20 66 6f 72 28 69 4c 6f 67 32 3d 30 3b 20 69 52   for(iLog2=0; iR
15520 61 6e 6b 3e 30 3b 20 69 4c 6f 67 32 2b 2b 2c 20  ank>0; iLog2++, 
15530 69 52 61 6e 6b 3e 3e 3d 31 29 7b 7d 0a 20 20 72  iRank>>=1){}.  r
15540 65 74 75 72 6e 20 69 44 69 73 74 61 6e 63 65 20  eturn iDistance 
15550 2b 20 33 32 20 2d 20 69 4c 6f 67 32 3b 0a 7d 0a  + 32 - iLog2;.}.
15560 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
15570 77 6f 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77  wo spellfix1_row
15580 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 73 6f 72   objects for sor
15590 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69 6e  ting purposes in
155a0 20 71 73 6f 72 74 28 29 20 73 75 63 68 0a 2a 2a   qsort() such.**
155b0 20 74 68 61 74 20 74 68 65 79 20 73 6f 72 74 20   that they sort 
155c0 69 6e 20 6f 72 64 65 72 20 6f 66 20 69 6e 63 72  in order of incr
155d0 65 61 73 69 6e 67 20 64 69 73 74 61 6e 63 65 2e  easing distance.
155e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
155f0 70 65 6c 6c 66 69 78 31 52 6f 77 43 6f 6d 70 61  pellfix1RowCompa
15600 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 41  re(const void *A
15610 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 42 29  , const void *B)
15620 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  {.  const struct
15630 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a   spellfix1_row *
15640 61 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 75 63  a = (const struc
15650 74 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 2a  t spellfix1_row*
15660 29 41 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  )A;.  const stru
15670 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77  ct spellfix1_row
15680 20 2a 62 20 3d 20 28 63 6f 6e 73 74 20 73 74 72   *b = (const str
15690 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f  uct spellfix1_ro
156a0 77 2a 29 42 3b 0a 20 20 72 65 74 75 72 6e 20 61  w*)B;.  return a
156b0 2d 3e 69 53 63 6f 72 65 20 2d 20 62 2d 3e 69 53  ->iScore - b->iS
156c0 63 6f 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  core;.}../*.** A
156d0 20 73 74 72 75 63 74 75 72 65 20 75 73 65 64 20   structure used 
156e0 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74  to pass informat
156f0 69 6f 6e 20 66 72 6f 6d 20 73 70 65 6c 6c 66 69  ion from spellfi
15700 78 31 46 69 6c 74 65 72 46 6f 72 4d 61 74 63 68  x1FilterForMatch
15710 28 29 0a 2a 2a 20 69 6e 74 6f 20 73 70 65 6c 6c  ().** into spell
15720 66 69 78 31 52 75 6e 51 75 65 72 79 28 29 2e 0a  fix1RunQuery()..
15730 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
15740 74 20 4d 61 74 63 68 51 75 65 72 79 20 7b 0a 20  t MatchQuery {. 
15750 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
15760 72 20 2a 70 43 75 72 3b 20 20 20 20 20 20 20 20  r *pCur;        
15770 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
15780 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
15790 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
157a0 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
157b0 20 20 20 20 2f 2a 20 73 68 61 64 6f 77 20 74 61      /* shadow ta
157c0 62 6c 65 20 71 75 65 72 79 20 73 74 61 74 6d 65  ble query statme
157d0 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a 48 61  nt */.  char zHa
157e0 73 68 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48  sh[SPELLFIX_MX_H
157f0 41 53 48 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20  ASH];    /* The 
15800 63 75 72 72 65 6e 74 20 70 68 6f 6e 65 68 61 73  current phonehas
15810 68 20 66 6f 72 20 7a 50 61 74 74 65 72 6e 20 2a  h for zPattern *
15820 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
15830 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20  zPattern;       
15840 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 69 74       /* Translit
15850 65 72 61 74 65 64 20 69 6e 70 75 74 20 73 74 72  erated input str
15860 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ing */.  int nPa
15870 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20  ttern;          
15880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
15890 67 74 68 20 6f 66 20 7a 50 61 74 74 65 72 6e 20  gth of zPattern 
158a0 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 46 72  */.  EditDist3Fr
158b0 6f 6d 53 74 72 69 6e 67 20 2a 70 4d 61 74 63 68  omString *pMatch
158c0 53 74 72 33 3b 20 2f 2a 20 4f 72 69 67 69 6e 61  Str3; /* Origina
158d0 6c 20 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67  l unicode string
158e0 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43   */.  EditDist3C
158f0 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 33 3b  onfig *pConfig3;
15900 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 2d 64         /* Edit-d
15910 69 73 74 61 6e 63 65 20 63 6f 73 74 20 63 6f 65  istance cost coe
15920 66 66 69 63 69 65 6e 74 73 20 2a 2f 0a 20 20 63  fficients */.  c
15930 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c 61  onst EditDist3La
15940 6e 67 20 2a 70 4c 61 6e 67 3b 20 20 20 20 20 20  ng *pLang;      
15950 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65 64 20  /* The selected 
15960 6c 61 6e 67 75 61 67 65 20 63 6f 65 66 66 69 63  language coeffic
15970 69 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ients */.  int i
15980 4c 61 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20  Lang;           
15990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
159a0 68 65 20 6c 61 6e 67 75 61 67 65 20 69 64 20 2a  he language id *
159b0 2f 0a 20 20 69 6e 74 20 69 53 63 6f 70 65 3b 20  /.  int iScope; 
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
159e0 73 63 6f 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69  scope */.  int i
159f0 4d 61 78 44 69 73 74 3b 20 20 20 20 20 20 20 20  MaxDist;        
15a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
15a10 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65  aximum allowed e
15a20 64 69 74 20 64 69 73 74 61 6e 63 65 2c 20 6f 72  dit distance, or
15a30 20 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b   -1 */.  int rc;
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
15a60 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
15a70 20 6e 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20   nRun;          
15a80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15a90 72 20 6f 66 20 70 72 69 6f 72 20 72 75 6e 73 20  r of prior runs 
15aa0 66 6f 72 20 74 68 65 20 73 61 6d 65 20 7a 50 61  for the same zPa
15ab0 74 74 65 72 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ttern */.  char 
15ac0 61 7a 50 72 69 6f 72 5b 53 50 45 4c 4c 46 49 58  azPrior[SPELLFIX
15ad0 5f 4d 58 5f 52 55 4e 5d 5b 53 50 45 4c 4c 46 49  _MX_RUN][SPELLFI
15ae0 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 20 2f 2a 20  X_MX_HASH];  /* 
15af0 50 72 69 6f 72 20 68 61 73 68 65 73 20 2a 2f 0a  Prior hashes */.
15b00 7d 20 4d 61 74 63 68 51 75 65 72 79 3b 0a 0a 2f  } MatchQuery;../
15b10 2a 0a 2a 2a 20 52 75 6e 20 61 20 71 75 65 72 79  *.** Run a query
15b20 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65   looking for the
15b30 20 62 65 73 74 20 6d 61 74 63 68 65 73 20 61 67   best matches ag
15b40 61 69 6e 73 74 20 7a 50 61 74 74 65 72 6e 20 75  ainst zPattern u
15b50 73 69 6e 67 0a 2a 2a 20 7a 48 61 73 68 20 61 73  sing.** zHash as
15b60 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 63   the character c
15b70 6c 61 73 73 20 73 65 65 64 20 68 61 73 68 2e 0a  lass seed hash..
15b80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
15b90 70 65 6c 6c 66 69 78 31 52 75 6e 51 75 65 72 79  pellfix1RunQuery
15ba0 28 4d 61 74 63 68 51 75 65 72 79 20 2a 70 2c 20  (MatchQuery *p, 
15bb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65  const char *zQue
15bc0 72 79 2c 20 69 6e 74 20 6e 51 75 65 72 79 29 7b  ry, int nQuery){
15bd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15be0 4b 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  K1;.  const char
15bf0 20 2a 7a 57 6f 72 64 3b 0a 20 20 69 6e 74 20 69   *zWord;.  int i
15c00 44 69 73 74 3b 0a 20 20 69 6e 74 20 69 52 61 6e  Dist;.  int iRan
15c10 6b 3b 0a 20 20 69 6e 74 20 69 53 63 6f 72 65 3b  k;.  int iScore;
15c20 0a 20 20 69 6e 74 20 69 57 6f 72 73 74 20 3d 20  .  int iWorst = 
15c30 30 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  0;.  int idx;.  
15c40 69 6e 74 20 69 64 78 57 6f 72 73 74 20 3d 20 2d  int idxWorst = -
15c50 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  1;.  int i;.  in
15c60 74 20 69 53 63 6f 70 65 20 3d 20 70 2d 3e 69 53  t iScope = p->iS
15c70 63 6f 70 65 3b 0a 20 20 73 70 65 6c 6c 66 69 78  cope;.  spellfix
15c80 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  1_cursor *pCur =
15c90 20 70 2d 3e 70 43 75 72 3b 0a 20 20 73 71 6c 69   p->pCur;.  sqli
15ca0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
15cb0 3d 20 70 2d 3e 70 53 74 6d 74 3b 0a 20 20 63 68  = p->pStmt;.  ch
15cc0 61 72 20 7a 48 61 73 68 31 5b 53 50 45 4c 4c 46  ar zHash1[SPELLF
15cd0 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 0a 20 20 63  IX_MX_HASH];.  c
15ce0 68 61 72 20 7a 48 61 73 68 32 5b 53 50 45 4c 4c  har zHash2[SPELL
15cf0 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 0a 20 20  FIX_MX_HASH];.  
15d00 63 68 61 72 20 2a 7a 43 6c 61 73 73 3b 0a 20 20  char *zClass;.  
15d10 69 6e 74 20 6e 43 6c 61 73 73 3b 0a 0a 20 20 69  int nClass;..  i
15d20 66 28 20 70 43 75 72 2d 3e 61 3d 3d 30 20 7c 7c  f( pCur->a==0 ||
15d30 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
15d40 20 20 20 2f 2a 20 50 72 69 6f 72 20 6d 65 6d 6f     /* Prior memo
15d50 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
15d60 69 6c 75 72 65 20 2a 2f 0a 20 20 69 66 28 20 70  ilure */.  if( p
15d70 2d 3e 6e 52 75 6e 3e 3d 53 50 45 4c 4c 46 49 58  ->nRun>=SPELLFIX
15d80 5f 4d 58 5f 52 55 4e 20 29 20 72 65 74 75 72 6e  _MX_RUN ) return
15d90 3b 0a 20 20 7a 43 6c 61 73 73 20 3d 20 28 63 68  ;.  zClass = (ch
15da0 61 72 2a 29 70 68 6f 6e 65 74 69 63 48 61 73 68  ar*)phoneticHash
15db0 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
15dc0 29 7a 51 75 65 72 79 2c 20 6e 51 75 65 72 79 29  )zQuery, nQuery)
15dd0 3b 0a 20 20 69 66 28 20 7a 43 6c 61 73 73 3d 3d  ;.  if( zClass==
15de0 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  0 ){.    p->rc =
15df0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15e00 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
15e10 20 6e 43 6c 61 73 73 20 3d 20 73 74 72 6c 65 6e   nClass = strlen
15e20 28 7a 43 6c 61 73 73 29 3b 0a 20 20 69 66 28 20  (zClass);.  if( 
15e30 6e 43 6c 61 73 73 3e 53 50 45 4c 4c 46 49 58 5f  nClass>SPELLFIX_
15e40 4d 58 5f 48 41 53 48 2d 32 20 29 7b 0a 20 20 20  MX_HASH-2 ){.   
15e50 20 6e 43 6c 61 73 73 20 3d 20 53 50 45 4c 4c 46   nClass = SPELLF
15e60 49 58 5f 4d 58 5f 48 41 53 48 2d 32 3b 0a 20 20  IX_MX_HASH-2;.  
15e70 20 20 7a 43 6c 61 73 73 5b 6e 43 6c 61 73 73 5d    zClass[nClass]
15e80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
15e90 6e 43 6c 61 73 73 3c 3d 69 53 63 6f 70 65 20 29  nClass<=iScope )
15ea0 7b 0a 20 20 20 20 69 66 28 20 6e 43 6c 61 73 73  {.    if( nClass
15eb0 3e 32 20 29 7b 0a 20 20 20 20 20 20 69 53 63 6f  >2 ){.      iSco
15ec0 70 65 20 3d 20 6e 43 6c 61 73 73 2d 31 3b 0a 20  pe = nClass-1;. 
15ed0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15ee0 69 53 63 6f 70 65 20 3d 20 6e 43 6c 61 73 73 3b  iScope = nClass;
15ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d  .    }.  }.  mem
15f00 63 70 79 28 7a 48 61 73 68 31 2c 20 7a 43 6c 61  cpy(zHash1, zCla
15f10 73 73 2c 20 69 53 63 6f 70 65 29 3b 0a 20 20 73  ss, iScope);.  s
15f20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6c 61  qlite3_free(zCla
15f30 73 73 29 3b 0a 20 20 7a 48 61 73 68 31 5b 69 53  ss);.  zHash1[iS
15f40 63 6f 70 65 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  cope] = 0;.  mem
15f50 63 70 79 28 7a 48 61 73 68 32 2c 20 7a 48 61 73  cpy(zHash2, zHas
15f60 68 31 2c 20 69 53 63 6f 70 65 29 3b 0a 20 20 7a  h1, iScope);.  z
15f70 48 61 73 68 32 5b 69 53 63 6f 70 65 5d 20 3d 20  Hash2[iScope] = 
15f80 27 5a 27 3b 0a 20 20 7a 48 61 73 68 32 5b 69 53  'Z';.  zHash2[iS
15f90 63 6f 70 65 2b 31 5d 20 3d 20 30 3b 0a 20 20 66  cope+1] = 0;.  f
15fa0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 75  or(i=0; i<p->nRu
15fb0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
15fc0 20 73 74 72 63 6d 70 28 70 2d 3e 61 7a 50 72 69   strcmp(p->azPri
15fd0 6f 72 5b 69 5d 2c 20 7a 48 61 73 68 31 29 3d 3d  or[i], zHash1)==
15fe0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
15ff0 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 50 72    memcpy(p->azPr
16000 69 6f 72 5b 70 2d 3e 6e 52 75 6e 2b 2b 5d 2c 20  ior[p->nRun++], 
16010 7a 48 61 73 68 31 2c 20 69 53 63 6f 70 65 2b 31  zHash1, iScope+1
16020 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
16030 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
16040 20 7a 48 61 73 68 31 2c 20 2d 31 2c 20 53 51 4c   zHash1, -1, SQL
16050 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
16060 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
16070 28 70 53 74 6d 74 2c 20 32 2c 20 7a 48 61 73 68  (pStmt, 2, zHash
16080 32 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  2, -1, SQLITE_ST
16090 41 54 49 43 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ATIC);.  for(i=0
160a0 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20  ; i<pCur->nRow; 
160b0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43  i++){.    if( pC
160c0 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72 65 3e  ur->a[i].iScore>
160d0 69 57 6f 72 73 74 20 29 7b 0a 20 20 20 20 20 20  iWorst ){.      
160e0 69 57 6f 72 73 74 20 3d 20 70 43 75 72 2d 3e 61  iWorst = pCur->a
160f0 5b 69 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20 20  [i].iScore;.    
16100 20 20 69 64 78 57 6f 72 73 74 20 3d 20 69 3b 0a    idxWorst = i;.
16110 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c      }.  }.  whil
16120 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
16130 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
16140 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d  OW ){.    int iM
16150 61 74 63 68 6c 65 6e 20 3d 20 2d 31 3b 0a 20 20  atchlen = -1;.  
16160 20 20 69 52 61 6e 6b 20 3d 20 73 71 6c 69 74 65    iRank = sqlite
16170 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
16180 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20  mt, 2);.    if( 
16190 70 2d 3e 70 4d 61 74 63 68 53 74 72 33 20 29 7b  p->pMatchStr3 ){
161a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 6f 72 64  .      int nWord
161b0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
161c0 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31  n_bytes(pStmt, 1
161d0 29 3b 0a 20 20 20 20 20 20 7a 57 6f 72 64 20 3d  );.      zWord =
161e0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
161f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
16200 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
16210 20 20 20 69 44 69 73 74 20 3d 20 65 64 69 74 44     iDist = editD
16220 69 73 74 33 43 6f 72 65 28 70 2d 3e 70 4d 61 74  ist3Core(p->pMat
16230 63 68 53 74 72 33 2c 20 7a 57 6f 72 64 2c 20 6e  chStr3, zWord, n
16240 57 6f 72 64 2c 20 70 2d 3e 70 4c 61 6e 67 2c 20  Word, p->pLang, 
16250 26 69 4d 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20  &iMatchlen);.   
16260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b   }else{.      zK
16270 31 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  1 = (const char*
16280 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
16290 74 65 78 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  text(pStmt, 3);.
162a0 20 20 20 20 20 20 69 66 28 20 7a 4b 31 3d 3d 30        if( zK1==0
162b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
162c0 20 20 20 69 44 69 73 74 20 3d 20 65 64 69 74 64     iDist = editd
162d0 69 73 74 31 28 70 2d 3e 7a 50 61 74 74 65 72 6e  ist1(p->zPattern
162e0 2c 20 7a 4b 31 2c 20 70 43 75 72 2d 3e 69 4c 61  , zK1, pCur->iLa
162f0 6e 67 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ng, 0);.    }.  
16300 20 20 70 43 75 72 2d 3e 6e 53 65 61 72 63 68 2b    pCur->nSearch+
16310 2b 3b 0a 20 20 20 20 69 53 63 6f 72 65 20 3d 20  +;.    iScore = 
16320 73 70 65 6c 6c 66 69 78 31 53 63 6f 72 65 28 69  spellfix1Score(i
16330 44 69 73 74 2c 69 52 61 6e 6b 29 3b 0a 20 20 20  Dist,iRank);.   
16340 20 69 66 28 20 70 2d 3e 69 4d 61 78 44 69 73 74   if( p->iMaxDist
16350 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
16360 20 69 44 69 73 74 3e 70 2d 3e 69 4d 61 78 44 69   iDist>p->iMaxDi
16370 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
16380 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e       if( pCur->n
16390 52 6f 77 3e 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f  Row>=pCur->nAllo
163a0 63 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  c-1 ){.        s
163b0 70 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75  pellfix1ResizeCu
163c0 72 73 6f 72 28 70 43 75 72 2c 20 70 43 75 72 2d  rsor(pCur, pCur-
163d0 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 29 3b  >nAlloc*2 + 10);
163e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
163f0 72 2d 3e 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b  r->a==0 ) break;
16400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16410 64 78 20 3d 20 70 43 75 72 2d 3e 6e 52 6f 77 3b  dx = pCur->nRow;
16420 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
16430 43 75 72 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d 3e  Cur->nRow<pCur->
16440 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
16450 69 64 78 20 3d 20 70 43 75 72 2d 3e 6e 52 6f 77  idx = pCur->nRow
16460 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16470 69 53 63 6f 72 65 3c 69 57 6f 72 73 74 20 29 7b  iScore<iWorst ){
16480 0a 20 20 20 20 20 20 69 64 78 20 3d 20 69 64 78  .      idx = idx
16490 57 6f 72 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  Worst;.      sql
164a0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
164b0 61 5b 69 64 78 5d 2e 7a 57 6f 72 64 29 3b 0a 20  a[idx].zWord);. 
164c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
164d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
164e0 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d      pCur->a[idx]
164f0 2e 7a 57 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  .zWord = sqlite3
16500 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73  _mprintf("%s", s
16510 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
16520 78 74 28 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20  xt(pStmt, 1));. 
16530 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e     pCur->a[idx].
16540 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
16550 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
16560 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 43 75  tmt, 0);.    pCu
16570 72 2d 3e 61 5b 69 64 78 5d 2e 69 52 61 6e 6b 20  r->a[idx].iRank 
16580 3d 20 69 52 61 6e 6b 3b 0a 20 20 20 20 70 43 75  = iRank;.    pCu
16590 72 2d 3e 61 5b 69 64 78 5d 2e 69 44 69 73 74 61  r->a[idx].iDista
165a0 6e 63 65 20 3d 20 69 44 69 73 74 3b 0a 20 20 20  nce = iDist;.   
165b0 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 53   pCur->a[idx].iS
165c0 63 6f 72 65 20 3d 20 69 53 63 6f 72 65 3b 0a 20  core = iScore;. 
165d0 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e     pCur->a[idx].
165e0 69 4d 61 74 63 68 6c 65 6e 20 3d 20 69 4d 61 74  iMatchlen = iMat
165f0 63 68 6c 65 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  chlen;.    memcp
16600 79 28 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a  y(pCur->a[idx].z
16610 48 61 73 68 2c 20 7a 48 61 73 68 31 2c 20 69 53  Hash, zHash1, iS
16620 63 6f 70 65 2b 31 29 3b 0a 20 20 20 20 69 66 28  cope+1);.    if(
16630 20 70 43 75 72 2d 3e 6e 52 6f 77 3c 70 43 75 72   pCur->nRow<pCur
16640 2d 3e 6e 41 6c 6c 6f 63 20 29 20 70 43 75 72 2d  ->nAlloc ) pCur-
16650 3e 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRow++;.    if(
16660 20 70 43 75 72 2d 3e 6e 52 6f 77 3d 3d 70 43 75   pCur->nRow==pCu
16670 72 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  r->nAlloc ){.   
16680 20 20 20 69 57 6f 72 73 74 20 3d 20 70 43 75 72     iWorst = pCur
16690 2d 3e 61 5b 30 5d 2e 69 53 63 6f 72 65 3b 0a 20  ->a[0].iScore;. 
166a0 20 20 20 20 20 69 64 78 57 6f 72 73 74 20 3d 20       idxWorst = 
166b0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  0;.      for(i=1
166c0 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20  ; i<pCur->nRow; 
166d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 53  i++){.        iS
166e0 63 6f 72 65 20 3d 20 70 43 75 72 2d 3e 61 5b 69  core = pCur->a[i
166f0 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20  ].iScore;.      
16700 20 20 69 66 28 20 69 57 6f 72 73 74 3c 69 53 63    if( iWorst<iSc
16710 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ore ){.         
16720 20 69 57 6f 72 73 74 20 3d 20 69 53 63 6f 72 65   iWorst = iScore
16730 3b 0a 20 20 20 20 20 20 20 20 20 20 69 64 78 57  ;.          idxW
16740 6f 72 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  orst = i;.      
16750 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16760 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
16770 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 7d 0a  reset(pStmt);.}.
16780 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
16790 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74  ion of the xFilt
167a0 65 72 20 6d 65 74 68 6f 64 20 77 6f 72 6b 20 69  er method work i
167b0 66 20 74 68 65 20 4d 41 54 43 48 20 74 65 72 6d  f the MATCH term
167c0 20 69 73 20 70 72 65 73 65 6e 74 0a 2a 2a 20 61   is present.** a
167d0 6e 64 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  nd we are doing 
167e0 61 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  a scan..*/.stati
167f0 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46  c int spellfix1F
16800 69 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 0a 20  ilterForMatch(. 
16810 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
16820 72 20 2a 70 43 75 72 2c 0a 20 20 69 6e 74 20 69  r *pCur,.  int i
16830 64 78 4e 75 6d 2c 0a 20 20 69 6e 74 20 61 72 67  dxNum,.  int arg
16840 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
16850 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
16860 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
16870 61 72 20 2a 7a 4d 61 74 63 68 54 68 69 73 3b 20  ar *zMatchThis; 
16880 20 20 2f 2a 20 52 48 53 20 6f 66 20 74 68 65 20    /* RHS of the 
16890 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 2a  MATCH operator *
168a0 2f 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f  /.  EditDist3Fro
168b0 6d 53 74 72 69 6e 67 20 2a 70 4d 61 74 63 68 53  mString *pMatchS
168c0 74 72 33 20 3d 20 30 3b 20 2f 2a 20 7a 4d 61 74  tr3 = 0; /* zMat
168d0 63 68 54 68 69 73 20 61 73 20 61 6e 20 65 64 69  chThis as an edi
168e0 74 64 69 73 74 20 73 74 72 69 6e 67 20 2a 2f 0a  tdist string */.
168f0 20 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e    char *zPattern
16900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16910 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 69 74       /* Translit
16920 65 72 61 74 69 6f 6e 20 6f 66 20 7a 4d 61 74 63  eration of zMatc
16930 68 54 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  hThis */.  int n
16940 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20  Pattern;        
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16960 20 4c 65 6e 67 74 68 20 6f 66 20 7a 50 61 74 74   Length of zPatt
16970 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ern */.  int iLi
16980 6d 69 74 20 3d 20 32 30 3b 20 20 20 20 20 20 20  mit = 20;       
16990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
169a0 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ax number of row
169b0 73 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  s of output */. 
169c0 20 69 6e 74 20 69 53 63 6f 70 65 20 3d 20 33 3b   int iScope = 3;
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20      /* Use this 
169f0 6d 61 6e 79 20 63 68 61 72 61 63 74 65 72 73 20  many characters 
16a00 6f 66 20 7a 43 6c 61 73 73 20 2a 2f 0a 20 20 69  of zClass */.  i
16a10 6e 74 20 69 4c 61 6e 67 20 3d 20 30 3b 20 20 20  nt iLang = 0;   
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 63 6f    /* Language co
16a40 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  de */.  char *zS
16a50 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
16a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
16a70 4c 20 6f 66 20 73 68 61 64 6f 77 20 74 61 62 6c  L of shadow tabl
16a80 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
16a90 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
16aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16ab0 2f 2a 20 53 68 61 64 6f 77 20 74 61 62 6c 65 20  /* Shadow table 
16ac0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72  query */.  int r
16ad0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16af0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
16b00 20 20 69 6e 74 20 69 64 78 20 3d 20 31 3b 20 20    int idx = 1;  
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
16b30 69 6c 61 62 6c 65 20 66 69 6c 74 65 72 20 70 61  ilable filter pa
16b40 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 73 70 65  rameter */.  spe
16b50 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d  llfix1_vtab *p =
16b60 20 70 43 75 72 2d 3e 70 56 54 61 62 3b 20 20 20   pCur->pVTab;   
16b70 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 74  /* The virtual t
16b80 61 62 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 70  able that owns p
16b90 43 75 72 20 2a 2f 0a 20 20 4d 61 74 63 68 51 75  Cur */.  MatchQu
16ba0 65 72 79 20 78 3b 20 20 20 20 20 20 20 20 20 20  ery x;          
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16bc0 6f 72 20 70 61 73 73 69 6e 67 20 69 6e 66 6f 20  or passing info 
16bd0 74 6f 20 52 75 6e 51 75 65 72 79 28 29 20 2a 2f  to RunQuery() */
16be0 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
16bf0 63 6f 73 74 20 74 61 62 6c 65 20 69 66 20 77 65  cost table if we
16c00 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
16c10 79 20 64 6f 6e 65 20 73 6f 20 2a 2f 0a 20 20 69  y done so */.  i
16c20 66 28 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65  f( p->zCostTable
16c30 21 3d 30 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69  !=0 && p->pConfi
16c40 67 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  g3==0 ){.    p->
16c50 70 43 6f 6e 66 69 67 33 20 3d 20 73 71 6c 69 74  pConfig3 = sqlit
16c60 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
16c70 66 28 70 2d 3e 70 43 6f 6e 66 69 67 33 5b 30 5d  f(p->pConfig3[0]
16c80 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ) );.    if( p->
16c90 70 43 6f 6e 66 69 67 33 3d 3d 30 20 29 20 72 65  pConfig3==0 ) re
16ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
16cb0 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  M;.    memset(p-
16cc0 3e 70 43 6f 6e 66 69 67 33 2c 20 30 2c 20 73 69  >pConfig3, 0, si
16cd0 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e 66 69 67 33  zeof(p->pConfig3
16ce0 5b 30 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  [0]));.    rc = 
16cf0 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c  editDist3ConfigL
16d00 6f 61 64 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c  oad(p->pConfig3,
16d10 20 70 2d 3e 64 62 2c 20 70 2d 3e 7a 43 6f 73 74   p->db, p->zCost
16d20 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
16d30 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
16d40 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c    }.  memset(&x,
16d50 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
16d60 20 20 78 2e 69 53 63 6f 70 65 20 3d 20 33 3b 20    x.iScope = 3; 
16d70 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 63 6f 70   /* Default scop
16d80 65 20 69 66 20 6e 6f 6e 65 20 73 70 65 63 69 66  e if none specif
16d90 69 65 64 20 62 79 20 22 57 48 45 52 45 20 73 63  ied by "WHERE sc
16da0 6f 70 65 3d 4e 22 20 2a 2f 0a 20 20 78 2e 69 4d  ope=N" */.  x.iM
16db0 61 78 44 69 73 74 20 3d 20 2d 31 3b 20 20 20 2f  axDist = -1;   /
16dc0 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
16dd0 64 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20  d edit distance 
16de0 2a 2f 0a 0a 20 20 69 66 28 20 69 64 78 4e 75 6d  */..  if( idxNum
16df0 26 32 20 29 7b 0a 20 20 20 20 69 4c 61 6e 67 20  &2 ){.    iLang 
16e00 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
16e10 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29  int(argv[idx++])
16e20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78 4e  ;.  }.  if( idxN
16e30 75 6d 26 34 20 29 7b 0a 20 20 20 20 69 4c 69 6d  um&4 ){.    iLim
16e40 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  it = sqlite3_val
16e50 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78 2b  ue_int(argv[idx+
16e60 2b 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 69  +]);.    if( iLi
16e70 6d 69 74 3c 31 20 29 20 69 4c 69 6d 69 74 20 3d  mit<1 ) iLimit =
16e80 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64   1;.  }.  if( id
16e90 78 4e 75 6d 26 38 20 29 7b 0a 20 20 20 20 78 2e  xNum&8 ){.    x.
16ea0 69 53 63 6f 70 65 20 3d 20 73 71 6c 69 74 65 33  iScope = sqlite3
16eb0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
16ec0 69 64 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28  idx++]);.    if(
16ed0 20 78 2e 69 53 63 6f 70 65 3c 31 20 29 20 78 2e   x.iScope<1 ) x.
16ee0 69 53 63 6f 70 65 20 3d 20 31 3b 0a 20 20 20 20  iScope = 1;.    
16ef0 69 66 28 20 78 2e 69 53 63 6f 70 65 3e 53 50 45  if( x.iScope>SPE
16f00 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 20  LLFIX_MX_HASH-2 
16f10 29 20 78 2e 69 53 63 6f 70 65 20 3d 20 53 50 45  ) x.iScope = SPE
16f20 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 3b  LLFIX_MX_HASH-2;
16f30 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78 4e 75  .  }.  if( idxNu
16f40 6d 26 28 31 36 7c 33 32 29 20 29 7b 0a 20 20 20  m&(16|32) ){.   
16f50 20 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 73 71   x.iMaxDist = sq
16f60 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
16f70 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20  argv[idx++]);.  
16f80 20 20 69 66 28 20 69 64 78 4e 75 6d 26 31 36 20    if( idxNum&16 
16f90 29 20 78 2e 69 4d 61 78 44 69 73 74 2d 2d 3b 0a  ) x.iMaxDist--;.
16fa0 20 20 20 20 69 66 28 20 78 2e 69 4d 61 78 44 69      if( x.iMaxDi
16fb0 73 74 3c 30 20 29 20 78 2e 69 4d 61 78 44 69 73  st<0 ) x.iMaxDis
16fc0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 70 65  t = 0;.  }.  spe
16fd0 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f  llfix1ResetCurso
16fe0 72 28 70 43 75 72 29 3b 0a 20 20 73 70 65 6c 6c  r(pCur);.  spell
16ff0 66 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72  fix1ResizeCursor
17000 28 70 43 75 72 2c 20 69 4c 69 6d 69 74 29 3b 0a  (pCur, iLimit);.
17010 20 20 7a 4d 61 74 63 68 54 68 69 73 20 3d 20 73    zMatchThis = s
17020 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
17030 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
17040 28 20 7a 4d 61 74 63 68 54 68 69 73 3d 3d 30 20  ( zMatchThis==0 
17050 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
17060 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f  OK;.  if( p->pCo
17070 6e 66 69 67 33 20 29 7b 0a 20 20 20 20 78 2e 70  nfig3 ){.    x.p
17080 4c 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74 33  Lang = editDist3
17090 46 69 6e 64 4c 61 6e 67 28 70 2d 3e 70 43 6f 6e  FindLang(p->pCon
170a0 66 69 67 33 2c 20 69 4c 61 6e 67 29 3b 0a 20 20  fig3, iLang);.  
170b0 20 20 70 4d 61 74 63 68 53 74 72 33 20 3d 20 65    pMatchStr3 = e
170c0 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
170d0 6e 67 4e 65 77 28 78 2e 70 4c 61 6e 67 2c 20 28  ngNew(x.pLang, (
170e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4d 61 74  const char*)zMat
170f0 63 68 54 68 69 73 2c 20 2d 31 29 3b 0a 20 20 7d  chThis, -1);.  }
17100 65 6c 73 65 7b 0a 20 20 20 20 78 2e 70 4c 61 6e  else{.    x.pLan
17110 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 50 61  g = 0;.  }.  zPa
17120 74 74 65 72 6e 20 3d 20 28 63 68 61 72 2a 29 74  ttern = (char*)t
17130 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a 4d 61  ransliterate(zMa
17140 74 63 68 54 68 69 73 2c 20 73 71 6c 69 74 65 33  tchThis, sqlite3
17150 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
17160 76 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69 74 65  v[0]));.  sqlite
17170 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 7a 50 61  3_free(pCur->zPa
17180 74 74 65 72 6e 29 3b 0a 20 20 70 43 75 72 2d 3e  ttern);.  pCur->
17190 7a 50 61 74 74 65 72 6e 20 3d 20 7a 50 61 74 74  zPattern = zPatt
171a0 65 72 6e 3b 0a 20 20 69 66 28 20 7a 50 61 74 74  ern;.  if( zPatt
171b0 65 72 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ern==0 ) return 
171c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
171d0 6e 50 61 74 74 65 72 6e 20 3d 20 73 74 72 6c 65  nPattern = strle
171e0 6e 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 69  n(zPattern);.  i
171f0 66 28 20 7a 50 61 74 74 65 72 6e 5b 6e 50 61 74  f( zPattern[nPat
17200 74 65 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 20 6e  tern-1]=='*' ) n
17210 50 61 74 74 65 72 6e 2d 2d 3b 0a 20 20 7a 53 71  Pattern--;.  zSq
17220 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
17230 6e 74 66 28 0a 20 20 20 20 20 22 53 45 4c 45 43  ntf(.     "SELEC
17240 54 20 69 64 2c 20 77 6f 72 64 2c 20 72 61 6e 6b  T id, word, rank
17250 2c 20 6b 31 22 0a 20 20 20 20 20 22 20 20 46 52  , k1".     "  FR
17260 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76  OM \"%w\".\"%w_v
17270 6f 63 61 62 5c 22 22 0a 20 20 20 20 20 22 20 57  ocab\"".     " W
17280 48 45 52 45 20 6c 61 6e 67 69 64 3d 25 64 20 41  HERE langid=%d A
17290 4e 44 20 6b 32 3e 3d 3f 31 20 41 4e 44 20 6b 32  ND k2>=?1 AND k2
172a0 3c 3f 32 22 2c 0a 20 20 20 20 20 70 2d 3e 7a 44  <?2",.     p->zD
172b0 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65  bName, p->zTable
172c0 4e 61 6d 65 2c 20 69 4c 61 6e 67 0a 20 20 29 3b  Name, iLang.  );
172d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
172e0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
172f0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
17300 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
17310 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
17320 70 43 75 72 2d 3e 69 4c 61 6e 67 20 3d 20 69 4c  pCur->iLang = iL
17330 61 6e 67 3b 0a 20 20 78 2e 70 43 75 72 20 3d 20  ang;.  x.pCur = 
17340 70 43 75 72 3b 0a 20 20 78 2e 70 53 74 6d 74 20  pCur;.  x.pStmt 
17350 3d 20 70 53 74 6d 74 3b 0a 20 20 78 2e 7a 50 61  = pStmt;.  x.zPa
17360 74 74 65 72 6e 20 3d 20 7a 50 61 74 74 65 72 6e  ttern = zPattern
17370 3b 0a 20 20 78 2e 6e 50 61 74 74 65 72 6e 20 3d  ;.  x.nPattern =
17380 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 78 2e 70   nPattern;.  x.p
17390 4d 61 74 63 68 53 74 72 33 20 3d 20 70 4d 61 74  MatchStr3 = pMat
173a0 63 68 53 74 72 33 3b 0a 20 20 78 2e 69 4c 61 6e  chStr3;.  x.iLan
173b0 67 20 3d 20 69 4c 61 6e 67 3b 0a 20 20 78 2e 72  g = iLang;.  x.r
173c0 63 20 3d 20 72 63 3b 0a 20 20 78 2e 70 43 6f 6e  c = rc;.  x.pCon
173d0 66 69 67 33 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  fig3 = p->pConfi
173e0 67 33 3b 0a 20 20 69 66 28 20 78 2e 72 63 3d 3d  g3;.  if( x.rc==
173f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17400 20 73 70 65 6c 6c 66 69 78 31 52 75 6e 51 75 65   spellfix1RunQue
17410 72 79 28 26 78 2c 20 7a 50 61 74 74 65 72 6e 2c  ry(&x, zPattern,
17420 20 6e 50 61 74 74 65 72 6e 29 3b 0a 20 20 7d 0a   nPattern);.  }.
17430 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43 6f 6e 76  .#if 0.  /* Conv
17440 65 72 74 20 22 67 68 74 22 20 74 6f 20 22 74 22  ert "ght" to "t"
17450 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
17460 20 70 61 74 74 65 72 6e 20 61 6e 64 20 74 72 79   pattern and try
17470 20 61 67 61 69 6e 20 2a 2f 0a 20 20 69 66 28 20   again */.  if( 
17480 78 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  x.rc==SQLITE_OK 
17490 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
174c0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
174d0 20 63 68 61 72 20 7a 51 75 65 72 79 5b 35 30 5d   char zQuery[50]
174e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
174f0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
17500 61 6c 74 65 72 6e 61 74 69 76 65 20 71 75 65 72  alternative quer
17510 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  y string */.    
17520 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 50 61  for(i=j=0; i<nPa
17530 74 74 65 72 6e 20 26 26 20 69 3c 73 69 7a 65 6f  ttern && i<sizeo
17540 66 28 7a 51 75 65 72 79 29 2d 31 3b 20 69 2b 2b  f(zQuery)-1; i++
17550 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 63 20  ){.      char c 
17560 3d 20 7a 50 61 74 74 65 72 6e 5b 69 5d 3b 0a 20  = zPattern[i];. 
17570 20 20 20 20 20 69 66 28 20 63 3d 3d 27 67 27 20       if( c=='g' 
17580 26 26 20 69 3c 6e 50 61 74 74 65 72 6e 2d 32 20  && i<nPattern-2 
17590 26 26 20 7a 50 61 74 74 65 72 6e 5b 69 2b 31 5d  && zPattern[i+1]
175a0 3d 3d 27 68 27 20 26 26 20 7a 50 61 74 74 65 72  =='h' && zPatter
175b0 6e 5b 69 2b 32 5d 3d 3d 27 74 27 20 29 7b 0a 20  n[i+2]=='t' ){. 
175c0 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
175d0 20 20 20 20 20 20 20 63 3d 20 27 74 27 3b 0a 20         c= 't';. 
175e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 51 75       }.      zQu
175f0 65 72 79 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  ery[j++] = c;.  
17600 20 20 7d 0a 20 20 20 20 7a 51 75 65 72 79 5b 6a    }.    zQuery[j
17610 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6a  ] = 0;.    if( j
17620 3c 69 20 29 7b 0a 20 20 20 20 20 20 73 70 65 6c  <i ){.      spel
17630 6c 66 69 78 31 52 75 6e 51 75 65 72 79 28 26 78  lfix1RunQuery(&x
17640 2c 20 7a 51 75 65 72 79 2c 20 6a 29 3b 0a 20 20  , zQuery, j);.  
17650 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
17660 20 20 69 66 28 20 70 43 75 72 2d 3e 61 20 29 7b    if( pCur->a ){
17670 0a 20 20 20 20 71 73 6f 72 74 28 70 43 75 72 2d  .    qsort(pCur-
17680 3e 61 2c 20 70 43 75 72 2d 3e 6e 52 6f 77 2c 20  >a, pCur->nRow, 
17690 73 69 7a 65 6f 66 28 70 43 75 72 2d 3e 61 5b 30  sizeof(pCur->a[0
176a0 5d 29 2c 20 73 70 65 6c 6c 66 69 78 31 52 6f 77  ]), spellfix1Row
176b0 43 6f 6d 70 61 72 65 29 3b 0a 20 20 20 20 70 43  Compare);.    pC
176c0 75 72 2d 3e 69 54 6f 70 20 3d 20 69 4c 69 6d 69  ur->iTop = iLimi
176d0 74 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 53 63  t;.    pCur->iSc
176e0 6f 70 65 20 3d 20 69 53 63 6f 70 65 3b 0a 20 20  ope = iScope;.  
176f0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
17700 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 65  lize(pStmt);.  e
17710 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
17720 6e 67 44 65 6c 65 74 65 28 70 4d 61 74 63 68 53  ngDelete(pMatchS
17730 74 72 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tr3);.  return p
17740 43 75 72 2d 3e 61 20 3f 20 78 2e 72 63 20 3a 20  Cur->a ? x.rc : 
17750 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 7d 0a  SQLITE_NOMEM;.}.
17760 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
17770 69 6f 6e 20 6f 66 20 78 46 69 6c 74 65 72 20 68  ion of xFilter h
17780 61 6e 64 6c 65 73 20 61 20 66 75 6c 6c 2d 74 61  andles a full-ta
17790 62 6c 65 20 73 63 61 6e 20 63 61 73 65 0a 2a 2f  ble scan case.*/
177a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
177b0 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 46 75  lfix1FilterForFu
177c0 6c 6c 53 63 61 6e 28 0a 20 20 73 70 65 6c 6c 66  llScan(.  spellf
177d0 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
177e0 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 0a  ,.  int idxNum,.
177f0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
17800 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
17810 67 76 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  gv.){.  spellfix
17820 31 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75  1ResetCursor(pCu
17830 72 29 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52  r);.  spellfix1R
17840 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72  esizeCursor(pCur
17850 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
17860 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
17870 0a 2a 2a 20 43 61 6c 6c 65 64 20 74 6f 20 22 72  .** Called to "r
17880 65 77 69 6e 64 22 20 61 20 63 75 72 73 6f 72 20  ewind" a cursor 
17890 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
178a0 6e 6e 69 6e 67 20 73 6f 20 74 68 61 74 0a 2a 2a  nning so that.**
178b0 20 69 74 20 73 74 61 72 74 73 20 69 74 73 20 6f   it starts its o
178c0 75 74 70 75 74 20 6f 76 65 72 20 61 67 61 69 6e  utput over again
178d0 2e 20 20 41 6c 77 61 79 73 20 63 61 6c 6c 65 64  .  Always called
178e0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 0a 2a   at least once.*
178f0 2a 20 70 72 69 6f 72 20 74 6f 20 61 6e 79 20 73  * prior to any s
17900 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c 20  pellfix1Column, 
17910 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64 2c 20  spellfix1Rowid, 
17920 6f 72 20 73 70 65 6c 6c 66 69 78 31 45 6f 66 20  or spellfix1Eof 
17930 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
17940 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46 69 6c  int spellfix1Fil
17950 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter(.  sqlite3_v
17960 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
17970 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20   .  int idxNum, 
17980 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
17990 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
179a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
179b0 61 72 67 76 0a 29 7b 0a 20 20 73 70 65 6c 6c 66  argv.){.  spellf
179c0 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
179d0 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75   = (spellfix1_cu
179e0 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 69 6e  rsor *)cur;.  in
179f0 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 78 4e  t rc;.  if( idxN
17a00 75 6d 20 26 20 31 20 29 7b 0a 20 20 20 20 72 63  um & 1 ){.    rc
17a10 20 3d 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74   = spellfix1Filt
17a20 65 72 46 6f 72 4d 61 74 63 68 28 70 43 75 72 2c  erForMatch(pCur,
17a30 20 69 64 78 4e 75 6d 2c 20 61 72 67 63 2c 20 61   idxNum, argc, a
17a40 72 67 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rgv);.  }else{. 
17a50 20 20 20 72 63 20 3d 20 73 70 65 6c 6c 66 69 78     rc = spellfix
17a60 31 46 69 6c 74 65 72 46 6f 72 46 75 6c 6c 53 63  1FilterForFullSc
17a70 61 6e 28 70 43 75 72 2c 20 69 64 78 4e 75 6d 2c  an(pCur, idxNum,
17a80 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 20 20   argc, argv);.  
17a90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17aa0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  .../*.** Advance
17ab0 20 61 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73   a cursor to its
17ac0 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 6f 75 74   next row of out
17ad0 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  put.*/.static in
17ae0 74 20 73 70 65 6c 6c 66 69 78 31 4e 65 78 74 28  t spellfix1Next(
17af0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
17b00 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 70 65  sor *cur){.  spe
17b10 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70  llfix1_cursor *p
17b20 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31  Cur = (spellfix1
17b30 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  _cursor *)cur;. 
17b40 20 69 66 28 20 70 43 75 72 2d 3e 69 52 6f 77 20   if( pCur->iRow 
17b50 3c 20 70 43 75 72 2d 3e 6e 52 6f 77 20 29 20 70  < pCur->nRow ) p
17b60 43 75 72 2d 3e 69 52 6f 77 2b 2b 3b 0a 20 20 72  Cur->iRow++;.  r
17b70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17b80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17b90 20 54 52 55 45 20 69 66 20 77 65 20 61 72 65 20   TRUE if we are 
17ba0 61 74 20 74 68 65 20 65 6e 64 2d 6f 66 2d 66 69  at the end-of-fi
17bb0 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
17bc0 20 73 70 65 6c 6c 66 69 78 31 45 6f 66 28 73 71   spellfix1Eof(sq
17bd0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
17be0 72 20 2a 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c  r *cur){.  spell
17bf0 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75  fix1_cursor *pCu
17c00 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63  r = (spellfix1_c
17c10 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 72  ursor *)cur;.  r
17c20 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 52 6f 77  eturn pCur->iRow
17c30 3e 3d 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 7d 0a  >=pCur->nRow;.}.
17c40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 63 6f  ./*.** Return co
17c50 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 63  lumns from the c
17c60 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73  urrent row..*/.s
17c70 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
17c80 69 78 31 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65  ix1Column(sqlite
17c90 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
17ca0 75 72 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ur, sqlite3_cont
17cb0 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 69 29  ext *ctx, int i)
17cc0 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  {.  spellfix1_cu
17cd0 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70  rsor *pCur = (sp
17ce0 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 2a 29  ellfix1_cursor*)
17cf0 63 75 72 3b 0a 20 20 73 77 69 74 63 68 28 20 69  cur;.  switch( i
17d00 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 50 45   ){.    case SPE
17d10 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 3a 20  LLFIX_COL_WORD: 
17d20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
17d30 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
17d40 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69   pCur->a[pCur->i
17d50 52 6f 77 5d 2e 7a 57 6f 72 64 2c 20 2d 31 2c 20  Row].zWord, -1, 
17d60 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
17d70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17d80 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c   }.    case SPEL
17d90 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b 3a 20 7b  LFIX_COL_RANK: {
17da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
17db0 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70  esult_int(ctx, p
17dc0 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f  Cur->a[pCur->iRo
17dd0 77 5d 2e 69 52 61 6e 6b 29 3b 0a 20 20 20 20 20  w].iRank);.     
17de0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17df0 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f    case SPELLFIX_
17e00 43 4f 4c 5f 44 49 53 54 41 4e 43 45 3a 20 7b 0a  COL_DISTANCE: {.
17e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
17e20 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43  sult_int(ctx, pC
17e30 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77  ur->a[pCur->iRow
17e40 5d 2e 69 44 69 73 74 61 6e 63 65 29 3b 0a 20 20  ].iDistance);.  
17e50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17e60 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
17e70 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 3a 20 7b  IX_COL_LANGID: {
17e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
17e90 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70  esult_int(ctx, p
17ea0 43 75 72 2d 3e 69 4c 61 6e 67 29 3b 0a 20 20 20  Cur->iLang);.   
17eb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17ec0 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49      case SPELLFI
17ed0 58 5f 43 4f 4c 5f 53 43 4f 52 45 3a 20 7b 0a 20  X_COL_SCORE: {. 
17ee0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
17ef0 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75  ult_int(ctx, pCu
17f00 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d  r->a[pCur->iRow]
17f10 2e 69 53 63 6f 72 65 29 3b 0a 20 20 20 20 20 20  .iScore);.      
17f20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17f30 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43   case SPELLFIX_C
17f40 4f 4c 5f 4d 41 54 43 48 4c 45 4e 3a 20 7b 0a 20  OL_MATCHLEN: {. 
17f50 20 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c       int iMatchl
17f60 65 6e 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75  en = pCur->a[pCu
17f70 72 2d 3e 69 52 6f 77 5d 2e 69 4d 61 74 63 68 6c  r->iRow].iMatchl
17f80 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4d  en;.      if( iM
17f90 61 74 63 68 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  atchlen<0 ){.   
17fa0 20 20 20 20 20 69 6e 74 20 6e 50 61 74 74 65 72       int nPatter
17fb0 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 75 72 2d  n = strlen(pCur-
17fc0 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  >zPattern);.    
17fd0 20 20 20 20 63 68 61 72 20 2a 7a 57 6f 72 64 20      char *zWord 
17fe0 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e  = pCur->a[pCur->
17ff0 69 52 6f 77 5d 2e 7a 57 6f 72 64 3b 0a 20 20 20  iRow].zWord;.   
18000 20 20 20 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d       int nWord =
18010 20 73 74 72 6c 65 6e 28 7a 57 6f 72 64 29 3b 0a   strlen(zWord);.
18020 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
18030 74 74 65 72 6e 3e 30 20 26 26 20 70 43 75 72 2d  ttern>0 && pCur-
18040 3e 7a 50 61 74 74 65 72 6e 5b 6e 50 61 74 74 65  >zPattern[nPatte
18050 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20  rn-1]=='*' ){.  
18060 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
18070 72 61 6e 73 6c 69 74 3b 0a 20 20 20 20 20 20 20  ranslit;.       
18080 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
18090 20 20 20 20 20 20 7a 54 72 61 6e 73 6c 69 74 20        zTranslit 
180a0 3d 20 28 63 68 61 72 20 2a 29 74 72 61 6e 73 6c  = (char *)transl
180b0 69 74 65 72 61 74 65 28 28 75 6e 73 69 67 6e 65  iterate((unsigne
180c0 64 20 63 68 61 72 20 2a 29 7a 57 6f 72 64 2c 20  d char *)zWord, 
180d0 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  nWord);.        
180e0 20 20 69 66 28 20 21 7a 54 72 61 6e 73 6c 69 74    if( !zTranslit
180f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18100 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
18110 20 20 72 65 73 20 3d 20 65 64 69 74 64 69 73 74    res = editdist
18120 31 28 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e  1(pCur->zPattern
18130 2c 20 7a 54 72 61 6e 73 6c 69 74 2c 20 70 43 75  , zTranslit, pCu
18140 72 2d 3e 69 4c 61 6e 67 2c 20 26 69 4d 61 74 63  r->iLang, &iMatc
18150 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  hlen);.         
18160 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
18170 72 61 6e 73 6c 69 74 29 3b 0a 20 20 20 20 20 20  ranslit);.      
18180 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20      if( res<0 ) 
18190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
181a0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  MEM;.          i
181b0 4d 61 74 63 68 6c 65 6e 20 3d 20 74 72 61 6e 73  Matchlen = trans
181c0 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65 6e 28 7a  len_to_charlen(z
181d0 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20 69 4d 61  Word, nWord, iMa
181e0 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  tchlen);.       
181f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18200 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 75 74    iMatchlen = ut
18210 66 38 43 68 61 72 6c 65 6e 28 7a 57 6f 72 64 2c  f8Charlen(zWord,
18220 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 20   nWord);.       
18230 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
18240 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
18250 5f 69 6e 74 28 63 74 78 2c 20 69 4d 61 74 63 68  _int(ctx, iMatch
18260 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  len);.      brea
18270 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
18280 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50  e SPELLFIX_COL_P
18290 48 4f 4e 45 48 41 53 48 3a 20 7b 0a 20 20 20 20  HONEHASH: {.    
182a0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
182b0 5f 74 65 78 74 28 63 74 78 2c 20 70 43 75 72 2d  _text(ctx, pCur-
182c0 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a  >a[pCur->iRow].z
182d0 48 61 73 68 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Hash, -1, SQLITE
182e0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
182f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18300 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43   case SPELLFIX_C
18310 4f 4c 5f 54 4f 50 3a 20 7b 0a 20 20 20 20 20 20  OL_TOP: {.      
18320 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
18330 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 69 54  nt(ctx, pCur->iT
18340 6f 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  op);.      break
18350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18360 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43   SPELLFIX_COL_SC
18370 4f 50 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  OPE: {.      sql
18380 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
18390 63 74 78 2c 20 70 43 75 72 2d 3e 69 53 63 6f 70  ctx, pCur->iScop
183a0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
183b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
183c0 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52 43  SPELLFIX_COL_SRC
183d0 48 43 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  HCNT: {.      sq
183e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
183f0 28 63 74 78 2c 20 70 43 75 72 2d 3e 6e 53 65 61  (ctx, pCur->nSea
18400 72 63 68 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rch);.      brea
18410 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
18420 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
18430 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
18440 6c 28 63 74 78 29 3b 0a 20 20 20 20 20 20 62 72  l(ctx);.      br
18450 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
18460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18470 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
18480 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rowid..*/.static
18490 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 6f   int spellfix1Ro
184a0 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  wid(sqlite3_vtab
184b0 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71  _cursor *cur, sq
184c0 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
184d0 69 64 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  id){.  spellfix1
184e0 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
184f0 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
18500 72 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69  r*)cur;.  *pRowi
18510 64 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75 72  d = pCur->a[pCur
18520 2d 3e 69 52 6f 77 5d 2e 69 52 6f 77 69 64 3b 0a  ->iRow].iRowid;.
18530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18540 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
18550 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f   xUpdate() metho
18560 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18570 20 73 70 65 6c 6c 66 69 78 31 55 70 64 61 74 65   spellfix1Update
18580 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
18590 20 2a 70 56 54 61 62 2c 0a 20 20 69 6e 74 20 61   *pVTab,.  int a
185a0 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
185b0 61 6c 75 65 20 2a 2a 61 72 67 76 2c 0a 20 20 73  alue **argv,.  s
185c0 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
185d0 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  wid.){.  int rc 
185e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
185f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 6f 77  qlite3_int64 row
18600 69 64 2c 20 6e 65 77 52 6f 77 69 64 3b 0a 20 20  id, newRowid;.  
18610 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a  spellfix1_vtab *
18620 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76  p = (spellfix1_v
18630 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 73 71  tab*)pVTab;.  sq
18640 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
18650 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  b;..  if( argc==
18660 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 64 65  1 ){.    /* A de
18670 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f  lete operation o
18680 6e 20 74 68 65 20 72 6f 77 69 64 20 67 69 76 65  n the rowid give
18690 6e 20 62 79 20 61 72 67 76 5b 30 5d 20 2a 2f 0a  n by argv[0] */.
186a0 20 20 20 20 72 6f 77 69 64 20 3d 20 2a 70 52 6f      rowid = *pRo
186b0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
186c0 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
186d0 5d 29 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78  ]);.    spellfix
186e0 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  1DbExec(&rc, db,
186f0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22   "DELETE FROM \"
18700 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c  %w\".\"%w_vocab\
18710 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  " ".            
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
18730 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 2c   WHERE id=%lld",
18740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18750 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70     p->zDbName, p
18760 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 72 6f  ->zTableName, ro
18770 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  wid);.  }else{. 
18780 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
18790 64 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20  d char *zWord = 
187a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
187b0 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  xt(argv[SPELLFIX
187c0 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a 20  _COL_WORD+2]);. 
187d0 20 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 73     int nWord = s
187e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
187f0 65 73 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  es(argv[SPELLFIX
18800 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a 20  _COL_WORD+2]);. 
18810 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 73     int iLang = s
18820 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
18830 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43  (argv[SPELLFIX_C
18840 4f 4c 5f 4c 41 4e 47 49 44 2b 32 5d 29 3b 0a 20  OL_LANGID+2]);. 
18850 20 20 20 69 6e 74 20 69 52 61 6e 6b 20 3d 20 73     int iRank = s
18860 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
18870 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43  (argv[SPELLFIX_C
18880 4f 4c 5f 52 41 4e 4b 2b 32 5d 29 3b 0a 20 20 20  OL_RANK+2]);.   
18890 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
188a0 63 68 61 72 20 2a 7a 53 6f 75 6e 64 73 6c 69 6b  char *zSoundslik
188b0 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  e =.           s
188c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
188d0 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  t(argv[SPELLFIX_
188e0 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b 32  COL_SOUNDSLIKE+2
188f0 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 53 6f 75  ]);.    int nSou
18900 6e 64 73 6c 69 6b 65 20 3d 20 73 71 6c 69 74 65  ndslike = sqlite
18910 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
18920 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  gv[SPELLFIX_COL_
18930 53 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d 29 3b 0a  SOUNDSLIKE+2]);.
18940 20 20 20 20 63 68 61 72 20 2a 7a 4b 31 2c 20 2a      char *zK1, *
18950 7a 4b 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  zK2;.    int i;.
18960 20 20 20 20 63 68 61 72 20 63 3b 0a 0a 20 20 20      char c;..   
18970 20 69 66 28 20 7a 57 6f 72 64 3d 3d 30 20 29 7b   if( zWord==0 ){
18980 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  .      /* Insert
18990 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
189a0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 6c  INSERT INTO tabl
189b0 65 28 63 6f 6d 6d 61 6e 64 29 20 56 41 4c 55 45  e(command) VALUE
189c0 53 28 27 78 79 7a 7a 79 27 29 3b 0a 20 20 20 20  S('xyzzy');.    
189d0 20 20 2a 2a 20 63 61 75 73 65 20 7a 57 6f 72 64    ** cause zWord
189e0 20 74 6f 20 62 65 20 4e 55 4c 4c 2c 20 73 6f 20   to be NULL, so 
189f0 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 22  we look at the "
18a00 63 6f 6d 6d 61 6e 64 22 20 63 6f 6c 75 6d 6e 20  command" column 
18a10 74 6f 20 73 65 65 0a 20 20 20 20 20 20 2a 2a 20  to see.      ** 
18a20 77 68 61 74 20 73 70 65 63 69 61 6c 20 61 63 74  what special act
18a30 69 6f 6e 73 20 74 6f 20 74 61 6b 65 20 2a 2f 0a  ions to take */.
18a40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
18a50 20 2a 7a 43 6d 64 20 3d 20 0a 20 20 20 20 20 20   *zCmd = .      
18a60 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29     (const char*)
18a70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
18a80 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  xt(argv[SPELLFIX
18a90 5f 43 4f 4c 5f 43 4f 4d 4d 41 4e 44 2b 32 5d 29  _COL_COMMAND+2])
18aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6d 64  ;.      if( zCmd
18ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
18ac0 56 54 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  VTab->zErrMsg = 
18ad0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
18ae0 22 25 73 2e 77 6f 72 64 20 6d 61 79 20 6e 6f 74  "%s.word may not
18af0 20 62 65 20 4e 55 4c 4c 22 2c 0a 20 20 20 20 20   be NULL",.     
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b20 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d      p->zTableNam
18b30 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
18b40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
18b50 41 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  AINT;.      }.  
18b60 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
18b70 43 6d 64 2c 22 72 65 73 65 74 22 29 3d 3d 30 20  Cmd,"reset")==0 
18b80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
18b90 73 65 74 20 74 68 65 20 20 65 64 69 74 20 63 6f  set the  edit co
18ba0 73 74 20 74 61 62 6c 65 20 28 69 66 20 74 68 65  st table (if the
18bb0 72 65 20 69 73 20 6f 6e 65 29 2e 20 2a 2f 0a 20  re is one). */. 
18bc0 20 20 20 20 20 20 20 65 64 69 74 44 69 73 74 33         editDist3
18bd0 43 6f 6e 66 69 67 44 65 6c 65 74 65 28 70 2d 3e  ConfigDelete(p->
18be0 70 43 6f 6e 66 69 67 33 29 3b 0a 20 20 20 20 20  pConfig3);.     
18bf0 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d     p->pConfig3 =
18c00 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
18c10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18c20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 56 54 61      }.      pVTa
18c30 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  b->zErrMsg = sql
18c40 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e  ite3_mprintf("un
18c50 6b 6e 6f 77 6e 20 76 61 6c 75 65 20 66 6f 72 20  known value for 
18c60 25 73 2e 63 6f 6d 6d 61 6e 64 3a 20 5c 22 25 77  %s.command: \"%w
18c70 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c90 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
18ca0 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 43 6d 64 29  TableName, zCmd)
18cb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
18cc0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
18cd0 20 7d 0a 20 20 20 20 69 66 28 20 69 52 61 6e 6b   }.    if( iRank
18ce0 3c 31 20 29 20 69 52 61 6e 6b 20 3d 20 31 3b 0a  <1 ) iRank = 1;.
18cf0 20 20 20 20 69 66 28 20 7a 53 6f 75 6e 64 73 6c      if( zSoundsl
18d00 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 7a 4b 31  ike ){.      zK1
18d10 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c   = (char*)transl
18d20 69 74 65 72 61 74 65 28 7a 53 6f 75 6e 64 73 6c  iterate(zSoundsl
18d30 69 6b 65 2c 20 6e 53 6f 75 6e 64 73 6c 69 6b 65  ike, nSoundslike
18d40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18d50 20 20 20 20 7a 4b 31 20 3d 20 28 63 68 61 72 2a      zK1 = (char*
18d60 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a  )transliterate(z
18d70 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20 20  Word, nWord);.  
18d80 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4b 31 3d    }.    if( zK1=
18d90 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18da0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 66 6f  TE_NOMEM;.    fo
18db0 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 4b 31 5b  r(i=0; (c = zK1[
18dc0 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
18dd0 20 20 20 20 20 69 66 28 20 63 3e 3d 27 41 27 20       if( c>='A' 
18de0 26 26 20 63 3c 3d 27 5a 27 20 29 20 7a 4b 31 5b  && c<='Z' ) zK1[
18df0 69 5d 20 2b 3d 20 27 61 27 20 2d 20 27 41 27 3b  i] += 'a' - 'A';
18e00 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4b 32 20 3d  .    }.    zK2 =
18e10 20 28 63 68 61 72 2a 29 70 68 6f 6e 65 74 69 63   (char*)phonetic
18e20 48 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69  Hash((const unsi
18e30 67 6e 65 64 20 63 68 61 72 2a 29 7a 4b 31 2c 20  gned char*)zK1, 
18e40 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 4b 32 3d  i);.    if( zK2=
18e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
18e60 74 65 33 5f 66 72 65 65 28 7a 4b 31 29 3b 0a 20  te3_free(zK1);. 
18e70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18e80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
18e90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
18ea0 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
18eb0 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
18ec0 20 29 7b 0a 20 20 20 20 20 20 73 70 65 6c 6c 66   ){.      spellf
18ed0 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64  ix1DbExec(&rc, d
18ee0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
18ef0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25  "INSERT INTO \"%
18f00 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22  w\".\"%w_vocab\"
18f10 28 72 61 6e 6b 2c 6c 61 6e 67 69 64 2c 77 6f 72  (rank,langid,wor
18f20 64 2c 6b 31 2c 6b 32 29 20 22 0a 20 20 20 20 20  d,k1,k2) ".     
18f30 20 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28          "VALUES(
18f40 25 64 2c 25 64 2c 25 51 2c 25 51 2c 25 51 29 22  %d,%d,%Q,%Q,%Q)"
18f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
18f60 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54  ->zDbName, p->zT
18f70 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  ableName,.      
18f80 20 20 20 20 20 20 20 69 52 61 6e 6b 2c 20 69 4c         iRank, iL
18f90 61 6e 67 2c 20 7a 57 6f 72 64 2c 20 7a 4b 31 2c  ang, zWord, zK1,
18fa0 20 7a 4b 32 0a 20 20 20 20 20 20 29 3b 0a 20 20   zK2.      );.  
18fb0 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 73 71      *pRowid = sq
18fc0 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
18fd0 74 5f 72 6f 77 69 64 28 64 62 29 3b 0a 20 20 20  t_rowid(db);.   
18fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 6f   }else{.      ro
18ff0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
19000 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
19010 5d 29 3b 0a 20 20 20 20 20 20 6e 65 77 52 6f 77  ]);.      newRow
19020 69 64 20 3d 20 2a 70 52 6f 77 69 64 20 3d 20 73  id = *pRowid = s
19030 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
19040 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  64(argv[1]);.   
19050 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78     spellfix1DbEx
19060 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20  ec(&rc, db,.    
19070 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45           "UPDATE
19080 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63   \"%w\".\"%w_voc
19090 61 62 5c 22 20 53 45 54 20 69 64 3d 25 6c 6c 64  ab\" SET id=%lld
190a0 2c 20 72 61 6e 6b 3d 25 64 2c 20 6c 61 6e 67 3d  , rank=%d, lang=
190b0 25 64 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20  %d,".           
190c0 20 20 22 20 77 6f 72 64 3d 25 51 2c 20 72 61 6e    " word=%Q, ran
190d0 6b 3d 25 64 2c 20 6b 31 3d 25 51 2c 20 6b 32 3d  k=%d, k1=%Q, k2=
190e0 25 51 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64  %Q WHERE id=%lld
190f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19100 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a  p->zDbName, p->z
19110 54 61 62 6c 65 4e 61 6d 65 2c 20 6e 65 77 52 6f  TableName, newRo
19120 77 69 64 2c 20 69 52 61 6e 6b 2c 20 69 4c 61 6e  wid, iRank, iLan
19130 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
19140 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 4b 32 2c  zWord, zK1, zK2,
19150 20 72 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a   rowid.      );.
19160 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19170 33 5f 66 72 65 65 28 7a 4b 31 29 3b 0a 20 20 20  3_free(zK1);.   
19180 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b   sqlite3_free(zK
19190 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  2);.  }.  return
191a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
191b0 6e 61 6d 65 20 74 68 65 20 73 70 65 6c 6c 66 69  name the spellfi
191c0 78 31 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  x1 table..*/.sta
191d0 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
191e0 31 52 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  1Rename(sqlite3_
191f0 76 74 61 62 20 2a 70 56 54 61 62 2c 20 63 6f 6e  vtab *pVTab, con
19200 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 29 7b 0a  st char *zNew){.
19210 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62    spellfix1_vtab
19220 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31   *p = (spellfix1
19230 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20  _vtab*)pVTab;.  
19240 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
19250 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
19260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
19270 72 20 2a 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71  r *zNewName = sq
19280 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
19290 73 22 2c 20 7a 4e 65 77 29 3b 0a 20 20 69 66 28  s", zNew);.  if(
192a0 20 7a 4e 65 77 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zNewName==0 ){.
192b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
192c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
192d0 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26  pellfix1DbExec(&
192e0 72 63 2c 20 64 62 2c 20 0a 20 20 20 20 20 22 41  rc, db, .     "A
192f0 4c 54 45 52 20 54 41 42 4c 45 20 5c 22 25 77 5c  LTER TABLE \"%w\
19300 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 20 52  ".\"%w_vocab\" R
19310 45 4e 41 4d 45 20 54 4f 20 5c 22 25 77 5f 76 6f  ENAME TO \"%w_vo
19320 63 61 62 5c 22 22 2c 0a 20 20 20 20 20 70 2d 3e  cab\"",.     p->
19330 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62  zDbName, p->zTab
19340 6c 65 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65  leName, zNewName
19350 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
19360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19370 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
19380 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20  >zTableName);.  
19390 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 20    p->zTableName 
193a0 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 7d 0a  = zNewName;.  }.
193b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
193c0 0a 2f 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c  ./*.** A virtual
193d0 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68   table module th
193e0 61 74 20 70 72 6f 76 69 64 65 73 20 66 75 7a 7a  at provides fuzz
193f0 79 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61  y search..*/.sta
19400 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
19410 6c 65 20 73 70 65 6c 6c 66 69 78 31 4d 6f 64 75  le spellfix1Modu
19420 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19440 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
19450 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 72 65 61  .  spellfix1Crea
19460 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  te,         /* x
19470 43 72 65 61 74 65 20 2d 20 68 61 6e 64 6c 65 20  Create - handle 
19480 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
19490 41 42 4c 45 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  ABLE */.  spellf
194a0 69 78 31 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  ix1Connect,     
194b0 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d     /* xConnect -
194c0 20 72 65 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20   reconnected to 
194d0 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
194e0 65 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  e */.  spellfix1
194f0 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
19500 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20  /* xBestIndex - 
19510 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74  figure out how t
19520 6f 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a  o do a query */.
19530 20 20 73 70 65 6c 6c 66 69 78 31 44 69 73 63 6f    spellfix1Disco
19540 6e 6e 65 63 74 2c 20 20 20 20 20 2f 2a 20 78 44  nnect,     /* xD
19550 69 73 63 6f 6e 6e 65 63 74 20 2d 20 63 6c 6f 73  isconnect - clos
19560 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  e a connection *
19570 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 44 65 73  /.  spellfix1Des
19580 74 72 6f 79 2c 20 20 20 20 20 20 20 20 2f 2a 20  troy,        /* 
19590 78 44 65 73 74 72 6f 79 20 2d 20 68 61 6e 64 6c  xDestroy - handl
195a0 65 20 44 52 4f 50 20 54 41 42 4c 45 20 2a 2f 0a  e DROP TABLE */.
195b0 20 20 73 70 65 6c 6c 66 69 78 31 4f 70 65 6e 2c    spellfix1Open,
195c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
195d0 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72  pen - open a cur
195e0 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  sor */.  spellfi
195f0 78 31 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  x1Close,        
19600 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
19610 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
19620 20 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65    spellfix1Filte
19630 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46  r,         /* xF
19640 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
19650 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
19660 74 73 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  ts */.  spellfix
19670 31 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  1Next,          
19680 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
19690 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
196a0 20 20 73 70 65 6c 6c 66 69 78 31 45 6f 66 2c 20    spellfix1Eof, 
196b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45             /* xE
196c0 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65  of - check for e
196d0 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20  nd of scan */.  
196e0 73 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c  spellfix1Column,
196f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
19700 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
19710 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 6f  */.  spellfix1Ro
19720 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  wid,          /*
19730 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
19740 61 74 61 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  ata */.  spellfi
19750 78 31 55 70 64 61 74 65 2c 20 20 20 20 20 20 20  x1Update,       
19760 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a    /* xUpdate */.
19770 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
19780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
19790 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  egin */.  0,    
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197b0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
197c0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
197d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
197e0 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  mmit */.  0,    
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
19810 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19830 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a   xFindMethod */.
19840 20 20 73 70 65 6c 6c 66 69 78 31 52 65 6e 61 6d    spellfix1Renam
19850 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52  e,         /* xR
19860 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ename */.};../*.
19870 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
19880 76 61 72 69 6f 75 73 20 66 75 6e 63 74 69 6f 6e  various function
19890 73 20 61 6e 64 20 74 68 65 20 76 69 72 74 75 61  s and the virtua
198a0 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
198b0 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
198c0 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
198d0 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6e 45 72   *db){.  int nEr
198e0 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  r = 0;.  int i;.
198f0 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65    nErr += sqlite
19900 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
19910 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31  n(db, "spellfix1
19920 5f 74 72 61 6e 73 6c 69 74 22 2c 20 31 2c 20 53  _translit", 1, S
19930 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
19940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 20 74 72 61 6e 73 6c 69 74 65 72 61 74 65 53 71   transliterateSq
19970 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
19980 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33 5f  nErr += sqlite3_
19990 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
199a0 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 65  db, "spellfix1_e
199b0 64 69 74 64 69 73 74 22 2c 20 32 2c 20 53 51 4c  ditdist", 2, SQL
199c0 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
199f0 64 69 74 64 69 73 74 53 71 6c 46 75 6e 63 2c 20  ditdistSqlFunc, 
19a00 30 2c 20 30 29 3b 0a 20 20 6e 45 72 72 20 2b 3d  0, 0);.  nErr +=
19a10 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
19a20 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 70  function(db, "sp
19a30 65 6c 6c 66 69 78 31 5f 65 64 69 74 64 69 73 74  ellfix1_editdist
19a40 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
19a50 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 20 20 20 20 65 64 69 74 64 69 73 74          editdist
19a80 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
19a90 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65    nErr += sqlite
19aa0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
19ab0 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31  n(db, "spellfix1
19ac0 5f 70 68 6f 6e 65 68 61 73 68 22 2c 20 31 2c 20  _phonehash", 1, 
19ad0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b00 20 20 70 68 6f 6e 65 74 69 63 48 61 73 68 53 71    phoneticHashSq
19b10 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
19b20 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33 5f  nErr += sqlite3_
19b30 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
19b40 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 73  db, "spellfix1_s
19b50 63 72 69 70 74 63 6f 64 65 22 2c 20 31 2c 20 53  criptcode", 1, S
19b60 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b90 20 73 63 72 69 70 74 43 6f 64 65 53 71 6c 46 75   scriptCodeSqlFu
19ba0 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 6e 45 72  nc, 0, 0);.  nEr
19bb0 72 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  r += sqlite3_cre
19bc0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
19bd0 20 22 70 6f 6c 6c 6f 63 6b 5f 73 6b 65 6c 65 74   "pollock_skelet
19be0 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  on", 1, SQLITE_U
19bf0 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 20 20 20 20 20 20 20 20 20 70 6f 6c 6c 6f 63            polloc
19c20 6b 53 6b 65 6c 65 74 6f 6e 53 71 6c 46 75 6e 63  kSkeletonSqlFunc
19c30 2c 20 30 2c 20 30 29 3b 0a 20 20 6e 45 72 72 20  , 0, 0);.  nErr 
19c40 2b 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  += sqlite3_creat
19c50 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
19c60 70 6f 6c 6c 6f 63 6b 5f 6f 6d 69 73 73 69 6f 6e  pollock_omission
19c70 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
19c80 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 20 20 20 20 70 6f 6c 6c 6f 63 6b 4f          pollockO
19cb0 6d 69 73 73 69 6f 6e 53 71 6c 46 75 6e 63 2c 20  missionSqlFunc, 
19cc0 30 2c 20 30 29 3b 0a 20 20 6e 45 72 72 20 2b 3d  0, 0);.  nErr +=
19cd0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
19ce0 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73 70 65 6c  module(db, "spel
19cf0 6c 66 69 78 31 22 2c 20 26 73 70 65 6c 6c 66 69  lfix1", &spellfi
19d00 78 31 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20  x1Module, 0);.  
19d10 6e 45 72 72 20 2b 3d 20 65 64 69 74 44 69 73 74  nErr += editDist
19d20 33 49 6e 73 74 61 6c 6c 28 64 62 29 3b 0a 0a 20  3Install(db);.. 
19d30 20 2f 2a 20 56 65 72 69 66 79 20 73 61 6e 69 74   /* Verify sanit
19d40 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73 6c 69  y of the transli
19d50 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
19d60 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
19d70 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65 6f  (translit)/sizeo
19d80 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 2d 31  f(translit[0])-1
19d90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
19da0 72 74 28 20 74 72 61 6e 73 6c 69 74 5b 69 5d 2e  rt( translit[i].
19db0 63 46 72 6f 6d 3c 74 72 61 6e 73 6c 69 74 5b 69  cFrom<translit[i
19dc0 2b 31 5d 2e 63 46 72 6f 6d 20 29 3b 0a 20 20 7d  +1].cFrom );.  }
19dd0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 20  ..  return nErr 
19de0 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a  ? SQLITE_ERROR :
19df0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
19e00 69 66 20 53 51 4c 49 54 45 5f 43 4f 52 45 20 7c  if SQLITE_CORE |
19e10 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
19e20 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 67  _TEST)./*.** Reg
19e30 69 73 74 65 72 20 74 68 65 20 73 70 65 6c 6c 66  ister the spellf
19e40 69 78 31 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ix1 virtual tabl
19e50 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69  e and its associ
19e60 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ated functions..
19e70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 70  */.int sqlite3Sp
19e80 65 6c 6c 66 69 78 31 52 65 67 69 73 74 65 72 28  ellfix1Register(
19e90 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
19ea0 72 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31  return spellfix1
19eb0 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 7d 0a  Register(db);.}.
19ec0 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 21 53 51  #endif...#if !SQ
19ed0 4c 49 54 45 5f 43 4f 52 45 0a 2f 2a 0a 2a 2a 20  LITE_CORE./*.** 
19ee0 45 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20 66  Extension load f
19ef0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
19f00 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 73 69 6f  sqlite3_extensio
19f10 6e 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65  n_init(.  sqlite
19f20 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a  3 *db, .  char *
19f30 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f  *pzErrMsg, .  co
19f40 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
19f50 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29  routines *pApi.)
19f60 7b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  {.  SQLITE_EXTEN
19f70 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29  SION_INIT2(pApi)
19f80 3b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c  ;.  return spell
19f90 66 69 78 31 52 65 67 69 73 74 65 72 28 64 62 29  fix1Register(db)
19fa0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
19fb0 51 4c 49 54 45 5f 43 4f 52 45 20 2a 2f 0a        QLITE_CORE */.