/ Hex Artifact Content
Login

Artifact deab0f9caf853d2ddbee7c4a680ad27621adf1bf:


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: 74 68 65 20 73 70 65 6c 6c 66 69 78 31 20 56 49  the spellfix1 VI
01a0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 68 61 74  RTUAL TABLE that
01b0: 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
01c0: 74 6f 20 73 65 61 72 63 68 20 61 20 6c 61 72 67  to search a larg
01d0: 65 20 76 6f 63 61 62 75 6c 61 72 79 20 66 6f 72  e vocabulary for
01e0: 20 63 6c 6f 73 65 20 6d 61 74 63 68 65 73 2e 20   close matches. 
01f0: 20 53 65 65 20 73 65 70 61 72 61 74 65 0a 2a 2a   See separate.**
0200: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
0210: 69 6c 65 73 20 28 73 70 65 6c 6c 66 69 78 31 2e  iles (spellfix1.
0220: 77 69 6b 69 20 61 6e 64 20 65 64 69 74 64 69 73  wiki and editdis
0230: 74 33 2e 77 69 6b 69 29 20 66 6f 72 20 64 65 74  t3.wiki) for det
0240: 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ails..*/.#if SQL
0250: 49 54 45 5f 43 4f 52 45 0a 23 20 69 6e 63 6c 75  ITE_CORE.# inclu
0260: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0270: 0a 23 65 6c 73 65 0a 23 20 69 6e 63 6c 75 64 65  .#else.# include
0280: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 20 69 6e   <string.h>.# in
0290: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
02a0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  # include <stdli
02b0: 62 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 22  b.h>.# include "
02c0: 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 20 20  sqlite3ext.h".  
02d0: 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e  SQLITE_EXTENSION
02e0: 5f 49 4e 49 54 31 0a 23 65 6e 64 69 66 20 2f 2a  _INIT1.#endif /*
02f0: 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 20 2a 2f   !SQLITE_CORE */
0300: 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65  .#include <ctype
0310: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 72 61  .h>../*.** Chara
0320: 63 74 65 72 20 63 6c 61 73 73 65 73 20 66 6f 72  cter classes for
0330: 20 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72   ASCII character
0340: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 20 20 20 27  s:.**.**   0   '
0350: 27 20 20 20 20 20 20 20 20 53 69 6c 65 6e 74 20  '        Silent 
0360: 6c 65 74 74 65 72 73 3a 20 20 20 48 20 57 0a 2a  letters:   H W.*
0370: 2a 20 20 20 31 20 20 20 27 41 27 20 20 20 20 20  *   1   'A'     
0380: 20 20 41 6e 79 20 76 6f 77 65 6c 3a 20 20 20 41    Any vowel:   A
0390: 20 45 20 49 20 4f 20 55 20 28 59 29 0a 2a 2a 20   E I O U (Y).** 
03a0: 20 20 32 20 20 20 27 42 27 20 20 20 20 20 20 20    2   'B'       
03b0: 41 20 62 69 6c 61 62 65 61 6c 20 73 74 6f 70 20  A bilabeal stop 
03c0: 6f 72 20 66 72 69 63 61 74 69 76 65 3a 20 20 42  or fricative:  B
03d0: 20 46 20 50 20 56 0a 2a 2a 20 20 20 33 20 20 20   F P V.**   3   
03e0: 27 43 27 20 20 20 20 20 20 20 4f 74 68 65 72 20  'C'       Other 
03f0: 66 72 69 63 61 74 69 76 65 73 20 6f 72 20 62 61  fricatives or ba
0400: 63 6b 20 73 74 6f 70 73 3a 20 20 43 20 47 20 4a  ck stops:  C G J
0410: 20 4b 20 51 20 53 20 58 20 5a 0a 2a 2a 20 20 20   K Q S X Z.**   
0420: 34 20 20 20 27 44 27 20 20 20 20 20 20 20 41 6c  4   'D'       Al
0430: 76 65 6f 6c 61 72 20 73 74 6f 70 73 3a 20 20 44  veolar stops:  D
0440: 20 54 0a 2a 2a 20 20 20 35 20 20 20 27 48 27 20   T.**   5   'H' 
0450: 20 20 20 20 20 20 4c 65 74 74 65 72 20 48 20 61        Letter H a
0460: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0470: 6f 66 20 61 20 77 6f 72 64 0a 2a 2a 20 20 20 36  of a word.**   6
0480: 20 20 20 27 4c 27 20 20 20 20 20 20 20 47 6c 69     'L'       Gli
0490: 64 65 3a 20 20 4c 0a 2a 2a 20 20 20 37 20 20 20  de:  L.**   7   
04a0: 27 52 27 20 20 20 20 20 20 20 53 65 6d 69 76 6f  'R'       Semivo
04b0: 77 65 6c 3a 20 20 52 0a 2a 2a 20 20 20 38 20 20  wel:  R.**   8  
04c0: 20 27 4d 27 20 20 20 20 20 20 20 4e 61 73 61 6c   'M'       Nasal
04d0: 73 3a 20 20 4d 20 4e 0a 2a 2a 20 20 20 39 20 20  s:  M N.**   9  
04e0: 20 27 57 27 20 20 20 20 20 20 20 4c 65 74 74 65   'W'       Lette
04f0: 72 20 57 20 61 74 20 74 68 65 20 62 65 67 69 6e  r W at the begin
0500: 6e 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 0a 2a  ning of a word.*
0510: 2a 20 20 20 31 30 20 20 27 59 27 20 20 20 20 20  *   10  'Y'     
0520: 20 20 4c 65 74 74 65 72 20 59 20 61 74 20 74 68    Letter Y at th
0530: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
0540: 20 77 6f 72 64 2e 0a 2a 2a 20 20 20 31 31 20 20   word..**   11  
0550: 27 39 27 20 20 20 20 20 20 20 44 69 67 69 74 73  '9'       Digits
0560: 3a 20 30 20 31 20 32 20 33 20 34 20 35 20 36 20  : 0 1 2 3 4 5 6 
0570: 37 20 38 20 39 0a 2a 2a 20 20 20 31 32 20 20 27  7 8 9.**   12  '
0580: 20 27 20 20 20 20 20 20 20 57 68 69 74 65 20 73   '       White s
0590: 70 61 63 65 0a 2a 2a 20 20 20 31 33 20 20 27 3f  pace.**   13  '?
05a0: 27 20 20 20 20 20 20 20 4f 74 68 65 72 2e 0a 2a  '       Other..*
05b0: 2f 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  /.#define CCLASS
05c0: 5f 53 49 4c 45 4e 54 20 20 20 20 20 20 20 20 20  _SILENT         
05d0: 30 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  0.#define CCLASS
05e0: 5f 56 4f 57 45 4c 20 20 20 20 20 20 20 20 20 20  _VOWEL          
05f0: 31 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  1.#define CCLASS
0600: 5f 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20  _B              
0610: 32 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  2.#define CCLASS
0620: 5f 43 20 20 20 20 20 20 20 20 20 20 20 20 20 20  _C              
0630: 33 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  3.#define CCLASS
0640: 5f 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  _D              
0650: 34 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  4.#define CCLASS
0660: 5f 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  _H              
0670: 35 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  5.#define CCLASS
0680: 5f 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  _L              
0690: 36 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  6.#define CCLASS
06a0: 5f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  _R              
06b0: 37 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  7.#define CCLASS
06c0: 5f 4d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  _M              
06d0: 38 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  8.#define CCLASS
06e0: 5f 57 20 20 20 20 20 20 20 20 20 20 20 20 20 20  _W              
06f0: 39 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  9.#define CCLASS
0700: 5f 59 20 20 20 20 20 20 20 20 20 20 20 20 20 31  _Y             1
0710: 30 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  0.#define CCLASS
0720: 5f 44 49 47 49 54 20 20 20 20 20 20 20 20 20 31  _DIGIT         1
0730: 31 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  1.#define CCLASS
0740: 5f 53 50 41 43 45 20 20 20 20 20 20 20 20 20 31  _SPACE         1
0750: 32 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53  2.#define CCLASS
0760: 5f 4f 54 48 45 52 20 20 20 20 20 20 20 20 20 31  _OTHER         1
0770: 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  3../*.** The fol
0780: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 67 69 76  lowing table giv
0790: 65 73 20 74 68 65 20 63 68 61 72 61 63 74 65 72  es the character
07a0: 20 63 6c 61 73 73 20 66 6f 72 20 6e 6f 6e 2d 69   class for non-i
07b0: 6e 69 74 69 61 6c 20 41 53 43 49 49 0a 2a 2a 20  nitial ASCII.** 
07c0: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
07d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
07e0: 67 6e 65 64 20 63 68 61 72 20 6d 69 64 43 6c 61  gned char midCla
07f0: 73 73 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 20 20 2a  ss[] = {. /*   *
0800: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0810: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
0820: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20  S_OTHER,   /*   
0830: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0840: 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53  . /*   */ CCLASS
0850: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20  _OTHER,    /*   
0860: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0870: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
0880: 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a  S_OTHER,. /*   *
0890: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
08a0: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
08b0: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20  S_OTHER,   /*   
08c0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
08d0: 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53  . /*   */ CCLASS
08e0: 5f 53 50 41 43 45 2c 20 20 20 20 2f 2a 20 20 20  _SPACE,    /*   
08f0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0900: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
0910: 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a  S_OTHER,. /*   *
0920: 2f 20 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 20  / CCLASS_SPACE, 
0930: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
0940: 53 5f 53 50 41 43 45 2c 20 20 20 2f 2a 20 20 20  S_SPACE,   /*   
0950: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0960: 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53  . /*   */ CCLASS
0970: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20  _OTHER,    /*   
0980: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0990: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
09a0: 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a  S_OTHER,. /*   *
09b0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
09c0: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
09d0: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20  S_OTHER,   /*   
09e0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
09f0: 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53  . /*   */ CCLASS
0a00: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20  _OTHER,    /*   
0a10: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0a20: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
0a30: 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a  S_OTHER,. /*   *
0a40: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0a50: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
0a60: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20  S_OTHER,   /*   
0a70: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0a80: 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53  . /*   */ CCLASS
0a90: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20  _OTHER,    /*   
0aa0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0ab0: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
0ac0: 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a  S_OTHER,. /*   *
0ad0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0ae0: 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53     /*   */ CCLAS
0af0: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20  S_OTHER,   /*   
0b00: 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43 45 2c  */ CCLASS_SPACE,
0b10: 0a 20 2f 2a 20 21 20 2a 2f 20 43 43 4c 41 53 53  . /* ! */ CCLASS
0b20: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 22 20  _OTHER,    /* " 
0b30: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0b40: 20 20 20 2f 2a 20 23 20 2a 2f 20 43 43 4c 41 53     /* # */ CCLAS
0b50: 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 24 20 2a  S_OTHER,. /* $ *
0b60: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0b70: 20 20 20 2f 2a 20 25 20 2a 2f 20 43 43 4c 41 53     /* % */ CCLAS
0b80: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 26 20  S_OTHER,   /* & 
0b90: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0ba0: 0a 20 2f 2a 20 27 20 2a 2f 20 43 43 4c 41 53 53  . /* ' */ CCLASS
0bb0: 5f 53 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 28 20  _SILENT,   /* ( 
0bc0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0bd0: 20 20 20 2f 2a 20 29 20 2a 2f 20 43 43 4c 41 53     /* ) */ CCLAS
0be0: 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 2a 20 2a  S_OTHER,. /* * *
0bf0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0c00: 20 20 20 2f 2a 20 2b 20 2a 2f 20 43 43 4c 41 53     /* + */ CCLAS
0c10: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 2c 20  S_OTHER,   /* , 
0c20: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0c30: 0a 20 2f 2a 20 2d 20 2a 2f 20 43 43 4c 41 53 53  . /* - */ CCLASS
0c40: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 2e 20  _OTHER,    /* . 
0c50: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0c60: 20 20 20 2f 2a 20 2f 20 2a 2f 20 43 43 4c 41 53     /* / */ CCLAS
0c70: 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 30 20 2a  S_OTHER,. /* 0 *
0c80: 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20  / CCLASS_DIGIT, 
0c90: 20 20 20 2f 2a 20 31 20 2a 2f 20 43 43 4c 41 53     /* 1 */ CCLAS
0ca0: 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20 32 20  S_DIGIT,   /* 2 
0cb0: 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c  */ CCLASS_DIGIT,
0cc0: 0a 20 2f 2a 20 33 20 2a 2f 20 43 43 4c 41 53 53  . /* 3 */ CCLASS
0cd0: 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20 34 20  _DIGIT,    /* 4 
0ce0: 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c  */ CCLASS_DIGIT,
0cf0: 20 20 20 2f 2a 20 35 20 2a 2f 20 43 43 4c 41 53     /* 5 */ CCLAS
0d00: 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20 36 20 2a  S_DIGIT,. /* 6 *
0d10: 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20  / CCLASS_DIGIT, 
0d20: 20 20 20 2f 2a 20 37 20 2a 2f 20 43 43 4c 41 53     /* 7 */ CCLAS
0d30: 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20 38 20  S_DIGIT,   /* 8 
0d40: 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c  */ CCLASS_DIGIT,
0d50: 0a 20 2f 2a 20 39 20 2a 2f 20 43 43 4c 41 53 53  . /* 9 */ CCLASS
0d60: 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20 3a 20  _DIGIT,    /* : 
0d70: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0d80: 20 20 20 2f 2a 20 3b 20 2a 2f 20 43 43 4c 41 53     /* ; */ CCLAS
0d90: 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 3c 20 2a  S_OTHER,. /* < *
0da0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0db0: 20 20 20 2f 2a 20 3d 20 2a 2f 20 43 43 4c 41 53     /* = */ CCLAS
0dc0: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 3e 20  S_OTHER,   /* > 
0dd0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0de0: 0a 20 2f 2a 20 3f 20 2a 2f 20 43 43 4c 41 53 53  . /* ? */ CCLASS
0df0: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 40 20  _OTHER,    /* @ 
0e00: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
0e10: 20 20 20 2f 2a 20 41 20 2a 2f 20 43 43 4c 41 53     /* A */ CCLAS
0e20: 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 42 20 2a  S_VOWEL,. /* B *
0e30: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
0e40: 20 20 20 2f 2a 20 43 20 2a 2f 20 43 43 4c 41 53     /* C */ CCLAS
0e50: 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 44 20  S_C,       /* D 
0e60: 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a 20 2f 2a  */ CCLASS_D,. /*
0e70: 20 45 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   E */ CCLASS_VOW
0e80: 45 4c 2c 20 20 20 20 2f 2a 20 46 20 2a 2f 20 43  EL,    /* F */ C
0e90: 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20 2f  CLASS_B,       /
0ea0: 2a 20 47 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * G */ CCLASS_C,
0eb0: 0a 20 2f 2a 20 48 20 2a 2f 20 43 43 4c 41 53 53  . /* H */ CCLASS
0ec0: 5f 53 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 49 20  _SILENT,   /* I 
0ed0: 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c  */ CCLASS_VOWEL,
0ee0: 20 20 20 2f 2a 20 4a 20 2a 2f 20 43 43 4c 41 53     /* J */ CCLAS
0ef0: 53 5f 43 2c 0a 20 2f 2a 20 4b 20 2a 2f 20 43 43  S_C,. /* K */ CC
0f00: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f  LASS_C,        /
0f10: 2a 20 4c 20 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c  * L */ CCLASS_L,
0f20: 20 20 20 20 20 20 20 2f 2a 20 4d 20 2a 2f 20 43         /* M */ C
0f30: 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 4e 20 2a  CLASS_M,. /* N *
0f40: 2f 20 43 43 4c 41 53 53 5f 4d 2c 20 20 20 20 20  / CCLASS_M,     
0f50: 20 20 20 2f 2a 20 4f 20 2a 2f 20 43 43 4c 41 53     /* O */ CCLAS
0f60: 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20 50 20  S_VOWEL,   /* P 
0f70: 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a  */ CCLASS_B,. /*
0f80: 20 51 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20   Q */ CCLASS_C, 
0f90: 20 20 20 20 20 20 20 2f 2a 20 52 20 2a 2f 20 43         /* R */ C
0fa0: 43 4c 41 53 53 5f 52 2c 20 20 20 20 20 20 20 2f  CLASS_R,       /
0fb0: 2a 20 53 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * S */ CCLASS_C,
0fc0: 0a 20 2f 2a 20 54 20 2a 2f 20 43 43 4c 41 53 53  . /* T */ CCLASS
0fd0: 5f 44 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 20  _D,        /* U 
0fe0: 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c  */ CCLASS_VOWEL,
0ff0: 20 20 20 2f 2a 20 56 20 2a 2f 20 43 43 4c 41 53     /* V */ CCLAS
1000: 53 5f 42 2c 0a 20 2f 2a 20 57 20 2a 2f 20 43 43  S_B,. /* W */ CC
1010: 4c 41 53 53 5f 53 49 4c 45 4e 54 2c 20 20 20 2f  LASS_SILENT,   /
1020: 2a 20 58 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * X */ CCLASS_C,
1030: 20 20 20 20 20 20 20 2f 2a 20 59 20 2a 2f 20 43         /* Y */ C
1040: 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a  CLASS_VOWEL,. /*
1050: 20 5a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20   Z */ CCLASS_C, 
1060: 20 20 20 20 20 20 20 2f 2a 20 5b 20 2a 2f 20 43         /* [ */ C
1070: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f  CLASS_OTHER,   /
1080: 2a 20 5c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * \ */ CCLASS_OT
1090: 48 45 52 2c 0a 20 2f 2a 20 5d 20 2a 2f 20 43 43  HER,. /* ] */ CC
10a0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f  LASS_OTHER,    /
10b0: 2a 20 5e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54  * ^ */ CCLASS_OT
10c0: 48 45 52 2c 20 20 20 2f 2a 20 5f 20 2a 2f 20 43  HER,   /* _ */ C
10d0: 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a  CLASS_OTHER,. /*
10e0: 20 60 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ` */ CCLASS_OTH
10f0: 45 52 2c 20 20 20 20 2f 2a 20 61 20 2a 2f 20 43  ER,    /* a */ C
1100: 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f  CLASS_VOWEL,   /
1110: 2a 20 62 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c  * b */ CCLASS_B,
1120: 0a 20 2f 2a 20 63 20 2a 2f 20 43 43 4c 41 53 53  . /* c */ CCLASS
1130: 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 64 20  _C,        /* d 
1140: 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20  */ CCLASS_D,    
1150: 20 20 20 2f 2a 20 65 20 2a 2f 20 43 43 4c 41 53     /* e */ CCLAS
1160: 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 66 20 2a  S_VOWEL,. /* f *
1170: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
1180: 20 20 20 2f 2a 20 67 20 2a 2f 20 43 43 4c 41 53     /* g */ CCLAS
1190: 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 68 20  S_C,       /* h 
11a0: 2a 2f 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54  */ CCLASS_SILENT
11b0: 2c 0a 20 2f 2a 20 69 20 2a 2f 20 43 43 4c 41 53  ,. /* i */ CCLAS
11c0: 53 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 6a  S_VOWEL,    /* j
11d0: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
11e0: 20 20 20 20 2f 2a 20 6b 20 2a 2f 20 43 43 4c 41      /* k */ CCLA
11f0: 53 53 5f 43 2c 0a 20 2f 2a 20 6c 20 2a 2f 20 43  SS_C,. /* l */ C
1200: 43 4c 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 20  CLASS_L,        
1210: 2f 2a 20 6d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d  /* m */ CCLASS_M
1220: 2c 20 20 20 20 20 20 20 2f 2a 20 6e 20 2a 2f 20  ,       /* n */ 
1230: 43 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 6f 20  CCLASS_M,. /* o 
1240: 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c  */ CCLASS_VOWEL,
1250: 20 20 20 20 2f 2a 20 70 20 2a 2f 20 43 43 4c 41      /* p */ CCLA
1260: 53 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 71  SS_B,       /* q
1270: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f   */ CCLASS_C,. /
1280: 2a 20 72 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c  * r */ CCLASS_R,
1290: 20 20 20 20 20 20 20 20 2f 2a 20 73 20 2a 2f 20          /* s */ 
12a0: 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20  CCLASS_C,       
12b0: 2f 2a 20 74 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* t */ CCLASS_D
12c0: 2c 0a 20 2f 2a 20 75 20 2a 2f 20 43 43 4c 41 53  ,. /* u */ CCLAS
12d0: 53 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 76  S_VOWEL,    /* v
12e0: 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20   */ CCLASS_B,   
12f0: 20 20 20 20 2f 2a 20 77 20 2a 2f 20 43 43 4c 41      /* w */ CCLA
1300: 53 53 5f 53 49 4c 45 4e 54 2c 0a 20 2f 2a 20 78  SS_SILENT,. /* x
1310: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
1320: 20 20 20 20 20 2f 2a 20 79 20 2a 2f 20 43 43 4c       /* y */ CCL
1330: 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20  ASS_VOWEL,   /* 
1340: 7a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20  z */ CCLASS_C,. 
1350: 2f 2a 20 7b 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* { */ CCLASS_O
1360: 54 48 45 52 2c 20 20 20 20 2f 2a 20 7c 20 2a 2f  THER,    /* | */
1370: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
1380: 20 2f 2a 20 7d 20 2a 2f 20 43 43 4c 41 53 53 5f   /* } */ CCLASS_
1390: 4f 54 48 45 52 2c 0a 20 2f 2a 20 7e 20 2a 2f 20  OTHER,. /* ~ */ 
13a0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
13b0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
13c0: 4f 54 48 45 52 2c 20 20 20 0a 7d 3b 0a 2f 2a 20  OTHER,   .};./* 
13d0: 0a 2a 2a 20 54 68 69 73 20 74 61 62 6c 65 73 20  .** This tables 
13e0: 67 69 76 65 73 20 74 68 65 20 63 68 61 72 61 63  gives the charac
13f0: 74 65 72 20 63 6c 61 73 73 20 66 6f 72 20 41 53  ter class for AS
1400: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 74  CII characters t
1410: 68 61 74 20 66 6f 72 6d 20 74 68 65 0a 2a 2a 20  hat form the.** 
1420: 69 6e 69 74 69 61 6c 20 63 68 61 72 61 63 74 65  initial characte
1430: 72 20 6f 66 20 61 20 77 6f 72 64 2e 20 20 54 68  r of a word.  Th
1440: 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63  e only differenc
1450: 65 20 66 72 6f 6d 20 6d 69 64 43 6c 61 73 73 20  e from midClass 
1460: 69 73 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6c  is with.** the l
1470: 65 74 74 65 72 73 20 48 2c 20 57 2c 20 61 6e 64  etters H, W, and
1480: 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f   Y..*/.static co
1490: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14a0: 72 20 69 6e 69 74 43 6c 61 73 73 5b 5d 20 3d 20  r initClass[] = 
14b0: 7b 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53  {. /*   */ CCLAS
14c0: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20  S_OTHER,    /*  
14d0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
14e0: 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  ,   /*   */ CCLA
14f0: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20  SS_OTHER,. /*   
1500: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
1510: 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41      /*   */ CCLA
1520: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20  SS_OTHER,   /*  
1530: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1540: 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53  ,. /*   */ CCLAS
1550: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20  S_OTHER,    /*  
1560: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1570: 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  ,   /*   */ CCLA
1580: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20  SS_OTHER,. /*   
1590: 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43 45 2c  */ CCLASS_SPACE,
15a0: 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41      /*   */ CCLA
15b0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20  SS_OTHER,   /*  
15c0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
15d0: 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53  ,. /*   */ CCLAS
15e0: 53 5f 53 50 41 43 45 2c 20 20 20 20 2f 2a 20 20  S_SPACE,    /*  
15f0: 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43 45   */ CCLASS_SPACE
1600: 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  ,   /*   */ CCLA
1610: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20  SS_OTHER,. /*   
1620: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
1630: 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41      /*   */ CCLA
1640: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20  SS_OTHER,   /*  
1650: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1660: 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53  ,. /*   */ CCLAS
1670: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20  S_OTHER,    /*  
1680: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1690: 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  ,   /*   */ CCLA
16a0: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20  SS_OTHER,. /*   
16b0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
16c0: 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41      /*   */ CCLA
16d0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20  SS_OTHER,   /*  
16e0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
16f0: 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53  ,. /*   */ CCLAS
1700: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20  S_OTHER,    /*  
1710: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1720: 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  ,   /*   */ CCLA
1730: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20  SS_OTHER,. /*   
1740: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
1750: 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41      /*   */ CCLA
1760: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20  SS_OTHER,   /*  
1770: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1780: 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53  ,. /*   */ CCLAS
1790: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20  S_OTHER,    /*  
17a0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
17b0: 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  ,   /*   */ CCLA
17c0: 53 53 5f 53 50 41 43 45 2c 0a 20 2f 2a 20 21 20  SS_SPACE,. /* ! 
17d0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
17e0: 20 20 20 20 2f 2a 20 22 20 2a 2f 20 43 43 4c 41      /* " */ CCLA
17f0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 23  SS_OTHER,   /* #
1800: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1810: 2c 0a 20 2f 2a 20 24 20 2a 2f 20 43 43 4c 41 53  ,. /* $ */ CCLAS
1820: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 25  S_OTHER,    /* %
1830: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1840: 2c 20 20 20 2f 2a 20 26 20 2a 2f 20 43 43 4c 41  ,   /* & */ CCLA
1850: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 27 20  SS_OTHER,. /* ' 
1860: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
1870: 20 20 20 20 2f 2a 20 28 20 2a 2f 20 43 43 4c 41      /* ( */ CCLA
1880: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 29  SS_OTHER,   /* )
1890: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
18a0: 2c 0a 20 2f 2a 20 2a 20 2a 2f 20 43 43 4c 41 53  ,. /* * */ CCLAS
18b0: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 2b  S_OTHER,    /* +
18c0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
18d0: 2c 20 20 20 2f 2a 20 2c 20 2a 2f 20 43 43 4c 41  ,   /* , */ CCLA
18e0: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 2d 20  SS_OTHER,. /* - 
18f0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
1900: 20 20 20 20 2f 2a 20 2e 20 2a 2f 20 43 43 4c 41      /* . */ CCLA
1910: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 2f  SS_OTHER,   /* /
1920: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1930: 2c 0a 20 2f 2a 20 30 20 2a 2f 20 43 43 4c 41 53  ,. /* 0 */ CCLAS
1940: 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20 31  S_DIGIT,    /* 1
1950: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54   */ CCLASS_DIGIT
1960: 2c 20 20 20 2f 2a 20 32 20 2a 2f 20 43 43 4c 41  ,   /* 2 */ CCLA
1970: 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20 33 20  SS_DIGIT,. /* 3 
1980: 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c  */ CCLASS_DIGIT,
1990: 20 20 20 20 2f 2a 20 34 20 2a 2f 20 43 43 4c 41      /* 4 */ CCLA
19a0: 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20 35  SS_DIGIT,   /* 5
19b0: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54   */ CCLASS_DIGIT
19c0: 2c 0a 20 2f 2a 20 36 20 2a 2f 20 43 43 4c 41 53  ,. /* 6 */ CCLAS
19d0: 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20 37  S_DIGIT,    /* 7
19e0: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54   */ CCLASS_DIGIT
19f0: 2c 20 20 20 2f 2a 20 38 20 2a 2f 20 43 43 4c 41  ,   /* 8 */ CCLA
1a00: 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20 39 20  SS_DIGIT,. /* 9 
1a10: 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c  */ CCLASS_DIGIT,
1a20: 20 20 20 20 2f 2a 20 3a 20 2a 2f 20 43 43 4c 41      /* : */ CCLA
1a30: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 3b  SS_OTHER,   /* ;
1a40: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1a50: 2c 0a 20 2f 2a 20 3c 20 2a 2f 20 43 43 4c 41 53  ,. /* < */ CCLAS
1a60: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 3d  S_OTHER,    /* =
1a70: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1a80: 2c 20 20 20 2f 2a 20 3e 20 2a 2f 20 43 43 4c 41  ,   /* > */ CCLA
1a90: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 3f 20  SS_OTHER,. /* ? 
1aa0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
1ab0: 20 20 20 20 2f 2a 20 40 20 2a 2f 20 43 43 4c 41      /* @ */ CCLA
1ac0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 41  SS_OTHER,   /* A
1ad0: 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c   */ CCLASS_VOWEL
1ae0: 2c 0a 20 2f 2a 20 42 20 2a 2f 20 43 43 4c 41 53  ,. /* B */ CCLAS
1af0: 53 5f 42 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  S_B,        /* C
1b00: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
1b10: 20 20 20 20 2f 2a 20 44 20 2a 2f 20 43 43 4c 41      /* D */ CCLA
1b20: 53 53 5f 44 2c 0a 20 2f 2a 20 45 20 2a 2f 20 43  SS_D,. /* E */ C
1b30: 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 20  CLASS_VOWEL,    
1b40: 2f 2a 20 46 20 2a 2f 20 43 43 4c 41 53 53 5f 42  /* F */ CCLASS_B
1b50: 2c 20 20 20 20 20 20 20 2f 2a 20 47 20 2a 2f 20  ,       /* G */ 
1b60: 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 48 20  CCLASS_C,. /* H 
1b70: 2a 2f 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54  */ CCLASS_SILENT
1b80: 2c 20 20 20 2f 2a 20 49 20 2a 2f 20 43 43 4c 41  ,   /* I */ CCLA
1b90: 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20 4a  SS_VOWEL,   /* J
1ba0: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f   */ CCLASS_C,. /
1bb0: 2a 20 4b 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c  * K */ CCLASS_C,
1bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 20 2a 2f 20          /* L */ 
1bd0: 43 43 4c 41 53 53 5f 4c 2c 20 20 20 20 20 20 20  CCLASS_L,       
1be0: 2f 2a 20 4d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d  /* M */ CCLASS_M
1bf0: 2c 0a 20 2f 2a 20 4e 20 2a 2f 20 43 43 4c 41 53  ,. /* N */ CCLAS
1c00: 53 5f 4d 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  S_M,        /* O
1c10: 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c   */ CCLASS_VOWEL
1c20: 2c 20 20 20 2f 2a 20 50 20 2a 2f 20 43 43 4c 41  ,   /* P */ CCLA
1c30: 53 53 5f 42 2c 0a 20 2f 2a 20 51 20 2a 2f 20 43  SS_B,. /* Q */ C
1c40: 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20  CLASS_C,        
1c50: 2f 2a 20 52 20 2a 2f 20 43 43 4c 41 53 53 5f 52  /* R */ CCLASS_R
1c60: 2c 20 20 20 20 20 20 20 2f 2a 20 53 20 2a 2f 20  ,       /* S */ 
1c70: 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 54 20  CCLASS_C,. /* T 
1c80: 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20  */ CCLASS_D,    
1c90: 20 20 20 20 2f 2a 20 55 20 2a 2f 20 43 43 4c 41      /* U */ CCLA
1ca0: 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20 56  SS_VOWEL,   /* V
1cb0: 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20 2f   */ CCLASS_B,. /
1cc0: 2a 20 57 20 2a 2f 20 43 43 4c 41 53 53 5f 57 2c  * W */ CCLASS_W,
1cd0: 20 20 20 20 20 20 20 20 2f 2a 20 58 20 2a 2f 20          /* X */ 
1ce0: 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20  CCLASS_C,       
1cf0: 2f 2a 20 59 20 2a 2f 20 43 43 4c 41 53 53 5f 59  /* Y */ CCLASS_Y
1d00: 2c 0a 20 2f 2a 20 5a 20 2a 2f 20 43 43 4c 41 53  ,. /* Z */ CCLAS
1d10: 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 5b  S_C,        /* [
1d20: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1d30: 2c 20 20 20 2f 2a 20 5c 20 2a 2f 20 43 43 4c 41  ,   /* \ */ CCLA
1d40: 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 5d 20  SS_OTHER,. /* ] 
1d50: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
1d60: 20 20 20 20 2f 2a 20 5e 20 2a 2f 20 43 43 4c 41      /* ^ */ CCLA
1d70: 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 5f  SS_OTHER,   /* _
1d80: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1d90: 2c 0a 20 2f 2a 20 60 20 2a 2f 20 43 43 4c 41 53  ,. /* ` */ CCLAS
1da0: 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 61  S_OTHER,    /* a
1db0: 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c   */ CCLASS_VOWEL
1dc0: 2c 20 20 20 2f 2a 20 62 20 2a 2f 20 43 43 4c 41  ,   /* b */ CCLA
1dd0: 53 53 5f 42 2c 0a 20 2f 2a 20 63 20 2a 2f 20 43  SS_B,. /* c */ C
1de0: 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20  CLASS_C,        
1df0: 2f 2a 20 64 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* d */ CCLASS_D
1e00: 2c 20 20 20 20 20 20 20 2f 2a 20 65 20 2a 2f 20  ,       /* e */ 
1e10: 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f  CCLASS_VOWEL,. /
1e20: 2a 20 66 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c  * f */ CCLASS_B,
1e30: 20 20 20 20 20 20 20 20 2f 2a 20 67 20 2a 2f 20          /* g */ 
1e40: 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20  CCLASS_C,       
1e50: 2f 2a 20 68 20 2a 2f 20 43 43 4c 41 53 53 5f 53  /* h */ CCLASS_S
1e60: 49 4c 45 4e 54 2c 0a 20 2f 2a 20 69 20 2a 2f 20  ILENT,. /* i */ 
1e70: 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20  CCLASS_VOWEL,   
1e80: 20 2f 2a 20 6a 20 2a 2f 20 43 43 4c 41 53 53 5f   /* j */ CCLASS_
1e90: 43 2c 20 20 20 20 20 20 20 2f 2a 20 6b 20 2a 2f  C,       /* k */
1ea0: 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 6c   CCLASS_C,. /* l
1eb0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c 20 20 20   */ CCLASS_L,   
1ec0: 20 20 20 20 20 2f 2a 20 6d 20 2a 2f 20 43 43 4c       /* m */ CCL
1ed0: 41 53 53 5f 4d 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_M,       /* 
1ee0: 6e 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 0a 20  n */ CCLASS_M,. 
1ef0: 2f 2a 20 6f 20 2a 2f 20 43 43 4c 41 53 53 5f 56  /* o */ CCLASS_V
1f00: 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 70 20 2a 2f  OWEL,    /* p */
1f10: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
1f20: 20 2f 2a 20 71 20 2a 2f 20 43 43 4c 41 53 53 5f   /* q */ CCLASS_
1f30: 43 2c 0a 20 2f 2a 20 72 20 2a 2f 20 43 43 4c 41  C,. /* r */ CCLA
1f40: 53 53 5f 52 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_R,        /* 
1f50: 73 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  s */ CCLASS_C,  
1f60: 20 20 20 20 20 2f 2a 20 74 20 2a 2f 20 43 43 4c       /* t */ CCL
1f70: 41 53 53 5f 44 2c 0a 20 2f 2a 20 75 20 2a 2f 20  ASS_D,. /* u */ 
1f80: 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20  CCLASS_VOWEL,   
1f90: 20 2f 2a 20 76 20 2a 2f 20 43 43 4c 41 53 53 5f   /* v */ CCLASS_
1fa0: 42 2c 20 20 20 20 20 20 20 2f 2a 20 77 20 2a 2f  B,       /* w */
1fb0: 20 43 43 4c 41 53 53 5f 57 2c 0a 20 2f 2a 20 78   CCLASS_W,. /* x
1fc0: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
1fd0: 20 20 20 20 20 2f 2a 20 79 20 2a 2f 20 43 43 4c       /* y */ CCL
1fe0: 41 53 53 5f 59 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_Y,       /* 
1ff0: 7a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20  z */ CCLASS_C,. 
2000: 2f 2a 20 7b 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* { */ CCLASS_O
2010: 54 48 45 52 2c 20 20 20 20 2f 2a 20 7c 20 2a 2f  THER,    /* | */
2020: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
2030: 20 2f 2a 20 7d 20 2a 2f 20 43 43 4c 41 53 53 5f   /* } */ CCLASS_
2040: 4f 54 48 45 52 2c 0a 20 2f 2a 20 7e 20 2a 2f 20  OTHER,. /* ~ */ 
2050: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
2060: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
2070: 4f 54 48 45 52 2c 20 20 20 0a 7d 3b 0a 0a 2f 2a  OTHER,   .};../*
2080: 0a 2a 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d  .** Mapping from
2090: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 63   the character c
20a0: 6c 61 73 73 20 6e 75 6d 62 65 72 20 28 30 2d 31  lass number (0-1
20b0: 33 29 20 74 6f 20 61 20 73 79 6d 62 6f 6c 20 66  3) to a symbol f
20c0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 68 61 72 61  or each.** chara
20d0: 63 74 65 72 20 63 6c 61 73 73 2e 20 20 4e 6f 74  cter class.  Not
20e0: 65 20 74 68 61 74 20 69 6e 69 74 43 6c 61 73 73  e that initClass
20f0: 5b 5d 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  [] can be used t
2100: 6f 20 6d 61 70 20 74 68 65 20 63 6c 61 73 73 0a  o map the class.
2110: 2a 2a 20 73 79 6d 62 6f 6c 20 62 61 63 6b 20 69  ** symbol back i
2120: 6e 74 6f 20 74 68 65 20 63 6c 61 73 73 20 6e 75  nto the class nu
2130: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
2140: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
2150: 68 61 72 20 63 6c 61 73 73 4e 61 6d 65 5b 5d 20  har className[] 
2160: 3d 20 22 2e 41 42 43 44 48 4c 52 4d 57 59 39 20  = ".ABCDHLRMWY9 
2170: 3f 22 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ?";../*.** Gener
2180: 61 74 65 20 61 20 22 70 68 6f 6e 65 74 69 63 20  ate a "phonetic 
2190: 68 61 73 68 22 20 66 72 6f 6d 20 61 20 73 74 72  hash" from a str
21a0: 69 6e 67 20 6f 66 20 41 53 43 49 49 20 63 68 61  ing of ASCII cha
21b0: 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20 7a 49  racters.** in zI
21c0: 6e 5b 30 2e 2e 6e 49 6e 2d 31 5d 2e 0a 2a 2a 0a  n[0..nIn-1]..**.
21d0: 2a 2a 20 20 20 2a 20 4d 61 70 20 63 68 61 72 61  **   * Map chara
21e0: 63 74 65 72 73 20 62 79 20 63 68 61 72 61 63 74  cters by charact
21f0: 65 72 20 63 6c 61 73 73 20 61 73 20 64 65 66 69  er class as defi
2200: 6e 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 20 20 20  ned above..**   
2210: 2a 20 4f 6d 69 74 20 64 6f 75 62 6c 65 2d 6c 65  * Omit double-le
2220: 74 74 65 72 73 0a 2a 2a 20 20 20 2a 20 4f 6d 69  tters.**   * Omi
2230: 74 20 76 6f 77 65 6c 73 20 62 65 73 69 64 65 20  t vowels beside 
2240: 52 20 61 6e 64 20 4c 0a 2a 2a 20 20 20 2a 20 4f  R and L.**   * O
2250: 6d 69 74 20 54 20 77 68 65 6e 20 66 6f 6c 6c 6f  mit T when follo
2260: 77 65 64 20 62 79 20 43 48 0a 2a 2a 20 20 20 2a  wed by CH.**   *
2270: 20 4f 6d 69 74 20 57 20 77 68 65 6e 20 66 6f 6c   Omit W when fol
2280: 6c 6f 77 65 64 20 62 79 20 52 0a 2a 2a 20 20 20  lowed by R.**   
2290: 2a 20 4f 6d 69 74 20 44 20 77 68 65 6e 20 66 6f  * Omit D when fo
22a0: 6c 6c 6f 77 65 64 20 62 79 20 4a 20 6f 72 20 47  llowed by J or G
22b0: 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 4b 20 69  .**   * Omit K i
22c0: 6e 20 4b 4e 20 6f 72 20 47 20 69 6e 20 47 4e 20  n KN or G in GN 
22d0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
22e0: 20 6f 66 20 61 20 77 6f 72 64 0a 2a 2a 0a 2a 2a   of a word.**.**
22f0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2300: 68 65 20 72 65 73 75 6c 74 20 69 73 20 6f 62 74  he result is obt
2310: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2320: 65 33 5f 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 0a 2a  e3_malloc().**.*
2330: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2340: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2350: 6f 6e 20 66 61 69 6c 73 2e 20 20 0a 2a 2f 0a 73  on fails.  .*/.s
2360: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
2370: 68 61 72 20 2a 70 68 6f 6e 65 74 69 63 48 61 73  har *phoneticHas
2380: 68 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  h(const unsigned
2390: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20   char *zIn, int 
23a0: 6e 49 6e 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  nIn){.  unsigned
23b0: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
23c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 49  lite3_malloc( nI
23d0: 6e 20 2b 20 31 20 29 3b 0a 20 20 69 6e 74 20 69  n + 1 );.  int i
23e0: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 30  ;.  int nOut = 0
23f0: 3b 0a 20 20 63 68 61 72 20 63 50 72 65 76 20 3d  ;.  char cPrev =
2400: 20 30 78 37 37 3b 0a 20 20 63 68 61 72 20 63 50   0x77;.  char cP
2410: 72 65 76 58 20 3d 20 30 78 37 37 3b 0a 20 20 63  revX = 0x77;.  c
2420: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2430: 61 72 20 2a 61 43 6c 61 73 73 20 3d 20 69 6e 69  ar *aClass = ini
2440: 74 43 6c 61 73 73 3b 0a 0a 20 20 69 66 28 20 7a  tClass;..  if( z
2450: 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Out==0 ) return 
2460: 30 3b 0a 20 20 69 66 28 20 6e 49 6e 3e 32 20 29  0;.  if( nIn>2 )
2470: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a 49  {.    switch( zI
2480: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61  n[0] ){.      ca
2490: 73 65 20 27 67 27 3a 20 0a 20 20 20 20 20 20 63  se 'g': .      c
24a0: 61 73 65 20 27 6b 27 3a 20 7b 0a 20 20 20 20 20  ase 'k': {.     
24b0: 20 20 20 69 66 28 20 7a 49 6e 5b 31 5d 3d 3d 27     if( zIn[1]=='
24c0: 6e 27 20 29 7b 20 7a 49 6e 2b 2b 3b 20 6e 49 6e  n' ){ zIn++; nIn
24d0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 62 72  --; }.        br
24e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
24f0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
2500: 3b 20 69 3c 6e 49 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<nIn; i++){. 
2510: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2520: 20 63 20 3d 20 7a 49 6e 5b 69 5d 3b 0a 20 20 20   c = zIn[i];.   
2530: 20 69 66 28 20 69 2b 31 3c 6e 49 6e 20 29 7b 0a   if( i+1<nIn ){.
2540: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 77 27        if( c=='w'
2550: 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 72   && zIn[i+1]=='r
2560: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
2570: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26      if( c=='d' &
2580: 26 20 28 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 6a 27  & (zIn[i+1]=='j'
2590: 20 7c 7c 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 67   || zIn[i+1]=='g
25a0: 27 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ') ) continue;. 
25b0: 20 20 20 20 20 69 66 28 20 69 2b 32 3c 6e 49 6e       if( i+2<nIn
25c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25d0: 63 3d 3d 27 74 27 20 26 26 20 7a 49 6e 5b 69 2b  c=='t' && zIn[i+
25e0: 31 5d 3d 3d 27 63 27 20 26 26 20 7a 49 6e 5b 69  1]=='c' && zIn[i
25f0: 2b 32 5d 3d 3d 27 68 27 20 29 20 63 6f 6e 74 69  +2]=='h' ) conti
2600: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2610: 20 7d 0a 20 20 20 20 63 20 3d 20 61 43 6c 61 73   }.    c = aClas
2620: 73 5b 63 26 30 78 37 66 5d 3b 0a 20 20 20 20 69  s[c&0x7f];.    i
2630: 66 28 20 63 3d 3d 43 43 4c 41 53 53 5f 53 50 41  f( c==CCLASS_SPA
2640: 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  CE ) continue;. 
2650: 20 20 20 69 66 28 20 63 3d 3d 43 43 4c 41 53 53     if( c==CCLASS
2660: 5f 4f 54 48 45 52 20 26 26 20 63 50 72 65 76 21  _OTHER && cPrev!
2670: 3d 43 43 4c 41 53 53 5f 44 49 47 49 54 20 29 20  =CCLASS_DIGIT ) 
2680: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 43  continue;.    aC
2690: 6c 61 73 73 20 3d 20 6d 69 64 43 6c 61 73 73 3b  lass = midClass;
26a0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 43 43 4c 41  .    if( c==CCLA
26b0: 53 53 5f 56 4f 57 45 4c 20 26 26 20 28 63 50 72  SS_VOWEL && (cPr
26c0: 65 76 58 3d 3d 43 43 4c 41 53 53 5f 52 20 7c 7c  evX==CCLASS_R ||
26d0: 20 63 50 72 65 76 58 3d 3d 43 43 4c 41 53 53 5f   cPrevX==CCLASS_
26e0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 63 6f 6e  L) ){.       con
26f0: 74 69 6e 75 65 3b 20 2f 2a 20 4e 6f 20 76 6f 77  tinue; /* No vow
2700: 65 6c 73 20 62 65 73 69 64 65 20 4c 20 6f 72 20  els beside L or 
2710: 52 20 2a 2f 20 0a 20 20 20 20 7d 0a 20 20 20 20  R */ .    }.    
2720: 69 66 28 20 28 63 3d 3d 43 43 4c 41 53 53 5f 52  if( (c==CCLASS_R
2730: 20 7c 7c 20 63 3d 3d 43 43 4c 41 53 53 5f 4c 29   || c==CCLASS_L)
2740: 20 26 26 20 63 50 72 65 76 58 3d 3d 43 43 4c 41   && cPrevX==CCLA
2750: 53 53 5f 56 4f 57 45 4c 20 29 7b 0a 20 20 20 20  SS_VOWEL ){.    
2760: 20 20 20 6e 4f 75 74 2d 2d 3b 20 20 20 2f 2a 20     nOut--;   /* 
2770: 4e 6f 20 76 6f 77 65 6c 73 20 62 65 73 69 64 65  No vowels beside
2780: 20 4c 20 6f 72 20 52 20 2a 2f 0a 20 20 20 20 7d   L or R */.    }
2790: 0a 20 20 20 20 63 50 72 65 76 20 3d 20 63 3b 0a  .    cPrev = c;.
27a0: 20 20 20 20 69 66 28 20 63 3d 3d 43 43 4c 41 53      if( c==CCLAS
27b0: 53 5f 53 49 4c 45 4e 54 20 29 20 63 6f 6e 74 69  S_SILENT ) conti
27c0: 6e 75 65 3b 0a 20 20 20 20 63 50 72 65 76 58 20  nue;.    cPrevX 
27d0: 3d 20 63 3b 0a 20 20 20 20 63 20 3d 20 63 6c 61  = c;.    c = cla
27e0: 73 73 4e 61 6d 65 5b 63 5d 3b 0a 20 20 20 20 69  ssName[c];.    i
27f0: 66 28 20 63 21 3d 7a 4f 75 74 5b 6e 4f 75 74 2d  f( c!=zOut[nOut-
2800: 31 5d 20 29 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b  1] ) zOut[nOut++
2810: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a 4f 75  ] = c;.  }.  zOu
2820: 74 5b 6e 4f 75 74 5d 20 3d 20 30 3b 0a 20 20 72  t[nOut] = 0;.  r
2830: 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f  eturn zOut;.}../
2840: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
2850: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 72 61  SQL function wra
2860: 70 70 65 72 20 61 72 6f 75 6e 64 20 70 68 6f 6e  pper around phon
2870: 65 74 69 63 48 61 73 68 28 29 2e 20 20 53 65 65  eticHash().  See
2880: 0a 2a 2a 20 74 68 65 20 64 65 73 63 72 69 70 74  .** the descript
2890: 69 6f 6e 20 6f 66 20 70 68 6f 6e 65 74 69 63 48  ion of phoneticH
28a0: 61 73 68 28 29 20 66 6f 72 20 61 64 64 69 74 69  ash() for additi
28b0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
28c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
28d0: 20 70 68 6f 6e 65 74 69 63 48 61 73 68 53 71 6c   phoneticHashSql
28e0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
28f0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
2900: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
2910: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2920: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
2930: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2940: 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  In;.  unsigned c
2950: 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 7a 49  har *zOut;..  zI
2960: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
2970: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
2980: 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20  .  if( zIn==0 ) 
2990: 72 65 74 75 72 6e 3b 0a 20 20 7a 4f 75 74 20 3d  return;.  zOut =
29a0: 20 70 68 6f 6e 65 74 69 63 48 61 73 68 28 7a 49   phoneticHash(zI
29b0: 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n, sqlite3_value
29c0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 29  _bytes(argv[0]))
29d0: 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20  ;.  if( zOut==0 
29e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
29f0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
2a00: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65  m(context);.  }e
2a10: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
2a20: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
2a30: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75  text, (char*)zOu
2a40: 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66  t, -1, sqlite3_f
2a50: 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ree);.  }.}../*.
2a60: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 68  ** Return the ch
2a70: 61 72 61 63 74 65 72 20 63 6c 61 73 73 20 6e 75  aracter class nu
2a80: 6d 62 65 72 20 66 6f 72 20 61 20 63 68 61 72 61  mber for a chara
2a90: 63 74 65 72 20 67 69 76 65 6e 20 69 74 73 0a 2a  cter given its.*
2aa0: 2a 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 73 74  * context..*/.st
2ab0: 61 74 69 63 20 63 68 61 72 20 63 68 61 72 61 63  atic char charac
2ac0: 74 65 72 43 6c 61 73 73 28 63 68 61 72 20 63 50  terClass(char cP
2ad0: 72 65 76 2c 20 63 68 61 72 20 63 29 7b 0a 20 20  rev, char c){.  
2ae0: 72 65 74 75 72 6e 20 63 50 72 65 76 3d 3d 30 20  return cPrev==0 
2af0: 3f 20 69 6e 69 74 43 6c 61 73 73 5b 63 26 30 78  ? initClass[c&0x
2b00: 37 66 5d 20 3a 20 6d 69 64 43 6c 61 73 73 5b 63  7f] : midClass[c
2b10: 26 30 78 37 66 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &0x7f];.}../*.**
2b20: 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
2b30: 20 6f 66 20 69 6e 73 65 72 74 69 6e 67 20 6f 72   of inserting or
2b40: 20 64 65 6c 65 74 69 6e 67 20 63 68 61 72 61 63   deleting charac
2b50: 74 65 72 20 63 20 69 6d 6d 65 64 69 61 74 65 6c  ter c immediatel
2b60: 79 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63  y.** following c
2b70: 68 61 72 61 63 74 65 72 20 63 50 72 65 76 2e 20  haracter cPrev. 
2b80: 20 49 66 20 63 50 72 65 76 3d 3d 30 2c 20 74 68   If cPrev==0, th
2b90: 61 74 20 6d 65 61 6e 73 20 63 20 69 73 20 74 68  at means c is th
2ba0: 65 20 66 69 72 73 74 0a 2a 2a 20 63 68 61 72 61  e first.** chara
2bb0: 63 74 65 72 20 6f 66 20 74 68 65 20 77 6f 72 64  cter of the word
2bc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bd0: 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f  insertOrDeleteCo
2be0: 73 74 28 63 68 61 72 20 63 50 72 65 76 2c 20 63  st(char cPrev, c
2bf0: 68 61 72 20 63 2c 20 63 68 61 72 20 63 4e 65 78  har c, char cNex
2c00: 74 29 7b 0a 20 20 63 68 61 72 20 63 6c 61 73 73  t){.  char class
2c10: 43 20 3d 20 63 68 61 72 61 63 74 65 72 43 6c 61  C = characterCla
2c20: 73 73 28 63 50 72 65 76 2c 20 63 29 3b 0a 20 20  ss(cPrev, c);.  
2c30: 63 68 61 72 20 63 6c 61 73 73 43 70 72 65 76 3b  char classCprev;
2c40: 0a 0a 20 20 69 66 28 20 63 6c 61 73 73 43 3d 3d  ..  if( classC==
2c50: 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 20 29 7b  CCLASS_SILENT ){
2c60: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f  .    /* Insert o
2c70: 72 20 64 65 6c 65 74 65 20 22 73 69 6c 65 6e 74  r delete "silent
2c80: 22 20 63 68 61 72 61 63 74 65 72 73 20 73 75 63  " characters suc
2c90: 68 20 61 73 20 48 20 6f 72 20 57 20 2a 2f 0a 20  h as H or W */. 
2ca0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
2cb0: 0a 20 20 69 66 28 20 63 50 72 65 76 3d 3d 63 20  .  if( cPrev==c 
2cc0: 29 7b 0a 20 20 20 20 2f 2a 20 52 65 70 65 61 74  ){.    /* Repeat
2cd0: 65 64 20 63 68 61 72 61 63 74 65 72 73 2c 20 6f  ed characters, o
2ce0: 72 20 6d 69 73 73 20 61 20 72 65 70 65 61 74 20  r miss a repeat 
2cf0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 30  */.    return 10
2d00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c 61 73  ;.  }.  if( clas
2d10: 73 43 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c  sC==CCLASS_VOWEL
2d20: 20 26 26 20 28 63 50 72 65 76 3d 3d 27 72 27 20   && (cPrev=='r' 
2d30: 7c 7c 20 63 4e 65 78 74 3d 3d 27 72 27 29 20 29  || cNext=='r') )
2d40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 30 3b  {.    return 20;
2d50: 20 20 2f 2a 20 49 6e 73 65 72 74 20 61 20 76 6f    /* Insert a vo
2d60: 77 65 6c 20 62 65 66 6f 72 65 20 6f 72 20 61 66  wel before or af
2d70: 74 65 72 20 27 72 27 20 2a 2f 0a 20 20 7d 0a 20  ter 'r' */.  }. 
2d80: 20 63 6c 61 73 73 43 70 72 65 76 20 3d 20 63 68   classCprev = ch
2d90: 61 72 61 63 74 65 72 43 6c 61 73 73 28 63 50 72  aracterClass(cPr
2da0: 65 76 2c 20 63 50 72 65 76 29 3b 0a 20 20 69 66  ev, cPrev);.  if
2db0: 28 20 63 6c 61 73 73 43 3d 3d 63 6c 61 73 73 43  ( classC==classC
2dc0: 70 72 65 76 20 29 7b 0a 20 20 20 20 69 66 28 20  prev ){.    if( 
2dd0: 63 6c 61 73 73 43 3d 3d 43 43 4c 41 53 53 5f 56  classC==CCLASS_V
2de0: 4f 57 45 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OWEL ){.      /*
2df0: 20 52 65 6d 6f 76 65 20 6f 72 20 61 64 64 20 61   Remove or add a
2e00: 20 6e 65 77 20 76 6f 77 65 6c 20 74 6f 20 61 20   new vowel to a 
2e10: 76 6f 77 65 6c 20 63 6c 75 73 74 65 72 20 2a 2f  vowel cluster */
2e20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 35  .      return 15
2e30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e40: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 6f 72 20     /* Remove or 
2e50: 61 64 64 20 61 20 63 6f 6e 73 6f 6e 61 6e 74 20  add a consonant 
2e60: 6e 6f 74 20 69 6e 20 74 68 65 20 73 61 6d 65 20  not in the same 
2e70: 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 20 20 72  class */.      r
2e80: 65 74 75 72 6e 20 35 30 3b 0a 20 20 20 20 7d 0a  eturn 50;.    }.
2e90: 20 20 7d 0a 0a 20 20 2f 2a 20 61 6e 79 20 6f 74    }..  /* any ot
2ea0: 68 65 72 20 63 68 61 72 61 63 74 65 72 20 69 6e  her character in
2eb0: 73 65 72 74 69 6f 6e 20 6f 72 20 64 65 6c 65 74  sertion or delet
2ec0: 69 6f 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ion */.  return 
2ed0: 31 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  100;.}../*.** Di
2ee0: 76 69 64 65 20 74 68 65 20 69 6e 73 65 72 74 69  vide the inserti
2ef0: 6f 6e 20 63 6f 73 74 20 62 79 20 74 68 69 73 20  on cost by this 
2f00: 66 61 63 74 6f 72 20 77 68 65 6e 20 61 70 70 65  factor when appe
2f10: 6e 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  nding to the.** 
2f20: 65 6e 64 20 6f 66 20 74 68 65 20 77 6f 72 64 2e  end of the word.
2f30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 49 4e 41  .*/.#define FINA
2f40: 4c 5f 49 4e 53 5f 43 4f 53 54 5f 44 49 56 20 20  L_INS_COST_DIV  
2f50: 34 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  4../*.** Return 
2f60: 74 68 65 20 63 6f 73 74 20 6f 66 20 73 75 62 73  the cost of subs
2f70: 74 69 74 75 74 69 6e 67 20 63 54 6f 20 69 6e 20  tituting cTo in 
2f80: 70 6c 61 63 65 20 6f 66 20 63 46 72 6f 6d 20 61  place of cFrom a
2f90: 73 73 75 6d 69 6e 67 0a 2a 2a 20 74 68 65 20 70  ssuming.** the p
2fa0: 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74 65  revious characte
2fb0: 72 20 69 73 20 63 50 72 65 76 2e 20 20 49 66 20  r is cPrev.  If 
2fc0: 63 50 72 65 76 3d 3d 30 20 74 68 65 6e 20 63 54  cPrev==0 then cT
2fd0: 6f 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  o is the first.*
2fe0: 2a 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  * character of t
2ff0: 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74  he word..*/.stat
3000: 69 63 20 69 6e 74 20 73 75 62 73 74 69 74 75 74  ic int substitut
3010: 65 43 6f 73 74 28 63 68 61 72 20 63 50 72 65 76  eCost(char cPrev
3020: 2c 20 63 68 61 72 20 63 46 72 6f 6d 2c 20 63 68  , char cFrom, ch
3030: 61 72 20 63 54 6f 29 7b 0a 20 20 63 68 61 72 20  ar cTo){.  char 
3040: 63 6c 61 73 73 46 72 6f 6d 2c 20 63 6c 61 73 73  classFrom, class
3050: 54 6f 3b 0a 20 20 69 66 28 20 63 46 72 6f 6d 3d  To;.  if( cFrom=
3060: 3d 63 54 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 45  =cTo ){.    /* E
3070: 78 61 63 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20  xact match */.  
3080: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3090: 20 20 69 66 28 20 63 46 72 6f 6d 3d 3d 28 63 54    if( cFrom==(cT
30a0: 6f 5e 30 78 32 30 29 20 26 26 20 28 28 63 54 6f  o^0x20) && ((cTo
30b0: 3e 3d 27 41 27 20 26 26 20 63 54 6f 3c 3d 27 5a  >='A' && cTo<='Z
30c0: 27 29 20 7c 7c 20 28 63 54 6f 3e 3d 27 61 27 20  ') || (cTo>='a' 
30d0: 26 26 20 63 54 6f 3c 3d 27 7a 27 29 29 20 29 7b  && cTo<='z')) ){
30e0: 0a 20 20 20 20 2f 2a 20 64 69 66 66 65 72 20 6f  .    /* differ o
30f0: 6e 6c 79 20 69 6e 20 63 61 73 65 20 2a 2f 0a 20  nly in case */. 
3100: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3110: 0a 20 20 63 6c 61 73 73 46 72 6f 6d 20 3d 20 63  .  classFrom = c
3120: 68 61 72 61 63 74 65 72 43 6c 61 73 73 28 63 50  haracterClass(cP
3130: 72 65 76 2c 20 63 46 72 6f 6d 29 3b 0a 20 20 63  rev, cFrom);.  c
3140: 6c 61 73 73 54 6f 20 3d 20 63 68 61 72 61 63 74  lassTo = charact
3150: 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c 20 63  erClass(cPrev, c
3160: 54 6f 29 3b 0a 20 20 69 66 28 20 63 6c 61 73 73  To);.  if( class
3170: 46 72 6f 6d 3d 3d 63 6c 61 73 73 54 6f 20 29 7b  From==classTo ){
3180: 0a 20 20 20 20 2f 2a 20 53 61 6d 65 20 63 68 61  .    /* Same cha
3190: 72 61 63 74 65 72 20 63 6c 61 73 73 20 2a 2f 0a  racter class */.
31a0: 20 20 20 20 72 65 74 75 72 6e 20 34 30 3b 0a 20      return 40;. 
31b0: 20 7d 0a 20 20 69 66 28 20 63 6c 61 73 73 46 72   }.  if( classFr
31c0: 6f 6d 3e 3d 43 43 4c 41 53 53 5f 42 20 26 26 20  om>=CCLASS_B && 
31d0: 63 6c 61 73 73 46 72 6f 6d 3c 3d 43 43 4c 41 53  classFrom<=CCLAS
31e0: 53 5f 59 0a 20 20 20 20 20 20 26 26 20 63 6c 61  S_Y.      && cla
31f0: 73 73 54 6f 3e 3d 43 43 4c 41 53 53 5f 42 20 26  ssTo>=CCLASS_B &
3200: 26 20 63 6c 61 73 73 54 6f 3c 3d 43 43 4c 41 53  & classTo<=CCLAS
3210: 53 5f 59 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  S_Y ){.    /* Co
3220: 6e 76 65 72 74 20 66 72 6f 6d 20 6f 6e 65 20 63  nvert from one c
3230: 6f 6e 73 6f 6e 61 6e 74 20 74 6f 20 61 6e 6f 74  onsonant to anot
3240: 68 65 72 2c 20 62 75 74 20 69 6e 20 61 20 64 69  her, but in a di
3250: 66 66 65 72 65 6e 74 20 63 6c 61 73 73 20 2a 2f  fferent class */
3260: 0a 20 20 20 20 72 65 74 75 72 6e 20 37 35 3b 0a  .    return 75;.
3270: 20 20 7d 0a 20 20 2f 2a 20 41 6e 79 20 6f 74 68    }.  /* Any oth
3280: 65 72 20 73 75 62 73 69 74 75 74 69 6f 6e 20 2a  er subsitution *
3290: 2f 0a 20 20 72 65 74 75 72 6e 20 31 30 30 3b 0a  /.  return 100;.
32a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
32b0: 77 6f 20 73 74 72 69 6e 67 73 20 7a 41 20 61 6e  wo strings zA an
32c0: 64 20 7a 42 20 77 68 69 63 68 20 61 72 65 20 70  d zB which are p
32d0: 75 72 65 20 41 53 43 49 49 2c 20 72 65 74 75 72  ure ASCII, retur
32e0: 6e 20 74 68 65 20 63 6f 73 74 0a 2a 2a 20 6f 66  n the cost.** of
32f0: 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 7a 41   transforming zA
3300: 20 69 6e 74 6f 20 7a 42 2e 20 20 49 66 20 7a 41   into zB.  If zA
3310: 20 65 6e 64 73 20 77 69 74 68 20 27 2a 27 20 61   ends with '*' a
3320: 73 73 75 6d 65 20 74 68 61 74 20 69 74 20 69 73  ssume that it is
3330: 0a 2a 2a 20 61 20 70 72 65 66 69 78 20 6f 66 20  .** a prefix of 
3340: 7a 42 20 61 6e 64 20 67 69 76 65 20 6f 6e 6c 79  zB and give only
3350: 20 6d 69 6e 69 6d 61 6c 20 70 65 6e 61 6c 74 79   minimal penalty
3360: 20 66 6f 72 20 65 78 74 72 61 20 63 68 61 72 61   for extra chara
3370: 63 74 65 72 73 0a 2a 2a 20 6f 6e 20 74 68 65 20  cters.** on the 
3380: 65 6e 64 20 6f 66 20 7a 42 2e 0a 2a 2a 0a 2a 2a  end of zB..**.**
3390: 20 53 6d 61 6c 6c 65 72 20 6e 75 6d 62 65 72 73   Smaller numbers
33a0: 20 6d 65 61 6e 20 61 20 63 6c 6f 73 65 72 20 6d   mean a closer m
33b0: 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 4e 65 67 61  atch..**.** Nega
33c0: 74 69 76 65 20 76 61 6c 75 65 73 20 69 6e 64 69  tive values indi
33d0: 63 61 74 65 20 61 6e 20 65 72 72 6f 72 3a 0a 2a  cate an error:.*
33e0: 2a 20 20 20 20 2d 31 20 20 4f 6e 65 20 6f 66 20  *    -1  One of 
33f0: 74 68 65 20 69 6e 70 75 74 73 20 69 73 20 4e 55  the inputs is NU
3400: 4c 4c 0a 2a 2a 20 20 20 20 2d 32 20 20 4e 6f 6e  LL.**    -2  Non
3410: 2d 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72  -ASCII character
3420: 73 20 6f 6e 20 69 6e 70 75 74 0a 2a 2a 20 20 20  s on input.**   
3430: 20 2d 33 20 20 55 6e 61 62 6c 65 20 74 6f 20 61   -3  Unable to a
3440: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 0a  llocate memory .
3450: 2a 2a 0a 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68  **.** If pnMatch
3460: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
3470: 65 6e 20 2a 70 6e 4d 61 74 63 68 20 69 73 20 73  en *pnMatch is s
3480: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
3490: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20   of bytes.** of 
34a0: 7a 42 20 74 68 61 74 20 6d 61 74 63 68 65 64 20  zB that matched 
34b0: 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e 20 7a  the pattern in z
34c0: 41 2e 20 49 66 20 7a 41 20 64 6f 65 73 20 6e 6f  A. If zA does no
34d0: 74 20 65 6e 64 20 77 69 74 68 20 61 20 27 2a 27  t end with a '*'
34e0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 76  ,.** then this v
34f0: 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20 74  alue is always t
3500: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
3510: 65 73 20 69 6e 20 7a 42 20 28 69 2e 65 2e 20 73  es in zB (i.e. s
3520: 74 72 6c 65 6e 28 7a 42 29 29 2e 0a 2a 2a 20 49  trlen(zB))..** I
3530: 66 20 7a 41 20 64 6f 65 73 20 65 6e 64 20 69 6e  f zA does end in
3540: 20 61 20 27 2a 27 2c 20 74 68 65 6e 20 69 74 20   a '*', then it 
3550: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3560: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 72   bytes in the pr
3570: 65 66 69 78 0a 2a 2a 20 6f 66 20 7a 42 20 74 68  efix.** of zB th
3580: 61 74 20 77 61 73 20 64 65 65 6d 65 64 20 74 6f  at was deemed to
3590: 20 6d 61 74 63 68 20 7a 41 2e 0a 2a 2f 0a 73 74   match zA..*/.st
35a0: 61 74 69 63 20 69 6e 74 20 65 64 69 74 64 69 73  atic int editdis
35b0: 74 31 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t1(const char *z
35c0: 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  A, const char *z
35d0: 42 2c 20 69 6e 74 20 2a 70 6e 4d 61 74 63 68 29  B, int *pnMatch)
35e0: 7b 0a 20 20 69 6e 74 20 6e 41 2c 20 6e 42 3b 20  {.  int nA, nB; 
35f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3600: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
3610: 72 73 20 69 6e 20 7a 41 5b 5d 20 61 6e 64 20 7a  rs in zA[] and z
3620: 42 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 78 41 2c  B[] */.  int xA,
3630: 20 78 42 3b 20 20 20 20 20 20 20 20 20 20 20 20   xB;            
3640: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
3650: 20 66 6f 72 20 7a 41 5b 5d 20 61 6e 64 20 7a 42   for zA[] and zB
3660: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 63 41 2c  [] */.  char cA,
3670: 20 63 42 3b 20 20 20 20 20 20 20 20 20 20 20 2f   cB;           /
3680: 2a 20 43 75 72 72 65 6e 74 20 63 68 61 72 61 63  * Current charac
3690: 74 65 72 20 6f 66 20 7a 41 20 61 6e 64 20 7a 42  ter of zA and zB
36a0: 20 2a 2f 0a 20 20 63 68 61 72 20 63 41 70 72 65   */.  char cApre
36b0: 76 2c 20 63 42 70 72 65 76 3b 20 20 20 2f 2a 20  v, cBprev;   /* 
36c0: 50 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  Previous charact
36d0: 65 72 20 6f 66 20 7a 41 20 61 6e 64 20 7a 42 20  er of zA and zB 
36e0: 2a 2f 0a 20 20 63 68 61 72 20 63 41 6e 65 78 74  */.  char cAnext
36f0: 2c 20 63 42 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  , cBnext;   /* N
3700: 65 78 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  ext character in
3710: 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20 20   zA and zB */.  
3720: 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
3730: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 74 68 2d         /* North-
3740: 77 65 73 74 20 63 6f 73 74 20 76 61 6c 75 65 20  west cost value 
3750: 2a 2f 0a 20 20 69 6e 74 20 64 63 20 3d 20 30 3b  */.  int dc = 0;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3770: 6f 72 74 68 2d 77 65 73 74 20 63 68 61 72 61 63  orth-west charac
3780: 74 65 72 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ter value */.  i
3790: 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20  nt res;         
37a0: 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 72        /* Final r
37b0: 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  esult */.  int *
37c0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
37d0: 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6d 61    /* The cost ma
37e0: 74 72 69 78 20 2a 2f 0a 20 20 63 68 61 72 20 2a  trix */.  char *
37f0: 63 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  cx;             
3800: 20 2f 2a 20 43 6f 72 72 65 73 70 6f 6e 64 69 6e   /* Correspondin
3810: 67 20 63 68 61 72 61 63 74 65 72 20 76 61 6c 75  g character valu
3820: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 74 6f 46  es */.  int *toF
3830: 72 65 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ree = 0;       /
3840: 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65  * Malloced space
3850: 20 2a 2f 0a 20 20 69 6e 74 20 6d 53 74 61 63 6b   */.  int mStack
3860: 5b 36 30 2b 31 35 5d 3b 20 20 20 20 20 2f 2a 20  [60+15];     /* 
3870: 53 74 61 63 6b 20 73 70 61 63 65 20 74 6f 20 75  Stack space to u
3880: 73 65 20 69 66 20 6e 6f 74 20 74 6f 6f 20 6d 75  se if not too mu
3890: 63 68 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a  ch is needed */.
38a0: 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30    int nMatch = 0
38b0: 3b 0a 0a 20 20 2f 2a 20 45 61 72 6c 79 20 6f 75  ;..  /* Early ou
38c0: 74 20 69 66 20 65 69 74 68 65 72 20 69 6e 70 75  t if either inpu
38d0: 74 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  t is NULL */.  i
38e0: 66 28 20 7a 41 3d 3d 30 20 7c 7c 20 7a 42 3d 3d  f( zA==0 || zB==
38f0: 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a  0 ) return -1;..
3900: 20 20 2f 2a 20 53 6b 69 70 20 61 6e 79 20 63 6f    /* Skip any co
3910: 6d 6d 6f 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20  mmon prefix */. 
3920: 20 77 68 69 6c 65 28 20 7a 41 5b 30 5d 20 26 26   while( zA[0] &&
3930: 20 7a 41 5b 30 5d 3d 3d 7a 42 5b 30 5d 20 29 7b   zA[0]==zB[0] ){
3940: 20 64 63 20 3d 20 7a 41 5b 30 5d 3b 20 7a 41 2b   dc = zA[0]; zA+
3950: 2b 3b 20 7a 42 2b 2b 3b 20 6e 4d 61 74 63 68 2b  +; zB++; nMatch+
3960: 2b 3b 20 7d 0a 20 20 69 66 28 20 70 6e 4d 61 74  +; }.  if( pnMat
3970: 63 68 20 29 20 2a 70 6e 4d 61 74 63 68 20 3d 20  ch ) *pnMatch = 
3980: 6e 4d 61 74 63 68 3b 0a 20 20 69 66 28 20 7a 41  nMatch;.  if( zA
3990: 5b 30 5d 3d 3d 30 20 26 26 20 7a 42 5b 30 5d 3d  [0]==0 && zB[0]=
39a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
39b0: 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22  #if 0.  printf("
39c0: 41 3d 5c 22 25 73 5c 22 20 42 3d 5c 22 25 73 5c  A=\"%s\" B=\"%s\
39d0: 22 20 64 63 3d 25 63 5c 6e 22 2c 20 7a 41 2c 20  " dc=%c\n", zA, 
39e0: 7a 42 2c 20 64 63 3f 64 63 3a 27 20 27 29 3b 0a  zB, dc?dc:' ');.
39f0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 65 72  #endif..  /* Ver
3a00: 69 66 79 20 69 6e 70 75 74 20 73 74 72 69 6e 67  ify input string
3a10: 73 20 61 6e 64 20 6d 65 61 73 75 72 65 20 74 68  s and measure th
3a20: 65 69 72 20 6c 65 6e 67 74 68 73 20 2a 2f 0a 20  eir lengths */. 
3a30: 20 66 6f 72 28 6e 41 3d 30 3b 20 7a 41 5b 6e 41   for(nA=0; zA[nA
3a40: 5d 3b 20 6e 41 2b 2b 29 7b 0a 20 20 20 20 69 66  ]; nA++){.    if
3a50: 28 20 7a 41 5b 6e 41 5d 26 30 78 38 30 20 29 20  ( zA[nA]&0x80 ) 
3a60: 72 65 74 75 72 6e 20 2d 32 3b 0a 20 20 7d 0a 20  return -2;.  }. 
3a70: 20 66 6f 72 28 6e 42 3d 30 3b 20 7a 42 5b 6e 42   for(nB=0; zB[nB
3a80: 5d 3b 20 6e 42 2b 2b 29 7b 0a 20 20 20 20 69 66  ]; nB++){.    if
3a90: 28 20 7a 42 5b 6e 42 5d 26 30 78 38 30 20 29 20  ( zB[nB]&0x80 ) 
3aa0: 72 65 74 75 72 6e 20 2d 32 3b 0a 20 20 7d 0a 0a  return -2;.  }..
3ab0: 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70 72 6f    /* Special pro
3ac0: 63 65 73 73 69 6e 67 20 69 66 20 65 69 74 68 65  cessing if eithe
3ad0: 72 20 73 74 72 69 6e 67 20 69 73 20 65 6d 70 74  r string is empt
3ae0: 79 20 2a 2f 0a 20 20 69 66 28 20 6e 41 3d 3d 30  y */.  if( nA==0
3af0: 20 29 7b 0a 20 20 20 20 63 42 70 72 65 76 20 3d   ){.    cBprev =
3b00: 20 64 63 3b 0a 20 20 20 20 66 6f 72 28 78 42 3d   dc;.    for(xB=
3b10: 72 65 73 3d 30 3b 20 28 63 42 20 3d 20 7a 42 5b  res=0; (cB = zB[
3b20: 78 42 5d 29 21 3d 30 3b 20 78 42 2b 2b 29 7b 0a  xB])!=0; xB++){.
3b30: 20 20 20 20 20 20 72 65 73 20 2b 3d 20 69 6e 73        res += ins
3b40: 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28  ertOrDeleteCost(
3b50: 63 42 70 72 65 76 2c 20 63 42 2c 20 7a 42 5b 78  cBprev, cB, zB[x
3b60: 42 2b 31 5d 29 2f 46 49 4e 41 4c 5f 49 4e 53 5f  B+1])/FINAL_INS_
3b70: 43 4f 53 54 5f 44 49 56 3b 0a 20 20 20 20 20 20  COST_DIV;.      
3b80: 63 42 70 72 65 76 20 3d 20 63 42 3b 0a 20 20 20  cBprev = cB;.   
3b90: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65   }.    return re
3ba0: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 42 3d  s;.  }.  if( nB=
3bb0: 3d 30 20 29 7b 0a 20 20 20 20 63 41 70 72 65 76  =0 ){.    cAprev
3bc0: 20 3d 20 64 63 3b 0a 20 20 20 20 66 6f 72 28 78   = dc;.    for(x
3bd0: 41 3d 72 65 73 3d 30 3b 20 28 63 41 20 3d 20 7a  A=res=0; (cA = z
3be0: 41 5b 78 41 5d 29 21 3d 30 3b 20 78 41 2b 2b 29  A[xA])!=0; xA++)
3bf0: 7b 0a 20 20 20 20 20 20 72 65 73 20 2b 3d 20 69  {.      res += i
3c00: 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73  nsertOrDeleteCos
3c10: 74 28 63 41 70 72 65 76 2c 20 63 41 2c 20 7a 41  t(cAprev, cA, zA
3c20: 5b 78 41 2b 31 5d 29 3b 0a 20 20 20 20 20 20 63  [xA+1]);.      c
3c30: 41 70 72 65 76 20 3d 20 63 41 3b 0a 20 20 20 20  Aprev = cA;.    
3c40: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  }.    return res
3c50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 69 73  ;.  }..  /* A is
3c60: 20 61 20 70 72 65 66 69 78 20 6f 66 20 42 20 2a   a prefix of B *
3c70: 2f 0a 20 20 69 66 28 20 7a 41 5b 30 5d 3d 3d 27  /.  if( zA[0]=='
3c80: 2a 27 20 26 26 20 7a 41 5b 31 5d 3d 3d 30 20 29  *' && zA[1]==0 )
3c90: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
3ca0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
3cb0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 61 67  itialize the Wag
3cc0: 6e 65 72 20 6d 61 74 72 69 78 20 2a 2f 0a 20 20  ner matrix */.  
3cd0: 69 66 28 20 6e 42 3c 28 73 69 7a 65 6f 66 28 6d  if( nB<(sizeof(m
3ce0: 53 74 61 63 6b 29 2a 34 29 2f 28 73 69 7a 65 6f  Stack)*4)/(sizeo
3cf0: 66 28 6d 53 74 61 63 6b 5b 30 5d 29 2a 35 29 20  f(mStack[0])*5) 
3d00: 29 7b 0a 20 20 20 20 6d 20 3d 20 6d 53 74 61 63  ){.    m = mStac
3d10: 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
3d20: 6d 20 3d 20 74 6f 46 72 65 65 20 3d 20 73 71 6c  m = toFree = sql
3d30: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28 6e 42  ite3_malloc( (nB
3d40: 2b 31 29 2a 35 2a 73 69 7a 65 6f 66 28 6d 5b 30  +1)*5*sizeof(m[0
3d50: 5d 29 2f 34 20 29 3b 0a 20 20 20 20 69 66 28 20  ])/4 );.    if( 
3d60: 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 33  m==0 ) return -3
3d70: 3b 0a 20 20 7d 0a 20 20 63 78 20 3d 20 28 63 68  ;.  }.  cx = (ch
3d80: 61 72 2a 29 26 6d 5b 6e 42 2b 31 5d 3b 0a 0a 20  ar*)&m[nB+1];.. 
3d90: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
3da0: 57 61 67 6e 65 72 20 65 64 69 74 20 64 69 73 74  Wagner edit dist
3db0: 61 6e 63 65 20 2a 2f 0a 20 20 6d 5b 30 5d 20 3d  ance */.  m[0] =
3dc0: 20 30 3b 0a 20 20 63 78 5b 30 5d 20 3d 20 64 63   0;.  cx[0] = dc
3dd0: 3b 0a 20 20 63 42 70 72 65 76 20 3d 20 64 63 3b  ;.  cBprev = dc;
3de0: 0a 20 20 66 6f 72 28 78 42 3d 31 3b 20 78 42 3c  .  for(xB=1; xB<
3df0: 3d 6e 42 3b 20 78 42 2b 2b 29 7b 0a 20 20 20 20  =nB; xB++){.    
3e00: 63 42 6e 65 78 74 20 3d 20 7a 42 5b 78 42 5d 3b  cBnext = zB[xB];
3e10: 0a 20 20 20 20 63 42 20 3d 20 7a 42 5b 78 42 2d  .    cB = zB[xB-
3e20: 31 5d 3b 0a 20 20 20 20 63 78 5b 78 42 5d 20 3d  1];.    cx[xB] =
3e30: 20 63 42 3b 0a 20 20 20 20 6d 5b 78 42 5d 20 3d   cB;.    m[xB] =
3e40: 20 6d 5b 78 42 2d 31 5d 20 2b 20 69 6e 73 65 72   m[xB-1] + inser
3e50: 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63 42  tOrDeleteCost(cB
3e60: 70 72 65 76 2c 20 63 42 2c 20 63 42 6e 65 78 74  prev, cB, cBnext
3e70: 29 3b 0a 20 20 20 20 63 42 70 72 65 76 20 3d 20  );.    cBprev = 
3e80: 63 42 3b 0a 20 20 7d 0a 20 20 63 41 70 72 65 76  cB;.  }.  cAprev
3e90: 20 3d 20 64 63 3b 0a 20 20 66 6f 72 28 78 41 3d   = dc;.  for(xA=
3ea0: 31 3b 20 78 41 3c 3d 6e 41 3b 20 78 41 2b 2b 29  1; xA<=nA; xA++)
3eb0: 7b 0a 20 20 20 20 69 6e 74 20 6c 61 73 74 41 20  {.    int lastA 
3ec0: 3d 20 28 78 41 3d 3d 6e 41 29 3b 0a 20 20 20 20  = (xA==nA);.    
3ed0: 63 41 20 3d 20 7a 41 5b 78 41 2d 31 5d 3b 0a 20  cA = zA[xA-1];. 
3ee0: 20 20 20 63 41 6e 65 78 74 20 3d 20 7a 41 5b 78     cAnext = zA[x
3ef0: 41 5d 3b 0a 20 20 20 20 69 66 28 20 63 41 3d 3d  A];.    if( cA==
3f00: 27 2a 27 20 26 26 20 6c 61 73 74 41 20 29 20 62  '*' && lastA ) b
3f10: 72 65 61 6b 3b 0a 20 20 20 20 64 20 3d 20 6d 5b  reak;.    d = m[
3f20: 30 5d 3b 0a 20 20 20 20 64 63 20 3d 20 63 78 5b  0];.    dc = cx[
3f30: 30 5d 3b 0a 20 20 20 20 6d 5b 30 5d 20 3d 20 64  0];.    m[0] = d
3f40: 20 2b 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74   + insertOrDelet
3f50: 65 43 6f 73 74 28 63 41 70 72 65 76 2c 20 63 41  eCost(cAprev, cA
3f60: 2c 20 63 41 6e 65 78 74 29 3b 0a 20 20 20 20 63  , cAnext);.    c
3f70: 42 70 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 66  Bprev = 0;.    f
3f80: 6f 72 28 78 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b  or(xB=1; xB<=nB;
3f90: 20 78 42 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e   xB++){.      in
3fa0: 74 20 74 6f 74 61 6c 43 6f 73 74 2c 20 69 6e 73  t totalCost, ins
3fb0: 43 6f 73 74 2c 20 64 65 6c 43 6f 73 74 2c 20 73  Cost, delCost, s
3fc0: 75 62 43 6f 73 74 2c 20 6e 63 78 3b 0a 20 20 20  ubCost, ncx;.   
3fd0: 20 20 20 63 42 20 3d 20 7a 42 5b 78 42 2d 31 5d     cB = zB[xB-1]
3fe0: 3b 0a 20 20 20 20 20 20 63 42 6e 65 78 74 20 3d  ;.      cBnext =
3ff0: 20 7a 42 5b 78 42 5d 3b 0a 0a 20 20 20 20 20 20   zB[xB];..      
4000: 2f 2a 20 43 6f 73 74 20 74 6f 20 69 6e 73 65 72  /* Cost to inser
4010: 74 20 63 42 20 2a 2f 0a 20 20 20 20 20 20 69 6e  t cB */.      in
4020: 73 43 6f 73 74 20 3d 20 69 6e 73 65 72 74 4f 72  sCost = insertOr
4030: 44 65 6c 65 74 65 43 6f 73 74 28 63 78 5b 78 42  DeleteCost(cx[xB
4040: 2d 31 5d 2c 20 63 42 2c 20 63 42 6e 65 78 74 29  -1], cB, cBnext)
4050: 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74  ;.      if( last
4060: 41 20 29 20 69 6e 73 43 6f 73 74 20 2f 3d 20 46  A ) insCost /= F
4070: 49 4e 41 4c 5f 49 4e 53 5f 43 4f 53 54 5f 44 49  INAL_INS_COST_DI
4080: 56 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 73  V;..      /* Cos
4090: 74 20 74 6f 20 64 65 6c 65 74 65 20 63 41 20 2a  t to delete cA *
40a0: 2f 0a 20 20 20 20 20 20 64 65 6c 43 6f 73 74 20  /.      delCost 
40b0: 3d 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65  = insertOrDelete
40c0: 43 6f 73 74 28 63 78 5b 78 42 5d 2c 20 63 41 2c  Cost(cx[xB], cA,
40d0: 20 63 42 6e 65 78 74 29 3b 0a 0a 20 20 20 20 20   cBnext);..     
40e0: 20 2f 2a 20 43 6f 73 74 20 74 6f 20 73 75 62 73   /* Cost to subs
40f0: 74 69 74 75 74 65 20 63 41 2d 3e 63 42 20 2a 2f  titute cA->cB */
4100: 0a 20 20 20 20 20 20 73 75 62 43 6f 73 74 20 3d  .      subCost =
4110: 20 73 75 62 73 74 69 74 75 74 65 43 6f 73 74 28   substituteCost(
4120: 63 78 5b 78 42 2d 31 5d 2c 20 63 41 2c 20 63 42  cx[xB-1], cA, cB
4130: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 73  );..      /* Bes
4140: 74 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20  t cost */.      
4150: 74 6f 74 61 6c 43 6f 73 74 20 3d 20 69 6e 73 43  totalCost = insC
4160: 6f 73 74 20 2b 20 6d 5b 78 42 2d 31 5d 3b 0a 20  ost + m[xB-1];. 
4170: 20 20 20 20 20 6e 63 78 20 3d 20 63 42 3b 0a 20       ncx = cB;. 
4180: 20 20 20 20 20 69 66 28 20 28 64 65 6c 43 6f 73       if( (delCos
4190: 74 20 2b 20 6d 5b 78 42 5d 29 3c 74 6f 74 61 6c  t + m[xB])<total
41a0: 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
41b0: 74 6f 74 61 6c 43 6f 73 74 20 3d 20 64 65 6c 43  totalCost = delC
41c0: 6f 73 74 20 2b 20 6d 5b 78 42 5d 3b 0a 20 20 20  ost + m[xB];.   
41d0: 20 20 20 20 20 6e 63 78 20 3d 20 63 41 3b 0a 20       ncx = cA;. 
41e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
41f0: 20 28 73 75 62 43 6f 73 74 20 2b 20 64 29 3c 74   (subCost + d)<t
4200: 6f 74 61 6c 43 6f 73 74 20 29 7b 0a 20 20 20 20  otalCost ){.    
4210: 20 20 20 20 74 6f 74 61 6c 43 6f 73 74 20 3d 20      totalCost = 
4220: 73 75 62 43 6f 73 74 20 2b 20 64 3b 0a 20 20 20  subCost + d;.   
4230: 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20     }..#if 0.    
4240: 20 20 70 72 69 6e 74 66 28 22 25 64 2c 25 64 20    printf("%d,%d 
4250: 64 3d 25 34 64 20 75 3d 25 34 64 20 72 3d 25 34  d=%4d u=%4d r=%4
4260: 64 20 64 63 3d 25 63 20 63 41 3d 25 63 20 63 42  d dc=%c cA=%c cB
4270: 3d 25 63 22 0a 20 20 20 20 20 20 20 20 20 20 20  =%c".           
4280: 20 20 22 20 69 6e 73 3d 25 34 64 20 64 65 6c 3d    " ins=%4d del=
4290: 25 34 64 20 73 75 62 3d 25 34 64 20 74 3d 25 34  %4d sub=%4d t=%4
42a0: 64 20 6e 63 78 3d 25 63 5c 6e 22 2c 0a 20 20 20  d ncx=%c\n",.   
42b0: 20 20 20 20 20 20 20 20 20 20 78 41 2c 20 78 42            xA, xB
42c0: 2c 20 64 2c 20 6d 5b 78 42 5d 2c 20 6d 5b 78 42  , d, m[xB], m[xB
42d0: 2d 31 5d 2c 20 64 63 3f 64 63 3a 27 20 27 2c 20  -1], dc?dc:' ', 
42e0: 63 41 2c 20 63 42 2c 0a 20 20 20 20 20 20 20 20  cA, cB,.        
42f0: 20 20 20 20 20 69 6e 73 43 6f 73 74 2c 20 64 65       insCost, de
4300: 6c 43 6f 73 74 2c 20 73 75 62 43 6f 73 74 2c 20  lCost, subCost, 
4310: 74 6f 74 61 6c 43 6f 73 74 2c 20 6e 63 78 3f 6e  totalCost, ncx?n
4320: 63 78 3a 27 20 27 29 3b 0a 23 65 6e 64 69 66 0a  cx:' ');.#endif.
4330: 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
4340: 20 74 68 65 20 6d 61 74 72 69 78 20 2a 2f 0a 20   the matrix */. 
4350: 20 20 20 20 20 64 20 3d 20 6d 5b 78 42 5d 3b 0a       d = m[xB];.
4360: 20 20 20 20 20 20 64 63 20 3d 20 63 78 5b 78 42        dc = cx[xB
4370: 5d 3b 0a 20 20 20 20 20 20 6d 5b 78 42 5d 20 3d  ];.      m[xB] =
4380: 20 74 6f 74 61 6c 43 6f 73 74 3b 0a 20 20 20 20   totalCost;.    
4390: 20 20 63 78 5b 78 42 5d 20 3d 20 6e 63 78 3b 0a    cx[xB] = ncx;.
43a0: 20 20 20 20 20 20 63 42 70 72 65 76 20 3d 20 63        cBprev = c
43b0: 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 41 70  B;.    }.    cAp
43c0: 72 65 76 20 3d 20 63 41 3b 0a 20 20 7d 0a 0a 20  rev = cA;.  }.. 
43d0: 20 2f 2a 20 46 72 65 65 20 74 68 65 20 77 61 67   /* Free the wag
43e0: 6e 65 72 20 6d 61 74 72 69 78 20 61 6e 64 20 72  ner matrix and r
43f0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
4400: 20 2a 2f 0a 20 20 69 66 28 20 63 41 3d 3d 27 2a   */.  if( cA=='*
4410: 27 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 6d  ' ){.    res = m
4420: 5b 31 5d 3b 0a 20 20 20 20 66 6f 72 28 78 42 3d  [1];.    for(xB=
4430: 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b 2b 29  1; xB<=nB; xB++)
4440: 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 5b 78 42  {.      if( m[xB
4450: 5d 3c 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ]<res ){.       
4460: 20 72 65 73 20 3d 20 6d 5b 78 42 5d 3b 0a 20 20   res = m[xB];.  
4470: 20 20 20 20 20 20 69 66 28 20 70 6e 4d 61 74 63        if( pnMatc
4480: 68 20 29 20 2a 70 6e 4d 61 74 63 68 20 3d 20 78  h ) *pnMatch = x
4490: 42 2b 6e 4d 61 74 63 68 3b 0a 20 20 20 20 20 20  B+nMatch;.      
44a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
44b0: 0a 20 20 20 20 72 65 73 20 3d 20 6d 5b 6e 42 5d  .    res = m[nB]
44c0: 3b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20  ;.    /* In the 
44d0: 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
44e0: 74 61 74 69 6f 6e 2c 20 70 6e 4d 61 74 63 68 20  tation, pnMatch 
44f0: 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c 20 69  is always NULL i
4500: 66 20 7a 41 20 64 6f 65 73 0a 20 20 20 20 2a 2a  f zA does.    **
4510: 20 6e 6f 74 20 65 6e 64 20 69 6e 20 22 2a 22 20   not end in "*" 
4520: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
4530: 6e 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 20 20 7d  nMatch==0 );.  }
4540: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4550: 74 6f 46 72 65 65 29 3b 0a 20 20 72 65 74 75 72  toFree);.  retur
4560: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
4570: 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65 64 69  Function:    edi
4580: 74 64 69 73 74 28 41 2c 42 29 0a 2a 2a 0a 2a 2a  tdist(A,B).**.**
4590: 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
45a0: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
45b0: 20 73 74 72 69 6e 67 20 41 20 69 6e 74 6f 20 73   string A into s
45c0: 74 72 69 6e 67 20 42 2e 20 20 42 6f 74 68 20 73  tring B.  Both s
45d0: 74 72 69 6e 67 73 0a 2a 2a 20 6d 75 73 74 20 62  trings.** must b
45e0: 65 20 70 75 72 65 20 41 53 43 49 49 20 74 65 78  e pure ASCII tex
45f0: 74 2e 20 20 49 66 20 41 20 65 6e 64 73 20 77 69  t.  If A ends wi
4600: 74 68 20 27 2a 27 20 74 68 65 6e 20 69 74 20 69  th '*' then it i
4610: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 0a  s assumed to be.
4620: 2a 2a 20 61 20 70 72 65 66 69 78 20 6f 66 20 42  ** a prefix of B
4630: 20 61 6e 64 20 65 78 74 72 61 20 63 68 61 72 61   and extra chara
4640: 63 74 65 72 73 20 6f 6e 20 74 68 65 20 65 6e 64  cters on the end
4650: 20 6f 66 20 42 20 68 61 76 65 20 6d 69 6e 69 6d   of B have minim
4660: 61 6c 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  al additional.**
4670: 20 63 6f 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   cost..*/.static
4680: 20 76 6f 69 64 20 65 64 69 74 64 69 73 74 53 71   void editdistSq
4690: 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  lFunc(.  sqlite3
46a0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
46b0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
46c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
46d0: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
46e0: 65 73 20 3d 20 65 64 69 74 64 69 73 74 31 28 0a  es = editdist1(.
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
4710: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
4720: 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20  ext(argv[0]),.  
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73    (const char*)s
4750: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
4760: 74 28 61 72 67 76 5b 31 5d 29 2c 0a 20 20 20 20  t(argv[1]),.    
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 30 29 3b 0a 20 20 69 66 28 20 72 65 73 3c 30 20  0);.  if( res<0 
4790: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ){.    if( res==
47a0: 28 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 73 71  (-3) ){.      sq
47b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
47c0: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
47d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
47e0: 20 72 65 73 3d 3d 28 2d 32 29 20 29 7b 0a 20 20   res==(-2) ){.  
47f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4800: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
4810: 2c 20 22 6e 6f 6e 2d 41 53 43 49 49 20 69 6e 70  , "non-ASCII inp
4820: 75 74 20 74 6f 20 65 64 69 74 64 69 73 74 28 29  ut to editdist()
4830: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73  ", -1);.    }els
4840: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
4850: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
4860: 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70  ntext, "NULL inp
4870: 75 74 20 74 6f 20 65 64 69 74 64 69 73 74 28 29  ut to editdist()
4880: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ", -1);.    }.  
4890: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 73 71 6c 69  }else{ .    sqli
48a0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
48b0: 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b 0a 20 20  ontext, res);.  
48c0: 7d 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74  }.}../* End of t
48d0: 68 65 20 66 69 78 65 64 2d 63 6f 73 74 20 65 64  he fixed-cost ed
48e0: 69 74 20 64 69 73 74 61 6e 63 65 20 69 6d 70 6c  it distance impl
48f0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 2a 2a 2a  ementation.*****
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4990: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e  *******.** Begin
49a0: 3a 20 43 6f 6e 66 69 67 75 72 61 62 6c 65 20 63  : Configurable c
49b0: 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64 69 74  ost unicode edit
49c0: 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74 69 6e   distance routin
49d0: 65 73 0a 2a 2f 0a 2f 2a 20 46 6f 72 77 61 72 64  es.*/./* Forward
49e0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20   declaration of 
49f0: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 74 79  structures */.ty
4a00: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69  pedef struct Edi
4a10: 74 44 69 73 74 33 43 6f 73 74 20 45 64 69 74 44  tDist3Cost EditD
4a20: 69 73 74 33 43 6f 73 74 3b 0a 74 79 70 65 64 65  ist3Cost;.typede
4a30: 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69 73  f struct EditDis
4a40: 74 33 43 6f 6e 66 69 67 20 45 64 69 74 44 69 73  t3Config EditDis
4a50: 74 33 43 6f 6e 66 69 67 3b 0a 74 79 70 65 64 65  t3Config;.typede
4a60: 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69 73  f struct EditDis
4a70: 74 33 50 6f 69 6e 74 20 45 64 69 74 44 69 73 74  t3Point EditDist
4a80: 33 50 6f 69 6e 74 3b 0a 74 79 70 65 64 65 66 20  3Point;.typedef 
4a90: 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33  struct EditDist3
4aa0: 46 72 6f 6d 20 45 64 69 74 44 69 73 74 33 46 72  From EditDist3Fr
4ab0: 6f 6d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  om;.typedef stru
4ac0: 63 74 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  ct EditDist3From
4ad0: 53 74 72 69 6e 67 20 45 64 69 74 44 69 73 74 33  String EditDist3
4ae0: 46 72 6f 6d 53 74 72 69 6e 67 3b 0a 74 79 70 65  FromString;.type
4af0: 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44  def struct EditD
4b00: 69 73 74 33 54 6f 20 45 64 69 74 44 69 73 74 33  ist3To EditDist3
4b10: 54 6f 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  To;.typedef stru
4b20: 63 74 20 45 64 69 74 44 69 73 74 33 54 6f 53 74  ct EditDist3ToSt
4b30: 72 69 6e 67 20 45 64 69 74 44 69 73 74 33 54 6f  ring EditDist3To
4b40: 53 74 72 69 6e 67 3b 0a 74 79 70 65 64 65 66 20  String;.typedef 
4b50: 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33  struct EditDist3
4b60: 4c 61 6e 67 20 45 64 69 74 44 69 73 74 33 4c 61  Lang EditDist3La
4b70: 6e 67 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 65  ng;.../*.** An e
4b80: 6e 74 72 79 20 69 6e 20 74 68 65 20 65 64 69 74  ntry in the edit
4b90: 20 63 6f 73 74 20 74 61 62 6c 65 0a 2a 2f 0a 73   cost table.*/.s
4ba0: 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33 43  truct EditDist3C
4bb0: 6f 73 74 20 7b 0a 20 20 45 64 69 74 44 69 73 74  ost {.  EditDist
4bc0: 33 43 6f 73 74 20 2a 70 4e 65 78 74 3b 20 20 20  3Cost *pNext;   
4bd0: 20 20 2f 2a 20 4e 65 78 74 20 63 6f 73 74 20 65    /* Next cost e
4be0: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 38 20 6e  lement */.  u8 n
4bf0: 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
4c00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4c10: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 46 72 6f  of bytes in aFro
4c20: 6d 20 2a 2f 0a 20 20 75 38 20 6e 54 6f 3b 20 20  m */.  u8 nTo;  
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
4c50: 74 65 73 20 69 6e 20 61 54 6f 20 2a 2f 0a 20 20  tes in aTo */.  
4c60: 75 31 36 20 69 43 6f 73 74 3b 20 20 20 20 20 20  u16 iCost;      
4c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73            /* Cos
4c80: 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 66  t of this transf
4c90: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  ormation */.  ch
4ca0: 61 72 20 61 5b 34 5d 20 20 20 20 3b 20 20 20 20  ar a[4]    ;    
4cb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20          /* FROM 
4cc0: 73 74 72 69 6e 67 20 66 6f 6c 6c 6f 77 65 64 20  string followed 
4cd0: 62 79 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a  by TO string */.
4ce0: 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20    /* Additional 
4cf0: 54 4f 20 61 6e 64 20 46 52 4f 4d 20 73 74 72 69  TO and FROM stri
4d00: 6e 67 20 62 79 74 65 73 20 61 70 70 65 6e 64 65  ng bytes appende
4d10: 64 20 61 73 20 6e 65 63 65 73 73 61 72 79 20 2a  d as necessary *
4d20: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 64 69 74  /.};../*.** Edit
4d30: 20 63 6f 73 74 73 20 66 6f 72 20 61 20 70 61 72   costs for a par
4d40: 74 69 63 75 6c 61 72 20 6c 61 6e 67 75 61 67 65  ticular language
4d50: 20 49 44 20 0a 2a 2f 0a 73 74 72 75 63 74 20 45   ID .*/.struct E
4d60: 64 69 74 44 69 73 74 33 4c 61 6e 67 20 7b 0a 20  ditDist3Lang {. 
4d70: 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20 20 20 20   int iLang;     
4d80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
4d90: 61 67 65 20 49 44 20 2a 2f 0a 20 20 69 6e 74 20  age ID */.  int 
4da0: 69 49 6e 73 43 6f 73 74 3b 20 20 20 20 20 20 20  iInsCost;       
4db0: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 69 6e     /* Default in
4dc0: 73 65 72 74 69 6f 6e 20 63 6f 73 74 20 2a 2f 0a  sertion cost */.
4dd0: 20 20 69 6e 74 20 69 44 65 6c 43 6f 73 74 3b 20    int iDelCost; 
4de0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61           /* Defa
4df0: 75 6c 74 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73  ult deletion cos
4e00: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 43  t */.  int iSubC
4e10: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ost;          /*
4e20: 20 44 65 66 61 75 6c 74 20 73 75 62 73 74 69 74   Default substit
4e30: 75 74 69 6f 6e 20 63 6f 73 74 20 2a 2f 0a 20 20  ution cost */.  
4e40: 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 70  EditDist3Cost *p
4e50: 43 6f 73 74 3b 20 20 2f 2a 20 43 6f 73 74 73 20  Cost;  /* Costs 
4e60: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  */.};.../*.** Th
4e70: 65 20 64 65 66 61 75 6c 74 20 45 64 69 74 44 69  e default EditDi
4e80: 73 74 33 4c 61 6e 67 20 6f 62 6a 65 63 74 2c 20  st3Lang object, 
4e90: 77 69 74 68 20 64 65 66 61 75 6c 74 20 63 6f 73  with default cos
4ea0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ts..*/.static co
4eb0: 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e  nst EditDist3Lan
4ec0: 67 20 65 64 69 74 44 69 73 74 33 4c 61 6e 67 20  g editDist3Lang 
4ed0: 3d 20 7b 20 30 2c 20 31 30 30 2c 20 31 30 30 2c  = { 0, 100, 100,
4ee0: 20 31 35 30 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a   150, 0 };../*.*
4ef0: 2a 20 43 6f 6d 70 6c 65 74 65 20 63 6f 6e 66 69  * Complete confi
4f00: 67 75 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 72 75  guration.*/.stru
4f10: 63 74 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66  ct EditDist3Conf
4f20: 69 67 20 7b 0a 20 20 69 6e 74 20 6e 4c 61 6e 67  ig {.  int nLang
4f30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4f40: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 61 6e 67 75   Number of langu
4f50: 61 67 65 20 49 44 73 2e 20 20 53 69 7a 65 20 6f  age IDs.  Size o
4f60: 66 20 61 5b 5d 20 2a 2f 0a 20 20 45 64 69 74 44  f a[] */.  EditD
4f70: 69 73 74 33 4c 61 6e 67 20 2a 61 3b 20 20 20 20  ist3Lang *a;    
4f80: 20 20 2f 2a 20 4f 6e 65 20 66 6f 72 20 65 61 63    /* One for eac
4f90: 68 20 64 69 73 74 69 6e 63 74 20 6c 61 6e 67 75  h distinct langu
4fa0: 61 67 65 20 49 44 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  age ID */.};../*
4fb0: 0a 2a 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d  .** Extra inform
4fc0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68  ation about each
4fd0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
4fe0: 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 2e 0a 2a  e FROM string..*
4ff0: 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44 69 73  /.struct EditDis
5000: 74 33 46 72 6f 6d 20 7b 0a 20 20 69 6e 74 20 6e  t3From {.  int n
5010: 53 75 62 73 74 3b 20 20 20 20 20 20 20 20 20 20  Subst;          
5020: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5030: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 63 6f   substitution co
5040: 73 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20  st entries */.  
5050: 69 6e 74 20 6e 44 65 6c 3b 20 20 20 20 20 20 20  int nDel;       
5060: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5070: 65 72 20 6f 66 20 64 65 6c 65 74 69 6f 6e 20 63  er of deletion c
5080: 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20  ost entries */. 
5090: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
50a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
50b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
50c0: 74 68 69 73 20 63 68 61 72 61 63 74 65 72 20 2a  this character *
50d0: 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73  /.  EditDist3Cos
50e0: 74 20 2a 2a 61 70 53 75 62 73 74 3b 20 2f 2a 20  t **apSubst; /* 
50f0: 41 72 72 61 79 20 6f 66 20 73 75 62 73 74 69 74  Array of substit
5100: 75 74 69 6f 6e 20 63 6f 73 74 73 20 66 6f 72 20  ution costs for 
5110: 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  this element */.
5120: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
5130: 2a 2a 61 70 44 65 6c 3b 20 20 20 2f 2a 20 41 72  **apDel;   /* Ar
5140: 72 61 79 20 6f 66 20 64 65 6c 65 74 69 6f 6e 20  ray of deletion 
5150: 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a  cost entries */.
5160: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 72 65 63  };../*.** A prec
5170: 6f 6d 70 69 6c 65 64 20 46 52 4f 4d 20 73 74 72  ompiled FROM str
5180: 69 6e 67 2e 0a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ing..*.** In the
5190: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 65 20   common case we 
51a0: 65 78 70 65 63 74 20 74 68 65 20 46 52 4f 4d 20  expect the FROM 
51b0: 73 74 72 69 6e 67 20 74 6f 20 62 65 20 72 65 75  string to be reu
51c0: 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  sed multiple tim
51d0: 65 73 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  es..** In other 
51e0: 77 6f 72 64 73 2c 20 74 68 65 20 63 6f 6d 6d 6f  words, the commo
51f0: 6e 20 63 61 73 65 20 77 69 6c 6c 20 62 65 20 74  n case will be t
5200: 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 65 64  o measure the ed
5210: 69 74 20 64 69 73 74 61 6e 63 65 0a 2a 2a 20 66  it distance.** f
5220: 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 6f 72 69  rom a single ori
5230: 67 69 6e 20 73 74 72 69 6e 67 20 74 6f 20 6d 75  gin string to mu
5240: 6c 74 69 70 6c 65 20 74 61 72 67 65 74 20 73 74  ltiple target st
5250: 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  rings..*/.struct
5260: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
5270: 72 69 6e 67 20 7b 0a 20 20 63 68 61 72 20 2a 7a  ring {.  char *z
5280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5290: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
52a0: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 46 52  e text of the FR
52b0: 4f 4d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69  OM string */.  i
52c0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
52d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
52e0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
52f0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 73 74 72 69  in the FROM stri
5300: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 50 72  ng */.  int isPr
5310: 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
5320: 20 2f 2a 20 54 72 75 65 20 69 66 20 65 6e 64 73   /* True if ends
5330: 20 77 69 74 68 20 27 2a 27 20 63 68 61 72 61 63   with '*' charac
5340: 74 65 72 20 2a 2f 0a 20 20 45 64 69 74 44 69 73  ter */.  EditDis
5350: 74 33 46 72 6f 6d 20 2a 61 3b 20 20 20 20 20 20  t3From *a;      
5360: 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 20    /* Extra info 
5370: 61 62 6f 75 74 20 65 61 63 68 20 63 68 61 72 20  about each char 
5380: 6f 66 20 74 68 65 20 46 52 4f 4d 20 73 74 72 69  of the FROM stri
5390: 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ng */.};../*.** 
53a0: 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  Extra informatio
53b0: 6e 20 61 62 6f 75 74 20 65 61 63 68 20 63 68 61  n about each cha
53c0: 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 54 4f  racter in the TO
53d0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75   string..*/.stru
53e0: 63 74 20 45 64 69 74 44 69 73 74 33 54 6f 20 7b  ct EditDist3To {
53f0: 0a 20 20 69 6e 74 20 6e 49 6e 73 3b 20 20 20 20  .  int nIns;    
5400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5410: 75 6d 62 65 72 20 6f 66 20 69 6e 73 65 72 74 69  umber of inserti
5420: 6f 6e 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20  on cost entries 
5430: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5450: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
5460: 20 69 6e 20 74 68 69 73 20 63 68 61 72 61 63 74   in this charact
5470: 65 72 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74  er */.  EditDist
5480: 33 43 6f 73 74 20 2a 2a 61 70 49 6e 73 3b 20 20  3Cost **apIns;  
5490: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 64 65 6c   /* Array of del
54a0: 65 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74 72 69  etion cost entri
54b0: 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
54c0: 41 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 46 52  A precompiled FR
54d0: 4f 4d 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 72  OM string.*/.str
54e0: 75 63 74 20 45 64 69 74 44 69 73 74 33 54 6f 53  uct EditDist3ToS
54f0: 74 72 69 6e 67 20 7b 0a 20 20 63 68 61 72 20 2a  tring {.  char *
5500: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
5510: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65     /* The comple
5520: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 54  te text of the T
5530: 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  O string */.  in
5540: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
5550: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5560: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
5570: 6e 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20  n the TO string 
5580: 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 54 6f  */.  EditDist3To
5590: 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   *a;          /*
55a0: 20 45 78 74 72 61 20 69 6e 66 6f 20 61 62 6f 75   Extra info abou
55b0: 74 20 65 61 63 68 20 63 68 61 72 20 6f 66 20 74  t each char of t
55c0: 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a  he TO string */.
55d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  };../*.** Clear 
55e0: 6f 72 20 64 65 6c 65 74 65 20 61 6e 20 69 6e 73  or delete an ins
55f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 6f 62 6a  tance of the obj
5600: 65 63 74 20 74 68 61 74 20 72 65 63 6f 72 64 73  ect that records
5610: 20 61 6c 6c 20 65 64 69 74 2d 64 69 73 74 61 6e   all edit-distan
5620: 63 65 0a 2a 2a 20 77 65 69 67 68 74 73 2e 0a 2a  ce.** weights..*
5630: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 64  /.static void ed
5640: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43 6c 65  itDist3ConfigCle
5650: 61 72 28 45 64 69 74 44 69 73 74 33 43 6f 6e 66  ar(EditDist3Conf
5660: 69 67 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  ig *p){.  int i;
5670: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
5680: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
5690: 20 69 3c 70 2d 3e 6e 4c 61 6e 67 3b 20 69 2b 2b   i<p->nLang; i++
56a0: 29 7b 0a 20 20 20 20 45 64 69 74 44 69 73 74 33  ){.    EditDist3
56b0: 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 2a 70 4e  Cost *pCost, *pN
56c0: 65 78 74 3b 0a 20 20 20 20 70 43 6f 73 74 20 3d  ext;.    pCost =
56d0: 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 73 74 3b 0a   p->a[i].pCost;.
56e0: 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 73 74      while( pCost
56f0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20   ){.      pNext 
5700: 3d 20 70 43 6f 73 74 2d 3e 70 4e 65 78 74 3b 0a  = pCost->pNext;.
5710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
5720: 65 65 28 70 43 6f 73 74 29 3b 0a 20 20 20 20 20  ee(pCost);.     
5730: 20 70 43 6f 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pCost = pNext;.
5740: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
5750: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 29 3b 0a  te3_free(p->a);.
5760: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
5770: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 73 74  izeof(*p));.}.st
5780: 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 44 69  atic void editDi
5790: 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74 65 28  st3ConfigDelete(
57a0: 76 6f 69 64 20 2a 70 49 6e 29 7b 0a 20 20 45 64  void *pIn){.  Ed
57b0: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70  itDist3Config *p
57c0: 20 3d 20 28 45 64 69 74 44 69 73 74 33 43 6f 6e   = (EditDist3Con
57d0: 66 69 67 2a 29 70 49 6e 3b 0a 20 20 65 64 69 74  fig*)pIn;.  edit
57e0: 44 69 73 74 33 43 6f 6e 66 69 67 43 6c 65 61 72  Dist3ConfigClear
57f0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  (p);.  sqlite3_f
5800: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
5810: 20 4c 6f 61 64 20 61 6c 6c 20 65 64 69 74 2d 64   Load all edit-d
5820: 69 73 74 61 6e 63 65 20 77 65 69 67 68 74 73 20  istance weights 
5830: 66 72 6f 6d 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  from a table..*/
5840: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74  .static int edit
5850: 44 69 73 74 33 43 6f 6e 66 69 67 4c 6f 61 64 28  Dist3ConfigLoad(
5860: 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66  .  EditDist3Conf
5870: 69 67 20 2a 70 2c 20 20 20 20 20 20 2f 2a 20 54  ig *p,      /* T
5880: 68 65 20 65 64 69 74 20 64 69 73 74 61 6e 63 65  he edit distance
5890: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
58a0: 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o load */.  sqli
58b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
58c0: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 66 72 6f 6d      /* Load from
58d0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
58e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
58f0: 7a 54 61 62 6c 65 20 20 20 20 20 20 2f 2a 20 4e  zTable      /* N
5900: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5910: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 6c   from which to l
5920: 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  oad */.){.  sqli
5930: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
5940: 0a 20 20 69 6e 74 20 72 63 2c 20 72 63 32 3b 0a  .  int rc, rc2;.
5950: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
5960: 69 6e 74 20 69 4c 61 6e 67 50 72 65 76 20 3d 20  int iLangPrev = 
5970: 2d 39 39 39 39 3b 0a 20 20 45 64 69 74 44 69 73  -9999;.  EditDis
5980: 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 20 3d 20  t3Lang *pLang = 
5990: 30 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  0;..  zSql = sql
59a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
59b0: 4c 45 43 54 20 69 4c 61 6e 67 2c 20 63 46 72 6f  LECT iLang, cFro
59c0: 6d 2c 20 63 54 6f 2c 20 69 43 6f 73 74 22 0a 20  m, cTo, iCost". 
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 20 20 20 20 20 22 20 46 52 4f 4d 20 5c          " FROM \
59f0: 22 25 77 5c 22 20 57 48 45 52 45 20 69 4c 61 6e  "%w\" WHERE iLan
5a00: 67 3e 3d 30 20 4f 52 44 45 52 20 42 59 20 69 4c  g>=0 ORDER BY iL
5a10: 61 6e 67 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  ang", zTable);. 
5a20: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
5a30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5a40: 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  EM;.  rc = sqlit
5a50: 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
5a60: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5a70: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5a80: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28  ree(zSql);.  if(
5a90: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5aa0: 0a 20 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66  .  editDist3Conf
5ab0: 69 67 43 6c 65 61 72 28 70 29 3b 0a 20 20 77 68  igClear(p);.  wh
5ac0: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
5ad0: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
5ae0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
5af0: 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f  iLang = sqlite3_
5b00: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
5b10: 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 0);.    const 
5b20: 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63  char *zFrom = (c
5b30: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5b40: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
5b50: 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e  Stmt, 1);.    in
5b60: 74 20 6e 46 72 6f 6d 20 3d 20 7a 46 72 6f 6d 20  t nFrom = zFrom 
5b70: 3f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ? sqlite3_column
5b80: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29  _bytes(pStmt, 1)
5b90: 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   : 0;.    const 
5ba0: 63 68 61 72 20 2a 7a 54 6f 20 3d 20 28 63 6f 6e  char *zTo = (con
5bb0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
5bc0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
5bd0: 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e 74 20  mt, 2);.    int 
5be0: 6e 54 6f 20 3d 20 7a 54 6f 20 3f 20 73 71 6c 69  nTo = zTo ? sqli
5bf0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
5c00: 28 70 53 74 6d 74 2c 20 32 29 20 3a 20 30 3b 0a  (pStmt, 2) : 0;.
5c10: 20 20 20 20 69 6e 74 20 69 43 6f 73 74 20 3d 20      int iCost = 
5c20: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
5c30: 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20  nt(pStmt, 3);.. 
5c40: 20 20 20 61 73 73 65 72 74 28 20 7a 46 72 6f 6d     assert( zFrom
5c50: 21 3d 30 20 7c 7c 20 6e 46 72 6f 6d 3d 3d 30 20  !=0 || nFrom==0 
5c60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  );.    assert( z
5c70: 54 6f 21 3d 30 20 7c 7c 20 6e 54 6f 3d 3d 30 20  To!=0 || nTo==0 
5c80: 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 6f 6d  );.    if( nFrom
5c90: 3e 31 30 30 20 7c 7c 20 6e 54 6f 3e 31 30 30 20  >100 || nTo>100 
5ca0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5cb0: 69 66 28 20 69 43 6f 73 74 3c 30 20 29 20 63 6f  if( iCost<0 ) co
5cc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
5cd0: 70 4c 61 6e 67 3d 3d 30 20 7c 7c 20 69 4c 61 6e  pLang==0 || iLan
5ce0: 67 21 3d 69 4c 61 6e 67 50 72 65 76 20 29 7b 0a  g!=iLangPrev ){.
5cf0: 20 20 20 20 20 20 45 64 69 74 44 69 73 74 33 4c        EditDist3L
5d00: 61 6e 67 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  ang *pNew;.     
5d10: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
5d20: 72 65 61 6c 6c 6f 63 28 70 2d 3e 61 2c 20 28 70  realloc(p->a, (p
5d30: 2d 3e 6e 4c 61 6e 67 2b 31 29 2a 73 69 7a 65 6f  ->nLang+1)*sizeo
5d40: 66 28 70 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  f(p->a[0]));.   
5d50: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
5d60: 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  { rc = SQLITE_NO
5d70: 4d 45 4d 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20  MEM; break; }.  
5d80: 20 20 20 20 70 2d 3e 61 20 3d 20 70 4e 65 77 3b      p->a = pNew;
5d90: 0a 20 20 20 20 20 20 70 4c 61 6e 67 20 3d 20 26  .      pLang = &
5da0: 70 2d 3e 61 5b 70 2d 3e 6e 4c 61 6e 67 5d 3b 0a  p->a[p->nLang];.
5db0: 20 20 20 20 20 20 70 2d 3e 6e 4c 61 6e 67 2b 2b        p->nLang++
5dc0: 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  ;.      pLang->i
5dd0: 4c 61 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a 20 20  Lang = iLang;.  
5de0: 20 20 20 20 70 4c 61 6e 67 2d 3e 69 49 6e 73 43      pLang->iInsC
5df0: 6f 73 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 20  ost = 100;.     
5e00: 20 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f 73 74   pLang->iDelCost
5e10: 20 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 4c   = 100;.      pL
5e20: 61 6e 67 2d 3e 69 53 75 62 43 6f 73 74 20 3d 20  ang->iSubCost = 
5e30: 31 35 30 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67  150;.      pLang
5e40: 2d 3e 70 43 6f 73 74 20 3d 20 30 3b 0a 20 20 20  ->pCost = 0;.   
5e50: 20 20 20 69 4c 61 6e 67 50 72 65 76 20 3d 20 69     iLangPrev = i
5e60: 4c 61 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Lang;.    }.    
5e70: 69 66 28 20 6e 46 72 6f 6d 3d 3d 31 20 26 26 20  if( nFrom==1 && 
5e80: 7a 46 72 6f 6d 5b 30 5d 3d 3d 27 3f 27 20 26 26  zFrom[0]=='?' &&
5e90: 20 6e 54 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20   nTo==0 ){.     
5ea0: 20 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f 73 74   pLang->iDelCost
5eb0: 20 3d 20 69 43 6f 73 74 3b 0a 20 20 20 20 7d 65   = iCost;.    }e
5ec0: 6c 73 65 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30  lse if( nFrom==0
5ed0: 20 26 26 20 6e 54 6f 3d 3d 31 20 26 26 20 7a 54   && nTo==1 && zT
5ee0: 6f 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20  o[0]=='?' ){.   
5ef0: 20 20 20 70 4c 61 6e 67 2d 3e 69 49 6e 73 43 6f     pLang->iInsCo
5f00: 73 74 20 3d 20 69 43 6f 73 74 3b 0a 20 20 20 20  st = iCost;.    
5f10: 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 6f 6d 3d  }else if( nFrom=
5f20: 3d 31 20 26 26 20 6e 54 6f 3d 3d 31 20 26 26 20  =1 && nTo==1 && 
5f30: 7a 46 72 6f 6d 5b 30 5d 3d 3d 27 3f 27 20 26 26  zFrom[0]=='?' &&
5f40: 20 7a 54 6f 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a   zTo[0]=='?' ){.
5f50: 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 53 75        pLang->iSu
5f60: 62 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a 20  bCost = iCost;. 
5f70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5f80: 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 70  EditDist3Cost *p
5f90: 43 6f 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Cost;.      int 
5fa0: 6e 45 78 74 72 61 20 3d 20 6e 46 72 6f 6d 20 2b  nExtra = nFrom +
5fb0: 20 6e 54 6f 20 2d 20 34 3b 0a 20 20 20 20 20 20   nTo - 4;.      
5fc0: 69 66 28 20 6e 45 78 74 72 61 3c 30 20 29 20 6e  if( nExtra<0 ) n
5fd0: 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20 20  Extra = 0;.     
5fe0: 20 70 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33   pCost = sqlite3
5ff0: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
6000: 2a 70 43 6f 73 74 29 20 2b 20 6e 45 78 74 72 61  *pCost) + nExtra
6010: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
6020: 6f 73 74 3d 3d 30 20 29 7b 20 72 63 20 3d 20 53  ost==0 ){ rc = S
6030: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20 62 72 65  QLITE_NOMEM; bre
6040: 61 6b 3b 20 7d 0a 20 20 20 20 20 20 70 43 6f 73  ak; }.      pCos
6050: 74 2d 3e 6e 46 72 6f 6d 20 3d 20 6e 46 72 6f 6d  t->nFrom = nFrom
6060: 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e  ;.      pCost->n
6070: 54 6f 20 3d 20 6e 54 6f 3b 0a 20 20 20 20 20 20  To = nTo;.      
6080: 70 43 6f 73 74 2d 3e 69 43 6f 73 74 20 3d 20 69  pCost->iCost = i
6090: 43 6f 73 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  Cost;.      memc
60a0: 70 79 28 70 43 6f 73 74 2d 3e 61 2c 20 7a 46 72  py(pCost->a, zFr
60b0: 6f 6d 2c 20 6e 46 72 6f 6d 29 3b 0a 20 20 20 20  om, nFrom);.    
60c0: 20 20 6d 65 6d 63 70 79 28 70 43 6f 73 74 2d 3e    memcpy(pCost->
60d0: 61 20 2b 20 6e 46 72 6f 6d 2c 20 7a 54 6f 2c 20  a + nFrom, zTo, 
60e0: 6e 54 6f 29 3b 0a 20 20 20 20 20 20 70 43 6f 73  nTo);.      pCos
60f0: 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 61 6e 67  t->pNext = pLang
6100: 2d 3e 70 43 6f 73 74 3b 0a 20 20 20 20 20 20 70  ->pCost;.      p
6110: 4c 61 6e 67 2d 3e 70 43 6f 73 74 20 3d 20 70 43  Lang->pCost = pC
6120: 6f 73 74 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  ost; .    }.  }.
6130: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
6140: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
6150: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6160: 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
6170: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6180: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6190: 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  e length (in byt
61a0: 65 73 29 20 6f 66 20 61 20 75 74 66 2d 38 20 63  es) of a utf-8 c
61b0: 68 61 72 61 63 74 65 72 2e 20 20 4f 72 20 72 65  haracter.  Or re
61c0: 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 0a 2a  turn a maximum.*
61d0: 2a 20 6f 66 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  * of N..*/.stati
61e0: 63 20 69 6e 74 20 75 74 66 38 4c 65 6e 28 75 6e  c int utf8Len(un
61f0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 2c 20 69  signed char c, i
6200: 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  nt N){.  int len
6210: 20 3d 20 31 3b 0a 20 20 69 66 28 20 63 3e 30 78   = 1;.  if( c>0x
6220: 37 66 20 29 7b 0a 20 20 20 20 69 66 28 20 28 63  7f ){.    if( (c
6230: 26 30 78 65 30 29 3d 3d 30 78 63 30 20 29 7b 0a  &0xe0)==0xc0 ){.
6240: 20 20 20 20 20 20 6c 65 6e 20 3d 20 32 3b 0a 20        len = 2;. 
6250: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 26     }else if( (c&
6260: 30 78 66 30 29 3d 3d 30 78 65 30 20 29 7b 0a 20  0xf0)==0xe0 ){. 
6270: 20 20 20 20 20 6c 65 6e 20 3d 20 33 3b 0a 20 20       len = 3;.  
6280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
6290: 65 6e 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  en = 4;.    }.  
62a0: 7d 0a 20 20 69 66 28 20 6c 65 6e 3e 4e 20 29 20  }.  if( len>N ) 
62b0: 6c 65 6e 20 3d 20 4e 3b 0a 20 20 72 65 74 75 72  len = N;.  retur
62c0: 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n len;.}../*.** 
62d0: 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
62e0: 2d 7a 65 72 6f 29 20 6f 66 20 74 68 65 20 54 6f  -zero) of the To
62f0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 67 69 76   side of the giv
6300: 65 6e 20 63 6f 73 74 20 6d 61 74 63 68 65 73 0a  en cost matches.
6310: 2a 2a 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ** the given str
6320: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
6330: 6e 74 20 6d 61 74 63 68 54 6f 28 45 64 69 74 44  nt matchTo(EditD
6340: 69 73 74 33 43 6f 73 74 20 2a 70 2c 20 63 6f 6e  ist3Cost *p, con
6350: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
6360: 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 54 6f  n){.  if( p->nTo
6370: 3e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  >n ) return 0;. 
6380: 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 2d 3e 61   if( memcmp(p->a
6390: 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 7a 2c 20 70 2d  +p->nFrom, z, p-
63a0: 3e 6e 54 6f 29 21 3d 30 20 29 20 72 65 74 75 72  >nTo)!=0 ) retur
63b0: 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  n 0;.  return 1;
63c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
63d0: 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
63e0: 20 6f 66 20 74 68 65 20 54 6f 20 73 69 64 65 20   of the To side 
63f0: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 73  of the given cos
6400: 74 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65  t matches.** the
6410: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 0a 2a   given string..*
6420: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
6430: 63 68 46 72 6f 6d 28 45 64 69 74 44 69 73 74 33  chFrom(EditDist3
6440: 43 6f 73 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Cost *p, const c
6450: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
6460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72    assert( p->nFr
6470: 6f 6d 3c 3d 6e 20 29 3b 0a 20 20 69 66 28 20 6d  om<=n );.  if( m
6480: 65 6d 63 6d 70 28 70 2d 3e 61 2c 20 7a 2c 20 70  emcmp(p->a, z, p
6490: 2d 3e 6e 46 72 6f 6d 29 21 3d 30 20 29 20 72 65  ->nFrom)!=0 ) re
64a0: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
64b0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   1;.}../*.** Ret
64c0: 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
64d0: 72 6f 29 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ro) of the next 
64e0: 46 52 4f 4d 20 63 68 61 72 61 63 74 65 72 20 61  FROM character a
64f0: 6e 64 20 74 68 65 20 6e 65 78 74 20 54 4f 0a 2a  nd the next TO.*
6500: 2a 20 63 68 61 72 61 63 74 65 72 20 61 72 65 20  * character are 
6510: 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61  the same..*/.sta
6520: 74 69 63 20 69 6e 74 20 6d 61 74 63 68 46 72 6f  tic int matchFro
6530: 6d 54 6f 28 0a 20 20 45 64 69 74 44 69 73 74 33  mTo(.  EditDist3
6540: 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 53 74 72  FromString *pStr
6550: 2c 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20  ,  /* Left hand 
6560: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  string */.  int 
6570: 6e 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n1,             
6580: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
6590: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 63   of comparison c
65a0: 68 61 72 61 63 74 65 72 20 6f 6e 20 74 68 65 20  haracter on the 
65b0: 6c 65 66 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  left */.  const 
65c0: 63 68 61 72 20 2a 7a 32 2c 20 20 20 20 20 20 20  char *z2,       
65d0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68        /* Right-h
65e0: 61 6e 64 6c 20 63 6f 6d 70 61 72 69 73 6f 6e 20  andl comparison 
65f0: 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69  character */.  i
6600: 6e 74 20 6e 32 20 20 20 20 20 20 20 20 20 20 20  nt n2           
6610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
6620: 74 65 73 20 72 65 6d 61 69 6e 69 6e 67 20 69 6e  tes remaining in
6630: 20 7a 32 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e   z2[] */.){.  in
6640: 74 20 62 31 20 3d 20 70 53 74 72 2d 3e 61 5b 6e  t b1 = pStr->a[n
6650: 31 5d 2e 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  1].nByte;.  if( 
6660: 62 31 3e 6e 32 20 29 20 72 65 74 75 72 6e 20 30  b1>n2 ) return 0
6670: 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70  ;.  if( memcmp(p
6680: 53 74 72 2d 3e 7a 2b 6e 31 2c 20 7a 32 2c 20 62  Str->z+n1, z2, b
6690: 31 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1)!=0 ) return 0
66a0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
66b0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
66c0: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
66d0: 72 69 6e 67 20 6f 62 6a 65 63 63 74 0a 2a 2f 0a  ring objecct.*/.
66e0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
66f0: 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 44  Dist3FromStringD
6700: 65 6c 65 74 65 28 45 64 69 74 44 69 73 74 33 46  elete(EditDist3F
6710: 72 6f 6d 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20  romString *p){. 
6720: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 20   int i;.  if( p 
6730: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
6740: 69 3c 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  i<p->n; i++){.  
6750: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6760: 28 70 2d 3e 61 5b 69 5d 2e 61 70 44 65 6c 29 3b  (p->a[i].apDel);
6770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
6780: 72 65 65 28 70 2d 3e 61 5b 69 5d 2e 61 70 53 75  ree(p->a[i].apSu
6790: 62 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bst);.    }.    
67a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
67b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  .  }.}../*.** Cr
67c0: 65 61 74 65 20 61 20 45 64 69 74 44 69 73 74 33  eate a EditDist3
67d0: 46 72 6f 6d 53 74 72 69 6e 67 20 6f 62 6a 65 63  FromString objec
67e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 64 69  t..*/.static Edi
67f0: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
6800: 20 2a 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53   *editDist3FromS
6810: 74 72 69 6e 67 4e 65 77 28 0a 20 20 63 6f 6e 73  tringNew(.  cons
6820: 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20  t EditDist3Lang 
6830: 2a 70 4c 61 6e 67 2c 0a 20 20 63 6f 6e 73 74 20  *pLang,.  const 
6840: 63 68 61 72 20 2a 7a 2c 0a 20 20 69 6e 74 20 6e  char *z,.  int n
6850: 0a 29 7b 0a 20 20 45 64 69 74 44 69 73 74 33 46  .){.  EditDist3F
6860: 72 6f 6d 53 74 72 69 6e 67 20 2a 70 53 74 72 3b  romString *pStr;
6870: 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74  .  EditDist3Cost
6880: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *p;.  int i;.. 
6890: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
68a0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 6e 3c 30 20  rn 0;.  if( n<0 
68b0: 29 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ) n = (int)strle
68c0: 6e 28 7a 29 3b 0a 20 20 70 53 74 72 20 3d 20 73  n(z);.  pStr = s
68d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
68e0: 69 7a 65 6f 66 28 2a 70 53 74 72 29 20 2b 20 73  izeof(*pStr) + s
68f0: 69 7a 65 6f 66 28 70 53 74 72 2d 3e 61 5b 30 5d  izeof(pStr->a[0]
6900: 29 2a 6e 20 2b 20 6e 20 2b 20 31 20 29 3b 0a 20  )*n + n + 1 );. 
6910: 20 69 66 28 20 70 53 74 72 3d 3d 30 20 29 20 72   if( pStr==0 ) r
6920: 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 74 72 2d  eturn 0;.  pStr-
6930: 3e 61 20 3d 20 28 45 64 69 74 44 69 73 74 33 46  >a = (EditDist3F
6940: 72 6f 6d 2a 29 26 70 53 74 72 5b 31 5d 3b 0a 20  rom*)&pStr[1];. 
6950: 20 6d 65 6d 73 65 74 28 70 53 74 72 2d 3e 61 2c   memset(pStr->a,
6960: 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 74 72 2d   0, sizeof(pStr-
6970: 3e 61 5b 30 5d 29 2a 6e 29 3b 0a 20 20 70 53 74  >a[0])*n);.  pSt
6980: 72 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 53 74 72  r->n = n;.  pStr
6990: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 53  ->z = (char*)&pS
69a0: 74 72 2d 3e 61 5b 6e 5d 3b 0a 20 20 6d 65 6d 63  tr->a[n];.  memc
69b0: 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c 20 6e  py(pStr->z, z, n
69c0: 2b 31 29 3b 0a 20 20 69 66 28 20 6e 20 26 26 20  +1);.  if( n && 
69d0: 7a 5b 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20  z[n-1]=='*' ){. 
69e0: 20 20 20 70 53 74 72 2d 3e 69 73 50 72 65 66 69     pStr->isPrefi
69f0: 78 20 3d 20 31 3b 0a 20 20 20 20 6e 2d 2d 3b 0a  x = 1;.    n--;.
6a00: 20 20 20 20 70 53 74 72 2d 3e 6e 2d 2d 3b 0a 20      pStr->n--;. 
6a10: 20 20 20 70 53 74 72 2d 3e 7a 5b 6e 5d 20 3d 20     pStr->z[n] = 
6a20: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
6a30: 70 53 74 72 2d 3e 69 73 50 72 65 66 69 78 20 3d  pStr->isPrefix =
6a40: 20 30 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69   0;.  }..  for(i
6a50: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
6a60: 20 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d     EditDist3From
6a70: 20 2a 70 46 72 6f 6d 20 3d 20 26 70 53 74 72 2d   *pFrom = &pStr-
6a80: 3e 61 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  >a[i];.    memse
6a90: 74 28 70 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65  t(pFrom, 0, size
6aa0: 6f 66 28 2a 70 46 72 6f 6d 29 29 3b 0a 20 20 20  of(*pFrom));.   
6ab0: 20 70 46 72 6f 6d 2d 3e 6e 42 79 74 65 20 3d 20   pFrom->nByte = 
6ac0: 75 74 66 38 4c 65 6e 28 28 75 6e 73 69 67 6e 65  utf8Len((unsigne
6ad0: 64 20 63 68 61 72 29 7a 5b 69 5d 2c 20 6e 2d 69  d char)z[i], n-i
6ae0: 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 61  );.    for(p=pLa
6af0: 6e 67 2d 3e 70 43 6f 73 74 3b 20 70 3b 20 70 3d  ng->pCost; p; p=
6b00: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
6b10: 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a   EditDist3Cost *
6b20: 2a 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 66  *apNew;.      if
6b30: 28 20 69 2b 70 2d 3e 6e 46 72 6f 6d 3e 6e 20 29  ( i+p->nFrom>n )
6b40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6b50: 20 69 66 28 20 6d 61 74 63 68 46 72 6f 6d 28 70   if( matchFrom(p
6b60: 2c 20 7a 2b 69 2c 20 6e 2d 69 29 3d 3d 30 20 29  , z+i, n-i)==0 )
6b70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6b80: 20 69 66 28 20 70 2d 3e 6e 54 6f 3d 3d 30 20 29   if( p->nTo==0 )
6b90: 7b 0a 20 20 20 20 20 20 20 20 61 70 4e 65 77 20  {.        apNew 
6ba0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
6bb0: 63 28 70 46 72 6f 6d 2d 3e 61 70 44 65 6c 2c 0a  c(pFrom->apDel,.
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6be0: 73 69 7a 65 6f 66 28 2a 61 70 4e 65 77 29 2a 28  sizeof(*apNew)*(
6bf0: 70 46 72 6f 6d 2d 3e 6e 44 65 6c 2b 31 29 29 3b  pFrom->nDel+1));
6c00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 4e  .        if( apN
6c10: 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ew==0 ) break;. 
6c20: 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 61 70         pFrom->ap
6c30: 44 65 6c 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20  Del = apNew;.   
6c40: 20 20 20 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d       apNew[pFrom
6c50: 2d 3e 6e 44 65 6c 2b 2b 5d 20 3d 20 70 3b 0a 20  ->nDel++] = p;. 
6c60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6c70: 20 20 20 20 61 70 4e 65 77 20 3d 20 73 71 6c 69      apNew = sqli
6c80: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 46 72 6f  te3_realloc(pFro
6c90: 6d 2d 3e 61 70 53 75 62 73 74 2c 0a 20 20 20 20  m->apSubst,.    
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
6cc0: 6f 66 28 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f  of(*apNew)*(pFro
6cd0: 6d 2d 3e 6e 53 75 62 73 74 2b 31 29 29 3b 0a 20  m->nSubst+1));. 
6ce0: 20 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77         if( apNew
6cf0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
6d00: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 61 70 53 75       pFrom->apSu
6d10: 62 73 74 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20  bst = apNew;.   
6d20: 20 20 20 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d       apNew[pFrom
6d30: 2d 3e 6e 53 75 62 73 74 2b 2b 5d 20 3d 20 70 3b  ->nSubst++] = p;
6d40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6d50: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
6d60: 20 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53    editDist3FromS
6d70: 74 72 69 6e 67 44 65 6c 65 74 65 28 70 53 74 72  tringDelete(pStr
6d80: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 20 3d 20  );.      pStr = 
6d90: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
6da0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6db0: 72 6e 20 70 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pStr;.}../*.*
6dc0: 2a 20 55 70 64 61 74 65 20 65 6e 74 72 79 20 6d  * Update entry m
6dd0: 5b 69 5d 20 73 75 63 68 20 74 68 61 74 20 69 74  [i] such that it
6de0: 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
6df0: 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76  of its current v
6e00: 61 6c 75 65 0a 2a 2a 20 61 6e 64 20 6d 5b 6a 5d  alue.** and m[j]
6e10: 2b 69 43 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  +iCost..**.** If
6e20: 20 74 68 65 20 69 43 6f 73 74 20 69 73 20 31 2c   the iCost is 1,
6e30: 30 30 30 2c 30 30 30 20 6f 72 20 67 72 65 61 74  000,000 or great
6e40: 65 72 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65  er, then conside
6e50: 72 20 74 68 65 20 63 6f 73 74 20 74 6f 20 62 65  r the cost to be
6e60: 0a 2a 2a 20 69 6e 66 69 6e 69 74 65 20 61 6e 64  .** infinite and
6e70: 20 73 6b 69 70 20 74 68 65 20 75 70 64 61 74 65   skip the update
6e80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6e90: 20 75 70 64 61 74 65 43 6f 73 74 28 0a 20 20 75   updateCost(.  u
6ea0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6d 2c 0a  nsigned int *m,.
6eb0: 20 20 69 6e 74 20 69 2c 0a 20 20 69 6e 74 20 6a    int i,.  int j
6ec0: 2c 0a 20 20 69 6e 74 20 69 43 6f 73 74 0a 29 7b  ,.  int iCost.){
6ed0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 73 74  .  assert( iCost
6ee0: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f  >=0 );.  if( iCo
6ef0: 73 74 3c 31 30 30 30 30 20 29 7b 0a 20 20 20 20  st<10000 ){.    
6f00: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 62 20 3d  unsigned int b =
6f10: 20 6d 5b 6a 5d 20 2b 20 69 43 6f 73 74 3b 0a 20   m[j] + iCost;. 
6f20: 20 20 20 69 66 28 20 62 3c 6d 5b 69 5d 20 29 20     if( b<m[i] ) 
6f30: 6d 5b 69 5d 20 3d 20 62 3b 0a 20 20 7d 0a 7d 0a  m[i] = b;.  }.}.
6f40: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
6f50: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 62 65  edit distance be
6f60: 74 77 65 65 6e 20 74 77 6f 20 73 74 72 69 6e 67  tween two string
6f70: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
6f80: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
6f90: 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
6fa0: 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20 74  umber which is t
6fb0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  he error code..*
6fc0: 2a 0a 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20  *.** If pnMatch 
6fd0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
6fe0: 6e 20 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65  n *pnMatch is se
6ff0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
7000: 6f 66 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  of characters.**
7010: 20 28 6e 6f 74 20 62 79 74 65 73 29 20 69 6e 20   (not bytes) in 
7020: 7a 32 20 74 68 61 74 20 6d 61 74 63 68 65 64 20  z2 that matched 
7030: 74 68 65 20 73 65 61 72 63 68 20 70 61 74 74 65  the search patte
7040: 72 6e 20 69 6e 20 2a 70 46 72 6f 6d 2e 20 49 66  rn in *pFrom. If
7050: 20 70 46 72 6f 6d 20 64 6f 65 73 0a 2a 2a 20 6e   pFrom does.** n
7060: 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70  ot contain the p
7070: 61 74 74 65 72 6e 20 66 6f 72 20 61 20 70 72 65  attern for a pre
7080: 66 69 78 2d 73 65 61 72 63 68 2c 20 74 68 65 6e  fix-search, then
7090: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
70a0: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
70b0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
70c0: 32 2e 20 49 66 20 70 46 72 6f 6d 20 64 6f 65 73  2. If pFrom does
70d0: 20 63 6f 6e 74 61 69 6e 20 61 20 70 72 65 66 69   contain a prefi
70e0: 78 20 73 65 61 72 63 68 20 70 61 74 74 65 72 6e  x search pattern
70f0: 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  , then.** it is 
7100: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
7110: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
7120: 70 72 65 66 69 78 20 6f 66 20 7a 32 20 74 68 61  prefix of z2 tha
7130: 74 20 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20  t was deemed to 
7140: 0a 2a 2a 20 6d 61 74 63 68 20 70 46 72 6f 6d 2e  .** match pFrom.
7150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7160: 64 69 74 44 69 73 74 33 43 6f 72 65 28 0a 20 20  ditDist3Core(.  
7170: 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  EditDist3FromStr
7180: 69 6e 67 20 2a 70 46 72 6f 6d 2c 20 20 2f 2a 20  ing *pFrom,  /* 
7190: 54 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20  The FROM string 
71a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
71b0: 2a 7a 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  *z2,            
71c0: 20 20 2f 2a 20 54 68 65 20 54 4f 20 73 74 72 69    /* The TO stri
71d0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20  ng */.  int n2, 
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71f0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
7200: 66 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20  f the TO string 
7210: 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44  */.  const EditD
7220: 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c  ist3Lang *pLang,
7230: 20 20 2f 2a 20 45 64 69 74 20 77 65 69 67 68 74    /* Edit weight
7240: 73 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  s for a particul
7250: 61 72 20 6c 61 6e 67 75 61 67 65 20 49 44 20 2a  ar language ID *
7260: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4d 61 74 63 68  /.  int *pnMatch
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 2f 2a 20 4f 55 54 3a 20 43 68 61 72 61 63 74   /* OUT: Charact
7290: 65 72 73 20 69 6e 20 6d 61 74 63 68 65 64 20 70  ers in matched p
72a0: 72 65 66 69 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e  refix */.){.  in
72b0: 74 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 31  t k, n;.  int i1
72c0: 2c 20 62 31 3b 0a 20 20 69 6e 74 20 69 32 2c 20  , b1;.  int i2, 
72d0: 62 32 3b 0a 20 20 45 64 69 74 44 69 73 74 33 46  b2;.  EditDist3F
72e0: 72 6f 6d 53 74 72 69 6e 67 20 66 20 3d 20 2a 70  romString f = *p
72f0: 46 72 6f 6d 3b 0a 20 20 45 64 69 74 44 69 73 74  From;.  EditDist
7300: 33 54 6f 20 2a 61 32 3b 0a 20 20 75 6e 73 69 67  3To *a2;.  unsig
7310: 6e 65 64 20 69 6e 74 20 2a 6d 3b 0a 20 20 69 6e  ned int *m;.  in
7320: 74 20 73 7a 52 6f 77 3b 0a 20 20 45 64 69 74 44  t szRow;.  EditD
7330: 69 73 74 33 43 6f 73 74 20 2a 70 3b 0a 20 20 69  ist3Cost *p;.  i
7340: 6e 74 20 72 65 73 3b 0a 0a 20 20 2f 2a 20 61 6c  nt res;..  /* al
7350: 6c 6f 63 61 74 65 20 74 68 65 20 57 61 67 6e 65  locate the Wagne
7360: 72 20 6d 61 74 72 69 78 20 61 6e 64 20 74 68 65  r matrix and the
7370: 20 61 54 6f 5b 5d 20 61 72 72 61 79 20 66 6f 72   aTo[] array for
7380: 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a   the TO string *
7390: 2f 0a 20 20 6e 20 3d 20 28 66 2e 6e 2b 31 29 2a  /.  n = (f.n+1)*
73a0: 28 6e 32 2b 31 29 3b 0a 20 20 6e 20 3d 20 28 6e  (n2+1);.  n = (n
73b0: 2b 31 29 26 7e 31 3b 0a 20 20 6d 20 3d 20 73 71  +1)&~1;.  m = sq
73c0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2a  lite3_malloc( n*
73d0: 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 20 2b 20 73  sizeof(m[0]) + s
73e0: 69 7a 65 6f 66 28 61 32 5b 30 5d 29 2a 6e 32 20  izeof(a2[0])*n2 
73f0: 29 3b 0a 20 20 69 66 28 20 6d 3d 3d 30 20 29 20  );.  if( m==0 ) 
7400: 72 65 74 75 72 6e 20 2d 31 3b 20 20 20 20 20 20  return -1;      
7410: 20 20 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20        /* Out of 
7420: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 32 20 3d  memory */.  a2 =
7430: 20 28 45 64 69 74 44 69 73 74 33 54 6f 2a 29 26   (EditDist3To*)&
7440: 6d 5b 6e 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  m[n];.  memset(a
7450: 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 32 5b  2, 0, sizeof(a2[
7460: 30 5d 29 2a 6e 32 29 3b 0a 0a 20 20 2f 2a 20 46  0])*n2);..  /* F
7470: 69 6c 6c 20 69 6e 20 74 68 65 20 61 31 5b 5d 20  ill in the a1[] 
7480: 6d 61 74 72 69 78 20 66 6f 72 20 61 6c 6c 20 63  matrix for all c
7490: 68 61 72 61 63 74 65 72 73 20 6f 66 20 74 68 65  haracters of the
74a0: 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20   TO string */.  
74b0: 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b  for(i2=0; i2<n2;
74c0: 20 69 32 2b 2b 29 7b 0a 20 20 20 20 61 32 5b 69   i2++){.    a2[i
74d0: 32 5d 2e 6e 42 79 74 65 20 3d 20 75 74 66 38 4c  2].nByte = utf8L
74e0: 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  en((unsigned cha
74f0: 72 29 7a 32 5b 69 32 5d 2c 20 6e 32 2d 69 32 29  r)z2[i2], n2-i2)
7500: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 61 6e  ;.    for(p=pLan
7510: 67 2d 3e 70 43 6f 73 74 3b 20 70 3b 20 70 3d 70  g->pCost; p; p=p
7520: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
7530: 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a  EditDist3Cost **
7540: 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28  apNew;.      if(
7550: 20 70 2d 3e 6e 46 72 6f 6d 3e 30 20 29 20 63 6f   p->nFrom>0 ) co
7560: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
7570: 28 20 69 32 2b 70 2d 3e 6e 54 6f 3e 6e 32 20 29  ( i2+p->nTo>n2 )
7580: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7590: 20 69 66 28 20 6d 61 74 63 68 54 6f 28 70 2c 20   if( matchTo(p, 
75a0: 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29 3d 3d 30  z2+i2, n2-i2)==0
75b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
75c0: 20 20 20 61 32 5b 69 32 5d 2e 6e 49 6e 73 2b 2b     a2[i2].nIns++
75d0: 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20  ;.      apNew = 
75e0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
75f0: 61 32 5b 69 32 5d 2e 61 70 49 6e 73 2c 20 73 69  a2[i2].apIns, si
7600: 7a 65 6f 66 28 2a 61 70 4e 65 77 29 2a 61 32 5b  zeof(*apNew)*a2[
7610: 69 32 5d 2e 6e 49 6e 73 29 3b 0a 20 20 20 20 20  i2].nIns);.     
7620: 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b   if( apNew==0 ){
7630: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 2d  .        res = -
7640: 31 3b 20 20 2f 2a 20 4f 75 74 20 6f 66 20 6d 65  1;  /* Out of me
7650: 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  mory */.        
7660: 67 6f 74 6f 20 65 64 69 74 44 69 73 74 33 41 62  goto editDist3Ab
7670: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
7680: 20 20 20 61 32 5b 69 32 5d 2e 61 70 49 6e 73 20     a2[i2].apIns 
7690: 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  = apNew;.      a
76a0: 32 5b 69 32 5d 2e 61 70 49 6e 73 5b 61 32 5b 69  2[i2].apIns[a2[i
76b0: 32 5d 2e 6e 49 6e 73 2d 31 5d 20 3d 20 70 3b 0a  2].nIns-1] = p;.
76c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
76d0: 50 72 65 70 61 72 65 20 74 6f 20 63 6f 6d 70 75  Prepare to compu
76e0: 74 65 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 65  te the minimum e
76f0: 64 69 74 20 64 69 73 74 61 6e 63 65 20 2a 2f 0a  dit distance */.
7700: 20 20 73 7a 52 6f 77 20 3d 20 66 2e 6e 2b 31 3b    szRow = f.n+1;
7710: 0a 20 20 6d 65 6d 73 65 74 28 6d 2c 20 30 78 30  .  memset(m, 0x0
7720: 31 2c 20 28 6e 32 2b 31 29 2a 73 7a 52 6f 77 2a  1, (n2+1)*szRow*
7730: 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 29 3b 0a 20  sizeof(m[0]));. 
7740: 20 6d 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a   m[0] = 0;..  /*
7750: 20 46 69 72 73 74 20 66 69 6c 6c 20 69 6e 20 74   First fill in t
7760: 68 65 20 74 6f 70 2d 72 6f 77 20 6f 66 20 74 68  he top-row of th
7770: 65 20 6d 61 74 72 69 78 20 77 69 74 68 20 46 52  e matrix with FR
7780: 4f 4d 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74  OM deletion cost
7790: 73 20 2a 2f 0a 20 20 66 6f 72 28 69 31 3d 30 3b  s */.  for(i1=0;
77a0: 20 69 31 3c 66 2e 6e 3b 20 69 31 20 2b 3d 20 62   i1<f.n; i1 += b
77b0: 31 29 7b 0a 20 20 20 20 62 31 20 3d 20 66 2e 61  1){.    b1 = f.a
77c0: 5b 69 31 5d 2e 6e 42 79 74 65 3b 0a 20 20 20 20  [i1].nByte;.    
77d0: 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 69 31  updateCost(m, i1
77e0: 2b 62 31 2c 20 69 31 2c 20 70 4c 61 6e 67 2d 3e  +b1, i1, pLang->
77f0: 69 44 65 6c 43 6f 73 74 29 3b 0a 20 20 20 20 66  iDelCost);.    f
7800: 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31  or(k=0; k<f.a[i1
7810: 5d 2e 6e 44 65 6c 3b 20 6b 2b 2b 29 7b 0a 20 20  ].nDel; k++){.  
7820: 20 20 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e      p = f.a[i1].
7830: 61 70 44 65 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  apDel[k];.      
7840: 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 69 31  updateCost(m, i1
7850: 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 69 31 2c 20 70  +p->nFrom, i1, p
7860: 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20 7d 0a  ->iCost);.    }.
7870: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69    }..  /* Fill i
7880: 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  n all subsequent
7890: 20 72 6f 77 73 2c 20 74 6f 70 2d 74 6f 2d 62 6f   rows, top-to-bo
78a0: 74 74 6f 6d 2c 20 6c 65 66 74 2d 74 6f 2d 72 69  ttom, left-to-ri
78b0: 67 68 74 20 2a 2f 0a 20 20 66 6f 72 28 69 32 3d  ght */.  for(i2=
78c0: 30 3b 20 69 32 3c 6e 32 3b 20 69 32 20 2b 3d 20  0; i2<n2; i2 += 
78d0: 62 32 29 7b 0a 20 20 20 20 69 6e 74 20 72 78 3b  b2){.    int rx;
78e0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
78f0: 67 20 69 6e 64 65 78 20 66 6f 72 20 63 75 72 72  g index for curr
7900: 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  ent row */.    i
7910: 6e 74 20 72 78 70 3b 20 20 20 20 20 2f 2a 20 53  nt rxp;     /* S
7920: 74 61 72 74 69 6e 67 20 69 6e 64 65 78 20 66 6f  tarting index fo
7930: 72 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  r previous row *
7940: 2f 0a 20 20 20 20 62 32 20 3d 20 61 32 5b 69 32  /.    b2 = a2[i2
7950: 5d 2e 6e 42 79 74 65 3b 0a 20 20 20 20 72 78 20  ].nByte;.    rx 
7960: 3d 20 73 7a 52 6f 77 2a 28 69 32 2b 62 32 29 3b  = szRow*(i2+b2);
7970: 0a 20 20 20 20 72 78 70 20 3d 20 73 7a 52 6f 77  .    rxp = szRow
7980: 2a 69 32 3b 0a 20 20 20 20 75 70 64 61 74 65 43  *i2;.    updateC
7990: 6f 73 74 28 6d 2c 20 72 78 2c 20 72 78 70 2c 20  ost(m, rx, rxp, 
79a0: 70 4c 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 29  pLang->iInsCost)
79b0: 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ;.    for(k=0; k
79c0: 3c 61 32 5b 69 32 5d 2e 6e 49 6e 73 3b 20 6b 2b  <a2[i2].nIns; k+
79d0: 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 61 32  +){.      p = a2
79e0: 5b 69 32 5d 2e 61 70 49 6e 73 5b 6b 5d 3b 0a 20  [i2].apIns[k];. 
79f0: 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28       updateCost(
7a00: 6d 2c 20 73 7a 52 6f 77 2a 28 69 32 2b 70 2d 3e  m, szRow*(i2+p->
7a10: 6e 54 6f 29 2c 20 72 78 70 2c 20 70 2d 3e 69 43  nTo), rxp, p->iC
7a20: 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ost);.    }.    
7a30: 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e  for(i1=0; i1<f.n
7a40: 3b 20 69 31 2b 3d 62 31 29 7b 0a 20 20 20 20 20  ; i1+=b1){.     
7a50: 20 69 6e 74 20 63 78 3b 20 20 20 20 2f 2a 20 49   int cx;    /* I
7a60: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
7a70: 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 69 6e  cell */.      in
7a80: 74 20 63 78 70 3b 20 20 20 2f 2a 20 49 6e 64 65  t cxp;   /* Inde
7a90: 78 20 6f 66 20 63 65 6c 6c 20 69 6d 6d 65 64 69  x of cell immedi
7aa0: 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6c 65 66  ately to the lef
7ab0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  t */.      int c
7ac0: 78 64 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  xd;   /* Index o
7ad0: 66 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65  f cell to the le
7ae0: 66 74 20 61 6e 64 20 6f 6e 65 20 72 6f 77 20 61  ft and one row a
7af0: 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  bove */.      in
7b00: 74 20 63 78 75 3b 20 20 20 2f 2a 20 49 6e 64 65  t cxu;   /* Inde
7b10: 78 20 6f 66 20 63 65 6c 6c 20 69 6d 6d 65 64 69  x of cell immedi
7b20: 61 74 65 6c 79 20 61 62 6f 76 65 20 2a 2f 0a 20  ately above */. 
7b30: 20 20 20 20 20 62 31 20 3d 20 66 2e 61 5b 69 31       b1 = f.a[i1
7b40: 5d 2e 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 63  ].nByte;.      c
7b50: 78 70 20 3d 20 72 78 20 2b 20 69 31 3b 0a 20 20  xp = rx + i1;.  
7b60: 20 20 20 20 63 78 20 3d 20 63 78 70 20 2b 20 62      cx = cxp + b
7b70: 31 3b 0a 20 20 20 20 20 20 63 78 64 20 3d 20 72  1;.      cxd = r
7b80: 78 70 20 2b 20 69 31 3b 0a 20 20 20 20 20 20 63  xp + i1;.      c
7b90: 78 75 20 3d 20 63 78 64 20 2b 20 62 31 3b 0a 20  xu = cxd + b1;. 
7ba0: 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28       updateCost(
7bb0: 6d 2c 20 63 78 2c 20 63 78 70 2c 20 70 4c 61 6e  m, cx, cxp, pLan
7bc0: 67 2d 3e 69 44 65 6c 43 6f 73 74 29 3b 0a 20 20  g->iDelCost);.  
7bd0: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66      for(k=0; k<f
7be0: 2e 61 5b 69 31 5d 2e 6e 44 65 6c 3b 20 6b 2b 2b  .a[i1].nDel; k++
7bf0: 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66  ){.        p = f
7c00: 2e 61 5b 69 31 5d 2e 61 70 44 65 6c 5b 6b 5d 3b  .a[i1].apDel[k];
7c10: 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 43  .        updateC
7c20: 6f 73 74 28 6d 2c 20 63 78 70 2b 70 2d 3e 6e 46  ost(m, cxp+p->nF
7c30: 72 6f 6d 2c 20 63 78 70 2c 20 70 2d 3e 69 43 6f  rom, cxp, p->iCo
7c40: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
7c50: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
7c60: 20 63 78 2c 20 63 78 75 2c 20 70 4c 61 6e 67 2d   cx, cxu, pLang-
7c70: 3e 69 49 6e 73 43 6f 73 74 29 3b 0a 20 20 20 20  >iInsCost);.    
7c80: 20 20 69 66 28 20 6d 61 74 63 68 46 72 6f 6d 54    if( matchFromT
7c90: 6f 28 26 66 2c 20 69 31 2c 20 7a 32 2b 69 32 2c  o(&f, i1, z2+i2,
7ca0: 20 6e 32 2d 69 32 29 20 29 7b 0a 20 20 20 20 20   n2-i2) ){.     
7cb0: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
7cc0: 20 63 78 2c 20 63 78 64 2c 20 30 29 3b 0a 20 20   cx, cxd, 0);.  
7cd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61      }.      upda
7ce0: 74 65 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78  teCost(m, cx, cx
7cf0: 64 2c 20 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f  d, pLang->iSubCo
7d00: 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  st);.      for(k
7d10: 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 53  =0; k<f.a[i1].nS
7d20: 75 62 73 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  ubst; k++){.    
7d30: 20 20 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e      p = f.a[i1].
7d40: 61 70 53 75 62 73 74 5b 6b 5d 3b 0a 20 20 20 20  apSubst[k];.    
7d50: 20 20 20 20 69 66 28 20 6d 61 74 63 68 54 6f 28      if( matchTo(
7d60: 70 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29  p, z2+i2, n2-i2)
7d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
7d80: 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 64 2b  dateCost(m, cxd+
7d90: 70 2d 3e 6e 46 72 6f 6d 2b 73 7a 52 6f 77 2a 70  p->nFrom+szRow*p
7da0: 2d 3e 6e 54 6f 2c 20 63 78 64 2c 20 70 2d 3e 69  ->nTo, cxd, p->i
7db0: 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cost);.        }
7dc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7dd0: 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e   }..#if 0  /* En
7de0: 61 62 6c 65 20 66 6f 72 20 64 65 62 75 67 67 69  able for debuggi
7df0: 6e 67 20 2a 2f 0a 20 20 70 72 69 6e 74 66 28 22  ng */.  printf("
7e00: 20 20 20 20 20 20 20 20 20 5e 22 29 3b 0a 20 20           ^");.  
7e10: 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e  for(i1=0; i1<f.n
7e20: 3b 20 69 31 2b 2b 29 20 70 72 69 6e 74 66 28 22  ; i1++) printf("
7e30: 20 25 63 2d 25 32 78 22 2c 20 66 2e 7a 5b 69 31   %c-%2x", f.z[i1
7e40: 5d 2c 20 66 2e 7a 5b 69 31 5d 26 30 78 66 66 29  ], f.z[i1]&0xff)
7e50: 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 20 20  ;.  printf("\n  
7e60: 20 5e 3a 22 29 3b 0a 20 20 66 6f 72 28 69 31 3d   ^:");.  for(i1=
7e70: 30 3b 20 69 31 3c 73 7a 52 6f 77 3b 20 69 31 2b  0; i1<szRow; i1+
7e80: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20  +){.    int v = 
7e90: 6d 5b 69 31 5d 3b 0a 20 20 20 20 69 66 28 20 76  m[i1];.    if( v
7ea0: 3e 39 39 39 39 20 29 20 70 72 69 6e 74 66 28 22  >9999 ) printf("
7eb0: 20 2a 2a 2a 2a 22 29 3b 0a 20 20 20 20 65 6c 73   ****");.    els
7ec0: 65 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  e         printf
7ed0: 28 22 20 25 34 64 22 2c 20 76 29 3b 0a 20 20 7d  (" %4d", v);.  }
7ee0: 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b  .  printf("\n");
7ef0: 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c  .  for(i2=0; i2<
7f00: 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20 20 20 20 70  n2; i2++){.    p
7f10: 72 69 6e 74 66 28 22 25 63 2d 25 30 32 78 3a 22  rintf("%c-%02x:"
7f20: 2c 20 7a 32 5b 69 32 5d 2c 20 7a 32 5b 69 32 5d  , z2[i2], z2[i2]
7f30: 26 30 78 66 66 29 3b 0a 20 20 20 20 66 6f 72 28  &0xff);.    for(
7f40: 69 31 3d 30 3b 20 69 31 3c 73 7a 52 6f 77 3b 20  i1=0; i1<szRow; 
7f50: 69 31 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  i1++){.      int
7f60: 20 76 20 3d 20 6d 5b 28 69 32 2b 31 29 2a 73 7a   v = m[(i2+1)*sz
7f70: 52 6f 77 2b 69 31 5d 3b 0a 20 20 20 20 20 20 69  Row+i1];.      i
7f80: 66 28 20 76 3e 39 39 39 39 20 29 20 70 72 69 6e  f( v>9999 ) prin
7f90: 74 66 28 22 20 2a 2a 2a 2a 22 29 3b 0a 20 20 20  tf(" ****");.   
7fa0: 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
7fb0: 70 72 69 6e 74 66 28 22 20 25 34 64 22 2c 20 76  printf(" %4d", v
7fc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
7fd0: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 23  ntf("\n");.  }.#
7fe0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 72 65 65  endif..  /* Free
7ff0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
8000: 6f 6e 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ons and return t
8010: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 72  he result */.  r
8020: 65 73 20 3d 20 28 69 6e 74 29 6d 5b 73 7a 52 6f  es = (int)m[szRo
8030: 77 2a 28 6e 32 2b 31 29 2d 31 5d 3b 0a 20 20 6e  w*(n2+1)-1];.  n
8040: 20 3d 20 6e 32 3b 0a 20 20 69 66 28 20 66 2e 69   = n2;.  if( f.i
8050: 73 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 66  sPrefix ){.    f
8060: 6f 72 28 69 32 3d 31 3b 20 69 32 3c 3d 6e 32 3b  or(i2=1; i2<=n2;
8070: 20 69 32 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e   i2++){.      in
8080: 74 20 62 20 3d 20 6d 5b 73 7a 52 6f 77 2a 69 32  t b = m[szRow*i2
8090: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 62  -1];.      if( b
80a0: 3c 3d 72 65 73 20 29 7b 20 0a 20 20 20 20 20 20  <=res ){ .      
80b0: 20 20 72 65 73 20 3d 20 62 3b 0a 20 20 20 20 20    res = b;.     
80c0: 20 20 20 6e 20 3d 20 69 32 20 2d 20 31 3b 0a 20     n = i2 - 1;. 
80d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
80e0: 0a 20 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29  .  if( pnMatch )
80f0: 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61  {.    int nExtra
8100: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d   = 0;.    for(k=
8110: 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 7b 0a 20 20  0; k<n; k++){.  
8120: 20 20 20 20 69 66 28 20 28 7a 32 5b 6b 5d 20 26      if( (z2[k] &
8130: 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e   0xc0)==0x80 ) n
8140: 45 78 74 72 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Extra++;.    }. 
8150: 20 20 20 2a 70 6e 4d 61 74 63 68 20 3d 20 6e 20     *pnMatch = n 
8160: 2d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 65  - nExtra;.  }..e
8170: 64 69 74 44 69 73 74 33 41 62 6f 72 74 3a 0a 20  ditDist3Abort:. 
8180: 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32   for(i2=0; i2<n2
8190: 3b 20 69 32 2b 2b 29 20 73 71 6c 69 74 65 33 5f  ; i2++) sqlite3_
81a0: 66 72 65 65 28 61 32 5b 69 32 5d 2e 61 70 49 6e  free(a2[i2].apIn
81b0: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  s);.  sqlite3_fr
81c0: 65 65 28 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(m);.  return 
81d0: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  res;.}../*.** Ge
81e0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
81f0: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 6f   EditDist3Lang o
8200: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
8210: 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33   const EditDist3
8220: 4c 61 6e 67 20 2a 65 64 69 74 44 69 73 74 33 46  Lang *editDist3F
8230: 69 6e 64 4c 61 6e 67 28 0a 20 20 45 64 69 74 44  indLang(.  EditD
8240: 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  ist3Config *pCon
8250: 66 69 67 2c 0a 20 20 69 6e 74 20 69 4c 61 6e 67  fig,.  int iLang
8260: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
8270: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69  or(i=0; i<pConfi
8280: 67 2d 3e 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a  g->nLang; i++){.
8290: 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
82a0: 3e 61 5b 69 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61  >a[i].iLang==iLa
82b0: 6e 67 20 29 20 72 65 74 75 72 6e 20 26 70 43 6f  ng ) return &pCo
82c0: 6e 66 69 67 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  nfig->a[i];.  }.
82d0: 20 20 72 65 74 75 72 6e 20 26 65 64 69 74 44 69    return &editDi
82e0: 73 74 33 4c 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  st3Lang;.}../*.*
82f0: 2a 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65  * Function:    e
8300: 64 69 74 64 69 73 74 33 28 41 2c 42 2c 69 4c 61  ditdist3(A,B,iLa
8310: 6e 67 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ng).**          
8320: 20 20 20 20 65 64 69 74 64 69 73 74 33 28 74 61      editdist3(ta
8330: 62 6c 65 6e 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52  blename).**.** R
8340: 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
8350: 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 73  f transforming s
8360: 74 72 69 6e 67 20 41 20 69 6e 74 6f 20 73 74 72  tring A into str
8370: 69 6e 67 20 42 20 75 73 69 6e 67 20 65 64 69 74  ing B using edit
8380: 0a 2a 2a 20 77 65 69 67 68 74 73 20 66 6f 72 20  .** weights for 
8390: 69 4c 61 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iLang..**.** The
83a0: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61   second form loa
83b0: 64 73 20 65 64 69 74 20 77 65 69 67 68 74 73 20  ds edit weights 
83c0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  into memory from
83d0: 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61   a table..*/.sta
83e0: 74 69 63 20 76 6f 69 64 20 65 64 69 74 44 69 73  tic void editDis
83f0: 74 33 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c  t3SqlFunc(.  sql
8400: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8410: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
8420: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
8430: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 45  ue **argv.){.  E
8440: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a  ditDist3Config *
8450: 70 43 6f 6e 66 69 67 20 3d 20 28 45 64 69 74 44  pConfig = (EditD
8460: 69 73 74 33 43 6f 6e 66 69 67 2a 29 73 71 6c 69  ist3Config*)sqli
8470: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
8480: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
8490: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
84a0: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
84b0: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 6e  e(context);.  in
84c0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
84d0: 3d 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==1 ){.    const
84e0: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20   char *zTable = 
84f0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
8500: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8510: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 63  argv[0]);.    rc
8520: 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66   = editDist3Conf
8530: 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20  igLoad(pConfig, 
8540: 64 62 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  db, zTable);.   
8550: 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65   if( rc ) sqlite
8560: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
8570: 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29  ode(context, rc)
8580: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
8590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 20 3d 20  onst char *zA = 
85a0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
85b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
85c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 63 6f  argv[0]);.    co
85d0: 6e 73 74 20 63 68 61 72 20 2a 7a 42 20 3d 20 28  nst char *zB = (
85e0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
85f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8600: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 6e 74  rgv[1]);.    int
8610: 20 6e 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   nA = sqlite3_va
8620: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
8630: 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 42 20 3d  ]);.    int nB =
8640: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8650: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
8660: 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 61     int iLang = a
8670: 72 67 63 3d 3d 33 20 3f 20 73 71 6c 69 74 65 33  rgc==3 ? sqlite3
8680: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
8690: 32 5d 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e  2]) : 0;.    con
86a0: 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  st EditDist3Lang
86b0: 20 2a 70 4c 61 6e 67 20 3d 20 65 64 69 74 44 69   *pLang = editDi
86c0: 73 74 33 46 69 6e 64 4c 61 6e 67 28 70 43 6f 6e  st3FindLang(pCon
86d0: 66 69 67 2c 20 69 4c 61 6e 67 29 3b 0a 20 20 20  fig, iLang);.   
86e0: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
86f0: 72 69 6e 67 20 2a 70 46 72 6f 6d 3b 0a 20 20 20  ring *pFrom;.   
8700: 20 69 6e 74 20 64 69 73 74 3b 0a 0a 20 20 20 20   int dist;..    
8710: 70 46 72 6f 6d 20 3d 20 65 64 69 74 44 69 73 74  pFrom = editDist
8720: 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 70  3FromStringNew(p
8730: 4c 61 6e 67 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20  Lang, zA, nA);. 
8740: 20 20 20 69 66 28 20 70 46 72 6f 6d 3d 3d 30 20     if( pFrom==0 
8750: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8760: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8770: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8780: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8790: 7d 0a 20 20 20 20 64 69 73 74 20 3d 20 65 64 69  }.    dist = edi
87a0: 74 44 69 73 74 33 43 6f 72 65 28 70 46 72 6f 6d  tDist3Core(pFrom
87b0: 2c 20 7a 42 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c  , zB, nB, pLang,
87c0: 20 30 29 3b 0a 20 20 20 20 65 64 69 74 44 69 73   0);.    editDis
87d0: 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65  t3FromStringDele
87e0: 74 65 28 70 46 72 6f 6d 29 3b 0a 20 20 20 20 69  te(pFrom);.    i
87f0: 66 28 20 64 69 73 74 3d 3d 28 2d 31 29 20 29 7b  f( dist==(-1) ){
8800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
8810: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
8820: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
8830: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8840: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
8850: 63 6f 6e 74 65 78 74 2c 20 64 69 73 74 29 3b 0a  context, dist);.
8860: 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a      }.  } .}../*
8870: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65  .** Register the
8880: 20 65 64 69 74 44 69 73 74 33 20 66 75 6e 63 74   editDist3 funct
8890: 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 0a  ion with SQLite.
88a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64  */.static int ed
88b0: 69 74 44 69 73 74 33 49 6e 73 74 61 6c 6c 28 73  itDist3Install(s
88c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
88d0: 6e 74 20 72 63 3b 0a 20 20 45 64 69 74 44 69 73  nt rc;.  EditDis
88e0: 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  t3Config *pConfi
88f0: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  g = sqlite3_mall
8900: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e  oc( sizeof(*pCon
8910: 66 69 67 29 20 29 3b 0a 20 20 69 66 28 20 70 43  fig) );.  if( pC
8920: 6f 6e 66 69 67 3d 3d 30 20 29 20 72 65 74 75 72  onfig==0 ) retur
8930: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8940: 20 20 6d 65 6d 73 65 74 28 70 43 6f 6e 66 69 67    memset(pConfig
8950: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f  , 0, sizeof(*pCo
8960: 6e 66 69 67 29 29 3b 0a 20 20 72 63 20 3d 20 73  nfig));.  rc = s
8970: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8980: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65  nction_v2(db, "e
8990: 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20  ditdist3",.     
89a0: 20 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49           2, SQLI
89b0: 54 45 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69 67  TE_UTF8, pConfig
89c0: 2c 20 65 64 69 74 44 69 73 74 33 53 71 6c 46 75  , editDist3SqlFu
89d0: 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nc, 0, 0, 0);.  
89e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
89f0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
8a00: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8a10: 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64  ction_v2(db, "ed
8a20: 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20  itdist3",.      
8a30: 20 20 20 20 20 20 20 20 20 20 33 2c 20 53 51 4c            3, SQL
8a40: 49 54 45 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69  ITE_UTF8, pConfi
8a50: 67 2c 20 65 64 69 74 44 69 73 74 33 53 71 6c 46  g, editDist3SqlF
8a60: 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  unc, 0, 0, 0);. 
8a70: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
8a80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
8a90: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8aa0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
8ab0: 2c 20 22 65 64 69 74 64 69 73 74 33 22 2c 0a 20  , "editdist3",. 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
8ad0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70  , SQLITE_UTF8, p
8ae0: 43 6f 6e 66 69 67 2c 20 65 64 69 74 44 69 73 74  Config, editDist
8af0: 33 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 2c 0a  3SqlFunc, 0, 0,.
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44  editDist3ConfigD
8b20: 65 6c 65 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  elete);.  }else{
8b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
8b40: 65 28 70 43 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a  e(pConfig);.  }.
8b50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f    return rc;.}./
8b60: 2a 20 45 6e 64 20 63 6f 6e 66 69 67 75 72 61 62  * End configurab
8b70: 6c 65 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20  le cost unicode 
8b80: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f  edit distance ro
8b90: 75 74 69 6e 65 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  utines.*********
8ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8be0: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
8bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c30: 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 72  ****.** Begin tr
8c40: 61 6e 73 6c 69 74 65 72 61 74 65 20 75 6e 69 63  ansliterate unic
8c50: 6f 64 65 2d 74 6f 2d 61 73 63 69 69 20 69 6d 70  ode-to-ascii imp
8c60: 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2f 0a 0a  lementation.*/..
8c70: 23 69 66 20 21 53 51 4c 49 54 45 5f 41 4d 41 4c  #if !SQLITE_AMAL
8c80: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54  GAMATION./*.** T
8c90: 68 69 73 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65  his lookup table
8ca0: 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70   is used to help
8cb0: 20 64 65 63 6f 64 65 20 74 68 65 20 66 69 72 73   decode the firs
8cc0: 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 61 20 6d  t byte of.** a m
8cd0: 75 6c 74 69 2d 62 79 74 65 20 55 54 46 38 20 63  ulti-byte UTF8 c
8ce0: 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
8cf0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8d00: 65 64 20 63 68 61 72 20 73 71 6c 69 74 65 33 55  ed char sqlite3U
8d10: 74 66 38 54 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a  tf8Trans1[] = {.
8d20: 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78    0x00, 0x01, 0x
8d30: 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20  02, 0x03, 0x04, 
8d40: 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37  0x05, 0x06, 0x07
8d50: 2c 0a 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20  ,.  0x08, 0x09, 
8d60: 30 78 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63  0x0a, 0x0b, 0x0c
8d70: 2c 20 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78  , 0x0d, 0x0e, 0x
8d80: 30 66 2c 0a 20 20 30 78 31 30 2c 20 30 78 31 31  0f,.  0x10, 0x11
8d90: 2c 20 30 78 31 32 2c 20 30 78 31 33 2c 20 30 78  , 0x12, 0x13, 0x
8da0: 31 34 2c 20 30 78 31 35 2c 20 30 78 31 36 2c 20  14, 0x15, 0x16, 
8db0: 30 78 31 37 2c 0a 20 20 30 78 31 38 2c 20 30 78  0x17,.  0x18, 0x
8dc0: 31 39 2c 20 30 78 31 61 2c 20 30 78 31 62 2c 20  19, 0x1a, 0x1b, 
8dd0: 30 78 31 63 2c 20 30 78 31 64 2c 20 30 78 31 65  0x1c, 0x1d, 0x1e
8de0: 2c 20 30 78 31 66 2c 0a 20 20 30 78 30 30 2c 20  , 0x1f,.  0x00, 
8df0: 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33  0x01, 0x02, 0x03
8e00: 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78  , 0x04, 0x05, 0x
8e10: 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38  06, 0x07,.  0x08
8e20: 2c 20 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78  , 0x09, 0x0a, 0x
8e30: 30 62 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20  0b, 0x0c, 0x0d, 
8e40: 30 78 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78  0x0e, 0x0f,.  0x
8e50: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20  00, 0x01, 0x02, 
8e60: 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35  0x03, 0x04, 0x05
8e70: 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20  , 0x06, 0x07,.  
8e80: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32  0x00, 0x01, 0x02
8e90: 2c 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78  , 0x03, 0x00, 0x
8ea0: 30 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 0a  01, 0x00, 0x00,.
8eb0: 7d 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  };.#endif../*.**
8ec0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
8ed0: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 55  e of the first U
8ee0: 54 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 69  TF-8 character i
8ef0: 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f  n the string..*/
8f00: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 74 66 38  .static int utf8
8f10: 52 65 61 64 28 63 6f 6e 73 74 20 75 6e 73 69 67  Read(const unsig
8f20: 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  ned char *z, int
8f30: 20 6e 2c 20 69 6e 74 20 2a 70 53 69 7a 65 29 7b   n, int *pSize){
8f40: 0a 20 20 69 6e 74 20 63 2c 20 69 3b 0a 0a 20 20  .  int c, i;..  
8f50: 2f 2a 20 41 6c 6c 20 63 61 6c 6c 65 72 73 20 74  /* All callers t
8f60: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 28  o this routine (
8f70: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
8f80: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 0a 20  mplementation). 
8f90: 20 2a 2a 20 61 6c 77 61 79 73 20 68 61 76 65 20   ** always have 
8fa0: 6e 3e 30 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  n>0. */.  if( NE
8fb0: 56 45 52 28 6e 3d 3d 30 29 20 29 7b 0a 20 20 20  VER(n==0) ){.   
8fc0: 20 63 20 3d 20 69 20 3d 20 30 3b 0a 20 20 7d 65   c = i = 0;.  }e
8fd0: 6c 73 65 7b 0a 20 20 20 20 63 20 3d 20 7a 5b 30  lse{.    c = z[0
8fe0: 5d 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  ];.    i = 1;.  
8ff0: 20 20 69 66 28 20 63 3e 3d 30 78 63 30 20 29 7b    if( c>=0xc0 ){
9000: 0a 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74  .      c = sqlit
9010: 65 33 55 74 66 38 54 72 61 6e 73 31 5b 63 2d 30  e3Utf8Trans1[c-0
9020: 78 63 30 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c  xc0];.      whil
9030: 65 28 20 69 3c 6e 20 26 26 20 28 7a 5b 69 5d 20  e( i<n && (z[i] 
9040: 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b  & 0xc0)==0x80 ){
9050: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c  .        c = (c<
9060: 3c 36 29 20 2b 20 28 30 78 33 66 20 26 20 7a 5b  <6) + (0x3f & z[
9070: 69 2b 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  i++]);.      }. 
9080: 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 53 69 7a     }.  }.  *pSiz
9090: 65 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20  e = i;.  return 
90a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
90b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
90c0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
90d0: 68 65 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20  he utf-8 string 
90e0: 69 6e 20 74 68 65 20 6e 49 6e 20 62 79 74 65 0a  in the nIn byte.
90f0: 2a 2a 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ** buffer pointe
9100: 64 20 74 6f 20 62 79 20 7a 49 6e 2e 0a 2a 2f 0a  d to by zIn..*/.
9110: 73 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 43  static int utf8C
9120: 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61  harlen(const cha
9130: 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29  r *zIn, int nIn)
9140: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
9150: 20 6e 43 68 61 72 20 3d 20 30 3b 0a 20 20 66 6f   nChar = 0;.  fo
9160: 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 3b 20 6e 43  r(i=0; i<nIn; nC
9170: 68 61 72 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  har++){.    int 
9180: 73 7a 3b 0a 20 20 20 20 75 74 66 38 52 65 61 64  sz;.    utf8Read
9190: 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ((const unsigned
91a0: 20 63 68 61 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c   char *)&zIn[i],
91b0: 20 6e 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20 20   nIn-i, &sz);.  
91c0: 20 20 69 20 2b 3d 20 73 7a 3b 0a 20 20 7d 0a 20    i += sz;.  }. 
91d0: 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d   return nChar;.}
91e0: 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f 66  ../*.** Table of
91f0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 73 20 66 72   translations fr
9200: 6f 6d 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61  om unicode chara
9210: 63 74 65 72 73 20 69 6e 74 6f 20 41 53 43 49 49  cters into ASCII
9220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9230: 74 20 73 74 72 75 63 74 20 7b 0a 20 75 6e 73 69  t struct {. unsi
9240: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63  gned short int c
9250: 46 72 6f 6d 3b 0a 20 75 6e 73 69 67 6e 65 64 20  From;. unsigned 
9260: 63 68 61 72 20 63 54 6f 30 2c 20 63 54 6f 31 3b  char cTo0, cTo1;
9270: 0a 7d 20 74 72 61 6e 73 6c 69 74 5b 5d 20 3d 20  .} translit[] = 
9280: 7b 0a 20 20 7b 20 30 78 30 30 41 30 2c 20 20 30  {.  { 0x00A0,  0
9290: 78 32 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x20, 0x00 },  /*
92a0: 20 c2 a0 20 74 6f 20 20 20 2a 2f 0a 20 20 7b 20   .. to   */.  { 
92b0: 30 78 30 30 42 35 2c 20 20 30 78 37 35 2c 20 30  0x00B5,  0x75, 0
92c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c2 b5 20 74 6f  x00 },  /* .. to
92d0: 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 30   u */.  { 0x00C0
92e0: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
92f0: 20 20 2f 2a 20 c3 80 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
9300: 20 20 7b 20 30 78 30 30 43 31 2c 20 20 30 78 34    { 0x00C1,  0x4
9310: 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  1, 0x00 },  /* .
9320: 81 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78  . to A */.  { 0x
9330: 30 30 43 32 2c 20 20 30 78 34 31 2c 20 30 78 30  00C2,  0x41, 0x0
9340: 30 20 7d 2c 20 20 2f 2a 20 c3 82 20 74 6f 20 41  0 },  /* .. to A
9350: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 33 2c 20   */.  { 0x00C3, 
9360: 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20   0x41, 0x00 },  
9370: 2f 2a 20 c3 83 20 74 6f 20 41 20 2a 2f 0a 20 20  /* .. to A */.  
9380: 7b 20 30 78 30 30 43 34 2c 20 20 30 78 34 31 2c  { 0x00C4,  0x41,
9390: 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 84 20   0x65 },  /* .. 
93a0: 74 6f 20 41 65 20 2a 2f 0a 20 20 7b 20 30 78 30  to Ae */.  { 0x0
93b0: 30 43 35 2c 20 20 30 78 34 31 2c 20 30 78 36 31  0C5,  0x41, 0x61
93c0: 20 7d 2c 20 20 2f 2a 20 c3 85 20 74 6f 20 41 61   },  /* .. to Aa
93d0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 36 2c 20   */.  { 0x00C6, 
93e0: 20 30 78 34 31 2c 20 30 78 34 35 20 7d 2c 20 20   0x41, 0x45 },  
93f0: 2f 2a 20 c3 86 20 74 6f 20 41 45 20 2a 2f 0a 20  /* .. to AE */. 
9400: 20 7b 20 30 78 30 30 43 37 2c 20 20 30 78 34 33   { 0x00C7,  0x43
9410: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 87  , 0x00 },  /* ..
9420: 20 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30   to C */.  { 0x0
9430: 30 43 38 2c 20 20 30 78 34 35 2c 20 30 78 30 30  0C8,  0x45, 0x00
9440: 20 7d 2c 20 20 2f 2a 20 c3 88 20 74 6f 20 45 20   },  /* .. to E 
9450: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 39 2c 20 20  */.  { 0x00C9,  
9460: 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x45, 0x00 },  /
9470: 2a 20 c3 89 20 74 6f 20 45 20 2a 2f 0a 20 20 7b  * .. to E */.  {
9480: 20 30 78 30 30 43 41 2c 20 20 30 78 34 35 2c 20   0x00CA,  0x45, 
9490: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8a 20 74  0x00 },  /* .. t
94a0: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43  o E */.  { 0x00C
94b0: 42 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  B,  0x45, 0x00 }
94c0: 2c 20 20 2f 2a 20 c3 8b 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
94d0: 0a 20 20 7b 20 30 78 30 30 43 43 2c 20 20 30 78  .  { 0x00CC,  0x
94e0: 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  49, 0x00 },  /* 
94f0: c3 8c 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
9500: 78 30 30 43 44 2c 20 20 30 78 34 39 2c 20 30 78  x00CD,  0x49, 0x
9510: 30 30 20 7d 2c 20 20 2f 2a 20 c3 8d 20 74 6f 20  00 },  /* .. to 
9520: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 45 2c  I */.  { 0x00CE,
9530: 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20    0x49, 0x00 }, 
9540: 20 2f 2a 20 c3 8e 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
9550: 20 7b 20 30 78 30 30 43 46 2c 20 20 30 78 34 39   { 0x00CF,  0x49
9560: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8f  , 0x00 },  /* ..
9570: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
9580: 30 44 30 2c 20 20 30 78 34 34 2c 20 30 78 30 30  0D0,  0x44, 0x00
9590: 20 7d 2c 20 20 2f 2a 20 c3 90 20 74 6f 20 44 20   },  /* .. to D 
95a0: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 31 2c 20 20  */.  { 0x00D1,  
95b0: 30 78 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4E, 0x00 },  /
95c0: 2a 20 c3 91 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b  * .. to N */.  {
95d0: 20 30 78 30 30 44 32 2c 20 20 30 78 34 46 2c 20   0x00D2,  0x4F, 
95e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 92 20 74  0x00 },  /* .. t
95f0: 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44  o O */.  { 0x00D
9600: 33 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d  3,  0x4F, 0x00 }
9610: 2c 20 20 2f 2a 20 c3 93 20 74 6f 20 4f 20 2a 2f  ,  /* .. to O */
9620: 0a 20 20 7b 20 30 78 30 30 44 34 2c 20 20 30 78  .  { 0x00D4,  0x
9630: 34 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4F, 0x00 },  /* 
9640: c3 94 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30  .. to O */.  { 0
9650: 78 30 30 44 35 2c 20 20 30 78 34 46 2c 20 30 78  x00D5,  0x4F, 0x
9660: 30 30 20 7d 2c 20 20 2f 2a 20 c3 95 20 74 6f 20  00 },  /* .. to 
9670: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 36 2c  O */.  { 0x00D6,
9680: 20 20 30 78 34 46 2c 20 30 78 36 35 20 7d 2c 20    0x4F, 0x65 }, 
9690: 20 2f 2a 20 c3 96 20 74 6f 20 4f 65 20 2a 2f 0a   /* .. to Oe */.
96a0: 20 20 7b 20 30 78 30 30 44 37 2c 20 20 30 78 37    { 0x00D7,  0x7
96b0: 38 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  8, 0x00 },  /* .
96c0: 97 20 74 6f 20 78 20 2a 2f 0a 20 20 7b 20 30 78  . to x */.  { 0x
96d0: 30 30 44 38 2c 20 20 30 78 34 46 2c 20 30 78 30  00D8,  0x4F, 0x0
96e0: 30 20 7d 2c 20 20 2f 2a 20 c3 98 20 74 6f 20 4f  0 },  /* .. to O
96f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 39 2c 20   */.  { 0x00D9, 
9700: 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x55, 0x00 },  
9710: 2f 2a 20 c3 99 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
9720: 7b 20 30 78 30 30 44 41 2c 20 20 30 78 35 35 2c  { 0x00DA,  0x55,
9730: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9a 20   0x00 },  /* .. 
9740: 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to U */.  { 0x00
9750: 44 42 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  DB,  0x55, 0x00 
9760: 7d 2c 20 20 2f 2a 20 c3 9b 20 74 6f 20 55 20 2a  },  /* .. to U *
9770: 2f 0a 20 20 7b 20 30 78 30 30 44 43 2c 20 20 30  /.  { 0x00DC,  0
9780: 78 35 35 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a  x55, 0x65 },  /*
9790: 20 c3 9c 20 74 6f 20 55 65 20 2a 2f 0a 20 20 7b   .. to Ue */.  {
97a0: 20 30 78 30 30 44 44 2c 20 20 30 78 35 39 2c 20   0x00DD,  0x59, 
97b0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9d 20 74  0x00 },  /* .. t
97c0: 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44  o Y */.  { 0x00D
97d0: 45 2c 20 20 30 78 35 34 2c 20 30 78 36 38 20 7d  E,  0x54, 0x68 }
97e0: 2c 20 20 2f 2a 20 c3 9e 20 74 6f 20 54 68 20 2a  ,  /* .. to Th *
97f0: 2f 0a 20 20 7b 20 30 78 30 30 44 46 2c 20 20 30  /.  { 0x00DF,  0
9800: 78 37 33 2c 20 30 78 37 33 20 7d 2c 20 20 2f 2a  x73, 0x73 },  /*
9810: 20 c3 9f 20 74 6f 20 73 73 20 2a 2f 0a 20 20 7b   .. to ss */.  {
9820: 20 30 78 30 30 45 30 2c 20 20 30 78 36 31 2c 20   0x00E0,  0x61, 
9830: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a0 20 74  0x00 },  /* .. t
9840: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45  o a */.  { 0x00E
9850: 31 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d  1,  0x61, 0x00 }
9860: 2c 20 20 2f 2a 20 c3 a1 20 74 6f 20 61 20 2a 2f  ,  /* .. to a */
9870: 0a 20 20 7b 20 30 78 30 30 45 32 2c 20 20 30 78  .  { 0x00E2,  0x
9880: 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  61, 0x00 },  /* 
9890: c3 a2 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30  .. to a */.  { 0
98a0: 78 30 30 45 33 2c 20 20 30 78 36 31 2c 20 30 78  x00E3,  0x61, 0x
98b0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 a3 20 74 6f 20  00 },  /* .. to 
98c0: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 34 2c  a */.  { 0x00E4,
98d0: 20 20 30 78 36 31 2c 20 30 78 36 35 20 7d 2c 20    0x61, 0x65 }, 
98e0: 20 2f 2a 20 c3 a4 20 74 6f 20 61 65 20 2a 2f 0a   /* .. to ae */.
98f0: 20 20 7b 20 30 78 30 30 45 35 2c 20 20 30 78 36    { 0x00E5,  0x6
9900: 31 2c 20 30 78 36 31 20 7d 2c 20 20 2f 2a 20 c3  1, 0x61 },  /* .
9910: a5 20 74 6f 20 61 61 20 2a 2f 0a 20 20 7b 20 30  . to aa */.  { 0
9920: 78 30 30 45 36 2c 20 20 30 78 36 31 2c 20 30 78  x00E6,  0x61, 0x
9930: 36 35 20 7d 2c 20 20 2f 2a 20 c3 a6 20 74 6f 20  65 },  /* .. to 
9940: 61 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 37  ae */.  { 0x00E7
9950: 2c 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c  ,  0x63, 0x00 },
9960: 20 20 2f 2a 20 c3 a7 20 74 6f 20 63 20 2a 2f 0a    /* .. to c */.
9970: 20 20 7b 20 30 78 30 30 45 38 2c 20 20 30 78 36    { 0x00E8,  0x6
9980: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  5, 0x00 },  /* .
9990: a8 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
99a0: 30 30 45 39 2c 20 20 30 78 36 35 2c 20 30 78 30  00E9,  0x65, 0x0
99b0: 30 20 7d 2c 20 20 2f 2a 20 c3 a9 20 74 6f 20 65  0 },  /* .. to e
99c0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 41 2c 20   */.  { 0x00EA, 
99d0: 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x65, 0x00 },  
99e0: 2f 2a 20 c3 aa 20 74 6f 20 65 20 2a 2f 0a 20 20  /* .. to e */.  
99f0: 7b 20 30 78 30 30 45 42 2c 20 20 30 78 36 35 2c  { 0x00EB,  0x65,
9a00: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ab 20   0x00 },  /* .. 
9a10: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to e */.  { 0x00
9a20: 45 43 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  EC,  0x69, 0x00 
9a30: 7d 2c 20 20 2f 2a 20 c3 ac 20 74 6f 20 69 20 2a  },  /* .. to i *
9a40: 2f 0a 20 20 7b 20 30 78 30 30 45 44 2c 20 20 30  /.  { 0x00ED,  0
9a50: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
9a60: 20 c3 ad 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
9a70: 30 78 30 30 45 45 2c 20 20 30 78 36 39 2c 20 30  0x00EE,  0x69, 0
9a80: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ae 20 74 6f  x00 },  /* .. to
9a90: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 46   i */.  { 0x00EF
9aa0: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
9ab0: 20 20 2f 2a 20 c3 af 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
9ac0: 20 20 7b 20 30 78 30 30 46 30 2c 20 20 30 78 36    { 0x00F0,  0x6
9ad0: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  4, 0x00 },  /* .
9ae0: b0 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78  . to d */.  { 0x
9af0: 30 30 46 31 2c 20 20 30 78 36 45 2c 20 30 78 30  00F1,  0x6E, 0x0
9b00: 30 20 7d 2c 20 20 2f 2a 20 c3 b1 20 74 6f 20 6e  0 },  /* .. to n
9b10: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 32 2c 20   */.  { 0x00F2, 
9b20: 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20   0x6F, 0x00 },  
9b30: 2f 2a 20 c3 b2 20 74 6f 20 6f 20 2a 2f 0a 20 20  /* .. to o */.  
9b40: 7b 20 30 78 30 30 46 33 2c 20 20 30 78 36 46 2c  { 0x00F3,  0x6F,
9b50: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b3 20   0x00 },  /* .. 
9b60: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to o */.  { 0x00
9b70: 46 34 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20  F4,  0x6F, 0x00 
9b80: 7d 2c 20 20 2f 2a 20 c3 b4 20 74 6f 20 6f 20 2a  },  /* .. to o *
9b90: 2f 0a 20 20 7b 20 30 78 30 30 46 35 2c 20 20 30  /.  { 0x00F5,  0
9ba0: 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6F, 0x00 },  /*
9bb0: 20 c3 b5 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
9bc0: 30 78 30 30 46 36 2c 20 20 30 78 36 46 2c 20 30  0x00F6,  0x6F, 0
9bd0: 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 b6 20 74 6f  x65 },  /* .. to
9be0: 20 6f 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46   oe */.  { 0x00F
9bf0: 37 2c 20 20 30 78 33 41 2c 20 30 78 30 30 20 7d  7,  0x3A, 0x00 }
9c00: 2c 20 20 2f 2a 20 c3 b7 20 74 6f 20 3a 20 2a 2f  ,  /* .. to : */
9c10: 0a 20 20 7b 20 30 78 30 30 46 38 2c 20 20 30 78  .  { 0x00F8,  0x
9c20: 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6F, 0x00 },  /* 
9c30: c3 b8 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30  .. to o */.  { 0
9c40: 78 30 30 46 39 2c 20 20 30 78 37 35 2c 20 30 78  x00F9,  0x75, 0x
9c50: 30 30 20 7d 2c 20 20 2f 2a 20 c3 b9 20 74 6f 20  00 },  /* .. to 
9c60: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 41 2c  u */.  { 0x00FA,
9c70: 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20    0x75, 0x00 }, 
9c80: 20 2f 2a 20 c3 ba 20 74 6f 20 75 20 2a 2f 0a 20   /* .. to u */. 
9c90: 20 7b 20 30 78 30 30 46 42 2c 20 20 30 78 37 35   { 0x00FB,  0x75
9ca0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bb  , 0x00 },  /* ..
9cb0: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
9cc0: 30 46 43 2c 20 20 30 78 37 35 2c 20 30 78 36 35  0FC,  0x75, 0x65
9cd0: 20 7d 2c 20 20 2f 2a 20 c3 bc 20 74 6f 20 75 65   },  /* .. to ue
9ce0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 44 2c 20   */.  { 0x00FD, 
9cf0: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
9d00: 2f 2a 20 c3 bd 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
9d10: 7b 20 30 78 30 30 46 45 2c 20 20 30 78 37 34 2c  { 0x00FE,  0x74,
9d20: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c3 be 20   0x68 },  /* .. 
9d30: 74 6f 20 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to th */.  { 0x0
9d40: 30 46 46 2c 20 20 30 78 37 39 2c 20 30 78 30 30  0FF,  0x79, 0x00
9d50: 20 7d 2c 20 20 2f 2a 20 c3 bf 20 74 6f 20 79 20   },  /* .. to y 
9d60: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 30 2c 20 20  */.  { 0x0100,  
9d70: 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x41, 0x00 },  /
9d80: 2a 20 c4 80 20 74 6f 20 41 20 2a 2f 0a 20 20 7b  * .. to A */.  {
9d90: 20 30 78 30 31 30 31 2c 20 20 30 78 36 31 2c 20   0x0101,  0x61, 
9da0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 81 20 74  0x00 },  /* .. t
9db0: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o a */.  { 0x010
9dc0: 32 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d  2,  0x41, 0x00 }
9dd0: 2c 20 20 2f 2a 20 c4 82 20 74 6f 20 41 20 2a 2f  ,  /* .. to A */
9de0: 0a 20 20 7b 20 30 78 30 31 30 33 2c 20 20 30 78  .  { 0x0103,  0x
9df0: 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  61, 0x00 },  /* 
9e00: c4 83 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30  .. to a */.  { 0
9e10: 78 30 31 30 34 2c 20 20 30 78 34 31 2c 20 30 78  x0104,  0x41, 0x
9e20: 30 30 20 7d 2c 20 20 2f 2a 20 c4 84 20 74 6f 20  00 },  /* .. to 
9e30: 41 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 35 2c  A */.  { 0x0105,
9e40: 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20    0x61, 0x00 }, 
9e50: 20 2f 2a 20 c4 85 20 74 6f 20 61 20 2a 2f 0a 20   /* .. to a */. 
9e60: 20 7b 20 30 78 30 31 30 36 2c 20 20 30 78 34 33   { 0x0106,  0x43
9e70: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 86  , 0x00 },  /* ..
9e80: 20 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30   to C */.  { 0x0
9e90: 31 30 37 2c 20 20 30 78 36 33 2c 20 30 78 30 30  107,  0x63, 0x00
9ea0: 20 7d 2c 20 20 2f 2a 20 c4 87 20 74 6f 20 63 20   },  /* .. to c 
9eb0: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 38 2c 20 20  */.  { 0x0108,  
9ec0: 30 78 34 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x43, 0x68 },  /
9ed0: 2a 20 c4 88 20 74 6f 20 43 68 20 2a 2f 0a 20 20  * .. to Ch */.  
9ee0: 7b 20 30 78 30 31 30 39 2c 20 20 30 78 36 33 2c  { 0x0109,  0x63,
9ef0: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 89 20   0x68 },  /* .. 
9f00: 74 6f 20 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to ch */.  { 0x0
9f10: 31 30 41 2c 20 20 30 78 34 33 2c 20 30 78 30 30  10A,  0x43, 0x00
9f20: 20 7d 2c 20 20 2f 2a 20 c4 8a 20 74 6f 20 43 20   },  /* .. to C 
9f30: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 42 2c 20 20  */.  { 0x010B,  
9f40: 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x63, 0x00 },  /
9f50: 2a 20 c4 8b 20 74 6f 20 63 20 2a 2f 0a 20 20 7b  * .. to c */.  {
9f60: 20 30 78 30 31 30 43 2c 20 20 30 78 34 33 2c 20   0x010C,  0x43, 
9f70: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8c 20 74  0x00 },  /* .. t
9f80: 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o C */.  { 0x010
9f90: 44 2c 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d  D,  0x63, 0x00 }
9fa0: 2c 20 20 2f 2a 20 c4 8d 20 74 6f 20 63 20 2a 2f  ,  /* .. to c */
9fb0: 0a 20 20 7b 20 30 78 30 31 30 45 2c 20 20 30 78  .  { 0x010E,  0x
9fc0: 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  44, 0x00 },  /* 
9fd0: c4 8e 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30  .. to D */.  { 0
9fe0: 78 30 31 30 46 2c 20 20 30 78 36 34 2c 20 30 78  x010F,  0x64, 0x
9ff0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 8f 20 74 6f 20  00 },  /* .. to 
a000: 64 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 30 2c  d */.  { 0x0110,
a010: 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20    0x44, 0x00 }, 
a020: 20 2f 2a 20 c4 90 20 74 6f 20 44 20 2a 2f 0a 20   /* .. to D */. 
a030: 20 7b 20 30 78 30 31 31 31 2c 20 20 30 78 36 34   { 0x0111,  0x64
a040: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 91  , 0x00 },  /* ..
a050: 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30   to d */.  { 0x0
a060: 31 31 32 2c 20 20 30 78 34 35 2c 20 30 78 30 30  112,  0x45, 0x00
a070: 20 7d 2c 20 20 2f 2a 20 c4 92 20 74 6f 20 45 20   },  /* .. to E 
a080: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 33 2c 20 20  */.  { 0x0113,  
a090: 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x65, 0x00 },  /
a0a0: 2a 20 c4 93 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
a0b0: 20 30 78 30 31 31 34 2c 20 20 30 78 34 35 2c 20   0x0114,  0x45, 
a0c0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 94 20 74  0x00 },  /* .. t
a0d0: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o E */.  { 0x011
a0e0: 35 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d  5,  0x65, 0x00 }
a0f0: 2c 20 20 2f 2a 20 c4 95 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
a100: 0a 20 20 7b 20 30 78 30 31 31 36 2c 20 20 30 78  .  { 0x0116,  0x
a110: 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  45, 0x00 },  /* 
a120: c4 96 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
a130: 78 30 31 31 37 2c 20 20 30 78 36 35 2c 20 30 78  x0117,  0x65, 0x
a140: 30 30 20 7d 2c 20 20 2f 2a 20 c4 97 20 74 6f 20  00 },  /* .. to 
a150: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 38 2c  e */.  { 0x0118,
a160: 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20    0x45, 0x00 }, 
a170: 20 2f 2a 20 c4 98 20 74 6f 20 45 20 2a 2f 0a 20   /* .. to E */. 
a180: 20 7b 20 30 78 30 31 31 39 2c 20 20 30 78 36 35   { 0x0119,  0x65
a190: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 99  , 0x00 },  /* ..
a1a0: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
a1b0: 31 31 41 2c 20 20 30 78 34 35 2c 20 30 78 30 30  11A,  0x45, 0x00
a1c0: 20 7d 2c 20 20 2f 2a 20 c4 9a 20 74 6f 20 45 20   },  /* .. to E 
a1d0: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 42 2c 20 20  */.  { 0x011B,  
a1e0: 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x65, 0x00 },  /
a1f0: 2a 20 c4 9b 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
a200: 20 30 78 30 31 31 43 2c 20 20 30 78 34 37 2c 20   0x011C,  0x47, 
a210: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 9c 20 74  0x68 },  /* .. t
a220: 6f 20 47 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o Gh */.  { 0x01
a230: 31 44 2c 20 20 30 78 36 37 2c 20 30 78 36 38 20  1D,  0x67, 0x68 
a240: 7d 2c 20 20 2f 2a 20 c4 9d 20 74 6f 20 67 68 20  },  /* .. to gh 
a250: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 45 2c 20 20  */.  { 0x011E,  
a260: 30 78 34 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x47, 0x00 },  /
a270: 2a 20 c4 9e 20 74 6f 20 47 20 2a 2f 0a 20 20 7b  * .. to G */.  {
a280: 20 30 78 30 31 31 46 2c 20 20 30 78 36 37 2c 20   0x011F,  0x67, 
a290: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9f 20 74  0x00 },  /* .. t
a2a0: 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o g */.  { 0x012
a2b0: 30 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d  0,  0x47, 0x00 }
a2c0: 2c 20 20 2f 2a 20 c4 a0 20 74 6f 20 47 20 2a 2f  ,  /* .. to G */
a2d0: 0a 20 20 7b 20 30 78 30 31 32 31 2c 20 20 30 78  .  { 0x0121,  0x
a2e0: 36 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  67, 0x00 },  /* 
a2f0: c4 a1 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30  .. to g */.  { 0
a300: 78 30 31 32 32 2c 20 20 30 78 34 37 2c 20 30 78  x0122,  0x47, 0x
a310: 30 30 20 7d 2c 20 20 2f 2a 20 c4 a2 20 74 6f 20  00 },  /* .. to 
a320: 47 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 33 2c  G */.  { 0x0123,
a330: 20 20 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20    0x67, 0x00 }, 
a340: 20 2f 2a 20 c4 a3 20 74 6f 20 67 20 2a 2f 0a 20   /* .. to g */. 
a350: 20 7b 20 30 78 30 31 32 34 2c 20 20 30 78 34 38   { 0x0124,  0x48
a360: 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 a4  , 0x68 },  /* ..
a370: 20 74 6f 20 48 68 20 2a 2f 0a 20 20 7b 20 30 78   to Hh */.  { 0x
a380: 30 31 32 35 2c 20 20 30 78 36 38 2c 20 30 78 36  0125,  0x68, 0x6
a390: 38 20 7d 2c 20 20 2f 2a 20 c4 a5 20 74 6f 20 68  8 },  /* .. to h
a3a0: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 36 2c  h */.  { 0x0126,
a3b0: 20 20 30 78 34 38 2c 20 30 78 30 30 20 7d 2c 20    0x48, 0x00 }, 
a3c0: 20 2f 2a 20 c4 a6 20 74 6f 20 48 20 2a 2f 0a 20   /* .. to H */. 
a3d0: 20 7b 20 30 78 30 31 32 37 2c 20 20 30 78 36 38   { 0x0127,  0x68
a3e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a7  , 0x00 },  /* ..
a3f0: 20 74 6f 20 68 20 2a 2f 0a 20 20 7b 20 30 78 30   to h */.  { 0x0
a400: 31 32 38 2c 20 20 30 78 34 39 2c 20 30 78 30 30  128,  0x49, 0x00
a410: 20 7d 2c 20 20 2f 2a 20 c4 a8 20 74 6f 20 49 20   },  /* .. to I 
a420: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 39 2c 20 20  */.  { 0x0129,  
a430: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
a440: 2a 20 c4 a9 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
a450: 20 30 78 30 31 32 41 2c 20 20 30 78 34 39 2c 20   0x012A,  0x49, 
a460: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 aa 20 74  0x00 },  /* .. t
a470: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o I */.  { 0x012
a480: 42 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d  B,  0x69, 0x00 }
a490: 2c 20 20 2f 2a 20 c4 ab 20 74 6f 20 69 20 2a 2f  ,  /* .. to i */
a4a0: 0a 20 20 7b 20 30 78 30 31 32 43 2c 20 20 30 78  .  { 0x012C,  0x
a4b0: 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  49, 0x00 },  /* 
a4c0: c4 ac 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
a4d0: 78 30 31 32 44 2c 20 20 30 78 36 39 2c 20 30 78  x012D,  0x69, 0x
a4e0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 ad 20 74 6f 20  00 },  /* .. to 
a4f0: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 45 2c  i */.  { 0x012E,
a500: 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20    0x49, 0x00 }, 
a510: 20 2f 2a 20 c4 ae 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
a520: 20 7b 20 30 78 30 31 32 46 2c 20 20 30 78 36 39   { 0x012F,  0x69
a530: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 af  , 0x00 },  /* ..
a540: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
a550: 31 33 30 2c 20 20 30 78 34 39 2c 20 30 78 30 30  130,  0x49, 0x00
a560: 20 7d 2c 20 20 2f 2a 20 c4 b0 20 74 6f 20 49 20   },  /* .. to I 
a570: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 31 2c 20 20  */.  { 0x0131,  
a580: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
a590: 2a 20 c4 b1 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
a5a0: 20 30 78 30 31 33 32 2c 20 20 30 78 34 39 2c 20   0x0132,  0x49, 
a5b0: 30 78 34 41 20 7d 2c 20 20 2f 2a 20 c4 b2 20 74  0x4A },  /* .. t
a5c0: 6f 20 49 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o IJ */.  { 0x01
a5d0: 33 33 2c 20 20 30 78 36 39 2c 20 30 78 36 41 20  33,  0x69, 0x6A 
a5e0: 7d 2c 20 20 2f 2a 20 c4 b3 20 74 6f 20 69 6a 20  },  /* .. to ij 
a5f0: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 34 2c 20 20  */.  { 0x0134,  
a600: 30 78 34 41 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x4A, 0x68 },  /
a610: 2a 20 c4 b4 20 74 6f 20 4a 68 20 2a 2f 0a 20 20  * .. to Jh */.  
a620: 7b 20 30 78 30 31 33 35 2c 20 20 30 78 36 41 2c  { 0x0135,  0x6A,
a630: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 b5 20   0x68 },  /* .. 
a640: 74 6f 20 6a 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to jh */.  { 0x0
a650: 31 33 36 2c 20 20 30 78 34 42 2c 20 30 78 30 30  136,  0x4B, 0x00
a660: 20 7d 2c 20 20 2f 2a 20 c4 b6 20 74 6f 20 4b 20   },  /* .. to K 
a670: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 37 2c 20 20  */.  { 0x0137,  
a680: 30 78 36 42 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6B, 0x00 },  /
a690: 2a 20 c4 b7 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b  * .. to k */.  {
a6a0: 20 30 78 30 31 33 38 2c 20 20 30 78 36 42 2c 20   0x0138,  0x6B, 
a6b0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b8 20 74  0x00 },  /* .. t
a6c0: 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o k */.  { 0x013
a6d0: 39 2c 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d  9,  0x4C, 0x00 }
a6e0: 2c 20 20 2f 2a 20 c4 b9 20 74 6f 20 4c 20 2a 2f  ,  /* .. to L */
a6f0: 0a 20 20 7b 20 30 78 30 31 33 41 2c 20 20 30 78  .  { 0x013A,  0x
a700: 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6C, 0x00 },  /* 
a710: c4 ba 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30  .. to l */.  { 0
a720: 78 30 31 33 42 2c 20 20 30 78 34 43 2c 20 30 78  x013B,  0x4C, 0x
a730: 30 30 20 7d 2c 20 20 2f 2a 20 c4 bb 20 74 6f 20  00 },  /* .. to 
a740: 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 43 2c  L */.  { 0x013C,
a750: 20 20 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20    0x6C, 0x00 }, 
a760: 20 2f 2a 20 c4 bc 20 74 6f 20 6c 20 2a 2f 0a 20   /* .. to l */. 
a770: 20 7b 20 30 78 30 31 33 44 2c 20 20 30 78 34 43   { 0x013D,  0x4C
a780: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 bd  , 0x00 },  /* ..
a790: 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30   to L */.  { 0x0
a7a0: 31 33 45 2c 20 20 30 78 36 43 2c 20 30 78 30 30  13E,  0x6C, 0x00
a7b0: 20 7d 2c 20 20 2f 2a 20 c4 be 20 74 6f 20 6c 20   },  /* .. to l 
a7c0: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 46 2c 20 20  */.  { 0x013F,  
a7d0: 30 78 34 43 2c 20 30 78 32 45 20 7d 2c 20 20 2f  0x4C, 0x2E },  /
a7e0: 2a 20 c4 bf 20 74 6f 20 4c 2e 20 2a 2f 0a 20 20  * .. to L. */.  
a7f0: 7b 20 30 78 30 31 34 30 2c 20 20 30 78 36 43 2c  { 0x0140,  0x6C,
a800: 20 30 78 32 45 20 7d 2c 20 20 2f 2a 20 c5 80 20   0x2E },  /* .. 
a810: 74 6f 20 6c 2e 20 2a 2f 0a 20 20 7b 20 30 78 30  to l. */.  { 0x0
a820: 31 34 31 2c 20 20 30 78 34 43 2c 20 30 78 30 30  141,  0x4C, 0x00
a830: 20 7d 2c 20 20 2f 2a 20 c5 81 20 74 6f 20 4c 20   },  /* .. to L 
a840: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 32 2c 20 20  */.  { 0x0142,  
a850: 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6C, 0x00 },  /
a860: 2a 20 c5 82 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b  * .. to l */.  {
a870: 20 30 78 30 31 34 33 2c 20 20 30 78 34 45 2c 20   0x0143,  0x4E, 
a880: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 83 20 74  0x00 },  /* .. t
a890: 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34  o N */.  { 0x014
a8a0: 34 2c 20 20 30 78 36 45 2c 20 30 78 30 30 20 7d  4,  0x6E, 0x00 }
a8b0: 2c 20 20 2f 2a 20 c5 84 20 74 6f 20 6e 20 2a 2f  ,  /* .. to n */
a8c0: 0a 20 20 7b 20 30 78 30 31 34 35 2c 20 20 30 78  .  { 0x0145,  0x
a8d0: 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4E, 0x00 },  /* 
a8e0: c5 85 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30  .. to N */.  { 0
a8f0: 78 30 31 34 36 2c 20 20 30 78 36 45 2c 20 30 78  x0146,  0x6E, 0x
a900: 30 30 20 7d 2c 20 20 2f 2a 20 c5 86 20 74 6f 20  00 },  /* .. to 
a910: 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 37 2c  n */.  { 0x0147,
a920: 20 20 30 78 34 45 2c 20 30 78 30 30 20 7d 2c 20    0x4E, 0x00 }, 
a930: 20 2f 2a 20 c5 87 20 74 6f 20 4e 20 2a 2f 0a 20   /* .. to N */. 
a940: 20 7b 20 30 78 30 31 34 38 2c 20 20 30 78 36 45   { 0x0148,  0x6E
a950: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 88  , 0x00 },  /* ..
a960: 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30   to n */.  { 0x0
a970: 31 34 39 2c 20 20 30 78 32 37 2c 20 30 78 36 45  149,  0x27, 0x6E
a980: 20 7d 2c 20 20 2f 2a 20 c5 89 20 74 6f 20 27 6e   },  /* .. to 'n
a990: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 41 2c 20   */.  { 0x014A, 
a9a0: 20 30 78 34 45 2c 20 30 78 34 37 20 7d 2c 20 20   0x4E, 0x47 },  
a9b0: 2f 2a 20 c5 8a 20 74 6f 20 4e 47 20 2a 2f 0a 20  /* .. to NG */. 
a9c0: 20 7b 20 30 78 30 31 34 42 2c 20 20 30 78 36 45   { 0x014B,  0x6E
a9d0: 2c 20 30 78 36 37 20 7d 2c 20 20 2f 2a 20 c5 8b  , 0x67 },  /* ..
a9e0: 20 74 6f 20 6e 67 20 2a 2f 0a 20 20 7b 20 30 78   to ng */.  { 0x
a9f0: 30 31 34 43 2c 20 20 30 78 34 46 2c 20 30 78 30  014C,  0x4F, 0x0
aa00: 30 20 7d 2c 20 20 2f 2a 20 c5 8c 20 74 6f 20 4f  0 },  /* .. to O
aa10: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 44 2c 20   */.  { 0x014D, 
aa20: 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20   0x6F, 0x00 },  
aa30: 2f 2a 20 c5 8d 20 74 6f 20 6f 20 2a 2f 0a 20 20  /* .. to o */.  
aa40: 7b 20 30 78 30 31 34 45 2c 20 20 30 78 34 46 2c  { 0x014E,  0x4F,
aa50: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8e 20   0x00 },  /* .. 
aa60: 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to O */.  { 0x01
aa70: 34 46 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20  4F,  0x6F, 0x00 
aa80: 7d 2c 20 20 2f 2a 20 c5 8f 20 74 6f 20 6f 20 2a  },  /* .. to o *
aa90: 2f 0a 20 20 7b 20 30 78 30 31 35 30 2c 20 20 30  /.  { 0x0150,  0
aaa0: 78 34 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4F, 0x00 },  /*
aab0: 20 c5 90 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
aac0: 30 78 30 31 35 31 2c 20 20 30 78 36 46 2c 20 30  0x0151,  0x6F, 0
aad0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 91 20 74 6f  x00 },  /* .. to
aae0: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 32   o */.  { 0x0152
aaf0: 2c 20 20 30 78 34 46 2c 20 30 78 34 35 20 7d 2c  ,  0x4F, 0x45 },
ab00: 20 20 2f 2a 20 c5 92 20 74 6f 20 4f 45 20 2a 2f    /* .. to OE */
ab10: 0a 20 20 7b 20 30 78 30 31 35 33 2c 20 20 30 78  .  { 0x0153,  0x
ab20: 36 46 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20  6F, 0x65 },  /* 
ab30: c5 93 20 74 6f 20 6f 65 20 2a 2f 0a 20 20 7b 20  .. to oe */.  { 
ab40: 30 78 30 31 35 34 2c 20 20 30 78 35 32 2c 20 30  0x0154,  0x52, 0
ab50: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 94 20 74 6f  x00 },  /* .. to
ab60: 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 35   R */.  { 0x0155
ab70: 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c  ,  0x72, 0x00 },
ab80: 20 20 2f 2a 20 c5 95 20 74 6f 20 72 20 2a 2f 0a    /* .. to r */.
ab90: 20 20 7b 20 30 78 30 31 35 36 2c 20 20 30 78 35    { 0x0156,  0x5
aba0: 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  2, 0x00 },  /* .
abb0: 96 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78  . to R */.  { 0x
abc0: 30 31 35 37 2c 20 20 30 78 37 32 2c 20 30 78 30  0157,  0x72, 0x0
abd0: 30 20 7d 2c 20 20 2f 2a 20 c5 97 20 74 6f 20 72  0 },  /* .. to r
abe0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 38 2c 20   */.  { 0x0158, 
abf0: 20 30 78 35 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x52, 0x00 },  
ac00: 2f 2a 20 c5 98 20 74 6f 20 52 20 2a 2f 0a 20 20  /* .. to R */.  
ac10: 7b 20 30 78 30 31 35 39 2c 20 20 30 78 37 32 2c  { 0x0159,  0x72,
ac20: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 99 20   0x00 },  /* .. 
ac30: 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to r */.  { 0x01
ac40: 35 41 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20  5A,  0x53, 0x00 
ac50: 7d 2c 20 20 2f 2a 20 c5 9a 20 74 6f 20 53 20 2a  },  /* .. to S *
ac60: 2f 0a 20 20 7b 20 30 78 30 31 35 42 2c 20 20 30  /.  { 0x015B,  0
ac70: 78 37 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x73, 0x00 },  /*
ac80: 20 c5 9b 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20   .. to s */.  { 
ac90: 30 78 30 31 35 43 2c 20 20 30 78 35 33 2c 20 30  0x015C,  0x53, 0
aca0: 78 36 38 20 7d 2c 20 20 2f 2a 20 c5 9c 20 74 6f  x68 },  /* .. to
acb0: 20 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35   Sh */.  { 0x015
acc0: 44 2c 20 20 30 78 37 33 2c 20 30 78 36 38 20 7d  D,  0x73, 0x68 }
acd0: 2c 20 20 2f 2a 20 c5 9d 20 74 6f 20 73 68 20 2a  ,  /* .. to sh *
ace0: 2f 0a 20 20 7b 20 30 78 30 31 35 45 2c 20 20 30  /.  { 0x015E,  0
acf0: 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x53, 0x00 },  /*
ad00: 20 c5 9e 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20   .. to S */.  { 
ad10: 30 78 30 31 35 46 2c 20 20 30 78 37 33 2c 20 30  0x015F,  0x73, 0
ad20: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9f 20 74 6f  x00 },  /* .. to
ad30: 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 30   s */.  { 0x0160
ad40: 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c  ,  0x53, 0x00 },
ad50: 20 20 2f 2a 20 c5 a0 20 74 6f 20 53 20 2a 2f 0a    /* .. to S */.
ad60: 20 20 7b 20 30 78 30 31 36 31 2c 20 20 30 78 37    { 0x0161,  0x7
ad70: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  3, 0x00 },  /* .
ad80: a1 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
ad90: 30 31 36 32 2c 20 20 30 78 35 34 2c 20 30 78 30  0162,  0x54, 0x0
ada0: 30 20 7d 2c 20 20 2f 2a 20 c5 a2 20 74 6f 20 54  0 },  /* .. to T
adb0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 33 2c 20   */.  { 0x0163, 
adc0: 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x74, 0x00 },  
add0: 2f 2a 20 c5 a3 20 74 6f 20 74 20 2a 2f 0a 20 20  /* .. to t */.  
ade0: 7b 20 30 78 30 31 36 34 2c 20 20 30 78 35 34 2c  { 0x0164,  0x54,
adf0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a4 20   0x00 },  /* .. 
ae00: 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to T */.  { 0x01
ae10: 36 35 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20  65,  0x74, 0x00 
ae20: 7d 2c 20 20 2f 2a 20 c5 a5 20 74 6f 20 74 20 2a  },  /* .. to t *
ae30: 2f 0a 20 20 7b 20 30 78 30 31 36 36 2c 20 20 30  /.  { 0x0166,  0
ae40: 78 35 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x54, 0x00 },  /*
ae50: 20 c5 a6 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20   .. to T */.  { 
ae60: 30 78 30 31 36 37 2c 20 20 30 78 37 34 2c 20 30  0x0167,  0x74, 0
ae70: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a7 20 74 6f  x00 },  /* .. to
ae80: 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 38   t */.  { 0x0168
ae90: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
aea0: 20 20 2f 2a 20 c5 a8 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
aeb0: 20 20 7b 20 30 78 30 31 36 39 2c 20 20 30 78 37    { 0x0169,  0x7
aec0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  5, 0x00 },  /* .
aed0: a9 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78  . to u */.  { 0x
aee0: 30 31 36 41 2c 20 20 30 78 35 35 2c 20 30 78 30  016A,  0x55, 0x0
aef0: 30 20 7d 2c 20 20 2f 2a 20 c5 aa 20 74 6f 20 55  0 },  /* .. to U
af00: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 42 2c 20   */.  { 0x016B, 
af10: 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x75, 0x00 },  
af20: 2f 2a 20 c5 ab 20 74 6f 20 75 20 2a 2f 0a 20 20  /* .. to u */.  
af30: 7b 20 30 78 30 31 36 43 2c 20 20 30 78 35 35 2c  { 0x016C,  0x55,
af40: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ac 20   0x00 },  /* .. 
af50: 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to U */.  { 0x01
af60: 36 44 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20  6D,  0x75, 0x00 
af70: 7d 2c 20 20 2f 2a 20 c5 ad 20 74 6f 20 75 20 2a  },  /* .. to u *
af80: 2f 0a 20 20 7b 20 30 78 30 31 36 45 2c 20 20 30  /.  { 0x016E,  0
af90: 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x55, 0x00 },  /*
afa0: 20 c5 ae 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20   .. to U */.  { 
afb0: 30 78 30 31 36 46 2c 20 20 30 78 37 35 2c 20 30  0x016F,  0x75, 0
afc0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 af 20 74 6f  x00 },  /* .. to
afd0: 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 30   u */.  { 0x0170
afe0: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
aff0: 20 20 2f 2a 20 c5 b0 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
b000: 20 20 7b 20 30 78 30 31 37 31 2c 20 20 30 78 37    { 0x0171,  0x7
b010: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  5, 0x00 },  /* .
b020: b1 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78  . to u */.  { 0x
b030: 30 31 37 32 2c 20 20 30 78 35 35 2c 20 30 78 30  0172,  0x55, 0x0
b040: 30 20 7d 2c 20 20 2f 2a 20 c5 b2 20 74 6f 20 55  0 },  /* .. to U
b050: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 33 2c 20   */.  { 0x0173, 
b060: 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x75, 0x00 },  
b070: 2f 2a 20 c5 b3 20 74 6f 20 75 20 2a 2f 0a 20 20  /* .. to u */.  
b080: 7b 20 30 78 30 31 37 34 2c 20 20 30 78 35 37 2c  { 0x0174,  0x57,
b090: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b4 20   0x00 },  /* .. 
b0a0: 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to W */.  { 0x01
b0b0: 37 35 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20  75,  0x77, 0x00 
b0c0: 7d 2c 20 20 2f 2a 20 c5 b5 20 74 6f 20 77 20 2a  },  /* .. to w *
b0d0: 2f 0a 20 20 7b 20 30 78 30 31 37 36 2c 20 20 30  /.  { 0x0176,  0
b0e0: 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x59, 0x00 },  /*
b0f0: 20 c5 b6 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20   .. to Y */.  { 
b100: 30 78 30 31 37 37 2c 20 20 30 78 37 39 2c 20 30  0x0177,  0x79, 0
b110: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b7 20 74 6f  x00 },  /* .. to
b120: 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 38   y */.  { 0x0178
b130: 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c  ,  0x59, 0x00 },
b140: 20 20 2f 2a 20 c5 b8 20 74 6f 20 59 20 2a 2f 0a    /* .. to Y */.
b150: 20 20 7b 20 30 78 30 31 37 39 2c 20 20 30 78 35    { 0x0179,  0x5
b160: 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  A, 0x00 },  /* .
b170: b9 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78  . to Z */.  { 0x
b180: 30 31 37 41 2c 20 20 30 78 37 41 2c 20 30 78 30  017A,  0x7A, 0x0
b190: 30 20 7d 2c 20 20 2f 2a 20 c5 ba 20 74 6f 20 7a  0 },  /* .. to z
b1a0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 42 2c 20   */.  { 0x017B, 
b1b0: 20 30 78 35 41 2c 20 30 78 30 30 20 7d 2c 20 20   0x5A, 0x00 },  
b1c0: 2f 2a 20 c5 bb 20 74 6f 20 5a 20 2a 2f 0a 20 20  /* .. to Z */.  
b1d0: 7b 20 30 78 30 31 37 43 2c 20 20 30 78 37 41 2c  { 0x017C,  0x7A,
b1e0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bc 20   0x00 },  /* .. 
b1f0: 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to z */.  { 0x01
b200: 37 44 2c 20 20 30 78 35 41 2c 20 30 78 30 30 20  7D,  0x5A, 0x00 
b210: 7d 2c 20 20 2f 2a 20 c5 bd 20 74 6f 20 5a 20 2a  },  /* .. to Z *
b220: 2f 0a 20 20 7b 20 30 78 30 31 37 45 2c 20 20 30  /.  { 0x017E,  0
b230: 78 37 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x7A, 0x00 },  /*
b240: 20 c5 be 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20   .. to z */.  { 
b250: 30 78 30 31 37 46 2c 20 20 30 78 37 33 2c 20 30  0x017F,  0x73, 0
b260: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bf 20 74 6f  x00 },  /* .. to
b270: 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 39 32   s */.  { 0x0192
b280: 2c 20 20 30 78 36 36 2c 20 30 78 30 30 20 7d 2c  ,  0x66, 0x00 },
b290: 20 20 2f 2a 20 c6 92 20 74 6f 20 66 20 2a 2f 0a    /* .. to f */.
b2a0: 20 20 7b 20 30 78 30 32 31 38 2c 20 20 30 78 35    { 0x0218,  0x5
b2b0: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8  3, 0x00 },  /* .
b2c0: 98 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78  . to S */.  { 0x
b2d0: 30 32 31 39 2c 20 20 30 78 37 33 2c 20 30 78 30  0219,  0x73, 0x0
b2e0: 30 20 7d 2c 20 20 2f 2a 20 c8 99 20 74 6f 20 73  0 },  /* .. to s
b2f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 32 31 41 2c 20   */.  { 0x021A, 
b300: 20 30 78 35 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x54, 0x00 },  
b310: 2f 2a 20 c8 9a 20 74 6f 20 54 20 2a 2f 0a 20 20  /* .. to T */.  
b320: 7b 20 30 78 30 32 31 42 2c 20 20 30 78 37 34 2c  { 0x021B,  0x74,
b330: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9b 20   0x00 },  /* .. 
b340: 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to t */.  { 0x03
b350: 38 36 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20  86,  0x41, 0x00 
b360: 7d 2c 20 20 2f 2a 20 ce 86 20 74 6f 20 41 20 2a  },  /* .. to A *
b370: 2f 0a 20 20 7b 20 30 78 30 33 38 38 2c 20 20 30  /.  { 0x0388,  0
b380: 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x45, 0x00 },  /*
b390: 20 ce 88 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
b3a0: 30 78 30 33 38 39 2c 20 20 30 78 34 39 2c 20 30  0x0389,  0x49, 0
b3b0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 89 20 74 6f  x00 },  /* .. to
b3c0: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 41   I */.  { 0x038A
b3d0: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
b3e0: 20 20 2f 2a 20 ce 8a 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
b3f0: 20 20 7b 20 30 78 30 33 38 43 2c 20 20 30 78 34    { 0x038C,  0x4
b400: 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  f, 0x00 },  /* .
b410: 8c 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
b420: 30 33 38 45 2c 20 20 30 78 35 39 2c 20 30 78 30  038E,  0x59, 0x0
b430: 30 20 7d 2c 20 20 2f 2a 20 ce 8e 20 74 6f 20 59  0 },  /* .. to Y
b440: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 46 2c 20   */.  { 0x038F, 
b450: 20 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20   0x4f, 0x00 },  
b460: 2f 2a 20 ce 8f 20 74 6f 20 4f 20 2a 2f 0a 20 20  /* .. to O */.  
b470: 7b 20 30 78 30 33 39 30 2c 20 20 30 78 36 39 2c  { 0x0390,  0x69,
b480: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 90 20   0x00 },  /* .. 
b490: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to i */.  { 0x03
b4a0: 39 31 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20  91,  0x41, 0x00 
b4b0: 7d 2c 20 20 2f 2a 20 ce 91 20 74 6f 20 41 20 2a  },  /* .. to A *
b4c0: 2f 0a 20 20 7b 20 30 78 30 33 39 32 2c 20 20 30  /.  { 0x0392,  0
b4d0: 78 34 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x42, 0x00 },  /*
b4e0: 20 ce 92 20 74 6f 20 42 20 2a 2f 0a 20 20 7b 20   .. to B */.  { 
b4f0: 30 78 30 33 39 33 2c 20 20 30 78 34 37 2c 20 30  0x0393,  0x47, 0
b500: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 93 20 74 6f  x00 },  /* .. to
b510: 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 34   G */.  { 0x0394
b520: 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c  ,  0x44, 0x00 },
b530: 20 20 2f 2a 20 ce 94 20 74 6f 20 44 20 2a 2f 0a    /* .. to D */.
b540: 20 20 7b 20 30 78 30 33 39 35 2c 20 20 30 78 34    { 0x0395,  0x4
b550: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  5, 0x00 },  /* .
b560: 95 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
b570: 30 33 39 36 2c 20 20 30 78 35 61 2c 20 30 78 30  0396,  0x5a, 0x0
b580: 30 20 7d 2c 20 20 2f 2a 20 ce 96 20 74 6f 20 5a  0 },  /* .. to Z
b590: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 37 2c 20   */.  { 0x0397, 
b5a0: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
b5b0: 2f 2a 20 ce 97 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
b5c0: 7b 20 30 78 30 33 39 38 2c 20 20 30 78 35 34 2c  { 0x0398,  0x54,
b5d0: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 ce 98 20   0x68 },  /* .. 
b5e0: 74 6f 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Th */.  { 0x0
b5f0: 33 39 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30  399,  0x49, 0x00
b600: 20 7d 2c 20 20 2f 2a 20 ce 99 20 74 6f 20 49 20   },  /* .. to I 
b610: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 41 2c 20 20  */.  { 0x039A,  
b620: 30 78 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4b, 0x00 },  /
b630: 2a 20 ce 9a 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b  * .. to K */.  {
b640: 20 30 78 30 33 39 42 2c 20 20 30 78 34 63 2c 20   0x039B,  0x4c, 
b650: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9b 20 74  0x00 },  /* .. t
b660: 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39  o L */.  { 0x039
b670: 43 2c 20 20 30 78 34 64 2c 20 30 78 30 30 20 7d  C,  0x4d, 0x00 }
b680: 2c 20 20 2f 2a 20 ce 9c 20 74 6f 20 4d 20 2a 2f  ,  /* .. to M */
b690: 0a 20 20 7b 20 30 78 30 33 39 44 2c 20 20 30 78  .  { 0x039D,  0x
b6a0: 34 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4e, 0x00 },  /* 
b6b0: ce 9d 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30  .. to N */.  { 0
b6c0: 78 30 33 39 45 2c 20 20 30 78 35 38 2c 20 30 78  x039E,  0x58, 0x
b6d0: 30 30 20 7d 2c 20 20 2f 2a 20 ce 9e 20 74 6f 20  00 },  /* .. to 
b6e0: 58 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 46 2c  X */.  { 0x039F,
b6f0: 20 20 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20    0x4f, 0x00 }, 
b700: 20 2f 2a 20 ce 9f 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
b710: 20 7b 20 30 78 30 33 41 30 2c 20 20 30 78 35 30   { 0x03A0,  0x50
b720: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a0  , 0x00 },  /* ..
b730: 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 30   to P */.  { 0x0
b740: 33 41 31 2c 20 20 30 78 35 32 2c 20 30 78 30 30  3A1,  0x52, 0x00
b750: 20 7d 2c 20 20 2f 2a 20 ce a1 20 74 6f 20 52 20   },  /* .. to R 
b760: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 33 2c 20 20  */.  { 0x03A3,  
b770: 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x53, 0x00 },  /
b780: 2a 20 ce a3 20 74 6f 20 53 20 2a 2f 0a 20 20 7b  * .. to S */.  {
b790: 20 30 78 30 33 41 34 2c 20 20 30 78 35 34 2c 20   0x03A4,  0x54, 
b7a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a4 20 74  0x00 },  /* .. t
b7b0: 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o T */.  { 0x03A
b7c0: 35 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d  5,  0x59, 0x00 }
b7d0: 2c 20 20 2f 2a 20 ce a5 20 74 6f 20 59 20 2a 2f  ,  /* .. to Y */
b7e0: 0a 20 20 7b 20 30 78 30 33 41 36 2c 20 20 30 78  .  { 0x03A6,  0x
b7f0: 34 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  46, 0x00 },  /* 
b800: ce a6 20 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30  .. to F */.  { 0
b810: 78 30 33 41 37 2c 20 20 30 78 34 33 2c 20 30 78  x03A7,  0x43, 0x
b820: 36 38 20 7d 2c 20 20 2f 2a 20 ce a7 20 74 6f 20  68 },  /* .. to 
b830: 43 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 38  Ch */.  { 0x03A8
b840: 2c 20 20 30 78 35 30 2c 20 30 78 37 33 20 7d 2c  ,  0x50, 0x73 },
b850: 20 20 2f 2a 20 ce a8 20 74 6f 20 50 73 20 2a 2f    /* .. to Ps */
b860: 0a 20 20 7b 20 30 78 30 33 41 39 2c 20 20 30 78  .  { 0x03A9,  0x
b870: 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4f, 0x00 },  /* 
b880: ce a9 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30  .. to O */.  { 0
b890: 78 30 33 41 41 2c 20 20 30 78 34 39 2c 20 30 78  x03AA,  0x49, 0x
b8a0: 30 30 20 7d 2c 20 20 2f 2a 20 ce aa 20 74 6f 20  00 },  /* .. to 
b8b0: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 42 2c  I */.  { 0x03AB,
b8c0: 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20    0x59, 0x00 }, 
b8d0: 20 2f 2a 20 ce ab 20 74 6f 20 59 20 2a 2f 0a 20   /* .. to Y */. 
b8e0: 20 7b 20 30 78 30 33 41 43 2c 20 20 30 78 36 31   { 0x03AC,  0x61
b8f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ac  , 0x00 },  /* ..
b900: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
b910: 33 41 44 2c 20 20 30 78 36 35 2c 20 30 78 30 30  3AD,  0x65, 0x00
b920: 20 7d 2c 20 20 2f 2a 20 ce ad 20 74 6f 20 65 20   },  /* .. to e 
b930: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 45 2c 20 20  */.  { 0x03AE,  
b940: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
b950: 2a 20 ce ae 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
b960: 20 30 78 30 33 41 46 2c 20 20 30 78 36 39 2c 20   0x03AF,  0x69, 
b970: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce af 20 74  0x00 },  /* .. t
b980: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o i */.  { 0x03B
b990: 31 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d  1,  0x61, 0x00 }
b9a0: 2c 20 20 2f 2a 20 ce b1 20 74 6f 20 61 20 2a 2f  ,  /* .. to a */
b9b0: 0a 20 20 7b 20 30 78 30 33 42 32 2c 20 20 30 78  .  { 0x03B2,  0x
b9c0: 36 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  62, 0x00 },  /* 
b9d0: ce b2 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30  .. to b */.  { 0
b9e0: 78 30 33 42 33 2c 20 20 30 78 36 37 2c 20 30 78  x03B3,  0x67, 0x
b9f0: 30 30 20 7d 2c 20 20 2f 2a 20 ce b3 20 74 6f 20  00 },  /* .. to 
ba00: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 34 2c  g */.  { 0x03B4,
ba10: 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20    0x64, 0x00 }, 
ba20: 20 2f 2a 20 ce b4 20 74 6f 20 64 20 2a 2f 0a 20   /* .. to d */. 
ba30: 20 7b 20 30 78 30 33 42 35 2c 20 20 30 78 36 35   { 0x03B5,  0x65
ba40: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b5  , 0x00 },  /* ..
ba50: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
ba60: 33 42 36 2c 20 20 30 78 37 61 2c 20 30 78 30 30  3B6,  0x7a, 0x00
ba70: 20 7d 2c 20 20 2f 2a 20 ce b6 20 74 6f 20 7a 20   },  /* .. to z 
ba80: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 37 2c 20 20  */.  { 0x03B7,  
ba90: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
baa0: 2a 20 ce b7 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
bab0: 20 30 78 30 33 42 38 2c 20 20 30 78 37 34 2c 20   0x03B8,  0x74, 
bac0: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 ce b8 20 74  0x68 },  /* .. t
bad0: 6f 20 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33  o th */.  { 0x03
bae0: 42 39 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  B9,  0x69, 0x00 
baf0: 7d 2c 20 20 2f 2a 20 ce b9 20 74 6f 20 69 20 2a  },  /* .. to i *
bb00: 2f 0a 20 20 7b 20 30 78 30 33 42 41 2c 20 20 30  /.  { 0x03BA,  0
bb10: 78 36 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6b, 0x00 },  /*
bb20: 20 ce ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20   .. to k */.  { 
bb30: 30 78 30 33 42 42 2c 20 20 30 78 36 63 2c 20 30  0x03BB,  0x6c, 0
bb40: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bb 20 74 6f  x00 },  /* .. to
bb50: 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 43   l */.  { 0x03BC
bb60: 2c 20 20 30 78 36 64 2c 20 30 78 30 30 20 7d 2c  ,  0x6d, 0x00 },
bb70: 20 20 2f 2a 20 ce bc 20 74 6f 20 6d 20 2a 2f 0a    /* .. to m */.
bb80: 20 20 7b 20 30 78 30 33 42 44 2c 20 20 30 78 36    { 0x03BD,  0x6
bb90: 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  e, 0x00 },  /* .
bba0: bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78  . to n */.  { 0x
bbb0: 30 33 42 45 2c 20 20 30 78 37 38 2c 20 30 78 30  03BE,  0x78, 0x0
bbc0: 30 20 7d 2c 20 20 2f 2a 20 ce be 20 74 6f 20 78  0 },  /* .. to x
bbd0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 46 2c 20   */.  { 0x03BF, 
bbe0: 20 30 78 36 66 2c 20 30 78 30 30 20 7d 2c 20 20   0x6f, 0x00 },  
bbf0: 2f 2a 20 ce bf 20 74 6f 20 6f 20 2a 2f 0a 20 20  /* .. to o */.  
bc00: 7b 20 30 78 30 33 43 30 2c 20 20 30 78 37 30 2c  { 0x03C0,  0x70,
bc10: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 80 20   0x00 },  /* .. 
bc20: 74 6f 20 70 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to p */.  { 0x03
bc30: 43 31 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20  C1,  0x72, 0x00 
bc40: 7d 2c 20 20 2f 2a 20 cf 81 20 74 6f 20 72 20 2a  },  /* .. to r *
bc50: 2f 0a 20 20 7b 20 30 78 30 33 43 33 2c 20 20 30  /.  { 0x03C3,  0
bc60: 78 37 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x73, 0x00 },  /*
bc70: 20 cf 83 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20   .. to s */.  { 
bc80: 30 78 30 33 43 34 2c 20 20 30 78 37 34 2c 20 30  0x03C4,  0x74, 0
bc90: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 84 20 74 6f  x00 },  /* .. to
bca0: 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 35   t */.  { 0x03C5
bcb0: 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c  ,  0x79, 0x00 },
bcc0: 20 20 2f 2a 20 cf 85 20 74 6f 20 79 20 2a 2f 0a    /* .. to y */.
bcd0: 20 20 7b 20 30 78 30 33 43 36 2c 20 20 30 78 36    { 0x03C6,  0x6
bce0: 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  6, 0x00 },  /* .
bcf0: 86 20 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78  . to f */.  { 0x
bd00: 30 33 43 37 2c 20 20 30 78 36 33 2c 20 30 78 36  03C7,  0x63, 0x6
bd10: 38 20 7d 2c 20 20 2f 2a 20 cf 87 20 74 6f 20 63  8 },  /* .. to c
bd20: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 38 2c  h */.  { 0x03C8,
bd30: 20 20 30 78 37 30 2c 20 30 78 37 33 20 7d 2c 20    0x70, 0x73 }, 
bd40: 20 2f 2a 20 cf 88 20 74 6f 20 70 73 20 2a 2f 0a   /* .. to ps */.
bd50: 20 20 7b 20 30 78 30 33 43 39 2c 20 20 30 78 36    { 0x03C9,  0x6
bd60: 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  f, 0x00 },  /* .
bd70: 89 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
bd80: 30 33 43 41 2c 20 20 30 78 36 39 2c 20 30 78 30  03CA,  0x69, 0x0
bd90: 30 20 7d 2c 20 20 2f 2a 20 cf 8a 20 74 6f 20 69  0 },  /* .. to i
bda0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 42 2c 20   */.  { 0x03CB, 
bdb0: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
bdc0: 2f 2a 20 cf 8b 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
bdd0: 7b 20 30 78 30 33 43 43 2c 20 20 30 78 36 66 2c  { 0x03CC,  0x6f,
bde0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8c 20   0x00 },  /* .. 
bdf0: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to o */.  { 0x03
be00: 43 44 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20  CD,  0x79, 0x00 
be10: 7d 2c 20 20 2f 2a 20 cf 8d 20 74 6f 20 79 20 2a  },  /* .. to y *
be20: 2f 0a 20 20 7b 20 30 78 30 33 43 45 2c 20 20 30  /.  { 0x03CE,  0
be30: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
be40: 20 cf 8e 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
be50: 30 78 30 34 30 30 2c 20 20 30 78 34 35 2c 20 30  0x0400,  0x45, 0
be60: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 80 20 74 6f  x00 },  /* .. to
be70: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 31   E */.  { 0x0401
be80: 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c  ,  0x45, 0x00 },
be90: 20 20 2f 2a 20 d0 81 20 74 6f 20 45 20 2a 2f 0a    /* .. to E */.
bea0: 20 20 7b 20 30 78 30 34 30 32 2c 20 20 30 78 34    { 0x0402,  0x4
beb0: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  4, 0x00 },  /* .
bec0: 82 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78  . to D */.  { 0x
bed0: 30 34 30 33 2c 20 20 30 78 34 37 2c 20 30 78 30  0403,  0x47, 0x0
bee0: 30 20 7d 2c 20 20 2f 2a 20 d0 83 20 74 6f 20 47  0 },  /* .. to G
bef0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 34 2c 20   */.  { 0x0404, 
bf00: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
bf10: 2f 2a 20 d0 84 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
bf20: 7b 20 30 78 30 34 30 35 2c 20 20 30 78 35 61 2c  { 0x0405,  0x5a,
bf30: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 85 20   0x00 },  /* .. 
bf40: 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to Z */.  { 0x04
bf50: 30 36 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  06,  0x49, 0x00 
bf60: 7d 2c 20 20 2f 2a 20 d0 86 20 74 6f 20 49 20 2a  },  /* .. to I *
bf70: 2f 0a 20 20 7b 20 30 78 30 34 30 37 2c 20 20 30  /.  { 0x0407,  0
bf80: 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x49, 0x00 },  /*
bf90: 20 d0 87 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20   .. to I */.  { 
bfa0: 30 78 30 34 30 38 2c 20 20 30 78 34 61 2c 20 30  0x0408,  0x4a, 0
bfb0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 88 20 74 6f  x00 },  /* .. to
bfc0: 20 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 39   J */.  { 0x0409
bfd0: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
bfe0: 20 20 2f 2a 20 d0 89 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
bff0: 20 20 7b 20 30 78 30 34 30 41 2c 20 20 30 78 34    { 0x040A,  0x4
c000: 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  e, 0x00 },  /* .
c010: 8a 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78  . to N */.  { 0x
c020: 30 34 30 42 2c 20 20 30 78 34 34 2c 20 30 78 30  040B,  0x44, 0x0
c030: 30 20 7d 2c 20 20 2f 2a 20 d0 8b 20 74 6f 20 44  0 },  /* .. to D
c040: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 43 2c 20   */.  { 0x040C, 
c050: 20 30 78 34 62 2c 20 30 78 30 30 20 7d 2c 20 20   0x4b, 0x00 },  
c060: 2f 2a 20 d0 8c 20 74 6f 20 4b 20 2a 2f 0a 20 20  /* .. to K */.  
c070: 7b 20 30 78 30 34 30 44 2c 20 20 30 78 34 39 2c  { 0x040D,  0x49,
c080: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8d 20   0x00 },  /* .. 
c090: 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to I */.  { 0x04
c0a0: 30 45 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  0E,  0x55, 0x00 
c0b0: 7d 2c 20 20 2f 2a 20 d0 8e 20 74 6f 20 55 20 2a  },  /* .. to U *
c0c0: 2f 0a 20 20 7b 20 30 78 30 34 30 46 2c 20 20 30  /.  { 0x040F,  0
c0d0: 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x44, 0x00 },  /*
c0e0: 20 d0 8f 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20   .. to D */.  { 
c0f0: 30 78 30 34 31 30 2c 20 20 30 78 34 31 2c 20 30  0x0410,  0x41, 0
c100: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 90 20 74 6f  x00 },  /* .. to
c110: 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 31   A */.  { 0x0411
c120: 2c 20 20 30 78 34 32 2c 20 30 78 30 30 20 7d 2c  ,  0x42, 0x00 },
c130: 20 20 2f 2a 20 d0 91 20 74 6f 20 42 20 2a 2f 0a    /* .. to B */.
c140: 20 20 7b 20 30 78 30 34 31 32 2c 20 20 30 78 35    { 0x0412,  0x5
c150: 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  6, 0x00 },  /* .
c160: 92 20 74 6f 20 56 20 2a 2f 0a 20 20 7b 20 30 78  . to V */.  { 0x
c170: 30 34 31 33 2c 20 20 30 78 34 37 2c 20 30 78 30  0413,  0x47, 0x0
c180: 30 20 7d 2c 20 20 2f 2a 20 d0 93 20 74 6f 20 47  0 },  /* .. to G
c190: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 34 2c 20   */.  { 0x0414, 
c1a0: 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x44, 0x00 },  
c1b0: 2f 2a 20 d0 94 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
c1c0: 7b 20 30 78 30 34 31 35 2c 20 20 30 78 34 35 2c  { 0x0415,  0x45,
c1d0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 95 20   0x00 },  /* .. 
c1e0: 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to E */.  { 0x04
c1f0: 31 36 2c 20 20 30 78 35 61 2c 20 30 78 36 38 20  16,  0x5a, 0x68 
c200: 7d 2c 20 20 2f 2a 20 d0 96 20 74 6f 20 5a 68 20  },  /* .. to Zh 
c210: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 37 2c 20 20  */.  { 0x0417,  
c220: 30 78 35 61 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x5a, 0x00 },  /
c230: 2a 20 d0 97 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b  * .. to Z */.  {
c240: 20 30 78 30 34 31 38 2c 20 20 30 78 34 39 2c 20   0x0418,  0x49, 
c250: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 98 20 74  0x00 },  /* .. t
c260: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o I */.  { 0x041
c270: 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  9,  0x49, 0x00 }
c280: 2c 20 20 2f 2a 20 d0 99 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
c290: 0a 20 20 7b 20 30 78 30 34 31 41 2c 20 20 30 78  .  { 0x041A,  0x
c2a0: 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4b, 0x00 },  /* 
c2b0: d0 9a 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30  .. to K */.  { 0
c2c0: 78 30 34 31 42 2c 20 20 30 78 34 63 2c 20 30 78  x041B,  0x4c, 0x
c2d0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 9b 20 74 6f 20  00 },  /* .. to 
c2e0: 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 43 2c  L */.  { 0x041C,
c2f0: 20 20 30 78 34 64 2c 20 30 78 30 30 20 7d 2c 20    0x4d, 0x00 }, 
c300: 20 2f 2a 20 d0 9c 20 74 6f 20 4d 20 2a 2f 0a 20   /* .. to M */. 
c310: 20 7b 20 30 78 30 34 31 44 2c 20 20 30 78 34 65   { 0x041D,  0x4e
c320: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9d  , 0x00 },  /* ..
c330: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
c340: 34 31 45 2c 20 20 30 78 34 66 2c 20 30 78 30 30  41E,  0x4f, 0x00
c350: 20 7d 2c 20 20 2f 2a 20 d0 9e 20 74 6f 20 4f 20   },  /* .. to O 
c360: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 46 2c 20 20  */.  { 0x041F,  
c370: 30 78 35 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x50, 0x00 },  /
c380: 2a 20 d0 9f 20 74 6f 20 50 20 2a 2f 0a 20 20 7b  * .. to P */.  {
c390: 20 30 78 30 34 32 30 2c 20 20 30 78 35 32 2c 20   0x0420,  0x52, 
c3a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a0 20 74  0x00 },  /* .. t
c3b0: 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32  o R */.  { 0x042
c3c0: 31 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d  1,  0x53, 0x00 }
c3d0: 2c 20 20 2f 2a 20 d0 a1 20 74 6f 20 53 20 2a 2f  ,  /* .. to S */
c3e0: 0a 20 20 7b 20 30 78 30 34 32 32 2c 20 20 30 78  .  { 0x0422,  0x
c3f0: 35 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  54, 0x00 },  /* 
c400: d0 a2 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30  .. to T */.  { 0
c410: 78 30 34 32 33 2c 20 20 30 78 35 35 2c 20 30 78  x0423,  0x55, 0x
c420: 30 30 20 7d 2c 20 20 2f 2a 20 d0 a3 20 74 6f 20  00 },  /* .. to 
c430: 55 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 34 2c  U */.  { 0x0424,
c440: 20 20 30 78 34 36 2c 20 30 78 30 30 20 7d 2c 20    0x46, 0x00 }, 
c450: 20 2f 2a 20 d0 a4 20 74 6f 20 46 20 2a 2f 0a 20   /* .. to F */. 
c460: 20 7b 20 30 78 30 34 32 35 2c 20 20 30 78 34 62   { 0x0425,  0x4b
c470: 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a5  , 0x68 },  /* ..
c480: 20 74 6f 20 4b 68 20 2a 2f 0a 20 20 7b 20 30 78   to Kh */.  { 0x
c490: 30 34 32 36 2c 20 20 30 78 35 34 2c 20 30 78 36  0426,  0x54, 0x6
c4a0: 33 20 7d 2c 20 20 2f 2a 20 d0 a6 20 74 6f 20 54  3 },  /* .. to T
c4b0: 63 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 37 2c  c */.  { 0x0427,
c4c0: 20 20 30 78 34 33 2c 20 30 78 36 38 20 7d 2c 20    0x43, 0x68 }, 
c4d0: 20 2f 2a 20 d0 a7 20 74 6f 20 43 68 20 2a 2f 0a   /* .. to Ch */.
c4e0: 20 20 7b 20 30 78 30 34 32 38 2c 20 20 30 78 35    { 0x0428,  0x5
c4f0: 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0  3, 0x68 },  /* .
c500: a8 20 74 6f 20 53 68 20 2a 2f 0a 20 20 7b 20 30  . to Sh */.  { 0
c510: 78 30 34 32 39 2c 20 20 30 78 35 33 2c 20 30 78  x0429,  0x53, 0x
c520: 36 38 20 7d 2c 20 20 2f 2a 20 d0 a9 20 74 6f 20  68 },  /* .. to 
c530: 53 68 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34  Shch */.  { 0x04
c540: 32 41 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20  2A,  0x61, 0x00 
c550: 7d 2c 20 20 2f 2a 20 20 74 6f 20 41 20 2a 2f 0a  },  /*  to A */.
c560: 20 20 7b 20 30 78 30 34 32 42 2c 20 20 30 78 35    { 0x042B,  0x5
c570: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  9, 0x00 },  /* .
c580: ab 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78  . to Y */.  { 0x
c590: 30 34 32 43 2c 20 20 30 78 35 39 2c 20 30 78 30  042C,  0x59, 0x0
c5a0: 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 59 20 2a  0 },  /*  to Y *
c5b0: 2f 0a 20 20 7b 20 30 78 30 34 32 44 2c 20 20 30  /.  { 0x042D,  0
c5c0: 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x45, 0x00 },  /*
c5d0: 20 d0 ad 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
c5e0: 30 78 30 34 32 45 2c 20 20 30 78 34 39 2c 20 30  0x042E,  0x49, 0
c5f0: 78 37 35 20 7d 2c 20 20 2f 2a 20 d0 ae 20 74 6f  x75 },  /* .. to
c600: 20 49 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32   Iu */.  { 0x042
c610: 46 2c 20 20 30 78 34 39 2c 20 30 78 36 31 20 7d  F,  0x49, 0x61 }
c620: 2c 20 20 2f 2a 20 d0 af 20 74 6f 20 49 61 20 2a  ,  /* .. to Ia *
c630: 2f 0a 20 20 7b 20 30 78 30 34 33 30 2c 20 20 30  /.  { 0x0430,  0
c640: 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x61, 0x00 },  /*
c650: 20 d0 b0 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20   .. to a */.  { 
c660: 30 78 30 34 33 31 2c 20 20 30 78 36 32 2c 20 30  0x0431,  0x62, 0
c670: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b1 20 74 6f  x00 },  /* .. to
c680: 20 62 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 32   b */.  { 0x0432
c690: 2c 20 20 30 78 37 36 2c 20 30 78 30 30 20 7d 2c  ,  0x76, 0x00 },
c6a0: 20 20 2f 2a 20 d0 b2 20 74 6f 20 76 20 2a 2f 0a    /* .. to v */.
c6b0: 20 20 7b 20 30 78 30 34 33 33 2c 20 20 30 78 36    { 0x0433,  0x6
c6c0: 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  7, 0x00 },  /* .
c6d0: b3 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78  . to g */.  { 0x
c6e0: 30 34 33 34 2c 20 20 30 78 36 34 2c 20 30 78 30  0434,  0x64, 0x0
c6f0: 30 20 7d 2c 20 20 2f 2a 20 d0 b4 20 74 6f 20 64  0 },  /* .. to d
c700: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 35 2c 20   */.  { 0x0435, 
c710: 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x65, 0x00 },  
c720: 2f 2a 20 d0 b5 20 74 6f 20 65 20 2a 2f 0a 20 20  /* .. to e */.  
c730: 7b 20 30 78 30 34 33 36 2c 20 20 30 78 37 61 2c  { 0x0436,  0x7a,
c740: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 b6 20   0x68 },  /* .. 
c750: 74 6f 20 7a 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to zh */.  { 0x0
c760: 34 33 37 2c 20 20 30 78 37 61 2c 20 30 78 30 30  437,  0x7a, 0x00
c770: 20 7d 2c 20 20 2f 2a 20 d0 b7 20 74 6f 20 7a 20   },  /* .. to z 
c780: 2a 2f 0a 20 20 7b 20 30 78 30 34 33 38 2c 20 20  */.  { 0x0438,  
c790: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
c7a0: 2a 20 d0 b8 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
c7b0: 20 30 78 30 34 33 39 2c 20 20 30 78 36 39 2c 20   0x0439,  0x69, 
c7c0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b9 20 74  0x00 },  /* .. t
c7d0: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33  o i */.  { 0x043
c7e0: 41 2c 20 20 30 78 36 62 2c 20 30 78 30 30 20 7d  A,  0x6b, 0x00 }
c7f0: 2c 20 20 2f 2a 20 d0 ba 20 74 6f 20 6b 20 2a 2f  ,  /* .. to k */
c800: 0a 20 20 7b 20 30 78 30 34 33 42 2c 20 20 30 78  .  { 0x043B,  0x
c810: 36 63 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6c, 0x00 },  /* 
c820: d0 bb 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30  .. to l */.  { 0
c830: 78 30 34 33 43 2c 20 20 30 78 36 64 2c 20 30 78  x043C,  0x6d, 0x
c840: 30 30 20 7d 2c 20 20 2f 2a 20 d0 bc 20 74 6f 20  00 },  /* .. to 
c850: 6d 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 44 2c  m */.  { 0x043D,
c860: 20 20 30 78 36 65 2c 20 30 78 30 30 20 7d 2c 20    0x6e, 0x00 }, 
c870: 20 2f 2a 20 d0 bd 20 74 6f 20 6e 20 2a 2f 0a 20   /* .. to n */. 
c880: 20 7b 20 30 78 30 34 33 45 2c 20 20 30 78 36 66   { 0x043E,  0x6f
c890: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 be  , 0x00 },  /* ..
c8a0: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
c8b0: 34 33 46 2c 20 20 30 78 37 30 2c 20 30 78 30 30  43F,  0x70, 0x00
c8c0: 20 7d 2c 20 20 2f 2a 20 d0 bf 20 74 6f 20 70 20   },  /* .. to p 
c8d0: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 30 2c 20 20  */.  { 0x0440,  
c8e0: 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x72, 0x00 },  /
c8f0: 2a 20 d1 80 20 74 6f 20 72 20 2a 2f 0a 20 20 7b  * .. to r */.  {
c900: 20 30 78 30 34 34 31 2c 20 20 30 78 37 33 2c 20   0x0441,  0x73, 
c910: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 81 20 74  0x00 },  /* .. t
c920: 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34  o s */.  { 0x044
c930: 32 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d  2,  0x74, 0x00 }
c940: 2c 20 20 2f 2a 20 d1 82 20 74 6f 20 74 20 2a 2f  ,  /* .. to t */
c950: 0a 20 20 7b 20 30 78 30 34 34 33 2c 20 20 30 78  .  { 0x0443,  0x
c960: 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  75, 0x00 },  /* 
c970: d1 83 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30  .. to u */.  { 0
c980: 78 30 34 34 34 2c 20 20 30 78 36 36 2c 20 30 78  x0444,  0x66, 0x
c990: 30 30 20 7d 2c 20 20 2f 2a 20 d1 84 20 74 6f 20  00 },  /* .. to 
c9a0: 66 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 35 2c  f */.  { 0x0445,
c9b0: 20 20 30 78 36 62 2c 20 30 78 36 38 20 7d 2c 20    0x6b, 0x68 }, 
c9c0: 20 2f 2a 20 d1 85 20 74 6f 20 6b 68 20 2a 2f 0a   /* .. to kh */.
c9d0: 20 20 7b 20 30 78 30 34 34 36 2c 20 20 30 78 37    { 0x0446,  0x7
c9e0: 34 2c 20 30 78 36 33 20 7d 2c 20 20 2f 2a 20 d1  4, 0x63 },  /* .
c9f0: 86 20 74 6f 20 74 63 20 2a 2f 0a 20 20 7b 20 30  . to tc */.  { 0
ca00: 78 30 34 34 37 2c 20 20 30 78 36 33 2c 20 30 78  x0447,  0x63, 0x
ca10: 36 38 20 7d 2c 20 20 2f 2a 20 d1 87 20 74 6f 20  68 },  /* .. to 
ca20: 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 38  ch */.  { 0x0448
ca30: 2c 20 20 30 78 37 33 2c 20 30 78 36 38 20 7d 2c  ,  0x73, 0x68 },
ca40: 20 20 2f 2a 20 d1 88 20 74 6f 20 73 68 20 2a 2f    /* .. to sh */
ca50: 0a 20 20 7b 20 30 78 30 34 34 39 2c 20 20 30 78  .  { 0x0449,  0x
ca60: 37 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  73, 0x68 },  /* 
ca70: d1 89 20 74 6f 20 73 68 63 68 20 2a 2f 0a 20 20  .. to shch */.  
ca80: 7b 20 30 78 30 34 34 41 2c 20 20 30 78 36 31 2c  { 0x044A,  0x61,
ca90: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f   0x00 },  /*  to
caa0: 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 42   a */.  { 0x044B
cab0: 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c  ,  0x79, 0x00 },
cac0: 20 20 2f 2a 20 d1 8b 20 74 6f 20 79 20 2a 2f 0a    /* .. to y */.
cad0: 20 20 7b 20 30 78 30 34 34 43 2c 20 20 30 78 37    { 0x044C,  0x7
cae0: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20  9, 0x00 },  /*  
caf0: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to y */.  { 0x04
cb00: 34 44 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20  4D,  0x65, 0x00 
cb10: 7d 2c 20 20 2f 2a 20 d1 8d 20 74 6f 20 65 20 2a  },  /* .. to e *
cb20: 2f 0a 20 20 7b 20 30 78 30 34 34 45 2c 20 20 30  /.  { 0x044E,  0
cb30: 78 36 39 2c 20 30 78 37 35 20 7d 2c 20 20 2f 2a  x69, 0x75 },  /*
cb40: 20 d1 8e 20 74 6f 20 69 75 20 2a 2f 0a 20 20 7b   .. to iu */.  {
cb50: 20 30 78 30 34 34 46 2c 20 20 30 78 36 39 2c 20   0x044F,  0x69, 
cb60: 30 78 36 31 20 7d 2c 20 20 2f 2a 20 d1 8f 20 74  0x61 },  /* .. t
cb70: 6f 20 69 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34  o ia */.  { 0x04
cb80: 35 30 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20  50,  0x65, 0x00 
cb90: 7d 2c 20 20 2f 2a 20 d1 90 20 74 6f 20 65 20 2a  },  /* .. to e *
cba0: 2f 0a 20 20 7b 20 30 78 30 34 35 31 2c 20 20 30  /.  { 0x0451,  0
cbb0: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
cbc0: 20 d1 91 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
cbd0: 30 78 30 34 35 32 2c 20 20 30 78 36 34 2c 20 30  0x0452,  0x64, 0
cbe0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 92 20 74 6f  x00 },  /* .. to
cbf0: 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 33   d */.  { 0x0453
cc00: 2c 20 20 30 78 36 37 2c 20 30 78 30 30 20 7d 2c  ,  0x67, 0x00 },
cc10: 20 20 2f 2a 20 d1 93 20 74 6f 20 67 20 2a 2f 0a    /* .. to g */.
cc20: 20 20 7b 20 30 78 30 34 35 34 2c 20 20 30 78 36    { 0x0454,  0x6
cc30: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  5, 0x00 },  /* .
cc40: 94 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
cc50: 30 34 35 35 2c 20 20 30 78 37 61 2c 20 30 78 30  0455,  0x7a, 0x0
cc60: 30 20 7d 2c 20 20 2f 2a 20 d1 95 20 74 6f 20 7a  0 },  /* .. to z
cc70: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 36 2c 20   */.  { 0x0456, 
cc80: 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x69, 0x00 },  
cc90: 2f 2a 20 d1 96 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
cca0: 7b 20 30 78 30 34 35 37 2c 20 20 30 78 36 39 2c  { 0x0457,  0x69,
ccb0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 97 20   0x00 },  /* .. 
ccc0: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to i */.  { 0x04
ccd0: 35 38 2c 20 20 30 78 36 61 2c 20 30 78 30 30 20  58,  0x6a, 0x00 
cce0: 7d 2c 20 20 2f 2a 20 d1 98 20 74 6f 20 6a 20 2a  },  /* .. to j *
ccf0: 2f 0a 20 20 7b 20 30 78 30 34 35 39 2c 20 20 30  /.  { 0x0459,  0
cd00: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
cd10: 20 d1 99 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
cd20: 30 78 30 34 35 41 2c 20 20 30 78 36 65 2c 20 30  0x045A,  0x6e, 0
cd30: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9a 20 74 6f  x00 },  /* .. to
cd40: 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 42   n */.  { 0x045B
cd50: 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c  ,  0x64, 0x00 },
cd60: 20 20 2f 2a 20 d1 9b 20 74 6f 20 64 20 2a 2f 0a    /* .. to d */.
cd70: 20 20 7b 20 30 78 30 34 35 43 2c 20 20 30 78 36    { 0x045C,  0x6
cd80: 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  b, 0x00 },  /* .
cd90: 9c 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78  . to k */.  { 0x
cda0: 30 34 35 44 2c 20 20 30 78 36 39 2c 20 30 78 30  045D,  0x69, 0x0
cdb0: 30 20 7d 2c 20 20 2f 2a 20 d1 9d 20 74 6f 20 69  0 },  /* .. to i
cdc0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 45 2c 20   */.  { 0x045E, 
cdd0: 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x75, 0x00 },  
cde0: 2f 2a 20 d1 9e 20 74 6f 20 75 20 2a 2f 0a 20 20  /* .. to u */.  
cdf0: 7b 20 30 78 30 34 35 46 2c 20 20 30 78 36 34 2c  { 0x045F,  0x64,
ce00: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9f 20   0x00 },  /* .. 
ce10: 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to d */.  { 0x1E
ce20: 30 32 2c 20 20 30 78 34 32 2c 20 30 78 30 30 20  02,  0x42, 0x00 
ce30: 7d 2c 20 20 2f 2a 20 e1 b8 82 20 74 6f 20 42 20  },  /* ... to B 
ce40: 2a 2f 0a 20 20 7b 20 30 78 31 45 30 33 2c 20 20  */.  { 0x1E03,  
ce50: 30 78 36 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x62, 0x00 },  /
ce60: 2a 20 e1 b8 83 20 74 6f 20 62 20 2a 2f 0a 20 20  * ... to b */.  
ce70: 7b 20 30 78 31 45 30 41 2c 20 20 30 78 34 34 2c  { 0x1E0A,  0x44,
ce80: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 8a   0x00 },  /* ...
ce90: 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 31   to D */.  { 0x1
cea0: 45 30 42 2c 20 20 30 78 36 34 2c 20 30 78 30 30  E0B,  0x64, 0x00
ceb0: 20 7d 2c 20 20 2f 2a 20 e1 b8 8b 20 74 6f 20 64   },  /* ... to d
cec0: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 31 45 2c 20   */.  { 0x1E1E, 
ced0: 20 30 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20   0x46, 0x00 },  
cee0: 2f 2a 20 e1 b8 9e 20 74 6f 20 46 20 2a 2f 0a 20  /* ... to F */. 
cef0: 20 7b 20 30 78 31 45 31 46 2c 20 20 30 78 36 36   { 0x1E1F,  0x66
cf00: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8  , 0x00 },  /* ..
cf10: 9f 20 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78  . to f */.  { 0x
cf20: 31 45 34 30 2c 20 20 30 78 34 44 2c 20 30 78 30  1E40,  0x4D, 0x0
cf30: 30 20 7d 2c 20 20 2f 2a 20 e1 b9 80 20 74 6f 20  0 },  /* ... to 
cf40: 4d 20 2a 2f 0a 20 20 7b 20 30 78 31 45 34 31 2c  M */.  { 0x1E41,
cf50: 20 20 30 78 36 44 2c 20 30 78 30 30 20 7d 2c 20    0x6D, 0x00 }, 
cf60: 20 2f 2a 20 e1 b9 81 20 74 6f 20 6d 20 2a 2f 0a   /* ... to m */.
cf70: 20 20 7b 20 30 78 31 45 35 36 2c 20 20 30 78 35    { 0x1E56,  0x5
cf80: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  0, 0x00 },  /* .
cf90: b9 96 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30  .. to P */.  { 0
cfa0: 78 31 45 35 37 2c 20 20 30 78 37 30 2c 20 30 78  x1E57,  0x70, 0x
cfb0: 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 97 20 74 6f  00 },  /* ... to
cfc0: 20 70 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 30   p */.  { 0x1E60
cfd0: 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c  ,  0x53, 0x00 },
cfe0: 20 20 2f 2a 20 e1 b9 a0 20 74 6f 20 53 20 2a 2f    /* ... to S */
cff0: 0a 20 20 7b 20 30 78 31 45 36 31 2c 20 20 30 78  .  { 0x1E61,  0x
d000: 37 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  73, 0x00 },  /* 
d010: e1 b9 a1 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20  ... to s */.  { 
d020: 30 78 31 45 36 41 2c 20 20 30 78 35 34 2c 20 30  0x1E6A,  0x54, 0
d030: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 aa 20 74  x00 },  /* ... t
d040: 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36  o T */.  { 0x1E6
d050: 42 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d  B,  0x74, 0x00 }
d060: 2c 20 20 2f 2a 20 e1 b9 ab 20 74 6f 20 74 20 2a  ,  /* ... to t *
d070: 2f 0a 20 20 7b 20 30 78 31 45 38 30 2c 20 20 30  /.  { 0x1E80,  0
d080: 78 35 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x57, 0x00 },  /*
d090: 20 e1 ba 80 20 74 6f 20 57 20 2a 2f 0a 20 20 7b   ... to W */.  {
d0a0: 20 30 78 31 45 38 31 2c 20 20 30 78 37 37 2c 20   0x1E81,  0x77, 
d0b0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 81 20  0x00 },  /* ... 
d0c0: 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to w */.  { 0x1E
d0d0: 38 32 2c 20 20 30 78 35 37 2c 20 30 78 30 30 20  82,  0x57, 0x00 
d0e0: 7d 2c 20 20 2f 2a 20 e1 ba 82 20 74 6f 20 57 20  },  /* ... to W 
d0f0: 2a 2f 0a 20 20 7b 20 30 78 31 45 38 33 2c 20 20  */.  { 0x1E83,  
d100: 30 78 37 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x77, 0x00 },  /
d110: 2a 20 e1 ba 83 20 74 6f 20 77 20 2a 2f 0a 20 20  * ... to w */.  
d120: 7b 20 30 78 31 45 38 34 2c 20 20 30 78 35 37 2c  { 0x1E84,  0x57,
d130: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 84   0x00 },  /* ...
d140: 20 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 31   to W */.  { 0x1
d150: 45 38 35 2c 20 20 30 78 37 37 2c 20 30 78 30 30  E85,  0x77, 0x00
d160: 20 7d 2c 20 20 2f 2a 20 e1 ba 85 20 74 6f 20 77   },  /* ... to w
d170: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 46 32 2c 20   */.  { 0x1EF2, 
d180: 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x59, 0x00 },  
d190: 2f 2a 20 e1 bb b2 20 74 6f 20 59 20 2a 2f 0a 20  /* ... to Y */. 
d1a0: 20 7b 20 30 78 31 45 46 33 2c 20 20 30 78 37 39   { 0x1EF3,  0x79
d1b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 bb  , 0x00 },  /* ..
d1c0: b3 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78  . to y */.  { 0x
d1d0: 46 42 30 30 2c 20 20 30 78 36 36 2c 20 30 78 36  FB00,  0x66, 0x6
d1e0: 36 20 7d 2c 20 20 2f 2a 20 ef ac 80 20 74 6f 20  6 },  /* ... to 
d1f0: 66 66 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 31  ff */.  { 0xFB01
d200: 2c 20 20 30 78 36 36 2c 20 30 78 36 39 20 7d 2c  ,  0x66, 0x69 },
d210: 20 20 2f 2a 20 ef ac 81 20 74 6f 20 66 69 20 2a    /* ... to fi *
d220: 2f 0a 20 20 7b 20 30 78 46 42 30 32 2c 20 20 30  /.  { 0xFB02,  0
d230: 78 36 36 2c 20 30 78 36 43 20 7d 2c 20 20 2f 2a  x66, 0x6C },  /*
d240: 20 ef ac 82 20 74 6f 20 66 6c 20 2a 2f 0a 20 20   ... to fl */.  
d250: 7b 20 30 78 46 42 30 35 2c 20 20 30 78 37 33 2c  { 0xFB05,  0x73,
d260: 20 30 78 37 34 20 7d 2c 20 20 2f 2a 20 ef ac 85   0x74 },  /* ...
d270: 20 74 6f 20 73 74 20 2a 2f 0a 20 20 7b 20 30 78   to st */.  { 0x
d280: 46 42 30 36 2c 20 20 30 78 37 33 2c 20 30 78 37  FB06,  0x73, 0x7
d290: 34 20 7d 2c 20 20 2f 2a 20 ef ac 86 20 74 6f 20  4 },  /* ... to 
d2a0: 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  st */.};../*.** 
d2b0: 43 6f 6e 76 65 72 74 20 74 68 65 20 69 6e 70 75  Convert the inpu
d2c0: 74 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 55 54  t string from UT
d2d0: 46 2d 38 20 69 6e 74 6f 20 70 75 72 65 20 41 53  F-8 into pure AS
d2e0: 43 49 49 20 62 79 20 63 6f 6e 76 65 72 74 69 6e  CII by convertin
d2f0: 67 0a 2a 2a 20 61 6c 6c 20 6e 6f 6e 2d 41 53 43  g.** all non-ASC
d300: 49 49 20 63 68 61 72 61 63 74 65 72 73 20 74 6f  II characters to
d310: 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 61 74 69 6f   some combinatio
d320: 6e 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  n of characters 
d330: 69 6e 20 74 68 65 0a 2a 2a 20 41 53 43 49 49 20  in the.** ASCII 
d340: 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  subset..**.** Th
d350: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
d360: 67 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  g might contain 
d370: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 20  more characters 
d380: 74 68 61 6e 20 74 68 65 20 69 6e 70 75 74 2e 0a  than the input..
d390: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
d3a0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
d3b0: 20 73 74 72 69 6e 67 20 63 6f 6d 65 73 20 66 72   string comes fr
d3c0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
d3d0: 63 28 29 20 61 6e 64 0a 2a 2a 20 73 68 6f 75 6c  c() and.** shoul
d3e0: 64 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  d be freed by th
d3f0: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
d400: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
d410: 72 20 2a 74 72 61 6e 73 6c 69 74 65 72 61 74 65  r *transliterate
d420: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
d430: 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e  char *zIn, int n
d440: 49 6e 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  In){.  unsigned 
d450: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
d460: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 49 6e  ite3_malloc( nIn
d470: 2a 34 20 2b 20 31 20 29 3b 0a 20 20 69 6e 74 20  *4 + 1 );.  int 
d480: 63 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69  c, sz, nOut;.  i
d490: 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74  f( zOut==0 ) ret
d4a0: 75 72 6e 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20  urn 0;.  nOut = 
d4b0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e  0;.  while( nIn>
d4c0: 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66  0 ){.    c = utf
d4d0: 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20  8Read(zIn, nIn, 
d4e0: 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d  &sz);.    zIn +=
d4f0: 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20   sz;.    nIn -= 
d500: 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c 3d 31  sz;.    if( c<=1
d510: 32 37 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74  27 ){.      zOut
d520: 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [nOut++] = c;.  
d530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
d540: 6e 74 20 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78  nt xTop, xBtm, x
d550: 3b 0a 20 20 20 20 20 20 78 54 6f 70 20 3d 20 73  ;.      xTop = s
d560: 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f  izeof(translit)/
d570: 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b  sizeof(translit[
d580: 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 78  0]) - 1;.      x
d590: 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  Btm = 0;.      w
d5a0: 68 69 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d  hile( xTop>=xBtm
d5b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20   ){.        x = 
d5c0: 28 78 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b  (xTop + xBtm)/2;
d5d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61  .        if( tra
d5e0: 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d  nslit[x].cFrom==
d5f0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  c ){.          z
d600: 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72  Out[nOut++] = tr
d610: 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 30 3b 0a  anslit[x].cTo0;.
d620: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74 72            if( tr
d630: 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 20 29  anslit[x].cTo1 )
d640: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f  {.            zO
d650: 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61  ut[nOut++] = tra
d660: 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 3b 0a 20  nslit[x].cTo1;. 
d670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
d680: 64 20 61 6e 20 65 78 74 72 61 20 22 63 68 22 20  d an extra "ch" 
d690: 61 66 74 65 72 20 74 68 65 20 22 73 68 22 20 66  after the "sh" f
d6a0: 6f 72 20 d0 a9 20 61 6e 64 20 d1 89 20 2a 2f 0a  or .. and .. */.
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
d6c0: 63 3d 3d 30 78 30 34 32 39 20 7c 7c 20 63 3d 3d  c==0x0429 || c==
d6d0: 20 30 78 30 34 34 39 20 29 7b 0a 20 20 20 20 20   0x0449 ){.     
d6e0: 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f           zOut[nO
d6f0: 75 74 2b 2b 5d 20 3d 20 27 63 27 3b 0a 20 20 20  ut++] = 'c';.   
d700: 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b             zOut[
d710: 6e 4f 75 74 2b 2b 5d 20 3d 20 27 68 27 3b 0a 20  nOut++] = 'h';. 
d720: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d740: 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
d750: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d760: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 72 61     }else if( tra
d770: 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3e 63  nslit[x].cFrom>c
d780: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 54   ){.          xT
d790: 6f 70 20 3d 20 78 2d 31 3b 0a 20 20 20 20 20 20  op = x-1;.      
d7a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d7b0: 20 20 20 78 42 74 6d 20 3d 20 78 2b 31 3b 0a 20     xBtm = x+1;. 
d7c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d7d0: 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20 7a  .      if( c ) z
d7e0: 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 27 3f  Out[nOut++] = '?
d7f0: 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ';.    }.  }.  z
d800: 4f 75 74 5b 6e 4f 75 74 5d 20 3d 20 30 3b 0a 20  Out[nOut] = 0;. 
d810: 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a   return zOut;.}.
d820: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
d830: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
d840: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 68  acters in the sh
d850: 6f 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66  ortest prefix of
d860: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74   the input.** st
d870: 72 69 6e 67 20 74 68 61 74 20 74 72 61 6e 73 6c  ring that transl
d880: 69 74 65 72 61 74 65 73 20 74 6f 20 61 6e 20 41  iterates to an A
d890: 53 43 49 49 20 73 74 72 69 6e 67 20 6e 54 72 61  SCII string nTra
d8a0: 6e 73 20 62 79 74 65 73 20 6f 72 20 6c 6f 6e 67  ns bytes or long
d8b0: 65 72 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  er..** Or, if th
d8c0: 65 20 74 72 61 6e 73 6c 69 74 65 72 61 74 69 6f  e transliteratio
d8d0: 6e 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73  n of the input s
d8e0: 74 72 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68  tring is less th
d8f0: 61 6e 20 6e 54 72 61 6e 73 0a 2a 2a 20 62 79 74  an nTrans.** byt
d900: 65 73 20 69 6e 20 73 69 7a 65 2c 20 72 65 74 75  es in size, retu
d910: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
d920: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
d930: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e  he input string.
d940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
d950: 72 61 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c  ranslen_to_charl
d960: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
d970: 49 6e 2c 20 69 6e 74 20 6e 49 6e 2c 20 69 6e 74  In, int nIn, int
d980: 20 6e 54 72 61 6e 73 29 7b 0a 20 20 69 6e 74 20   nTrans){.  int 
d990: 69 2c 20 63 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a  i, c, sz, nOut;.
d9a0: 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 0a 20 20    int nChar;..  
d9b0: 69 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20  i = nOut = 0;.  
d9c0: 66 6f 72 28 6e 43 68 61 72 3d 30 3b 20 69 3c 6e  for(nChar=0; i<n
d9d0: 49 6e 20 26 26 20 6e 4f 75 74 3c 6e 54 72 61 6e  In && nOut<nTran
d9e0: 73 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20  s; nChar++){.   
d9f0: 20 63 20 3d 20 75 74 66 38 52 65 61 64 28 28 63   c = utf8Read((c
da00: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
da10: 61 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49  ar *)&zIn[i], nI
da20: 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69  n-i, &sz);.    i
da30: 20 2b 3d 20 73 7a 3b 0a 0a 20 20 20 20 6e 4f 75   += sz;..    nOu
da40: 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63 3e 3d  t++;.    if( c>=
da50: 31 32 38 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  128 ){.      int
da60: 20 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a   xTop, xBtm, x;.
da70: 20 20 20 20 20 20 78 54 6f 70 20 3d 20 73 69 7a        xTop = siz
da80: 65 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69  eof(translit)/si
da90: 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d  zeof(translit[0]
daa0: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 78 42 74  ) - 1;.      xBt
dab0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  m = 0;.      whi
dac0: 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20 29  le( xTop>=xBtm )
dad0: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 78  {.        x = (x
dae0: 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a 20  Top + xBtm)/2;. 
daf0: 20 20 20 20 20 20 20 69 66 28 20 74 72 61 6e 73         if( trans
db00: 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20  lit[x].cFrom==c 
db10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
db20: 20 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f   translit[x].cTo
db30: 31 20 29 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20  1 ) nOut++;.    
db40: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 78 30        if( c==0x0
db50: 34 32 39 20 7c 7c 20 63 3d 3d 20 30 78 30 34 34  429 || c== 0x044
db60: 39 20 29 20 6e 4f 75 74 20 2b 3d 20 32 3b 0a 20  9 ) nOut += 2;. 
db70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
db80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
db90: 28 20 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 46  ( translit[x].cF
dba0: 72 6f 6d 3e 63 20 29 7b 0a 20 20 20 20 20 20 20  rom>c ){.       
dbb0: 20 20 20 78 54 6f 70 20 3d 20 78 2d 31 3b 0a 20     xTop = x-1;. 
dbc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
dbd0: 20 20 20 20 20 20 20 20 78 42 74 6d 20 3d 20 78          xBtm = x
dbe0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
dbf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dc00: 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b  .  return nChar;
dc10: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70  .}.../*.**    sp
dc20: 65 6c 6c 66 69 78 31 5f 74 72 61 6e 73 6c 69 74  ellfix1_translit
dc30: 28 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72  (X).**.** Conver
dc40: 74 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  t a string that 
dc50: 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 41 53 43  contains non-ASC
dc60: 49 49 20 52 6f 6d 61 6e 20 63 68 61 72 61 63 74  II Roman charact
dc70: 65 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 70 75 72  ers into .** pur
dc80: 65 20 41 53 43 49 49 2e 0a 2a 2f 0a 73 74 61 74  e ASCII..*/.stat
dc90: 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c 69 74  ic void translit
dca0: 65 72 61 74 65 53 71 6c 46 75 6e 63 28 0a 20 20  erateSqlFunc(.  
dcb0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
dcc0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
dcd0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
dce0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
dcf0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
dd00: 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 73 71 6c   char *zIn = sql
dd10: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
dd20: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20  argv[0]);.  int 
dd30: 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  nIn = sqlite3_va
dd40: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
dd50: 5d 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ]);.  unsigned c
dd60: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 74 72 61 6e  har *zOut = tran
dd70: 73 6c 69 74 65 72 61 74 65 28 7a 49 6e 2c 20 6e  sliterate(zIn, n
dd80: 49 6e 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d  In);.  if( zOut=
dd90: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
dda0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
ddb0: 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20  omem(context);. 
ddc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
ddd0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
dde0: 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29  context, (char*)
ddf0: 7a 4f 75 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65  zOut, -1, sqlite
de00: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
de10: 2f 2a 0a 2a 2a 20 20 20 20 73 70 65 6c 6c 66 69  /*.**    spellfi
de20: 78 31 5f 73 63 72 69 70 74 63 6f 64 65 28 58 29  x1_scriptcode(X)
de30: 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65  .**.** Try to de
de40: 74 65 72 6d 69 6e 65 20 74 68 65 20 64 6f 6d 69  termine the domi
de50: 6e 61 6e 74 20 73 63 72 69 70 74 20 75 73 65 64  nant script used
de60: 20 62 79 20 74 68 65 20 77 6f 72 64 20 58 20 61   by the word X a
de70: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73  nd return.** its
de80: 20 49 53 4f 20 31 35 39 32 34 20 6e 75 6d 65 72   ISO 15924 numer
de90: 69 63 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  ic code..**.** T
dea0: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
deb0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 6c 79 20 75  mentation only u
dec0: 6e 64 65 72 73 74 61 6e 64 73 20 74 68 65 20 66  nderstands the f
ded0: 6f 6c 6c 6f 77 69 6e 67 20 73 63 72 69 70 74 73  ollowing scripts
dee0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 32 31 35 20 20  :.**.**    215  
def0: 28 4c 61 74 69 6e 29 0a 2a 2a 20 20 20 20 32 32  (Latin).**    22
df00: 30 20 20 28 43 79 72 69 6c 6c 69 63 29 0a 2a 2a  0  (Cyrillic).**
df10: 20 20 20 20 32 30 30 20 20 28 47 72 65 65 6b 29      200  (Greek)
df20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
df30: 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
df40: 39 39 38 20 69 66 20 74 68 65 20 69 6e 70 75 74  998 if the input
df50: 20 58 20 63 6f 6e 74 61 69 6e 73 20 63 68 61 72   X contains char
df60: 61 63 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74  acters from.** t
df70: 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  wo or more of th
df80: 65 20 61 62 6f 76 65 20 73 63 72 69 70 74 73 20  e above scripts 
df90: 6f 72 20 39 39 39 20 69 66 20 58 20 63 6f 6e 74  or 999 if X cont
dfa0: 61 69 6e 73 20 6e 6f 20 63 68 61 72 61 63 74 65  ains no characte
dfb0: 72 73 0a 2a 2a 20 66 72 6f 6d 20 61 6e 79 20 6f  rs.** from any o
dfc0: 66 20 74 68 65 20 61 62 6f 76 65 20 73 63 72 69  f the above scri
dfd0: 70 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pts..*/.static v
dfe0: 6f 69 64 20 73 63 72 69 70 74 43 6f 64 65 53 71  oid scriptCodeSq
dff0: 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  lFunc(.  sqlite3
e000: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
e010: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
e020: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
e030: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
e040: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
e050: 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  zIn = sqlite3_va
e060: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
e070: 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 73  );.  int nIn = s
e080: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
e090: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  es(argv[0]);.  i
e0a0: 6e 74 20 63 2c 20 73 7a 3b 0a 20 20 69 6e 74 20  nt c, sz;.  int 
e0b0: 73 63 72 69 70 74 4d 61 73 6b 20 3d 20 30 3b 0a  scriptMask = 0;.
e0c0: 20 20 69 6e 74 20 72 65 73 3b 0a 23 20 64 65 66    int res;.# def
e0d0: 69 6e 65 20 53 43 52 49 50 54 5f 4c 41 54 49 4e  ine SCRIPT_LATIN
e0e0: 20 20 20 20 20 20 20 30 78 30 30 30 31 0a 23 20         0x0001.# 
e0f0: 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f 43 59  define SCRIPT_CY
e100: 52 49 4c 4c 49 43 20 20 20 20 30 78 30 30 30 32  RILLIC    0x0002
e110: 0a 23 20 64 65 66 69 6e 65 20 53 43 52 49 50 54  .# define SCRIPT
e120: 5f 47 52 45 45 4b 20 20 20 20 20 20 20 30 78 30  _GREEK       0x0
e130: 30 30 34 0a 0a 20 20 77 68 69 6c 65 28 20 6e 49  004..  while( nI
e140: 6e 3e 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 75  n>0 ){.    c = u
e150: 74 66 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e  tf8Read(zIn, nIn
e160: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20  , &sz);.    zIn 
e170: 2b 3d 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d  += sz;.    nIn -
e180: 3d 20 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c  = sz;.    if( c<
e190: 30 78 30 32 61 66 20 29 7b 0a 20 20 20 20 20 20  0x02af ){.      
e1a0: 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53 43  scriptMask |= SC
e1b0: 52 49 50 54 5f 4c 41 54 49 4e 3b 0a 20 20 20 20  RIPT_LATIN;.    
e1c0: 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 30 78 30  }else if( c>=0x0
e1d0: 34 30 30 20 26 26 20 63 3c 3d 30 78 30 34 66 66  400 && c<=0x04ff
e1e0: 20 29 7b 0a 20 20 20 20 20 20 73 63 72 69 70 74   ){.      script
e1f0: 4d 61 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 43  Mask |= SCRIPT_C
e200: 59 52 49 4c 4c 49 43 3b 0a 20 20 20 20 7d 65 6c  YRILLIC;.    }el
e210: 73 65 20 69 66 28 20 63 3e 3d 30 78 30 33 38 36  se if( c>=0x0386
e220: 20 26 26 20 63 3c 3d 30 78 30 33 63 65 20 29 7b   && c<=0x03ce ){
e230: 0a 20 20 20 20 20 20 73 63 72 69 70 74 4d 61 73  .      scriptMas
e240: 6b 20 7c 3d 20 53 43 52 49 50 54 5f 47 52 45 45  k |= SCRIPT_GREE
e250: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  K;.    }.  }.  s
e260: 77 69 74 63 68 28 20 73 63 72 69 70 74 4d 61 73  witch( scriptMas
e270: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  k ){.    case 0:
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 72 65 73 20 3d 20 39 39 39 3b 20 62 72 65 61 6b  res = 999; break
e2a0: 3b 0a 20 20 20 20 63 61 73 65 20 53 43 52 49 50  ;.    case SCRIP
e2b0: 54 5f 4c 41 54 49 4e 3a 20 20 20 20 20 72 65 73  T_LATIN:     res
e2c0: 20 3d 20 32 31 35 3b 20 62 72 65 61 6b 3b 0a 20   = 215; break;. 
e2d0: 20 20 20 63 61 73 65 20 53 43 52 49 50 54 5f 43     case SCRIPT_C
e2e0: 59 52 49 4c 4c 49 43 3a 20 20 72 65 73 20 3d 20  YRILLIC:  res = 
e2f0: 32 32 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  220; break;.    
e300: 63 61 73 65 20 53 43 52 49 50 54 5f 47 52 45 45  case SCRIPT_GREE
e310: 4b 3a 20 20 20 20 20 72 65 73 20 3d 20 32 30 30  K:     res = 200
e320: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ; break;.    def
e330: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
e340: 20 20 20 20 72 65 73 20 3d 20 39 39 38 3b 20 62      res = 998; b
e350: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  reak;.  }.  sqli
e360: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
e370: 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b 0a 7d 0a  ontext, res);.}.
e380: 0a 2f 2a 20 45 6e 64 20 74 72 61 6e 73 6c 69 74  ./* End translit
e390: 65 72 61 74 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  erate.**********
e3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e3e0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
e3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e430: 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 73 70 65  ***.** Begin spe
e440: 6c 6c 66 69 78 31 20 76 69 72 74 75 61 6c 20 74  llfix1 virtual t
e450: 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 20 4d 61 78  able..*/../* Max
e460: 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61  imum length of a
e470: 20 70 68 6f 6e 65 68 61 73 68 20 75 73 65 64 20   phonehash used 
e480: 66 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68 65  for querying the
e490: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20 2a 2f   shadow table */
e4a0: 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
e4b0: 58 5f 4d 58 5f 48 41 53 48 20 20 38 0a 0a 2f 2a  X_MX_HASH  8../*
e4c0: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
e4d0: 6f 66 20 68 61 73 68 20 73 74 72 69 6e 67 73 20  of hash strings 
e4e0: 74 6f 20 65 78 61 6d 69 6e 65 20 70 65 72 20 71  to examine per q
e4f0: 75 65 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  uery */.#define 
e500: 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 20  SPELLFIX_MX_RUN 
e510: 20 20 31 0a 0a 74 79 70 65 64 65 66 20 73 74 72    1..typedef str
e520: 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  uct spellfix1_vt
e530: 61 62 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  ab spellfix1_vta
e540: 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  b;.typedef struc
e550: 74 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73  t spellfix1_curs
e560: 6f 72 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  or spellfix1_cur
e570: 73 6f 72 3b 0a 0a 2f 2a 20 46 75 7a 7a 79 2d 73  sor;../* Fuzzy-s
e580: 65 61 72 63 68 20 76 69 72 74 75 61 6c 20 74 61  earch virtual ta
e590: 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74  ble object */.st
e5a0: 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 76  ruct spellfix1_v
e5b0: 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tab {.  sqlite3_
e5c0: 76 74 61 62 20 62 61 73 65 3b 20 20 20 20 20 20  vtab base;      
e5d0: 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
e5e0: 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74   - must be first
e5f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
e600: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
e610: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
e620: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  nection */.  cha
e630: 72 20 2a 7a 44 62 4e 61 6d 65 3b 20 20 20 20 20  r *zDbName;     
e640: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
e650: 6f 66 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64  of database hold
e660: 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a  ing this table *
e670: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  /.  char *zTable
e680: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Name;          /
e690: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  * Name of the vi
e6a0: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
e6b0: 20 63 68 61 72 20 2a 7a 43 6f 73 74 54 61 62 6c   char *zCostTabl
e6c0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
e6d0: 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 65 64 69  able holding edi
e6e0: 74 2d 64 69 73 74 61 6e 63 65 20 63 6f 73 74 20  t-distance cost 
e6f0: 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 64 69  numbers */.  Edi
e700: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43  tDist3Config *pC
e710: 6f 6e 66 69 67 33 3b 20 2f 2a 20 50 61 72 73 65  onfig3; /* Parse
e720: 64 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20  d edit distance 
e730: 63 6f 73 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  costs */.};../* 
e740: 46 75 7a 7a 79 2d 73 65 61 72 63 68 20 63 75 72  Fuzzy-search cur
e750: 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74  sor object */.st
e760: 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 63  ruct spellfix1_c
e770: 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65  ursor {.  sqlite
e780: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61  3_vtab_cursor ba
e790: 73 65 3b 20 20 20 20 2f 2a 20 42 61 73 65 20 63  se;    /* Base c
e7a0: 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66  lass - must be f
e7b0: 69 72 73 74 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  irst */.  spellf
e7c0: 69 78 31 5f 76 74 61 62 20 2a 70 56 54 61 62 3b  ix1_vtab *pVTab;
e7d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
e7e0: 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 69  ble to which thi
e7f0: 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
e800: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
e810: 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tern;           
e820: 20 20 20 2f 2a 20 72 68 73 20 6f 66 20 4d 41 54     /* rhs of MAT
e830: 43 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  CH clause */.  i
e840: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
e850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e860: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66  umber of rows of
e870: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
e880: 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
e890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e8a0: 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65  mber of allocate
e8b0: 64 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20  d rows */.  int 
e8c0: 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  iRow;           
e8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
e8e0: 65 6e 74 20 72 6f 77 20 6f 66 20 63 6f 6e 74 65  ent row of conte
e8f0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  nt */.  int iLan
e900: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
e910: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
e920: 20 74 68 65 20 6c 61 6e 67 69 64 3d 20 63 6f 6e   the langid= con
e930: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  straint */.  int
e940: 20 69 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20   iTop;          
e950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
e960: 75 65 20 6f 66 20 74 68 65 20 74 6f 70 3d 20 63  ue of the top= c
e970: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69  onstraint */.  i
e980: 6e 74 20 69 53 63 6f 70 65 3b 20 20 20 20 20 20  nt iScope;      
e990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
e9a0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63 6f 70  alue of the scop
e9b0: 65 3d 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  e= constraint */
e9c0: 0a 20 20 69 6e 74 20 6e 53 65 61 72 63 68 3b 20  .  int nSearch; 
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 6f 63  /* Number of voc
e9f0: 61 62 75 6c 61 72 79 20 69 74 65 6d 73 20 63 68  abulary items ch
ea00: 65 63 6b 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecked */.  sqlit
ea10: 65 33 5f 73 74 6d 74 20 2a 70 46 75 6c 6c 53 63  e3_stmt *pFullSc
ea20: 61 6e 3b 20 20 20 20 20 2f 2a 20 53 68 61 64 6f  an;     /* Shado
ea30: 77 20 71 75 65 72 79 20 66 6f 72 20 61 20 66 75  w query for a fu
ea40: 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f  ll table scan */
ea50: 0a 20 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66  .  struct spellf
ea60: 69 78 31 5f 72 6f 77 20 7b 20 20 20 20 20 20 20  ix1_row {       
ea70: 2f 2a 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20  /* For each row 
ea80: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
ea90: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
eaa0: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
eab0: 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69  /* Rowid for thi
eac0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 63 68 61  s row */.    cha
ead0: 72 20 2a 7a 57 6f 72 64 3b 20 20 20 20 20 20 20  r *zWord;       
eae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
eaf0: 78 74 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20  xt for this row 
eb00: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 61 6e 6b  */.    int iRank
eb10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eb20: 20 20 20 20 20 2f 2a 20 52 61 6e 6b 20 66 6f 72       /* Rank for
eb30: 20 74 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20   this row */.   
eb40: 20 69 6e 74 20 69 44 69 73 74 61 6e 63 65 3b 20   int iDistance; 
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
eb60: 2a 20 44 69 73 74 61 6e 63 65 20 66 72 6f 6d 20  * Distance from 
eb70: 70 61 74 74 65 72 6e 20 66 6f 72 20 74 68 69 73  pattern for this
eb80: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
eb90: 69 53 63 6f 72 65 3b 20 20 20 20 20 20 20 20 20  iScore;         
eba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 6f            /* Sco
ebb0: 72 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 2a  re for sorting *
ebc0: 2f 0a 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68  /.    int iMatch
ebd0: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
ebe0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
ebf0: 6d 61 74 63 68 6c 65 6e 20 63 6f 6c 75 6d 6e 20  matchlen column 
ec00: 28 6f 72 20 2d 31 29 20 2a 2f 0a 20 20 20 20 63  (or -1) */.    c
ec10: 68 61 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46  har zHash[SPELLF
ec20: 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 2f 2a 20  IX_MX_HASH]; /* 
ec30: 74 68 65 20 70 68 6f 6e 65 68 61 73 68 20 75 73  the phonehash us
ec40: 65 64 20 66 6f 72 20 74 68 69 73 20 6d 61 74 63  ed for this matc
ec50: 68 20 2a 2f 0a 20 20 7d 20 2a 61 3b 20 0a 7d 3b  h */.  } *a; .};
ec60: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
ec70: 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 53 51  t one or more SQ
ec80: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f  L statements fro
ec90: 6d 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  m the format str
eca0: 69 6e 67 20 67 69 76 65 6e 0a 2a 2a 20 61 6e 64  ing given.** and
ecb0: 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74   then evaluate t
ecc0: 68 6f 73 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  hose statements.
ecd0: 20 54 68 65 20 73 75 63 63 65 73 73 20 63 6f 64   The success cod
ece0: 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  e is written.** 
ecf0: 69 6e 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a 2a 2a  into *pRc..**.**
ed00: 20 49 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74   If *pRc is init
ed10: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ially non-zero t
ed20: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
ed30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ed40: 73 74 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c  static void spel
ed50: 6c 66 69 78 31 44 62 45 78 65 63 28 0a 20 20 69  lfix1DbExec(.  i
ed60: 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
ed70: 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73        /* Success
ed80: 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
ed90: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
eda0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e    /* Database in
edb0: 20 77 68 69 63 68 20 74 6f 20 72 75 6e 20 53 51   which to run SQ
edc0: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
edd0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 2f 2a  r *zFormat,   /*
ede0: 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66   Format string f
edf0: 6f 72 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e 20  or SQL */.  ... 
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
ee20: 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74  to the format st
ee30: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f  ring */.){.  va_
ee40: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
ee50: 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 2a 70 52  *zSql;.  if( *pR
ee60: 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  c ) return;.  va
ee70: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
ee80: 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  at);.  zSql = sq
ee90: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
eea0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
eeb0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
eec0: 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
eed0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
eee0: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
eef0: 20 20 2a 70 52 63 20 3d 20 73 71 6c 69 74 65 33    *pRc = sqlite3
ef00: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
ef10: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
ef20: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
ef30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  ;.  }.}../*.** x
ef40: 44 69 73 63 6f 6e 6e 65 63 74 2f 78 44 65 73 74  Disconnect/xDest
ef50: 72 6f 79 20 6d 65 74 68 6f 64 20 66 6f 72 20 74  roy method for t
ef60: 68 65 20 66 75 7a 7a 79 2d 73 65 61 72 63 68 20  he fuzzy-search 
ef70: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
ef80: 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 55  c int spellfix1U
ef90: 6e 69 6e 69 74 28 69 6e 74 20 69 73 44 65 73 74  ninit(int isDest
efa0: 72 6f 79 2c 20 73 71 6c 69 74 65 33 5f 76 74 61  roy, sqlite3_vta
efb0: 62 20 2a 70 56 54 61 62 29 7b 0a 20 20 73 70 65  b *pVTab){.  spe
efc0: 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d  llfix1_vtab *p =
efd0: 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62   (spellfix1_vtab
efe0: 2a 29 70 56 54 61 62 3b 0a 20 20 69 6e 74 20 72  *)pVTab;.  int r
eff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f000: 20 69 66 28 20 69 73 44 65 73 74 72 6f 79 20 29   if( isDestroy )
f010: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
f020: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73  b = p->db;.    s
f030: 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26  pellfix1DbExec(&
f040: 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20 54 41  rc, db, "DROP TA
f050: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 5c 22  BLE IF EXISTS \"
f060: 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c  %w\".\"%w_vocab\
f070: 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
f080: 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65        p->zDbName
f090: 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29  , p->zTableName)
f0a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
f0b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f0c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
f0d0: 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20  >zTableName);.  
f0e0: 20 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69    editDist3Confi
f0f0: 67 44 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66  gDelete(p->pConf
f100: 69 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ig3);.    sqlite
f110: 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54  3_free(p->zCostT
f120: 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  able);.    sqlit
f130: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
f140: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
f150: 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
f160: 69 78 31 44 69 73 63 6f 6e 6e 65 63 74 28 73 71  ix1Disconnect(sq
f170: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61  lite3_vtab *pVTa
f180: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65  b){.  return spe
f190: 6c 6c 66 69 78 31 55 6e 69 6e 69 74 28 30 2c 20  llfix1Uninit(0, 
f1a0: 70 56 54 61 62 29 3b 0a 7d 0a 73 74 61 74 69 63  pVTab);.}.static
f1b0: 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 44 65   int spellfix1De
f1c0: 73 74 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74  stroy(sqlite3_vt
f1d0: 61 62 20 2a 70 56 54 61 62 29 7b 0a 20 20 72 65  ab *pVTab){.  re
f1e0: 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 55 6e  turn spellfix1Un
f1f0: 69 6e 69 74 28 31 2c 20 70 56 54 61 62 29 3b 0a  init(1, pVTab);.
f200: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
f210: 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67  copy of a string
f220: 2e 20 20 52 65 6d 6f 76 65 20 6c 65 61 64 69 6e  .  Remove leadin
f230: 67 20 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77  g and trailing w
f240: 68 69 74 65 73 70 61 63 65 0a 2a 2a 20 61 6e 64  hitespace.** and
f250: 20 64 65 71 75 6f 74 65 20 69 74 2e 0a 2a 2f 0a   dequote it..*/.
f260: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 70 65  static char *spe
f270: 6c 6c 66 69 78 31 44 65 71 75 6f 74 65 28 63 6f  llfix1Dequote(co
f280: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a  nst char *zIn){.
f290: 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20    char *zOut;.  
f2a0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
f2b0: 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73   c;.  while( iss
f2c0: 70 61 63 65 28 7a 49 6e 5b 30 5d 29 20 29 20 7a  pace(zIn[0]) ) z
f2d0: 49 6e 2b 2b 3b 0a 20 20 7a 4f 75 74 20 3d 20 73  In++;.  zOut = s
f2e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f2f0: 25 73 22 2c 20 7a 49 6e 29 3b 0a 20 20 69 66 28  %s", zIn);.  if(
f300: 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72   zOut==0 ) retur
f310: 6e 20 30 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29  n 0;.  i = (int)
f320: 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 23 69  strlen(zOut);.#i
f330: 66 20 30 20 20 2f 2a 20 54 68 65 20 70 61 72 73  f 0  /* The pars
f340: 65 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 6c 65  er will never le
f350: 61 76 65 20 73 70 61 63 65 73 20 61 74 20 74 68  ave spaces at th
f360: 65 20 65 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65  e end */.  while
f370: 28 20 69 3e 30 20 26 26 20 69 73 73 70 61 63 65  ( i>0 && isspace
f380: 28 7a 4f 75 74 5b 69 2d 31 5d 29 20 29 7b 20 69  (zOut[i-1]) ){ i
f390: 2d 2d 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a  --; }.#endif.  z
f3a0: 4f 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 63 20  Out[i] = 0;.  c 
f3b0: 3d 20 7a 4f 75 74 5b 30 5d 3b 0a 20 20 69 66 28  = zOut[0];.  if(
f3c0: 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
f3d0: 22 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  "' ){.    for(i=
f3e0: 31 2c 20 6a 3d 30 3b 20 41 4c 57 41 59 53 28 7a  1, j=0; ALWAYS(z
f3f0: 4f 75 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Out[i]); i++){. 
f400: 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d       zOut[j++] =
f410: 20 7a 4f 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20   zOut[i];.      
f420: 69 66 28 20 7a 4f 75 74 5b 69 5d 3d 3d 63 20 29  if( zOut[i]==c )
f430: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f  {.        if( zO
f440: 75 74 5b 69 2b 31 5d 3d 3d 63 20 29 7b 0a 20 20  ut[i+1]==c ){.  
f450: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
f460: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f470: 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2d 31 5d 20        zOut[j-1] 
f480: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
f490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
f4a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f4b0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b  }.  return zOut;
f4c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6e 6e  .}.../*.** xConn
f4d0: 65 63 74 2f 78 43 72 65 61 74 65 20 6d 65 74 68  ect/xCreate meth
f4e0: 6f 64 20 66 6f 72 20 74 68 65 20 73 70 65 6c 6c  od for the spell
f4f0: 66 69 78 31 20 6d 6f 64 75 6c 65 2e 20 41 72 67  fix1 module. Arg
f500: 75 6d 65 6e 74 73 20 61 72 65 3a 0a 2a 2a 0a 2a  uments are:.**.*
f510: 2a 20 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e  *   argv[0]   ->
f520: 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28 22   module name  ("
f530: 73 70 65 6c 6c 66 69 78 31 22 29 0a 2a 2a 20 20  spellfix1").**  
f540: 20 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61   argv[1]   -> da
f550: 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20  tabase name.**  
f560: 20 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61   argv[2]   -> ta
f570: 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72  ble name.**   ar
f580: 67 76 5b 33 5d 2e 2e 20 2d 3e 20 6f 70 74 69 6f  gv[3].. -> optio
f590: 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 28 69  nal arguments (i
f5a0: 2e 65 2e 20 22 65 64 69 74 5f 63 6f 73 74 5f 74  .e. "edit_cost_t
f5b0: 61 62 6c 65 22 20 70 61 72 61 6d 65 74 65 72 29  able" parameter)
f5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
f5d0: 70 65 6c 6c 66 69 78 31 49 6e 69 74 28 0a 20 20  pellfix1Init(.  
f5e0: 69 6e 74 20 69 73 43 72 65 61 74 65 2c 0a 20 20  int isCreate,.  
f5f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
f600: 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
f610: 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
f620: 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
f630: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
f640: 70 70 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVTab,.  char *
f650: 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 73 70 65 6c  *pzErr.){.  spel
f660: 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 4e 65 77  lfix1_vtab *pNew
f670: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
f680: 61 72 20 2a 7a 4d 6f 64 75 6c 65 20 3d 20 61 72  ar *zModule = ar
f690: 67 76 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  gv[0];.  const c
f6a0: 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 61  har *zDbName = a
f6b0: 72 67 76 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  rgv[1];.  const 
f6c0: 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65  char *zTableName
f6d0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e   = argv[2];.  in
f6e0: 74 20 6e 44 62 4e 61 6d 65 3b 0a 20 20 69 6e 74  t nDbName;.  int
f6f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f700: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 44 62  .  int i;..  nDb
f710: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 44  Name = strlen(zD
f720: 62 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d  bName);.  pNew =
f730: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
f740: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
f750: 20 6e 44 62 4e 61 6d 65 20 2b 20 31 29 3b 0a 20   nDbName + 1);. 
f760: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
f770: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f780: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
f790: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
f7a0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   0, sizeof(*pNew
f7b0: 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 44  ));.    pNew->zD
f7c0: 62 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  bName = (char*)&
f7d0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  pNew[1];.    mem
f7e0: 63 70 79 28 70 4e 65 77 2d 3e 7a 44 62 4e 61 6d  cpy(pNew->zDbNam
f7f0: 65 2c 20 7a 44 62 4e 61 6d 65 2c 20 6e 44 62 4e  e, zDbName, nDbN
f800: 61 6d 65 2b 31 29 3b 0a 20 20 20 20 70 4e 65 77  ame+1);.    pNew
f810: 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 20 3d 20 73  ->zTableName = s
f820: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f830: 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 29  %s", zTableName)
f840: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 64 62 20 3d  ;.    pNew->db =
f850: 20 64 62 3b 0a 20 20 20 20 69 66 28 20 70 4e 65   db;.    if( pNe
f860: 77 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30  w->zTableName==0
f870: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
f880: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
f890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
f8a0: 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61   = sqlite3_decla
f8b0: 72 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20 20  re_vtab(db, .   
f8c0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
f8d0: 54 41 42 4c 45 20 78 28 77 6f 72 64 2c 72 61 6e  TABLE x(word,ran
f8e0: 6b 2c 64 69 73 74 61 6e 63 65 2c 6c 61 6e 67 69  k,distance,langi
f8f0: 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  d, ".           
f900: 22 73 63 6f 72 65 2c 20 6d 61 74 63 68 6c 65 6e  "score, matchlen
f910: 2c 20 70 68 6f 6e 65 68 61 73 68 20 48 49 44 44  , phonehash HIDD
f920: 45 4e 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  EN, ".          
f930: 20 22 74 6f 70 20 48 49 44 44 45 4e 2c 20 73 63   "top HIDDEN, sc
f940: 6f 70 65 20 48 49 44 44 45 4e 2c 20 73 72 63 68  ope HIDDEN, srch
f950: 63 6e 74 20 48 49 44 44 45 4e 2c 20 22 0a 20 20  cnt HIDDEN, ".  
f960: 20 20 20 20 20 20 20 20 20 22 73 6f 75 6e 64 73           "sounds
f970: 6c 69 6b 65 20 48 49 44 44 45 4e 2c 20 63 6f 6d  like HIDDEN, com
f980: 6d 61 6e 64 20 48 49 44 44 45 4e 29 22 0a 20 20  mand HIDDEN)".  
f990: 20 20 20 20 29 3b 0a 23 64 65 66 69 6e 65 20 53      );.#define S
f9a0: 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44  PELLFIX_COL_WORD
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23 64              0.#d
f9c0: 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43  efine SPELLFIX_C
f9d0: 4f 4c 5f 52 41 4e 4b 20 20 20 20 20 20 20 20 20  OL_RANK         
f9e0: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53 50 45     1.#define SPE
f9f0: 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e  LLFIX_COL_DISTAN
fa00: 43 45 20 20 20 20 20 20 20 20 32 0a 23 64 65 66  CE        2.#def
fa10: 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
fa20: 5f 4c 41 4e 47 49 44 20 20 20 20 20 20 20 20 20  _LANGID         
fa30: 20 33 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c   3.#define SPELL
fa40: 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 20 20 20  FIX_COL_SCORE   
fa50: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
fa60: 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4d  e SPELLFIX_COL_M
fa70: 41 54 43 48 4c 45 4e 20 20 20 20 20 20 20 20 35  ATCHLEN        5
fa80: 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
fa90: 58 5f 43 4f 4c 5f 50 48 4f 4e 45 48 41 53 48 20  X_COL_PHONEHASH 
faa0: 20 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20        6.#define 
fab0: 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54 4f 50  SPELLFIX_COL_TOP
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 37 0a 23               7.#
fad0: 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
fae0: 43 4f 4c 5f 53 43 4f 50 45 20 20 20 20 20 20 20  COL_SCOPE       
faf0: 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20 53 50      8.#define SP
fb00: 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52 43 48 43  ELLFIX_COL_SRCHC
fb10: 4e 54 20 20 20 20 20 20 20 20 20 39 0a 23 64 65  NT         9.#de
fb20: 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  fine SPELLFIX_CO
fb30: 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 20 20 20 20  L_SOUNDSLIKE    
fb40: 20 31 30 0a 23 64 65 66 69 6e 65 20 53 50 45 4c   10.#define SPEL
fb50: 4c 46 49 58 5f 43 4f 4c 5f 43 4f 4d 4d 41 4e 44  LFIX_COL_COMMAND
fb60: 20 20 20 20 20 20 20 20 31 31 0a 20 20 20 20 7d          11.    }
fb70: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
fb80: 49 54 45 5f 4f 4b 20 26 26 20 69 73 43 72 65 61  ITE_OK && isCrea
fb90: 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
fba0: 74 65 33 5f 75 69 6e 74 36 34 20 72 3b 0a 20 20  te3_uint64 r;.  
fbb0: 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45      spellfix1DbE
fbc0: 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20  xec(&rc, db,.   
fbd0: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
fbe0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
fbf0: 53 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f  S \"%w\".\"%w_vo
fc00: 63 61 62 5c 22 28 5c 6e 22 0a 20 20 20 20 20 20  cab\"(\n".      
fc10: 20 20 20 22 20 20 69 64 20 49 4e 54 45 47 45 52     "  id INTEGER
fc20: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22   PRIMARY KEY,\n"
fc30: 0a 20 20 20 20 20 20 20 20 20 22 20 20 72 61 6e  .         "  ran
fc40: 6b 20 49 4e 54 2c 5c 6e 22 0a 20 20 20 20 20 20  k INT,\n".      
fc50: 20 20 20 22 20 20 6c 61 6e 67 69 64 20 49 4e 54     "  langid INT
fc60: 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20  ,\n".         " 
fc70: 20 77 6f 72 64 20 54 45 58 54 2c 5c 6e 22 0a 20   word TEXT,\n". 
fc80: 20 20 20 20 20 20 20 20 22 20 20 6b 31 20 54 45          "  k1 TE
fc90: 58 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  XT,\n".         
fca0: 22 20 20 6b 32 20 54 45 58 54 5c 6e 22 0a 20 20  "  k2 TEXT\n".  
fcb0: 20 20 20 20 20 20 20 22 29 3b 5c 6e 22 2c 0a 20         ");\n",. 
fcc0: 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
fcd0: 20 7a 54 61 62 6c 65 4e 61 6d 65 0a 20 20 20 20   zTableName.    
fce0: 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
fcf0: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
fd00: 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20  zeof(r), &r);.  
fd10: 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45      spellfix1DbE
fd20: 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20  xec(&rc, db,.   
fd30: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e        "CREATE IN
fd40: 44 45 58 20 49 46 20 4e 4f 54 20 45 58 49 53 54  DEX IF NOT EXIST
fd50: 53 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 69 6e  S \"%w\".\"%w_in
fd60: 64 65 78 5f 25 6c 6c 78 5c 22 20 22 0a 20 20 20  dex_%llx\" ".   
fd70: 20 20 20 20 20 20 20 20 20 22 4f 4e 20 5c 22 25           "ON \"%
fd80: 77 5f 76 6f 63 61 62 5c 22 28 6c 61 6e 67 69 64  w_vocab\"(langid
fd90: 2c 6b 32 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,k2);",.        
fda0: 20 7a 44 62 4e 61 6d 65 2c 20 7a 4d 6f 64 75 6c   zDbName, zModul
fdb0: 65 2c 20 72 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e, r, zTableName
fdc0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
fdd0: 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 72 63 3d      for(i=3; rc=
fde0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
fdf0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
fe00: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 72 67    if( memcmp(arg
fe10: 76 5b 69 5d 2c 22 65 64 69 74 5f 63 6f 73 74 5f  v[i],"edit_cost_
fe20: 74 61 62 6c 65 3d 22 2c 31 36 29 3d 3d 30 20 26  table=",16)==0 &
fe30: 26 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62  & pNew->zCostTab
fe40: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
fe50: 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62 6c   pNew->zCostTabl
fe60: 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 44 65 71  e = spellfix1Deq
fe70: 75 6f 74 65 28 26 61 72 67 76 5b 69 5d 5b 31 36  uote(&argv[i][16
fe80: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
fe90: 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62 6c 65  pNew->zCostTable
fea0: 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
feb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
fec0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
fed0: 20 7d 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20   }.      *pzErr 
fee0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
fef0: 66 28 22 62 61 64 20 61 72 67 75 6d 65 6e 74 20  f("bad argument 
ff00: 74 6f 20 73 70 65 6c 6c 66 69 78 31 28 29 3a 20  to spellfix1(): 
ff10: 5c 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d  \"%s\"", argv[i]
ff20: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
ff30: 4c 49 54 45 5f 45 52 52 4f 52 3b 20 0a 20 20 20  LITE_ERROR; .   
ff40: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
ff50: 20 26 26 20 70 4e 65 77 20 29 7b 0a 20 20 20 20   && pNew ){.    
ff60: 2a 70 70 56 54 61 62 20 3d 20 30 3b 0a 20 20 20  *ppVTab = 0;.   
ff70: 20 73 70 65 6c 6c 66 69 78 31 55 6e 69 6e 69 74   spellfix1Uninit
ff80: 28 30 2c 20 26 70 4e 65 77 2d 3e 62 61 73 65 29  (0, &pNew->base)
ff90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
ffa0: 70 70 56 54 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVTab = (sqlite
ffb0: 33 5f 76 74 61 62 20 2a 29 70 4e 65 77 3b 0a 20  3_vtab *)pNew;. 
ffc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
ffd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 43 6f  }../*.** The xCo
ffe0: 6e 6e 65 63 74 20 61 6e 64 20 78 43 72 65 61 74  nnect and xCreat
fff0: 65 20 6d 65 74 68 6f 64 73 0a 2a 2f 0a 73 74 61  e methods.*/.sta
10000 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
10010 31 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69  1Connect(.  sqli
10020 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
10030 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67  *pAux,.  int arg
10040 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  c, const char *c
10050 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c  onst*argv,.  sql
10060 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 54  ite3_vtab **ppVT
10070 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ab,.  char **pzE
10080 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  rr.){.  return s
10090 70 65 6c 6c 66 69 78 31 49 6e 69 74 28 30 2c 20  pellfix1Init(0, 
100a0 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
100b0 61 72 67 76 2c 20 70 70 56 54 61 62 2c 20 70 7a  argv, ppVTab, pz
100c0 45 72 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Err);.}.static i
100d0 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 72 65 61  nt spellfix1Crea
100e0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
100f0 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
10100 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
10110 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
10120 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
10130 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a 20 20  tab **ppVTab,.  
10140 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
10150 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c 66 69    return spellfi
10160 78 31 49 6e 69 74 28 31 2c 20 64 62 2c 20 70 41  x1Init(1, db, pA
10170 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  ux, argc, argv, 
10180 70 70 56 54 61 62 2c 20 70 7a 45 72 72 29 3b 0a  ppVTab, pzErr);.
10190 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
101a0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  ll of the conten
101b0 74 20 66 72 6f 6d 20 61 20 63 75 72 73 6f 72 2e  t from a cursor.
101c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
101d0 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43 75  spellfix1ResetCu
101e0 72 73 6f 72 28 73 70 65 6c 6c 66 69 78 31 5f 63  rsor(spellfix1_c
101f0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
10200 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
10210 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20  ; i<pCur->nRow; 
10220 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
10230 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 5b 69  3_free(pCur->a[i
10240 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20 7d 0a 20 20  ].zWord);.  }.  
10250 70 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a  pCur->nRow = 0;.
10260 20 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30    pCur->iRow = 0
10270 3b 0a 20 20 70 43 75 72 2d 3e 6e 53 65 61 72 63  ;.  pCur->nSearc
10280 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  h = 0;.  if( pCu
10290 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b 0a  r->pFullScan ){.
102a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
102b0 6c 69 7a 65 28 70 43 75 72 2d 3e 70 46 75 6c 6c  lize(pCur->pFull
102c0 53 63 61 6e 29 3b 0a 20 20 20 20 70 43 75 72 2d  Scan);.    pCur-
102d0 3e 70 46 75 6c 6c 53 63 61 6e 20 3d 20 30 3b 0a  >pFullScan = 0;.
102e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
102f0 69 7a 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ize the cursor t
10300 6f 20 68 6f 6c 64 20 75 70 20 74 6f 20 4e 20 72  o hold up to N r
10310 6f 77 73 20 6f 66 20 63 6f 6e 74 65 6e 74 0a 2a  ows of content.*
10320 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 70  /.static void sp
10330 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75 72  ellfix1ResizeCur
10340 73 6f 72 28 73 70 65 6c 6c 66 69 78 31 5f 63 75  sor(spellfix1_cu
10350 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
10360 4e 29 7b 0a 20 20 73 74 72 75 63 74 20 73 70 65  N){.  struct spe
10370 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 61 4e 65 77  llfix1_row *aNew
10380 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 70  ;.  assert( N>=p
10390 43 75 72 2d 3e 6e 52 6f 77 20 29 3b 0a 20 20 61  Cur->nRow );.  a
103a0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
103b0 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 61 2c 20 73  alloc(pCur->a, s
103c0 69 7a 65 6f 66 28 70 43 75 72 2d 3e 61 5b 30 5d  izeof(pCur->a[0]
103d0 29 2a 4e 29 3b 0a 20 20 69 66 28 20 61 4e 65 77  )*N);.  if( aNew
103e0 3d 3d 30 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20  ==0 && N>0 ){.  
103f0 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74    spellfix1Reset
10400 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
10410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10420 43 75 72 2d 3e 61 29 3b 0a 20 20 20 20 70 43 75  Cur->a);.    pCu
10430 72 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  r->nAlloc = 0;. 
10440 20 20 20 70 43 75 72 2d 3e 61 20 3d 20 30 3b 0a     pCur->a = 0;.
10450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
10460 72 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 4e 3b 0a 20  r->nAlloc = N;. 
10470 20 20 20 70 43 75 72 2d 3e 61 20 3d 20 61 4e 65     pCur->a = aNe
10480 77 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  w;.  }.}.../*.**
10490 20 43 6c 6f 73 65 20 61 20 66 75 7a 7a 79 2d 73   Close a fuzzy-s
104a0 65 61 72 63 68 20 63 75 72 73 6f 72 2e 0a 2a 2f  earch cursor..*/
104b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
104c0 6c 66 69 78 31 43 6c 6f 73 65 28 73 71 6c 69 74  lfix1Close(sqlit
104d0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
104e0 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  cur){.  spellfix
104f0 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  1_cursor *pCur =
10500 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73   (spellfix1_curs
10510 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 70 65 6c  or *)cur;.  spel
10520 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f 72  lfix1ResetCursor
10530 28 70 43 75 72 29 3b 0a 20 20 73 70 65 6c 6c 66  (pCur);.  spellf
10540 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28  ix1ResizeCursor(
10550 70 43 75 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69  pCur, 0);.  sqli
10560 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 7a  te3_free(pCur->z
10570 50 61 74 74 65 72 6e 29 3b 0a 20 20 73 71 6c 69  Pattern);.  sqli
10580 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a  te3_free(pCur);.
10590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
105a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  OK;.}../*.** Sea
105b0 72 63 68 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  rch for terms of
105c0 20 74 68 65 73 65 20 66 6f 72 6d 73 3a 0a 2a 2a   these forms:.**
105d0 0a 2a 2a 20 20 20 28 41 29 20 20 20 20 77 6f 72  .**   (A)    wor
105e0 64 20 4d 41 54 43 48 20 24 73 74 72 0a 2a 2a 20  d MATCH $str.** 
105f0 20 20 28 42 29 20 20 20 20 6c 61 6e 67 69 64 20    (B)    langid 
10600 3d 3d 20 24 6c 61 6e 67 69 64 0a 2a 2a 20 20 20  == $langid.**   
10610 28 43 29 20 20 20 20 74 6f 70 20 3d 20 24 74 6f  (C)    top = $to
10620 70 0a 2a 2a 20 20 20 28 44 29 20 20 20 20 73 63  p.**   (D)    sc
10630 6f 70 65 20 3d 20 24 73 63 6f 70 65 0a 2a 2a 20  ope = $scope.** 
10640 20 20 28 45 29 20 20 20 20 64 69 73 74 61 6e 63    (E)    distanc
10650 65 20 3c 20 24 64 69 73 74 61 6e 63 65 0a 2a 2a  e < $distance.**
10660 20 20 20 28 46 29 20 20 20 20 64 69 73 74 61 6e     (F)    distan
10670 63 65 20 3c 3d 20 24 64 69 73 74 61 6e 63 65 0a  ce <= $distance.
10680 2a 2a 0a 2a 2a 20 54 68 65 20 70 6c 61 6e 20 6e  **.** The plan n
10690 75 6d 62 65 72 20 69 73 20 61 20 62 69 74 20 6d  umber is a bit m
106a0 61 73 6b 20 66 6f 72 6d 65 64 20 77 69 74 68 20  ask formed with 
106b0 74 68 65 73 65 20 62 69 74 73 3a 0a 2a 2a 0a 2a  these bits:.**.*
106c0 2a 20 20 20 30 78 30 31 20 20 20 28 41 29 20 69  *   0x01   (A) i
106d0 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 30  s found.**   0x0
106e0 32 20 20 20 28 42 29 20 69 73 20 66 6f 75 6e 64  2   (B) is found
106f0 0a 2a 2a 20 20 20 30 78 30 34 20 20 20 28 43 29  .**   0x04   (C)
10700 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30   is found.**   0
10710 78 30 38 20 20 20 28 44 29 20 69 73 20 66 6f 75  x08   (D) is fou
10720 6e 64 0a 2a 2a 20 20 20 30 78 31 30 20 20 20 28  nd.**   0x10   (
10730 45 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20  E) is found.**  
10740 20 30 78 32 30 20 20 20 28 46 29 20 69 73 20 66   0x20   (F) is f
10750 6f 75 6e 64 0a 2a 2a 0a 2a 2a 20 66 69 6c 74 65  ound.**.** filte
10760 72 2e 61 72 67 76 5b 2a 5d 20 76 61 6c 75 65 73  r.argv[*] values
10770 20 63 6f 6e 74 61 69 6e 73 20 24 73 74 72 2c 20   contains $str, 
10780 24 6c 61 6e 67 69 64 2c 20 24 74 6f 70 2c 20 61  $langid, $top, a
10790 6e 64 20 24 73 63 6f 70 65 2c 0a 2a 2a 20 69 66  nd $scope,.** if
107a0 20 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 69   specified and i
107b0 6e 20 74 68 61 74 20 6f 72 64 65 72 2e 0a 2a 2f  n that order..*/
107c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
107d0 6c 66 69 78 31 42 65 73 74 49 6e 64 65 78 28 73  lfix1BestIndex(s
107e0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62  qlite3_vtab *tab
107f0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  , sqlite3_index_
10800 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b  info *pIdxInfo){
10810 0a 20 20 69 6e 74 20 69 50 6c 61 6e 20 3d 20 30  .  int iPlan = 0
10820 3b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 54 65 72  ;.  int iLangTer
10830 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 54  m = -1;.  int iT
10840 6f 70 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69  opTerm = -1;.  i
10850 6e 74 20 69 53 63 6f 70 65 54 65 72 6d 20 3d 20  nt iScopeTerm = 
10860 2d 31 3b 0a 20 20 69 6e 74 20 69 44 69 73 74 54  -1;.  int iDistT
10870 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  erm = -1;.  int 
10880 69 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  i;.  const struc
10890 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
108a0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e  constraint *pCon
108b0 73 74 72 61 69 6e 74 3b 0a 20 20 70 43 6f 6e 73  straint;.  pCons
108c0 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66  traint = pIdxInf
108d0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
108e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
108f0 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
10900 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72  nt; i++, pConstr
10910 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28  aint++){.    if(
10920 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73   pConstraint->us
10930 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  able==0 ) contin
10940 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d  ue;..    /* Term
10950 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
10960 77 6f 72 64 20 4d 41 54 43 48 20 24 73 74 72 20  word MATCH $str 
10970 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61  */.    if( (iPla
10980 6e 20 26 20 31 29 3d 3d 30 20 0a 20 20 20 20 20  n & 1)==0 .     
10990 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
109a0 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49  iColumn==SPELLFI
109b0 58 5f 43 4f 4c 5f 57 4f 52 44 0a 20 20 20 20 20  X_COL_WORD.     
109c0 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
109d0 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
109e0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
109f0 48 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  H.    ){.      i
10a00 50 6c 61 6e 20 7c 3d 20 31 3b 0a 20 20 20 20 20  Plan |= 1;.     
10a10 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
10a20 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
10a30 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20  rgvIndex = 1;.  
10a40 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
10a50 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
10a60 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  ].omit = 1;.    
10a70 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20  }..    /* Terms 
10a80 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 6c 61  of the form:  la
10a90 6e 67 69 64 20 3d 20 24 6c 61 6e 67 69 64 20 20  ngid = $langid  
10aa0 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61  */.    if( (iPla
10ab0 6e 20 26 20 32 29 3d 3d 30 0a 20 20 20 20 20 26  n & 2)==0.     &
10ac0 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  & pConstraint->i
10ad0 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58  Column==SPELLFIX
10ae0 5f 43 4f 4c 5f 4c 41 4e 47 49 44 0a 20 20 20 20  _COL_LANGID.    
10af0 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
10b00 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
10b10 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a  X_CONSTRAINT_EQ.
10b20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c      ){.      iPl
10b30 61 6e 20 7c 3d 20 32 3b 0a 20 20 20 20 20 20 69  an |= 2;.      i
10b40 4c 61 6e 67 54 65 72 6d 20 3d 20 69 3b 0a 20 20  LangTerm = i;.  
10b50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d    }..    /* Term
10b60 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
10b70 74 6f 70 20 3d 20 24 74 6f 70 20 2a 2f 0a 20 20  top = $top */.  
10b80 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20 34    if( (iPlan & 4
10b90 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43 6f  )==0.     && pCo
10ba0 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
10bb0 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  n==SPELLFIX_COL_
10bc0 54 4f 50 0a 20 20 20 20 20 26 26 20 70 43 6f 6e  TOP.     && pCon
10bd0 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c  straint->op==SQL
10be0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
10bf0 41 49 4e 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20  AINT_EQ.    ){. 
10c00 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 34 3b       iPlan |= 4;
10c10 0a 20 20 20 20 20 20 69 54 6f 70 54 65 72 6d 20  .      iTopTerm 
10c20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = i;.    }..    
10c30 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  /* Terms of the 
10c40 66 6f 72 6d 3a 20 20 73 63 6f 70 65 20 3d 20 24  form:  scope = $
10c50 73 63 6f 70 65 20 2a 2f 0a 20 20 20 20 69 66 28  scope */.    if(
10c60 20 28 69 50 6c 61 6e 20 26 20 38 29 3d 3d 30 0a   (iPlan & 8)==0.
10c70 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
10c80 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50  int->iColumn==SP
10c90 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45  ELLFIX_COL_SCOPE
10ca0 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10cb0 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  aint->op==SQLITE
10cc0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10cd0 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20  T_EQ.    ){.    
10ce0 20 20 69 50 6c 61 6e 20 7c 3d 20 38 3b 0a 20 20    iPlan |= 8;.  
10cf0 20 20 20 20 69 53 63 6f 70 65 54 65 72 6d 20 3d      iScopeTerm =
10d00 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   i;.    }..    /
10d10 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66  * Terms of the f
10d20 6f 72 6d 3a 20 20 64 69 73 74 61 6e 63 65 20 3c  orm:  distance <
10d30 20 24 64 69 73 74 20 6f 72 20 64 69 73 74 61 6e   $dist or distan
10d40 63 65 20 3c 3d 20 24 64 69 73 74 20 2a 2f 0a 20  ce <= $dist */. 
10d50 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
10d60 28 31 36 7c 33 32 29 29 3d 3d 30 0a 20 20 20 20  (16|32))==0.    
10d70 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
10d80 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46  >iColumn==SPELLF
10d90 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e 43 45 0a  IX_COL_DISTANCE.
10da0 20 20 20 20 20 26 26 20 28 70 43 6f 6e 73 74 72       && (pConstr
10db0 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  aint->op==SQLITE
10dc0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10dd0 54 5f 4c 54 0a 20 20 20 20 20 20 20 20 20 20 7c  T_LT.          |
10de0 7c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  | pConstraint->o
10df0 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
10e00 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 29 0a 20  CONSTRAINT_LE). 
10e10 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61     ){.      iPla
10e20 6e 20 7c 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74  n |= pConstraint
10e30 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
10e40 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
10e50 20 3f 20 31 36 20 3a 20 33 32 3b 0a 20 20 20 20   ? 16 : 32;.    
10e60 20 20 69 44 69 73 74 54 65 72 6d 20 3d 20 69 3b    iDistTerm = i;
10e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10e80 20 69 50 6c 61 6e 26 31 20 29 7b 0a 20 20 20 20   iPlan&1 ){.    
10e90 69 6e 74 20 69 64 78 20 3d 20 32 3b 0a 20 20 20  int idx = 2;.   
10ea0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
10eb0 6d 20 3d 20 69 50 6c 61 6e 3b 0a 20 20 20 20 69  m = iPlan;.    i
10ec0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  f( pIdxInfo->nOr
10ed0 64 65 72 42 79 3d 3d 31 0a 20 20 20 20 20 26 26  derBy==1.     &&
10ee0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65   pIdxInfo->aOrde
10ef0 72 42 79 5b 30 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d  rBy[0].iColumn==
10f00 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f  SPELLFIX_COL_SCO
10f10 52 45 0a 20 20 20 20 20 26 26 20 70 49 64 78 49  RE.     && pIdxI
10f20 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d  nfo->aOrderBy[0]
10f30 2e 64 65 73 63 3d 3d 30 0a 20 20 20 20 29 7b 0a  .desc==0.    ){.
10f40 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
10f50 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
10f60 3d 20 31 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  = 1;  /* Default
10f70 20 6f 72 64 65 72 20 62 79 20 69 53 63 6f 72 65   order by iScore
10f80 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
10f90 28 20 69 50 6c 61 6e 26 32 20 29 7b 0a 20 20 20  ( iPlan&2 ){.   
10fa0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
10fb0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 4c  nstraintUsage[iL
10fc0 61 6e 67 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64  angTerm].argvInd
10fd0 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20  ex = idx++;.    
10fe0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
10ff0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 4c 61  straintUsage[iLa
11000 6e 67 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31  ngTerm].omit = 1
11010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11020 69 50 6c 61 6e 26 34 20 29 7b 0a 20 20 20 20 20  iPlan&4 ){.     
11030 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
11040 74 72 61 69 6e 74 55 73 61 67 65 5b 69 54 6f 70  traintUsage[iTop
11050 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20  Term].argvIndex 
11060 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70  = idx++;.      p
11070 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
11080 61 69 6e 74 55 73 61 67 65 5b 69 54 6f 70 54 65  aintUsage[iTopTe
11090 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  rm].omit = 1;.  
110a0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c 61    }.    if( iPla
110b0 6e 26 38 20 29 7b 0a 20 20 20 20 20 20 70 49 64  n&8 ){.      pId
110c0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
110d0 6e 74 55 73 61 67 65 5b 69 53 63 6f 70 65 54 65  ntUsage[iScopeTe
110e0 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  rm].argvIndex = 
110f0 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64  idx++;.      pId
11100 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
11110 6e 74 55 73 61 67 65 5b 69 53 63 6f 70 65 54 65  ntUsage[iScopeTe
11120 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  rm].omit = 1;.  
11130 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c 61    }.    if( iPla
11140 6e 26 28 31 36 7c 33 32 29 20 29 7b 0a 20 20 20  n&(16|32) ){.   
11150 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
11160 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 44  nstraintUsage[iD
11170 69 73 74 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64  istTerm].argvInd
11180 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20  ex = idx++;.    
11190 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
111a0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 44 69  straintUsage[iDi
111b0 73 74 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31  stTerm].omit = 1
111c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78  ;.    }.    pIdx
111d0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
111e0 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 30  ost = (double)10
111f0 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  000;.  }else{.  
11200 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
11210 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
11220 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
11230 6f 73 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 30  ost = (double)10
11240 30 30 30 30 30 30 3b 0a 20 20 7d 0a 20 20 72 65  000000;.  }.  re
11250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11260 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
11270 6e 65 77 20 66 75 7a 7a 79 2d 73 65 61 72 63 68  new fuzzy-search
11280 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
11290 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
112a0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  Open(sqlite3_vta
112b0 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65  b *pVTab, sqlite
112c0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
112d0 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 73 70 65  ppCursor){.  spe
112e0 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d  llfix1_vtab *p =
112f0 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62   (spellfix1_vtab
11300 2a 29 70 56 54 61 62 3b 0a 20 20 73 70 65 6c 6c  *)pVTab;.  spell
11310 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75  fix1_cursor *pCu
11320 72 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69  r;.  pCur = sqli
11330 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
11340 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69  of(*pCur) );.  i
11350 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72 65 74  f( pCur==0 ) ret
11360 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
11370 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2c  ;.  memset(pCur,
11380 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72   0, sizeof(*pCur
11390 29 29 3b 0a 20 20 70 43 75 72 2d 3e 70 56 54 61  ));.  pCur->pVTa
113a0 62 20 3d 20 70 3b 0a 20 20 2a 70 70 43 75 72 73  b = p;.  *ppCurs
113b0 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65  or = &pCur->base
113c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
113d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
113e0 64 6a 75 73 74 20 61 20 64 69 73 74 61 6e 63 65  djust a distance
113f0 20 6d 65 61 73 75 72 65 6d 65 6e 74 20 62 79 20   measurement by 
11400 74 68 65 20 77 6f 72 64 73 20 72 61 6e 6b 20 69  the words rank i
11410 6e 20 6f 72 64 65 72 20 74 6f 20 73 68 6f 77 0a  n order to show.
11420 2a 2a 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f  ** preference to
11430 20 63 6f 6d 6d 6f 6e 20 77 6f 72 64 73 2e 0a 2a   common words..*
11440 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
11450 6c 6c 66 69 78 31 53 63 6f 72 65 28 69 6e 74 20  llfix1Score(int 
11460 69 44 69 73 74 61 6e 63 65 2c 20 69 6e 74 20 69  iDistance, int i
11470 52 61 6e 6b 29 7b 0a 20 20 69 6e 74 20 69 4c 6f  Rank){.  int iLo
11480 67 32 3b 0a 20 20 66 6f 72 28 69 4c 6f 67 32 3d  g2;.  for(iLog2=
11490 30 3b 20 69 52 61 6e 6b 3e 30 3b 20 69 4c 6f 67  0; iRank>0; iLog
114a0 32 2b 2b 2c 20 69 52 61 6e 6b 3e 3e 3d 31 29 7b  2++, iRank>>=1){
114b0 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 69 73 74  }.  return iDist
114c0 61 6e 63 65 20 2b 20 33 32 20 2d 20 69 4c 6f 67  ance + 32 - iLog
114d0 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  2;.}../*.** Comp
114e0 61 72 65 20 74 77 6f 20 73 70 65 6c 6c 66 69 78  are two spellfix
114f0 31 5f 72 6f 77 20 6f 62 6a 65 63 74 73 20 66 6f  1_row objects fo
11500 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  r sorting purpos
11510 65 73 20 69 6e 20 71 73 6f 72 74 28 29 20 73 75  es in qsort() su
11520 63 68 0a 2a 2a 20 74 68 61 74 20 74 68 65 79 20  ch.** that they 
11530 73 6f 72 74 20 69 6e 20 6f 72 64 65 72 20 6f 66  sort in order of
11540 20 69 6e 63 72 65 61 73 69 6e 67 20 64 69 73 74   increasing dist
11550 61 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ance..*/.static 
11560 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 6f 77  int spellfix1Row
11570 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f  Compare(const vo
11580 69 64 20 2a 41 2c 20 63 6f 6e 73 74 20 76 6f 69  id *A, const voi
11590 64 20 2a 42 29 7b 0a 20 20 63 6f 6e 73 74 20 73  d *B){.  const s
115a0 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f  truct spellfix1_
115b0 72 6f 77 20 2a 61 20 3d 20 28 63 6f 6e 73 74 20  row *a = (const 
115c0 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31  struct spellfix1
115d0 5f 72 6f 77 2a 29 41 3b 0a 20 20 63 6f 6e 73 74  _row*)A;.  const
115e0 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78   struct spellfix
115f0 31 5f 72 6f 77 20 2a 62 20 3d 20 28 63 6f 6e 73  1_row *b = (cons
11600 74 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69  t struct spellfi
11610 78 31 5f 72 6f 77 2a 29 42 3b 0a 20 20 72 65 74  x1_row*)B;.  ret
11620 75 72 6e 20 61 2d 3e 69 53 63 6f 72 65 20 2d 20  urn a->iScore - 
11630 62 2d 3e 69 53 63 6f 72 65 3b 0a 7d 0a 0a 2f 2a  b->iScore;.}../*
11640 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20  .** A structure 
11650 75 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66  used to pass inf
11660 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 73 70  ormation from sp
11670 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72  ellfix1FilterFor
11680 4d 61 74 63 68 28 29 0a 2a 2a 20 69 6e 74 6f 20  Match().** into 
11690 73 70 65 6c 6c 66 69 78 31 52 75 6e 51 75 65 72  spellfix1RunQuer
116a0 79 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  y()..*/.typedef 
116b0 73 74 72 75 63 74 20 4d 61 74 63 68 51 75 65 72  struct MatchQuer
116c0 79 20 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  y {.  spellfix1_
116d0 63 75 72 73 6f 72 20 2a 70 43 75 72 3b 20 20 20  cursor *pCur;   
116e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
116f0 72 73 6f 72 20 62 65 69 6e 67 20 71 75 65 72 69  rsor being queri
11700 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
11710 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
11720 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 64           /* shad
11730 6f 77 20 74 61 62 6c 65 20 71 75 65 72 79 20 73  ow table query s
11740 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61  tatment */.  cha
11750 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46 49 58  r zHash[SPELLFIX
11760 5f 4d 58 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a  _MX_HASH];    /*
11770 20 54 68 65 20 63 75 72 72 65 6e 74 20 70 68 6f   The current pho
11780 6e 65 68 61 73 68 20 66 6f 72 20 7a 50 61 74 74  nehash for zPatt
11790 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ern */.  const c
117a0 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20  har *zPattern;  
117b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
117c0 6e 73 6c 69 74 65 72 61 74 65 64 20 69 6e 70 75  nsliterated inpu
117d0 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  t string */.  in
117e0 74 20 6e 50 61 74 74 65 72 6e 3b 20 20 20 20 20  t nPattern;     
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11800 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 50 61 74  * Length of zPat
11810 74 65 72 6e 20 2a 2f 0a 20 20 45 64 69 74 44 69  tern */.  EditDi
11820 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70  st3FromString *p
11830 4d 61 74 63 68 53 74 72 33 3b 20 2f 2a 20 4f 72  MatchStr3; /* Or
11840 69 67 69 6e 61 6c 20 75 6e 69 63 6f 64 65 20 73  iginal unicode s
11850 74 72 69 6e 67 20 2a 2f 0a 20 20 45 64 69 74 44  tring */.  EditD
11860 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  ist3Config *pCon
11870 66 69 67 33 3b 20 20 20 20 20 20 20 2f 2a 20 45  fig3;       /* E
11880 64 69 74 2d 64 69 73 74 61 6e 63 65 20 63 6f 73  dit-distance cos
11890 74 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20 2a  t coefficients *
118a0 2f 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69  /.  const EditDi
118b0 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 3b 20  st3Lang *pLang; 
118c0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65       /* The sele
118d0 63 74 65 64 20 6c 61 6e 67 75 61 67 65 20 63 6f  cted language co
118e0 65 66 66 69 63 69 65 6e 74 73 20 2a 2f 0a 20 20  efficients */.  
118f0 69 6e 74 20 69 4c 61 6e 67 3b 20 20 20 20 20 20  int iLang;      
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 2f 2a 20 54 68 65 20 6c 61 6e 67 75 61 67 65   /* The language
11920 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63   id */.  int iSc
11930 6f 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ope;            
11940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66            /* Def
11950 61 75 6c 74 20 73 63 6f 70 65 20 2a 2f 0a 20 20  ault scope */.  
11960 69 6e 74 20 69 4d 61 78 44 69 73 74 3b 20 20 20  int iMaxDist;   
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
11990 77 65 64 20 65 64 69 74 20 64 69 73 74 61 6e 63  wed edit distanc
119a0 65 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 69 6e  e, or -1 */.  in
119b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
119d0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  * Error code */.
119e0 20 20 69 6e 74 20 6e 52 75 6e 3b 20 20 20 20 20    int nRun;     
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a00 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20  Number of prior 
11a10 72 75 6e 73 20 66 6f 72 20 74 68 65 20 73 61 6d  runs for the sam
11a20 65 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20  e zPattern */.  
11a30 63 68 61 72 20 61 7a 50 72 69 6f 72 5b 53 50 45  char azPrior[SPE
11a40 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 5d 5b 53 50  LLFIX_MX_RUN][SP
11a50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b  ELLFIX_MX_HASH];
11a60 20 20 2f 2a 20 50 72 69 6f 72 20 68 61 73 68 65    /* Prior hashe
11a70 73 20 2a 2f 0a 7d 20 4d 61 74 63 68 51 75 65 72  s */.} MatchQuer
11a80 79 3b 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  y;../*.** Run a 
11a90 71 75 65 72 79 20 6c 6f 6f 6b 69 6e 67 20 66 6f  query looking fo
11aa0 72 20 74 68 65 20 62 65 73 74 20 6d 61 74 63 68  r the best match
11ab0 65 73 20 61 67 61 69 6e 73 74 20 7a 50 61 74 74  es against zPatt
11ac0 65 72 6e 20 75 73 69 6e 67 0a 2a 2a 20 7a 48 61  ern using.** zHa
11ad0 73 68 20 61 73 20 74 68 65 20 63 68 61 72 61 63  sh as the charac
11ae0 74 65 72 20 63 6c 61 73 73 20 73 65 65 64 20 68  ter class seed h
11af0 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ash..*/.static v
11b00 6f 69 64 20 73 70 65 6c 6c 66 69 78 31 52 75 6e  oid spellfix1Run
11b10 51 75 65 72 79 28 4d 61 74 63 68 51 75 65 72 79  Query(MatchQuery
11b20 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
11b30 2a 7a 51 75 65 72 79 2c 20 69 6e 74 20 6e 51 75  *zQuery, int nQu
11b40 65 72 79 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ery){.  const ch
11b50 61 72 20 2a 7a 4b 31 3b 0a 20 20 63 6f 6e 73 74  ar *zK1;.  const
11b60 20 63 68 61 72 20 2a 7a 57 6f 72 64 3b 0a 20 20   char *zWord;.  
11b70 69 6e 74 20 69 44 69 73 74 3b 0a 20 20 69 6e 74  int iDist;.  int
11b80 20 69 52 61 6e 6b 3b 0a 20 20 69 6e 74 20 69 53   iRank;.  int iS
11b90 63 6f 72 65 3b 0a 20 20 69 6e 74 20 69 57 6f 72  core;.  int iWor
11ba0 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 64  st = 0;.  int id
11bb0 78 3b 0a 20 20 69 6e 74 20 69 64 78 57 6f 72 73  x;.  int idxWors
11bc0 74 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 3b  t = -1;.  int i;
11bd0 0a 20 20 69 6e 74 20 69 53 63 6f 70 65 20 3d 20  .  int iScope = 
11be0 70 2d 3e 69 53 63 6f 70 65 3b 0a 20 20 73 70 65  p->iScope;.  spe
11bf0 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70  llfix1_cursor *p
11c00 43 75 72 20 3d 20 70 2d 3e 70 43 75 72 3b 0a 20  Cur = p->pCur;. 
11c10 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
11c20 53 74 6d 74 20 3d 20 70 2d 3e 70 53 74 6d 74 3b  Stmt = p->pStmt;
11c30 0a 20 20 63 68 61 72 20 7a 48 61 73 68 31 5b 53  .  char zHash1[S
11c40 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d  PELLFIX_MX_HASH]
11c50 3b 0a 20 20 63 68 61 72 20 7a 48 61 73 68 32 5b  ;.  char zHash2[
11c60 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48  SPELLFIX_MX_HASH
11c70 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6c 61 73  ];.  char *zClas
11c80 73 3b 0a 20 20 69 6e 74 20 6e 43 6c 61 73 73 3b  s;.  int nClass;
11c90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
11ca0 28 20 70 43 75 72 2d 3e 61 3d 3d 30 20 7c 7c 20  ( pCur->a==0 || 
11cb0 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 20  p->rc ) return; 
11cc0 20 20 2f 2a 20 50 72 69 6f 72 20 6d 65 6d 6f 72    /* Prior memor
11cd0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
11ce0 6c 75 72 65 20 2a 2f 0a 20 20 7a 43 6c 61 73 73  lure */.  zClass
11cf0 20 3d 20 28 63 68 61 72 2a 29 70 68 6f 6e 65 74   = (char*)phonet
11d00 69 63 48 61 73 68 28 28 75 6e 73 69 67 6e 65 64  icHash((unsigned
11d10 20 63 68 61 72 2a 29 7a 51 75 65 72 79 2c 20 6e   char*)zQuery, n
11d20 51 75 65 72 79 29 3b 0a 20 20 69 66 28 20 7a 43  Query);.  if( zC
11d30 6c 61 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 70  lass==0 ){.    p
11d40 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
11d50 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  MEM;.    return;
11d60 0a 20 20 7d 0a 20 20 6e 43 6c 61 73 73 20 3d 20  .  }.  nClass = 
11d70 73 74 72 6c 65 6e 28 7a 43 6c 61 73 73 29 3b 0a  strlen(zClass);.
11d80 20 20 69 66 28 20 6e 43 6c 61 73 73 3e 53 50 45    if( nClass>SPE
11d90 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 20  LLFIX_MX_HASH-2 
11da0 29 7b 0a 20 20 20 20 6e 43 6c 61 73 73 20 3d 20  ){.    nClass = 
11db0 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48  SPELLFIX_MX_HASH
11dc0 2d 32 3b 0a 20 20 20 20 7a 43 6c 61 73 73 5b 6e  -2;.    zClass[n
11dd0 43 6c 61 73 73 5d 20 3d 20 30 3b 0a 20 20 7d 0a  Class] = 0;.  }.
11de0 20 20 69 66 28 20 6e 43 6c 61 73 73 3c 3d 69 53    if( nClass<=iS
11df0 63 6f 70 65 20 29 7b 0a 20 20 20 20 69 66 28 20  cope ){.    if( 
11e00 6e 43 6c 61 73 73 3e 32 20 29 7b 0a 20 20 20 20  nClass>2 ){.    
11e10 20 20 69 53 63 6f 70 65 20 3d 20 6e 43 6c 61 73    iScope = nClas
11e20 73 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s-1;.    }else{.
11e30 20 20 20 20 20 20 69 53 63 6f 70 65 20 3d 20 6e        iScope = n
11e40 43 6c 61 73 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  Class;.    }.  }
11e50 0a 20 20 6d 65 6d 63 70 79 28 7a 48 61 73 68 31  .  memcpy(zHash1
11e60 2c 20 7a 43 6c 61 73 73 2c 20 69 53 63 6f 70 65  , zClass, iScope
11e70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
11e80 65 28 7a 43 6c 61 73 73 29 3b 0a 20 20 7a 48 61  e(zClass);.  zHa
11e90 73 68 31 5b 69 53 63 6f 70 65 5d 20 3d 20 30 3b  sh1[iScope] = 0;
11ea0 0a 20 20 6d 65 6d 63 70 79 28 7a 48 61 73 68 32  .  memcpy(zHash2
11eb0 2c 20 7a 48 61 73 68 31 2c 20 69 53 63 6f 70 65  , zHash1, iScope
11ec0 29 3b 0a 20 20 7a 48 61 73 68 32 5b 69 53 63 6f  );.  zHash2[iSco
11ed0 70 65 5d 20 3d 20 27 5a 27 3b 0a 20 20 7a 48 61  pe] = 'Z';.  zHa
11ee0 73 68 32 5b 69 53 63 6f 70 65 2b 31 5d 20 3d 20  sh2[iScope+1] = 
11ef0 30 3b 0a 23 69 66 20 53 50 45 4c 4c 46 49 58 5f  0;.#if SPELLFIX_
11f00 4d 58 5f 52 55 4e 3e 31 0a 20 20 66 6f 72 28 69  MX_RUN>1.  for(i
11f10 3d 30 3b 20 69 3c 70 2d 3e 6e 52 75 6e 3b 20 69  =0; i<p->nRun; i
11f20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
11f30 63 6d 70 28 70 2d 3e 61 7a 50 72 69 6f 72 5b 69  cmp(p->azPrior[i
11f40 5d 2c 20 7a 48 61 73 68 31 29 3d 3d 30 20 29 20  ], zHash1)==0 ) 
11f50 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
11f60 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  if.  assert( p->
11f70 6e 52 75 6e 3c 53 50 45 4c 4c 46 49 58 5f 4d 58  nRun<SPELLFIX_MX
11f80 5f 52 55 4e 20 29 3b 0a 20 20 6d 65 6d 63 70 79  _RUN );.  memcpy
11f90 28 70 2d 3e 61 7a 50 72 69 6f 72 5b 70 2d 3e 6e  (p->azPrior[p->n
11fa0 52 75 6e 2b 2b 5d 2c 20 7a 48 61 73 68 31 2c 20  Run++], zHash1, 
11fb0 69 53 63 6f 70 65 2b 31 29 3b 0a 20 20 69 66 28  iScope+1);.  if(
11fc0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
11fd0 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 48 61  xt(pStmt, 1, zHa
11fe0 73 68 31 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  sh1, -1, SQLITE_
11ff0 53 54 41 54 49 43 29 3d 3d 53 51 4c 49 54 45 5f  STATIC)==SQLITE_
12000 4e 4f 4d 45 4d 0a 20 20 20 7c 7c 20 73 71 6c 69  NOMEM.   || sqli
12010 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
12020 74 6d 74 2c 20 32 2c 20 7a 48 61 73 68 32 2c 20  tmt, 2, zHash2, 
12030 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
12040 43 29 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  C)==SQLITE_NOMEM
12050 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  .  ){.    p->rc 
12060 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
12070 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
12080 23 69 66 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  #if SPELLFIX_MX_
12090 52 55 4e 3e 31 0a 20 20 66 6f 72 28 69 3d 30 3b  RUN>1.  for(i=0;
120a0 20 69 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20 69   i<pCur->nRow; i
120b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ++){.    if( pCu
120c0 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72 65 3e 69  r->a[i].iScore>i
120d0 57 6f 72 73 74 20 29 7b 0a 20 20 20 20 20 20 69  Worst ){.      i
120e0 57 6f 72 73 74 20 3d 20 70 43 75 72 2d 3e 61 5b  Worst = pCur->a[
120f0 69 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20 20 20  i].iScore;.     
12100 20 69 64 78 57 6f 72 73 74 20 3d 20 69 3b 0a 20   idxWorst = i;. 
12110 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
12120 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
12130 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
12140 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
12150 69 6e 74 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20  int iMatchlen = 
12160 2d 31 3b 0a 20 20 20 20 69 52 61 6e 6b 20 3d 20  -1;.    iRank = 
12170 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
12180 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20  nt(pStmt, 2);.  
12190 20 20 69 66 28 20 70 2d 3e 70 4d 61 74 63 68 53    if( p->pMatchS
121a0 74 72 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  tr3 ){.      int
121b0 20 6e 57 6f 72 64 20 3d 20 73 71 6c 69 74 65 33   nWord = sqlite3
121c0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
121d0 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a  tmt, 1);.      z
121e0 57 6f 72 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  Word = (const ch
121f0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
12200 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
12210 29 3b 0a 20 20 20 20 20 20 69 44 69 73 74 20 3d  );.      iDist =
12220 20 65 64 69 74 44 69 73 74 33 43 6f 72 65 28 70   editDist3Core(p
12230 2d 3e 70 4d 61 74 63 68 53 74 72 33 2c 20 7a 57  ->pMatchStr3, zW
12240 6f 72 64 2c 20 6e 57 6f 72 64 2c 20 70 2d 3e 70  ord, nWord, p->p
12250 4c 61 6e 67 2c 20 26 69 4d 61 74 63 68 6c 65 6e  Lang, &iMatchlen
12260 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12270 20 20 20 20 7a 4b 31 20 3d 20 28 63 6f 6e 73 74      zK1 = (const
12280 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
12290 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
122a0 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 3);.      if( 
122b0 7a 4b 31 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  zK1==0 ) continu
122c0 65 3b 0a 20 20 20 20 20 20 69 44 69 73 74 20 3d  e;.      iDist =
122d0 20 65 64 69 74 64 69 73 74 31 28 70 2d 3e 7a 50   editdist1(p->zP
122e0 61 74 74 65 72 6e 2c 20 7a 4b 31 2c 20 30 29 3b  attern, zK1, 0);
122f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
12300 44 69 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Dist<0 ){.      
12310 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
12320 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 62 72 65 61  OMEM;.      brea
12330 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  k;.    }.    pCu
12340 72 2d 3e 6e 53 65 61 72 63 68 2b 2b 3b 0a 20 20  r->nSearch++;.  
12350 20 20 69 53 63 6f 72 65 20 3d 20 73 70 65 6c 6c    iScore = spell
12360 66 69 78 31 53 63 6f 72 65 28 69 44 69 73 74 2c  fix1Score(iDist,
12370 69 52 61 6e 6b 29 3b 0a 20 20 20 20 69 66 28 20  iRank);.    if( 
12380 70 2d 3e 69 4d 61 78 44 69 73 74 3e 3d 30 20 29  p->iMaxDist>=0 )
12390 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44 69 73  {.      if( iDis
123a0 74 3e 70 2d 3e 69 4d 61 78 44 69 73 74 20 29 20  t>p->iMaxDist ) 
123b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
123c0 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3e 3d  if( pCur->nRow>=
123d0 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 2d 31 20 29  pCur->nAlloc-1 )
123e0 7b 0a 20 20 20 20 20 20 20 20 73 70 65 6c 6c 66  {.        spellf
123f0 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28  ix1ResizeCursor(
12400 70 43 75 72 2c 20 70 43 75 72 2d 3e 6e 41 6c 6c  pCur, pCur->nAll
12410 6f 63 2a 32 20 2b 20 31 30 29 3b 0a 20 20 20 20  oc*2 + 10);.    
12420 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 3d      if( pCur->a=
12430 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12440 20 20 7d 0a 20 20 20 20 20 20 69 64 78 20 3d 20    }.      idx = 
12450 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20  pCur->nRow;.    
12460 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
12470 6e 52 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c 6c 6f  nRow<pCur->nAllo
12480 63 20 29 7b 0a 20 20 20 20 20 20 69 64 78 20 3d  c ){.      idx =
12490 20 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20   pCur->nRow;.   
124a0 20 7d 65 6c 73 65 20 69 66 28 20 69 53 63 6f 72   }else if( iScor
124b0 65 3c 69 57 6f 72 73 74 20 29 7b 0a 20 20 20 20  e<iWorst ){.    
124c0 20 20 69 64 78 20 3d 20 69 64 78 57 6f 72 73 74    idx = idxWorst
124d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
124e0 66 72 65 65 28 70 43 75 72 2d 3e 61 5b 69 64 78  free(pCur->a[idx
124f0 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20 20 20 7d 65  ].zWord);.    }e
12500 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  lse{.      conti
12510 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
12520 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72  Cur->a[idx].zWor
12530 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  d = sqlite3_mpri
12540 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
12550 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
12560 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66  tmt, 1));.    if
12570 28 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a  ( pCur->a[idx].z
12580 57 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Word==0 ){.     
12590 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
125a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 62 72 65  NOMEM;.      bre
125b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ak;.    }.    pC
125c0 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 52 6f 77 69  ur->a[idx].iRowi
125d0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
125e0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
125f0 30 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b  0);.    pCur->a[
12600 69 64 78 5d 2e 69 52 61 6e 6b 20 3d 20 69 52 61  idx].iRank = iRa
12610 6e 6b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b  nk;.    pCur->a[
12620 69 64 78 5d 2e 69 44 69 73 74 61 6e 63 65 20 3d  idx].iDistance =
12630 20 69 44 69 73 74 3b 0a 20 20 20 20 70 43 75 72   iDist;.    pCur
12640 2d 3e 61 5b 69 64 78 5d 2e 69 53 63 6f 72 65 20  ->a[idx].iScore 
12650 3d 20 69 53 63 6f 72 65 3b 0a 20 20 20 20 70 43  = iScore;.    pC
12660 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 4d 61 74 63  ur->a[idx].iMatc
12670 68 6c 65 6e 20 3d 20 69 4d 61 74 63 68 6c 65 6e  hlen = iMatchlen
12680 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 75  ;.    memcpy(pCu
12690 72 2d 3e 61 5b 69 64 78 5d 2e 7a 48 61 73 68 2c  r->a[idx].zHash,
126a0 20 7a 48 61 73 68 31 2c 20 69 53 63 6f 70 65 2b   zHash1, iScope+
126b0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  1);.    if( pCur
126c0 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c  ->nRow<pCur->nAl
126d0 6c 6f 63 20 29 20 70 43 75 72 2d 3e 6e 52 6f 77  loc ) pCur->nRow
126e0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  ++;.    if( pCur
126f0 2d 3e 6e 52 6f 77 3d 3d 70 43 75 72 2d 3e 6e 41  ->nRow==pCur->nA
12700 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 57  lloc ){.      iW
12710 6f 72 73 74 20 3d 20 70 43 75 72 2d 3e 61 5b 30  orst = pCur->a[0
12720 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20  ].iScore;.      
12730 69 64 78 57 6f 72 73 74 20 3d 20 30 3b 0a 20 20  idxWorst = 0;.  
12740 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
12750 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b  Cur->nRow; i++){
12760 0a 20 20 20 20 20 20 20 20 69 53 63 6f 72 65 20  .        iScore 
12770 3d 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69 53 63  = pCur->a[i].iSc
12780 6f 72 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ore;.        if(
12790 20 69 57 6f 72 73 74 3c 69 53 63 6f 72 65 20 29   iWorst<iScore )
127a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 57 6f 72  {.          iWor
127b0 73 74 20 3d 20 69 53 63 6f 72 65 3b 0a 20 20 20  st = iScore;.   
127c0 20 20 20 20 20 20 20 69 64 78 57 6f 72 73 74 20         idxWorst 
127d0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = i;.        }. 
127e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
127f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
12800 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
12810 69 66 28 20 72 63 20 29 20 70 2d 3e 72 63 20 3d  if( rc ) p->rc =
12820 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
12830 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  is version of th
12840 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  e xFilter method
12850 20 77 6f 72 6b 20 69 66 20 74 68 65 20 4d 41 54   work if the MAT
12860 43 48 20 74 65 72 6d 20 69 73 20 70 72 65 73 65  CH term is prese
12870 6e 74 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  nt.** and we are
12880 20 64 6f 69 6e 67 20 61 20 73 63 61 6e 2e 0a 2a   doing a scan..*
12890 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
128a0 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d  llfix1FilterForM
128b0 61 74 63 68 28 0a 20 20 73 70 65 6c 6c 66 69 78  atch(.  spellfix
128c0 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a  1_cursor *pCur,.
128d0 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 0a 20 20    int idxNum,.  
128e0 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
128f0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
12900 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
12910 67 6e 65 64 20 63 68 61 72 20 2a 7a 4d 61 74 63  gned char *zMatc
12920 68 54 68 69 73 3b 20 20 20 2f 2a 20 52 48 53 20  hThis;   /* RHS 
12930 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65  of the MATCH ope
12940 72 61 74 6f 72 20 2a 2f 0a 20 20 45 64 69 74 44  rator */.  EditD
12950 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a  ist3FromString *
12960 70 4d 61 74 63 68 53 74 72 33 20 3d 20 30 3b 20  pMatchStr3 = 0; 
12970 2f 2a 20 7a 4d 61 74 63 68 54 68 69 73 20 61 73  /* zMatchThis as
12980 20 61 6e 20 65 64 69 74 64 69 73 74 20 73 74 72   an editdist str
12990 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ing */.  char *z
129a0 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20  Pattern;        
129b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
129c0 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 6f  ransliteration o
129d0 66 20 7a 4d 61 74 63 68 54 68 69 73 20 2a 2f 0a  f zMatchThis */.
129e0 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20    int nPattern; 
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
12a10 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20  f zPattern */.  
12a20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 32 30 3b  int iLimit = 20;
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72     /* Max number
12a50 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70   of rows of outp
12a60 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63 6f  ut */.  int iSco
12a70 70 65 20 3d 20 33 3b 20 20 20 20 20 20 20 20 20  pe = 3;         
12a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
12a90 65 20 74 68 69 73 20 6d 61 6e 79 20 63 68 61 72  e this many char
12aa0 61 63 74 65 72 73 20 6f 66 20 7a 43 6c 61 73 73  acters of zClass
12ab0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 20   */.  int iLang 
12ac0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67           /* Lang
12ae0 75 61 67 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63  uage code */.  c
12af0 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b10 20 20 2f 2a 20 53 51 4c 20 6f 66 20 73 68 61 64    /* SQL of shad
12b20 6f 77 20 74 61 62 6c 65 20 71 75 65 72 79 20 2a  ow table query *
12b30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
12b40 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20   *pStmt = 0;    
12b50 20 20 20 20 20 20 20 2f 2a 20 53 68 61 64 6f 77         /* Shadow
12b60 20 74 61 62 6c 65 20 71 75 65 72 79 20 2a 2f 0a   table query */.
12b70 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b90 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
12ba0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ode */.  int idx
12bb0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12bd0 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 66 69  ext available fi
12be0 6c 74 65 72 20 70 61 72 61 6d 65 74 65 72 20 2a  lter parameter *
12bf0 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  /.  spellfix1_vt
12c00 61 62 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 56  ab *p = pCur->pV
12c10 54 61 62 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  Tab;   /* The vi
12c20 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
12c30 20 6f 77 6e 73 20 70 43 75 72 20 2a 2f 0a 20 20   owns pCur */.  
12c40 4d 61 74 63 68 51 75 65 72 79 20 78 3b 20 20 20  MatchQuery x;   
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 20 2f 2a 20 46 6f 72 20 70 61 73 73 69 6e     /* For passin
12c70 67 20 69 6e 66 6f 20 74 6f 20 52 75 6e 51 75 65  g info to RunQue
12c80 72 79 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f  ry() */..  /* Lo
12c90 61 64 20 74 68 65 20 63 6f 73 74 20 74 61 62 6c  ad the cost tabl
12ca0 65 20 69 66 20 77 65 20 68 61 76 65 20 6e 6f 74  e if we have not
12cb0 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 73 6f   already done so
12cc0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f   */.  if( p->zCo
12cd0 73 74 54 61 62 6c 65 21 3d 30 20 26 26 20 70 2d  stTable!=0 && p-
12ce0 3e 70 43 6f 6e 66 69 67 33 3d 3d 30 20 29 7b 0a  >pConfig3==0 ){.
12cf0 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20      p->pConfig3 
12d00 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
12d10 28 20 73 69 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e  ( sizeof(p->pCon
12d20 66 69 67 33 5b 30 5d 29 20 29 3b 0a 20 20 20 20  fig3[0]) );.    
12d30 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 33 3d  if( p->pConfig3=
12d40 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
12d50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
12d60 6d 73 65 74 28 70 2d 3e 70 43 6f 6e 66 69 67 33  mset(p->pConfig3
12d70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 70  , 0, sizeof(p->p
12d80 43 6f 6e 66 69 67 33 5b 30 5d 29 29 3b 0a 20 20  Config3[0]));.  
12d90 20 20 72 63 20 3d 20 65 64 69 74 44 69 73 74 33    rc = editDist3
12da0 43 6f 6e 66 69 67 4c 6f 61 64 28 70 2d 3e 70 43  ConfigLoad(p->pC
12db0 6f 6e 66 69 67 33 2c 20 70 2d 3e 64 62 2c 20 70  onfig3, p->db, p
12dc0 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20  ->zCostTable);. 
12dd0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
12de0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6d 65 6d  rn rc;.  }.  mem
12df0 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f  set(&x, 0, sizeo
12e00 66 28 78 29 29 3b 0a 20 20 78 2e 69 53 63 6f 70  f(x));.  x.iScop
12e10 65 20 3d 20 33 3b 20 20 2f 2a 20 44 65 66 61 75  e = 3;  /* Defau
12e20 6c 74 20 73 63 6f 70 65 20 69 66 20 6e 6f 6e 65  lt scope if none
12e30 20 73 70 65 63 69 66 69 65 64 20 62 79 20 22 57   specified by "W
12e40 48 45 52 45 20 73 63 6f 70 65 3d 4e 22 20 2a 2f  HERE scope=N" */
12e50 0a 20 20 78 2e 69 4d 61 78 44 69 73 74 20 3d 20  .  x.iMaxDist = 
12e60 2d 31 3b 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  -1;   /* Maximum
12e70 20 61 6c 6c 6f 77 65 64 20 65 64 69 74 20 64 69   allowed edit di
12e80 73 74 61 6e 63 65 20 2a 2f 0a 0a 20 20 69 66 28  stance */..  if(
12e90 20 69 64 78 4e 75 6d 26 32 20 29 7b 0a 20 20 20   idxNum&2 ){.   
12ea0 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74 65 33   iLang = sqlite3
12eb0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
12ec0 69 64 78 2b 2b 5d 29 3b 0a 20 20 7d 0a 20 20 69  idx++]);.  }.  i
12ed0 66 28 20 69 64 78 4e 75 6d 26 34 20 29 7b 0a 20  f( idxNum&4 ){. 
12ee0 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69     iLimit = sqli
12ef0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
12f00 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 20 20  gv[idx++]);.    
12f10 69 66 28 20 69 4c 69 6d 69 74 3c 31 20 29 20 69  if( iLimit<1 ) i
12f20 4c 69 6d 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  Limit = 1;.  }. 
12f30 20 69 66 28 20 69 64 78 4e 75 6d 26 38 20 29 7b   if( idxNum&8 ){
12f40 0a 20 20 20 20 78 2e 69 53 63 6f 70 65 20 3d 20  .    x.iScope = 
12f50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
12f60 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a  t(argv[idx++]);.
12f70 20 20 20 20 69 66 28 20 78 2e 69 53 63 6f 70 65      if( x.iScope
12f80 3c 31 20 29 20 78 2e 69 53 63 6f 70 65 20 3d 20  <1 ) x.iScope = 
12f90 31 3b 0a 20 20 20 20 69 66 28 20 78 2e 69 53 63  1;.    if( x.iSc
12fa0 6f 70 65 3e 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  ope>SPELLFIX_MX_
12fb0 48 41 53 48 2d 32 20 29 20 78 2e 69 53 63 6f 70  HASH-2 ) x.iScop
12fc0 65 20 3d 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  e = SPELLFIX_MX_
12fd0 48 41 53 48 2d 32 3b 0a 20 20 7d 0a 20 20 69 66  HASH-2;.  }.  if
12fe0 28 20 69 64 78 4e 75 6d 26 28 31 36 7c 33 32 29  ( idxNum&(16|32)
12ff0 20 29 7b 0a 20 20 20 20 78 2e 69 4d 61 78 44 69   ){.    x.iMaxDi
13000 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  st = sqlite3_val
13010 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78 2b  ue_int(argv[idx+
13020 2b 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 64 78  +]);.    if( idx
13030 4e 75 6d 26 31 36 20 29 20 78 2e 69 4d 61 78 44  Num&16 ) x.iMaxD
13040 69 73 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 78  ist--;.    if( x
13050 2e 69 4d 61 78 44 69 73 74 3c 30 20 29 20 78 2e  .iMaxDist<0 ) x.
13060 69 4d 61 78 44 69 73 74 20 3d 20 30 3b 0a 20 20  iMaxDist = 0;.  
13070 7d 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73  }.  spellfix1Res
13080 65 74 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  etCursor(pCur);.
13090 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 69 7a    spellfix1Resiz
130a0 65 43 75 72 73 6f 72 28 70 43 75 72 2c 20 69 4c  eCursor(pCur, iL
130b0 69 6d 69 74 29 3b 0a 20 20 7a 4d 61 74 63 68 54  imit);.  zMatchT
130c0 68 69 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  his = sqlite3_va
130d0 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
130e0 29 3b 0a 20 20 69 66 28 20 7a 4d 61 74 63 68 54  );.  if( zMatchT
130f0 68 69 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  his==0 ) return 
13100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
13110 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 29 7b 0a   p->pConfig3 ){.
13120 20 20 20 20 78 2e 70 4c 61 6e 67 20 3d 20 65 64      x.pLang = ed
13130 69 74 44 69 73 74 33 46 69 6e 64 4c 61 6e 67 28  itDist3FindLang(
13140 70 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 69 4c 61  p->pConfig3, iLa
13150 6e 67 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 53  ng);.    pMatchS
13160 74 72 33 20 3d 20 65 64 69 74 44 69 73 74 33 46  tr3 = editDist3F
13170 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 78 2e 70  romStringNew(x.p
13180 4c 61 6e 67 2c 20 28 63 6f 6e 73 74 20 63 68 61  Lang, (const cha
13190 72 2a 29 7a 4d 61 74 63 68 54 68 69 73 2c 20 2d  r*)zMatchThis, -
131a0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61 74  1);.    if( pMat
131b0 63 68 53 74 72 33 3d 3d 30 20 29 7b 0a 20 20 20  chStr3==0 ){.   
131c0 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49 54 45     x.rc = SQLITE
131d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
131e0 74 6f 20 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a  to filter_exit;.
131f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
13200 20 20 20 78 2e 70 4c 61 6e 67 20 3d 20 30 3b 0a     x.pLang = 0;.
13210 20 20 7d 0a 20 20 7a 50 61 74 74 65 72 6e 20 3d    }.  zPattern =
13220 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c 69 74   (char*)translit
13230 65 72 61 74 65 28 7a 4d 61 74 63 68 54 68 69 73  erate(zMatchThis
13240 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
13250 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 29 3b  bytes(argv[0]));
13260 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13270 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b  pCur->zPattern);
13280 0a 20 20 70 43 75 72 2d 3e 7a 50 61 74 74 65 72  .  pCur->zPatter
13290 6e 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a 20 20  n = zPattern;.  
132a0 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20  if( zPattern==0 
132b0 29 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20 53 51  ){.    x.rc = SQ
132c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
132d0 67 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78 69 74  goto filter_exit
132e0 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 74 65 72 6e  ;.  }.  nPattern
132f0 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 74 65   = strlen(zPatte
13300 72 6e 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74  rn);.  if( zPatt
13310 65 72 6e 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3d  ern[nPattern-1]=
13320 3d 27 2a 27 20 29 20 6e 50 61 74 74 65 72 6e 2d  ='*' ) nPattern-
13330 2d 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  -;.  zSql = sqli
13340 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
13350 20 20 22 53 45 4c 45 43 54 20 69 64 2c 20 77 6f    "SELECT id, wo
13360 72 64 2c 20 72 61 6e 6b 2c 20 6b 31 22 0a 20 20  rd, rank, k1".  
13370 20 20 20 22 20 20 46 52 4f 4d 20 5c 22 25 77 5c     "  FROM \"%w\
13380 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22 0a  ".\"%w_vocab\"".
13390 20 20 20 20 20 22 20 57 48 45 52 45 20 6c 61 6e       " WHERE lan
133a0 67 69 64 3d 25 64 20 41 4e 44 20 6b 32 3e 3d 3f  gid=%d AND k2>=?
133b0 31 20 41 4e 44 20 6b 32 3c 3f 32 22 2c 0a 20 20  1 AND k2<?2",.  
133c0 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70     p->zDbName, p
133d0 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 69 4c  ->zTableName, iL
133e0 61 6e 67 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a  ang.  );.  if( z
133f0 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 78 2e  Sql==0 ){.    x.
13400 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13410 4d 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30  M;.    pStmt = 0
13420 3b 0a 20 20 20 20 67 6f 74 6f 20 66 69 6c 74 65  ;.    goto filte
13430 72 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 72 63  r_exit;.  }.  rc
13440 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
13450 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
13460 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
13470 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13480 65 28 7a 53 71 6c 29 3b 0a 20 20 70 43 75 72 2d  e(zSql);.  pCur-
13490 3e 69 4c 61 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a  >iLang = iLang;.
134a0 20 20 78 2e 70 43 75 72 20 3d 20 70 43 75 72 3b    x.pCur = pCur;
134b0 0a 20 20 78 2e 70 53 74 6d 74 20 3d 20 70 53 74  .  x.pStmt = pSt
134c0 6d 74 3b 0a 20 20 78 2e 7a 50 61 74 74 65 72 6e  mt;.  x.zPattern
134d0 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a 20 20 78   = zPattern;.  x
134e0 2e 6e 50 61 74 74 65 72 6e 20 3d 20 6e 50 61 74  .nPattern = nPat
134f0 74 65 72 6e 3b 0a 20 20 78 2e 70 4d 61 74 63 68  tern;.  x.pMatch
13500 53 74 72 33 20 3d 20 70 4d 61 74 63 68 53 74 72  Str3 = pMatchStr
13510 33 3b 0a 20 20 78 2e 69 4c 61 6e 67 20 3d 20 69  3;.  x.iLang = i
13520 4c 61 6e 67 3b 0a 20 20 78 2e 72 63 20 3d 20 72  Lang;.  x.rc = r
13530 63 3b 0a 20 20 78 2e 70 43 6f 6e 66 69 67 33 20  c;.  x.pConfig3 
13540 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 33 3b 0a 20  = p->pConfig3;. 
13550 20 69 66 28 20 78 2e 72 63 3d 3d 53 51 4c 49 54   if( x.rc==SQLIT
13560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 70 65 6c  E_OK ){.    spel
13570 6c 66 69 78 31 52 75 6e 51 75 65 72 79 28 26 78  lfix1RunQuery(&x
13580 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61 74  , zPattern, nPat
13590 74 65 72 6e 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  tern);.  }..  if
135a0 28 20 70 43 75 72 2d 3e 61 20 29 7b 0a 20 20 20  ( pCur->a ){.   
135b0 20 71 73 6f 72 74 28 70 43 75 72 2d 3e 61 2c 20   qsort(pCur->a, 
135c0 70 43 75 72 2d 3e 6e 52 6f 77 2c 20 73 69 7a 65  pCur->nRow, size
135d0 6f 66 28 70 43 75 72 2d 3e 61 5b 30 5d 29 2c 20  of(pCur->a[0]), 
135e0 73 70 65 6c 6c 66 69 78 31 52 6f 77 43 6f 6d 70  spellfix1RowComp
135f0 61 72 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  are);.    pCur->
13600 69 54 6f 70 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  iTop = iLimit;. 
13610 20 20 20 70 43 75 72 2d 3e 69 53 63 6f 70 65 20     pCur->iScope 
13620 3d 20 69 53 63 6f 70 65 3b 0a 20 20 7d 65 6c 73  = iScope;.  }els
13630 65 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20 53 51  e{.    x.rc = SQ
13640 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
13650 0a 66 69 6c 74 65 72 5f 65 78 69 74 3a 0a 20 20  .filter_exit:.  
13660 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
13670 28 70 53 74 6d 74 29 3b 0a 20 20 65 64 69 74 44  (pStmt);.  editD
13680 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65  ist3FromStringDe
13690 6c 65 74 65 28 70 4d 61 74 63 68 53 74 72 33 29  lete(pMatchStr3)
136a0 3b 0a 20 20 72 65 74 75 72 6e 20 78 2e 72 63 3b  ;.  return x.rc;
136b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  .}../*.** This v
136c0 65 72 73 69 6f 6e 20 6f 66 20 78 46 69 6c 74 65  ersion of xFilte
136d0 72 20 68 61 6e 64 6c 65 73 20 61 20 66 75 6c 6c  r handles a full
136e0 2d 74 61 62 6c 65 20 73 63 61 6e 20 63 61 73 65  -table scan case
136f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13700 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f  pellfix1FilterFo
13710 72 46 75 6c 6c 53 63 61 6e 28 0a 20 20 73 70 65  rFullScan(.  spe
13720 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70  llfix1_cursor *p
13730 43 75 72 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75  Cur,.  int idxNu
13740 6d 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  m,.  int argc,. 
13750 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
13760 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
13770 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  c;.  char *zSql;
13780 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  .  spellfix1_vta
13790 62 20 2a 70 56 54 61 62 20 3d 20 70 43 75 72 2d  b *pVTab = pCur-
137a0 3e 70 56 54 61 62 3b 0a 20 20 73 70 65 6c 6c 66  >pVTab;.  spellf
137b0 69 78 31 52 65 73 65 74 43 75 72 73 6f 72 28 70  ix1ResetCursor(p
137c0 43 75 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  Cur);.  zSql = s
137d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
137e0 20 20 20 20 20 22 53 45 4c 45 43 54 20 77 6f 72       "SELECT wor
137f0 64 2c 20 72 61 6e 6b 2c 20 4e 55 4c 4c 2c 20 6c  d, rank, NULL, l
13800 61 6e 67 69 64 2c 20 69 64 20 46 52 4f 4d 20 5c  angid, id FROM \
13810 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62  "%w\".\"%w_vocab
13820 5c 22 22 2c 0a 20 20 20 20 20 70 56 54 61 62 2d  \"",.     pVTab-
13830 3e 7a 44 62 4e 61 6d 65 2c 20 70 56 54 61 62 2d  >zDbName, pVTab-
13840 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20  >zTableName);.  
13850 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
13860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13870 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  M;.  rc = sqlite
13880 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 56 54  3_prepare_v2(pVT
13890 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  ab->db, zSql, -1
138a0 2c 20 26 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63  , &pCur->pFullSc
138b0 61 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  an, 0);.  sqlite
138c0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
138d0 70 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 70 43 75  pCur->nRow = pCu
138e0 72 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 69  r->iRow = 0;.  i
138f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13900 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
13910 69 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d 3e  ite3_step(pCur->
13920 70 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20 20 20  pFullScan);.    
13930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
13940 4f 57 20 29 7b 20 70 43 75 72 2d 3e 69 52 6f 77  OW ){ pCur->iRow
13950 20 3d 20 2d 31 3b 20 72 63 20 3d 20 53 51 4c 49   = -1; rc = SQLI
13960 54 45 5f 4f 4b 3b 20 7d 0a 20 20 20 20 69 66 28  TE_OK; }.    if(
13970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
13980 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   ){ rc = SQLITE_
13990 4f 4b 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20  OK; }.  }else{. 
139a0 20 20 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20     pCur->iRow = 
139b0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
139c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61  rc;.}.../*.** Ca
139d0 6c 6c 65 64 20 74 6f 20 22 72 65 77 69 6e 64 22  lled to "rewind"
139e0 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74   a cursor back t
139f0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
13a00 73 6f 20 74 68 61 74 0a 2a 2a 20 69 74 20 73 74  so that.** it st
13a10 61 72 74 73 20 69 74 73 20 6f 75 74 70 75 74 20  arts its output 
13a20 6f 76 65 72 20 61 67 61 69 6e 2e 20 20 41 6c 77  over again.  Alw
13a30 61 79 73 20 63 61 6c 6c 65 64 20 61 74 20 6c 65  ays called at le
13a40 61 73 74 20 6f 6e 63 65 0a 2a 2a 20 70 72 69 6f  ast once.** prio
13a50 72 20 74 6f 20 61 6e 79 20 73 70 65 6c 6c 66 69  r to any spellfi
13a60 78 31 43 6f 6c 75 6d 6e 2c 20 73 70 65 6c 6c 66  x1Column, spellf
13a70 69 78 31 52 6f 77 69 64 2c 20 6f 72 20 73 70 65  ix1Rowid, or spe
13a80 6c 6c 66 69 78 31 45 6f 66 20 63 61 6c 6c 2e 0a  llfix1Eof call..
13a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
13aa0 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 28 0a 20  ellfix1Filter(. 
13ab0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
13ac0 72 73 6f 72 20 2a 63 75 72 2c 20 0a 20 20 69 6e  rsor *cur, .  in
13ad0 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20  t idxNum, const 
13ae0 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20  char *idxStr,.  
13af0 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
13b00 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
13b10 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  {.  spellfix1_cu
13b20 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70  rsor *pCur = (sp
13b30 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
13b40 29 63 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  )cur;.  int rc;.
13b50 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20 31    if( idxNum & 1
13b60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 70 65   ){.    rc = spe
13b70 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d  llfix1FilterForM
13b80 61 74 63 68 28 70 43 75 72 2c 20 69 64 78 4e 75  atch(pCur, idxNu
13b90 6d 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a  m, argc, argv);.
13ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
13bb0 3d 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65  = spellfix1Filte
13bc0 72 46 6f 72 46 75 6c 6c 53 63 61 6e 28 70 43 75  rForFullScan(pCu
13bd0 72 2c 20 69 64 78 4e 75 6d 2c 20 61 72 67 63 2c  r, idxNum, argc,
13be0 20 61 72 67 76 29 3b 0a 20 20 7d 0a 20 20 72 65   argv);.  }.  re
13bf0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
13c00 2a 2a 20 41 64 76 61 6e 63 65 20 61 20 63 75 72  ** Advance a cur
13c10 73 6f 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20  sor to its next 
13c20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 0a 2a 2f  row of output.*/
13c30 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
13c40 6c 66 69 78 31 4e 65 78 74 28 73 71 6c 69 74 65  lfix1Next(sqlite
13c50 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
13c60 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  ur){.  spellfix1
13c70 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
13c80 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
13c90 72 20 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70  r *)cur;.  if( p
13ca0 43 75 72 2d 3e 69 52 6f 77 20 3c 20 70 43 75 72  Cur->iRow < pCur
13cb0 2d 3e 6e 52 6f 77 20 29 7b 0a 20 20 20 20 69 66  ->nRow ){.    if
13cc0 28 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  ( pCur->pFullSca
13cd0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  n ){.      int r
13ce0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
13cf0 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e  (pCur->pFullScan
13d00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13d10 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 70 43  =SQLITE_ROW ) pC
13d20 75 72 2d 3e 69 52 6f 77 20 3d 20 70 43 75 72 2d  ur->iRow = pCur-
13d30 3e 6e 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73 65  >nRow;.    }else
13d40 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 52  {.      pCur->iR
13d50 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ow++;.    }.  }.
13d60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13d70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
13d80 75 72 6e 20 54 52 55 45 20 69 66 20 77 65 20 61  urn TRUE if we a
13d90 72 65 20 61 74 20 74 68 65 20 65 6e 64 2d 6f 66  re at the end-of
13da0 2d 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20  -file.*/.static 
13db0 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 45 6f 66  int spellfix1Eof
13dc0 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
13dd0 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 70  rsor *cur){.  sp
13de0 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
13df0 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69 78  pCur = (spellfix
13e00 31 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  1_cursor *)cur;.
13e10 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69    return pCur->i
13e20 52 6f 77 3e 3d 70 43 75 72 2d 3e 6e 52 6f 77 3b  Row>=pCur->nRow;
13e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13e40 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
13e50 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a  e current row..*
13e60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
13e70 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 28 0a 20 20  llfix1Column(.  
13e80 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13e90 73 6f 72 20 2a 63 75 72 2c 0a 20 20 73 71 6c 69  sor *cur,.  sqli
13ea0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
13eb0 2c 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20 73  ,.  int i.){.  s
13ec0 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
13ed0 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69  *pCur = (spellfi
13ee0 78 31 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a  x1_cursor*)cur;.
13ef0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46 75 6c    if( pCur->pFul
13f00 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 69 66 28  lScan ){.    if(
13f10 20 69 3c 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c   i<=SPELLFIX_COL
13f20 5f 4c 41 4e 47 49 44 20 29 7b 0a 20 20 20 20 20  _LANGID ){.     
13f30 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
13f40 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69 74  value(ctx, sqlit
13f50 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28  e3_column_value(
13f60 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c  pCur->pFullScan,
13f70 20 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   i));.    }else{
13f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
13f90 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 74 78 29 3b  esult_null(ctx);
13fa0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
13fb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13fc0 0a 20 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a  .  switch( i ){.
13fd0 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49      case SPELLFI
13fe0 58 5f 43 4f 4c 5f 57 4f 52 44 3a 20 7b 0a 20 20  X_COL_WORD: {.  
13ff0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
14000 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43 75  lt_text(ctx, pCu
14010 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d  r->a[pCur->iRow]
14020 2e 7a 57 6f 72 64 2c 20 2d 31 2c 20 53 51 4c 49  .zWord, -1, SQLI
14030 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
14040 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14050 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58     case SPELLFIX
14060 5f 43 4f 4c 5f 52 41 4e 4b 3a 20 7b 0a 20 20 20  _COL_RANK: {.   
14070 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
14080 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d  t_int(ctx, pCur-
14090 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69  >a[pCur->iRow].i
140a0 52 61 6e 6b 29 3b 0a 20 20 20 20 20 20 62 72 65  Rank);.      bre
140b0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
140c0 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
140d0 44 49 53 54 41 4e 43 45 3a 20 7b 0a 20 20 20 20  DISTANCE: {.    
140e0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
140f0 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e  _int(ctx, pCur->
14100 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 44  a[pCur->iRow].iD
14110 69 73 74 61 6e 63 65 29 3b 0a 20 20 20 20 20 20  istance);.      
14120 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14130 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43   case SPELLFIX_C
14140 4f 4c 5f 4c 41 4e 47 49 44 3a 20 7b 0a 20 20 20  OL_LANGID: {.   
14150 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
14160 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d  t_int(ctx, pCur-
14170 3e 69 4c 61 6e 67 29 3b 0a 20 20 20 20 20 20 62  >iLang);.      b
14180 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14190 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  case SPELLFIX_CO
141a0 4c 5f 53 43 4f 52 45 3a 20 7b 0a 20 20 20 20 20  L_SCORE: {.     
141b0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
141c0 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 61  int(ctx, pCur->a
141d0 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 53 63  [pCur->iRow].iSc
141e0 6f 72 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ore);.      brea
141f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14200 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4d  e SPELLFIX_COL_M
14210 41 54 43 48 4c 45 4e 3a 20 7b 0a 20 20 20 20 20  ATCHLEN: {.     
14220 20 69 6e 74 20 69 4d 61 74 63 68 6c 65 6e 20 3d   int iMatchlen =
14230 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69   pCur->a[pCur->i
14240 52 6f 77 5d 2e 69 4d 61 74 63 68 6c 65 6e 3b 0a  Row].iMatchlen;.
14250 20 20 20 20 20 20 69 66 28 20 69 4d 61 74 63 68        if( iMatch
14260 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  len<0 ){.       
14270 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 20 3d 20   int nPattern = 
14280 73 74 72 6c 65 6e 28 70 43 75 72 2d 3e 7a 50 61  strlen(pCur->zPa
14290 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20  ttern);.        
142a0 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 70 43  char *zWord = pC
142b0 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77  ur->a[pCur->iRow
142c0 5d 2e 7a 57 6f 72 64 3b 0a 20 20 20 20 20 20 20  ].zWord;.       
142d0 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 73 74 72   int nWord = str
142e0 6c 65 6e 28 7a 57 6f 72 64 29 3b 0a 0a 20 20 20  len(zWord);..   
142f0 20 20 20 20 20 69 66 28 20 6e 50 61 74 74 65 72       if( nPatter
14300 6e 3e 30 20 26 26 20 70 43 75 72 2d 3e 7a 50 61  n>0 && pCur->zPa
14310 74 74 65 72 6e 5b 6e 50 61 74 74 65 72 6e 2d 31  ttern[nPattern-1
14320 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20  ]=='*' ){.      
14330 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 6e 73      char *zTrans
14340 6c 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69  lit;.          i
14350 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
14360 20 20 7a 54 72 61 6e 73 6c 69 74 20 3d 20 28 63    zTranslit = (c
14370 68 61 72 20 2a 29 74 72 61 6e 73 6c 69 74 65 72  har *)transliter
14380 61 74 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ate((unsigned ch
14390 61 72 20 2a 29 7a 57 6f 72 64 2c 20 6e 57 6f 72  ar *)zWord, nWor
143a0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
143b0 28 20 21 7a 54 72 61 6e 73 6c 69 74 20 29 20 72  ( !zTranslit ) r
143c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
143d0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  EM;.          re
143e0 73 20 3d 20 65 64 69 74 64 69 73 74 31 28 70 43  s = editdist1(pC
143f0 75 72 2d 3e 7a 50 61 74 74 65 72 6e 2c 20 7a 54  ur->zPattern, zT
14400 72 61 6e 73 6c 69 74 2c 20 26 69 4d 61 74 63 68  ranslit, &iMatch
14410 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  len);.          
14420 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72  sqlite3_free(zTr
14430 61 6e 73 6c 69 74 29 3b 0a 20 20 20 20 20 20 20  anslit);.       
14440 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20 72     if( res<0 ) r
14450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
14460 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4d  EM;.          iM
14470 61 74 63 68 6c 65 6e 20 3d 20 74 72 61 6e 73 6c  atchlen = transl
14480 65 6e 5f 74 6f 5f 63 68 61 72 6c 65 6e 28 7a 57  en_to_charlen(zW
14490 6f 72 64 2c 20 6e 57 6f 72 64 2c 20 69 4d 61 74  ord, nWord, iMat
144a0 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  chlen);.        
144b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
144c0 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 75 74 66   iMatchlen = utf
144d0 38 43 68 61 72 6c 65 6e 28 7a 57 6f 72 64 2c 20  8Charlen(zWord, 
144e0 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  nWord);.        
144f0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
14500 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14510 69 6e 74 28 63 74 78 2c 20 69 4d 61 74 63 68 6c  int(ctx, iMatchl
14520 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  en);.      break
14530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14540 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50 48   SPELLFIX_COL_PH
14550 4f 4e 45 48 41 53 48 3a 20 7b 0a 20 20 20 20 20  ONEHASH: {.     
14560 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14570 74 65 78 74 28 63 74 78 2c 20 70 43 75 72 2d 3e  text(ctx, pCur->
14580 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a 48  a[pCur->iRow].zH
14590 61 73 68 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ash, -1, SQLITE_
145a0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62  STATIC);.      b
145b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
145c0 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  case SPELLFIX_CO
145d0 4c 5f 54 4f 50 3a 20 7b 0a 20 20 20 20 20 20 73  L_TOP: {.      s
145e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
145f0 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 69 54 6f  t(ctx, pCur->iTo
14600 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  p);.      break;
14610 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14620 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f  SPELLFIX_COL_SCO
14630 50 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  PE: {.      sqli
14640 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
14650 74 78 2c 20 70 43 75 72 2d 3e 69 53 63 6f 70 65  tx, pCur->iScope
14660 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14670 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14680 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52 43 48  PELLFIX_COL_SRCH
14690 43 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  CNT: {.      sql
146a0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
146b0 63 74 78 2c 20 70 43 75 72 2d 3e 6e 53 65 61 72  ctx, pCur->nSear
146c0 63 68 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ch);.      break
146d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
146e0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
146f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c  ite3_result_null
14700 28 63 74 78 29 3b 0a 20 20 20 20 20 20 62 72 65  (ctx);.      bre
14710 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
14720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  ;.}../*.** The r
14740 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owid..*/.static 
14750 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 6f 77  int spellfix1Row
14760 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  id(sqlite3_vtab_
14770 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c  cursor *cur, sql
14780 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
14790 64 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  d){.  spellfix1_
147a0 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
147b0 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
147c0 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70 43 75  *)cur;.  if( pCu
147d0 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b 0a  r->pFullScan ){.
147e0 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 73 71      *pRowid = sq
147f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
14800 36 34 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63  64(pCur->pFullSc
14810 61 6e 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b  an, 4);.  }else{
14820 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 70  .    *pRowid = p
14830 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f  Cur->a[pCur->iRo
14840 77 5d 2e 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20  w].iRowid;.  }. 
14850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14860 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
14870 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64  xUpdate() method
14880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14890 73 70 65 6c 6c 66 69 78 31 55 70 64 61 74 65 28  spellfix1Update(
148a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
148b0 2a 70 56 54 61 62 2c 0a 20 20 69 6e 74 20 61 72  *pVTab,.  int ar
148c0 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
148d0 6c 75 65 20 2a 2a 61 72 67 76 2c 0a 20 20 73 71  lue **argv,.  sq
148e0 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
148f0 69 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id.){.  int rc =
14900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
14910 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 6f 77 69  lite3_int64 rowi
14920 64 2c 20 6e 65 77 52 6f 77 69 64 3b 0a 20 20 73  d, newRowid;.  s
14930 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70  pellfix1_vtab *p
14940 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74   = (spellfix1_vt
14950 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 73 71 6c  ab*)pVTab;.  sql
14960 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
14970 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31  ;..  if( argc==1
14980 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 64 65 6c   ){.    /* A del
14990 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  ete operation on
149a0 20 74 68 65 20 72 6f 77 69 64 20 67 69 76 65 6e   the rowid given
149b0 20 62 79 20 61 72 67 76 5b 30 5d 20 2a 2f 0a 20   by argv[0] */. 
149c0 20 20 20 72 6f 77 69 64 20 3d 20 2a 70 52 6f 77     rowid = *pRow
149d0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
149e0 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
149f0 29 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78 31  );.    spellfix1
14a00 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20  DbExec(&rc, db, 
14a10 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25  "DELETE FROM \"%
14a20 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22  w\".\"%w_vocab\"
14a30 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
14a50 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 2c 0a  WHERE id=%lld",.
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d    p->zDbName, p-
14a80 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 72 6f 77  >zTableName, row
14a90 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  id);.  }else{.  
14aa0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
14ab0 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 73   char *zWord = s
14ac0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14ad0 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  t(argv[SPELLFIX_
14ae0 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a 20 20  COL_WORD+2]);.  
14af0 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 73 71    int nWord = sq
14b00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
14b10 73 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  s(argv[SPELLFIX_
14b20 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a 20 20  COL_WORD+2]);.  
14b30 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 73 71    int iLang = sq
14b40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
14b50 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f  argv[SPELLFIX_CO
14b60 4c 5f 4c 41 4e 47 49 44 2b 32 5d 29 3b 0a 20 20  L_LANGID+2]);.  
14b70 20 20 69 6e 74 20 69 52 61 6e 6b 20 3d 20 73 71    int iRank = sq
14b80 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
14b90 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f  argv[SPELLFIX_CO
14ba0 4c 5f 52 41 4e 4b 2b 32 5d 29 3b 0a 20 20 20 20  L_RANK+2]);.    
14bb0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14bc0 68 61 72 20 2a 7a 53 6f 75 6e 64 73 6c 69 6b 65  har *zSoundslike
14bd0 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73 71   =.           sq
14be0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
14bf0 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43  (argv[SPELLFIX_C
14c00 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d  OL_SOUNDSLIKE+2]
14c10 29 3b 0a 20 20 20 20 69 6e 74 20 6e 53 6f 75 6e  );.    int nSoun
14c20 64 73 6c 69 6b 65 20 3d 20 73 71 6c 69 74 65 33  dslike = sqlite3
14c30 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
14c40 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53  v[SPELLFIX_COL_S
14c50 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d 29 3b 0a 20  OUNDSLIKE+2]);. 
14c60 20 20 20 63 68 61 72 20 2a 7a 4b 31 2c 20 2a 7a     char *zK1, *z
14c70 4b 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  K2;.    int i;. 
14c80 20 20 20 63 68 61 72 20 63 3b 0a 0a 20 20 20 20     char c;..    
14c90 69 66 28 20 7a 57 6f 72 64 3d 3d 30 20 29 7b 0a  if( zWord==0 ){.
14ca0 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 73        /* Inserts
14cb0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 49   of the form:  I
14cc0 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 6c 65  NSERT INTO table
14cd0 28 63 6f 6d 6d 61 6e 64 29 20 56 41 4c 55 45 53  (command) VALUES
14ce0 28 27 78 79 7a 7a 79 27 29 3b 0a 20 20 20 20 20  ('xyzzy');.     
14cf0 20 2a 2a 20 63 61 75 73 65 20 7a 57 6f 72 64 20   ** cause zWord 
14d00 74 6f 20 62 65 20 4e 55 4c 4c 2c 20 73 6f 20 77  to be NULL, so w
14d10 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 22 63  e look at the "c
14d20 6f 6d 6d 61 6e 64 22 20 63 6f 6c 75 6d 6e 20 74  ommand" column t
14d30 6f 20 73 65 65 0a 20 20 20 20 20 20 2a 2a 20 77  o see.      ** w
14d40 68 61 74 20 73 70 65 63 69 61 6c 20 61 63 74 69  hat special acti
14d50 6f 6e 73 20 74 6f 20 74 61 6b 65 20 2a 2f 0a 20  ons to take */. 
14d60 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
14d70 2a 7a 43 6d 64 20 3d 20 0a 20 20 20 20 20 20 20  *zCmd = .       
14d80 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73    (const char*)s
14d90 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14da0 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  t(argv[SPELLFIX_
14db0 43 4f 4c 5f 43 4f 4d 4d 41 4e 44 2b 32 5d 29 3b  COL_COMMAND+2]);
14dc0 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6d 64 3d  .      if( zCmd=
14dd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 56  =0 ){.        pV
14de0 54 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73  Tab->zErrMsg = s
14df0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
14e00 25 73 2e 77 6f 72 64 20 6d 61 79 20 6e 6f 74 20  %s.word may not 
14e10 62 65 20 4e 55 4c 4c 22 2c 0a 20 20 20 20 20 20  be NULL",.      
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65     p->zTableName
14e50 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
14e60 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
14e70 49 4e 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  INT;.      }.   
14e80 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43     if( strcmp(zC
14e90 6d 64 2c 22 72 65 73 65 74 22 29 3d 3d 30 20 29  md,"reset")==0 )
14ea0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  {.        /* Res
14eb0 65 74 20 74 68 65 20 20 65 64 69 74 20 63 6f 73  et the  edit cos
14ec0 74 20 74 61 62 6c 65 20 28 69 66 20 74 68 65 72  t table (if ther
14ed0 65 20 69 73 20 6f 6e 65 29 2e 20 2a 2f 0a 20 20  e is one). */.  
14ee0 20 20 20 20 20 20 65 64 69 74 44 69 73 74 33 43        editDist3C
14ef0 6f 6e 66 69 67 44 65 6c 65 74 65 28 70 2d 3e 70  onfigDelete(p->p
14f00 43 6f 6e 66 69 67 33 29 3b 0a 20 20 20 20 20 20  Config3);.      
14f10 20 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d 20    p->pConfig3 = 
14f20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
14f30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
14f40 20 20 20 7d 0a 20 20 20 20 20 20 70 56 54 61 62     }.      pVTab
14f50 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
14f60 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 6b  te3_mprintf("unk
14f70 6e 6f 77 6e 20 76 61 6c 75 65 20 66 6f 72 20 25  nown value for %
14f80 73 2e 63 6f 6d 6d 61 6e 64 3a 20 5c 22 25 77 5c  s.command: \"%w\
14f90 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54             p->zT
14fc0 61 62 6c 65 4e 61 6d 65 2c 20 7a 43 6d 64 29 3b  ableName, zCmd);
14fd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14fe0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
14ff0 7d 0a 20 20 20 20 69 66 28 20 69 52 61 6e 6b 3c  }.    if( iRank<
15000 31 20 29 20 69 52 61 6e 6b 20 3d 20 31 3b 0a 20  1 ) iRank = 1;. 
15010 20 20 20 69 66 28 20 7a 53 6f 75 6e 64 73 6c 69     if( zSoundsli
15020 6b 65 20 29 7b 0a 20 20 20 20 20 20 7a 4b 31 20  ke ){.      zK1 
15030 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c 69  = (char*)transli
15040 74 65 72 61 74 65 28 7a 53 6f 75 6e 64 73 6c 69  terate(zSoundsli
15050 6b 65 2c 20 6e 53 6f 75 6e 64 73 6c 69 6b 65 29  ke, nSoundslike)
15060 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15070 20 20 20 7a 4b 31 20 3d 20 28 63 68 61 72 2a 29     zK1 = (char*)
15080 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a 57  transliterate(zW
15090 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20  ord, nWord);.   
150a0 20 7d 0a 20 20 20 20 69 66 28 20 7a 4b 31 3d 3d   }.    if( zK1==
150b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
150c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 66 6f 72  E_NOMEM;.    for
150d0 28 69 3d 30 3b 20 28 63 20 3d 20 7a 4b 31 5b 69  (i=0; (c = zK1[i
150e0 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
150f0 20 20 20 20 69 66 28 20 63 3e 3d 27 41 27 20 26      if( c>='A' &
15100 26 20 63 3c 3d 27 5a 27 20 29 20 7a 4b 31 5b 69  & c<='Z' ) zK1[i
15110 5d 20 2b 3d 20 27 61 27 20 2d 20 27 41 27 3b 0a  ] += 'a' - 'A';.
15120 20 20 20 20 7d 0a 20 20 20 20 7a 4b 32 20 3d 20      }.    zK2 = 
15130 28 63 68 61 72 2a 29 70 68 6f 6e 65 74 69 63 48  (char*)phoneticH
15140 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67  ash((const unsig
15150 6e 65 64 20 63 68 61 72 2a 29 7a 4b 31 2c 20 69  ned char*)zK1, i
15160 29 3b 0a 20 20 20 20 69 66 28 20 7a 4b 32 3d 3d  );.    if( zK2==
15170 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
15180 65 33 5f 66 72 65 65 28 7a 4b 31 29 3b 0a 20 20  e3_free(zK1);.  
15190 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
151a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
151b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
151c0 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
151d0 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
151e0 29 7b 0a 20 20 20 20 20 20 73 70 65 6c 6c 66 69  ){.      spellfi
151f0 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  x1DbExec(&rc, db
15200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
15210 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25 77  INSERT INTO \"%w
15220 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 28  \".\"%w_vocab\"(
15230 72 61 6e 6b 2c 6c 61 6e 67 69 64 2c 77 6f 72 64  rank,langid,word
15240 2c 6b 31 2c 6b 32 29 20 22 0a 20 20 20 20 20 20  ,k1,k2) ".      
15250 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 25         "VALUES(%
15260 64 2c 25 64 2c 25 51 2c 25 51 2c 25 51 29 22 2c  d,%d,%Q,%Q,%Q)",
15270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  .             p-
15280 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61  >zDbName, p->zTa
15290 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
152a0 20 20 20 20 20 20 69 52 61 6e 6b 2c 20 69 4c 61        iRank, iLa
152b0 6e 67 2c 20 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20  ng, zWord, zK1, 
152c0 7a 4b 32 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  zK2.      );.   
152d0 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c     *pRowid = sql
152e0 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
152f0 5f 72 6f 77 69 64 28 64 62 29 3b 0a 20 20 20 20  _rowid(db);.    
15300 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 6f 77  }else{.      row
15310 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
15320 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d  ue_int64(argv[0]
15330 29 3b 0a 20 20 20 20 20 20 6e 65 77 52 6f 77 69  );.      newRowi
15340 64 20 3d 20 2a 70 52 6f 77 69 64 20 3d 20 73 71  d = *pRowid = sq
15350 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
15360 34 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  4(argv[1]);.    
15370 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65    spellfix1DbExe
15380 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20  c(&rc, db,.     
15390 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45 20          "UPDATE 
153a0 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
153b0 62 5c 22 20 53 45 54 20 69 64 3d 25 6c 6c 64 2c  b\" SET id=%lld,
153c0 20 72 61 6e 6b 3d 25 64 2c 20 6c 61 6e 67 69 64   rank=%d, langid
153d0 3d 25 64 2c 22 0a 20 20 20 20 20 20 20 20 20 20  =%d,".          
153e0 20 20 20 22 20 77 6f 72 64 3d 25 51 2c 20 6b 31     " word=%Q, k1
153f0 3d 25 51 2c 20 6b 32 3d 25 51 20 57 48 45 52 45  =%Q, k2=%Q WHERE
15400 20 69 64 3d 25 6c 6c 64 22 2c 0a 20 20 20 20 20   id=%lld",.     
15410 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61          p->zDbNa
15420 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
15430 65 2c 20 6e 65 77 52 6f 77 69 64 2c 20 69 52 61  e, newRowid, iRa
15440 6e 6b 2c 20 69 4c 61 6e 67 2c 0a 20 20 20 20 20  nk, iLang,.     
15450 20 20 20 20 20 20 20 20 7a 57 6f 72 64 2c 20 7a          zWord, z
15460 4b 31 2c 20 7a 4b 32 2c 20 72 6f 77 69 64 0a 20  K1, zK2, rowid. 
15470 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
15480 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
15490 4b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  K1);.    sqlite3
154a0 5f 66 72 65 65 28 7a 4b 32 29 3b 0a 20 20 7d 0a  _free(zK2);.  }.
154b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
154c0 2f 2a 0a 2a 2a 20 52 65 6e 61 6d 65 20 74 68 65  /*.** Rename the
154d0 20 73 70 65 6c 6c 66 69 78 31 20 74 61 62 6c 65   spellfix1 table
154e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
154f0 73 70 65 6c 6c 66 69 78 31 52 65 6e 61 6d 65 28  spellfix1Rename(
15500 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
15510 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
15520 2a 7a 4e 65 77 29 7b 0a 20 20 73 70 65 6c 6c 66  *zNew){.  spellf
15530 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28 73  ix1_vtab *p = (s
15540 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29 70  pellfix1_vtab*)p
15550 56 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  VTab;.  sqlite3 
15560 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
15570 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15580 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e  K;.  char *zNewN
15590 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ame = sqlite3_mp
155a0 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 65 77  rintf("%s", zNew
155b0 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 4e 61 6d  );.  if( zNewNam
155c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
155d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
155e0 0a 20 20 7d 0a 20 20 73 70 65 6c 6c 66 69 78 31  .  }.  spellfix1
155f0 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20  DbExec(&rc, db, 
15600 0a 20 20 20 20 20 22 41 4c 54 45 52 20 54 41 42  .     "ALTER TAB
15610 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76  LE \"%w\".\"%w_v
15620 6f 63 61 62 5c 22 20 52 45 4e 41 4d 45 20 54 4f  ocab\" RENAME TO
15630 20 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22 2c 0a   \"%w_vocab\"",.
15640 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c       p->zDbName,
15650 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20   p->zTableName, 
15660 7a 4e 65 77 4e 61 6d 65 0a 20 20 29 3b 0a 20 20  zNewName.  );.  
15670 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15680 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
15690 5f 66 72 65 65 28 70 2d 3e 7a 54 61 62 6c 65 4e  _free(p->zTableN
156a0 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 61  ame);.    p->zTa
156b0 62 6c 65 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61  bleName = zNewNa
156c0 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  me;.  }else{.   
156d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
156e0 65 77 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72  ewName);.  }.  r
156f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
15700 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61  .** A virtual ta
15710 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68 61 74 20  ble module that 
15720 70 72 6f 76 69 64 65 73 20 66 75 7a 7a 79 20 73  provides fuzzy s
15730 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
15740 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
15750 73 70 65 6c 6c 66 69 78 31 4d 6f 64 75 6c 65 20  spellfix1Module 
15760 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20  = {.  0,        
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15780 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
15790 73 70 65 6c 6c 66 69 78 31 43 72 65 61 74 65 2c  spellfix1Create,
157a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65           /* xCre
157b0 61 74 65 20 2d 20 68 61 6e 64 6c 65 20 43 52 45  ate - handle CRE
157c0 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
157d0 45 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  E */.  spellfix1
157e0 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
157f0 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 72 65  /* xConnect - re
15800 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 6e 20  connected to an 
15810 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a  existing table *
15820 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 42 65 73  /.  spellfix1Bes
15830 74 49 6e 64 65 78 2c 20 20 20 20 20 20 2f 2a 20  tIndex,      /* 
15840 78 42 65 73 74 49 6e 64 65 78 20 2d 20 66 69 67  xBestIndex - fig
15850 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f 20 64  ure out how to d
15860 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  o a query */.  s
15870 70 65 6c 6c 66 69 78 31 44 69 73 63 6f 6e 6e 65  pellfix1Disconne
15880 63 74 2c 20 20 20 20 20 2f 2a 20 78 44 69 73 63  ct,     /* xDisc
15890 6f 6e 6e 65 63 74 20 2d 20 63 6c 6f 73 65 20 61  onnect - close a
158a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
158b0 20 73 70 65 6c 6c 66 69 78 31 44 65 73 74 72 6f   spellfix1Destro
158c0 79 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65  y,        /* xDe
158d0 73 74 72 6f 79 20 2d 20 68 61 6e 64 6c 65 20 44  stroy - handle D
158e0 52 4f 50 20 54 41 42 4c 45 20 2a 2f 0a 20 20 73  ROP TABLE */.  s
158f0 70 65 6c 6c 66 69 78 31 4f 70 65 6e 2c 20 20 20  pellfix1Open,   
15900 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
15910 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
15920 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43   */.  spellfix1C
15930 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
15940 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
15950 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73   a cursor */.  s
15960 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 2c 20  pellfix1Filter, 
15970 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
15980 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73  er - configure s
15990 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  can constraints 
159a0 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 4e 65  */.  spellfix1Ne
159b0 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt,           /*
159c0 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65   xNext - advance
159d0 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73   a cursor */.  s
159e0 70 65 6c 6c 66 69 78 31 45 6f 66 2c 20 20 20 20  pellfix1Eof,    
159f0 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20          /* xEof 
15a00 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20  - check for end 
15a10 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 73 70 65  of scan */.  spe
15a20 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c 20 20 20  llfix1Column,   
15a30 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e        /* xColumn
15a40 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
15a50 20 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64    spellfix1Rowid
15a60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52  ,          /* xR
15a70 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
15a80 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 55   */.  spellfix1U
15a90 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 2f  pdate,         /
15aa0 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30  * xUpdate */.  0
15ab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15ac0 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
15ad0 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c  /* xSync */.  0,
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69         /* xCommi
15b20 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b40 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  /* xRollback */.
15b50 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
15b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
15b70 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  indMethod */.  s
15b80 70 65 6c 6c 66 69 78 31 52 65 6e 61 6d 65 2c 20  pellfix1Rename, 
15b90 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
15ba0 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  me */.};../*.** 
15bb0 52 65 67 69 73 74 65 72 20 74 68 65 20 76 61 72  Register the var
15bc0 69 6f 75 73 20 66 75 6e 63 74 69 6f 6e 73 20 61  ious functions a
15bd0 6e 64 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  nd the virtual t
15be0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
15bf0 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 65 67  int spellfix1Reg
15c00 69 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64  ister(sqlite3 *d
15c10 62 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d  b){.  int nErr =
15c20 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6e   0;.  int i;.  n
15c30 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63  Err += sqlite3_c
15c40 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
15c50 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 74 72  b, "spellfix1_tr
15c60 61 6e 73 6c 69 74 22 2c 20 31 2c 20 53 51 4c 49  anslit", 1, SQLI
15c70 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
15ca0 61 6e 73 6c 69 74 65 72 61 74 65 53 71 6c 46 75  ansliterateSqlFu
15cb0 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 6e 45 72  nc, 0, 0);.  nEr
15cc0 72 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  r += sqlite3_cre
15cd0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
15ce0 20 22 73 70 65 6c 6c 66 69 78 31 5f 65 64 69 74   "spellfix1_edit
15cf0 64 69 73 74 22 2c 20 32 2c 20 53 51 4c 49 54 45  dist", 2, SQLITE
15d00 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
15d30 64 69 73 74 53 71 6c 46 75 6e 63 2c 20 30 2c 20  distSqlFunc, 0, 
15d40 30 29 3b 0a 20 20 6e 45 72 72 20 2b 3d 20 73 71  0);.  nErr += sq
15d50 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
15d60 63 74 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c  ction(db, "spell
15d70 66 69 78 31 5f 70 68 6f 6e 65 68 61 73 68 22 2c  fix1_phonehash",
15d80 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
15d90 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 20 70 68 6f 6e 65 74 69 63 48 61        phoneticHa
15dc0 73 68 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  shSqlFunc, 0, 0)
15dd0 3b 0a 20 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69  ;.  nErr += sqli
15de0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
15df0 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69  ion(db, "spellfi
15e00 78 31 5f 73 63 72 69 70 74 63 6f 64 65 22 2c 20  x1_scriptcode", 
15e10 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
15e20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e40 20 20 20 20 20 73 63 72 69 70 74 43 6f 64 65 53       scriptCodeS
15e50 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
15e60 20 6e 45 72 72 20 2b 3d 20 73 71 6c 69 74 65 33   nErr += sqlite3
15e70 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64  _create_module(d
15e80 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 22 2c 20  b, "spellfix1", 
15e90 26 73 70 65 6c 6c 66 69 78 31 4d 6f 64 75 6c 65  &spellfix1Module
15ea0 2c 20 30 29 3b 0a 20 20 6e 45 72 72 20 2b 3d 20  , 0);.  nErr += 
15eb0 65 64 69 74 44 69 73 74 33 49 6e 73 74 61 6c 6c  editDist3Install
15ec0 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  (db);..  /* Veri
15ed0 66 79 20 73 61 6e 69 74 79 20 6f 66 20 74 68 65  fy sanity of the
15ee0 20 74 72 61 6e 73 6c 69 74 5b 5d 20 74 61 62 6c   translit[] tabl
15ef0 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
15f00 69 3c 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69  i<sizeof(transli
15f10 74 29 2f 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c  t)/sizeof(transl
15f20 69 74 5b 30 5d 29 2d 31 3b 20 69 2b 2b 29 7b 0a  it[0])-1; i++){.
15f30 20 20 20 20 61 73 73 65 72 74 28 20 74 72 61 6e      assert( tran
15f40 73 6c 69 74 5b 69 5d 2e 63 46 72 6f 6d 3c 74 72  slit[i].cFrom<tr
15f50 61 6e 73 6c 69 74 5b 69 2b 31 5d 2e 63 46 72 6f  anslit[i+1].cFro
15f60 6d 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  m );.  }..  retu
15f70 72 6e 20 6e 45 72 72 20 3f 20 53 51 4c 49 54 45  rn nErr ? SQLITE
15f80 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f  _ERROR : SQLITE_
15f90 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
15fa0 45 5f 43 4f 52 45 20 7c 7c 20 64 65 66 69 6e 65  E_CORE || define
15fb0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
15fc0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
15fd0 65 20 73 70 65 6c 6c 66 69 78 31 20 76 69 72 74  e spellfix1 virt
15fe0 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20 69 74  ual table and it
15ff0 73 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e  s associated fun
16000 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ctions..*/.int s
16010 71 6c 69 74 65 33 53 70 65 6c 6c 66 69 78 31 52  qlite3Spellfix1R
16020 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33 20  egister(sqlite3 
16030 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  *db){.  return s
16040 70 65 6c 6c 66 69 78 31 52 65 67 69 73 74 65 72  pellfix1Register
16050 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  (db);.}.#endif..
16060 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 43 4f 52  .#if !SQLITE_COR
16070 45 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 73 69 6f  E./*.** Extensio
16080 6e 20 6c 6f 61 64 20 66 75 6e 63 74 69 6f 6e 2e  n load function.
16090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
160a0 65 78 74 65 6e 73 69 6f 6e 5f 69 6e 69 74 28 0a  extension_init(.
160b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
160c0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
160d0 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
160e0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
160f0 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49   *pApi.){.  SQLI
16100 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
16110 54 32 28 70 41 70 69 29 3b 0a 20 20 72 65 74 75  T2(pApi);.  retu
16120 72 6e 20 73 70 65 6c 6c 66 69 78 31 52 65 67 69  rn spellfix1Regi
16130 73 74 65 72 28 64 62 29 3b 0a 7d 0a 23 65 6e 64  ster(db);.}.#end
16140 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 43 4f  if /* !SQLITE_CO
16150 52 45 20 2a 2f 0a                                RE */.