/ Hex Artifact Content
Login

Artifact 4b3fb3ef465736499e5c34ccb51fad6c53ee1e78:


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 23 20  sqlite3ext.h".# 
02d0: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
02e0: 68 3e 0a 23 20 64 65 66 69 6e 65 20 41 4c 57 41  h>.# define ALWA
02f0: 59 53 28 58 29 20 20 31 0a 23 20 64 65 66 69 6e  YS(X)  1.# defin
0300: 65 20 4e 45 56 45 52 28 58 29 20 20 20 30 0a 20  e NEVER(X)   0. 
0310: 20 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65   typedef unsigne
0320: 64 20 63 68 61 72 20 75 38 3b 0a 20 20 74 79 70  d char u8;.  typ
0330: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68  edef unsigned sh
0340: 6f 72 74 20 75 31 36 3b 0a 20 20 53 51 4c 49 54  ort u16;.  SQLIT
0350: 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
0360: 31 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  1.#endif /* !SQL
0370: 49 54 45 5f 43 4f 52 45 20 2a 2f 0a 23 69 6e 63  ITE_CORE */.#inc
0380: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a  lude <ctype.h>..
0390: 2f 2a 0a 2a 2a 20 43 68 61 72 61 63 74 65 72 20  /*.** Character 
03a0: 63 6c 61 73 73 65 73 20 66 6f 72 20 41 53 43 49  classes for ASCI
03b0: 49 20 63 68 61 72 61 63 74 65 72 73 3a 0a 2a 2a  I characters:.**
03c0: 0a 2a 2a 20 20 20 30 20 20 20 27 27 20 20 20 20  .**   0   ''    
03d0: 20 20 20 20 53 69 6c 65 6e 74 20 6c 65 74 74 65      Silent lette
03e0: 72 73 3a 20 20 20 48 20 57 0a 2a 2a 20 20 20 31  rs:   H W.**   1
03f0: 20 20 20 27 41 27 20 20 20 20 20 20 20 41 6e 79     'A'       Any
0400: 20 76 6f 77 65 6c 3a 20 20 20 41 20 45 20 49 20   vowel:   A E I 
0410: 4f 20 55 20 28 59 29 0a 2a 2a 20 20 20 32 20 20  O U (Y).**   2  
0420: 20 27 42 27 20 20 20 20 20 20 20 41 20 62 69 6c   'B'       A bil
0430: 61 62 65 61 6c 20 73 74 6f 70 20 6f 72 20 66 72  abeal stop or fr
0440: 69 63 61 74 69 76 65 3a 20 20 42 20 46 20 50 20  icative:  B F P 
0450: 56 20 57 0a 2a 2a 20 20 20 33 20 20 20 27 43 27  V W.**   3   'C'
0460: 20 20 20 20 20 20 20 4f 74 68 65 72 20 66 72 69         Other fri
0470: 63 61 74 69 76 65 73 20 6f 72 20 62 61 63 6b 20  catives or back 
0480: 73 74 6f 70 73 3a 20 20 43 20 47 20 4a 20 4b 20  stops:  C G J K 
0490: 51 20 53 20 58 20 5a 0a 2a 2a 20 20 20 34 20 20  Q S X Z.**   4  
04a0: 20 27 44 27 20 20 20 20 20 20 20 41 6c 76 65 6f   'D'       Alveo
04b0: 6c 61 72 20 73 74 6f 70 73 3a 20 20 44 20 54 0a  lar stops:  D T.
04c0: 2a 2a 20 20 20 35 20 20 20 27 48 27 20 20 20 20  **   5   'H'    
04d0: 20 20 20 4c 65 74 74 65 72 20 48 20 61 74 20 74     Letter H at t
04e0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
04f0: 61 20 77 6f 72 64 0a 2a 2a 20 20 20 36 20 20 20  a word.**   6   
0500: 27 4c 27 20 20 20 20 20 20 20 47 6c 69 64 65 3a  'L'       Glide:
0510: 20 20 4c 0a 2a 2a 20 20 20 37 20 20 20 27 52 27    L.**   7   'R'
0520: 20 20 20 20 20 20 20 53 65 6d 69 76 6f 77 65 6c         Semivowel
0530: 3a 20 20 52 0a 2a 2a 20 20 20 38 20 20 20 27 4d  :  R.**   8   'M
0540: 27 20 20 20 20 20 20 20 4e 61 73 61 6c 73 3a 20  '       Nasals: 
0550: 20 4d 20 4e 0a 2a 2a 20 20 20 39 20 20 20 27 59   M N.**   9   'Y
0560: 27 20 20 20 20 20 20 20 4c 65 74 74 65 72 20 59  '       Letter Y
0570: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0580: 67 20 6f 66 20 61 20 77 6f 72 64 2e 0a 2a 2a 20  g of a word..** 
0590: 20 20 31 30 20 20 27 39 27 20 20 20 20 20 20 20    10  '9'       
05a0: 44 69 67 69 74 73 3a 20 30 20 31 20 32 20 33 20  Digits: 0 1 2 3 
05b0: 34 20 35 20 36 20 37 20 38 20 39 0a 2a 2a 20 20  4 5 6 7 8 9.**  
05c0: 20 31 31 20 20 27 20 27 20 20 20 20 20 20 20 57   11  ' '       W
05d0: 68 69 74 65 20 73 70 61 63 65 0a 2a 2a 20 20 20  hite space.**   
05e0: 31 32 20 20 27 3f 27 20 20 20 20 20 20 20 4f 74  12  '?'       Ot
05f0: 68 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  her..*/.#define 
0600: 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 20 20 20  CCLASS_SILENT   
0610: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
0620: 43 43 4c 41 53 53 5f 56 4f 57 45 4c 20 20 20 20  CCLASS_VOWEL    
0630: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
0640: 43 43 4c 41 53 53 5f 42 20 20 20 20 20 20 20 20  CCLASS_B        
0650: 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
0660: 43 43 4c 41 53 53 5f 43 20 20 20 20 20 20 20 20  CCLASS_C        
0670: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
0680: 43 43 4c 41 53 53 5f 44 20 20 20 20 20 20 20 20  CCLASS_D        
0690: 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
06a0: 43 43 4c 41 53 53 5f 48 20 20 20 20 20 20 20 20  CCLASS_H        
06b0: 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20        5.#define 
06c0: 43 43 4c 41 53 53 5f 4c 20 20 20 20 20 20 20 20  CCLASS_L        
06d0: 20 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20        6.#define 
06e0: 43 43 4c 41 53 53 5f 52 20 20 20 20 20 20 20 20  CCLASS_R        
06f0: 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20        7.#define 
0700: 43 43 4c 41 53 53 5f 4d 20 20 20 20 20 20 20 20  CCLASS_M        
0710: 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20        8.#define 
0720: 43 43 4c 41 53 53 5f 59 20 20 20 20 20 20 20 20  CCLASS_Y        
0730: 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20        9.#define 
0740: 43 43 4c 41 53 53 5f 44 49 47 49 54 20 20 20 20  CCLASS_DIGIT    
0750: 20 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20       10.#define 
0760: 43 43 4c 41 53 53 5f 53 50 41 43 45 20 20 20 20  CCLASS_SPACE    
0770: 20 20 20 20 20 31 31 0a 23 64 65 66 69 6e 65 20       11.#define 
0780: 43 43 4c 41 53 53 5f 4f 54 48 45 52 20 20 20 20  CCLASS_OTHER    
0790: 20 20 20 20 20 31 32 0a 0a 2f 2a 0a 2a 2a 20 54       12../*.** T
07a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
07b0: 6c 65 20 67 69 76 65 73 20 74 68 65 20 63 68 61  le gives the cha
07c0: 72 61 63 74 65 72 20 63 6c 61 73 73 20 66 6f 72  racter class for
07d0: 20 6e 6f 6e 2d 69 6e 69 74 69 61 6c 20 41 53 43   non-initial ASC
07e0: 49 49 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  II.** characters
07f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
0800: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
0810: 6d 69 64 43 6c 61 73 73 5b 5d 20 3d 20 7b 0a 20  midClass[] = {. 
0820: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0830: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
0840: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0850: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0860: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0870: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0880: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0890: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
08a0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
08b0: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
08c0: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
08d0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
08e0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
08f0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0900: 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 20 20 20  CCLASS_SPACE,   
0910: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0920: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0930: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0940: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53  /*   */ CCLASS_S
0950: 50 41 43 45 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  PACE,    /*   */
0960: 20 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 20 20   CCLASS_SPACE,  
0970: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0980: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0990: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
09a0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
09b0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
09c0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
09d0: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
09e0: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
09f0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0a00: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0a10: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0a20: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0a30: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0a40: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0a50: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0a60: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0a70: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
0a80: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0a90: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0aa0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0ab0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0ac0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0ad0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0ae0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0af0: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0b00: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
0b10: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0b20: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0b30: 53 50 41 43 45 2c 0a 20 2f 2a 20 21 20 2a 2f 20  SPACE,. /* ! */ 
0b40: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0b50: 20 2f 2a 20 22 20 2a 2f 20 43 43 4c 41 53 53 5f   /* " */ CCLASS_
0b60: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 23 20 2a 2f  OTHER,   /* # */
0b70: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0b80: 2f 2a 20 24 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* $ */ CCLASS_O
0b90: 54 48 45 52 2c 20 20 20 20 2f 2a 20 25 20 2a 2f  THER,    /* % */
0ba0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0bb0: 20 2f 2a 20 26 20 2a 2f 20 43 43 4c 41 53 53 5f   /* & */ CCLASS_
0bc0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 27 20 2a 2f 20  OTHER,. /* ' */ 
0bd0: 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c 20 20  CCLASS_SILENT,  
0be0: 20 2f 2a 20 28 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ( */ CCLASS_
0bf0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 29 20 2a 2f  OTHER,   /* ) */
0c00: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0c10: 2f 2a 20 2a 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* * */ CCLASS_O
0c20: 54 48 45 52 2c 20 20 20 20 2f 2a 20 2b 20 2a 2f  THER,    /* + */
0c30: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0c40: 20 2f 2a 20 2c 20 2a 2f 20 43 43 4c 41 53 53 5f   /* , */ CCLASS_
0c50: 4f 54 48 45 52 2c 0a 20 2f 2a 20 2d 20 2a 2f 20  OTHER,. /* - */ 
0c60: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0c70: 20 2f 2a 20 2e 20 2a 2f 20 43 43 4c 41 53 53 5f   /* . */ CCLASS_
0c80: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 2f 20 2a 2f  OTHER,   /* / */
0c90: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0ca0: 2f 2a 20 30 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* 0 */ CCLASS_D
0cb0: 49 47 49 54 2c 20 20 20 20 2f 2a 20 31 20 2a 2f  IGIT,    /* 1 */
0cc0: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20   CCLASS_DIGIT,  
0cd0: 20 2f 2a 20 32 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 2 */ CCLASS_
0ce0: 44 49 47 49 54 2c 0a 20 2f 2a 20 33 20 2a 2f 20  DIGIT,. /* 3 */ 
0cf0: 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20  CCLASS_DIGIT,   
0d00: 20 2f 2a 20 34 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 4 */ CCLASS_
0d10: 44 49 47 49 54 2c 20 20 20 2f 2a 20 35 20 2a 2f  DIGIT,   /* 5 */
0d20: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20   CCLASS_DIGIT,. 
0d30: 2f 2a 20 36 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* 6 */ CCLASS_D
0d40: 49 47 49 54 2c 20 20 20 20 2f 2a 20 37 20 2a 2f  IGIT,    /* 7 */
0d50: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20   CCLASS_DIGIT,  
0d60: 20 2f 2a 20 38 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 8 */ CCLASS_
0d70: 44 49 47 49 54 2c 0a 20 2f 2a 20 39 20 2a 2f 20  DIGIT,. /* 9 */ 
0d80: 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20  CCLASS_DIGIT,   
0d90: 20 2f 2a 20 3a 20 2a 2f 20 43 43 4c 41 53 53 5f   /* : */ CCLASS_
0da0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 3b 20 2a 2f  OTHER,   /* ; */
0db0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0dc0: 2f 2a 20 3c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* < */ CCLASS_O
0dd0: 54 48 45 52 2c 20 20 20 20 2f 2a 20 3d 20 2a 2f  THER,    /* = */
0de0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0df0: 20 2f 2a 20 3e 20 2a 2f 20 43 43 4c 41 53 53 5f   /* > */ CCLASS_
0e00: 4f 54 48 45 52 2c 0a 20 2f 2a 20 3f 20 2a 2f 20  OTHER,. /* ? */ 
0e10: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0e20: 20 2f 2a 20 40 20 2a 2f 20 43 43 4c 41 53 53 5f   /* @ */ CCLASS_
0e30: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 41 20 2a 2f  OTHER,   /* A */
0e40: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20   CCLASS_VOWEL,. 
0e50: 2f 2a 20 42 20 2a 2f 20 43 43 4c 41 53 53 5f 42  /* B */ CCLASS_B
0e60: 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 20 2a 2f  ,        /* C */
0e70: 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20   CCLASS_C,      
0e80: 20 2f 2a 20 44 20 2a 2f 20 43 43 4c 41 53 53 5f   /* D */ CCLASS_
0e90: 44 2c 0a 20 2f 2a 20 45 20 2a 2f 20 43 43 4c 41  D,. /* E */ CCLA
0ea0: 53 53 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20  SS_VOWEL,    /* 
0eb0: 46 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20  F */ CCLASS_B,  
0ec0: 20 20 20 20 20 2f 2a 20 47 20 2a 2f 20 43 43 4c       /* G */ CCL
0ed0: 41 53 53 5f 43 2c 0a 20 2f 2a 20 48 20 2a 2f 20  ASS_C,. /* H */ 
0ee0: 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c 20 20  CCLASS_SILENT,  
0ef0: 20 2f 2a 20 49 20 2a 2f 20 43 43 4c 41 53 53 5f   /* I */ CCLASS_
0f00: 56 4f 57 45 4c 2c 20 20 20 2f 2a 20 4a 20 2a 2f  VOWEL,   /* J */
0f10: 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 4b   CCLASS_C,. /* K
0f20: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
0f30: 20 20 20 20 20 2f 2a 20 4c 20 2a 2f 20 43 43 4c       /* L */ CCL
0f40: 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_L,       /* 
0f50: 4d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 0a 20  M */ CCLASS_M,. 
0f60: 2f 2a 20 4e 20 2a 2f 20 43 43 4c 41 53 53 5f 4d  /* N */ CCLASS_M
0f70: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 20 2a 2f  ,        /* O */
0f80: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
0f90: 20 2f 2a 20 50 20 2a 2f 20 43 43 4c 41 53 53 5f   /* P */ CCLASS_
0fa0: 42 2c 0a 20 2f 2a 20 51 20 2a 2f 20 43 43 4c 41  B,. /* Q */ CCLA
0fb0: 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_C,        /* 
0fc0: 52 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c 20 20  R */ CCLASS_R,  
0fd0: 20 20 20 20 20 2f 2a 20 53 20 2a 2f 20 43 43 4c       /* S */ CCL
0fe0: 41 53 53 5f 43 2c 0a 20 2f 2a 20 54 20 2a 2f 20  ASS_C,. /* T */ 
0ff0: 43 43 4c 41 53 53 5f 44 2c 20 20 20 20 20 20 20  CCLASS_D,       
1000: 20 2f 2a 20 55 20 2a 2f 20 43 43 4c 41 53 53 5f   /* U */ CCLASS_
1010: 56 4f 57 45 4c 2c 20 20 20 2f 2a 20 56 20 2a 2f  VOWEL,   /* V */
1020: 20 43 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20 57   CCLASS_B,. /* W
1030: 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20   */ CCLASS_B,   
1040: 20 20 20 20 20 2f 2a 20 58 20 2a 2f 20 43 43 4c       /* X */ CCL
1050: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_C,       /* 
1060: 59 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  Y */ CCLASS_VOWE
1070: 4c 2c 0a 20 2f 2a 20 5a 20 2a 2f 20 43 43 4c 41  L,. /* Z */ CCLA
1080: 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_C,        /* 
1090: 5b 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  [ */ CCLASS_OTHE
10a0: 52 2c 20 20 20 2f 2a 20 5c 20 2a 2f 20 43 43 4c  R,   /* \ */ CCL
10b0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 5d  ASS_OTHER,. /* ]
10c0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
10d0: 2c 20 20 20 20 2f 2a 20 5e 20 2a 2f 20 43 43 4c  ,    /* ^ */ CCL
10e0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
10f0: 5f 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  _ */ CCLASS_OTHE
1100: 52 2c 0a 20 2f 2a 20 60 20 2a 2f 20 43 43 4c 41  R,. /* ` */ CCLA
1110: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1120: 61 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  a */ CCLASS_VOWE
1130: 4c 2c 20 20 20 2f 2a 20 62 20 2a 2f 20 43 43 4c  L,   /* b */ CCL
1140: 41 53 53 5f 42 2c 0a 20 2f 2a 20 63 20 2a 2f 20  ASS_B,. /* c */ 
1150: 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20  CCLASS_C,       
1160: 20 2f 2a 20 64 20 2a 2f 20 43 43 4c 41 53 53 5f   /* d */ CCLASS_
1170: 44 2c 20 20 20 20 20 20 20 2f 2a 20 65 20 2a 2f  D,       /* e */
1180: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20   CCLASS_VOWEL,. 
1190: 2f 2a 20 66 20 2a 2f 20 43 43 4c 41 53 53 5f 42  /* f */ CCLASS_B
11a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 67 20 2a 2f  ,        /* g */
11b0: 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20   CCLASS_C,      
11c0: 20 2f 2a 20 68 20 2a 2f 20 43 43 4c 41 53 53 5f   /* h */ CCLASS_
11d0: 53 49 4c 45 4e 54 2c 0a 20 2f 2a 20 69 20 2a 2f  SILENT,. /* i */
11e0: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
11f0: 20 20 2f 2a 20 6a 20 2a 2f 20 43 43 4c 41 53 53    /* j */ CCLASS
1200: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 6b 20 2a  _C,       /* k *
1210: 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20  / CCLASS_C,. /* 
1220: 6c 20 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c 20 20  l */ CCLASS_L,  
1230: 20 20 20 20 20 20 2f 2a 20 6d 20 2a 2f 20 43 43        /* m */ CC
1240: 4c 41 53 53 5f 4d 2c 20 20 20 20 20 20 20 2f 2a  LASS_M,       /*
1250: 20 6e 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 0a   n */ CCLASS_M,.
1260: 20 2f 2a 20 6f 20 2a 2f 20 43 43 4c 41 53 53 5f   /* o */ CCLASS_
1270: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 70 20 2a  VOWEL,    /* p *
1280: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
1290: 20 20 2f 2a 20 71 20 2a 2f 20 43 43 4c 41 53 53    /* q */ CCLASS
12a0: 5f 43 2c 0a 20 2f 2a 20 72 20 2a 2f 20 43 43 4c  _C,. /* r */ CCL
12b0: 41 53 53 5f 52 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_R,        /*
12c0: 20 73 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20   s */ CCLASS_C, 
12d0: 20 20 20 20 20 20 2f 2a 20 74 20 2a 2f 20 43 43        /* t */ CC
12e0: 4c 41 53 53 5f 44 2c 0a 20 2f 2a 20 75 20 2a 2f  LASS_D,. /* u */
12f0: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
1300: 20 20 2f 2a 20 76 20 2a 2f 20 43 43 4c 41 53 53    /* v */ CCLASS
1310: 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 77 20 2a  _B,       /* w *
1320: 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20  / CCLASS_B,. /* 
1330: 78 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  x */ CCLASS_C,  
1340: 20 20 20 20 20 20 2f 2a 20 79 20 2a 2f 20 43 43        /* y */ CC
1350: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a  LASS_VOWEL,   /*
1360: 20 7a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a   z */ CCLASS_C,.
1370: 20 2f 2a 20 7b 20 2a 2f 20 43 43 4c 41 53 53 5f   /* { */ CCLASS_
1380: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 7c 20 2a  OTHER,    /* | *
1390: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
13a0: 20 20 2f 2a 20 7d 20 2a 2f 20 43 43 4c 41 53 53    /* } */ CCLASS
13b0: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 7e 20 2a 2f  _OTHER,. /* ~ */
13c0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
13d0: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
13e0: 5f 4f 54 48 45 52 2c 20 20 20 0a 7d 3b 0a 2f 2a  _OTHER,   .};./*
13f0: 20 0a 2a 2a 20 54 68 69 73 20 74 61 62 6c 65 73   .** This tables
1400: 20 67 69 76 65 73 20 74 68 65 20 63 68 61 72 61   gives the chara
1410: 63 74 65 72 20 63 6c 61 73 73 20 66 6f 72 20 41  cter class for A
1420: 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20  SCII characters 
1430: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 0a 2a 2a  that form the.**
1440: 20 69 6e 69 74 69 61 6c 20 63 68 61 72 61 63 74   initial charact
1450: 65 72 20 6f 66 20 61 20 77 6f 72 64 2e 20 20 54  er of a word.  T
1460: 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e  he only differen
1470: 63 65 20 66 72 6f 6d 20 6d 69 64 43 6c 61 73 73  ce from midClass
1480: 20 69 73 20 77 69 74 68 0a 2a 2a 20 74 68 65 20   is with.** the 
1490: 6c 65 74 74 65 72 73 20 48 2c 20 57 2c 20 61 6e  letters H, W, an
14a0: 64 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  d Y..*/.static c
14b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
14c0: 61 72 20 69 6e 69 74 43 6c 61 73 73 5b 5d 20 3d  ar initClass[] =
14d0: 20 7b 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41   {. /*   */ CCLA
14e0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
14f0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1500: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1510: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
1520: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1530: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
1540: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1550: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1560: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1570: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1580: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1590: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
15a0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
15b0: 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43 45   */ CCLASS_SPACE
15c0: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
15d0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
15e0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
15f0: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1600: 53 53 5f 53 50 41 43 45 2c 20 20 20 20 2f 2a 20  SS_SPACE,    /* 
1610: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43    */ CCLASS_SPAC
1620: 45 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  E,   /*   */ CCL
1630: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
1640: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1650: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
1660: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1670: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1680: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1690: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
16a0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
16b0: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
16c0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
16d0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
16e0: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
16f0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1700: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1710: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1720: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1730: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1740: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1750: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
1760: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1770: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
1780: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1790: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
17a0: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
17b0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
17c0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
17d0: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
17e0: 41 53 53 5f 53 50 41 43 45 2c 0a 20 2f 2a 20 21  ASS_SPACE,. /* !
17f0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1800: 2c 20 20 20 20 2f 2a 20 22 20 2a 2f 20 43 43 4c  ,    /* " */ CCL
1810: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1820: 23 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  # */ CCLASS_OTHE
1830: 52 2c 0a 20 2f 2a 20 24 20 2a 2f 20 43 43 4c 41  R,. /* $ */ CCLA
1840: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1850: 25 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  % */ CCLASS_OTHE
1860: 52 2c 20 20 20 2f 2a 20 26 20 2a 2f 20 43 43 4c  R,   /* & */ CCL
1870: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 27  ASS_OTHER,. /* '
1880: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1890: 2c 20 20 20 20 2f 2a 20 28 20 2a 2f 20 43 43 4c  ,    /* ( */ CCL
18a0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
18b0: 29 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ) */ CCLASS_OTHE
18c0: 52 2c 0a 20 2f 2a 20 2a 20 2a 2f 20 43 43 4c 41  R,. /* * */ CCLA
18d0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
18e0: 2b 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  + */ CCLASS_OTHE
18f0: 52 2c 20 20 20 2f 2a 20 2c 20 2a 2f 20 43 43 4c  R,   /* , */ CCL
1900: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 2d  ASS_OTHER,. /* -
1910: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1920: 2c 20 20 20 20 2f 2a 20 2e 20 2a 2f 20 43 43 4c  ,    /* . */ CCL
1930: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1940: 2f 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  / */ CCLASS_OTHE
1950: 52 2c 0a 20 2f 2a 20 30 20 2a 2f 20 43 43 4c 41  R,. /* 0 */ CCLA
1960: 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20  SS_DIGIT,    /* 
1970: 31 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  1 */ CCLASS_DIGI
1980: 54 2c 20 20 20 2f 2a 20 32 20 2a 2f 20 43 43 4c  T,   /* 2 */ CCL
1990: 41 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20 33  ASS_DIGIT,. /* 3
19a0: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54   */ CCLASS_DIGIT
19b0: 2c 20 20 20 20 2f 2a 20 34 20 2a 2f 20 43 43 4c  ,    /* 4 */ CCL
19c0: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20  ASS_DIGIT,   /* 
19d0: 35 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  5 */ CCLASS_DIGI
19e0: 54 2c 0a 20 2f 2a 20 36 20 2a 2f 20 43 43 4c 41  T,. /* 6 */ CCLA
19f0: 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20  SS_DIGIT,    /* 
1a00: 37 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  7 */ CCLASS_DIGI
1a10: 54 2c 20 20 20 2f 2a 20 38 20 2a 2f 20 43 43 4c  T,   /* 8 */ CCL
1a20: 41 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20 39  ASS_DIGIT,. /* 9
1a30: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54   */ CCLASS_DIGIT
1a40: 2c 20 20 20 20 2f 2a 20 3a 20 2a 2f 20 43 43 4c  ,    /* : */ CCL
1a50: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1a60: 3b 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ; */ CCLASS_OTHE
1a70: 52 2c 0a 20 2f 2a 20 3c 20 2a 2f 20 43 43 4c 41  R,. /* < */ CCLA
1a80: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1a90: 3d 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  = */ CCLASS_OTHE
1aa0: 52 2c 20 20 20 2f 2a 20 3e 20 2a 2f 20 43 43 4c  R,   /* > */ CCL
1ab0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 3f  ASS_OTHER,. /* ?
1ac0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1ad0: 2c 20 20 20 20 2f 2a 20 40 20 2a 2f 20 43 43 4c  ,    /* @ */ CCL
1ae0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1af0: 41 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  A */ CCLASS_VOWE
1b00: 4c 2c 0a 20 2f 2a 20 42 20 2a 2f 20 43 43 4c 41  L,. /* B */ CCLA
1b10: 53 53 5f 42 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_B,        /* 
1b20: 43 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  C */ CCLASS_C,  
1b30: 20 20 20 20 20 2f 2a 20 44 20 2a 2f 20 43 43 4c       /* D */ CCL
1b40: 41 53 53 5f 44 2c 0a 20 2f 2a 20 45 20 2a 2f 20  ASS_D,. /* E */ 
1b50: 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20  CCLASS_VOWEL,   
1b60: 20 2f 2a 20 46 20 2a 2f 20 43 43 4c 41 53 53 5f   /* F */ CCLASS_
1b70: 42 2c 20 20 20 20 20 20 20 2f 2a 20 47 20 2a 2f  B,       /* G */
1b80: 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 48   CCLASS_C,. /* H
1b90: 20 2a 2f 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e   */ CCLASS_SILEN
1ba0: 54 2c 20 20 20 2f 2a 20 49 20 2a 2f 20 43 43 4c  T,   /* I */ CCL
1bb0: 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20  ASS_VOWEL,   /* 
1bc0: 4a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20  J */ CCLASS_C,. 
1bd0: 2f 2a 20 4b 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* K */ CCLASS_C
1be0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 20 2a 2f  ,        /* L */
1bf0: 20 43 43 4c 41 53 53 5f 4c 2c 20 20 20 20 20 20   CCLASS_L,      
1c00: 20 2f 2a 20 4d 20 2a 2f 20 43 43 4c 41 53 53 5f   /* M */ CCLASS_
1c10: 4d 2c 0a 20 2f 2a 20 4e 20 2a 2f 20 43 43 4c 41  M,. /* N */ CCLA
1c20: 53 53 5f 4d 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_M,        /* 
1c30: 4f 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  O */ CCLASS_VOWE
1c40: 4c 2c 20 20 20 2f 2a 20 50 20 2a 2f 20 43 43 4c  L,   /* P */ CCL
1c50: 41 53 53 5f 42 2c 0a 20 2f 2a 20 51 20 2a 2f 20  ASS_B,. /* Q */ 
1c60: 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20  CCLASS_C,       
1c70: 20 2f 2a 20 52 20 2a 2f 20 43 43 4c 41 53 53 5f   /* R */ CCLASS_
1c80: 52 2c 20 20 20 20 20 20 20 2f 2a 20 53 20 2a 2f  R,       /* S */
1c90: 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 54   CCLASS_C,. /* T
1ca0: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 20 20 20   */ CCLASS_D,   
1cb0: 20 20 20 20 20 2f 2a 20 55 20 2a 2f 20 43 43 4c       /* U */ CCL
1cc0: 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20  ASS_VOWEL,   /* 
1cd0: 56 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20  V */ CCLASS_B,. 
1ce0: 2f 2a 20 57 20 2a 2f 20 43 43 4c 41 53 53 5f 42  /* W */ CCLASS_B
1cf0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 58 20 2a 2f  ,        /* X */
1d00: 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20   CCLASS_C,      
1d10: 20 2f 2a 20 59 20 2a 2f 20 43 43 4c 41 53 53 5f   /* Y */ CCLASS_
1d20: 59 2c 0a 20 2f 2a 20 5a 20 2a 2f 20 43 43 4c 41  Y,. /* Z */ CCLA
1d30: 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_C,        /* 
1d40: 5b 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  [ */ CCLASS_OTHE
1d50: 52 2c 20 20 20 2f 2a 20 5c 20 2a 2f 20 43 43 4c  R,   /* \ */ CCL
1d60: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 5d  ASS_OTHER,. /* ]
1d70: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1d80: 2c 20 20 20 20 2f 2a 20 5e 20 2a 2f 20 43 43 4c  ,    /* ^ */ CCL
1d90: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1da0: 5f 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  _ */ CCLASS_OTHE
1db0: 52 2c 0a 20 2f 2a 20 60 20 2a 2f 20 43 43 4c 41  R,. /* ` */ CCLA
1dc0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1dd0: 61 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  a */ CCLASS_VOWE
1de0: 4c 2c 20 20 20 2f 2a 20 62 20 2a 2f 20 43 43 4c  L,   /* b */ CCL
1df0: 41 53 53 5f 42 2c 0a 20 2f 2a 20 63 20 2a 2f 20  ASS_B,. /* c */ 
1e00: 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20  CCLASS_C,       
1e10: 20 2f 2a 20 64 20 2a 2f 20 43 43 4c 41 53 53 5f   /* d */ CCLASS_
1e20: 44 2c 20 20 20 20 20 20 20 2f 2a 20 65 20 2a 2f  D,       /* e */
1e30: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20   CCLASS_VOWEL,. 
1e40: 2f 2a 20 66 20 2a 2f 20 43 43 4c 41 53 53 5f 42  /* f */ CCLASS_B
1e50: 2c 20 20 20 20 20 20 20 20 2f 2a 20 67 20 2a 2f  ,        /* g */
1e60: 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20   CCLASS_C,      
1e70: 20 2f 2a 20 68 20 2a 2f 20 43 43 4c 41 53 53 5f   /* h */ CCLASS_
1e80: 53 49 4c 45 4e 54 2c 0a 20 2f 2a 20 69 20 2a 2f  SILENT,. /* i */
1e90: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
1ea0: 20 20 2f 2a 20 6a 20 2a 2f 20 43 43 4c 41 53 53    /* j */ CCLASS
1eb0: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 6b 20 2a  _C,       /* k *
1ec0: 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20  / CCLASS_C,. /* 
1ed0: 6c 20 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c 20 20  l */ CCLASS_L,  
1ee0: 20 20 20 20 20 20 2f 2a 20 6d 20 2a 2f 20 43 43        /* m */ CC
1ef0: 4c 41 53 53 5f 4d 2c 20 20 20 20 20 20 20 2f 2a  LASS_M,       /*
1f00: 20 6e 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 0a   n */ CCLASS_M,.
1f10: 20 2f 2a 20 6f 20 2a 2f 20 43 43 4c 41 53 53 5f   /* o */ CCLASS_
1f20: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 70 20 2a  VOWEL,    /* p *
1f30: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
1f40: 20 20 2f 2a 20 71 20 2a 2f 20 43 43 4c 41 53 53    /* q */ CCLASS
1f50: 5f 43 2c 0a 20 2f 2a 20 72 20 2a 2f 20 43 43 4c  _C,. /* r */ CCL
1f60: 41 53 53 5f 52 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_R,        /*
1f70: 20 73 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20   s */ CCLASS_C, 
1f80: 20 20 20 20 20 20 2f 2a 20 74 20 2a 2f 20 43 43        /* t */ CC
1f90: 4c 41 53 53 5f 44 2c 0a 20 2f 2a 20 75 20 2a 2f  LASS_D,. /* u */
1fa0: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
1fb0: 20 20 2f 2a 20 76 20 2a 2f 20 43 43 4c 41 53 53    /* v */ CCLASS
1fc0: 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 77 20 2a  _B,       /* w *
1fd0: 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20  / CCLASS_B,. /* 
1fe0: 78 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  x */ CCLASS_C,  
1ff0: 20 20 20 20 20 20 2f 2a 20 79 20 2a 2f 20 43 43        /* y */ CC
2000: 4c 41 53 53 5f 59 2c 20 20 20 20 20 20 20 2f 2a  LASS_Y,       /*
2010: 20 7a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a   z */ CCLASS_C,.
2020: 20 2f 2a 20 7b 20 2a 2f 20 43 43 4c 41 53 53 5f   /* { */ CCLASS_
2030: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 7c 20 2a  OTHER,    /* | *
2040: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
2050: 20 20 2f 2a 20 7d 20 2a 2f 20 43 43 4c 41 53 53    /* } */ CCLASS
2060: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 7e 20 2a 2f  _OTHER,. /* ~ */
2070: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
2080: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
2090: 5f 4f 54 48 45 52 2c 20 20 20 0a 7d 3b 0a 0a 2f  _OTHER,   .};../
20a0: 2a 0a 2a 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f  *.** Mapping fro
20b0: 6d 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  m the character 
20c0: 63 6c 61 73 73 20 6e 75 6d 62 65 72 20 28 30 2d  class number (0-
20d0: 31 33 29 20 74 6f 20 61 20 73 79 6d 62 6f 6c 20  13) to a symbol 
20e0: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 68 61 72  for each.** char
20f0: 61 63 74 65 72 20 63 6c 61 73 73 2e 20 20 4e 6f  acter class.  No
2100: 74 65 20 74 68 61 74 20 69 6e 69 74 43 6c 61 73  te that initClas
2110: 73 5b 5d 20 63 61 6e 20 62 65 20 75 73 65 64 20  s[] can be used 
2120: 74 6f 20 6d 61 70 20 74 68 65 20 63 6c 61 73 73  to map the class
2130: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 62 61 63 6b 20  .** symbol back 
2140: 69 6e 74 6f 20 74 68 65 20 63 6c 61 73 73 20 6e  into the class n
2150: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
2160: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
2170: 63 68 61 72 20 63 6c 61 73 73 4e 61 6d 65 5b 5d  char className[]
2180: 20 3d 20 22 2e 41 42 43 44 48 4c 52 4d 59 39 20   = ".ABCDHLRMY9 
2190: 3f 22 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ?";../*.** Gener
21a0: 61 74 65 20 61 20 22 70 68 6f 6e 65 74 69 63 20  ate a "phonetic 
21b0: 68 61 73 68 22 20 66 72 6f 6d 20 61 20 73 74 72  hash" from a str
21c0: 69 6e 67 20 6f 66 20 41 53 43 49 49 20 63 68 61  ing of ASCII cha
21d0: 72 61 63 74 65 72 73 0a 2a 2a 20 69 6e 20 7a 49  racters.** in zI
21e0: 6e 5b 30 2e 2e 6e 49 6e 2d 31 5d 2e 0a 2a 2a 0a  n[0..nIn-1]..**.
21f0: 2a 2a 20 20 20 2a 20 4d 61 70 20 63 68 61 72 61  **   * Map chara
2200: 63 74 65 72 73 20 62 79 20 63 68 61 72 61 63 74  cters by charact
2210: 65 72 20 63 6c 61 73 73 20 61 73 20 64 65 66 69  er class as defi
2220: 6e 65 64 20 61 62 6f 76 65 2e 0a 2a 2a 20 20 20  ned above..**   
2230: 2a 20 4f 6d 69 74 20 64 6f 75 62 6c 65 2d 6c 65  * Omit double-le
2240: 74 74 65 72 73 0a 2a 2a 20 20 20 2a 20 4f 6d 69  tters.**   * Omi
2250: 74 20 76 6f 77 65 6c 73 20 62 65 73 69 64 65 20  t vowels beside 
2260: 52 20 61 6e 64 20 4c 0a 2a 2a 20 20 20 2a 20 4f  R and L.**   * O
2270: 6d 69 74 20 54 20 77 68 65 6e 20 66 6f 6c 6c 6f  mit T when follo
2280: 77 65 64 20 62 79 20 43 48 0a 2a 2a 20 20 20 2a  wed by CH.**   *
2290: 20 4f 6d 69 74 20 57 20 77 68 65 6e 20 66 6f 6c   Omit W when fol
22a0: 6c 6f 77 65 64 20 62 79 20 52 0a 2a 2a 20 20 20  lowed by R.**   
22b0: 2a 20 4f 6d 69 74 20 44 20 77 68 65 6e 20 66 6f  * Omit D when fo
22c0: 6c 6c 6f 77 65 64 20 62 79 20 4a 20 6f 72 20 47  llowed by J or G
22d0: 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 4b 20 69  .**   * Omit K i
22e0: 6e 20 4b 4e 20 6f 72 20 47 20 69 6e 20 47 4e 20  n KN or G in GN 
22f0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2300: 20 6f 66 20 61 20 77 6f 72 64 0a 2a 2a 0a 2a 2a   of a word.**.**
2310: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
2320: 68 65 20 72 65 73 75 6c 74 20 69 73 20 6f 62 74  he result is obt
2330: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2340: 65 33 5f 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 0a 2a  e3_malloc().**.*
2350: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
2360: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2370: 6f 6e 20 66 61 69 6c 73 2e 20 20 0a 2a 2f 0a 73  on fails.  .*/.s
2380: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
2390: 68 61 72 20 2a 70 68 6f 6e 65 74 69 63 48 61 73  har *phoneticHas
23a0: 68 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  h(const unsigned
23b0: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20   char *zIn, int 
23c0: 6e 49 6e 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  nIn){.  unsigned
23d0: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
23e0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 49  lite3_malloc( nI
23f0: 6e 20 2b 20 31 20 29 3b 0a 20 20 69 6e 74 20 69  n + 1 );.  int i
2400: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 30  ;.  int nOut = 0
2410: 3b 0a 20 20 63 68 61 72 20 63 50 72 65 76 20 3d  ;.  char cPrev =
2420: 20 30 78 37 37 3b 0a 20 20 63 68 61 72 20 63 50   0x77;.  char cP
2430: 72 65 76 58 20 3d 20 30 78 37 37 3b 0a 20 20 63  revX = 0x77;.  c
2440: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2450: 61 72 20 2a 61 43 6c 61 73 73 20 3d 20 69 6e 69  ar *aClass = ini
2460: 74 43 6c 61 73 73 3b 0a 0a 20 20 69 66 28 20 7a  tClass;..  if( z
2470: 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Out==0 ) return 
2480: 30 3b 0a 20 20 69 66 28 20 6e 49 6e 3e 32 20 29  0;.  if( nIn>2 )
2490: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 7a 49  {.    switch( zI
24a0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 63 61  n[0] ){.      ca
24b0: 73 65 20 27 67 27 3a 20 0a 20 20 20 20 20 20 63  se 'g': .      c
24c0: 61 73 65 20 27 6b 27 3a 20 7b 0a 20 20 20 20 20  ase 'k': {.     
24d0: 20 20 20 69 66 28 20 7a 49 6e 5b 31 5d 3d 3d 27     if( zIn[1]=='
24e0: 6e 27 20 29 7b 20 7a 49 6e 2b 2b 3b 20 6e 49 6e  n' ){ zIn++; nIn
24f0: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 62 72  --; }.        br
2500: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2510: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
2520: 3b 20 69 3c 6e 49 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<nIn; i++){. 
2530: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2540: 20 63 20 3d 20 7a 49 6e 5b 69 5d 3b 0a 20 20 20   c = zIn[i];.   
2550: 20 69 66 28 20 69 2b 31 3c 6e 49 6e 20 29 7b 0a   if( i+1<nIn ){.
2560: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 77 27        if( c=='w'
2570: 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 72   && zIn[i+1]=='r
2580: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
2590: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26      if( c=='d' &
25a0: 26 20 28 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 6a 27  & (zIn[i+1]=='j'
25b0: 20 7c 7c 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 67   || zIn[i+1]=='g
25c0: 27 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ') ) continue;. 
25d0: 20 20 20 20 20 69 66 28 20 69 2b 32 3c 6e 49 6e       if( i+2<nIn
25e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
25f0: 63 3d 3d 27 74 27 20 26 26 20 7a 49 6e 5b 69 2b  c=='t' && zIn[i+
2600: 31 5d 3d 3d 27 63 27 20 26 26 20 7a 49 6e 5b 69  1]=='c' && zIn[i
2610: 2b 32 5d 3d 3d 27 68 27 20 29 20 63 6f 6e 74 69  +2]=='h' ) conti
2620: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
2630: 20 7d 0a 20 20 20 20 63 20 3d 20 61 43 6c 61 73   }.    c = aClas
2640: 73 5b 63 26 30 78 37 66 5d 3b 0a 20 20 20 20 69  s[c&0x7f];.    i
2650: 66 28 20 63 3d 3d 43 43 4c 41 53 53 5f 53 50 41  f( c==CCLASS_SPA
2660: 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  CE ) continue;. 
2670: 20 20 20 69 66 28 20 63 3d 3d 43 43 4c 41 53 53     if( c==CCLASS
2680: 5f 4f 54 48 45 52 20 26 26 20 63 50 72 65 76 21  _OTHER && cPrev!
2690: 3d 43 43 4c 41 53 53 5f 44 49 47 49 54 20 29 20  =CCLASS_DIGIT ) 
26a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 43  continue;.    aC
26b0: 6c 61 73 73 20 3d 20 6d 69 64 43 6c 61 73 73 3b  lass = midClass;
26c0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 43 43 4c 41  .    if( c==CCLA
26d0: 53 53 5f 56 4f 57 45 4c 20 26 26 20 28 63 50 72  SS_VOWEL && (cPr
26e0: 65 76 58 3d 3d 43 43 4c 41 53 53 5f 52 20 7c 7c  evX==CCLASS_R ||
26f0: 20 63 50 72 65 76 58 3d 3d 43 43 4c 41 53 53 5f   cPrevX==CCLASS_
2700: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 63 6f 6e  L) ){.       con
2710: 74 69 6e 75 65 3b 20 2f 2a 20 4e 6f 20 76 6f 77  tinue; /* No vow
2720: 65 6c 73 20 62 65 73 69 64 65 20 4c 20 6f 72 20  els beside L or 
2730: 52 20 2a 2f 20 0a 20 20 20 20 7d 0a 20 20 20 20  R */ .    }.    
2740: 69 66 28 20 28 63 3d 3d 43 43 4c 41 53 53 5f 52  if( (c==CCLASS_R
2750: 20 7c 7c 20 63 3d 3d 43 43 4c 41 53 53 5f 4c 29   || c==CCLASS_L)
2760: 20 26 26 20 63 50 72 65 76 58 3d 3d 43 43 4c 41   && cPrevX==CCLA
2770: 53 53 5f 56 4f 57 45 4c 20 29 7b 0a 20 20 20 20  SS_VOWEL ){.    
2780: 20 20 20 6e 4f 75 74 2d 2d 3b 20 20 20 2f 2a 20     nOut--;   /* 
2790: 4e 6f 20 76 6f 77 65 6c 73 20 62 65 73 69 64 65  No vowels beside
27a0: 20 4c 20 6f 72 20 52 20 2a 2f 0a 20 20 20 20 7d   L or R */.    }
27b0: 0a 20 20 20 20 63 50 72 65 76 20 3d 20 63 3b 0a  .    cPrev = c;.
27c0: 20 20 20 20 69 66 28 20 63 3d 3d 43 43 4c 41 53      if( c==CCLAS
27d0: 53 5f 53 49 4c 45 4e 54 20 29 20 63 6f 6e 74 69  S_SILENT ) conti
27e0: 6e 75 65 3b 0a 20 20 20 20 63 50 72 65 76 58 20  nue;.    cPrevX 
27f0: 3d 20 63 3b 0a 20 20 20 20 63 20 3d 20 63 6c 61  = c;.    c = cla
2800: 73 73 4e 61 6d 65 5b 63 5d 3b 0a 20 20 20 20 61  ssName[c];.    a
2810: 73 73 65 72 74 28 20 6e 4f 75 74 3e 3d 30 20 29  ssert( nOut>=0 )
2820: 3b 0a 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d  ;.    if( nOut==
2830: 30 20 7c 7c 20 63 21 3d 7a 4f 75 74 5b 6e 4f 75  0 || c!=zOut[nOu
2840: 74 2d 31 5d 20 29 20 7a 4f 75 74 5b 6e 4f 75 74  t-1] ) zOut[nOut
2850: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 7a  ++] = c;.  }.  z
2860: 4f 75 74 5b 6e 4f 75 74 5d 20 3d 20 30 3b 0a 20  Out[nOut] = 0;. 
2870: 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a   return zOut;.}.
2880: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
2890: 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77  n SQL function w
28a0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 70 68  rapper around ph
28b0: 6f 6e 65 74 69 63 48 61 73 68 28 29 2e 20 20 53  oneticHash().  S
28c0: 65 65 0a 2a 2a 20 74 68 65 20 64 65 73 63 72 69  ee.** the descri
28d0: 70 74 69 6f 6e 20 6f 66 20 70 68 6f 6e 65 74 69  ption of phoneti
28e0: 63 48 61 73 68 28 29 20 66 6f 72 20 61 64 64 69  cHash() for addi
28f0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
2900: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2910: 69 64 20 70 68 6f 6e 65 74 69 63 48 61 73 68 53  id phoneticHashS
2920: 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  qlFunc(.  sqlite
2930: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
2940: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
2950: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2960: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73  **argv.){.  cons
2970: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2980: 2a 7a 49 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *zIn;.  unsigned
2990: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20   char *zOut;..  
29a0: 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  zIn = sqlite3_va
29b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
29c0: 29 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20  );.  if( zIn==0 
29d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 4f 75 74  ) return;.  zOut
29e0: 20 3d 20 70 68 6f 6e 65 74 69 63 48 61 73 68 28   = phoneticHash(
29f0: 7a 49 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  zIn, sqlite3_val
2a00: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
2a10: 29 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d  ));.  if( zOut==
2a20: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2a30: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
2a40: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
2a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
2a60: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
2a70: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a  ontext, (char*)z
2a80: 4f 75 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  Out, -1, sqlite3
2a90: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _free);.  }.}../
2aa0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2ab0: 63 68 61 72 61 63 74 65 72 20 63 6c 61 73 73 20  character class 
2ac0: 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 68 61  number for a cha
2ad0: 72 61 63 74 65 72 20 67 69 76 65 6e 20 69 74 73  racter given its
2ae0: 0a 2a 2a 20 63 6f 6e 74 65 78 74 2e 0a 2a 2f 0a  .** context..*/.
2af0: 73 74 61 74 69 63 20 63 68 61 72 20 63 68 61 72  static char char
2b00: 61 63 74 65 72 43 6c 61 73 73 28 63 68 61 72 20  acterClass(char 
2b10: 63 50 72 65 76 2c 20 63 68 61 72 20 63 29 7b 0a  cPrev, char c){.
2b20: 20 20 72 65 74 75 72 6e 20 63 50 72 65 76 3d 3d    return cPrev==
2b30: 30 20 3f 20 69 6e 69 74 43 6c 61 73 73 5b 63 26  0 ? initClass[c&
2b40: 30 78 37 66 5d 20 3a 20 6d 69 64 43 6c 61 73 73  0x7f] : midClass
2b50: 5b 63 26 30 78 37 66 5d 3b 0a 7d 0a 0a 2f 2a 0a  [c&0x7f];.}../*.
2b60: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
2b70: 73 74 20 6f 66 20 69 6e 73 65 72 74 69 6e 67 20  st of inserting 
2b80: 6f 72 20 64 65 6c 65 74 69 6e 67 20 63 68 61 72  or deleting char
2b90: 61 63 74 65 72 20 63 20 69 6d 6d 65 64 69 61 74  acter c immediat
2ba0: 65 6c 79 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ely.** following
2bb0: 20 63 68 61 72 61 63 74 65 72 20 63 50 72 65 76   character cPrev
2bc0: 2e 20 20 49 66 20 63 50 72 65 76 3d 3d 30 2c 20  .  If cPrev==0, 
2bd0: 74 68 61 74 20 6d 65 61 6e 73 20 63 20 69 73 20  that means c is 
2be0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 68 61  the first.** cha
2bf0: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 77 6f  racter of the wo
2c00: 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
2c10: 74 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65  t insertOrDelete
2c20: 43 6f 73 74 28 63 68 61 72 20 63 50 72 65 76 2c  Cost(char cPrev,
2c30: 20 63 68 61 72 20 63 2c 20 63 68 61 72 20 63 4e   char c, char cN
2c40: 65 78 74 29 7b 0a 20 20 63 68 61 72 20 63 6c 61  ext){.  char cla
2c50: 73 73 43 20 3d 20 63 68 61 72 61 63 74 65 72 43  ssC = characterC
2c60: 6c 61 73 73 28 63 50 72 65 76 2c 20 63 29 3b 0a  lass(cPrev, c);.
2c70: 20 20 63 68 61 72 20 63 6c 61 73 73 43 70 72 65    char classCpre
2c80: 76 3b 0a 0a 20 20 69 66 28 20 63 6c 61 73 73 43  v;..  if( classC
2c90: 3d 3d 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 20  ==CCLASS_SILENT 
2ca0: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  ){.    /* Insert
2cb0: 20 6f 72 20 64 65 6c 65 74 65 20 22 73 69 6c 65   or delete "sile
2cc0: 6e 74 22 20 63 68 61 72 61 63 74 65 72 73 20 73  nt" characters s
2cd0: 75 63 68 20 61 73 20 48 20 6f 72 20 57 20 2a 2f  uch as H or W */
2ce0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
2cf0: 20 7d 0a 20 20 69 66 28 20 63 50 72 65 76 3d 3d   }.  if( cPrev==
2d00: 63 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 70 65  c ){.    /* Repe
2d10: 61 74 65 64 20 63 68 61 72 61 63 74 65 72 73 2c  ated characters,
2d20: 20 6f 72 20 6d 69 73 73 20 61 20 72 65 70 65 61   or miss a repea
2d30: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
2d40: 31 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c  10;.  }.  if( cl
2d50: 61 73 73 43 3d 3d 43 43 4c 41 53 53 5f 56 4f 57  assC==CCLASS_VOW
2d60: 45 4c 20 26 26 20 28 63 50 72 65 76 3d 3d 27 72  EL && (cPrev=='r
2d70: 27 20 7c 7c 20 63 4e 65 78 74 3d 3d 27 72 27 29  ' || cNext=='r')
2d80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 32   ){.    return 2
2d90: 30 3b 20 20 2f 2a 20 49 6e 73 65 72 74 20 61 20  0;  /* Insert a 
2da0: 76 6f 77 65 6c 20 62 65 66 6f 72 65 20 6f 72 20  vowel before or 
2db0: 61 66 74 65 72 20 27 72 27 20 2a 2f 0a 20 20 7d  after 'r' */.  }
2dc0: 0a 20 20 63 6c 61 73 73 43 70 72 65 76 20 3d 20  .  classCprev = 
2dd0: 63 68 61 72 61 63 74 65 72 43 6c 61 73 73 28 63  characterClass(c
2de0: 50 72 65 76 2c 20 63 50 72 65 76 29 3b 0a 20 20  Prev, cPrev);.  
2df0: 69 66 28 20 63 6c 61 73 73 43 3d 3d 63 6c 61 73  if( classC==clas
2e00: 73 43 70 72 65 76 20 29 7b 0a 20 20 20 20 69 66  sCprev ){.    if
2e10: 28 20 63 6c 61 73 73 43 3d 3d 43 43 4c 41 53 53  ( classC==CCLASS
2e20: 5f 56 4f 57 45 4c 20 29 7b 0a 20 20 20 20 20 20  _VOWEL ){.      
2e30: 2f 2a 20 52 65 6d 6f 76 65 20 6f 72 20 61 64 64  /* Remove or add
2e40: 20 61 20 6e 65 77 20 76 6f 77 65 6c 20 74 6f 20   a new vowel to 
2e50: 61 20 76 6f 77 65 6c 20 63 6c 75 73 74 65 72 20  a vowel cluster 
2e60: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
2e70: 31 35 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  15;.    }else{. 
2e80: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 6f       /* Remove o
2e90: 72 20 61 64 64 20 61 20 63 6f 6e 73 6f 6e 61 6e  r add a consonan
2ea0: 74 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 61 6d  t not in the sam
2eb0: 65 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 20  e class */.     
2ec0: 20 72 65 74 75 72 6e 20 35 30 3b 0a 20 20 20 20   return 50;.    
2ed0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 6e 79 20  }.  }..  /* any 
2ee0: 6f 74 68 65 72 20 63 68 61 72 61 63 74 65 72 20  other character 
2ef0: 69 6e 73 65 72 74 69 6f 6e 20 6f 72 20 64 65 6c  insertion or del
2f00: 65 74 69 6f 6e 20 2a 2f 0a 20 20 72 65 74 75 72  etion */.  retur
2f10: 6e 20 31 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n 100;.}../*.** 
2f20: 44 69 76 69 64 65 20 74 68 65 20 69 6e 73 65 72  Divide the inser
2f30: 74 69 6f 6e 20 63 6f 73 74 20 62 79 20 74 68 69  tion cost by thi
2f40: 73 20 66 61 63 74 6f 72 20 77 68 65 6e 20 61 70  s factor when ap
2f50: 70 65 6e 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  pending to the.*
2f60: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 77 6f 72  * end of the wor
2f70: 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 49  d..*/.#define FI
2f80: 4e 41 4c 5f 49 4e 53 5f 43 4f 53 54 5f 44 49 56  NAL_INS_COST_DIV
2f90: 20 20 34 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72    4../*.** Retur
2fa0: 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 73 75  n the cost of su
2fb0: 62 73 74 69 74 75 74 69 6e 67 20 63 54 6f 20 69  bstituting cTo i
2fc0: 6e 20 70 6c 61 63 65 20 6f 66 20 63 46 72 6f 6d  n place of cFrom
2fd0: 20 61 73 73 75 6d 69 6e 67 0a 2a 2a 20 74 68 65   assuming.** the
2fe0: 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63   previous charac
2ff0: 74 65 72 20 69 73 20 63 50 72 65 76 2e 20 20 49  ter is cPrev.  I
3000: 66 20 63 50 72 65 76 3d 3d 30 20 74 68 65 6e 20  f cPrev==0 then 
3010: 63 54 6f 20 69 73 20 74 68 65 20 66 69 72 73 74  cTo is the first
3020: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 6f 66  .** character of
3030: 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a 73 74   the word..*/.st
3040: 61 74 69 63 20 69 6e 74 20 73 75 62 73 74 69 74  atic int substit
3050: 75 74 65 43 6f 73 74 28 63 68 61 72 20 63 50 72  uteCost(char cPr
3060: 65 76 2c 20 63 68 61 72 20 63 46 72 6f 6d 2c 20  ev, char cFrom, 
3070: 63 68 61 72 20 63 54 6f 29 7b 0a 20 20 63 68 61  char cTo){.  cha
3080: 72 20 63 6c 61 73 73 46 72 6f 6d 2c 20 63 6c 61  r classFrom, cla
3090: 73 73 54 6f 3b 0a 20 20 69 66 28 20 63 46 72 6f  ssTo;.  if( cFro
30a0: 6d 3d 3d 63 54 6f 20 29 7b 0a 20 20 20 20 2f 2a  m==cTo ){.    /*
30b0: 20 45 78 61 63 74 20 6d 61 74 63 68 20 2a 2f 0a   Exact match */.
30c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
30d0: 7d 0a 20 20 69 66 28 20 63 46 72 6f 6d 3d 3d 28  }.  if( cFrom==(
30e0: 63 54 6f 5e 30 78 32 30 29 20 26 26 20 28 28 63  cTo^0x20) && ((c
30f0: 54 6f 3e 3d 27 41 27 20 26 26 20 63 54 6f 3c 3d  To>='A' && cTo<=
3100: 27 5a 27 29 20 7c 7c 20 28 63 54 6f 3e 3d 27 61  'Z') || (cTo>='a
3110: 27 20 26 26 20 63 54 6f 3c 3d 27 7a 27 29 29 20  ' && cTo<='z')) 
3120: 29 7b 0a 20 20 20 20 2f 2a 20 64 69 66 66 65 72  ){.    /* differ
3130: 20 6f 6e 6c 79 20 69 6e 20 63 61 73 65 20 2a 2f   only in case */
3140: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3150: 20 7d 0a 20 20 63 6c 61 73 73 46 72 6f 6d 20 3d   }.  classFrom =
3160: 20 63 68 61 72 61 63 74 65 72 43 6c 61 73 73 28   characterClass(
3170: 63 50 72 65 76 2c 20 63 46 72 6f 6d 29 3b 0a 20  cPrev, cFrom);. 
3180: 20 63 6c 61 73 73 54 6f 20 3d 20 63 68 61 72 61   classTo = chara
3190: 63 74 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c  cterClass(cPrev,
31a0: 20 63 54 6f 29 3b 0a 20 20 69 66 28 20 63 6c 61   cTo);.  if( cla
31b0: 73 73 46 72 6f 6d 3d 3d 63 6c 61 73 73 54 6f 20  ssFrom==classTo 
31c0: 29 7b 0a 20 20 20 20 2f 2a 20 53 61 6d 65 20 63  ){.    /* Same c
31d0: 68 61 72 61 63 74 65 72 20 63 6c 61 73 73 20 2a  haracter class *
31e0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 34 30 3b  /.    return 40;
31f0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6c 61 73 73  .  }.  if( class
3200: 46 72 6f 6d 3e 3d 43 43 4c 41 53 53 5f 42 20 26  From>=CCLASS_B &
3210: 26 20 63 6c 61 73 73 46 72 6f 6d 3c 3d 43 43 4c  & classFrom<=CCL
3220: 41 53 53 5f 59 0a 20 20 20 20 20 20 26 26 20 63  ASS_Y.      && c
3230: 6c 61 73 73 54 6f 3e 3d 43 43 4c 41 53 53 5f 42  lassTo>=CCLASS_B
3240: 20 26 26 20 63 6c 61 73 73 54 6f 3c 3d 43 43 4c   && classTo<=CCL
3250: 41 53 53 5f 59 20 29 7b 0a 20 20 20 20 2f 2a 20  ASS_Y ){.    /* 
3260: 43 6f 6e 76 65 72 74 20 66 72 6f 6d 20 6f 6e 65  Convert from one
3270: 20 63 6f 6e 73 6f 6e 61 6e 74 20 74 6f 20 61 6e   consonant to an
3280: 6f 74 68 65 72 2c 20 62 75 74 20 69 6e 20 61 20  other, but in a 
3290: 64 69 66 66 65 72 65 6e 74 20 63 6c 61 73 73 20  different class 
32a0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 37 35  */.    return 75
32b0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 6e 79 20 6f  ;.  }.  /* Any o
32c0: 74 68 65 72 20 73 75 62 73 69 74 75 74 69 6f 6e  ther subsitution
32d0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 30 30   */.  return 100
32e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
32f0: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 7a 41 20   two strings zA 
3300: 61 6e 64 20 7a 42 20 77 68 69 63 68 20 61 72 65  and zB which are
3310: 20 70 75 72 65 20 41 53 43 49 49 2c 20 72 65 74   pure ASCII, ret
3320: 75 72 6e 20 74 68 65 20 63 6f 73 74 0a 2a 2a 20  urn the cost.** 
3330: 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  of transforming 
3340: 7a 41 20 69 6e 74 6f 20 7a 42 2e 20 20 49 66 20  zA into zB.  If 
3350: 7a 41 20 65 6e 64 73 20 77 69 74 68 20 27 2a 27  zA ends with '*'
3360: 20 61 73 73 75 6d 65 20 74 68 61 74 20 69 74 20   assume that it 
3370: 69 73 0a 2a 2a 20 61 20 70 72 65 66 69 78 20 6f  is.** a prefix o
3380: 66 20 7a 42 20 61 6e 64 20 67 69 76 65 20 6f 6e  f zB and give on
3390: 6c 79 20 6d 69 6e 69 6d 61 6c 20 70 65 6e 61 6c  ly minimal penal
33a0: 74 79 20 66 6f 72 20 65 78 74 72 61 20 63 68 61  ty for extra cha
33b0: 72 61 63 74 65 72 73 0a 2a 2a 20 6f 6e 20 74 68  racters.** on th
33c0: 65 20 65 6e 64 20 6f 66 20 7a 42 2e 0a 2a 2a 0a  e end of zB..**.
33d0: 2a 2a 20 53 6d 61 6c 6c 65 72 20 6e 75 6d 62 65  ** Smaller numbe
33e0: 72 73 20 6d 65 61 6e 20 61 20 63 6c 6f 73 65 72  rs mean a closer
33f0: 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 4e 65   match..**.** Ne
3400: 67 61 74 69 76 65 20 76 61 6c 75 65 73 20 69 6e  gative values in
3410: 64 69 63 61 74 65 20 61 6e 20 65 72 72 6f 72 3a  dicate an error:
3420: 0a 2a 2a 20 20 20 20 2d 31 20 20 4f 6e 65 20 6f  .**    -1  One o
3430: 66 20 74 68 65 20 69 6e 70 75 74 73 20 69 73 20  f the inputs is 
3440: 4e 55 4c 4c 0a 2a 2a 20 20 20 20 2d 32 20 20 4e  NULL.**    -2  N
3450: 6f 6e 2d 41 53 43 49 49 20 63 68 61 72 61 63 74  on-ASCII charact
3460: 65 72 73 20 6f 6e 20 69 6e 70 75 74 0a 2a 2a 20  ers on input.** 
3470: 20 20 20 2d 33 20 20 55 6e 61 62 6c 65 20 74 6f     -3  Unable to
3480: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
3490: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 4d 61 74   .**.** If pnMat
34a0: 63 68 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ch is not NULL, 
34b0: 74 68 65 6e 20 2a 70 6e 4d 61 74 63 68 20 69 73  then *pnMatch is
34c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
34d0: 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 6f  er of bytes.** o
34e0: 66 20 7a 42 20 74 68 61 74 20 6d 61 74 63 68 65  f zB that matche
34f0: 64 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e  d the pattern in
3500: 20 7a 41 2e 20 49 66 20 7a 41 20 64 6f 65 73 20   zA. If zA does 
3510: 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 61 20 27  not end with a '
3520: 2a 27 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  *',.** then this
3530: 20 76 61 6c 75 65 20 69 73 20 61 6c 77 61 79 73   value is always
3540: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
3550: 79 74 65 73 20 69 6e 20 7a 42 20 28 69 2e 65 2e  ytes in zB (i.e.
3560: 20 73 74 72 6c 65 6e 28 7a 42 29 29 2e 0a 2a 2a   strlen(zB))..**
3570: 20 49 66 20 7a 41 20 64 6f 65 73 20 65 6e 64 20   If zA does end 
3580: 69 6e 20 61 20 27 2a 27 2c 20 74 68 65 6e 20 69  in a '*', then i
3590: 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
35a0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
35b0: 70 72 65 66 69 78 0a 2a 2a 20 6f 66 20 7a 42 20  prefix.** of zB 
35c0: 74 68 61 74 20 77 61 73 20 64 65 65 6d 65 64 20  that was deemed 
35d0: 74 6f 20 6d 61 74 63 68 20 7a 41 2e 0a 2a 2f 0a  to match zA..*/.
35e0: 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74 64  static int editd
35f0: 69 73 74 31 28 63 6f 6e 73 74 20 63 68 61 72 20  ist1(const char 
3600: 2a 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *zA, const char 
3610: 2a 7a 42 2c 20 69 6e 74 20 2a 70 6e 4d 61 74 63  *zB, int *pnMatc
3620: 68 29 7b 0a 20 20 69 6e 74 20 6e 41 2c 20 6e 42  h){.  int nA, nB
3630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3640: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
3650: 74 65 72 73 20 69 6e 20 7a 41 5b 5d 20 61 6e 64  ters in zA[] and
3660: 20 7a 42 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 78   zB[] */.  int x
3670: 41 2c 20 78 42 3b 20 20 20 20 20 20 20 20 20 20  A, xB;          
3680: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
3690: 72 73 20 66 6f 72 20 7a 41 5b 5d 20 61 6e 64 20  rs for zA[] and 
36a0: 7a 42 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 63  zB[] */.  char c
36b0: 41 2c 20 63 42 3b 20 20 20 20 20 20 20 20 20 20  A, cB;          
36c0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 63 68 61 72   /* Current char
36d0: 61 63 74 65 72 20 6f 66 20 7a 41 20 61 6e 64 20  acter of zA and 
36e0: 7a 42 20 2a 2f 0a 20 20 63 68 61 72 20 63 41 70  zB */.  char cAp
36f0: 72 65 76 2c 20 63 42 70 72 65 76 3b 20 20 20 2f  rev, cBprev;   /
3700: 2a 20 50 72 65 76 69 6f 75 73 20 63 68 61 72 61  * Previous chara
3710: 63 74 65 72 20 6f 66 20 7a 41 20 61 6e 64 20 7a  cter of zA and z
3720: 42 20 2a 2f 0a 20 20 63 68 61 72 20 63 41 6e 65  B */.  char cAne
3730: 78 74 2c 20 63 42 6e 65 78 74 3b 20 20 20 2f 2a  xt, cBnext;   /*
3740: 20 4e 65 78 74 20 63 68 61 72 61 63 74 65 72 20   Next character 
3750: 69 6e 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a  in zA and zB */.
3760: 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20    int d;        
3770: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 74           /* Nort
3780: 68 2d 77 65 73 74 20 63 6f 73 74 20 76 61 6c 75  h-west cost valu
3790: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 63 20 3d 20  e */.  int dc = 
37a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
37b0: 20 4e 6f 72 74 68 2d 77 65 73 74 20 63 68 61 72   North-west char
37c0: 61 63 74 65 72 20 76 61 6c 75 65 20 2a 2f 0a 20  acter value */. 
37d0: 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20   int res;       
37e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
37f0: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74   result */.  int
3800: 20 2a 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20   *m;            
3810: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
3820: 6d 61 74 72 69 78 20 2a 2f 0a 20 20 63 68 61 72  matrix */.  char
3830: 20 2a 63 78 3b 20 20 20 20 20 20 20 20 20 20 20   *cx;           
3840: 20 20 20 2f 2a 20 43 6f 72 72 65 73 70 6f 6e 64     /* Correspond
3850: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 76 61  ing character va
3860: 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 74  lues */.  int *t
3870: 6f 46 72 65 65 20 3d 20 30 3b 20 20 20 20 20 20  oFree = 0;      
3880: 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61   /* Malloced spa
3890: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 53 74 61  ce */.  int mSta
38a0: 63 6b 5b 36 30 2b 31 35 5d 3b 20 20 20 20 20 2f  ck[60+15];     /
38b0: 2a 20 53 74 61 63 6b 20 73 70 61 63 65 20 74 6f  * Stack space to
38c0: 20 75 73 65 20 69 66 20 6e 6f 74 20 74 6f 6f 20   use if not too 
38d0: 6d 75 63 68 20 69 73 20 6e 65 65 64 65 64 20 2a  much is needed *
38e0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d  /.  int nMatch =
38f0: 20 30 3b 0a 0a 20 20 2f 2a 20 45 61 72 6c 79 20   0;..  /* Early 
3900: 6f 75 74 20 69 66 20 65 69 74 68 65 72 20 69 6e  out if either in
3910: 70 75 74 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 20  put is NULL */. 
3920: 20 69 66 28 20 7a 41 3d 3d 30 20 7c 7c 20 7a 42   if( zA==0 || zB
3930: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
3940: 0a 0a 20 20 2f 2a 20 53 6b 69 70 20 61 6e 79 20  ..  /* Skip any 
3950: 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 2a 2f  common prefix */
3960: 0a 20 20 77 68 69 6c 65 28 20 7a 41 5b 30 5d 20  .  while( zA[0] 
3970: 26 26 20 7a 41 5b 30 5d 3d 3d 7a 42 5b 30 5d 20  && zA[0]==zB[0] 
3980: 29 7b 20 64 63 20 3d 20 7a 41 5b 30 5d 3b 20 7a  ){ dc = zA[0]; z
3990: 41 2b 2b 3b 20 7a 42 2b 2b 3b 20 6e 4d 61 74 63  A++; zB++; nMatc
39a0: 68 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 70 6e 4d  h++; }.  if( pnM
39b0: 61 74 63 68 20 29 20 2a 70 6e 4d 61 74 63 68 20  atch ) *pnMatch 
39c0: 3d 20 6e 4d 61 74 63 68 3b 0a 20 20 69 66 28 20  = nMatch;.  if( 
39d0: 7a 41 5b 30 5d 3d 3d 30 20 26 26 20 7a 42 5b 30  zA[0]==0 && zB[0
39e0: 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ]==0 ) return 0;
39f0: 0a 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66  ..#if 0.  printf
3a00: 28 22 41 3d 5c 22 25 73 5c 22 20 42 3d 5c 22 25  ("A=\"%s\" B=\"%
3a10: 73 5c 22 20 64 63 3d 25 63 5c 6e 22 2c 20 7a 41  s\" dc=%c\n", zA
3a20: 2c 20 7a 42 2c 20 64 63 3f 64 63 3a 27 20 27 29  , zB, dc?dc:' ')
3a30: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56  ;.#endif..  /* V
3a40: 65 72 69 66 79 20 69 6e 70 75 74 20 73 74 72 69  erify input stri
3a50: 6e 67 73 20 61 6e 64 20 6d 65 61 73 75 72 65 20  ngs and measure 
3a60: 74 68 65 69 72 20 6c 65 6e 67 74 68 73 20 2a 2f  their lengths */
3a70: 0a 20 20 66 6f 72 28 6e 41 3d 30 3b 20 7a 41 5b  .  for(nA=0; zA[
3a80: 6e 41 5d 3b 20 6e 41 2b 2b 29 7b 0a 20 20 20 20  nA]; nA++){.    
3a90: 69 66 28 20 7a 41 5b 6e 41 5d 26 30 78 38 30 20  if( zA[nA]&0x80 
3aa0: 29 20 72 65 74 75 72 6e 20 2d 32 3b 0a 20 20 7d  ) return -2;.  }
3ab0: 0a 20 20 66 6f 72 28 6e 42 3d 30 3b 20 7a 42 5b  .  for(nB=0; zB[
3ac0: 6e 42 5d 3b 20 6e 42 2b 2b 29 7b 0a 20 20 20 20  nB]; nB++){.    
3ad0: 69 66 28 20 7a 42 5b 6e 42 5d 26 30 78 38 30 20  if( zB[nB]&0x80 
3ae0: 29 20 72 65 74 75 72 6e 20 2d 32 3b 0a 20 20 7d  ) return -2;.  }
3af0: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 70  ..  /* Special p
3b00: 72 6f 63 65 73 73 69 6e 67 20 69 66 20 65 69 74  rocessing if eit
3b10: 68 65 72 20 73 74 72 69 6e 67 20 69 73 20 65 6d  her string is em
3b20: 70 74 79 20 2a 2f 0a 20 20 69 66 28 20 6e 41 3d  pty */.  if( nA=
3b30: 3d 30 20 29 7b 0a 20 20 20 20 63 42 70 72 65 76  =0 ){.    cBprev
3b40: 20 3d 20 64 63 3b 0a 20 20 20 20 66 6f 72 28 78   = dc;.    for(x
3b50: 42 3d 72 65 73 3d 30 3b 20 28 63 42 20 3d 20 7a  B=res=0; (cB = z
3b60: 42 5b 78 42 5d 29 21 3d 30 3b 20 78 42 2b 2b 29  B[xB])!=0; xB++)
3b70: 7b 0a 20 20 20 20 20 20 72 65 73 20 2b 3d 20 69  {.      res += i
3b80: 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73  nsertOrDeleteCos
3b90: 74 28 63 42 70 72 65 76 2c 20 63 42 2c 20 7a 42  t(cBprev, cB, zB
3ba0: 5b 78 42 2b 31 5d 29 2f 46 49 4e 41 4c 5f 49 4e  [xB+1])/FINAL_IN
3bb0: 53 5f 43 4f 53 54 5f 44 49 56 3b 0a 20 20 20 20  S_COST_DIV;.    
3bc0: 20 20 63 42 70 72 65 76 20 3d 20 63 42 3b 0a 20    cBprev = cB;. 
3bd0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
3be0: 72 65 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  res;.  }.  if( n
3bf0: 42 3d 3d 30 20 29 7b 0a 20 20 20 20 63 41 70 72  B==0 ){.    cApr
3c00: 65 76 20 3d 20 64 63 3b 0a 20 20 20 20 66 6f 72  ev = dc;.    for
3c10: 28 78 41 3d 72 65 73 3d 30 3b 20 28 63 41 20 3d  (xA=res=0; (cA =
3c20: 20 7a 41 5b 78 41 5d 29 21 3d 30 3b 20 78 41 2b   zA[xA])!=0; xA+
3c30: 2b 29 7b 0a 20 20 20 20 20 20 72 65 73 20 2b 3d  +){.      res +=
3c40: 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43   insertOrDeleteC
3c50: 6f 73 74 28 63 41 70 72 65 76 2c 20 63 41 2c 20  ost(cAprev, cA, 
3c60: 7a 41 5b 78 41 2b 31 5d 29 3b 0a 20 20 20 20 20  zA[xA+1]);.     
3c70: 20 63 41 70 72 65 76 20 3d 20 63 41 3b 0a 20 20   cAprev = cA;.  
3c80: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
3c90: 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 20  es;.  }..  /* A 
3ca0: 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 42  is a prefix of B
3cb0: 20 2a 2f 0a 20 20 69 66 28 20 7a 41 5b 30 5d 3d   */.  if( zA[0]=
3cc0: 3d 27 2a 27 20 26 26 20 7a 41 5b 31 5d 3d 3d 30  ='*' && zA[1]==0
3cd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
3ce0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  /* Allocate and 
3cf0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57  initialize the W
3d00: 61 67 6e 65 72 20 6d 61 74 72 69 78 20 2a 2f 0a  agner matrix */.
3d10: 20 20 69 66 28 20 6e 42 3c 28 73 69 7a 65 6f 66    if( nB<(sizeof
3d20: 28 6d 53 74 61 63 6b 29 2a 34 29 2f 28 73 69 7a  (mStack)*4)/(siz
3d30: 65 6f 66 28 6d 53 74 61 63 6b 5b 30 5d 29 2a 35  eof(mStack[0])*5
3d40: 29 20 29 7b 0a 20 20 20 20 6d 20 3d 20 6d 53 74  ) ){.    m = mSt
3d50: 61 63 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ack;.  }else{.  
3d60: 20 20 6d 20 3d 20 74 6f 46 72 65 65 20 3d 20 73    m = toFree = s
3d70: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 28  qlite3_malloc( (
3d80: 6e 42 2b 31 29 2a 35 2a 73 69 7a 65 6f 66 28 6d  nB+1)*5*sizeof(m
3d90: 5b 30 5d 29 2f 34 20 29 3b 0a 20 20 20 20 69 66  [0])/4 );.    if
3da0: 28 20 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( m==0 ) return 
3db0: 2d 33 3b 0a 20 20 7d 0a 20 20 63 78 20 3d 20 28  -3;.  }.  cx = (
3dc0: 63 68 61 72 2a 29 26 6d 5b 6e 42 2b 31 5d 3b 0a  char*)&m[nB+1];.
3dd0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
3de0: 65 20 57 61 67 6e 65 72 20 65 64 69 74 20 64 69  e Wagner edit di
3df0: 73 74 61 6e 63 65 20 2a 2f 0a 20 20 6d 5b 30 5d  stance */.  m[0]
3e00: 20 3d 20 30 3b 0a 20 20 63 78 5b 30 5d 20 3d 20   = 0;.  cx[0] = 
3e10: 64 63 3b 0a 20 20 63 42 70 72 65 76 20 3d 20 64  dc;.  cBprev = d
3e20: 63 3b 0a 20 20 66 6f 72 28 78 42 3d 31 3b 20 78  c;.  for(xB=1; x
3e30: 42 3c 3d 6e 42 3b 20 78 42 2b 2b 29 7b 0a 20 20  B<=nB; xB++){.  
3e40: 20 20 63 42 6e 65 78 74 20 3d 20 7a 42 5b 78 42    cBnext = zB[xB
3e50: 5d 3b 0a 20 20 20 20 63 42 20 3d 20 7a 42 5b 78  ];.    cB = zB[x
3e60: 42 2d 31 5d 3b 0a 20 20 20 20 63 78 5b 78 42 5d  B-1];.    cx[xB]
3e70: 20 3d 20 63 42 3b 0a 20 20 20 20 6d 5b 78 42 5d   = cB;.    m[xB]
3e80: 20 3d 20 6d 5b 78 42 2d 31 5d 20 2b 20 69 6e 73   = m[xB-1] + ins
3e90: 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28  ertOrDeleteCost(
3ea0: 63 42 70 72 65 76 2c 20 63 42 2c 20 63 42 6e 65  cBprev, cB, cBne
3eb0: 78 74 29 3b 0a 20 20 20 20 63 42 70 72 65 76 20  xt);.    cBprev 
3ec0: 3d 20 63 42 3b 0a 20 20 7d 0a 20 20 63 41 70 72  = cB;.  }.  cApr
3ed0: 65 76 20 3d 20 64 63 3b 0a 20 20 66 6f 72 28 78  ev = dc;.  for(x
3ee0: 41 3d 31 3b 20 78 41 3c 3d 6e 41 3b 20 78 41 2b  A=1; xA<=nA; xA+
3ef0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 73 74  +){.    int last
3f00: 41 20 3d 20 28 78 41 3d 3d 6e 41 29 3b 0a 20 20  A = (xA==nA);.  
3f10: 20 20 63 41 20 3d 20 7a 41 5b 78 41 2d 31 5d 3b    cA = zA[xA-1];
3f20: 0a 20 20 20 20 63 41 6e 65 78 74 20 3d 20 7a 41  .    cAnext = zA
3f30: 5b 78 41 5d 3b 0a 20 20 20 20 69 66 28 20 63 41  [xA];.    if( cA
3f40: 3d 3d 27 2a 27 20 26 26 20 6c 61 73 74 41 20 29  =='*' && lastA )
3f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 20 3d 20   break;.    d = 
3f60: 6d 5b 30 5d 3b 0a 20 20 20 20 64 63 20 3d 20 63  m[0];.    dc = c
3f70: 78 5b 30 5d 3b 0a 20 20 20 20 6d 5b 30 5d 20 3d  x[0];.    m[0] =
3f80: 20 64 20 2b 20 69 6e 73 65 72 74 4f 72 44 65 6c   d + insertOrDel
3f90: 65 74 65 43 6f 73 74 28 63 41 70 72 65 76 2c 20  eteCost(cAprev, 
3fa0: 63 41 2c 20 63 41 6e 65 78 74 29 3b 0a 20 20 20  cA, cAnext);.   
3fb0: 20 63 42 70 72 65 76 20 3d 20 30 3b 0a 20 20 20   cBprev = 0;.   
3fc0: 20 66 6f 72 28 78 42 3d 31 3b 20 78 42 3c 3d 6e   for(xB=1; xB<=n
3fd0: 42 3b 20 78 42 2b 2b 29 7b 0a 20 20 20 20 20 20  B; xB++){.      
3fe0: 69 6e 74 20 74 6f 74 61 6c 43 6f 73 74 2c 20 69  int totalCost, i
3ff0: 6e 73 43 6f 73 74 2c 20 64 65 6c 43 6f 73 74 2c  nsCost, delCost,
4000: 20 73 75 62 43 6f 73 74 2c 20 6e 63 78 3b 0a 20   subCost, ncx;. 
4010: 20 20 20 20 20 63 42 20 3d 20 7a 42 5b 78 42 2d       cB = zB[xB-
4020: 31 5d 3b 0a 20 20 20 20 20 20 63 42 6e 65 78 74  1];.      cBnext
4030: 20 3d 20 7a 42 5b 78 42 5d 3b 0a 0a 20 20 20 20   = zB[xB];..    
4040: 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 69 6e 73    /* Cost to ins
4050: 65 72 74 20 63 42 20 2a 2f 0a 20 20 20 20 20 20  ert cB */.      
4060: 69 6e 73 43 6f 73 74 20 3d 20 69 6e 73 65 72 74  insCost = insert
4070: 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63 78 5b  OrDeleteCost(cx[
4080: 78 42 2d 31 5d 2c 20 63 42 2c 20 63 42 6e 65 78  xB-1], cB, cBnex
4090: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  t);.      if( la
40a0: 73 74 41 20 29 20 69 6e 73 43 6f 73 74 20 2f 3d  stA ) insCost /=
40b0: 20 46 49 4e 41 4c 5f 49 4e 53 5f 43 4f 53 54 5f   FINAL_INS_COST_
40c0: 44 49 56 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  DIV;..      /* C
40d0: 6f 73 74 20 74 6f 20 64 65 6c 65 74 65 20 63 41  ost to delete cA
40e0: 20 2a 2f 0a 20 20 20 20 20 20 64 65 6c 43 6f 73   */.      delCos
40f0: 74 20 3d 20 69 6e 73 65 72 74 4f 72 44 65 6c 65  t = insertOrDele
4100: 74 65 43 6f 73 74 28 63 78 5b 78 42 5d 2c 20 63  teCost(cx[xB], c
4110: 41 2c 20 63 42 6e 65 78 74 29 3b 0a 0a 20 20 20  A, cBnext);..   
4120: 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 73 75     /* Cost to su
4130: 62 73 74 69 74 75 74 65 20 63 41 2d 3e 63 42 20  bstitute cA->cB 
4140: 2a 2f 0a 20 20 20 20 20 20 73 75 62 43 6f 73 74  */.      subCost
4150: 20 3d 20 73 75 62 73 74 69 74 75 74 65 43 6f 73   = substituteCos
4160: 74 28 63 78 5b 78 42 2d 31 5d 2c 20 63 41 2c 20  t(cx[xB-1], cA, 
4170: 63 42 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42  cB);..      /* B
4180: 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 20 20  est cost */.    
4190: 20 20 74 6f 74 61 6c 43 6f 73 74 20 3d 20 69 6e    totalCost = in
41a0: 73 43 6f 73 74 20 2b 20 6d 5b 78 42 2d 31 5d 3b  sCost + m[xB-1];
41b0: 0a 20 20 20 20 20 20 6e 63 78 20 3d 20 63 42 3b  .      ncx = cB;
41c0: 0a 20 20 20 20 20 20 69 66 28 20 28 64 65 6c 43  .      if( (delC
41d0: 6f 73 74 20 2b 20 6d 5b 78 42 5d 29 3c 74 6f 74  ost + m[xB])<tot
41e0: 61 6c 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  alCost ){.      
41f0: 20 20 74 6f 74 61 6c 43 6f 73 74 20 3d 20 64 65    totalCost = de
4200: 6c 43 6f 73 74 20 2b 20 6d 5b 78 42 5d 3b 0a 20  lCost + m[xB];. 
4210: 20 20 20 20 20 20 20 6e 63 78 20 3d 20 63 41 3b         ncx = cA;
4220: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4230: 66 28 20 28 73 75 62 43 6f 73 74 20 2b 20 64 29  f( (subCost + d)
4240: 3c 74 6f 74 61 6c 43 6f 73 74 20 29 7b 0a 20 20  <totalCost ){.  
4250: 20 20 20 20 20 20 74 6f 74 61 6c 43 6f 73 74 20        totalCost 
4260: 3d 20 73 75 62 43 6f 73 74 20 2b 20 64 3b 0a 20  = subCost + d;. 
4270: 20 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20       }..#if 0.  
4280: 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 2c 25      printf("%d,%
4290: 64 20 64 3d 25 34 64 20 75 3d 25 34 64 20 72 3d  d d=%4d u=%4d r=
42a0: 25 34 64 20 64 63 3d 25 63 20 63 41 3d 25 63 20  %4d dc=%c cA=%c 
42b0: 63 42 3d 25 63 22 0a 20 20 20 20 20 20 20 20 20  cB=%c".         
42c0: 20 20 20 20 22 20 69 6e 73 3d 25 34 64 20 64 65      " ins=%4d de
42d0: 6c 3d 25 34 64 20 73 75 62 3d 25 34 64 20 74 3d  l=%4d sub=%4d t=
42e0: 25 34 64 20 6e 63 78 3d 25 63 5c 6e 22 2c 0a 20  %4d ncx=%c\n",. 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 78 41 2c 20              xA, 
4300: 78 42 2c 20 64 2c 20 6d 5b 78 42 5d 2c 20 6d 5b  xB, d, m[xB], m[
4310: 78 42 2d 31 5d 2c 20 64 63 3f 64 63 3a 27 20 27  xB-1], dc?dc:' '
4320: 2c 20 63 41 2c 20 63 42 2c 0a 20 20 20 20 20 20  , cA, cB,.      
4330: 20 20 20 20 20 20 20 69 6e 73 43 6f 73 74 2c 20         insCost, 
4340: 64 65 6c 43 6f 73 74 2c 20 73 75 62 43 6f 73 74  delCost, subCost
4350: 2c 20 74 6f 74 61 6c 43 6f 73 74 2c 20 6e 63 78  , totalCost, ncx
4360: 3f 6e 63 78 3a 27 20 27 29 3b 0a 23 65 6e 64 69  ?ncx:' ');.#endi
4370: 66 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  f..      /* Upda
4380: 74 65 20 74 68 65 20 6d 61 74 72 69 78 20 2a 2f  te the matrix */
4390: 0a 20 20 20 20 20 20 64 20 3d 20 6d 5b 78 42 5d  .      d = m[xB]
43a0: 3b 0a 20 20 20 20 20 20 64 63 20 3d 20 63 78 5b  ;.      dc = cx[
43b0: 78 42 5d 3b 0a 20 20 20 20 20 20 6d 5b 78 42 5d  xB];.      m[xB]
43c0: 20 3d 20 74 6f 74 61 6c 43 6f 73 74 3b 0a 20 20   = totalCost;.  
43d0: 20 20 20 20 63 78 5b 78 42 5d 20 3d 20 6e 63 78      cx[xB] = ncx
43e0: 3b 0a 20 20 20 20 20 20 63 42 70 72 65 76 20 3d  ;.      cBprev =
43f0: 20 63 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   cB;.    }.    c
4400: 41 70 72 65 76 20 3d 20 63 41 3b 0a 20 20 7d 0a  Aprev = cA;.  }.
4410: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 77  .  /* Free the w
4420: 61 67 6e 65 72 20 6d 61 74 72 69 78 20 61 6e 64  agner matrix and
4430: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   return the resu
4440: 6c 74 20 2a 2f 0a 20 20 69 66 28 20 63 41 3d 3d  lt */.  if( cA==
4450: 27 2a 27 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  '*' ){.    res =
4460: 20 6d 5b 31 5d 3b 0a 20 20 20 20 66 6f 72 28 78   m[1];.    for(x
4470: 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b  B=1; xB<=nB; xB+
4480: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 5b  +){.      if( m[
4490: 78 42 5d 3c 72 65 73 20 29 7b 0a 20 20 20 20 20  xB]<res ){.     
44a0: 20 20 20 72 65 73 20 3d 20 6d 5b 78 42 5d 3b 0a     res = m[xB];.
44b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 4d 61          if( pnMa
44c0: 74 63 68 20 29 20 2a 70 6e 4d 61 74 63 68 20 3d  tch ) *pnMatch =
44d0: 20 78 42 2b 6e 4d 61 74 63 68 3b 0a 20 20 20 20   xB+nMatch;.    
44e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
44f0: 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 6d 5b 6e  e{.    res = m[n
4500: 42 5d 3b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  B];.    /* In th
4510: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
4520: 65 6e 74 61 74 69 6f 6e 2c 20 70 6e 4d 61 74 63  entation, pnMatc
4530: 68 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c  h is always NULL
4540: 20 69 66 20 7a 41 20 64 6f 65 73 0a 20 20 20 20   if zA does.    
4550: 2a 2a 20 6e 6f 74 20 65 6e 64 20 69 6e 20 22 2a  ** not end in "*
4560: 22 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  " */.    assert(
4570: 20 70 6e 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 20   pnMatch==0 );. 
4580: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
4590: 65 28 74 6f 46 72 65 65 29 3b 0a 20 20 72 65 74  e(toFree);.  ret
45a0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
45b0: 2a 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65  * Function:    e
45c0: 64 69 74 64 69 73 74 28 41 2c 42 29 0a 2a 2a 0a  ditdist(A,B).**.
45d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
45e0: 73 74 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  st of transformi
45f0: 6e 67 20 73 74 72 69 6e 67 20 41 20 69 6e 74 6f  ng string A into
4600: 20 73 74 72 69 6e 67 20 42 2e 20 20 42 6f 74 68   string B.  Both
4610: 20 73 74 72 69 6e 67 73 0a 2a 2a 20 6d 75 73 74   strings.** must
4620: 20 62 65 20 70 75 72 65 20 41 53 43 49 49 20 74   be pure ASCII t
4630: 65 78 74 2e 20 20 49 66 20 41 20 65 6e 64 73 20  ext.  If A ends 
4640: 77 69 74 68 20 27 2a 27 20 74 68 65 6e 20 69 74  with '*' then it
4650: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62   is assumed to b
4660: 65 0a 2a 2a 20 61 20 70 72 65 66 69 78 20 6f 66  e.** a prefix of
4670: 20 42 20 61 6e 64 20 65 78 74 72 61 20 63 68 61   B and extra cha
4680: 72 61 63 74 65 72 73 20 6f 6e 20 74 68 65 20 65  racters on the e
4690: 6e 64 20 6f 66 20 42 20 68 61 76 65 20 6d 69 6e  nd of B have min
46a0: 69 6d 61 6c 20 61 64 64 69 74 69 6f 6e 61 6c 0a  imal additional.
46b0: 2a 2a 20 63 6f 73 74 2e 0a 2a 2f 0a 73 74 61 74  ** cost..*/.stat
46c0: 69 63 20 76 6f 69 64 20 65 64 69 74 64 69 73 74  ic void editdist
46d0: 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  SqlFunc(.  sqlit
46e0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
46f0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
4700: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4710: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
4720: 20 72 65 73 20 3d 20 65 64 69 74 64 69 73 74 31   res = editdist1
4730: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
4740: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
4750: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
4760: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a  _text(argv[0]),.
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
4790: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
47a0: 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 0a 20 20  ext(argv[1]),.  
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 20 30 29 3b 0a 20 20 69 66 28 20 72 65 73 3c    0);.  if( res<
47d0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73  0 ){.    if( res
47e0: 3d 3d 28 2d 33 29 20 29 7b 0a 20 20 20 20 20 20  ==(-3) ){.      
47f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
4800: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
4810: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  xt);.    }else i
4820: 66 28 20 72 65 73 3d 3d 28 2d 32 29 20 29 7b 0a  f( res==(-2) ){.
4830: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4840: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
4850: 78 74 2c 20 22 6e 6f 6e 2d 41 53 43 49 49 20 69  xt, "non-ASCII i
4860: 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69 73 74  nput to editdist
4870: 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65  ()", -1);.    }e
4880: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
4890: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
48a0: 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69  context, "NULL i
48b0: 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69 73 74  nput to editdist
48c0: 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ()", -1);.    }.
48d0: 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 73 71    }else{ .    sq
48e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
48f0: 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b 0a  (context, res);.
4900: 20 20 7d 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66    }.}../* End of
4910: 20 74 68 65 20 66 69 78 65 64 2d 63 6f 73 74 20   the fixed-cost 
4920: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 69 6d  edit distance im
4930: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 2a  plementation.***
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a  ***********.****
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67  *********.** Beg
49e0: 69 6e 3a 20 43 6f 6e 66 69 67 75 72 61 62 6c 65  in: Configurable
49f0: 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64   cost unicode ed
4a00: 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74  it distance rout
4a10: 69 6e 65 73 0a 2a 2f 0a 2f 2a 20 46 6f 72 77 61  ines.*/./* Forwa
4a20: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
4a30: 66 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  f structures */.
4a40: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
4a50: 64 69 74 44 69 73 74 33 43 6f 73 74 20 45 64 69  ditDist3Cost Edi
4a60: 74 44 69 73 74 33 43 6f 73 74 3b 0a 74 79 70 65  tDist3Cost;.type
4a70: 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44  def struct EditD
4a80: 69 73 74 33 43 6f 6e 66 69 67 20 45 64 69 74 44  ist3Config EditD
4a90: 69 73 74 33 43 6f 6e 66 69 67 3b 0a 74 79 70 65  ist3Config;.type
4aa0: 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44  def struct EditD
4ab0: 69 73 74 33 50 6f 69 6e 74 20 45 64 69 74 44 69  ist3Point EditDi
4ac0: 73 74 33 50 6f 69 6e 74 3b 0a 74 79 70 65 64 65  st3Point;.typede
4ad0: 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69 73  f struct EditDis
4ae0: 74 33 46 72 6f 6d 20 45 64 69 74 44 69 73 74 33  t3From EditDist3
4af0: 46 72 6f 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  From;.typedef st
4b00: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 46 72  ruct EditDist3Fr
4b10: 6f 6d 53 74 72 69 6e 67 20 45 64 69 74 44 69 73  omString EditDis
4b20: 74 33 46 72 6f 6d 53 74 72 69 6e 67 3b 0a 74 79  t3FromString;.ty
4b30: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69  pedef struct Edi
4b40: 74 44 69 73 74 33 54 6f 20 45 64 69 74 44 69 73  tDist3To EditDis
4b50: 74 33 54 6f 3b 0a 74 79 70 65 64 65 66 20 73 74  t3To;.typedef st
4b60: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54 6f  ruct EditDist3To
4b70: 53 74 72 69 6e 67 20 45 64 69 74 44 69 73 74 33  String EditDist3
4b80: 54 6f 53 74 72 69 6e 67 3b 0a 74 79 70 65 64 65  ToString;.typede
4b90: 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69 73  f struct EditDis
4ba0: 74 33 4c 61 6e 67 20 45 64 69 74 44 69 73 74 33  t3Lang EditDist3
4bb0: 4c 61 6e 67 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  Lang;.../*.** An
4bc0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 65 64   entry in the ed
4bd0: 69 74 20 63 6f 73 74 20 74 61 62 6c 65 0a 2a 2f  it cost table.*/
4be0: 0a 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74  .struct EditDist
4bf0: 33 43 6f 73 74 20 7b 0a 20 20 45 64 69 74 44 69  3Cost {.  EditDi
4c00: 73 74 33 43 6f 73 74 20 2a 70 4e 65 78 74 3b 20  st3Cost *pNext; 
4c10: 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f 73 74      /* Next cost
4c20: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 38   element */.  u8
4c30: 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
4c40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4c50: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 46  r of bytes in aF
4c60: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 6e 54 6f 3b  rom */.  u8 nTo;
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4c90: 62 79 74 65 73 20 69 6e 20 61 54 6f 20 2a 2f 0a  bytes in aTo */.
4ca0: 20 20 75 31 36 20 69 43 6f 73 74 3b 20 20 20 20    u16 iCost;    
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4cc0: 6f 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  ost of this tran
4cd0: 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  sformation */.  
4ce0: 63 68 61 72 20 61 5b 34 5d 20 20 20 20 3b 20 20  char a[4]    ;  
4cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
4d00: 4d 20 73 74 72 69 6e 67 20 66 6f 6c 6c 6f 77 65  M string followe
4d10: 64 20 62 79 20 54 4f 20 73 74 72 69 6e 67 20 2a  d by TO string *
4d20: 2f 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61  /.  /* Additiona
4d30: 6c 20 54 4f 20 61 6e 64 20 46 52 4f 4d 20 73 74  l TO and FROM st
4d40: 72 69 6e 67 20 62 79 74 65 73 20 61 70 70 65 6e  ring bytes appen
4d50: 64 65 64 20 61 73 20 6e 65 63 65 73 73 61 72 79  ded as necessary
4d60: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 64   */.};../*.** Ed
4d70: 69 74 20 63 6f 73 74 73 20 66 6f 72 20 61 20 70  it costs for a p
4d80: 61 72 74 69 63 75 6c 61 72 20 6c 61 6e 67 75 61  articular langua
4d90: 67 65 20 49 44 20 0a 2a 2f 0a 73 74 72 75 63 74  ge ID .*/.struct
4da0: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 7b   EditDist3Lang {
4db0: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20 20  .  int iLang;   
4dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
4dd0: 67 75 61 67 65 20 49 44 20 2a 2f 0a 20 20 69 6e  guage ID */.  in
4de0: 74 20 69 49 6e 73 43 6f 73 74 3b 20 20 20 20 20  t iInsCost;     
4df0: 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
4e00: 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73 74 20 2a  insertion cost *
4e10: 2f 0a 20 20 69 6e 74 20 69 44 65 6c 43 6f 73 74  /.  int iDelCost
4e20: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  ;          /* De
4e30: 66 61 75 6c 74 20 64 65 6c 65 74 69 6f 6e 20 63  fault deletion c
4e40: 6f 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ost */.  int iSu
4e50: 62 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  bCost;          
4e60: 2f 2a 20 44 65 66 61 75 6c 74 20 73 75 62 73 74  /* Default subst
4e70: 69 74 75 74 69 6f 6e 20 63 6f 73 74 20 2a 2f 0a  itution cost */.
4e80: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
4e90: 2a 70 43 6f 73 74 3b 20 20 2f 2a 20 43 6f 73 74  *pCost;  /* Cost
4ea0: 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.};.../*.** 
4eb0: 54 68 65 20 64 65 66 61 75 6c 74 20 45 64 69 74  The default Edit
4ec0: 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a 65 63 74  Dist3Lang object
4ed0: 2c 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 63  , with default c
4ee0: 6f 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osts..*/.static 
4ef0: 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c  const EditDist3L
4f00: 61 6e 67 20 65 64 69 74 44 69 73 74 33 4c 61 6e  ang editDist3Lan
4f10: 67 20 3d 20 7b 20 30 2c 20 31 30 30 2c 20 31 30  g = { 0, 100, 10
4f20: 30 2c 20 31 35 30 2c 20 30 20 7d 3b 0a 0a 2f 2a  0, 150, 0 };../*
4f30: 0a 2a 2a 20 43 6f 6d 70 6c 65 74 65 20 63 6f 6e  .** Complete con
4f40: 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  figuration.*/.st
4f50: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 43 6f  ruct EditDist3Co
4f60: 6e 66 69 67 20 7b 0a 20 20 69 6e 74 20 6e 4c 61  nfig {.  int nLa
4f70: 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ng;             
4f80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 61 6e  /* Number of lan
4f90: 67 75 61 67 65 20 49 44 73 2e 20 20 53 69 7a 65  guage IDs.  Size
4fa0: 20 6f 66 20 61 5b 5d 20 2a 2f 0a 20 20 45 64 69   of a[] */.  Edi
4fb0: 74 44 69 73 74 33 4c 61 6e 67 20 2a 61 3b 20 20  tDist3Lang *a;  
4fc0: 20 20 20 20 2f 2a 20 4f 6e 65 20 66 6f 72 20 65      /* One for e
4fd0: 61 63 68 20 64 69 73 74 69 6e 63 74 20 6c 61 6e  ach distinct lan
4fe0: 67 75 61 67 65 20 49 44 20 2a 2f 0a 7d 3b 0a 0a  guage ID */.};..
4ff0: 2f 2a 0a 2a 2a 20 45 78 74 72 61 20 69 6e 66 6f  /*.** Extra info
5000: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
5010: 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ch character in 
5020: 74 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 2e  the FROM string.
5030: 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44  .*/.struct EditD
5040: 69 73 74 33 46 72 6f 6d 20 7b 0a 20 20 69 6e 74  ist3From {.  int
5050: 20 6e 53 75 62 73 74 3b 20 20 20 20 20 20 20 20   nSubst;        
5060: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5070: 6f 66 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  of substitution 
5080: 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a  cost entries */.
5090: 20 20 69 6e 74 20 6e 44 65 6c 3b 20 20 20 20 20    int nDel;     
50a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
50b0: 6d 62 65 72 20 6f 66 20 64 65 6c 65 74 69 6f 6e  mber of deletion
50c0: 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f   cost entries */
50d0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
50f0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
5100: 6e 20 74 68 69 73 20 63 68 61 72 61 63 74 65 72  n this character
5110: 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43   */.  EditDist3C
5120: 6f 73 74 20 2a 2a 61 70 53 75 62 73 74 3b 20 2f  ost **apSubst; /
5130: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 73 74  * Array of subst
5140: 69 74 75 74 69 6f 6e 20 63 6f 73 74 73 20 66 6f  itution costs fo
5150: 72 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a  r this element *
5160: 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73  /.  EditDist3Cos
5170: 74 20 2a 2a 61 70 44 65 6c 3b 20 20 20 2f 2a 20  t **apDel;   /* 
5180: 41 72 72 61 79 20 6f 66 20 64 65 6c 65 74 69 6f  Array of deletio
5190: 6e 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a  n cost entries *
51a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 72  /.};../*.** A pr
51b0: 65 63 6f 6d 70 69 6c 65 64 20 46 52 4f 4d 20 73  ecompiled FROM s
51c0: 74 72 69 6e 67 2e 0a 2a 0a 2a 2a 20 49 6e 20 74  tring..*.** In t
51d0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
51e0: 65 20 65 78 70 65 63 74 20 74 68 65 20 46 52 4f  e expect the FRO
51f0: 4d 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 72  M string to be r
5200: 65 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  eused multiple t
5210: 69 6d 65 73 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  imes..** In othe
5220: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 6f 6d  r words, the com
5230: 6d 6f 6e 20 63 61 73 65 20 77 69 6c 6c 20 62 65  mon case will be
5240: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
5250: 65 64 69 74 20 64 69 73 74 61 6e 63 65 0a 2a 2a  edit distance.**
5260: 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 6f   from a single o
5270: 72 69 67 69 6e 20 73 74 72 69 6e 67 20 74 6f 20  rigin string to 
5280: 6d 75 6c 74 69 70 6c 65 20 74 61 72 67 65 74 20  multiple target 
5290: 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 72 75  strings..*/.stru
52a0: 63 74 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  ct EditDist3From
52b0: 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61 72 20  String {.  char 
52c0: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
52d0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
52e0: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
52f0: 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  FROM string */. 
5300: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
5310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5320: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
5330: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 73 74  s in the FROM st
5340: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ring */.  int is
5350: 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
5360: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 6e     /* True if en
5370: 64 73 20 77 69 74 68 20 27 2a 27 20 63 68 61 72  ds with '*' char
5380: 61 63 74 65 72 20 2a 2f 0a 20 20 45 64 69 74 44  acter */.  EditD
5390: 69 73 74 33 46 72 6f 6d 20 2a 61 3b 20 20 20 20  ist3From *a;    
53a0: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66      /* Extra inf
53b0: 6f 20 61 62 6f 75 74 20 65 61 63 68 20 63 68 61  o about each cha
53c0: 72 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 73 74  r of the FROM st
53d0: 72 69 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ring */.};../*.*
53e0: 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  * Extra informat
53f0: 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20 63  ion about each c
5400: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
5410: 54 4f 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  TO string..*/.st
5420: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54 6f  ruct EditDist3To
5430: 20 7b 0a 20 20 69 6e 74 20 6e 49 6e 73 3b 20 20   {.  int nIns;  
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 69 6e 73 65 72   Number of inser
5460: 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74 72 69 65  tion cost entrie
5470: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  s */.  int nByte
5480: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5490: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
54a0: 65 73 20 69 6e 20 74 68 69 73 20 63 68 61 72 61  es in this chara
54b0: 63 74 65 72 20 2a 2f 0a 20 20 45 64 69 74 44 69  cter */.  EditDi
54c0: 73 74 33 43 6f 73 74 20 2a 2a 61 70 49 6e 73 3b  st3Cost **apIns;
54d0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 64     /* Array of d
54e0: 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74  eletion cost ent
54f0: 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ries */.};../*.*
5500: 2a 20 41 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  * A precompiled 
5510: 46 52 4f 4d 20 73 74 72 69 6e 67 0a 2a 2f 0a 73  FROM string.*/.s
5520: 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54  truct EditDist3T
5530: 6f 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61 72  oString {.  char
5540: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
5550: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5560: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
5570: 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20   TO string */.  
5580: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
5590: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
55a0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
55b0: 20 69 6e 20 74 68 65 20 54 4f 20 73 74 72 69 6e   in the TO strin
55c0: 67 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33  g */.  EditDist3
55d0: 54 6f 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  To *a;          
55e0: 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 20 61 62  /* Extra info ab
55f0: 6f 75 74 20 65 61 63 68 20 63 68 61 72 20 6f 66  out each char of
5600: 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a   the TO string *
5610: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  /.};../*.** Clea
5620: 72 20 6f 72 20 64 65 6c 65 74 65 20 61 6e 20 69  r or delete an i
5630: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 6f  nstance of the o
5640: 62 6a 65 63 74 20 74 68 61 74 20 72 65 63 6f 72  bject that recor
5650: 64 73 20 61 6c 6c 20 65 64 69 74 2d 64 69 73 74  ds all edit-dist
5660: 61 6e 63 65 0a 2a 2a 20 77 65 69 67 68 74 73 2e  ance.** weights.
5670: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5680: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43  editDist3ConfigC
5690: 6c 65 61 72 28 45 64 69 74 44 69 73 74 33 43 6f  lear(EditDist3Co
56a0: 6e 66 69 67 20 2a 70 29 7b 0a 20 20 69 6e 74 20  nfig *p){.  int 
56b0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
56c0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
56d0: 30 3b 20 69 3c 70 2d 3e 6e 4c 61 6e 67 3b 20 69  0; i<p->nLang; i
56e0: 2b 2b 29 7b 0a 20 20 20 20 45 64 69 74 44 69 73  ++){.    EditDis
56f0: 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 2a  t3Cost *pCost, *
5700: 70 4e 65 78 74 3b 0a 20 20 20 20 70 43 6f 73 74  pNext;.    pCost
5710: 20 3d 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 73 74   = p->a[i].pCost
5720: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f  ;.    while( pCo
5730: 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  st ){.      pNex
5740: 74 20 3d 20 70 43 6f 73 74 2d 3e 70 4e 65 78 74  t = pCost->pNext
5750: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5760: 66 72 65 65 28 70 43 6f 73 74 29 3b 0a 20 20 20  free(pCost);.   
5770: 20 20 20 70 43 6f 73 74 20 3d 20 70 4e 65 78 74     pCost = pNext
5780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
5790: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 29  lite3_free(p->a)
57a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
57b0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
57c0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
57d0: 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74  Dist3ConfigDelet
57e0: 65 28 76 6f 69 64 20 2a 70 49 6e 29 7b 0a 20 20  e(void *pIn){.  
57f0: 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20  EditDist3Config 
5800: 2a 70 20 3d 20 28 45 64 69 74 44 69 73 74 33 43  *p = (EditDist3C
5810: 6f 6e 66 69 67 2a 29 70 49 6e 3b 0a 20 20 65 64  onfig*)pIn;.  ed
5820: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43 6c 65  itDist3ConfigCle
5830: 61 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ar(p);.  sqlite3
5840: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
5850: 2a 2a 20 4c 6f 61 64 20 61 6c 6c 20 65 64 69 74  ** Load all edit
5860: 2d 64 69 73 74 61 6e 63 65 20 77 65 69 67 68 74  -distance weight
5870: 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 2e 0a  s from a table..
5880: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64  */.static int ed
5890: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c 6f 61  itDist3ConfigLoa
58a0: 64 28 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  d(.  EditDist3Co
58b0: 6e 66 69 67 20 2a 70 2c 20 20 20 20 20 20 2f 2a  nfig *p,      /*
58c0: 20 54 68 65 20 65 64 69 74 20 64 69 73 74 61 6e   The edit distan
58d0: 63 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ce configuration
58e0: 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20 73 71   to load */.  sq
58f0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
5900: 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 66 72        /* Load fr
5910: 6f 6d 20 74 68 69 73 20 64 61 74 61 62 61 73 65  om this database
5920: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
5930: 20 2a 7a 54 61 62 6c 65 20 20 20 20 20 20 2f 2a   *zTable      /*
5940: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
5950: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  le from which to
5960: 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71   load */.){.  sq
5970: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
5980: 74 3b 0a 20 20 69 6e 74 20 72 63 2c 20 72 63 32  t;.  int rc, rc2
5990: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
59a0: 20 20 69 6e 74 20 69 4c 61 6e 67 50 72 65 76 20    int iLangPrev 
59b0: 3d 20 2d 39 39 39 39 3b 0a 20 20 45 64 69 74 44  = -9999;.  EditD
59c0: 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 20  ist3Lang *pLang 
59d0: 3d 20 30 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73  = 0;..  zSql = s
59e0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
59f0: 53 45 4c 45 43 54 20 69 4c 61 6e 67 2c 20 63 46  SELECT iLang, cF
5a00: 72 6f 6d 2c 20 63 54 6f 2c 20 69 43 6f 73 74 22  rom, cTo, iCost"
5a10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5a20: 20 20 20 20 20 20 20 20 20 20 22 20 46 52 4f 4d            " FROM
5a30: 20 5c 22 25 77 5c 22 20 57 48 45 52 45 20 69 4c   \"%w\" WHERE iL
5a40: 61 6e 67 3e 3d 30 20 4f 52 44 45 52 20 42 59 20  ang>=0 ORDER BY 
5a50: 69 4c 61 6e 67 22 2c 20 7a 54 61 62 6c 65 29 3b  iLang", zTable);
5a60: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
5a70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5a80: 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OMEM;.  rc = sql
5a90: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
5aa0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
5ab0: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
5ac0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
5ad0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5ae0: 63 3b 0a 20 20 65 64 69 74 44 69 73 74 33 43 6f  c;.  editDist3Co
5af0: 6e 66 69 67 43 6c 65 61 72 28 70 29 3b 0a 20 20  nfigClear(p);.  
5b00: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
5b10: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
5b20: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
5b30: 74 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74 65  t iLang = sqlite
5b40: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
5b50: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73  mt, 0);.    cons
5b60: 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20  t char *zFrom = 
5b70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
5b80: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
5b90: 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
5ba0: 69 6e 74 20 6e 46 72 6f 6d 20 3d 20 7a 46 72 6f  int nFrom = zFro
5bb0: 6d 20 3f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m ? sqlite3_colu
5bc0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
5bd0: 31 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73  1) : 0;.    cons
5be0: 74 20 63 68 61 72 20 2a 7a 54 6f 20 3d 20 28 63  t char *zTo = (c
5bf0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5c00: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
5c10: 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e  Stmt, 2);.    in
5c20: 74 20 6e 54 6f 20 3d 20 7a 54 6f 20 3f 20 73 71  t nTo = zTo ? sq
5c30: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
5c40: 65 73 28 70 53 74 6d 74 2c 20 32 29 20 3a 20 30  es(pStmt, 2) : 0
5c50: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 73 74 20  ;.    int iCost 
5c60: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
5c70: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
5c80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 72  .    assert( zFr
5c90: 6f 6d 21 3d 30 20 7c 7c 20 6e 46 72 6f 6d 3d 3d  om!=0 || nFrom==
5ca0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5cb0: 20 7a 54 6f 21 3d 30 20 7c 7c 20 6e 54 6f 3d 3d   zTo!=0 || nTo==
5cc0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  0 );.    if( nFr
5cd0: 6f 6d 3e 31 30 30 20 7c 7c 20 6e 54 6f 3e 31 30  om>100 || nTo>10
5ce0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5cf0: 20 20 69 66 28 20 69 43 6f 73 74 3c 30 20 29 20    if( iCost<0 ) 
5d00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5d10: 28 20 70 4c 61 6e 67 3d 3d 30 20 7c 7c 20 69 4c  ( pLang==0 || iL
5d20: 61 6e 67 21 3d 69 4c 61 6e 67 50 72 65 76 20 29  ang!=iLangPrev )
5d30: 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69 73 74  {.      EditDist
5d40: 33 4c 61 6e 67 20 2a 70 4e 65 77 3b 0a 20 20 20  3Lang *pNew;.   
5d50: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
5d60: 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 61 2c 20  3_realloc(p->a, 
5d70: 28 70 2d 3e 6e 4c 61 6e 67 2b 31 29 2a 73 69 7a  (p->nLang+1)*siz
5d80: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 29 3b 0a 20  eof(p->a[0]));. 
5d90: 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
5da0: 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   ){ rc = SQLITE_
5db0: 4e 4f 4d 45 4d 3b 20 62 72 65 61 6b 3b 20 7d 0a  NOMEM; break; }.
5dc0: 20 20 20 20 20 20 70 2d 3e 61 20 3d 20 70 4e 65        p->a = pNe
5dd0: 77 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 20 3d  w;.      pLang =
5de0: 20 26 70 2d 3e 61 5b 70 2d 3e 6e 4c 61 6e 67 5d   &p->a[p->nLang]
5df0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 61 6e 67  ;.      p->nLang
5e00: 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d  ++;.      pLang-
5e10: 3e 69 4c 61 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a  >iLang = iLang;.
5e20: 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 49 6e        pLang->iIn
5e30: 73 43 6f 73 74 20 3d 20 31 30 30 3b 0a 20 20 20  sCost = 100;.   
5e40: 20 20 20 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f     pLang->iDelCo
5e50: 73 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 20 20  st = 100;.      
5e60: 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73 74 20  pLang->iSubCost 
5e70: 3d 20 31 35 30 3b 0a 20 20 20 20 20 20 70 4c 61  = 150;.      pLa
5e80: 6e 67 2d 3e 70 43 6f 73 74 20 3d 20 30 3b 0a 20  ng->pCost = 0;. 
5e90: 20 20 20 20 20 69 4c 61 6e 67 50 72 65 76 20 3d       iLangPrev =
5ea0: 20 69 4c 61 6e 67 3b 0a 20 20 20 20 7d 0a 20 20   iLang;.    }.  
5eb0: 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 31 20 26    if( nFrom==1 &
5ec0: 26 20 7a 46 72 6f 6d 5b 30 5d 3d 3d 27 3f 27 20  & zFrom[0]=='?' 
5ed0: 26 26 20 6e 54 6f 3d 3d 30 20 29 7b 0a 20 20 20  && nTo==0 ){.   
5ee0: 20 20 20 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f     pLang->iDelCo
5ef0: 73 74 20 3d 20 69 43 6f 73 74 3b 0a 20 20 20 20  st = iCost;.    
5f00: 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 6f 6d 3d  }else if( nFrom=
5f10: 3d 30 20 26 26 20 6e 54 6f 3d 3d 31 20 26 26 20  =0 && nTo==1 && 
5f20: 7a 54 6f 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20  zTo[0]=='?' ){. 
5f30: 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 49 6e 73       pLang->iIns
5f40: 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a 20 20  Cost = iCost;.  
5f50: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 6f    }else if( nFro
5f60: 6d 3d 3d 31 20 26 26 20 6e 54 6f 3d 3d 31 20 26  m==1 && nTo==1 &
5f70: 26 20 7a 46 72 6f 6d 5b 30 5d 3d 3d 27 3f 27 20  & zFrom[0]=='?' 
5f80: 26 26 20 7a 54 6f 5b 30 5d 3d 3d 27 3f 27 20 29  && zTo[0]=='?' )
5f90: 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  {.      pLang->i
5fa0: 53 75 62 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b  SubCost = iCost;
5fb0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5fc0: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
5fd0: 2a 70 43 6f 73 74 3b 0a 20 20 20 20 20 20 69 6e  *pCost;.      in
5fe0: 74 20 6e 45 78 74 72 61 20 3d 20 6e 46 72 6f 6d  t nExtra = nFrom
5ff0: 20 2b 20 6e 54 6f 20 2d 20 34 3b 0a 20 20 20 20   + nTo - 4;.    
6000: 20 20 69 66 28 20 6e 45 78 74 72 61 3c 30 20 29    if( nExtra<0 )
6010: 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20   nExtra = 0;.   
6020: 20 20 20 70 43 6f 73 74 20 3d 20 73 71 6c 69 74     pCost = sqlit
6030: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
6040: 66 28 2a 70 43 6f 73 74 29 20 2b 20 6e 45 78 74  f(*pCost) + nExt
6050: 72 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ra );.      if( 
6060: 70 43 6f 73 74 3d 3d 30 20 29 7b 20 72 63 20 3d  pCost==0 ){ rc =
6070: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20 62   SQLITE_NOMEM; b
6080: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 70 43  reak; }.      pC
6090: 6f 73 74 2d 3e 6e 46 72 6f 6d 20 3d 20 6e 46 72  ost->nFrom = nFr
60a0: 6f 6d 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  om;.      pCost-
60b0: 3e 6e 54 6f 20 3d 20 6e 54 6f 3b 0a 20 20 20 20  >nTo = nTo;.    
60c0: 20 20 70 43 6f 73 74 2d 3e 69 43 6f 73 74 20 3d    pCost->iCost =
60d0: 20 69 43 6f 73 74 3b 0a 20 20 20 20 20 20 6d 65   iCost;.      me
60e0: 6d 63 70 79 28 70 43 6f 73 74 2d 3e 61 2c 20 7a  mcpy(pCost->a, z
60f0: 46 72 6f 6d 2c 20 6e 46 72 6f 6d 29 3b 0a 20 20  From, nFrom);.  
6100: 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 73 74      memcpy(pCost
6110: 2d 3e 61 20 2b 20 6e 46 72 6f 6d 2c 20 7a 54 6f  ->a + nFrom, zTo
6120: 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 70 43  , nTo);.      pC
6130: 6f 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 61  ost->pNext = pLa
6140: 6e 67 2d 3e 70 43 6f 73 74 3b 0a 20 20 20 20 20  ng->pCost;.     
6150: 20 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 20 3d 20   pLang->pCost = 
6160: 70 43 6f 73 74 3b 20 0a 20 20 20 20 7d 0a 20 20  pCost; .    }.  
6170: 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65  }.  rc2 = sqlite
6180: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
6190: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
61a0: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
61b0: 32 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  2;.  return rc;.
61c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
61d0: 74 68 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62  the length (in b
61e0: 79 74 65 73 29 20 6f 66 20 61 20 75 74 66 2d 38  ytes) of a utf-8
61f0: 20 63 68 61 72 61 63 74 65 72 2e 20 20 4f 72 20   character.  Or 
6200: 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d  return a maximum
6210: 0a 2a 2a 20 6f 66 20 4e 2e 0a 2a 2f 0a 73 74 61  .** of N..*/.sta
6220: 74 69 63 20 69 6e 74 20 75 74 66 38 4c 65 6e 28  tic int utf8Len(
6230: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 2c  unsigned char c,
6240: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6c   int N){.  int l
6250: 65 6e 20 3d 20 31 3b 0a 20 20 69 66 28 20 63 3e  en = 1;.  if( c>
6260: 30 78 37 66 20 29 7b 0a 20 20 20 20 69 66 28 20  0x7f ){.    if( 
6270: 28 63 26 30 78 65 30 29 3d 3d 30 78 63 30 20 29  (c&0xe0)==0xc0 )
6280: 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 32 3b  {.      len = 2;
6290: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
62a0: 63 26 30 78 66 30 29 3d 3d 30 78 65 30 20 29 7b  c&0xf0)==0xe0 ){
62b0: 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 33 3b 0a  .      len = 3;.
62c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
62d0: 20 6c 65 6e 20 3d 20 34 3b 0a 20 20 20 20 7d 0a   len = 4;.    }.
62e0: 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 3e 4e 20    }.  if( len>N 
62f0: 29 20 6c 65 6e 20 3d 20 4e 3b 0a 20 20 72 65 74  ) len = N;.  ret
6300: 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn len;.}../*.*
6310: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e  * Return TRUE (n
6320: 6f 6e 2d 7a 65 72 6f 29 20 6f 66 20 74 68 65 20  on-zero) of the 
6330: 54 6f 20 73 69 64 65 20 6f 66 20 74 68 65 20 67  To side of the g
6340: 69 76 65 6e 20 63 6f 73 74 20 6d 61 74 63 68 65  iven cost matche
6350: 73 0a 2a 2a 20 74 68 65 20 67 69 76 65 6e 20 73  s.** the given s
6360: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
6370: 20 69 6e 74 20 6d 61 74 63 68 54 6f 28 45 64 69   int matchTo(Edi
6380: 74 44 69 73 74 33 43 6f 73 74 20 2a 70 2c 20 63  tDist3Cost *p, c
6390: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
63a0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e  t n){.  if( p->n
63b0: 54 6f 3e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  To>n ) return 0;
63c0: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 2d  .  if( memcmp(p-
63d0: 3e 61 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 7a 2c 20  >a+p->nFrom, z, 
63e0: 70 2d 3e 6e 54 6f 29 21 3d 30 20 29 20 72 65 74  p->nTo)!=0 ) ret
63f0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
6400: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
6410: 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
6420: 6f 29 20 6f 66 20 74 68 65 20 54 6f 20 73 69 64  o) of the To sid
6430: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  e of the given c
6440: 6f 73 74 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74  ost matches.** t
6450: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
6460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
6470: 61 74 63 68 46 72 6f 6d 28 45 64 69 74 44 69 73  atchFrom(EditDis
6480: 74 33 43 6f 73 74 20 2a 70 2c 20 63 6f 6e 73 74  t3Cost *p, const
6490: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
64a0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
64b0: 46 72 6f 6d 3c 3d 6e 20 29 3b 0a 20 20 69 66 28  From<=n );.  if(
64c0: 20 6d 65 6d 63 6d 70 28 70 2d 3e 61 2c 20 7a 2c   memcmp(p->a, z,
64d0: 20 70 2d 3e 6e 46 72 6f 6d 29 21 3d 30 20 29 20   p->nFrom)!=0 ) 
64e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
64f0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
6500: 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
6510: 7a 65 72 6f 29 20 6f 66 20 74 68 65 20 6e 65 78  zero) of the nex
6520: 74 20 46 52 4f 4d 20 63 68 61 72 61 63 74 65 72  t FROM character
6530: 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 54 4f   and the next TO
6540: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 61 72  .** character ar
6550: 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73  e the same..*/.s
6560: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 46  tatic int matchF
6570: 72 6f 6d 54 6f 28 0a 20 20 45 64 69 74 44 69 73  romTo(.  EditDis
6580: 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 53  t3FromString *pS
6590: 74 72 2c 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e  tr,  /* Left han
65a0: 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e  d string */.  in
65b0: 74 20 6e 31 2c 20 20 20 20 20 20 20 20 20 20 20  t n1,           
65c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
65d0: 65 78 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  ex of comparison
65e0: 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 74 68   character on th
65f0: 65 20 6c 65 66 74 20 2a 2f 0a 20 20 63 6f 6e 73  e left */.  cons
6600: 74 20 63 68 61 72 20 2a 7a 32 2c 20 20 20 20 20  t char *z2,     
6610: 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
6620: 2d 68 61 6e 64 6c 20 63 6f 6d 70 61 72 69 73 6f  -handl compariso
6630: 6e 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20  n character */. 
6640: 20 69 6e 74 20 6e 32 20 20 20 20 20 20 20 20 20   int n2         
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6660: 42 79 74 65 73 20 72 65 6d 61 69 6e 69 6e 67 20  Bytes remaining 
6670: 69 6e 20 7a 32 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  in z2[] */.){.  
6680: 69 6e 74 20 62 31 20 3d 20 70 53 74 72 2d 3e 61  int b1 = pStr->a
6690: 5b 6e 31 5d 2e 6e 42 79 74 65 3b 0a 20 20 69 66  [n1].nByte;.  if
66a0: 28 20 62 31 3e 6e 32 20 29 20 72 65 74 75 72 6e  ( b1>n2 ) return
66b0: 20 30 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70   0;.  if( memcmp
66c0: 28 70 53 74 72 2d 3e 7a 2b 6e 31 2c 20 7a 32 2c  (pStr->z+n1, z2,
66d0: 20 62 31 29 21 3d 30 20 29 20 72 65 74 75 72 6e   b1)!=0 ) return
66e0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
6700: 61 6e 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  an EditDist3From
6710: 53 74 72 69 6e 67 20 6f 62 6a 65 63 63 74 0a 2a  String objecct.*
6720: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 64  /.static void ed
6730: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
6740: 67 44 65 6c 65 74 65 28 45 64 69 74 44 69 73 74  gDelete(EditDist
6750: 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 29 7b  3FromString *p){
6760: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
6770: 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  p ){.    for(i=0
6780: 3b 20 69 3c 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  ; i<p->n; i++){.
6790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
67a0: 65 65 28 70 2d 3e 61 5b 69 5d 2e 61 70 44 65 6c  ee(p->a[i].apDel
67b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
67c0: 5f 66 72 65 65 28 70 2d 3e 61 5b 69 5d 2e 61 70  _free(p->a[i].ap
67d0: 53 75 62 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Subst);.    }.  
67e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
67f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6800: 43 72 65 61 74 65 20 61 20 45 64 69 74 44 69 73  Create a EditDis
6810: 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 6f 62 6a  t3FromString obj
6820: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ect..*/.static E
6830: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
6840: 6e 67 20 2a 65 64 69 74 44 69 73 74 33 46 72 6f  ng *editDist3Fro
6850: 6d 53 74 72 69 6e 67 4e 65 77 28 0a 20 20 63 6f  mStringNew(.  co
6860: 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e  nst EditDist3Lan
6870: 67 20 2a 70 4c 61 6e 67 2c 0a 20 20 63 6f 6e 73  g *pLang,.  cons
6880: 74 20 63 68 61 72 20 2a 7a 2c 0a 20 20 69 6e 74  t char *z,.  int
6890: 20 6e 0a 29 7b 0a 20 20 45 64 69 74 44 69 73 74   n.){.  EditDist
68a0: 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 53 74  3FromString *pSt
68b0: 72 3b 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  r;.  EditDist3Co
68c0: 73 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  st *p;.  int i;.
68d0: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
68e0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6e 3c  turn 0;.  if( n<
68f0: 30 20 29 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  0 ) n = (int)str
6900: 6c 65 6e 28 7a 29 3b 0a 20 20 70 53 74 72 20 3d  len(z);.  pStr =
6910: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
6920: 20 73 69 7a 65 6f 66 28 2a 70 53 74 72 29 20 2b   sizeof(*pStr) +
6930: 20 73 69 7a 65 6f 66 28 70 53 74 72 2d 3e 61 5b   sizeof(pStr->a[
6940: 30 5d 29 2a 6e 20 2b 20 6e 20 2b 20 31 20 29 3b  0])*n + n + 1 );
6950: 0a 20 20 69 66 28 20 70 53 74 72 3d 3d 30 20 29  .  if( pStr==0 )
6960: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 74   return 0;.  pSt
6970: 72 2d 3e 61 20 3d 20 28 45 64 69 74 44 69 73 74  r->a = (EditDist
6980: 33 46 72 6f 6d 2a 29 26 70 53 74 72 5b 31 5d 3b  3From*)&pStr[1];
6990: 0a 20 20 6d 65 6d 73 65 74 28 70 53 74 72 2d 3e  .  memset(pStr->
69a0: 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 74  a, 0, sizeof(pSt
69b0: 72 2d 3e 61 5b 30 5d 29 2a 6e 29 3b 0a 20 20 70  r->a[0])*n);.  p
69c0: 53 74 72 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 53  Str->n = n;.  pS
69d0: 74 72 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 26  tr->z = (char*)&
69e0: 70 53 74 72 2d 3e 61 5b 6e 5d 3b 0a 20 20 6d 65  pStr->a[n];.  me
69f0: 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c  mcpy(pStr->z, z,
6a00: 20 6e 2b 31 29 3b 0a 20 20 69 66 28 20 6e 20 26   n+1);.  if( n &
6a10: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b  & z[n-1]=='*' ){
6a20: 0a 20 20 20 20 70 53 74 72 2d 3e 69 73 50 72 65  .    pStr->isPre
6a30: 66 69 78 20 3d 20 31 3b 0a 20 20 20 20 6e 2d 2d  fix = 1;.    n--
6a40: 3b 0a 20 20 20 20 70 53 74 72 2d 3e 6e 2d 2d 3b  ;.    pStr->n--;
6a50: 0a 20 20 20 20 70 53 74 72 2d 3e 7a 5b 6e 5d 20  .    pStr->z[n] 
6a60: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
6a70: 20 20 70 53 74 72 2d 3e 69 73 50 72 65 66 69 78    pStr->isPrefix
6a80: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72   = 0;.  }..  for
6a90: 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
6aa0: 0a 20 20 20 20 45 64 69 74 44 69 73 74 33 46 72  .    EditDist3Fr
6ab0: 6f 6d 20 2a 70 46 72 6f 6d 20 3d 20 26 70 53 74  om *pFrom = &pSt
6ac0: 72 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d  r->a[i];.    mem
6ad0: 73 65 74 28 70 46 72 6f 6d 2c 20 30 2c 20 73 69  set(pFrom, 0, si
6ae0: 7a 65 6f 66 28 2a 70 46 72 6f 6d 29 29 3b 0a 20  zeof(*pFrom));. 
6af0: 20 20 20 70 46 72 6f 6d 2d 3e 6e 42 79 74 65 20     pFrom->nByte 
6b00: 3d 20 75 74 66 38 4c 65 6e 28 28 75 6e 73 69 67  = utf8Len((unsig
6b10: 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 2c 20 6e  ned char)z[i], n
6b20: 2d 69 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  -i);.    for(p=p
6b30: 4c 61 6e 67 2d 3e 70 43 6f 73 74 3b 20 70 3b 20  Lang->pCost; p; 
6b40: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
6b50: 20 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74     EditDist3Cost
6b60: 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20 20 20   **apNew;.      
6b70: 69 66 28 20 69 2b 70 2d 3e 6e 46 72 6f 6d 3e 6e  if( i+p->nFrom>n
6b80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6b90: 20 20 20 69 66 28 20 6d 61 74 63 68 46 72 6f 6d     if( matchFrom
6ba0: 28 70 2c 20 7a 2b 69 2c 20 6e 2d 69 29 3d 3d 30  (p, z+i, n-i)==0
6bb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6bc0: 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 3d 3d 30     if( p->nTo==0
6bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 4e 65   ){.        apNe
6be0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
6bf0: 6c 6f 63 28 70 46 72 6f 6d 2d 3e 61 70 44 65 6c  loc(pFrom->apDel
6c00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c20: 20 20 73 69 7a 65 6f 66 28 2a 61 70 4e 65 77 29    sizeof(*apNew)
6c30: 2a 28 70 46 72 6f 6d 2d 3e 6e 44 65 6c 2b 31 29  *(pFrom->nDel+1)
6c40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
6c50: 70 4e 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pNew==0 ) break;
6c60: 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
6c70: 61 70 44 65 6c 20 3d 20 61 70 4e 65 77 3b 0a 20  apDel = apNew;. 
6c80: 20 20 20 20 20 20 20 61 70 4e 65 77 5b 70 46 72         apNew[pFr
6c90: 6f 6d 2d 3e 6e 44 65 6c 2b 2b 5d 20 3d 20 70 3b  om->nDel++] = p;
6ca0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6cb0: 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 73 71        apNew = sq
6cc0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 46  lite3_realloc(pF
6cd0: 72 6f 6d 2d 3e 61 70 53 75 62 73 74 2c 0a 20 20  rom->apSubst,.  
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
6d00: 7a 65 6f 66 28 2a 61 70 4e 65 77 29 2a 28 70 46  zeof(*apNew)*(pF
6d10: 72 6f 6d 2d 3e 6e 53 75 62 73 74 2b 31 29 29 3b  rom->nSubst+1));
6d20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 4e  .        if( apN
6d30: 65 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ew==0 ) break;. 
6d40: 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 61 70         pFrom->ap
6d50: 53 75 62 73 74 20 3d 20 61 70 4e 65 77 3b 0a 20  Subst = apNew;. 
6d60: 20 20 20 20 20 20 20 61 70 4e 65 77 5b 70 46 72         apNew[pFr
6d70: 6f 6d 2d 3e 6e 53 75 62 73 74 2b 2b 5d 20 3d 20  om->nSubst++] = 
6d80: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
6d90: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
6da0: 20 20 20 20 65 64 69 74 44 69 73 74 33 46 72 6f      editDist3Fro
6db0: 6d 53 74 72 69 6e 67 44 65 6c 65 74 65 28 70 53  mStringDelete(pS
6dc0: 74 72 29 3b 0a 20 20 20 20 20 20 70 53 74 72 20  tr);.      pStr 
6dd0: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
6de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6df0: 74 75 72 6e 20 70 53 74 72 3b 0a 7d 0a 0a 2f 2a  turn pStr;.}../*
6e00: 0a 2a 2a 20 55 70 64 61 74 65 20 65 6e 74 72 79  .** Update entry
6e10: 20 6d 5b 69 5d 20 73 75 63 68 20 74 68 61 74 20   m[i] such that 
6e20: 69 74 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  it is the minimu
6e30: 6d 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  m of its current
6e40: 20 76 61 6c 75 65 0a 2a 2a 20 61 6e 64 20 6d 5b   value.** and m[
6e50: 6a 5d 2b 69 43 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20  j]+iCost..**.** 
6e60: 49 66 20 74 68 65 20 69 43 6f 73 74 20 69 73 20  If the iCost is 
6e70: 31 2c 30 30 30 2c 30 30 30 20 6f 72 20 67 72 65  1,000,000 or gre
6e80: 61 74 65 72 2c 20 74 68 65 6e 20 63 6f 6e 73 69  ater, then consi
6e90: 64 65 72 20 74 68 65 20 63 6f 73 74 20 74 6f 20  der the cost to 
6ea0: 62 65 0a 2a 2a 20 69 6e 66 69 6e 69 74 65 20 61  be.** infinite a
6eb0: 6e 64 20 73 6b 69 70 20 74 68 65 20 75 70 64 61  nd skip the upda
6ec0: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
6ed0: 69 64 20 75 70 64 61 74 65 43 6f 73 74 28 0a 20  id updateCost(. 
6ee0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6d   unsigned int *m
6ef0: 2c 0a 20 20 69 6e 74 20 69 2c 0a 20 20 69 6e 74  ,.  int i,.  int
6f00: 20 6a 2c 0a 20 20 69 6e 74 20 69 43 6f 73 74 0a   j,.  int iCost.
6f10: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f  ){.  assert( iCo
6f20: 73 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  st>=0 );.  if( i
6f30: 43 6f 73 74 3c 31 30 30 30 30 20 29 7b 0a 20 20  Cost<10000 ){.  
6f40: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 62    unsigned int b
6f50: 20 3d 20 6d 5b 6a 5d 20 2b 20 69 43 6f 73 74 3b   = m[j] + iCost;
6f60: 0a 20 20 20 20 69 66 28 20 62 3c 6d 5b 69 5d 20  .    if( b<m[i] 
6f70: 29 20 6d 5b 69 5d 20 3d 20 62 3b 0a 20 20 7d 0a  ) m[i] = b;.  }.
6f80: 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  }../* Compute th
6f90: 65 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20  e edit distance 
6fa0: 62 65 74 77 65 65 6e 20 74 77 6f 20 73 74 72 69  between two stri
6fb0: 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ngs..**.** If an
6fc0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
6fd0: 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
6fe0: 20 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69 73   number which is
6ff0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
7000: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 4d 61 74 63  .**.** If pnMatc
7010: 68 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  h is not NULL, t
7020: 68 65 6e 20 2a 70 6e 4d 61 74 63 68 20 69 73 20  hen *pnMatch is 
7030: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
7040: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 0a  r of characters.
7050: 2a 2a 20 28 6e 6f 74 20 62 79 74 65 73 29 20 69  ** (not bytes) i
7060: 6e 20 7a 32 20 74 68 61 74 20 6d 61 74 63 68 65  n z2 that matche
7070: 64 20 74 68 65 20 73 65 61 72 63 68 20 70 61 74  d the search pat
7080: 74 65 72 6e 20 69 6e 20 2a 70 46 72 6f 6d 2e 20  tern in *pFrom. 
7090: 49 66 20 70 46 72 6f 6d 20 64 6f 65 73 0a 2a 2a  If pFrom does.**
70a0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65   not contain the
70b0: 20 70 61 74 74 65 72 6e 20 66 6f 72 20 61 20 70   pattern for a p
70c0: 72 65 66 69 78 2d 73 65 61 72 63 68 2c 20 74 68  refix-search, th
70d0: 65 6e 20 74 68 69 73 20 69 73 20 61 6c 77 61 79  en this is alway
70e0: 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
70f0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
7100: 20 7a 32 2e 20 49 66 20 70 46 72 6f 6d 20 64 6f   z2. If pFrom do
7110: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 70 72 65  es contain a pre
7120: 66 69 78 20 73 65 61 72 63 68 20 70 61 74 74 65  fix search patte
7130: 72 6e 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 69  rn, then.** it i
7140: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
7150: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
7160: 65 20 70 72 65 66 69 78 20 6f 66 20 7a 32 20 74  e prefix of z2 t
7170: 68 61 74 20 77 61 73 20 64 65 65 6d 65 64 20 74  hat was deemed t
7180: 6f 20 0a 2a 2a 20 6d 61 74 63 68 20 70 46 72 6f  o .** match pFro
7190: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
71a0: 20 65 64 69 74 44 69 73 74 33 43 6f 72 65 28 0a   editDist3Core(.
71b0: 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53    EditDist3FromS
71c0: 74 72 69 6e 67 20 2a 70 46 72 6f 6d 2c 20 20 2f  tring *pFrom,  /
71d0: 2a 20 54 68 65 20 46 52 4f 4d 20 73 74 72 69 6e  * The FROM strin
71e0: 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
71f0: 72 20 2a 7a 32 2c 20 20 20 20 20 20 20 20 20 20  r *z2,          
7200: 20 20 20 20 2f 2a 20 54 68 65 20 54 4f 20 73 74      /* The TO st
7210: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 32  ring */.  int n2
7220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7230: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
7240: 20 6f 66 20 74 68 65 20 54 4f 20 73 74 72 69 6e   of the TO strin
7250: 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 64 69  g */.  const Edi
7260: 74 44 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e  tDist3Lang *pLan
7270: 67 2c 20 20 2f 2a 20 45 64 69 74 20 77 65 69 67  g,  /* Edit weig
7280: 68 74 73 20 66 6f 72 20 61 20 70 61 72 74 69 63  hts for a partic
7290: 75 6c 61 72 20 6c 61 6e 67 75 61 67 65 20 49 44  ular language ID
72a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4d 61 74   */.  int *pnMat
72b0: 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
72c0: 20 20 20 2f 2a 20 4f 55 54 3a 20 43 68 61 72 61     /* OUT: Chara
72d0: 63 74 65 72 73 20 69 6e 20 6d 61 74 63 68 65 64  cters in matched
72e0: 20 70 72 65 66 69 78 20 2a 2f 0a 29 7b 0a 20 20   prefix */.){.  
72f0: 69 6e 74 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20  int k, n;.  int 
7300: 69 31 2c 20 62 31 3b 0a 20 20 69 6e 74 20 69 32  i1, b1;.  int i2
7310: 2c 20 62 32 3b 0a 20 20 45 64 69 74 44 69 73 74  , b2;.  EditDist
7320: 33 46 72 6f 6d 53 74 72 69 6e 67 20 66 20 3d 20  3FromString f = 
7330: 2a 70 46 72 6f 6d 3b 0a 20 20 45 64 69 74 44 69  *pFrom;.  EditDi
7340: 73 74 33 54 6f 20 2a 61 32 3b 0a 20 20 75 6e 73  st3To *a2;.  uns
7350: 69 67 6e 65 64 20 69 6e 74 20 2a 6d 3b 0a 20 20  igned int *m;.  
7360: 69 6e 74 20 73 7a 52 6f 77 3b 0a 20 20 45 64 69  int szRow;.  Edi
7370: 74 44 69 73 74 33 43 6f 73 74 20 2a 70 3b 0a 20  tDist3Cost *p;. 
7380: 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 2f 2a 20   int res;..  /* 
7390: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 57 61 67  allocate the Wag
73a0: 6e 65 72 20 6d 61 74 72 69 78 20 61 6e 64 20 74  ner matrix and t
73b0: 68 65 20 61 54 6f 5b 5d 20 61 72 72 61 79 20 66  he aTo[] array f
73c0: 6f 72 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67  or the TO string
73d0: 20 2a 2f 0a 20 20 6e 20 3d 20 28 66 2e 6e 2b 31   */.  n = (f.n+1
73e0: 29 2a 28 6e 32 2b 31 29 3b 0a 20 20 6e 20 3d 20  )*(n2+1);.  n = 
73f0: 28 6e 2b 31 29 26 7e 31 3b 0a 20 20 6d 20 3d 20  (n+1)&~1;.  m = 
7400: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
7410: 6e 2a 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 20 2b  n*sizeof(m[0]) +
7420: 20 73 69 7a 65 6f 66 28 61 32 5b 30 5d 29 2a 6e   sizeof(a2[0])*n
7430: 32 20 29 3b 0a 20 20 69 66 28 20 6d 3d 3d 30 20  2 );.  if( m==0 
7440: 29 20 72 65 74 75 72 6e 20 2d 31 3b 20 20 20 20  ) return -1;    
7450: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 20 6f          /* Out o
7460: 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 32  f memory */.  a2
7470: 20 3d 20 28 45 64 69 74 44 69 73 74 33 54 6f 2a   = (EditDist3To*
7480: 29 26 6d 5b 6e 5d 3b 0a 20 20 6d 65 6d 73 65 74  )&m[n];.  memset
7490: 28 61 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  (a2, 0, sizeof(a
74a0: 32 5b 30 5d 29 2a 6e 32 29 3b 0a 0a 20 20 2f 2a  2[0])*n2);..  /*
74b0: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 61 31 5b   Fill in the a1[
74c0: 5d 20 6d 61 74 72 69 78 20 66 6f 72 20 61 6c 6c  ] matrix for all
74d0: 20 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 74   characters of t
74e0: 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a  he TO string */.
74f0: 20 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e    for(i2=0; i2<n
7500: 32 3b 20 69 32 2b 2b 29 7b 0a 20 20 20 20 61 32  2; i2++){.    a2
7510: 5b 69 32 5d 2e 6e 42 79 74 65 20 3d 20 75 74 66  [i2].nByte = utf
7520: 38 4c 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 63  8Len((unsigned c
7530: 68 61 72 29 7a 32 5b 69 32 5d 2c 20 6e 32 2d 69  har)z2[i2], n2-i
7540: 32 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c  2);.    for(p=pL
7550: 61 6e 67 2d 3e 70 43 6f 73 74 3b 20 70 3b 20 70  ang->pCost; p; p
7560: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
7570: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
7580: 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 69  **apNew;.      i
7590: 66 28 20 70 2d 3e 6e 46 72 6f 6d 3e 30 20 29 20  f( p->nFrom>0 ) 
75a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
75b0: 69 66 28 20 69 32 2b 70 2d 3e 6e 54 6f 3e 6e 32  if( i2+p->nTo>n2
75c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
75d0: 20 20 20 69 66 28 20 6d 61 74 63 68 54 6f 28 70     if( matchTo(p
75e0: 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29 3d  , z2+i2, n2-i2)=
75f0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7600: 20 20 20 20 20 61 32 5b 69 32 5d 2e 6e 49 6e 73       a2[i2].nIns
7610: 2b 2b 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 20  ++;.      apNew 
7620: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
7630: 63 28 61 32 5b 69 32 5d 2e 61 70 49 6e 73 2c 20  c(a2[i2].apIns, 
7640: 73 69 7a 65 6f 66 28 2a 61 70 4e 65 77 29 2a 61  sizeof(*apNew)*a
7650: 32 5b 69 32 5d 2e 6e 49 6e 73 29 3b 0a 20 20 20  2[i2].nIns);.   
7660: 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20     if( apNew==0 
7670: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
7680: 20 2d 31 3b 20 20 2f 2a 20 4f 75 74 20 6f 66 20   -1;  /* Out of 
7690: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 20 20  memory */.      
76a0: 20 20 67 6f 74 6f 20 65 64 69 74 44 69 73 74 33    goto editDist3
76b0: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
76c0: 20 20 20 20 20 61 32 5b 69 32 5d 2e 61 70 49 6e       a2[i2].apIn
76d0: 73 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20  s = apNew;.     
76e0: 20 61 32 5b 69 32 5d 2e 61 70 49 6e 73 5b 61 32   a2[i2].apIns[a2
76f0: 5b 69 32 5d 2e 6e 49 6e 73 2d 31 5d 20 3d 20 70  [i2].nIns-1] = p
7700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7710: 2a 20 50 72 65 70 61 72 65 20 74 6f 20 63 6f 6d  * Prepare to com
7720: 70 75 74 65 20 74 68 65 20 6d 69 6e 69 6d 75 6d  pute the minimum
7730: 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 2a   edit distance *
7740: 2f 0a 20 20 73 7a 52 6f 77 20 3d 20 66 2e 6e 2b  /.  szRow = f.n+
7750: 31 3b 0a 20 20 6d 65 6d 73 65 74 28 6d 2c 20 30  1;.  memset(m, 0
7760: 78 30 31 2c 20 28 6e 32 2b 31 29 2a 73 7a 52 6f  x01, (n2+1)*szRo
7770: 77 2a 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 29 3b  w*sizeof(m[0]));
7780: 0a 20 20 6d 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20  .  m[0] = 0;..  
7790: 2f 2a 20 46 69 72 73 74 20 66 69 6c 6c 20 69 6e  /* First fill in
77a0: 20 74 68 65 20 74 6f 70 2d 72 6f 77 20 6f 66 20   the top-row of 
77b0: 74 68 65 20 6d 61 74 72 69 78 20 77 69 74 68 20  the matrix with 
77c0: 46 52 4f 4d 20 64 65 6c 65 74 69 6f 6e 20 63 6f  FROM deletion co
77d0: 73 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 31 3d  sts */.  for(i1=
77e0: 30 3b 20 69 31 3c 66 2e 6e 3b 20 69 31 20 2b 3d  0; i1<f.n; i1 +=
77f0: 20 62 31 29 7b 0a 20 20 20 20 62 31 20 3d 20 66   b1){.    b1 = f
7800: 2e 61 5b 69 31 5d 2e 6e 42 79 74 65 3b 0a 20 20  .a[i1].nByte;.  
7810: 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20    updateCost(m, 
7820: 69 31 2b 62 31 2c 20 69 31 2c 20 70 4c 61 6e 67  i1+b1, i1, pLang
7830: 2d 3e 69 44 65 6c 43 6f 73 74 29 3b 0a 20 20 20  ->iDelCost);.   
7840: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b   for(k=0; k<f.a[
7850: 69 31 5d 2e 6e 44 65 6c 3b 20 6b 2b 2b 29 7b 0a  i1].nDel; k++){.
7860: 20 20 20 20 20 20 70 20 3d 20 66 2e 61 5b 69 31        p = f.a[i1
7870: 5d 2e 61 70 44 65 6c 5b 6b 5d 3b 0a 20 20 20 20  ].apDel[k];.    
7880: 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20    updateCost(m, 
7890: 69 31 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 69 31 2c  i1+p->nFrom, i1,
78a0: 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20   p->iCost);.    
78b0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6c 6c  }.  }..  /* Fill
78c0: 20 69 6e 20 61 6c 6c 20 73 75 62 73 65 71 75 65   in all subseque
78d0: 6e 74 20 72 6f 77 73 2c 20 74 6f 70 2d 74 6f 2d  nt rows, top-to-
78e0: 62 6f 74 74 6f 6d 2c 20 6c 65 66 74 2d 74 6f 2d  bottom, left-to-
78f0: 72 69 67 68 74 20 2a 2f 0a 20 20 66 6f 72 28 69  right */.  for(i
7900: 32 3d 30 3b 20 69 32 3c 6e 32 3b 20 69 32 20 2b  2=0; i2<n2; i2 +
7910: 3d 20 62 32 29 7b 0a 20 20 20 20 69 6e 74 20 72  = b2){.    int r
7920: 78 3b 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74  x;      /* Start
7930: 69 6e 67 20 69 6e 64 65 78 20 66 6f 72 20 63 75  ing index for cu
7940: 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20  rrent row */.   
7950: 20 69 6e 74 20 72 78 70 3b 20 20 20 20 20 2f 2a   int rxp;     /*
7960: 20 53 74 61 72 74 69 6e 67 20 69 6e 64 65 78 20   Starting index 
7970: 66 6f 72 20 70 72 65 76 69 6f 75 73 20 72 6f 77  for previous row
7980: 20 2a 2f 0a 20 20 20 20 62 32 20 3d 20 61 32 5b   */.    b2 = a2[
7990: 69 32 5d 2e 6e 42 79 74 65 3b 0a 20 20 20 20 72  i2].nByte;.    r
79a0: 78 20 3d 20 73 7a 52 6f 77 2a 28 69 32 2b 62 32  x = szRow*(i2+b2
79b0: 29 3b 0a 20 20 20 20 72 78 70 20 3d 20 73 7a 52  );.    rxp = szR
79c0: 6f 77 2a 69 32 3b 0a 20 20 20 20 75 70 64 61 74  ow*i2;.    updat
79d0: 65 43 6f 73 74 28 6d 2c 20 72 78 2c 20 72 78 70  eCost(m, rx, rxp
79e0: 2c 20 70 4c 61 6e 67 2d 3e 69 49 6e 73 43 6f 73  , pLang->iInsCos
79f0: 74 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  t);.    for(k=0;
7a00: 20 6b 3c 61 32 5b 69 32 5d 2e 6e 49 6e 73 3b 20   k<a2[i2].nIns; 
7a10: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  k++){.      p = 
7a20: 61 32 5b 69 32 5d 2e 61 70 49 6e 73 5b 6b 5d 3b  a2[i2].apIns[k];
7a30: 0a 20 20 20 20 20 20 75 70 64 61 74 65 43 6f 73  .      updateCos
7a40: 74 28 6d 2c 20 73 7a 52 6f 77 2a 28 69 32 2b 70  t(m, szRow*(i2+p
7a50: 2d 3e 6e 54 6f 29 2c 20 72 78 70 2c 20 70 2d 3e  ->nTo), rxp, p->
7a60: 69 43 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  iCost);.    }.  
7a70: 20 20 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 66    for(i1=0; i1<f
7a80: 2e 6e 3b 20 69 31 2b 3d 62 31 29 7b 0a 20 20 20  .n; i1+=b1){.   
7a90: 20 20 20 69 6e 74 20 63 78 3b 20 20 20 20 2f 2a     int cx;    /*
7aa0: 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
7ab0: 74 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  t cell */.      
7ac0: 69 6e 74 20 63 78 70 3b 20 20 20 2f 2a 20 49 6e  int cxp;   /* In
7ad0: 64 65 78 20 6f 66 20 63 65 6c 6c 20 69 6d 6d 65  dex of cell imme
7ae0: 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6c  diately to the l
7af0: 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  eft */.      int
7b00: 20 63 78 64 3b 20 20 20 2f 2a 20 49 6e 64 65 78   cxd;   /* Index
7b10: 20 6f 66 20 63 65 6c 6c 20 74 6f 20 74 68 65 20   of cell to the 
7b20: 6c 65 66 74 20 61 6e 64 20 6f 6e 65 20 72 6f 77  left and one row
7b30: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
7b40: 69 6e 74 20 63 78 75 3b 20 20 20 2f 2a 20 49 6e  int cxu;   /* In
7b50: 64 65 78 20 6f 66 20 63 65 6c 6c 20 69 6d 6d 65  dex of cell imme
7b60: 64 69 61 74 65 6c 79 20 61 62 6f 76 65 20 2a 2f  diately above */
7b70: 0a 20 20 20 20 20 20 62 31 20 3d 20 66 2e 61 5b  .      b1 = f.a[
7b80: 69 31 5d 2e 6e 42 79 74 65 3b 0a 20 20 20 20 20  i1].nByte;.     
7b90: 20 63 78 70 20 3d 20 72 78 20 2b 20 69 31 3b 0a   cxp = rx + i1;.
7ba0: 20 20 20 20 20 20 63 78 20 3d 20 63 78 70 20 2b        cx = cxp +
7bb0: 20 62 31 3b 0a 20 20 20 20 20 20 63 78 64 20 3d   b1;.      cxd =
7bc0: 20 72 78 70 20 2b 20 69 31 3b 0a 20 20 20 20 20   rxp + i1;.     
7bd0: 20 63 78 75 20 3d 20 63 78 64 20 2b 20 62 31 3b   cxu = cxd + b1;
7be0: 0a 20 20 20 20 20 20 75 70 64 61 74 65 43 6f 73  .      updateCos
7bf0: 74 28 6d 2c 20 63 78 2c 20 63 78 70 2c 20 70 4c  t(m, cx, cxp, pL
7c00: 61 6e 67 2d 3e 69 44 65 6c 43 6f 73 74 29 3b 0a  ang->iDelCost);.
7c10: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
7c20: 3c 66 2e 61 5b 69 31 5d 2e 6e 44 65 6c 3b 20 6b  <f.a[i1].nDel; k
7c30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  ++){.        p =
7c40: 20 66 2e 61 5b 69 31 5d 2e 61 70 44 65 6c 5b 6b   f.a[i1].apDel[k
7c50: 5d 3b 0a 20 20 20 20 20 20 20 20 75 70 64 61 74  ];.        updat
7c60: 65 43 6f 73 74 28 6d 2c 20 63 78 70 2b 70 2d 3e  eCost(m, cxp+p->
7c70: 6e 46 72 6f 6d 2c 20 63 78 70 2c 20 70 2d 3e 69  nFrom, cxp, p->i
7c80: 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Cost);.      }. 
7c90: 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28       updateCost(
7ca0: 6d 2c 20 63 78 2c 20 63 78 75 2c 20 70 4c 61 6e  m, cx, cxu, pLan
7cb0: 67 2d 3e 69 49 6e 73 43 6f 73 74 29 3b 0a 20 20  g->iInsCost);.  
7cc0: 20 20 20 20 69 66 28 20 6d 61 74 63 68 46 72 6f      if( matchFro
7cd0: 6d 54 6f 28 26 66 2c 20 69 31 2c 20 7a 32 2b 69  mTo(&f, i1, z2+i
7ce0: 32 2c 20 6e 32 2d 69 32 29 20 29 7b 0a 20 20 20  2, n2-i2) ){.   
7cf0: 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28       updateCost(
7d00: 6d 2c 20 63 78 2c 20 63 78 64 2c 20 30 29 3b 0a  m, cx, cxd, 0);.
7d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 70        }.      up
7d20: 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 2c 20  dateCost(m, cx, 
7d30: 63 78 64 2c 20 70 4c 61 6e 67 2d 3e 69 53 75 62  cxd, pLang->iSub
7d40: 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72  Cost);.      for
7d50: 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e  (k=0; k<f.a[i1].
7d60: 6e 53 75 62 73 74 3b 20 6b 2b 2b 29 7b 0a 20 20  nSubst; k++){.  
7d70: 20 20 20 20 20 20 70 20 3d 20 66 2e 61 5b 69 31        p = f.a[i1
7d80: 5d 2e 61 70 53 75 62 73 74 5b 6b 5d 3b 0a 20 20  ].apSubst[k];.  
7d90: 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 54        if( matchT
7da0: 6f 28 70 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d 69  o(p, z2+i2, n2-i
7db0: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
7dc0: 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78  updateCost(m, cx
7dd0: 64 2b 70 2d 3e 6e 46 72 6f 6d 2b 73 7a 52 6f 77  d+p->nFrom+szRow
7de0: 2a 70 2d 3e 6e 54 6f 2c 20 63 78 64 2c 20 70 2d  *p->nTo, cxd, p-
7df0: 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  >iCost);.       
7e00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
7e10: 0a 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20  .  }..#if 0  /* 
7e20: 45 6e 61 62 6c 65 20 66 6f 72 20 64 65 62 75 67  Enable for debug
7e30: 67 69 6e 67 20 2a 2f 0a 20 20 70 72 69 6e 74 66  ging */.  printf
7e40: 28 22 20 20 20 20 20 20 20 20 20 5e 22 29 3b 0a  ("         ^");.
7e50: 20 20 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 66    for(i1=0; i1<f
7e60: 2e 6e 3b 20 69 31 2b 2b 29 20 70 72 69 6e 74 66  .n; i1++) printf
7e70: 28 22 20 25 63 2d 25 32 78 22 2c 20 66 2e 7a 5b  (" %c-%2x", f.z[
7e80: 69 31 5d 2c 20 66 2e 7a 5b 69 31 5d 26 30 78 66  i1], f.z[i1]&0xf
7e90: 66 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e  f);.  printf("\n
7ea0: 20 20 20 5e 3a 22 29 3b 0a 20 20 66 6f 72 28 69     ^:");.  for(i
7eb0: 31 3d 30 3b 20 69 31 3c 73 7a 52 6f 77 3b 20 69  1=0; i1<szRow; i
7ec0: 31 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 76 20  1++){.    int v 
7ed0: 3d 20 6d 5b 69 31 5d 3b 0a 20 20 20 20 69 66 28  = m[i1];.    if(
7ee0: 20 76 3e 39 39 39 39 20 29 20 70 72 69 6e 74 66   v>9999 ) printf
7ef0: 28 22 20 2a 2a 2a 2a 22 29 3b 0a 20 20 20 20 65  (" ****");.    e
7f00: 6c 73 65 20 20 20 20 20 20 20 20 20 70 72 69 6e  lse         prin
7f10: 74 66 28 22 20 25 34 64 22 2c 20 76 29 3b 0a 20  tf(" %4d", v);. 
7f20: 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 22   }.  printf("\n"
7f30: 29 3b 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20 69  );.  for(i2=0; i
7f40: 32 3c 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20 20 20  2<n2; i2++){.   
7f50: 20 70 72 69 6e 74 66 28 22 25 63 2d 25 30 32 78   printf("%c-%02x
7f60: 3a 22 2c 20 7a 32 5b 69 32 5d 2c 20 7a 32 5b 69  :", z2[i2], z2[i
7f70: 32 5d 26 30 78 66 66 29 3b 0a 20 20 20 20 66 6f  2]&0xff);.    fo
7f80: 72 28 69 31 3d 30 3b 20 69 31 3c 73 7a 52 6f 77  r(i1=0; i1<szRow
7f90: 3b 20 69 31 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; i1++){.      i
7fa0: 6e 74 20 76 20 3d 20 6d 5b 28 69 32 2b 31 29 2a  nt v = m[(i2+1)*
7fb0: 73 7a 52 6f 77 2b 69 31 5d 3b 0a 20 20 20 20 20  szRow+i1];.     
7fc0: 20 69 66 28 20 76 3e 39 39 39 39 20 29 20 70 72   if( v>9999 ) pr
7fd0: 69 6e 74 66 28 22 20 2a 2a 2a 2a 22 29 3b 0a 20  intf(" ****");. 
7fe0: 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20       else       
7ff0: 20 20 70 72 69 6e 74 66 28 22 20 25 34 64 22 2c    printf(" %4d",
8000: 20 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   v);.    }.    p
8010: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
8020: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 72  .#endif..  /* Fr
8030: 65 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ee memory alloca
8040: 74 69 6f 6e 73 20 61 6e 64 20 72 65 74 75 72 6e  tions and return
8050: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
8060: 20 72 65 73 20 3d 20 28 69 6e 74 29 6d 5b 73 7a   res = (int)m[sz
8070: 52 6f 77 2a 28 6e 32 2b 31 29 2d 31 5d 3b 0a 20  Row*(n2+1)-1];. 
8080: 20 6e 20 3d 20 6e 32 3b 0a 20 20 69 66 28 20 66   n = n2;.  if( f
8090: 2e 69 73 50 72 65 66 69 78 20 29 7b 0a 20 20 20  .isPrefix ){.   
80a0: 20 66 6f 72 28 69 32 3d 31 3b 20 69 32 3c 3d 6e   for(i2=1; i2<=n
80b0: 32 3b 20 69 32 2b 2b 29 7b 0a 20 20 20 20 20 20  2; i2++){.      
80c0: 69 6e 74 20 62 20 3d 20 6d 5b 73 7a 52 6f 77 2a  int b = m[szRow*
80d0: 69 32 2d 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  i2-1];.      if(
80e0: 20 62 3c 3d 72 65 73 20 29 7b 20 0a 20 20 20 20   b<=res ){ .    
80f0: 20 20 20 20 72 65 73 20 3d 20 62 3b 0a 20 20 20      res = b;.   
8100: 20 20 20 20 20 6e 20 3d 20 69 32 20 2d 20 31 3b       n = i2 - 1;
8110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8120: 20 7d 0a 20 20 69 66 28 20 70 6e 4d 61 74 63 68   }.  if( pnMatch
8130: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74   ){.    int nExt
8140: 72 61 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ra = 0;.    for(
8150: 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 7b 0a  k=0; k<n; k++){.
8160: 20 20 20 20 20 20 69 66 28 20 28 7a 32 5b 6b 5d        if( (z2[k]
8170: 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29   & 0xc0)==0x80 )
8180: 20 6e 45 78 74 72 61 2b 2b 3b 0a 20 20 20 20 7d   nExtra++;.    }
8190: 0a 20 20 20 20 2a 70 6e 4d 61 74 63 68 20 3d 20  .    *pnMatch = 
81a0: 6e 20 2d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a  n - nExtra;.  }.
81b0: 0a 65 64 69 74 44 69 73 74 33 41 62 6f 72 74 3a  .editDist3Abort:
81c0: 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c  .  for(i2=0; i2<
81d0: 6e 32 3b 20 69 32 2b 2b 29 20 73 71 6c 69 74 65  n2; i2++) sqlite
81e0: 33 5f 66 72 65 65 28 61 32 5b 69 32 5d 2e 61 70  3_free(a2[i2].ap
81f0: 49 6e 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Ins);.  sqlite3_
8200: 66 72 65 65 28 6d 29 3b 0a 20 20 72 65 74 75 72  free(m);.  retur
8210: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
8220: 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
8230: 74 65 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  te EditDist3Lang
8240: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
8250: 69 63 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73  ic const EditDis
8260: 74 33 4c 61 6e 67 20 2a 65 64 69 74 44 69 73 74  t3Lang *editDist
8270: 33 46 69 6e 64 4c 61 6e 67 28 0a 20 20 45 64 69  3FindLang(.  Edi
8280: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43  tDist3Config *pC
8290: 6f 6e 66 69 67 2c 0a 20 20 69 6e 74 20 69 4c 61  onfig,.  int iLa
82a0: 6e 67 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ng.){.  int i;. 
82b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
82c0: 66 69 67 2d 3e 6e 4c 61 6e 67 3b 20 69 2b 2b 29  fig->nLang; i++)
82d0: 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69  {.    if( pConfi
82e0: 67 2d 3e 61 5b 69 5d 2e 69 4c 61 6e 67 3d 3d 69  g->a[i].iLang==i
82f0: 4c 61 6e 67 20 29 20 72 65 74 75 72 6e 20 26 70  Lang ) return &p
8300: 43 6f 6e 66 69 67 2d 3e 61 5b 69 5d 3b 0a 20 20  Config->a[i];.  
8310: 7d 0a 20 20 72 65 74 75 72 6e 20 26 65 64 69 74  }.  return &edit
8320: 44 69 73 74 33 4c 61 6e 67 3b 0a 7d 0a 0a 2f 2a  Dist3Lang;.}../*
8330: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20  .** Function:   
8340: 20 65 64 69 74 64 69 73 74 33 28 41 2c 42 2c 69   editdist3(A,B,i
8350: 4c 61 6e 67 29 0a 2a 2a 20 20 20 20 20 20 20 20  Lang).**        
8360: 20 20 20 20 20 20 65 64 69 74 64 69 73 74 33 28        editdist3(
8370: 74 61 62 6c 65 6e 61 6d 65 29 0a 2a 2a 0a 2a 2a  tablename).**.**
8380: 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74   Return the cost
8390: 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67   of transforming
83a0: 20 73 74 72 69 6e 67 20 41 20 69 6e 74 6f 20 73   string A into s
83b0: 74 72 69 6e 67 20 42 20 75 73 69 6e 67 20 65 64  tring B using ed
83c0: 69 74 0a 2a 2a 20 77 65 69 67 68 74 73 20 66 6f  it.** weights fo
83d0: 72 20 69 4c 61 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  r iLang..**.** T
83e0: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6c  he second form l
83f0: 6f 61 64 73 20 65 64 69 74 20 77 65 69 67 68 74  oads edit weight
8400: 73 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 66 72  s into memory fr
8410: 6f 6d 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  om a table..*/.s
8420: 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 44  tatic void editD
8430: 69 73 74 33 53 71 6c 46 75 6e 63 28 0a 20 20 73  ist3SqlFunc(.  s
8440: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8450: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
8460: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
8470: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
8480: 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   EditDist3Config
8490: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 28 45 64 69   *pConfig = (Edi
84a0: 74 44 69 73 74 33 43 6f 6e 66 69 67 2a 29 73 71  tDist3Config*)sq
84b0: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
84c0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69  context);.  sqli
84d0: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
84e0: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
84f0: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
8500: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
8510: 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  gc==1 ){.    con
8520: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 20  st char *zTable 
8530: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
8540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8550: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
8560: 72 63 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f  rc = editDist3Co
8570: 6e 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67  nfigLoad(pConfig
8580: 2c 20 64 62 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  , db, zTable);. 
8590: 20 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69     if( rc ) sqli
85a0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
85b0: 5f 63 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72  _code(context, r
85c0: 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  c);.  }else{.   
85d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 20   const char *zA 
85e0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
85f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
8600: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
8610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 20 3d  const char *zB =
8620: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
8630: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8640: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
8650: 6e 74 20 6e 41 20 3d 20 73 71 6c 69 74 65 33 5f  nt nA = sqlite3_
8660: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
8670: 5b 30 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 42  [0]);.    int nB
8680: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8690: 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b  _bytes(argv[1]);
86a0: 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d  .    int iLang =
86b0: 20 61 72 67 63 3d 3d 33 20 3f 20 73 71 6c 69 74   argc==3 ? sqlit
86c0: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
86d0: 76 5b 32 5d 29 20 3a 20 30 3b 0a 20 20 20 20 63  v[2]) : 0;.    c
86e0: 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c 61  onst EditDist3La
86f0: 6e 67 20 2a 70 4c 61 6e 67 20 3d 20 65 64 69 74  ng *pLang = edit
8700: 44 69 73 74 33 46 69 6e 64 4c 61 6e 67 28 70 43  Dist3FindLang(pC
8710: 6f 6e 66 69 67 2c 20 69 4c 61 6e 67 29 3b 0a 20  onfig, iLang);. 
8720: 20 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d     EditDist3From
8730: 53 74 72 69 6e 67 20 2a 70 46 72 6f 6d 3b 0a 20  String *pFrom;. 
8740: 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 0a 20 20     int dist;..  
8750: 20 20 70 46 72 6f 6d 20 3d 20 65 64 69 74 44 69    pFrom = editDi
8760: 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77  st3FromStringNew
8770: 28 70 4c 61 6e 67 2c 20 7a 41 2c 20 6e 41 29 3b  (pLang, zA, nA);
8780: 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 3d 3d  .    if( pFrom==
8790: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
87a0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
87b0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
87c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
87d0: 20 20 7d 0a 20 20 20 20 64 69 73 74 20 3d 20 65    }.    dist = e
87e0: 64 69 74 44 69 73 74 33 43 6f 72 65 28 70 46 72  ditDist3Core(pFr
87f0: 6f 6d 2c 20 7a 42 2c 20 6e 42 2c 20 70 4c 61 6e  om, zB, nB, pLan
8800: 67 2c 20 30 29 3b 0a 20 20 20 20 65 64 69 74 44  g, 0);.    editD
8810: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65  ist3FromStringDe
8820: 6c 65 74 65 28 70 46 72 6f 6d 29 3b 0a 20 20 20  lete(pFrom);.   
8830: 20 69 66 28 20 64 69 73 74 3d 3d 28 2d 31 29 20   if( dist==(-1) 
8840: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8850: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8860: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8870: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8880: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
8890: 74 28 63 6f 6e 74 65 78 74 2c 20 64 69 73 74 29  t(context, dist)
88a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a  ;.    }.  } .}..
88b0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74  /*.** Register t
88c0: 68 65 20 65 64 69 74 44 69 73 74 33 20 66 75 6e  he editDist3 fun
88d0: 63 74 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  ction with SQLit
88e0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
88f0: 65 64 69 74 44 69 73 74 33 49 6e 73 74 61 6c 6c  editDist3Install
8900: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8910: 20 69 6e 74 20 72 63 3b 0a 20 20 45 64 69 74 44   int rc;.  EditD
8920: 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  ist3Config *pCon
8930: 66 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  fig = sqlite3_ma
8940: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
8950: 6f 6e 66 69 67 29 20 29 3b 0a 20 20 69 66 28 20  onfig) );.  if( 
8960: 70 43 6f 6e 66 69 67 3d 3d 30 20 29 20 72 65 74  pConfig==0 ) ret
8970: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8980: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6e 66  ;.  memset(pConf
8990: 69 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ig, 0, sizeof(*p
89a0: 43 6f 6e 66 69 67 29 29 3b 0a 20 20 72 63 20 3d  Config));.  rc =
89b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
89c0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
89d0: 22 65 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20  "editdist3",.   
89e0: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 53 51             2, SQ
89f0: 4c 49 54 45 5f 55 54 46 38 2c 20 70 43 6f 6e 66  LITE_UTF8, pConf
8a00: 69 67 2c 20 65 64 69 74 44 69 73 74 33 53 71 6c  ig, editDist3Sql
8a10: 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Func, 0, 0, 0);.
8a20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8a30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
8a40: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
8a50: 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22  unction_v2(db, "
8a60: 65 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20  editdist3",.    
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 53              3, S
8a80: 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 43 6f 6e  QLITE_UTF8, pCon
8a90: 66 69 67 2c 20 65 64 69 74 44 69 73 74 33 53 71  fig, editDist3Sq
8aa0: 6c 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b  lFunc, 0, 0, 0);
8ab0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
8ac0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8ad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
8ae0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
8af0: 64 62 2c 20 22 65 64 69 74 64 69 73 74 33 22 2c  db, "editdist3",
8b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8b10: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
8b20: 20 70 43 6f 6e 66 69 67 2c 20 65 64 69 74 44 69   pConfig, editDi
8b30: 73 74 33 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  st3SqlFunc, 0, 0
8b40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8b50: 20 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69    editDist3Confi
8b60: 67 44 65 6c 65 74 65 29 3b 0a 20 20 7d 65 6c 73  gDelete);.  }els
8b70: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  e{.    sqlite3_f
8b80: 72 65 65 28 70 43 6f 6e 66 69 67 29 3b 0a 20 20  ree(pConfig);.  
8b90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8ba0: 0a 2f 2a 20 45 6e 64 20 63 6f 6e 66 69 67 75 72  ./* End configur
8bb0: 61 62 6c 65 20 63 6f 73 74 20 75 6e 69 63 6f 64  able cost unicod
8bc0: 65 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20  e edit distance 
8bd0: 72 6f 75 74 69 6e 65 73 0a 2a 2a 2a 2a 2a 2a 2a  routines.*******
8be0: 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
8c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c70: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20  ******.** Begin 
8c80: 74 72 61 6e 73 6c 69 74 65 72 61 74 65 20 75 6e  transliterate un
8c90: 69 63 6f 64 65 2d 74 6f 2d 61 73 63 69 69 20 69  icode-to-ascii i
8ca0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2f  mplementation.*/
8cb0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 41 4d  ..#if !SQLITE_AM
8cc0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  ALGAMATION./*.**
8cd0: 20 54 68 69 73 20 6c 6f 6f 6b 75 70 20 74 61 62   This lookup tab
8ce0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 68 65  le is used to he
8cf0: 6c 70 20 64 65 63 6f 64 65 20 74 68 65 20 66 69  lp decode the fi
8d00: 72 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 61  rst byte of.** a
8d10: 20 6d 75 6c 74 69 2d 62 79 74 65 20 55 54 46 38   multi-byte UTF8
8d20: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
8d30: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
8d40: 67 6e 65 64 20 63 68 61 72 20 73 71 6c 69 74 65  gned char sqlite
8d50: 33 55 74 66 38 54 72 61 6e 73 31 5b 5d 20 3d 20  3Utf8Trans1[] = 
8d60: 7b 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20  {.  0x00, 0x01, 
8d70: 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34  0x02, 0x03, 0x04
8d80: 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78  , 0x05, 0x06, 0x
8d90: 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78 30 39  07,.  0x08, 0x09
8da0: 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20 30 78  , 0x0a, 0x0b, 0x
8db0: 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65 2c 20  0c, 0x0d, 0x0e, 
8dc0: 30 78 30 66 2c 0a 20 20 30 78 31 30 2c 20 30 78  0x0f,.  0x10, 0x
8dd0: 31 31 2c 20 30 78 31 32 2c 20 30 78 31 33 2c 20  11, 0x12, 0x13, 
8de0: 30 78 31 34 2c 20 30 78 31 35 2c 20 30 78 31 36  0x14, 0x15, 0x16
8df0: 2c 20 30 78 31 37 2c 0a 20 20 30 78 31 38 2c 20  , 0x17,.  0x18, 
8e00: 30 78 31 39 2c 20 30 78 31 61 2c 20 30 78 31 62  0x19, 0x1a, 0x1b
8e10: 2c 20 30 78 31 63 2c 20 30 78 31 64 2c 20 30 78  , 0x1c, 0x1d, 0x
8e20: 31 65 2c 20 30 78 31 66 2c 0a 20 20 30 78 30 30  1e, 0x1f,.  0x00
8e30: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
8e40: 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20  03, 0x04, 0x05, 
8e50: 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78  0x06, 0x07,.  0x
8e60: 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61 2c 20  08, 0x09, 0x0a, 
8e70: 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78 30 64  0x0b, 0x0c, 0x0d
8e80: 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a 20 20  , 0x0e, 0x0f,.  
8e90: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32  0x00, 0x01, 0x02
8ea0: 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78  , 0x03, 0x04, 0x
8eb0: 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a  05, 0x06, 0x07,.
8ec0: 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78    0x00, 0x01, 0x
8ed0: 30 32 2c 20 30 78 30 33 2c 20 30 78 30 30 2c 20  02, 0x03, 0x00, 
8ee0: 30 78 30 31 2c 20 30 78 30 30 2c 20 30 78 30 30  0x01, 0x00, 0x00
8ef0: 2c 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,.};.#endif../*.
8f00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
8f10: 6c 75 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  lue of the first
8f20: 20 55 54 46 2d 38 20 63 68 61 72 61 63 74 65 72   UTF-8 character
8f30: 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a   in the string..
8f40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 74  */.static int ut
8f50: 66 38 52 65 61 64 28 63 6f 6e 73 74 20 75 6e 73  f8Read(const uns
8f60: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 69  igned char *z, i
8f70: 6e 74 20 6e 2c 20 69 6e 74 20 2a 70 53 69 7a 65  nt n, int *pSize
8f80: 29 7b 0a 20 20 69 6e 74 20 63 2c 20 69 3b 0a 0a  ){.  int c, i;..
8f90: 20 20 2f 2a 20 41 6c 6c 20 63 61 6c 6c 65 72 73    /* All callers
8fa0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
8fb0: 20 28 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74   (in the current
8fc0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29   implementation)
8fd0: 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 68 61 76  .  ** always hav
8fe0: 65 20 6e 3e 30 2e 20 2a 2f 0a 20 20 69 66 28 20  e n>0. */.  if( 
8ff0: 4e 45 56 45 52 28 6e 3d 3d 30 29 20 29 7b 0a 20  NEVER(n==0) ){. 
9000: 20 20 20 63 20 3d 20 69 20 3d 20 30 3b 0a 20 20     c = i = 0;.  
9010: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 20 3d 20 7a  }else{.    c = z
9020: 5b 30 5d 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a  [0];.    i = 1;.
9030: 20 20 20 20 69 66 28 20 63 3e 3d 30 78 63 30 20      if( c>=0xc0 
9040: 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 73 71 6c  ){.      c = sql
9050: 69 74 65 33 55 74 66 38 54 72 61 6e 73 31 5b 63  ite3Utf8Trans1[c
9060: 2d 30 78 63 30 5d 3b 0a 20 20 20 20 20 20 77 68  -0xc0];.      wh
9070: 69 6c 65 28 20 69 3c 6e 20 26 26 20 28 7a 5b 69  ile( i<n && (z[i
9080: 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
9090: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 28  ){.        c = (
90a0: 63 3c 3c 36 29 20 2b 20 28 30 78 33 66 20 26 20  c<<6) + (0x3f & 
90b0: 7a 5b 69 2b 2b 5d 29 3b 0a 20 20 20 20 20 20 7d  z[i++]);.      }
90c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 53  .    }.  }.  *pS
90d0: 69 7a 65 20 3d 20 69 3b 0a 20 20 72 65 74 75 72  ize = i;.  retur
90e0: 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n c;.}../*.** Re
90f0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
9100: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
9110: 20 74 68 65 20 75 74 66 2d 38 20 73 74 72 69 6e   the utf-8 strin
9120: 67 20 69 6e 20 74 68 65 20 6e 49 6e 20 62 79 74  g in the nIn byt
9130: 65 0a 2a 2a 20 62 75 66 66 65 72 20 70 6f 69 6e  e.** buffer poin
9140: 74 65 64 20 74 6f 20 62 79 20 7a 49 6e 2e 0a 2a  ted to by zIn..*
9150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 74 66  /.static int utf
9160: 38 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63  8Charlen(const c
9170: 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49  har *zIn, int nI
9180: 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
9190: 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 0a 20 20  nt nChar = 0;.  
91a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 3b 20  for(i=0; i<nIn; 
91b0: 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 69 6e  nChar++){.    in
91c0: 74 20 73 7a 3b 0a 20 20 20 20 75 74 66 38 52 65  t sz;.    utf8Re
91d0: 61 64 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ad((const unsign
91e0: 65 64 20 63 68 61 72 20 2a 29 26 7a 49 6e 5b 69  ed char *)&zIn[i
91f0: 5d 2c 20 6e 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a  ], nIn-i, &sz);.
9200: 20 20 20 20 69 20 2b 3d 20 73 7a 3b 0a 20 20 7d      i += sz;.  }
9210: 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b  .  return nChar;
9220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20  .}../*.** Table 
9230: 6f 66 20 74 72 61 6e 73 6c 61 74 69 6f 6e 73 20  of translations 
9240: 66 72 6f 6d 20 75 6e 69 63 6f 64 65 20 63 68 61  from unicode cha
9250: 72 61 63 74 65 72 73 20 69 6e 74 6f 20 41 53 43  racters into ASC
9260: 49 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  II..*/.static co
9270: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 75 6e  nst struct {. un
9280: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74  signed short int
9290: 20 63 46 72 6f 6d 3b 0a 20 75 6e 73 69 67 6e 65   cFrom;. unsigne
92a0: 64 20 63 68 61 72 20 63 54 6f 30 2c 20 63 54 6f  d char cTo0, cTo
92b0: 31 3b 0a 7d 20 74 72 61 6e 73 6c 69 74 5b 5d 20  1;.} translit[] 
92c0: 3d 20 7b 0a 20 20 7b 20 30 78 30 30 41 30 2c 20  = {.  { 0x00A0, 
92d0: 20 30 78 32 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x20, 0x00 },  
92e0: 2f 2a 20 c2 a0 20 74 6f 20 20 20 2a 2f 0a 20 20  /* .. to   */.  
92f0: 7b 20 30 78 30 30 42 35 2c 20 20 30 78 37 35 2c  { 0x00B5,  0x75,
9300: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c2 b5 20   0x00 },  /* .. 
9310: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to u */.  { 0x00
9320: 43 30 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20  C0,  0x41, 0x00 
9330: 7d 2c 20 20 2f 2a 20 c3 80 20 74 6f 20 41 20 2a  },  /* .. to A *
9340: 2f 0a 20 20 7b 20 30 78 30 30 43 31 2c 20 20 30  /.  { 0x00C1,  0
9350: 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x41, 0x00 },  /*
9360: 20 c3 81 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
9370: 30 78 30 30 43 32 2c 20 20 30 78 34 31 2c 20 30  0x00C2,  0x41, 0
9380: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 82 20 74 6f  x00 },  /* .. to
9390: 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 33   A */.  { 0x00C3
93a0: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
93b0: 20 20 2f 2a 20 c3 83 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
93c0: 20 20 7b 20 30 78 30 30 43 34 2c 20 20 30 78 34    { 0x00C4,  0x4
93d0: 31 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3  1, 0x65 },  /* .
93e0: 84 20 74 6f 20 41 65 20 2a 2f 0a 20 20 7b 20 30  . to Ae */.  { 0
93f0: 78 30 30 43 35 2c 20 20 30 78 34 31 2c 20 30 78  x00C5,  0x41, 0x
9400: 36 31 20 7d 2c 20 20 2f 2a 20 c3 85 20 74 6f 20  61 },  /* .. to 
9410: 41 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 36  Aa */.  { 0x00C6
9420: 2c 20 20 30 78 34 31 2c 20 30 78 34 35 20 7d 2c  ,  0x41, 0x45 },
9430: 20 20 2f 2a 20 c3 86 20 74 6f 20 41 45 20 2a 2f    /* .. to AE */
9440: 0a 20 20 7b 20 30 78 30 30 43 37 2c 20 20 30 78  .  { 0x00C7,  0x
9450: 34 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  43, 0x00 },  /* 
9460: c3 87 20 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30  .. to C */.  { 0
9470: 78 30 30 43 38 2c 20 20 30 78 34 35 2c 20 30 78  x00C8,  0x45, 0x
9480: 30 30 20 7d 2c 20 20 2f 2a 20 c3 88 20 74 6f 20  00 },  /* .. to 
9490: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 39 2c  E */.  { 0x00C9,
94a0: 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20    0x45, 0x00 }, 
94b0: 20 2f 2a 20 c3 89 20 74 6f 20 45 20 2a 2f 0a 20   /* .. to E */. 
94c0: 20 7b 20 30 78 30 30 43 41 2c 20 20 30 78 34 35   { 0x00CA,  0x45
94d0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8a  , 0x00 },  /* ..
94e0: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
94f0: 30 43 42 2c 20 20 30 78 34 35 2c 20 30 78 30 30  0CB,  0x45, 0x00
9500: 20 7d 2c 20 20 2f 2a 20 c3 8b 20 74 6f 20 45 20   },  /* .. to E 
9510: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 43 2c 20 20  */.  { 0x00CC,  
9520: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
9530: 2a 20 c3 8c 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
9540: 20 30 78 30 30 43 44 2c 20 20 30 78 34 39 2c 20   0x00CD,  0x49, 
9550: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8d 20 74  0x00 },  /* .. t
9560: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43  o I */.  { 0x00C
9570: 45 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  E,  0x49, 0x00 }
9580: 2c 20 20 2f 2a 20 c3 8e 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
9590: 0a 20 20 7b 20 30 78 30 30 43 46 2c 20 20 30 78  .  { 0x00CF,  0x
95a0: 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  49, 0x00 },  /* 
95b0: c3 8f 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
95c0: 78 30 30 44 30 2c 20 20 30 78 34 34 2c 20 30 78  x00D0,  0x44, 0x
95d0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 90 20 74 6f 20  00 },  /* .. to 
95e0: 44 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 31 2c  D */.  { 0x00D1,
95f0: 20 20 30 78 34 45 2c 20 30 78 30 30 20 7d 2c 20    0x4E, 0x00 }, 
9600: 20 2f 2a 20 c3 91 20 74 6f 20 4e 20 2a 2f 0a 20   /* .. to N */. 
9610: 20 7b 20 30 78 30 30 44 32 2c 20 20 30 78 34 46   { 0x00D2,  0x4F
9620: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 92  , 0x00 },  /* ..
9630: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
9640: 30 44 33 2c 20 20 30 78 34 46 2c 20 30 78 30 30  0D3,  0x4F, 0x00
9650: 20 7d 2c 20 20 2f 2a 20 c3 93 20 74 6f 20 4f 20   },  /* .. to O 
9660: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 34 2c 20 20  */.  { 0x00D4,  
9670: 30 78 34 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4F, 0x00 },  /
9680: 2a 20 c3 94 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b  * .. to O */.  {
9690: 20 30 78 30 30 44 35 2c 20 20 30 78 34 46 2c 20   0x00D5,  0x4F, 
96a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 95 20 74  0x00 },  /* .. t
96b0: 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44  o O */.  { 0x00D
96c0: 36 2c 20 20 30 78 34 46 2c 20 30 78 36 35 20 7d  6,  0x4F, 0x65 }
96d0: 2c 20 20 2f 2a 20 c3 96 20 74 6f 20 4f 65 20 2a  ,  /* .. to Oe *
96e0: 2f 0a 20 20 7b 20 30 78 30 30 44 37 2c 20 20 30  /.  { 0x00D7,  0
96f0: 78 37 38 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x78, 0x00 },  /*
9700: 20 c3 97 20 74 6f 20 78 20 2a 2f 0a 20 20 7b 20   .. to x */.  { 
9710: 30 78 30 30 44 38 2c 20 20 30 78 34 46 2c 20 30  0x00D8,  0x4F, 0
9720: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 98 20 74 6f  x00 },  /* .. to
9730: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 39   O */.  { 0x00D9
9740: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
9750: 20 20 2f 2a 20 c3 99 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
9760: 20 20 7b 20 30 78 30 30 44 41 2c 20 20 30 78 35    { 0x00DA,  0x5
9770: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  5, 0x00 },  /* .
9780: 9a 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
9790: 30 30 44 42 2c 20 20 30 78 35 35 2c 20 30 78 30  00DB,  0x55, 0x0
97a0: 30 20 7d 2c 20 20 2f 2a 20 c3 9b 20 74 6f 20 55  0 },  /* .. to U
97b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 43 2c 20   */.  { 0x00DC, 
97c0: 20 30 78 35 35 2c 20 30 78 36 35 20 7d 2c 20 20   0x55, 0x65 },  
97d0: 2f 2a 20 c3 9c 20 74 6f 20 55 65 20 2a 2f 0a 20  /* .. to Ue */. 
97e0: 20 7b 20 30 78 30 30 44 44 2c 20 20 30 78 35 39   { 0x00DD,  0x59
97f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9d  , 0x00 },  /* ..
9800: 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30   to Y */.  { 0x0
9810: 30 44 45 2c 20 20 30 78 35 34 2c 20 30 78 36 38  0DE,  0x54, 0x68
9820: 20 7d 2c 20 20 2f 2a 20 c3 9e 20 74 6f 20 54 68   },  /* .. to Th
9830: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 46 2c 20   */.  { 0x00DF, 
9840: 20 30 78 37 33 2c 20 30 78 37 33 20 7d 2c 20 20   0x73, 0x73 },  
9850: 2f 2a 20 c3 9f 20 74 6f 20 73 73 20 2a 2f 0a 20  /* .. to ss */. 
9860: 20 7b 20 30 78 30 30 45 30 2c 20 20 30 78 36 31   { 0x00E0,  0x61
9870: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a0  , 0x00 },  /* ..
9880: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
9890: 30 45 31 2c 20 20 30 78 36 31 2c 20 30 78 30 30  0E1,  0x61, 0x00
98a0: 20 7d 2c 20 20 2f 2a 20 c3 a1 20 74 6f 20 61 20   },  /* .. to a 
98b0: 2a 2f 0a 20 20 7b 20 30 78 30 30 45 32 2c 20 20  */.  { 0x00E2,  
98c0: 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x61, 0x00 },  /
98d0: 2a 20 c3 a2 20 74 6f 20 61 20 2a 2f 0a 20 20 7b  * .. to a */.  {
98e0: 20 30 78 30 30 45 33 2c 20 20 30 78 36 31 2c 20   0x00E3,  0x61, 
98f0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a3 20 74  0x00 },  /* .. t
9900: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45  o a */.  { 0x00E
9910: 34 2c 20 20 30 78 36 31 2c 20 30 78 36 35 20 7d  4,  0x61, 0x65 }
9920: 2c 20 20 2f 2a 20 c3 a4 20 74 6f 20 61 65 20 2a  ,  /* .. to ae *
9930: 2f 0a 20 20 7b 20 30 78 30 30 45 35 2c 20 20 30  /.  { 0x00E5,  0
9940: 78 36 31 2c 20 30 78 36 31 20 7d 2c 20 20 2f 2a  x61, 0x61 },  /*
9950: 20 c3 a5 20 74 6f 20 61 61 20 2a 2f 0a 20 20 7b   .. to aa */.  {
9960: 20 30 78 30 30 45 36 2c 20 20 30 78 36 31 2c 20   0x00E6,  0x61, 
9970: 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 a6 20 74  0x65 },  /* .. t
9980: 6f 20 61 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o ae */.  { 0x00
9990: 45 37 2c 20 20 30 78 36 33 2c 20 30 78 30 30 20  E7,  0x63, 0x00 
99a0: 7d 2c 20 20 2f 2a 20 c3 a7 20 74 6f 20 63 20 2a  },  /* .. to c *
99b0: 2f 0a 20 20 7b 20 30 78 30 30 45 38 2c 20 20 30  /.  { 0x00E8,  0
99c0: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
99d0: 20 c3 a8 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
99e0: 30 78 30 30 45 39 2c 20 20 30 78 36 35 2c 20 30  0x00E9,  0x65, 0
99f0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a9 20 74 6f  x00 },  /* .. to
9a00: 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 41   e */.  { 0x00EA
9a10: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
9a20: 20 20 2f 2a 20 c3 aa 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
9a30: 20 20 7b 20 30 78 30 30 45 42 2c 20 20 30 78 36    { 0x00EB,  0x6
9a40: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  5, 0x00 },  /* .
9a50: ab 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
9a60: 30 30 45 43 2c 20 20 30 78 36 39 2c 20 30 78 30  00EC,  0x69, 0x0
9a70: 30 20 7d 2c 20 20 2f 2a 20 c3 ac 20 74 6f 20 69  0 },  /* .. to i
9a80: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 44 2c 20   */.  { 0x00ED, 
9a90: 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x69, 0x00 },  
9aa0: 2f 2a 20 c3 ad 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
9ab0: 7b 20 30 78 30 30 45 45 2c 20 20 30 78 36 39 2c  { 0x00EE,  0x69,
9ac0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ae 20   0x00 },  /* .. 
9ad0: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to i */.  { 0x00
9ae0: 45 46 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  EF,  0x69, 0x00 
9af0: 7d 2c 20 20 2f 2a 20 c3 af 20 74 6f 20 69 20 2a  },  /* .. to i *
9b00: 2f 0a 20 20 7b 20 30 78 30 30 46 30 2c 20 20 30  /.  { 0x00F0,  0
9b10: 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x64, 0x00 },  /*
9b20: 20 c3 b0 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20   .. to d */.  { 
9b30: 30 78 30 30 46 31 2c 20 20 30 78 36 45 2c 20 30  0x00F1,  0x6E, 0
9b40: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b1 20 74 6f  x00 },  /* .. to
9b50: 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 32   n */.  { 0x00F2
9b60: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c  ,  0x6F, 0x00 },
9b70: 20 20 2f 2a 20 c3 b2 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
9b80: 20 20 7b 20 30 78 30 30 46 33 2c 20 20 30 78 36    { 0x00F3,  0x6
9b90: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  F, 0x00 },  /* .
9ba0: b3 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
9bb0: 30 30 46 34 2c 20 20 30 78 36 46 2c 20 30 78 30  00F4,  0x6F, 0x0
9bc0: 30 20 7d 2c 20 20 2f 2a 20 c3 b4 20 74 6f 20 6f  0 },  /* .. to o
9bd0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 35 2c 20   */.  { 0x00F5, 
9be0: 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20   0x6F, 0x00 },  
9bf0: 2f 2a 20 c3 b5 20 74 6f 20 6f 20 2a 2f 0a 20 20  /* .. to o */.  
9c00: 7b 20 30 78 30 30 46 36 2c 20 20 30 78 36 46 2c  { 0x00F6,  0x6F,
9c10: 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 b6 20   0x65 },  /* .. 
9c20: 74 6f 20 6f 65 20 2a 2f 0a 20 20 7b 20 30 78 30  to oe */.  { 0x0
9c30: 30 46 37 2c 20 20 30 78 33 41 2c 20 30 78 30 30  0F7,  0x3A, 0x00
9c40: 20 7d 2c 20 20 2f 2a 20 c3 b7 20 74 6f 20 3a 20   },  /* .. to : 
9c50: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 38 2c 20 20  */.  { 0x00F8,  
9c60: 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6F, 0x00 },  /
9c70: 2a 20 c3 b8 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b  * .. to o */.  {
9c80: 20 30 78 30 30 46 39 2c 20 20 30 78 37 35 2c 20   0x00F9,  0x75, 
9c90: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b9 20 74  0x00 },  /* .. t
9ca0: 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46  o u */.  { 0x00F
9cb0: 41 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d  A,  0x75, 0x00 }
9cc0: 2c 20 20 2f 2a 20 c3 ba 20 74 6f 20 75 20 2a 2f  ,  /* .. to u */
9cd0: 0a 20 20 7b 20 30 78 30 30 46 42 2c 20 20 30 78  .  { 0x00FB,  0x
9ce0: 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  75, 0x00 },  /* 
9cf0: c3 bb 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30  .. to u */.  { 0
9d00: 78 30 30 46 43 2c 20 20 30 78 37 35 2c 20 30 78  x00FC,  0x75, 0x
9d10: 36 35 20 7d 2c 20 20 2f 2a 20 c3 bc 20 74 6f 20  65 },  /* .. to 
9d20: 75 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 44  ue */.  { 0x00FD
9d30: 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c  ,  0x79, 0x00 },
9d40: 20 20 2f 2a 20 c3 bd 20 74 6f 20 79 20 2a 2f 0a    /* .. to y */.
9d50: 20 20 7b 20 30 78 30 30 46 45 2c 20 20 30 78 37    { 0x00FE,  0x7
9d60: 34 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c3  4, 0x68 },  /* .
9d70: be 20 74 6f 20 74 68 20 2a 2f 0a 20 20 7b 20 30  . to th */.  { 0
9d80: 78 30 30 46 46 2c 20 20 30 78 37 39 2c 20 30 78  x00FF,  0x79, 0x
9d90: 30 30 20 7d 2c 20 20 2f 2a 20 c3 bf 20 74 6f 20  00 },  /* .. to 
9da0: 79 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 30 2c  y */.  { 0x0100,
9db0: 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20    0x41, 0x00 }, 
9dc0: 20 2f 2a 20 c4 80 20 74 6f 20 41 20 2a 2f 0a 20   /* .. to A */. 
9dd0: 20 7b 20 30 78 30 31 30 31 2c 20 20 30 78 36 31   { 0x0101,  0x61
9de0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 81  , 0x00 },  /* ..
9df0: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
9e00: 31 30 32 2c 20 20 30 78 34 31 2c 20 30 78 30 30  102,  0x41, 0x00
9e10: 20 7d 2c 20 20 2f 2a 20 c4 82 20 74 6f 20 41 20   },  /* .. to A 
9e20: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 33 2c 20 20  */.  { 0x0103,  
9e30: 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x61, 0x00 },  /
9e40: 2a 20 c4 83 20 74 6f 20 61 20 2a 2f 0a 20 20 7b  * .. to a */.  {
9e50: 20 30 78 30 31 30 34 2c 20 20 30 78 34 31 2c 20   0x0104,  0x41, 
9e60: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 84 20 74  0x00 },  /* .. t
9e70: 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o A */.  { 0x010
9e80: 35 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d  5,  0x61, 0x00 }
9e90: 2c 20 20 2f 2a 20 c4 85 20 74 6f 20 61 20 2a 2f  ,  /* .. to a */
9ea0: 0a 20 20 7b 20 30 78 30 31 30 36 2c 20 20 30 78  .  { 0x0106,  0x
9eb0: 34 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  43, 0x00 },  /* 
9ec0: c4 86 20 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30  .. to C */.  { 0
9ed0: 78 30 31 30 37 2c 20 20 30 78 36 33 2c 20 30 78  x0107,  0x63, 0x
9ee0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 87 20 74 6f 20  00 },  /* .. to 
9ef0: 63 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 38 2c  c */.  { 0x0108,
9f00: 20 20 30 78 34 33 2c 20 30 78 36 38 20 7d 2c 20    0x43, 0x68 }, 
9f10: 20 2f 2a 20 c4 88 20 74 6f 20 43 68 20 2a 2f 0a   /* .. to Ch */.
9f20: 20 20 7b 20 30 78 30 31 30 39 2c 20 20 30 78 36    { 0x0109,  0x6
9f30: 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4  3, 0x68 },  /* .
9f40: 89 20 74 6f 20 63 68 20 2a 2f 0a 20 20 7b 20 30  . to ch */.  { 0
9f50: 78 30 31 30 41 2c 20 20 30 78 34 33 2c 20 30 78  x010A,  0x43, 0x
9f60: 30 30 20 7d 2c 20 20 2f 2a 20 c4 8a 20 74 6f 20  00 },  /* .. to 
9f70: 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 42 2c  C */.  { 0x010B,
9f80: 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20    0x63, 0x00 }, 
9f90: 20 2f 2a 20 c4 8b 20 74 6f 20 63 20 2a 2f 0a 20   /* .. to c */. 
9fa0: 20 7b 20 30 78 30 31 30 43 2c 20 20 30 78 34 33   { 0x010C,  0x43
9fb0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8c  , 0x00 },  /* ..
9fc0: 20 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30   to C */.  { 0x0
9fd0: 31 30 44 2c 20 20 30 78 36 33 2c 20 30 78 30 30  10D,  0x63, 0x00
9fe0: 20 7d 2c 20 20 2f 2a 20 c4 8d 20 74 6f 20 63 20   },  /* .. to c 
9ff0: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 45 2c 20 20  */.  { 0x010E,  
a000: 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x44, 0x00 },  /
a010: 2a 20 c4 8e 20 74 6f 20 44 20 2a 2f 0a 20 20 7b  * .. to D */.  {
a020: 20 30 78 30 31 30 46 2c 20 20 30 78 36 34 2c 20   0x010F,  0x64, 
a030: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8f 20 74  0x00 },  /* .. t
a040: 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o d */.  { 0x011
a050: 30 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d  0,  0x44, 0x00 }
a060: 2c 20 20 2f 2a 20 c4 90 20 74 6f 20 44 20 2a 2f  ,  /* .. to D */
a070: 0a 20 20 7b 20 30 78 30 31 31 31 2c 20 20 30 78  .  { 0x0111,  0x
a080: 36 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  64, 0x00 },  /* 
a090: c4 91 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30  .. to d */.  { 0
a0a0: 78 30 31 31 32 2c 20 20 30 78 34 35 2c 20 30 78  x0112,  0x45, 0x
a0b0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 92 20 74 6f 20  00 },  /* .. to 
a0c0: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 33 2c  E */.  { 0x0113,
a0d0: 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20    0x65, 0x00 }, 
a0e0: 20 2f 2a 20 c4 93 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
a0f0: 20 7b 20 30 78 30 31 31 34 2c 20 20 30 78 34 35   { 0x0114,  0x45
a100: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 94  , 0x00 },  /* ..
a110: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
a120: 31 31 35 2c 20 20 30 78 36 35 2c 20 30 78 30 30  115,  0x65, 0x00
a130: 20 7d 2c 20 20 2f 2a 20 c4 95 20 74 6f 20 65 20   },  /* .. to e 
a140: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 36 2c 20 20  */.  { 0x0116,  
a150: 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x45, 0x00 },  /
a160: 2a 20 c4 96 20 74 6f 20 45 20 2a 2f 0a 20 20 7b  * .. to E */.  {
a170: 20 30 78 30 31 31 37 2c 20 20 30 78 36 35 2c 20   0x0117,  0x65, 
a180: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 97 20 74  0x00 },  /* .. t
a190: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o e */.  { 0x011
a1a0: 38 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  8,  0x45, 0x00 }
a1b0: 2c 20 20 2f 2a 20 c4 98 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
a1c0: 0a 20 20 7b 20 30 78 30 31 31 39 2c 20 20 30 78  .  { 0x0119,  0x
a1d0: 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  65, 0x00 },  /* 
a1e0: c4 99 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
a1f0: 78 30 31 31 41 2c 20 20 30 78 34 35 2c 20 30 78  x011A,  0x45, 0x
a200: 30 30 20 7d 2c 20 20 2f 2a 20 c4 9a 20 74 6f 20  00 },  /* .. to 
a210: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 42 2c  E */.  { 0x011B,
a220: 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20    0x65, 0x00 }, 
a230: 20 2f 2a 20 c4 9b 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
a240: 20 7b 20 30 78 30 31 31 43 2c 20 20 30 78 34 37   { 0x011C,  0x47
a250: 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 9c  , 0x68 },  /* ..
a260: 20 74 6f 20 47 68 20 2a 2f 0a 20 20 7b 20 30 78   to Gh */.  { 0x
a270: 30 31 31 44 2c 20 20 30 78 36 37 2c 20 30 78 36  011D,  0x67, 0x6
a280: 38 20 7d 2c 20 20 2f 2a 20 c4 9d 20 74 6f 20 67  8 },  /* .. to g
a290: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 45 2c  h */.  { 0x011E,
a2a0: 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c 20    0x47, 0x00 }, 
a2b0: 20 2f 2a 20 c4 9e 20 74 6f 20 47 20 2a 2f 0a 20   /* .. to G */. 
a2c0: 20 7b 20 30 78 30 31 31 46 2c 20 20 30 78 36 37   { 0x011F,  0x67
a2d0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9f  , 0x00 },  /* ..
a2e0: 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30   to g */.  { 0x0
a2f0: 31 32 30 2c 20 20 30 78 34 37 2c 20 30 78 30 30  120,  0x47, 0x00
a300: 20 7d 2c 20 20 2f 2a 20 c4 a0 20 74 6f 20 47 20   },  /* .. to G 
a310: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 31 2c 20 20  */.  { 0x0121,  
a320: 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x67, 0x00 },  /
a330: 2a 20 c4 a1 20 74 6f 20 67 20 2a 2f 0a 20 20 7b  * .. to g */.  {
a340: 20 30 78 30 31 32 32 2c 20 20 30 78 34 37 2c 20   0x0122,  0x47, 
a350: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a2 20 74  0x00 },  /* .. t
a360: 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o G */.  { 0x012
a370: 33 2c 20 20 30 78 36 37 2c 20 30 78 30 30 20 7d  3,  0x67, 0x00 }
a380: 2c 20 20 2f 2a 20 c4 a3 20 74 6f 20 67 20 2a 2f  ,  /* .. to g */
a390: 0a 20 20 7b 20 30 78 30 31 32 34 2c 20 20 30 78  .  { 0x0124,  0x
a3a0: 34 38 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  48, 0x68 },  /* 
a3b0: c4 a4 20 74 6f 20 48 68 20 2a 2f 0a 20 20 7b 20  .. to Hh */.  { 
a3c0: 30 78 30 31 32 35 2c 20 20 30 78 36 38 2c 20 30  0x0125,  0x68, 0
a3d0: 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 a5 20 74 6f  x68 },  /* .. to
a3e0: 20 68 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32   hh */.  { 0x012
a3f0: 36 2c 20 20 30 78 34 38 2c 20 30 78 30 30 20 7d  6,  0x48, 0x00 }
a400: 2c 20 20 2f 2a 20 c4 a6 20 74 6f 20 48 20 2a 2f  ,  /* .. to H */
a410: 0a 20 20 7b 20 30 78 30 31 32 37 2c 20 20 30 78  .  { 0x0127,  0x
a420: 36 38 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  68, 0x00 },  /* 
a430: c4 a7 20 74 6f 20 68 20 2a 2f 0a 20 20 7b 20 30  .. to h */.  { 0
a440: 78 30 31 32 38 2c 20 20 30 78 34 39 2c 20 30 78  x0128,  0x49, 0x
a450: 30 30 20 7d 2c 20 20 2f 2a 20 c4 a8 20 74 6f 20  00 },  /* .. to 
a460: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 39 2c  I */.  { 0x0129,
a470: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
a480: 20 2f 2a 20 c4 a9 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
a490: 20 7b 20 30 78 30 31 32 41 2c 20 20 30 78 34 39   { 0x012A,  0x49
a4a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 aa  , 0x00 },  /* ..
a4b0: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
a4c0: 31 32 42 2c 20 20 30 78 36 39 2c 20 30 78 30 30  12B,  0x69, 0x00
a4d0: 20 7d 2c 20 20 2f 2a 20 c4 ab 20 74 6f 20 69 20   },  /* .. to i 
a4e0: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 43 2c 20 20  */.  { 0x012C,  
a4f0: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
a500: 2a 20 c4 ac 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
a510: 20 30 78 30 31 32 44 2c 20 20 30 78 36 39 2c 20   0x012D,  0x69, 
a520: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ad 20 74  0x00 },  /* .. t
a530: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o i */.  { 0x012
a540: 45 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  E,  0x49, 0x00 }
a550: 2c 20 20 2f 2a 20 c4 ae 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
a560: 0a 20 20 7b 20 30 78 30 31 32 46 2c 20 20 30 78  .  { 0x012F,  0x
a570: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
a580: c4 af 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
a590: 78 30 31 33 30 2c 20 20 30 78 34 39 2c 20 30 78  x0130,  0x49, 0x
a5a0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 b0 20 74 6f 20  00 },  /* .. to 
a5b0: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 31 2c  I */.  { 0x0131,
a5c0: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
a5d0: 20 2f 2a 20 c4 b1 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
a5e0: 20 7b 20 30 78 30 31 33 32 2c 20 20 30 78 34 39   { 0x0132,  0x49
a5f0: 2c 20 30 78 34 41 20 7d 2c 20 20 2f 2a 20 c4 b2  , 0x4A },  /* ..
a600: 20 74 6f 20 49 4a 20 2a 2f 0a 20 20 7b 20 30 78   to IJ */.  { 0x
a610: 30 31 33 33 2c 20 20 30 78 36 39 2c 20 30 78 36  0133,  0x69, 0x6
a620: 41 20 7d 2c 20 20 2f 2a 20 c4 b3 20 74 6f 20 69  A },  /* .. to i
a630: 6a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 34 2c  j */.  { 0x0134,
a640: 20 20 30 78 34 41 2c 20 30 78 36 38 20 7d 2c 20    0x4A, 0x68 }, 
a650: 20 2f 2a 20 c4 b4 20 74 6f 20 4a 68 20 2a 2f 0a   /* .. to Jh */.
a660: 20 20 7b 20 30 78 30 31 33 35 2c 20 20 30 78 36    { 0x0135,  0x6
a670: 41 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4  A, 0x68 },  /* .
a680: b5 20 74 6f 20 6a 68 20 2a 2f 0a 20 20 7b 20 30  . to jh */.  { 0
a690: 78 30 31 33 36 2c 20 20 30 78 34 42 2c 20 30 78  x0136,  0x4B, 0x
a6a0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 b6 20 74 6f 20  00 },  /* .. to 
a6b0: 4b 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 37 2c  K */.  { 0x0137,
a6c0: 20 20 30 78 36 42 2c 20 30 78 30 30 20 7d 2c 20    0x6B, 0x00 }, 
a6d0: 20 2f 2a 20 c4 b7 20 74 6f 20 6b 20 2a 2f 0a 20   /* .. to k */. 
a6e0: 20 7b 20 30 78 30 31 33 38 2c 20 20 30 78 36 42   { 0x0138,  0x6B
a6f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b8  , 0x00 },  /* ..
a700: 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30   to k */.  { 0x0
a710: 31 33 39 2c 20 20 30 78 34 43 2c 20 30 78 30 30  139,  0x4C, 0x00
a720: 20 7d 2c 20 20 2f 2a 20 c4 b9 20 74 6f 20 4c 20   },  /* .. to L 
a730: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 41 2c 20 20  */.  { 0x013A,  
a740: 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6C, 0x00 },  /
a750: 2a 20 c4 ba 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b  * .. to l */.  {
a760: 20 30 78 30 31 33 42 2c 20 20 30 78 34 43 2c 20   0x013B,  0x4C, 
a770: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 bb 20 74  0x00 },  /* .. t
a780: 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o L */.  { 0x013
a790: 43 2c 20 20 30 78 36 43 2c 20 30 78 30 30 20 7d  C,  0x6C, 0x00 }
a7a0: 2c 20 20 2f 2a 20 c4 bc 20 74 6f 20 6c 20 2a 2f  ,  /* .. to l */
a7b0: 0a 20 20 7b 20 30 78 30 31 33 44 2c 20 20 30 78  .  { 0x013D,  0x
a7c0: 34 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4C, 0x00 },  /* 
a7d0: c4 bd 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30  .. to L */.  { 0
a7e0: 78 30 31 33 45 2c 20 20 30 78 36 43 2c 20 30 78  x013E,  0x6C, 0x
a7f0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 be 20 74 6f 20  00 },  /* .. to 
a800: 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 46 2c  l */.  { 0x013F,
a810: 20 20 30 78 34 43 2c 20 30 78 32 45 20 7d 2c 20    0x4C, 0x2E }, 
a820: 20 2f 2a 20 c4 bf 20 74 6f 20 4c 2e 20 2a 2f 0a   /* .. to L. */.
a830: 20 20 7b 20 30 78 30 31 34 30 2c 20 20 30 78 36    { 0x0140,  0x6
a840: 43 2c 20 30 78 32 45 20 7d 2c 20 20 2f 2a 20 c5  C, 0x2E },  /* .
a850: 80 20 74 6f 20 6c 2e 20 2a 2f 0a 20 20 7b 20 30  . to l. */.  { 0
a860: 78 30 31 34 31 2c 20 20 30 78 34 43 2c 20 30 78  x0141,  0x4C, 0x
a870: 30 30 20 7d 2c 20 20 2f 2a 20 c5 81 20 74 6f 20  00 },  /* .. to 
a880: 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 32 2c  L */.  { 0x0142,
a890: 20 20 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20    0x6C, 0x00 }, 
a8a0: 20 2f 2a 20 c5 82 20 74 6f 20 6c 20 2a 2f 0a 20   /* .. to l */. 
a8b0: 20 7b 20 30 78 30 31 34 33 2c 20 20 30 78 34 45   { 0x0143,  0x4E
a8c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 83  , 0x00 },  /* ..
a8d0: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
a8e0: 31 34 34 2c 20 20 30 78 36 45 2c 20 30 78 30 30  144,  0x6E, 0x00
a8f0: 20 7d 2c 20 20 2f 2a 20 c5 84 20 74 6f 20 6e 20   },  /* .. to n 
a900: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 35 2c 20 20  */.  { 0x0145,  
a910: 30 78 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4E, 0x00 },  /
a920: 2a 20 c5 85 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b  * .. to N */.  {
a930: 20 30 78 30 31 34 36 2c 20 20 30 78 36 45 2c 20   0x0146,  0x6E, 
a940: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 86 20 74  0x00 },  /* .. t
a950: 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34  o n */.  { 0x014
a960: 37 2c 20 20 30 78 34 45 2c 20 30 78 30 30 20 7d  7,  0x4E, 0x00 }
a970: 2c 20 20 2f 2a 20 c5 87 20 74 6f 20 4e 20 2a 2f  ,  /* .. to N */
a980: 0a 20 20 7b 20 30 78 30 31 34 38 2c 20 20 30 78  .  { 0x0148,  0x
a990: 36 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6E, 0x00 },  /* 
a9a0: c5 88 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30  .. to n */.  { 0
a9b0: 78 30 31 34 39 2c 20 20 30 78 32 37 2c 20 30 78  x0149,  0x27, 0x
a9c0: 36 45 20 7d 2c 20 20 2f 2a 20 c5 89 20 74 6f 20  6E },  /* .. to 
a9d0: 27 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 41  'n */.  { 0x014A
a9e0: 2c 20 20 30 78 34 45 2c 20 30 78 34 37 20 7d 2c  ,  0x4E, 0x47 },
a9f0: 20 20 2f 2a 20 c5 8a 20 74 6f 20 4e 47 20 2a 2f    /* .. to NG */
aa00: 0a 20 20 7b 20 30 78 30 31 34 42 2c 20 20 30 78  .  { 0x014B,  0x
aa10: 36 45 2c 20 30 78 36 37 20 7d 2c 20 20 2f 2a 20  6E, 0x67 },  /* 
aa20: c5 8b 20 74 6f 20 6e 67 20 2a 2f 0a 20 20 7b 20  .. to ng */.  { 
aa30: 30 78 30 31 34 43 2c 20 20 30 78 34 46 2c 20 30  0x014C,  0x4F, 0
aa40: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8c 20 74 6f  x00 },  /* .. to
aa50: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 44   O */.  { 0x014D
aa60: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c  ,  0x6F, 0x00 },
aa70: 20 20 2f 2a 20 c5 8d 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
aa80: 20 20 7b 20 30 78 30 31 34 45 2c 20 20 30 78 34    { 0x014E,  0x4
aa90: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  F, 0x00 },  /* .
aaa0: 8e 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
aab0: 30 31 34 46 2c 20 20 30 78 36 46 2c 20 30 78 30  014F,  0x6F, 0x0
aac0: 30 20 7d 2c 20 20 2f 2a 20 c5 8f 20 74 6f 20 6f  0 },  /* .. to o
aad0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 30 2c 20   */.  { 0x0150, 
aae0: 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c 20 20   0x4F, 0x00 },  
aaf0: 2f 2a 20 c5 90 20 74 6f 20 4f 20 2a 2f 0a 20 20  /* .. to O */.  
ab00: 7b 20 30 78 30 31 35 31 2c 20 20 30 78 36 46 2c  { 0x0151,  0x6F,
ab10: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 91 20   0x00 },  /* .. 
ab20: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to o */.  { 0x01
ab30: 35 32 2c 20 20 30 78 34 46 2c 20 30 78 34 35 20  52,  0x4F, 0x45 
ab40: 7d 2c 20 20 2f 2a 20 c5 92 20 74 6f 20 4f 45 20  },  /* .. to OE 
ab50: 2a 2f 0a 20 20 7b 20 30 78 30 31 35 33 2c 20 20  */.  { 0x0153,  
ab60: 30 78 36 46 2c 20 30 78 36 35 20 7d 2c 20 20 2f  0x6F, 0x65 },  /
ab70: 2a 20 c5 93 20 74 6f 20 6f 65 20 2a 2f 0a 20 20  * .. to oe */.  
ab80: 7b 20 30 78 30 31 35 34 2c 20 20 30 78 35 32 2c  { 0x0154,  0x52,
ab90: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 94 20   0x00 },  /* .. 
aba0: 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to R */.  { 0x01
abb0: 35 35 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20  55,  0x72, 0x00 
abc0: 7d 2c 20 20 2f 2a 20 c5 95 20 74 6f 20 72 20 2a  },  /* .. to r *
abd0: 2f 0a 20 20 7b 20 30 78 30 31 35 36 2c 20 20 30  /.  { 0x0156,  0
abe0: 78 35 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x52, 0x00 },  /*
abf0: 20 c5 96 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20   .. to R */.  { 
ac00: 30 78 30 31 35 37 2c 20 20 30 78 37 32 2c 20 30  0x0157,  0x72, 0
ac10: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 97 20 74 6f  x00 },  /* .. to
ac20: 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 38   r */.  { 0x0158
ac30: 2c 20 20 30 78 35 32 2c 20 30 78 30 30 20 7d 2c  ,  0x52, 0x00 },
ac40: 20 20 2f 2a 20 c5 98 20 74 6f 20 52 20 2a 2f 0a    /* .. to R */.
ac50: 20 20 7b 20 30 78 30 31 35 39 2c 20 20 30 78 37    { 0x0159,  0x7
ac60: 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  2, 0x00 },  /* .
ac70: 99 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30 78  . to r */.  { 0x
ac80: 30 31 35 41 2c 20 20 30 78 35 33 2c 20 30 78 30  015A,  0x53, 0x0
ac90: 30 20 7d 2c 20 20 2f 2a 20 c5 9a 20 74 6f 20 53  0 },  /* .. to S
aca0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 42 2c 20   */.  { 0x015B, 
acb0: 20 30 78 37 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x73, 0x00 },  
acc0: 2f 2a 20 c5 9b 20 74 6f 20 73 20 2a 2f 0a 20 20  /* .. to s */.  
acd0: 7b 20 30 78 30 31 35 43 2c 20 20 30 78 35 33 2c  { 0x015C,  0x53,
ace0: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c5 9c 20   0x68 },  /* .. 
acf0: 74 6f 20 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Sh */.  { 0x0
ad00: 31 35 44 2c 20 20 30 78 37 33 2c 20 30 78 36 38  15D,  0x73, 0x68
ad10: 20 7d 2c 20 20 2f 2a 20 c5 9d 20 74 6f 20 73 68   },  /* .. to sh
ad20: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 45 2c 20   */.  { 0x015E, 
ad30: 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x53, 0x00 },  
ad40: 2f 2a 20 c5 9e 20 74 6f 20 53 20 2a 2f 0a 20 20  /* .. to S */.  
ad50: 7b 20 30 78 30 31 35 46 2c 20 20 30 78 37 33 2c  { 0x015F,  0x73,
ad60: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9f 20   0x00 },  /* .. 
ad70: 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to s */.  { 0x01
ad80: 36 30 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20  60,  0x53, 0x00 
ad90: 7d 2c 20 20 2f 2a 20 c5 a0 20 74 6f 20 53 20 2a  },  /* .. to S *
ada0: 2f 0a 20 20 7b 20 30 78 30 31 36 31 2c 20 20 30  /.  { 0x0161,  0
adb0: 78 37 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x73, 0x00 },  /*
adc0: 20 c5 a1 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20   .. to s */.  { 
add0: 30 78 30 31 36 32 2c 20 20 30 78 35 34 2c 20 30  0x0162,  0x54, 0
ade0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a2 20 74 6f  x00 },  /* .. to
adf0: 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 33   T */.  { 0x0163
ae00: 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c  ,  0x74, 0x00 },
ae10: 20 20 2f 2a 20 c5 a3 20 74 6f 20 74 20 2a 2f 0a    /* .. to t */.
ae20: 20 20 7b 20 30 78 30 31 36 34 2c 20 20 30 78 35    { 0x0164,  0x5
ae30: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  4, 0x00 },  /* .
ae40: a4 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78  . to T */.  { 0x
ae50: 30 31 36 35 2c 20 20 30 78 37 34 2c 20 30 78 30  0165,  0x74, 0x0
ae60: 30 20 7d 2c 20 20 2f 2a 20 c5 a5 20 74 6f 20 74  0 },  /* .. to t
ae70: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 36 2c 20   */.  { 0x0166, 
ae80: 20 30 78 35 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x54, 0x00 },  
ae90: 2f 2a 20 c5 a6 20 74 6f 20 54 20 2a 2f 0a 20 20  /* .. to T */.  
aea0: 7b 20 30 78 30 31 36 37 2c 20 20 30 78 37 34 2c  { 0x0167,  0x74,
aeb0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a7 20   0x00 },  /* .. 
aec0: 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to t */.  { 0x01
aed0: 36 38 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  68,  0x55, 0x00 
aee0: 7d 2c 20 20 2f 2a 20 c5 a8 20 74 6f 20 55 20 2a  },  /* .. to U *
aef0: 2f 0a 20 20 7b 20 30 78 30 31 36 39 2c 20 20 30  /.  { 0x0169,  0
af00: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
af10: 20 c5 a9 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
af20: 30 78 30 31 36 41 2c 20 20 30 78 35 35 2c 20 30  0x016A,  0x55, 0
af30: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 aa 20 74 6f  x00 },  /* .. to
af40: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 42   U */.  { 0x016B
af50: 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c  ,  0x75, 0x00 },
af60: 20 20 2f 2a 20 c5 ab 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
af70: 20 20 7b 20 30 78 30 31 36 43 2c 20 20 30 78 35    { 0x016C,  0x5
af80: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  5, 0x00 },  /* .
af90: ac 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
afa0: 30 31 36 44 2c 20 20 30 78 37 35 2c 20 30 78 30  016D,  0x75, 0x0
afb0: 30 20 7d 2c 20 20 2f 2a 20 c5 ad 20 74 6f 20 75  0 },  /* .. to u
afc0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 45 2c 20   */.  { 0x016E, 
afd0: 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x55, 0x00 },  
afe0: 2f 2a 20 c5 ae 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
aff0: 7b 20 30 78 30 31 36 46 2c 20 20 30 78 37 35 2c  { 0x016F,  0x75,
b000: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 af 20   0x00 },  /* .. 
b010: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to u */.  { 0x01
b020: 37 30 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  70,  0x55, 0x00 
b030: 7d 2c 20 20 2f 2a 20 c5 b0 20 74 6f 20 55 20 2a  },  /* .. to U *
b040: 2f 0a 20 20 7b 20 30 78 30 31 37 31 2c 20 20 30  /.  { 0x0171,  0
b050: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
b060: 20 c5 b1 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
b070: 30 78 30 31 37 32 2c 20 20 30 78 35 35 2c 20 30  0x0172,  0x55, 0
b080: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b2 20 74 6f  x00 },  /* .. to
b090: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 33   U */.  { 0x0173
b0a0: 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c  ,  0x75, 0x00 },
b0b0: 20 20 2f 2a 20 c5 b3 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
b0c0: 20 20 7b 20 30 78 30 31 37 34 2c 20 20 30 78 35    { 0x0174,  0x5
b0d0: 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  7, 0x00 },  /* .
b0e0: b4 20 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78  . to W */.  { 0x
b0f0: 30 31 37 35 2c 20 20 30 78 37 37 2c 20 30 78 30  0175,  0x77, 0x0
b100: 30 20 7d 2c 20 20 2f 2a 20 c5 b5 20 74 6f 20 77  0 },  /* .. to w
b110: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 36 2c 20   */.  { 0x0176, 
b120: 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x59, 0x00 },  
b130: 2f 2a 20 c5 b6 20 74 6f 20 59 20 2a 2f 0a 20 20  /* .. to Y */.  
b140: 7b 20 30 78 30 31 37 37 2c 20 20 30 78 37 39 2c  { 0x0177,  0x79,
b150: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b7 20   0x00 },  /* .. 
b160: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to y */.  { 0x01
b170: 37 38 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20  78,  0x59, 0x00 
b180: 7d 2c 20 20 2f 2a 20 c5 b8 20 74 6f 20 59 20 2a  },  /* .. to Y *
b190: 2f 0a 20 20 7b 20 30 78 30 31 37 39 2c 20 20 30  /.  { 0x0179,  0
b1a0: 78 35 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x5A, 0x00 },  /*
b1b0: 20 c5 b9 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20   .. to Z */.  { 
b1c0: 30 78 30 31 37 41 2c 20 20 30 78 37 41 2c 20 30  0x017A,  0x7A, 0
b1d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ba 20 74 6f  x00 },  /* .. to
b1e0: 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 42   z */.  { 0x017B
b1f0: 2c 20 20 30 78 35 41 2c 20 30 78 30 30 20 7d 2c  ,  0x5A, 0x00 },
b200: 20 20 2f 2a 20 c5 bb 20 74 6f 20 5a 20 2a 2f 0a    /* .. to Z */.
b210: 20 20 7b 20 30 78 30 31 37 43 2c 20 20 30 78 37    { 0x017C,  0x7
b220: 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  A, 0x00 },  /* .
b230: bc 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78  . to z */.  { 0x
b240: 30 31 37 44 2c 20 20 30 78 35 41 2c 20 30 78 30  017D,  0x5A, 0x0
b250: 30 20 7d 2c 20 20 2f 2a 20 c5 bd 20 74 6f 20 5a  0 },  /* .. to Z
b260: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 45 2c 20   */.  { 0x017E, 
b270: 20 30 78 37 41 2c 20 30 78 30 30 20 7d 2c 20 20   0x7A, 0x00 },  
b280: 2f 2a 20 c5 be 20 74 6f 20 7a 20 2a 2f 0a 20 20  /* .. to z */.  
b290: 7b 20 30 78 30 31 37 46 2c 20 20 30 78 37 33 2c  { 0x017F,  0x73,
b2a0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bf 20   0x00 },  /* .. 
b2b0: 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to s */.  { 0x01
b2c0: 39 32 2c 20 20 30 78 36 36 2c 20 30 78 30 30 20  92,  0x66, 0x00 
b2d0: 7d 2c 20 20 2f 2a 20 c6 92 20 74 6f 20 66 20 2a  },  /* .. to f *
b2e0: 2f 0a 20 20 7b 20 30 78 30 32 31 38 2c 20 20 30  /.  { 0x0218,  0
b2f0: 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x53, 0x00 },  /*
b300: 20 c8 98 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20   .. to S */.  { 
b310: 30 78 30 32 31 39 2c 20 20 30 78 37 33 2c 20 30  0x0219,  0x73, 0
b320: 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 99 20 74 6f  x00 },  /* .. to
b330: 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 32 31 41   s */.  { 0x021A
b340: 2c 20 20 30 78 35 34 2c 20 30 78 30 30 20 7d 2c  ,  0x54, 0x00 },
b350: 20 20 2f 2a 20 c8 9a 20 74 6f 20 54 20 2a 2f 0a    /* .. to T */.
b360: 20 20 7b 20 30 78 30 32 31 42 2c 20 20 30 78 37    { 0x021B,  0x7
b370: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8  4, 0x00 },  /* .
b380: 9b 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78  . to t */.  { 0x
b390: 30 33 38 36 2c 20 20 30 78 34 31 2c 20 30 78 30  0386,  0x41, 0x0
b3a0: 30 20 7d 2c 20 20 2f 2a 20 ce 86 20 74 6f 20 41  0 },  /* .. to A
b3b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 38 2c 20   */.  { 0x0388, 
b3c0: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
b3d0: 2f 2a 20 ce 88 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
b3e0: 7b 20 30 78 30 33 38 39 2c 20 20 30 78 34 39 2c  { 0x0389,  0x49,
b3f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 89 20   0x00 },  /* .. 
b400: 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to I */.  { 0x03
b410: 38 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  8A,  0x49, 0x00 
b420: 7d 2c 20 20 2f 2a 20 ce 8a 20 74 6f 20 49 20 2a  },  /* .. to I *
b430: 2f 0a 20 20 7b 20 30 78 30 33 38 43 2c 20 20 30  /.  { 0x038C,  0
b440: 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4f, 0x00 },  /*
b450: 20 ce 8c 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
b460: 30 78 30 33 38 45 2c 20 20 30 78 35 39 2c 20 30  0x038E,  0x59, 0
b470: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 8e 20 74 6f  x00 },  /* .. to
b480: 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 46   Y */.  { 0x038F
b490: 2c 20 20 30 78 34 66 2c 20 30 78 30 30 20 7d 2c  ,  0x4f, 0x00 },
b4a0: 20 20 2f 2a 20 ce 8f 20 74 6f 20 4f 20 2a 2f 0a    /* .. to O */.
b4b0: 20 20 7b 20 30 78 30 33 39 30 2c 20 20 30 78 36    { 0x0390,  0x6
b4c0: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  9, 0x00 },  /* .
b4d0: 90 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
b4e0: 30 33 39 31 2c 20 20 30 78 34 31 2c 20 30 78 30  0391,  0x41, 0x0
b4f0: 30 20 7d 2c 20 20 2f 2a 20 ce 91 20 74 6f 20 41  0 },  /* .. to A
b500: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 32 2c 20   */.  { 0x0392, 
b510: 20 30 78 34 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x42, 0x00 },  
b520: 2f 2a 20 ce 92 20 74 6f 20 42 20 2a 2f 0a 20 20  /* .. to B */.  
b530: 7b 20 30 78 30 33 39 33 2c 20 20 30 78 34 37 2c  { 0x0393,  0x47,
b540: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 93 20   0x00 },  /* .. 
b550: 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to G */.  { 0x03
b560: 39 34 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20  94,  0x44, 0x00 
b570: 7d 2c 20 20 2f 2a 20 ce 94 20 74 6f 20 44 20 2a  },  /* .. to D *
b580: 2f 0a 20 20 7b 20 30 78 30 33 39 35 2c 20 20 30  /.  { 0x0395,  0
b590: 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x45, 0x00 },  /*
b5a0: 20 ce 95 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
b5b0: 30 78 30 33 39 36 2c 20 20 30 78 35 61 2c 20 30  0x0396,  0x5a, 0
b5c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 96 20 74 6f  x00 },  /* .. to
b5d0: 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 37   Z */.  { 0x0397
b5e0: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
b5f0: 20 20 2f 2a 20 ce 97 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
b600: 20 20 7b 20 30 78 30 33 39 38 2c 20 20 30 78 35    { 0x0398,  0x5
b610: 34 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 ce  4, 0x68 },  /* .
b620: 98 20 74 6f 20 54 68 20 2a 2f 0a 20 20 7b 20 30  . to Th */.  { 0
b630: 78 30 33 39 39 2c 20 20 30 78 34 39 2c 20 30 78  x0399,  0x49, 0x
b640: 30 30 20 7d 2c 20 20 2f 2a 20 ce 99 20 74 6f 20  00 },  /* .. to 
b650: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 41 2c  I */.  { 0x039A,
b660: 20 20 30 78 34 62 2c 20 30 78 30 30 20 7d 2c 20    0x4b, 0x00 }, 
b670: 20 2f 2a 20 ce 9a 20 74 6f 20 4b 20 2a 2f 0a 20   /* .. to K */. 
b680: 20 7b 20 30 78 30 33 39 42 2c 20 20 30 78 34 63   { 0x039B,  0x4c
b690: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9b  , 0x00 },  /* ..
b6a0: 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30   to L */.  { 0x0
b6b0: 33 39 43 2c 20 20 30 78 34 64 2c 20 30 78 30 30  39C,  0x4d, 0x00
b6c0: 20 7d 2c 20 20 2f 2a 20 ce 9c 20 74 6f 20 4d 20   },  /* .. to M 
b6d0: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 44 2c 20 20  */.  { 0x039D,  
b6e0: 30 78 34 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4e, 0x00 },  /
b6f0: 2a 20 ce 9d 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b  * .. to N */.  {
b700: 20 30 78 30 33 39 45 2c 20 20 30 78 35 38 2c 20   0x039E,  0x58, 
b710: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9e 20 74  0x00 },  /* .. t
b720: 6f 20 58 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39  o X */.  { 0x039
b730: 46 2c 20 20 30 78 34 66 2c 20 30 78 30 30 20 7d  F,  0x4f, 0x00 }
b740: 2c 20 20 2f 2a 20 ce 9f 20 74 6f 20 4f 20 2a 2f  ,  /* .. to O */
b750: 0a 20 20 7b 20 30 78 30 33 41 30 2c 20 20 30 78  .  { 0x03A0,  0x
b760: 35 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  50, 0x00 },  /* 
b770: ce a0 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30  .. to P */.  { 0
b780: 78 30 33 41 31 2c 20 20 30 78 35 32 2c 20 30 78  x03A1,  0x52, 0x
b790: 30 30 20 7d 2c 20 20 2f 2a 20 ce a1 20 74 6f 20  00 },  /* .. to 
b7a0: 52 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 33 2c  R */.  { 0x03A3,
b7b0: 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20    0x53, 0x00 }, 
b7c0: 20 2f 2a 20 ce a3 20 74 6f 20 53 20 2a 2f 0a 20   /* .. to S */. 
b7d0: 20 7b 20 30 78 30 33 41 34 2c 20 20 30 78 35 34   { 0x03A4,  0x54
b7e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a4  , 0x00 },  /* ..
b7f0: 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30   to T */.  { 0x0
b800: 33 41 35 2c 20 20 30 78 35 39 2c 20 30 78 30 30  3A5,  0x59, 0x00
b810: 20 7d 2c 20 20 2f 2a 20 ce a5 20 74 6f 20 59 20   },  /* .. to Y 
b820: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 36 2c 20 20  */.  { 0x03A6,  
b830: 30 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x46, 0x00 },  /
b840: 2a 20 ce a6 20 74 6f 20 46 20 2a 2f 0a 20 20 7b  * .. to F */.  {
b850: 20 30 78 30 33 41 37 2c 20 20 30 78 34 33 2c 20   0x03A7,  0x43, 
b860: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 ce a7 20 74  0x68 },  /* .. t
b870: 6f 20 43 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33  o Ch */.  { 0x03
b880: 41 38 2c 20 20 30 78 35 30 2c 20 30 78 37 33 20  A8,  0x50, 0x73 
b890: 7d 2c 20 20 2f 2a 20 ce a8 20 74 6f 20 50 73 20  },  /* .. to Ps 
b8a0: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 39 2c 20 20  */.  { 0x03A9,  
b8b0: 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4f, 0x00 },  /
b8c0: 2a 20 ce a9 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b  * .. to O */.  {
b8d0: 20 30 78 30 33 41 41 2c 20 20 30 78 34 39 2c 20   0x03AA,  0x49, 
b8e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce aa 20 74  0x00 },  /* .. t
b8f0: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o I */.  { 0x03A
b900: 42 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d  B,  0x59, 0x00 }
b910: 2c 20 20 2f 2a 20 ce ab 20 74 6f 20 59 20 2a 2f  ,  /* .. to Y */
b920: 0a 20 20 7b 20 30 78 30 33 41 43 2c 20 20 30 78  .  { 0x03AC,  0x
b930: 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  61, 0x00 },  /* 
b940: ce ac 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30  .. to a */.  { 0
b950: 78 30 33 41 44 2c 20 20 30 78 36 35 2c 20 30 78  x03AD,  0x65, 0x
b960: 30 30 20 7d 2c 20 20 2f 2a 20 ce ad 20 74 6f 20  00 },  /* .. to 
b970: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 45 2c  e */.  { 0x03AE,
b980: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
b990: 20 2f 2a 20 ce ae 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
b9a0: 20 7b 20 30 78 30 33 41 46 2c 20 20 30 78 36 39   { 0x03AF,  0x69
b9b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce af  , 0x00 },  /* ..
b9c0: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
b9d0: 33 42 31 2c 20 20 30 78 36 31 2c 20 30 78 30 30  3B1,  0x61, 0x00
b9e0: 20 7d 2c 20 20 2f 2a 20 ce b1 20 74 6f 20 61 20   },  /* .. to a 
b9f0: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 32 2c 20 20  */.  { 0x03B2,  
ba00: 30 78 36 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x62, 0x00 },  /
ba10: 2a 20 ce b2 20 74 6f 20 62 20 2a 2f 0a 20 20 7b  * .. to b */.  {
ba20: 20 30 78 30 33 42 33 2c 20 20 30 78 36 37 2c 20   0x03B3,  0x67, 
ba30: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b3 20 74  0x00 },  /* .. t
ba40: 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o g */.  { 0x03B
ba50: 34 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d  4,  0x64, 0x00 }
ba60: 2c 20 20 2f 2a 20 ce b4 20 74 6f 20 64 20 2a 2f  ,  /* .. to d */
ba70: 0a 20 20 7b 20 30 78 30 33 42 35 2c 20 20 30 78  .  { 0x03B5,  0x
ba80: 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  65, 0x00 },  /* 
ba90: ce b5 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
baa0: 78 30 33 42 36 2c 20 20 30 78 37 61 2c 20 30 78  x03B6,  0x7a, 0x
bab0: 30 30 20 7d 2c 20 20 2f 2a 20 ce b6 20 74 6f 20  00 },  /* .. to 
bac0: 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 37 2c  z */.  { 0x03B7,
bad0: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
bae0: 20 2f 2a 20 ce b7 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
baf0: 20 7b 20 30 78 30 33 42 38 2c 20 20 30 78 37 34   { 0x03B8,  0x74
bb00: 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 ce b8  , 0x68 },  /* ..
bb10: 20 74 6f 20 74 68 20 2a 2f 0a 20 20 7b 20 30 78   to th */.  { 0x
bb20: 30 33 42 39 2c 20 20 30 78 36 39 2c 20 30 78 30  03B9,  0x69, 0x0
bb30: 30 20 7d 2c 20 20 2f 2a 20 ce b9 20 74 6f 20 69  0 },  /* .. to i
bb40: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 41 2c 20   */.  { 0x03BA, 
bb50: 20 30 78 36 62 2c 20 30 78 30 30 20 7d 2c 20 20   0x6b, 0x00 },  
bb60: 2f 2a 20 ce ba 20 74 6f 20 6b 20 2a 2f 0a 20 20  /* .. to k */.  
bb70: 7b 20 30 78 30 33 42 42 2c 20 20 30 78 36 63 2c  { 0x03BB,  0x6c,
bb80: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bb 20   0x00 },  /* .. 
bb90: 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to l */.  { 0x03
bba0: 42 43 2c 20 20 30 78 36 64 2c 20 30 78 30 30 20  BC,  0x6d, 0x00 
bbb0: 7d 2c 20 20 2f 2a 20 ce bc 20 74 6f 20 6d 20 2a  },  /* .. to m *
bbc0: 2f 0a 20 20 7b 20 30 78 30 33 42 44 2c 20 20 30  /.  { 0x03BD,  0
bbd0: 78 36 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6e, 0x00 },  /*
bbe0: 20 ce bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20   .. to n */.  { 
bbf0: 30 78 30 33 42 45 2c 20 20 30 78 37 38 2c 20 30  0x03BE,  0x78, 0
bc00: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce be 20 74 6f  x00 },  /* .. to
bc10: 20 78 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 46   x */.  { 0x03BF
bc20: 2c 20 20 30 78 36 66 2c 20 30 78 30 30 20 7d 2c  ,  0x6f, 0x00 },
bc30: 20 20 2f 2a 20 ce bf 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
bc40: 20 20 7b 20 30 78 30 33 43 30 2c 20 20 30 78 37    { 0x03C0,  0x7
bc50: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  0, 0x00 },  /* .
bc60: 80 20 74 6f 20 70 20 2a 2f 0a 20 20 7b 20 30 78  . to p */.  { 0x
bc70: 30 33 43 31 2c 20 20 30 78 37 32 2c 20 30 78 30  03C1,  0x72, 0x0
bc80: 30 20 7d 2c 20 20 2f 2a 20 cf 81 20 74 6f 20 72  0 },  /* .. to r
bc90: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 33 2c 20   */.  { 0x03C3, 
bca0: 20 30 78 37 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x73, 0x00 },  
bcb0: 2f 2a 20 cf 83 20 74 6f 20 73 20 2a 2f 0a 20 20  /* .. to s */.  
bcc0: 7b 20 30 78 30 33 43 34 2c 20 20 30 78 37 34 2c  { 0x03C4,  0x74,
bcd0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 84 20   0x00 },  /* .. 
bce0: 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to t */.  { 0x03
bcf0: 43 35 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20  C5,  0x79, 0x00 
bd00: 7d 2c 20 20 2f 2a 20 cf 85 20 74 6f 20 79 20 2a  },  /* .. to y *
bd10: 2f 0a 20 20 7b 20 30 78 30 33 43 36 2c 20 20 30  /.  { 0x03C6,  0
bd20: 78 36 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x66, 0x00 },  /*
bd30: 20 cf 86 20 74 6f 20 66 20 2a 2f 0a 20 20 7b 20   .. to f */.  { 
bd40: 30 78 30 33 43 37 2c 20 20 30 78 36 33 2c 20 30  0x03C7,  0x63, 0
bd50: 78 36 38 20 7d 2c 20 20 2f 2a 20 cf 87 20 74 6f  x68 },  /* .. to
bd60: 20 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43   ch */.  { 0x03C
bd70: 38 2c 20 20 30 78 37 30 2c 20 30 78 37 33 20 7d  8,  0x70, 0x73 }
bd80: 2c 20 20 2f 2a 20 cf 88 20 74 6f 20 70 73 20 2a  ,  /* .. to ps *
bd90: 2f 0a 20 20 7b 20 30 78 30 33 43 39 2c 20 20 30  /.  { 0x03C9,  0
bda0: 78 36 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6f, 0x00 },  /*
bdb0: 20 cf 89 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
bdc0: 30 78 30 33 43 41 2c 20 20 30 78 36 39 2c 20 30  0x03CA,  0x69, 0
bdd0: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8a 20 74 6f  x00 },  /* .. to
bde0: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 42   i */.  { 0x03CB
bdf0: 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c  ,  0x79, 0x00 },
be00: 20 20 2f 2a 20 cf 8b 20 74 6f 20 79 20 2a 2f 0a    /* .. to y */.
be10: 20 20 7b 20 30 78 30 33 43 43 2c 20 20 30 78 36    { 0x03CC,  0x6
be20: 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  f, 0x00 },  /* .
be30: 8c 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
be40: 30 33 43 44 2c 20 20 30 78 37 39 2c 20 30 78 30  03CD,  0x79, 0x0
be50: 30 20 7d 2c 20 20 2f 2a 20 cf 8d 20 74 6f 20 79  0 },  /* .. to y
be60: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 45 2c 20   */.  { 0x03CE, 
be70: 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x69, 0x00 },  
be80: 2f 2a 20 cf 8e 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
be90: 7b 20 30 78 30 34 30 30 2c 20 20 30 78 34 35 2c  { 0x0400,  0x45,
bea0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 80 20   0x00 },  /* .. 
beb0: 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to E */.  { 0x04
bec0: 30 31 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20  01,  0x45, 0x00 
bed0: 7d 2c 20 20 2f 2a 20 d0 81 20 74 6f 20 45 20 2a  },  /* .. to E *
bee0: 2f 0a 20 20 7b 20 30 78 30 34 30 32 2c 20 20 30  /.  { 0x0402,  0
bef0: 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x44, 0x00 },  /*
bf00: 20 d0 82 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20   .. to D */.  { 
bf10: 30 78 30 34 30 33 2c 20 20 30 78 34 37 2c 20 30  0x0403,  0x47, 0
bf20: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 83 20 74 6f  x00 },  /* .. to
bf30: 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 34   G */.  { 0x0404
bf40: 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c  ,  0x45, 0x00 },
bf50: 20 20 2f 2a 20 d0 84 20 74 6f 20 45 20 2a 2f 0a    /* .. to E */.
bf60: 20 20 7b 20 30 78 30 34 30 35 2c 20 20 30 78 35    { 0x0405,  0x5
bf70: 61 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  a, 0x00 },  /* .
bf80: 85 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78  . to Z */.  { 0x
bf90: 30 34 30 36 2c 20 20 30 78 34 39 2c 20 30 78 30  0406,  0x49, 0x0
bfa0: 30 20 7d 2c 20 20 2f 2a 20 d0 86 20 74 6f 20 49  0 },  /* .. to I
bfb0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 37 2c 20   */.  { 0x0407, 
bfc0: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
bfd0: 2f 2a 20 d0 87 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
bfe0: 7b 20 30 78 30 34 30 38 2c 20 20 30 78 34 61 2c  { 0x0408,  0x4a,
bff0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 88 20   0x00 },  /* .. 
c000: 74 6f 20 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to J */.  { 0x04
c010: 30 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  09,  0x49, 0x00 
c020: 7d 2c 20 20 2f 2a 20 d0 89 20 74 6f 20 49 20 2a  },  /* .. to I *
c030: 2f 0a 20 20 7b 20 30 78 30 34 30 41 2c 20 20 30  /.  { 0x040A,  0
c040: 78 34 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4e, 0x00 },  /*
c050: 20 d0 8a 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20   .. to N */.  { 
c060: 30 78 30 34 30 42 2c 20 20 30 78 34 34 2c 20 30  0x040B,  0x44, 0
c070: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8b 20 74 6f  x00 },  /* .. to
c080: 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 43   D */.  { 0x040C
c090: 2c 20 20 30 78 34 62 2c 20 30 78 30 30 20 7d 2c  ,  0x4b, 0x00 },
c0a0: 20 20 2f 2a 20 d0 8c 20 74 6f 20 4b 20 2a 2f 0a    /* .. to K */.
c0b0: 20 20 7b 20 30 78 30 34 30 44 2c 20 20 30 78 34    { 0x040D,  0x4
c0c0: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  9, 0x00 },  /* .
c0d0: 8d 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
c0e0: 30 34 30 45 2c 20 20 30 78 35 35 2c 20 30 78 30  040E,  0x55, 0x0
c0f0: 30 20 7d 2c 20 20 2f 2a 20 d0 8e 20 74 6f 20 55  0 },  /* .. to U
c100: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 46 2c 20   */.  { 0x040F, 
c110: 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x44, 0x00 },  
c120: 2f 2a 20 d0 8f 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
c130: 7b 20 30 78 30 34 31 30 2c 20 20 30 78 34 31 2c  { 0x0410,  0x41,
c140: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 90 20   0x00 },  /* .. 
c150: 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to A */.  { 0x04
c160: 31 31 2c 20 20 30 78 34 32 2c 20 30 78 30 30 20  11,  0x42, 0x00 
c170: 7d 2c 20 20 2f 2a 20 d0 91 20 74 6f 20 42 20 2a  },  /* .. to B *
c180: 2f 0a 20 20 7b 20 30 78 30 34 31 32 2c 20 20 30  /.  { 0x0412,  0
c190: 78 35 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x56, 0x00 },  /*
c1a0: 20 d0 92 20 74 6f 20 56 20 2a 2f 0a 20 20 7b 20   .. to V */.  { 
c1b0: 30 78 30 34 31 33 2c 20 20 30 78 34 37 2c 20 30  0x0413,  0x47, 0
c1c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 93 20 74 6f  x00 },  /* .. to
c1d0: 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 34   G */.  { 0x0414
c1e0: 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c  ,  0x44, 0x00 },
c1f0: 20 20 2f 2a 20 d0 94 20 74 6f 20 44 20 2a 2f 0a    /* .. to D */.
c200: 20 20 7b 20 30 78 30 34 31 35 2c 20 20 30 78 34    { 0x0415,  0x4
c210: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  5, 0x00 },  /* .
c220: 95 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
c230: 30 34 31 36 2c 20 20 30 78 35 61 2c 20 30 78 36  0416,  0x5a, 0x6
c240: 38 20 7d 2c 20 20 2f 2a 20 d0 96 20 74 6f 20 5a  8 },  /* .. to Z
c250: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 37 2c  h */.  { 0x0417,
c260: 20 20 30 78 35 61 2c 20 30 78 30 30 20 7d 2c 20    0x5a, 0x00 }, 
c270: 20 2f 2a 20 d0 97 20 74 6f 20 5a 20 2a 2f 0a 20   /* .. to Z */. 
c280: 20 7b 20 30 78 30 34 31 38 2c 20 20 30 78 34 39   { 0x0418,  0x49
c290: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 98  , 0x00 },  /* ..
c2a0: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
c2b0: 34 31 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30  419,  0x49, 0x00
c2c0: 20 7d 2c 20 20 2f 2a 20 d0 99 20 74 6f 20 49 20   },  /* .. to I 
c2d0: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 41 2c 20 20  */.  { 0x041A,  
c2e0: 30 78 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4b, 0x00 },  /
c2f0: 2a 20 d0 9a 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b  * .. to K */.  {
c300: 20 30 78 30 34 31 42 2c 20 20 30 78 34 63 2c 20   0x041B,  0x4c, 
c310: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9b 20 74  0x00 },  /* .. t
c320: 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o L */.  { 0x041
c330: 43 2c 20 20 30 78 34 64 2c 20 30 78 30 30 20 7d  C,  0x4d, 0x00 }
c340: 2c 20 20 2f 2a 20 d0 9c 20 74 6f 20 4d 20 2a 2f  ,  /* .. to M */
c350: 0a 20 20 7b 20 30 78 30 34 31 44 2c 20 20 30 78  .  { 0x041D,  0x
c360: 34 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4e, 0x00 },  /* 
c370: d0 9d 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30  .. to N */.  { 0
c380: 78 30 34 31 45 2c 20 20 30 78 34 66 2c 20 30 78  x041E,  0x4f, 0x
c390: 30 30 20 7d 2c 20 20 2f 2a 20 d0 9e 20 74 6f 20  00 },  /* .. to 
c3a0: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 46 2c  O */.  { 0x041F,
c3b0: 20 20 30 78 35 30 2c 20 30 78 30 30 20 7d 2c 20    0x50, 0x00 }, 
c3c0: 20 2f 2a 20 d0 9f 20 74 6f 20 50 20 2a 2f 0a 20   /* .. to P */. 
c3d0: 20 7b 20 30 78 30 34 32 30 2c 20 20 30 78 35 32   { 0x0420,  0x52
c3e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a0  , 0x00 },  /* ..
c3f0: 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30   to R */.  { 0x0
c400: 34 32 31 2c 20 20 30 78 35 33 2c 20 30 78 30 30  421,  0x53, 0x00
c410: 20 7d 2c 20 20 2f 2a 20 d0 a1 20 74 6f 20 53 20   },  /* .. to S 
c420: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 32 2c 20 20  */.  { 0x0422,  
c430: 30 78 35 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x54, 0x00 },  /
c440: 2a 20 d0 a2 20 74 6f 20 54 20 2a 2f 0a 20 20 7b  * .. to T */.  {
c450: 20 30 78 30 34 32 33 2c 20 20 30 78 35 35 2c 20   0x0423,  0x55, 
c460: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a3 20 74  0x00 },  /* .. t
c470: 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32  o U */.  { 0x042
c480: 34 2c 20 20 30 78 34 36 2c 20 30 78 30 30 20 7d  4,  0x46, 0x00 }
c490: 2c 20 20 2f 2a 20 d0 a4 20 74 6f 20 46 20 2a 2f  ,  /* .. to F */
c4a0: 0a 20 20 7b 20 30 78 30 34 32 35 2c 20 20 30 78  .  { 0x0425,  0x
c4b0: 34 62 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  4b, 0x68 },  /* 
c4c0: d0 a5 20 74 6f 20 4b 68 20 2a 2f 0a 20 20 7b 20  .. to Kh */.  { 
c4d0: 30 78 30 34 32 36 2c 20 20 30 78 35 34 2c 20 30  0x0426,  0x54, 0
c4e0: 78 36 33 20 7d 2c 20 20 2f 2a 20 d0 a6 20 74 6f  x63 },  /* .. to
c4f0: 20 54 63 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32   Tc */.  { 0x042
c500: 37 2c 20 20 30 78 34 33 2c 20 30 78 36 38 20 7d  7,  0x43, 0x68 }
c510: 2c 20 20 2f 2a 20 d0 a7 20 74 6f 20 43 68 20 2a  ,  /* .. to Ch *
c520: 2f 0a 20 20 7b 20 30 78 30 34 32 38 2c 20 20 30  /.  { 0x0428,  0
c530: 78 35 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a  x53, 0x68 },  /*
c540: 20 d0 a8 20 74 6f 20 53 68 20 2a 2f 0a 20 20 7b   .. to Sh */.  {
c550: 20 30 78 30 34 32 39 2c 20 20 30 78 35 33 2c 20   0x0429,  0x53, 
c560: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a9 20 74  0x68 },  /* .. t
c570: 6f 20 53 68 63 68 20 2a 2f 0a 20 20 7b 20 30 78  o Shch */.  { 0x
c580: 30 34 32 41 2c 20 20 30 78 36 31 2c 20 30 78 30  042A,  0x61, 0x0
c590: 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 41 20 2a  0 },  /*  to A *
c5a0: 2f 0a 20 20 7b 20 30 78 30 34 32 42 2c 20 20 30  /.  { 0x042B,  0
c5b0: 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x59, 0x00 },  /*
c5c0: 20 d0 ab 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20   .. to Y */.  { 
c5d0: 30 78 30 34 32 43 2c 20 20 30 78 35 39 2c 20 30  0x042C,  0x59, 0
c5e0: 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 59  x00 },  /*  to Y
c5f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 44 2c 20   */.  { 0x042D, 
c600: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
c610: 2f 2a 20 d0 ad 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
c620: 7b 20 30 78 30 34 32 45 2c 20 20 30 78 34 39 2c  { 0x042E,  0x49,
c630: 20 30 78 37 35 20 7d 2c 20 20 2f 2a 20 d0 ae 20   0x75 },  /* .. 
c640: 74 6f 20 49 75 20 2a 2f 0a 20 20 7b 20 30 78 30  to Iu */.  { 0x0
c650: 34 32 46 2c 20 20 30 78 34 39 2c 20 30 78 36 31  42F,  0x49, 0x61
c660: 20 7d 2c 20 20 2f 2a 20 d0 af 20 74 6f 20 49 61   },  /* .. to Ia
c670: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 30 2c 20   */.  { 0x0430, 
c680: 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20   0x61, 0x00 },  
c690: 2f 2a 20 d0 b0 20 74 6f 20 61 20 2a 2f 0a 20 20  /* .. to a */.  
c6a0: 7b 20 30 78 30 34 33 31 2c 20 20 30 78 36 32 2c  { 0x0431,  0x62,
c6b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b1 20   0x00 },  /* .. 
c6c0: 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to b */.  { 0x04
c6d0: 33 32 2c 20 20 30 78 37 36 2c 20 30 78 30 30 20  32,  0x76, 0x00 
c6e0: 7d 2c 20 20 2f 2a 20 d0 b2 20 74 6f 20 76 20 2a  },  /* .. to v *
c6f0: 2f 0a 20 20 7b 20 30 78 30 34 33 33 2c 20 20 30  /.  { 0x0433,  0
c700: 78 36 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x67, 0x00 },  /*
c710: 20 d0 b3 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20   .. to g */.  { 
c720: 30 78 30 34 33 34 2c 20 20 30 78 36 34 2c 20 30  0x0434,  0x64, 0
c730: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b4 20 74 6f  x00 },  /* .. to
c740: 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 35   d */.  { 0x0435
c750: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
c760: 20 20 2f 2a 20 d0 b5 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
c770: 20 20 7b 20 30 78 30 34 33 36 2c 20 20 30 78 37    { 0x0436,  0x7
c780: 61 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0  a, 0x68 },  /* .
c790: b6 20 74 6f 20 7a 68 20 2a 2f 0a 20 20 7b 20 30  . to zh */.  { 0
c7a0: 78 30 34 33 37 2c 20 20 30 78 37 61 2c 20 30 78  x0437,  0x7a, 0x
c7b0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 b7 20 74 6f 20  00 },  /* .. to 
c7c0: 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 38 2c  z */.  { 0x0438,
c7d0: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
c7e0: 20 2f 2a 20 d0 b8 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
c7f0: 20 7b 20 30 78 30 34 33 39 2c 20 20 30 78 36 39   { 0x0439,  0x69
c800: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b9  , 0x00 },  /* ..
c810: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
c820: 34 33 41 2c 20 20 30 78 36 62 2c 20 30 78 30 30  43A,  0x6b, 0x00
c830: 20 7d 2c 20 20 2f 2a 20 d0 ba 20 74 6f 20 6b 20   },  /* .. to k 
c840: 2a 2f 0a 20 20 7b 20 30 78 30 34 33 42 2c 20 20  */.  { 0x043B,  
c850: 30 78 36 63 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6c, 0x00 },  /
c860: 2a 20 d0 bb 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b  * .. to l */.  {
c870: 20 30 78 30 34 33 43 2c 20 20 30 78 36 64 2c 20   0x043C,  0x6d, 
c880: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bc 20 74  0x00 },  /* .. t
c890: 6f 20 6d 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33  o m */.  { 0x043
c8a0: 44 2c 20 20 30 78 36 65 2c 20 30 78 30 30 20 7d  D,  0x6e, 0x00 }
c8b0: 2c 20 20 2f 2a 20 d0 bd 20 74 6f 20 6e 20 2a 2f  ,  /* .. to n */
c8c0: 0a 20 20 7b 20 30 78 30 34 33 45 2c 20 20 30 78  .  { 0x043E,  0x
c8d0: 36 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6f, 0x00 },  /* 
c8e0: d0 be 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30  .. to o */.  { 0
c8f0: 78 30 34 33 46 2c 20 20 30 78 37 30 2c 20 30 78  x043F,  0x70, 0x
c900: 30 30 20 7d 2c 20 20 2f 2a 20 d0 bf 20 74 6f 20  00 },  /* .. to 
c910: 70 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 30 2c  p */.  { 0x0440,
c920: 20 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20    0x72, 0x00 }, 
c930: 20 2f 2a 20 d1 80 20 74 6f 20 72 20 2a 2f 0a 20   /* .. to r */. 
c940: 20 7b 20 30 78 30 34 34 31 2c 20 20 30 78 37 33   { 0x0441,  0x73
c950: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 81  , 0x00 },  /* ..
c960: 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30   to s */.  { 0x0
c970: 34 34 32 2c 20 20 30 78 37 34 2c 20 30 78 30 30  442,  0x74, 0x00
c980: 20 7d 2c 20 20 2f 2a 20 d1 82 20 74 6f 20 74 20   },  /* .. to t 
c990: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 33 2c 20 20  */.  { 0x0443,  
c9a0: 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x75, 0x00 },  /
c9b0: 2a 20 d1 83 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
c9c0: 20 30 78 30 34 34 34 2c 20 20 30 78 36 36 2c 20   0x0444,  0x66, 
c9d0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 84 20 74  0x00 },  /* .. t
c9e0: 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34  o f */.  { 0x044
c9f0: 35 2c 20 20 30 78 36 62 2c 20 30 78 36 38 20 7d  5,  0x6b, 0x68 }
ca00: 2c 20 20 2f 2a 20 d1 85 20 74 6f 20 6b 68 20 2a  ,  /* .. to kh *
ca10: 2f 0a 20 20 7b 20 30 78 30 34 34 36 2c 20 20 30  /.  { 0x0446,  0
ca20: 78 37 34 2c 20 30 78 36 33 20 7d 2c 20 20 2f 2a  x74, 0x63 },  /*
ca30: 20 d1 86 20 74 6f 20 74 63 20 2a 2f 0a 20 20 7b   .. to tc */.  {
ca40: 20 30 78 30 34 34 37 2c 20 20 30 78 36 33 2c 20   0x0447,  0x63, 
ca50: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d1 87 20 74  0x68 },  /* .. t
ca60: 6f 20 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34  o ch */.  { 0x04
ca70: 34 38 2c 20 20 30 78 37 33 2c 20 30 78 36 38 20  48,  0x73, 0x68 
ca80: 7d 2c 20 20 2f 2a 20 d1 88 20 74 6f 20 73 68 20  },  /* .. to sh 
ca90: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 39 2c 20 20  */.  { 0x0449,  
caa0: 30 78 37 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x73, 0x68 },  /
cab0: 2a 20 d1 89 20 74 6f 20 73 68 63 68 20 2a 2f 0a  * .. to shch */.
cac0: 20 20 7b 20 30 78 30 34 34 41 2c 20 20 30 78 36    { 0x044A,  0x6
cad0: 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20  1, 0x00 },  /*  
cae0: 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to a */.  { 0x04
caf0: 34 42 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20  4B,  0x79, 0x00 
cb00: 7d 2c 20 20 2f 2a 20 d1 8b 20 74 6f 20 79 20 2a  },  /* .. to y *
cb10: 2f 0a 20 20 7b 20 30 78 30 34 34 43 2c 20 20 30  /.  { 0x044C,  0
cb20: 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x79, 0x00 },  /*
cb30: 20 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78    to y */.  { 0x
cb40: 30 34 34 44 2c 20 20 30 78 36 35 2c 20 30 78 30  044D,  0x65, 0x0
cb50: 30 20 7d 2c 20 20 2f 2a 20 d1 8d 20 74 6f 20 65  0 },  /* .. to e
cb60: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 45 2c 20   */.  { 0x044E, 
cb70: 20 30 78 36 39 2c 20 30 78 37 35 20 7d 2c 20 20   0x69, 0x75 },  
cb80: 2f 2a 20 d1 8e 20 74 6f 20 69 75 20 2a 2f 0a 20  /* .. to iu */. 
cb90: 20 7b 20 30 78 30 34 34 46 2c 20 20 30 78 36 39   { 0x044F,  0x69
cba0: 2c 20 30 78 36 31 20 7d 2c 20 20 2f 2a 20 d1 8f  , 0x61 },  /* ..
cbb0: 20 74 6f 20 69 61 20 2a 2f 0a 20 20 7b 20 30 78   to ia */.  { 0x
cbc0: 30 34 35 30 2c 20 20 30 78 36 35 2c 20 30 78 30  0450,  0x65, 0x0
cbd0: 30 20 7d 2c 20 20 2f 2a 20 d1 90 20 74 6f 20 65  0 },  /* .. to e
cbe0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 31 2c 20   */.  { 0x0451, 
cbf0: 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x65, 0x00 },  
cc00: 2f 2a 20 d1 91 20 74 6f 20 65 20 2a 2f 0a 20 20  /* .. to e */.  
cc10: 7b 20 30 78 30 34 35 32 2c 20 20 30 78 36 34 2c  { 0x0452,  0x64,
cc20: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 92 20   0x00 },  /* .. 
cc30: 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to d */.  { 0x04
cc40: 35 33 2c 20 20 30 78 36 37 2c 20 30 78 30 30 20  53,  0x67, 0x00 
cc50: 7d 2c 20 20 2f 2a 20 d1 93 20 74 6f 20 67 20 2a  },  /* .. to g *
cc60: 2f 0a 20 20 7b 20 30 78 30 34 35 34 2c 20 20 30  /.  { 0x0454,  0
cc70: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
cc80: 20 d1 94 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
cc90: 30 78 30 34 35 35 2c 20 20 30 78 37 61 2c 20 30  0x0455,  0x7a, 0
cca0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 95 20 74 6f  x00 },  /* .. to
ccb0: 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 36   z */.  { 0x0456
ccc0: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
ccd0: 20 20 2f 2a 20 d1 96 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
cce0: 20 20 7b 20 30 78 30 34 35 37 2c 20 20 30 78 36    { 0x0457,  0x6
ccf0: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  9, 0x00 },  /* .
cd00: 97 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
cd10: 30 34 35 38 2c 20 20 30 78 36 61 2c 20 30 78 30  0458,  0x6a, 0x0
cd20: 30 20 7d 2c 20 20 2f 2a 20 d1 98 20 74 6f 20 6a  0 },  /* .. to j
cd30: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 39 2c 20   */.  { 0x0459, 
cd40: 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x69, 0x00 },  
cd50: 2f 2a 20 d1 99 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
cd60: 7b 20 30 78 30 34 35 41 2c 20 20 30 78 36 65 2c  { 0x045A,  0x6e,
cd70: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9a 20   0x00 },  /* .. 
cd80: 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to n */.  { 0x04
cd90: 35 42 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20  5B,  0x64, 0x00 
cda0: 7d 2c 20 20 2f 2a 20 d1 9b 20 74 6f 20 64 20 2a  },  /* .. to d *
cdb0: 2f 0a 20 20 7b 20 30 78 30 34 35 43 2c 20 20 30  /.  { 0x045C,  0
cdc0: 78 36 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6b, 0x00 },  /*
cdd0: 20 d1 9c 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20   .. to k */.  { 
cde0: 30 78 30 34 35 44 2c 20 20 30 78 36 39 2c 20 30  0x045D,  0x69, 0
cdf0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9d 20 74 6f  x00 },  /* .. to
ce00: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 45   i */.  { 0x045E
ce10: 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c  ,  0x75, 0x00 },
ce20: 20 20 2f 2a 20 d1 9e 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
ce30: 20 20 7b 20 30 78 30 34 35 46 2c 20 20 30 78 36    { 0x045F,  0x6
ce40: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  4, 0x00 },  /* .
ce50: 9f 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78  . to d */.  { 0x
ce60: 31 45 30 32 2c 20 20 30 78 34 32 2c 20 30 78 30  1E02,  0x42, 0x0
ce70: 30 20 7d 2c 20 20 2f 2a 20 e1 b8 82 20 74 6f 20  0 },  /* ... to 
ce80: 42 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30 33 2c  B */.  { 0x1E03,
ce90: 20 20 30 78 36 32 2c 20 30 78 30 30 20 7d 2c 20    0x62, 0x00 }, 
cea0: 20 2f 2a 20 e1 b8 83 20 74 6f 20 62 20 2a 2f 0a   /* ... to b */.
ceb0: 20 20 7b 20 30 78 31 45 30 41 2c 20 20 30 78 34    { 0x1E0A,  0x4
cec0: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  4, 0x00 },  /* .
ced0: b8 8a 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30  .. to D */.  { 0
cee0: 78 31 45 30 42 2c 20 20 30 78 36 34 2c 20 30 78  x1E0B,  0x64, 0x
cef0: 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 8b 20 74 6f  00 },  /* ... to
cf00: 20 64 20 2a 2f 0a 20 20 7b 20 30 78 31 45 31 45   d */.  { 0x1E1E
cf10: 2c 20 20 30 78 34 36 2c 20 30 78 30 30 20 7d 2c  ,  0x46, 0x00 },
cf20: 20 20 2f 2a 20 e1 b8 9e 20 74 6f 20 46 20 2a 2f    /* ... to F */
cf30: 0a 20 20 7b 20 30 78 31 45 31 46 2c 20 20 30 78  .  { 0x1E1F,  0x
cf40: 36 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  66, 0x00 },  /* 
cf50: e1 b8 9f 20 74 6f 20 66 20 2a 2f 0a 20 20 7b 20  ... to f */.  { 
cf60: 30 78 31 45 34 30 2c 20 20 30 78 34 44 2c 20 30  0x1E40,  0x4D, 0
cf70: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 80 20 74  x00 },  /* ... t
cf80: 6f 20 4d 20 2a 2f 0a 20 20 7b 20 30 78 31 45 34  o M */.  { 0x1E4
cf90: 31 2c 20 20 30 78 36 44 2c 20 30 78 30 30 20 7d  1,  0x6D, 0x00 }
cfa0: 2c 20 20 2f 2a 20 e1 b9 81 20 74 6f 20 6d 20 2a  ,  /* ... to m *
cfb0: 2f 0a 20 20 7b 20 30 78 31 45 35 36 2c 20 20 30  /.  { 0x1E56,  0
cfc0: 78 35 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x50, 0x00 },  /*
cfd0: 20 e1 b9 96 20 74 6f 20 50 20 2a 2f 0a 20 20 7b   ... to P */.  {
cfe0: 20 30 78 31 45 35 37 2c 20 20 30 78 37 30 2c 20   0x1E57,  0x70, 
cff0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 97 20  0x00 },  /* ... 
d000: 74 6f 20 70 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to p */.  { 0x1E
d010: 36 30 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20  60,  0x53, 0x00 
d020: 7d 2c 20 20 2f 2a 20 e1 b9 a0 20 74 6f 20 53 20  },  /* ... to S 
d030: 2a 2f 0a 20 20 7b 20 30 78 31 45 36 31 2c 20 20  */.  { 0x1E61,  
d040: 30 78 37 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x73, 0x00 },  /
d050: 2a 20 e1 b9 a1 20 74 6f 20 73 20 2a 2f 0a 20 20  * ... to s */.  
d060: 7b 20 30 78 31 45 36 41 2c 20 20 30 78 35 34 2c  { 0x1E6A,  0x54,
d070: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 aa   0x00 },  /* ...
d080: 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 31   to T */.  { 0x1
d090: 45 36 42 2c 20 20 30 78 37 34 2c 20 30 78 30 30  E6B,  0x74, 0x00
d0a0: 20 7d 2c 20 20 2f 2a 20 e1 b9 ab 20 74 6f 20 74   },  /* ... to t
d0b0: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 30 2c 20   */.  { 0x1E80, 
d0c0: 20 30 78 35 37 2c 20 30 78 30 30 20 7d 2c 20 20   0x57, 0x00 },  
d0d0: 2f 2a 20 e1 ba 80 20 74 6f 20 57 20 2a 2f 0a 20  /* ... to W */. 
d0e0: 20 7b 20 30 78 31 45 38 31 2c 20 20 30 78 37 37   { 0x1E81,  0x77
d0f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba  , 0x00 },  /* ..
d100: 81 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78  . to w */.  { 0x
d110: 31 45 38 32 2c 20 20 30 78 35 37 2c 20 30 78 30  1E82,  0x57, 0x0
d120: 30 20 7d 2c 20 20 2f 2a 20 e1 ba 82 20 74 6f 20  0 },  /* ... to 
d130: 57 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 33 2c  W */.  { 0x1E83,
d140: 20 20 30 78 37 37 2c 20 30 78 30 30 20 7d 2c 20    0x77, 0x00 }, 
d150: 20 2f 2a 20 e1 ba 83 20 74 6f 20 77 20 2a 2f 0a   /* ... to w */.
d160: 20 20 7b 20 30 78 31 45 38 34 2c 20 20 30 78 35    { 0x1E84,  0x5
d170: 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  7, 0x00 },  /* .
d180: ba 84 20 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30  .. to W */.  { 0
d190: 78 31 45 38 35 2c 20 20 30 78 37 37 2c 20 30 78  x1E85,  0x77, 0x
d1a0: 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 85 20 74 6f  00 },  /* ... to
d1b0: 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31 45 46 32   w */.  { 0x1EF2
d1c0: 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c  ,  0x59, 0x00 },
d1d0: 20 20 2f 2a 20 e1 bb b2 20 74 6f 20 59 20 2a 2f    /* ... to Y */
d1e0: 0a 20 20 7b 20 30 78 31 45 46 33 2c 20 20 30 78  .  { 0x1EF3,  0x
d1f0: 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  79, 0x00 },  /* 
d200: e1 bb b3 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20  ... to y */.  { 
d210: 30 78 46 42 30 30 2c 20 20 30 78 36 36 2c 20 30  0xFB00,  0x66, 0
d220: 78 36 36 20 7d 2c 20 20 2f 2a 20 ef ac 80 20 74  x66 },  /* ... t
d230: 6f 20 66 66 20 2a 2f 0a 20 20 7b 20 30 78 46 42  o ff */.  { 0xFB
d240: 30 31 2c 20 20 30 78 36 36 2c 20 30 78 36 39 20  01,  0x66, 0x69 
d250: 7d 2c 20 20 2f 2a 20 ef ac 81 20 74 6f 20 66 69  },  /* ... to fi
d260: 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 32 2c 20   */.  { 0xFB02, 
d270: 20 30 78 36 36 2c 20 30 78 36 43 20 7d 2c 20 20   0x66, 0x6C },  
d280: 2f 2a 20 ef ac 82 20 74 6f 20 66 6c 20 2a 2f 0a  /* ... to fl */.
d290: 20 20 7b 20 30 78 46 42 30 35 2c 20 20 30 78 37    { 0xFB05,  0x7
d2a0: 33 2c 20 30 78 37 34 20 7d 2c 20 20 2f 2a 20 ef  3, 0x74 },  /* .
d2b0: ac 85 20 74 6f 20 73 74 20 2a 2f 0a 20 20 7b 20  .. to st */.  { 
d2c0: 30 78 46 42 30 36 2c 20 20 30 78 37 33 2c 20 30  0xFB06,  0x73, 0
d2d0: 78 37 34 20 7d 2c 20 20 2f 2a 20 ef ac 86 20 74  x74 },  /* ... t
d2e0: 6f 20 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  o st */.};../*.*
d2f0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 69 6e  * Convert the in
d300: 70 75 74 20 73 74 72 69 6e 67 20 66 72 6f 6d 20  put string from 
d310: 55 54 46 2d 38 20 69 6e 74 6f 20 70 75 72 65 20  UTF-8 into pure 
d320: 41 53 43 49 49 20 62 79 20 63 6f 6e 76 65 72 74  ASCII by convert
d330: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 6e 6f 6e 2d 41  ing.** all non-A
d340: 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20  SCII characters 
d350: 74 6f 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 61 74  to some combinat
d360: 69 6f 6e 20 6f 66 20 63 68 61 72 61 63 74 65 72  ion of character
d370: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 41 53 43 49  s in the.** ASCI
d380: 49 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  I subset..**.** 
d390: 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
d3a0: 69 6e 67 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  ing might contai
d3b0: 6e 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72  n more character
d3c0: 73 20 74 68 61 6e 20 74 68 65 20 69 6e 70 75 74  s than the input
d3d0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
d3e0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
d3f0: 65 64 20 73 74 72 69 6e 67 20 63 6f 6d 65 73 20  ed string comes 
d400: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d410: 6c 6f 63 28 29 20 61 6e 64 0a 2a 2a 20 73 68 6f  loc() and.** sho
d420: 75 6c 64 20 62 65 20 66 72 65 65 64 20 62 79 20  uld be freed by 
d430: 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
d440: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63  tatic unsigned c
d450: 68 61 72 20 2a 74 72 61 6e 73 6c 69 74 65 72 61  har *translitera
d460: 74 65 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  te(const unsigne
d470: 64 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74  d char *zIn, int
d480: 20 6e 49 6e 29 7b 0a 20 20 75 6e 73 69 67 6e 65   nIn){.  unsigne
d490: 64 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73  d char *zOut = s
d4a0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e  qlite3_malloc( n
d4b0: 49 6e 2a 34 20 2b 20 31 20 29 3b 0a 20 20 69 6e  In*4 + 1 );.  in
d4c0: 74 20 63 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20  t c, sz, nOut;. 
d4d0: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72   if( zOut==0 ) r
d4e0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 4f 75 74 20  eturn 0;.  nOut 
d4f0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6e 49  = 0;.  while( nI
d500: 6e 3e 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 75  n>0 ){.    c = u
d510: 74 66 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e  tf8Read(zIn, nIn
d520: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20  , &sz);.    zIn 
d530: 2b 3d 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d  += sz;.    nIn -
d540: 3d 20 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c  = sz;.    if( c<
d550: 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 7a 4f  =127 ){.      zO
d560: 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a  ut[nOut++] = c;.
d570: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d580: 20 69 6e 74 20 78 54 6f 70 2c 20 78 42 74 6d 2c   int xTop, xBtm,
d590: 20 78 3b 0a 20 20 20 20 20 20 78 54 6f 70 20 3d   x;.      xTop =
d5a0: 20 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74   sizeof(translit
d5b0: 29 2f 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69  )/sizeof(transli
d5c0: 74 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20  t[0]) - 1;.     
d5d0: 20 78 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 20   xBtm = 0;.     
d5e0: 20 77 68 69 6c 65 28 20 78 54 6f 70 3e 3d 78 42   while( xTop>=xB
d5f0: 74 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20  tm ){.        x 
d600: 3d 20 28 78 54 6f 70 20 2b 20 78 42 74 6d 29 2f  = (xTop + xBtm)/
d610: 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  2;.        if( t
d620: 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d  ranslit[x].cFrom
d630: 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==c ){.         
d640: 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20   zOut[nOut++] = 
d650: 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 30  translit[x].cTo0
d660: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d670: 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31  translit[x].cTo1
d680: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d690: 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74  zOut[nOut++] = t
d6a0: 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 3b  ranslit[x].cTo1;
d6b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
d6c0: 41 64 64 20 61 6e 20 65 78 74 72 61 20 22 63 68  Add an extra "ch
d6d0: 22 20 61 66 74 65 72 20 74 68 65 20 22 73 68 22  " after the "sh"
d6e0: 20 66 6f 72 20 d0 a9 20 61 6e 64 20 d1 89 20 2a   for .. and .. *
d6f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
d700: 28 20 63 3d 3d 30 78 30 34 32 39 20 7c 7c 20 63  ( c==0x0429 || c
d710: 3d 3d 20 30 78 30 34 34 39 20 29 7b 0a 20 20 20  == 0x0449 ){.   
d720: 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b             zOut[
d730: 6e 4f 75 74 2b 2b 5d 20 3d 20 27 63 27 3b 0a 20  nOut++] = 'c';. 
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75               zOu
d750: 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 27 68 27 3b  t[nOut++] = 'h';
d760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
d770: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d780: 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
d790: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d7a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74       }else if( t
d7b0: 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d  ranslit[x].cFrom
d7c0: 3e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >c ){.          
d7d0: 78 54 6f 70 20 3d 20 78 2d 31 3b 0a 20 20 20 20  xTop = x-1;.    
d7e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d7f0: 20 20 20 20 20 78 42 74 6d 20 3d 20 78 2b 31 3b       xBtm = x+1;
d800: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d810: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29   }.      if( c )
d820: 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20   zOut[nOut++] = 
d830: 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  '?';.    }.  }. 
d840: 20 7a 4f 75 74 5b 6e 4f 75 74 5d 20 3d 20 30 3b   zOut[nOut] = 0;
d850: 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a  .  return zOut;.
d860: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d870: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
d880: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
d890: 73 68 6f 72 74 65 73 74 20 70 72 65 66 69 78 20  shortest prefix 
d8a0: 6f 66 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20  of the input.** 
d8b0: 73 74 72 69 6e 67 20 74 68 61 74 20 74 72 61 6e  string that tran
d8c0: 73 6c 69 74 65 72 61 74 65 73 20 74 6f 20 61 6e  sliterates to an
d8d0: 20 41 53 43 49 49 20 73 74 72 69 6e 67 20 6e 54   ASCII string nT
d8e0: 72 61 6e 73 20 62 79 74 65 73 20 6f 72 20 6c 6f  rans bytes or lo
d8f0: 6e 67 65 72 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  nger..** Or, if 
d900: 74 68 65 20 74 72 61 6e 73 6c 69 74 65 72 61 74  the transliterat
d910: 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ion of the input
d920: 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 20   string is less 
d930: 74 68 61 6e 20 6e 54 72 61 6e 73 0a 2a 2a 20 62  than nTrans.** b
d940: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 72 65  ytes in size, re
d950: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
d960: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
d970: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
d980: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
d990: 20 74 72 61 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61   translen_to_cha
d9a0: 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  rlen(const char 
d9b0: 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 2c 20 69  *zIn, int nIn, i
d9c0: 6e 74 20 6e 54 72 61 6e 73 29 7b 0a 20 20 69 6e  nt nTrans){.  in
d9d0: 74 20 69 2c 20 63 2c 20 73 7a 2c 20 6e 4f 75 74  t i, c, sz, nOut
d9e0: 3b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 0a  ;.  int nChar;..
d9f0: 20 20 69 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a    i = nOut = 0;.
da00: 20 20 66 6f 72 28 6e 43 68 61 72 3d 30 3b 20 69    for(nChar=0; i
da10: 3c 6e 49 6e 20 26 26 20 6e 4f 75 74 3c 6e 54 72  <nIn && nOut<nTr
da20: 61 6e 73 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20  ans; nChar++){. 
da30: 20 20 20 63 20 3d 20 75 74 66 38 52 65 61 64 28     c = utf8Read(
da40: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
da50: 63 68 61 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20  char *)&zIn[i], 
da60: 6e 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20  nIn-i, &sz);.   
da70: 20 69 20 2b 3d 20 73 7a 3b 0a 0a 20 20 20 20 6e   i += sz;..    n
da80: 4f 75 74 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63  Out++;.    if( c
da90: 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 20 20 69  >=128 ){.      i
daa0: 6e 74 20 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78  nt xTop, xBtm, x
dab0: 3b 0a 20 20 20 20 20 20 78 54 6f 70 20 3d 20 73  ;.      xTop = s
dac0: 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f  izeof(translit)/
dad0: 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b  sizeof(translit[
dae0: 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 78  0]) - 1;.      x
daf0: 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  Btm = 0;.      w
db00: 68 69 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d  hile( xTop>=xBtm
db10: 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20   ){.        x = 
db20: 28 78 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b  (xTop + xBtm)/2;
db30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61  .        if( tra
db40: 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d  nslit[x].cFrom==
db50: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  c ){.          i
db60: 66 28 20 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63  f( translit[x].c
db70: 54 6f 31 20 29 20 6e 4f 75 74 2b 2b 3b 0a 20 20  To1 ) nOut++;.  
db80: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
db90: 78 30 34 32 39 20 7c 7c 20 63 3d 3d 20 30 78 30  x0429 || c== 0x0
dba0: 34 34 39 20 29 20 6e 4f 75 74 20 2b 3d 20 32 3b  449 ) nOut += 2;
dbb0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
dbc0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
dbd0: 69 66 28 20 74 72 61 6e 73 6c 69 74 5b 78 5d 2e  if( translit[x].
dbe0: 63 46 72 6f 6d 3e 63 20 29 7b 0a 20 20 20 20 20  cFrom>c ){.     
dbf0: 20 20 20 20 20 78 54 6f 70 20 3d 20 78 2d 31 3b       xTop = x-1;
dc00: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dc10: 20 20 20 20 20 20 20 20 20 20 78 42 74 6d 20 3d            xBtm =
dc20: 20 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   x+1;.        }.
dc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dc40: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61  }..  return nCha
dc50: 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  r;.}.../*.**    
dc60: 73 70 65 6c 6c 66 69 78 31 5f 74 72 61 6e 73 6c  spellfix1_transl
dc70: 69 74 28 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76  it(X).**.** Conv
dc80: 65 72 74 20 61 20 73 74 72 69 6e 67 20 74 68 61  ert a string tha
dc90: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 41  t contains non-A
dca0: 53 43 49 49 20 52 6f 6d 61 6e 20 63 68 61 72 61  SCII Roman chara
dcb0: 63 74 65 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 70  cters into .** p
dcc0: 75 72 65 20 41 53 43 49 49 2e 0a 2a 2f 0a 73 74  ure ASCII..*/.st
dcd0: 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73 6c  atic void transl
dce0: 69 74 65 72 61 74 65 53 71 6c 46 75 6e 63 28 0a  iterateSqlFunc(.
dcf0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
dd00: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
dd10: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
dd20: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
dd30: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
dd40: 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 73  ed char *zIn = s
dd50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
dd60: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  t(argv[0]);.  in
dd70: 74 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f  t nIn = sqlite3_
dd80: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
dd90: 5b 30 5d 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64  [0]);.  unsigned
dda0: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 74 72   char *zOut = tr
ddb0: 61 6e 73 6c 69 74 65 72 61 74 65 28 7a 49 6e 2c  ansliterate(zIn,
ddc0: 20 6e 49 6e 29 3b 0a 20 20 69 66 28 20 7a 4f 75   nIn);.  if( zOu
ddd0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
dde0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
ddf0: 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b  _nomem(context);
de00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
de10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
de20: 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72  t(context, (char
de30: 2a 29 7a 4f 75 74 2c 20 2d 31 2c 20 73 71 6c 69  *)zOut, -1, sqli
de40: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d  te3_free);.  }.}
de50: 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70 65 6c 6c  ../*.**    spell
de60: 66 69 78 31 5f 73 63 72 69 70 74 63 6f 64 65 28  fix1_scriptcode(
de70: 58 29 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  X).**.** Try to 
de80: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 6f  determine the do
de90: 6d 69 6e 61 6e 74 20 73 63 72 69 70 74 20 75 73  minant script us
dea0: 65 64 20 62 79 20 74 68 65 20 77 6f 72 64 20 58  ed by the word X
deb0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 69   and return.** i
dec0: 74 73 20 49 53 4f 20 31 35 39 32 34 20 6e 75 6d  ts ISO 15924 num
ded0: 65 72 69 63 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  eric code..**.**
dee0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
def0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 6c 79  lementation only
df00: 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68 65   understands the
df10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 72 69 70   following scrip
df20: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 32 31 35  ts:.**.**    215
df30: 20 20 28 4c 61 74 69 6e 29 0a 2a 2a 20 20 20 20    (Latin).**    
df40: 32 32 30 20 20 28 43 79 72 69 6c 6c 69 63 29 0a  220  (Cyrillic).
df50: 2a 2a 20 20 20 20 32 30 30 20 20 28 47 72 65 65  **    200  (Gree
df60: 6b 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k).**.** This ro
df70: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
df80: 6e 20 39 39 38 20 69 66 20 74 68 65 20 69 6e 70  n 998 if the inp
df90: 75 74 20 58 20 63 6f 6e 74 61 69 6e 73 20 63 68  ut X contains ch
dfa0: 61 72 61 63 74 65 72 73 20 66 72 6f 6d 0a 2a 2a  aracters from.**
dfb0: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20   two or more of 
dfc0: 74 68 65 20 61 62 6f 76 65 20 73 63 72 69 70 74  the above script
dfd0: 73 20 6f 72 20 39 39 39 20 69 66 20 58 20 63 6f  s or 999 if X co
dfe0: 6e 74 61 69 6e 73 20 6e 6f 20 63 68 61 72 61 63  ntains no charac
dff0: 74 65 72 73 0a 2a 2a 20 66 72 6f 6d 20 61 6e 79  ters.** from any
e000: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 73 63   of the above sc
e010: 72 69 70 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ripts..*/.static
e020: 20 76 6f 69 64 20 73 63 72 69 70 74 43 6f 64 65   void scriptCode
e030: 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  SqlFunc(.  sqlit
e040: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
e050: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
e060: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
e070: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
e080: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
e090: 20 2a 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f   *zIn = sqlite3_
e0a0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
e0b0: 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d  0]);.  int nIn =
e0c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
e0d0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
e0e0: 20 69 6e 74 20 63 2c 20 73 7a 3b 0a 20 20 69 6e   int c, sz;.  in
e0f0: 74 20 73 63 72 69 70 74 4d 61 73 6b 20 3d 20 30  t scriptMask = 0
e100: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 23 20 64  ;.  int res;.# d
e110: 65 66 69 6e 65 20 53 43 52 49 50 54 5f 4c 41 54  efine SCRIPT_LAT
e120: 49 4e 20 20 20 20 20 20 20 30 78 30 30 30 31 0a  IN       0x0001.
e130: 23 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f  # define SCRIPT_
e140: 43 59 52 49 4c 4c 49 43 20 20 20 20 30 78 30 30  CYRILLIC    0x00
e150: 30 32 0a 23 20 64 65 66 69 6e 65 20 53 43 52 49  02.# define SCRI
e160: 50 54 5f 47 52 45 45 4b 20 20 20 20 20 20 20 30  PT_GREEK       0
e170: 78 30 30 30 34 0a 0a 20 20 77 68 69 6c 65 28 20  x0004..  while( 
e180: 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 63 20 3d  nIn>0 ){.    c =
e190: 20 75 74 66 38 52 65 61 64 28 7a 49 6e 2c 20 6e   utf8Read(zIn, n
e1a0: 49 6e 2c 20 26 73 7a 29 3b 0a 20 20 20 20 7a 49  In, &sz);.    zI
e1b0: 6e 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 6e 49 6e  n += sz;.    nIn
e1c0: 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 69 66 28 20   -= sz;.    if( 
e1d0: 63 3c 30 78 30 32 61 66 20 29 7b 0a 20 20 20 20  c<0x02af ){.    
e1e0: 20 20 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20    scriptMask |= 
e1f0: 53 43 52 49 50 54 5f 4c 41 54 49 4e 3b 0a 20 20  SCRIPT_LATIN;.  
e200: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 30    }else if( c>=0
e210: 78 30 34 30 30 20 26 26 20 63 3c 3d 30 78 30 34  x0400 && c<=0x04
e220: 66 66 20 29 7b 0a 20 20 20 20 20 20 73 63 72 69  ff ){.      scri
e230: 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52 49 50 54  ptMask |= SCRIPT
e240: 5f 43 59 52 49 4c 4c 49 43 3b 0a 20 20 20 20 7d  _CYRILLIC;.    }
e250: 65 6c 73 65 20 69 66 28 20 63 3e 3d 30 78 30 33  else if( c>=0x03
e260: 38 36 20 26 26 20 63 3c 3d 30 78 30 33 63 65 20  86 && c<=0x03ce 
e270: 29 7b 0a 20 20 20 20 20 20 73 63 72 69 70 74 4d  ){.      scriptM
e280: 61 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 47 52  ask |= SCRIPT_GR
e290: 45 45 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EEK;.    }.  }. 
e2a0: 20 73 77 69 74 63 68 28 20 73 63 72 69 70 74 4d   switch( scriptM
e2b0: 61 73 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ask ){.    case 
e2c0: 30 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0:              
e2d0: 20 20 72 65 73 20 3d 20 39 39 39 3b 20 62 72 65    res = 999; bre
e2e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 43 52  ak;.    case SCR
e2f0: 49 50 54 5f 4c 41 54 49 4e 3a 20 20 20 20 20 72  IPT_LATIN:     r
e300: 65 73 20 3d 20 32 31 35 3b 20 62 72 65 61 6b 3b  es = 215; break;
e310: 0a 20 20 20 20 63 61 73 65 20 53 43 52 49 50 54  .    case SCRIPT
e320: 5f 43 59 52 49 4c 4c 49 43 3a 20 20 72 65 73 20  _CYRILLIC:  res 
e330: 3d 20 32 32 30 3b 20 62 72 65 61 6b 3b 0a 20 20  = 220; break;.  
e340: 20 20 63 61 73 65 20 53 43 52 49 50 54 5f 47 52    case SCRIPT_GR
e350: 45 45 4b 3a 20 20 20 20 20 72 65 73 20 3d 20 32  EEK:     res = 2
e360: 30 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  00; break;.    d
e370: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
e380: 20 20 20 20 20 20 72 65 73 20 3d 20 39 39 38 3b        res = 998;
e390: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71   break;.  }.  sq
e3a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
e3b0: 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b 0a  (context, res);.
e3c0: 7d 0a 0a 2f 2a 20 45 6e 64 20 74 72 61 6e 73 6c  }../* End transl
e3d0: 69 74 65 72 61 74 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  iterate.********
e3e0: 2a 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
e430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e470: 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 73  *****.** Begin s
e480: 70 65 6c 6c 66 69 78 31 20 76 69 72 74 75 61 6c  pellfix1 virtual
e490: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 20 4d   table..*/../* M
e4a0: 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66  aximum length of
e4b0: 20 61 20 70 68 6f 6e 65 68 61 73 68 20 75 73 65   a phonehash use
e4c0: 64 20 66 6f 72 20 71 75 65 72 79 69 6e 67 20 74  d for querying t
e4d0: 68 65 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20  he shadow table 
e4e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c  */.#define SPELL
e4f0: 46 49 58 5f 4d 58 5f 48 41 53 48 20 20 38 0a 0a  FIX_MX_HASH  8..
e500: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
e510: 72 20 6f 66 20 68 61 73 68 20 73 74 72 69 6e 67  r of hash string
e520: 73 20 74 6f 20 65 78 61 6d 69 6e 65 20 70 65 72  s to examine per
e530: 20 71 75 65 72 79 20 2a 2f 0a 23 64 65 66 69 6e   query */.#defin
e540: 65 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55  e SPELLFIX_MX_RU
e550: 4e 20 20 20 31 0a 0a 74 79 70 65 64 65 66 20 73  N   1..typedef s
e560: 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f  truct spellfix1_
e570: 76 74 61 62 20 73 70 65 6c 6c 66 69 78 31 5f 76  vtab spellfix1_v
e580: 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72  tab;.typedef str
e590: 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  uct spellfix1_cu
e5a0: 72 73 6f 72 20 73 70 65 6c 6c 66 69 78 31 5f 63  rsor spellfix1_c
e5b0: 75 72 73 6f 72 3b 0a 0a 2f 2a 20 46 75 7a 7a 79  ursor;../* Fuzzy
e5c0: 2d 73 65 61 72 63 68 20 76 69 72 74 75 61 6c 20  -search virtual 
e5d0: 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  table object */.
e5e0: 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31  struct spellfix1
e5f0: 5f 76 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65  _vtab {.  sqlite
e600: 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20 20  3_vtab base;    
e610: 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61       /* Base cla
e620: 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72  ss - must be fir
e630: 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  st */.  sqlite3 
e640: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
e650: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
e660: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
e670: 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 20 20 20  har *zDbName;   
e680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
e690: 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 68 6f  e of database ho
e6a0: 6c 64 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65  lding this table
e6b0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
e6c0: 6c 65 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  leName;         
e6d0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
e6e0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
e6f0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 73 74 54 61  .  char *zCostTa
e700: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ble;          /*
e710: 20 54 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 65   Table holding e
e720: 64 69 74 2d 64 69 73 74 61 6e 63 65 20 63 6f 73  dit-distance cos
e730: 74 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45  t numbers */.  E
e740: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a  ditDist3Config *
e750: 70 43 6f 6e 66 69 67 33 3b 20 2f 2a 20 50 61 72  pConfig3; /* Par
e760: 73 65 64 20 65 64 69 74 20 64 69 73 74 61 6e 63  sed edit distanc
e770: 65 20 63 6f 73 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  e costs */.};../
e780: 2a 20 46 75 7a 7a 79 2d 73 65 61 72 63 68 20 63  * Fuzzy-search c
e790: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
e7a0: 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31  struct spellfix1
e7b0: 5f 63 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69  _cursor {.  sqli
e7c0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
e7d0: 62 61 73 65 3b 20 20 20 20 2f 2a 20 42 61 73 65  base;    /* Base
e7e0: 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65   class - must be
e7f0: 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 70 65 6c   first */.  spel
e800: 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 56 54 61  lfix1_vtab *pVTa
e810: 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  b;       /* The 
e820: 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74  table to which t
e830: 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
e840: 67 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  gs */.  char *zP
e850: 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20  attern;         
e860: 20 20 20 20 20 2f 2a 20 72 68 73 20 6f 66 20 4d       /* rhs of M
e870: 41 54 43 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  ATCH clause */. 
e880: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e8a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   Number of rows 
e8b0: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
e8c0: 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20  int nAlloc;     
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8e0: 4e 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61  Number of alloca
e8f0: 74 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e  ted rows */.  in
e900: 74 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t iRow;         
e910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
e920: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 6f 6e  rrent row of con
e930: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  tent */.  int iL
e940: 61 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ang;            
e950: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
e960: 6f 66 20 74 68 65 20 6c 61 6e 67 69 64 3d 20 63  of the langid= 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 54 6f 70 3b 20 20 20 20 20 20 20 20  nt iTop;        
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 74 6f 70 3d  alue of the top=
e9b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
e9c0: 20 69 6e 74 20 69 53 63 6f 70 65 3b 20 20 20 20   int iScope;    
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9e0: 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63   Value of the sc
e9f0: 6f 70 65 3d 20 63 6f 6e 73 74 72 61 69 6e 74 20  ope= constraint 
ea00: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 61 72 63 68  */.  int nSearch
ea10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ea20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
ea30: 6f 63 61 62 75 6c 61 72 79 20 69 74 65 6d 73 20  ocabulary items 
ea40: 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 73 71 6c  checked */.  sql
ea50: 69 74 65 33 5f 73 74 6d 74 20 2a 70 46 75 6c 6c  ite3_stmt *pFull
ea60: 53 63 61 6e 3b 20 20 20 20 20 2f 2a 20 53 68 61  Scan;     /* Sha
ea70: 64 6f 77 20 71 75 65 72 79 20 66 6f 72 20 61 20  dow query for a 
ea80: 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20  full table scan 
ea90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 70 65 6c  */.  struct spel
eaa0: 6c 66 69 78 31 5f 72 6f 77 20 7b 20 20 20 20 20  lfix1_row {     
eab0: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 72 6f    /* For each ro
eac0: 77 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  w of content */.
ead0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
eae0: 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20  4 iRowid;       
eaf0: 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
eb00: 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 63  his row */.    c
eb10: 68 61 72 20 2a 7a 57 6f 72 64 3b 20 20 20 20 20  har *zWord;     
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb30: 54 65 78 74 20 66 6f 72 20 74 68 69 73 20 72 6f  Text for this ro
eb40: 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 61  w */.    int iRa
eb50: 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nk;             
eb60: 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 6b 20 66         /* Rank f
eb70: 6f 72 20 74 68 69 73 20 72 6f 77 20 2a 2f 0a 20  or this row */. 
eb80: 20 20 20 69 6e 74 20 69 44 69 73 74 61 6e 63 65     int iDistance
eb90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eba0: 20 2f 2a 20 44 69 73 74 61 6e 63 65 20 66 72 6f   /* Distance fro
ebb0: 6d 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74 68  m pattern for th
ebc0: 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  is row */.    in
ebd0: 74 20 69 53 63 6f 72 65 3b 20 20 20 20 20 20 20  t iScore;       
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ebf0: 63 6f 72 65 20 66 6f 72 20 73 6f 72 74 69 6e 67  core for sorting
ec00: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4d 61 74   */.    int iMat
ec10: 63 68 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  chlen;          
ec20: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
ec30: 66 20 6d 61 74 63 68 6c 65 6e 20 63 6f 6c 75 6d  f matchlen colum
ec40: 6e 20 28 6f 72 20 2d 31 29 20 2a 2f 0a 20 20 20  n (or -1) */.   
ec50: 20 63 68 61 72 20 7a 48 61 73 68 5b 53 50 45 4c   char zHash[SPEL
ec60: 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 2f  LFIX_MX_HASH]; /
ec70: 2a 20 74 68 65 20 70 68 6f 6e 65 68 61 73 68 20  * the phonehash 
ec80: 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6d 61  used for this ma
ec90: 74 63 68 20 2a 2f 0a 20 20 7d 20 2a 61 3b 20 0a  tch */.  } *a; .
eca0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  };../*.** Constr
ecb0: 75 63 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  uct one or more 
ecc0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 66  SQL statements f
ecd0: 72 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 20 73  rom the format s
ece0: 74 72 69 6e 67 20 67 69 76 65 6e 0a 2a 2a 20 61  tring given.** a
ecf0: 6e 64 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65  nd then evaluate
ed00: 20 74 68 6f 73 65 20 73 74 61 74 65 6d 65 6e 74   those statement
ed10: 73 2e 20 54 68 65 20 73 75 63 63 65 73 73 20 63  s. The success c
ed20: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
ed30: 2a 20 69 6e 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a  * into *pRc..**.
ed40: 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 69 6e  ** If *pRc is in
ed50: 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f  itially non-zero
ed60: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
ed70: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
ed80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 70  /.static void sp
ed90: 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 0a 20  ellfix1DbExec(. 
eda0: 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
edb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65          /* Succe
edc0: 73 73 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  ss code */.  sql
edd0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
ede0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
edf0: 69 6e 20 77 68 69 63 68 20 74 6f 20 72 75 6e 20  in which to run 
ee00: 53 51 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  SQL */.  const c
ee10: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20  har *zFormat,   
ee20: 2f 2a 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67  /* Format string
ee30: 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e   for SQL */.  ..
ee40: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ee50: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
ee60: 73 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20  s to the format 
ee70: 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76  string */.){.  v
ee80: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
ee90: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 2a  r *zSql;.  if( *
eea0: 70 52 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRc ) return;.  
eeb0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
eec0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
eed0: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
eee0: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
eef0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
ef00: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
ef10: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
ef20: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
ef30: 20 20 20 20 2a 70 52 63 20 3d 20 73 71 6c 69 74      *pRc = sqlit
ef40: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
ef50: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
ef60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
ef70: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
ef80: 20 78 44 69 73 63 6f 6e 6e 65 63 74 2f 78 44 65   xDisconnect/xDe
ef90: 73 74 72 6f 79 20 6d 65 74 68 6f 64 20 66 6f 72  stroy method for
efa0: 20 74 68 65 20 66 75 7a 7a 79 2d 73 65 61 72 63   the fuzzy-searc
efb0: 68 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  h module..*/.sta
efc0: 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
efd0: 31 55 6e 69 6e 69 74 28 69 6e 74 20 69 73 44 65  1Uninit(int isDe
efe0: 73 74 72 6f 79 2c 20 73 71 6c 69 74 65 33 5f 76  stroy, sqlite3_v
eff0: 74 61 62 20 2a 70 56 54 61 62 29 7b 0a 20 20 73  tab *pVTab){.  s
f000: 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70  pellfix1_vtab *p
f010: 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74   = (spellfix1_vt
f020: 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 69 6e 74  ab*)pVTab;.  int
f030: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f040: 0a 20 20 69 66 28 20 69 73 44 65 73 74 72 6f 79  .  if( isDestroy
f050: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
f060: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
f070: 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63   spellfix1DbExec
f080: 28 26 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20  (&rc, db, "DROP 
f090: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
f0a0: 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
f0b0: 62 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  b\"",.          
f0c0: 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61          p->zDbNa
f0d0: 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
f0e0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
f0f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f100: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f110: 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  p->zTableName);.
f120: 20 20 20 20 65 64 69 74 44 69 73 74 33 43 6f 6e      editDist3Con
f130: 66 69 67 44 65 6c 65 74 65 28 70 2d 3e 70 43 6f  figDelete(p->pCo
f140: 6e 66 69 67 33 29 3b 0a 20 20 20 20 73 71 6c 69  nfig3);.    sqli
f150: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73  te3_free(p->zCos
f160: 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c  tTable);.    sql
f170: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
f180: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f190: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
f1a0: 6c 66 69 78 31 44 69 73 63 6f 6e 6e 65 63 74 28  lfix1Disconnect(
f1b0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
f1c0: 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Tab){.  return s
f1d0: 70 65 6c 6c 66 69 78 31 55 6e 69 6e 69 74 28 30  pellfix1Uninit(0
f1e0: 2c 20 70 56 54 61 62 29 3b 0a 7d 0a 73 74 61 74  , pVTab);.}.stat
f1f0: 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
f200: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 5f  Destroy(sqlite3_
f210: 76 74 61 62 20 2a 70 56 54 61 62 29 7b 0a 20 20  vtab *pVTab){.  
f220: 72 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31  return spellfix1
f230: 55 6e 69 6e 69 74 28 31 2c 20 70 56 54 61 62 29  Uninit(1, pVTab)
f240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
f250: 61 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69  a copy of a stri
f260: 6e 67 2e 20 20 52 65 6d 6f 76 65 20 6c 65 61 64  ng.  Remove lead
f270: 69 6e 67 20 61 6e 64 20 74 72 61 69 6c 69 6e 67  ing and trailing
f280: 20 77 68 69 74 65 73 70 61 63 65 0a 2a 2a 20 61   whitespace.** a
f290: 6e 64 20 64 65 71 75 6f 74 65 20 69 74 2e 0a 2a  nd dequote it..*
f2a0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73  /.static char *s
f2b0: 70 65 6c 6c 66 69 78 31 44 65 71 75 6f 74 65 28  pellfix1Dequote(
f2c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29  const char *zIn)
f2d0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a  {.  char *zOut;.
f2e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
f2f0: 61 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 69  ar c;.  while( i
f300: 73 73 70 61 63 65 28 7a 49 6e 5b 30 5d 29 20 29  sspace(zIn[0]) )
f310: 20 7a 49 6e 2b 2b 3b 0a 20 20 7a 4f 75 74 20 3d   zIn++;.  zOut =
f320: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
f330: 28 22 25 73 22 2c 20 7a 49 6e 29 3b 0a 20 20 69  ("%s", zIn);.  i
f340: 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74  f( zOut==0 ) ret
f350: 75 72 6e 20 30 3b 0a 20 20 69 20 3d 20 28 69 6e  urn 0;.  i = (in
f360: 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a  t)strlen(zOut);.
f370: 23 69 66 20 30 20 20 2f 2a 20 54 68 65 20 70 61  #if 0  /* The pa
f380: 72 73 65 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rser will never 
f390: 6c 65 61 76 65 20 73 70 61 63 65 73 20 61 74 20  leave spaces at 
f3a0: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 77 68 69  the end */.  whi
f3b0: 6c 65 28 20 69 3e 30 20 26 26 20 69 73 73 70 61  le( i>0 && isspa
f3c0: 63 65 28 7a 4f 75 74 5b 69 2d 31 5d 29 20 29 7b  ce(zOut[i-1]) ){
f3d0: 20 69 2d 2d 3b 20 7d 0a 23 65 6e 64 69 66 0a 20   i--; }.#endif. 
f3e0: 20 7a 4f 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20   zOut[i] = 0;.  
f3f0: 63 20 3d 20 7a 4f 75 74 5b 30 5d 3b 0a 20 20 69  c = zOut[0];.  i
f400: 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  f( c=='\'' || c=
f410: 3d 27 22 27 20 29 7b 0a 20 20 20 20 66 6f 72 28  ='"' ){.    for(
f420: 69 3d 31 2c 20 6a 3d 30 3b 20 41 4c 57 41 59 53  i=1, j=0; ALWAYS
f430: 28 7a 4f 75 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b  (zOut[i]); i++){
f440: 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d  .      zOut[j++]
f450: 20 3d 20 7a 4f 75 74 5b 69 5d 3b 0a 20 20 20 20   = zOut[i];.    
f460: 20 20 69 66 28 20 7a 4f 75 74 5b 69 5d 3d 3d 63    if( zOut[i]==c
f470: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f480: 7a 4f 75 74 5b 69 2b 31 5d 3d 3d 63 20 29 7b 0a  zOut[i+1]==c ){.
f490: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
f4a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f4b0: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2d 31          zOut[j-1
f4c0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
f4d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f4e0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
f4f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75    }.  return zOu
f500: 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f  t;.}.../*.** xCo
f510: 6e 6e 65 63 74 2f 78 43 72 65 61 74 65 20 6d 65  nnect/xCreate me
f520: 74 68 6f 64 20 66 6f 72 20 74 68 65 20 73 70 65  thod for the spe
f530: 6c 6c 66 69 78 31 20 6d 6f 64 75 6c 65 2e 20 41  llfix1 module. A
f540: 72 67 75 6d 65 6e 74 73 20 61 72 65 3a 0a 2a 2a  rguments are:.**
f550: 0a 2a 2a 20 20 20 61 72 67 76 5b 30 5d 20 20 20  .**   argv[0]   
f560: 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 20  -> module name  
f570: 28 22 73 70 65 6c 6c 66 69 78 31 22 29 0a 2a 2a  ("spellfix1").**
f580: 20 20 20 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20     argv[1]   -> 
f590: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a  database name.**
f5a0: 20 20 20 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20     argv[2]   -> 
f5b0: 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  table name.**   
f5c0: 61 72 67 76 5b 33 5d 2e 2e 20 2d 3e 20 6f 70 74  argv[3].. -> opt
f5d0: 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20  ional arguments 
f5e0: 28 69 2e 65 2e 20 22 65 64 69 74 5f 63 6f 73 74  (i.e. "edit_cost
f5f0: 5f 74 61 62 6c 65 22 20 70 61 72 61 6d 65 74 65  _table" paramete
f600: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r).*/.static int
f610: 20 73 70 65 6c 6c 66 69 78 31 49 6e 69 74 28 0a   spellfix1Init(.
f620: 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 2c 0a    int isCreate,.
f630: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
f640: 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
f650: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
f660: 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
f670: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
f680: 2a 2a 70 70 56 54 61 62 2c 0a 20 20 63 68 61 72  **ppVTab,.  char
f690: 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 73 70   **pzErr.){.  sp
f6a0: 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 4e  ellfix1_vtab *pN
f6b0: 65 77 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  ew = 0;.  const 
f6c0: 63 68 61 72 20 2a 7a 4d 6f 64 75 6c 65 20 3d 20  char *zModule = 
f6d0: 61 72 67 76 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74  argv[0];.  const
f6e0: 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
f6f0: 20 61 72 67 76 5b 31 5d 3b 0a 20 20 63 6f 6e 73   argv[1];.  cons
f700: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
f710: 6d 65 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  me = argv[2];.  
f720: 69 6e 74 20 6e 44 62 4e 61 6d 65 3b 0a 20 20 69  int nDbName;.  i
f730: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
f740: 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  K;.  int i;..  n
f750: 44 62 4e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  DbName = (int)st
f760: 72 6c 65 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20  rlen(zDbName);. 
f770: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
f780: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
f790: 70 4e 65 77 29 20 2b 20 6e 44 62 4e 61 6d 65 20  pNew) + nDbName 
f7a0: 2b 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  + 1);.  if( pNew
f7b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
f7c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f7d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
f7e0: 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
f7f0: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 20 20 70  f(*pNew));.    p
f800: 4e 65 77 2d 3e 7a 44 62 4e 61 6d 65 20 3d 20 28  New->zDbName = (
f810: 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
f820: 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d      memcpy(pNew-
f830: 3e 7a 44 62 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  >zDbName, zDbNam
f840: 65 2c 20 6e 44 62 4e 61 6d 65 2b 31 29 3b 0a 20  e, nDbName+1);. 
f850: 20 20 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e     pNew->zTableN
f860: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ame = sqlite3_mp
f870: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 61 62  rintf("%s", zTab
f880: 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  leName);.    pNe
f890: 77 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  w->db = db;.    
f8a0: 69 66 28 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65  if( pNew->zTable
f8b0: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
f8c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
f8d0: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
f8e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f8f0: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64  3_declare_vtab(d
f900: 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  b, .           "
f910: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 77  CREATE TABLE x(w
f920: 6f 72 64 2c 72 61 6e 6b 2c 64 69 73 74 61 6e 63  ord,rank,distanc
f930: 65 2c 6c 61 6e 67 69 64 2c 20 22 0a 20 20 20 20  e,langid, ".    
f940: 20 20 20 20 20 20 20 22 73 63 6f 72 65 2c 20 6d         "score, m
f950: 61 74 63 68 6c 65 6e 2c 20 70 68 6f 6e 65 68 61  atchlen, phoneha
f960: 73 68 20 48 49 44 44 45 4e 2c 20 22 0a 20 20 20  sh HIDDEN, ".   
f970: 20 20 20 20 20 20 20 20 22 74 6f 70 20 48 49 44          "top HID
f980: 44 45 4e 2c 20 73 63 6f 70 65 20 48 49 44 44 45  DEN, scope HIDDE
f990: 4e 2c 20 73 72 63 68 63 6e 74 20 48 49 44 44 45  N, srchcnt HIDDE
f9a0: 4e 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  N, ".           
f9b0: 22 73 6f 75 6e 64 73 6c 69 6b 65 20 48 49 44 44  "soundslike HIDD
f9c0: 45 4e 2c 20 63 6f 6d 6d 61 6e 64 20 48 49 44 44  EN, command HIDD
f9d0: 45 4e 29 22 0a 20 20 20 20 20 20 29 3b 0a 23 64  EN)".      );.#d
f9e0: 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43  efine SPELLFIX_C
f9f0: 4f 4c 5f 57 4f 52 44 20 20 20 20 20 20 20 20 20  OL_WORD         
fa00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 50 45     0.#define SPE
fa10: 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b 20 20  LLFIX_COL_RANK  
fa20: 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66            1.#def
fa30: 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
fa40: 5f 44 49 53 54 41 4e 43 45 20 20 20 20 20 20 20  _DISTANCE       
fa50: 20 32 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c   2.#define SPELL
fa60: 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20 20  FIX_COL_LANGID  
fa70: 20 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e          3.#defin
fa80: 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53  e SPELLFIX_COL_S
fa90: 43 4f 52 45 20 20 20 20 20 20 20 20 20 20 20 34  CORE           4
faa0: 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
fab0: 58 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45 4e 20 20  X_COL_MATCHLEN  
fac0: 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20        5.#define 
fad0: 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f  SPELLFIX_COL_PHO
fae0: 4e 45 48 41 53 48 20 20 20 20 20 20 20 36 0a 23  NEHASH       6.#
faf0: 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
fb00: 43 4f 4c 5f 54 4f 50 20 20 20 20 20 20 20 20 20  COL_TOP         
fb10: 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 50      7.#define SP
fb20: 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45  ELLFIX_COL_SCOPE
fb30: 20 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65             8.#de
fb40: 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  fine SPELLFIX_CO
fb50: 4c 5f 53 52 43 48 43 4e 54 20 20 20 20 20 20 20  L_SRCHCNT       
fb60: 20 20 39 0a 23 64 65 66 69 6e 65 20 53 50 45 4c    9.#define SPEL
fb70: 4c 46 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c  LFIX_COL_SOUNDSL
fb80: 49 4b 45 20 20 20 20 20 31 30 0a 23 64 65 66 69  IKE     10.#defi
fb90: 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  ne SPELLFIX_COL_
fba0: 43 4f 4d 4d 41 4e 44 20 20 20 20 20 20 20 20 31  COMMAND        1
fbb0: 31 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  1.    }.    if( 
fbc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
fbd0: 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
fbe0: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
fbf0: 34 20 72 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c  4 r;.      spell
fc00: 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20  fix1DbExec(&rc, 
fc10: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 22 43 52  db,.         "CR
fc20: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
fc30: 54 20 45 58 49 53 54 53 20 5c 22 25 77 5c 22 2e  T EXISTS \"%w\".
fc40: 5c 22 25 77 5f 76 6f 63 61 62 5c 22 28 5c 6e 22  \"%w_vocab\"(\n"
fc50: 0a 20 20 20 20 20 20 20 20 20 22 20 20 69 64 20  .         "  id 
fc60: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
fc70: 4b 45 59 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  KEY,\n".        
fc80: 20 22 20 20 72 61 6e 6b 20 49 4e 54 2c 5c 6e 22   "  rank INT,\n"
fc90: 0a 20 20 20 20 20 20 20 20 20 22 20 20 6c 61 6e  .         "  lan
fca0: 67 69 64 20 49 4e 54 2c 5c 6e 22 0a 20 20 20 20  gid INT,\n".    
fcb0: 20 20 20 20 20 22 20 20 77 6f 72 64 20 54 45 58       "  word TEX
fcc0: 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22  T,\n".         "
fcd0: 20 20 6b 31 20 54 45 58 54 2c 5c 6e 22 0a 20 20    k1 TEXT,\n".  
fce0: 20 20 20 20 20 20 20 22 20 20 6b 32 20 54 45 58         "  k2 TEX
fcf0: 54 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 29  T\n".         ")
fd00: 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  ;\n",.         z
fd10: 44 62 4e 61 6d 65 2c 20 7a 54 61 62 6c 65 4e 61  DbName, zTableNa
fd20: 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
fd30: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
fd40: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
fd50: 26 72 29 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c  &r);.      spell
fd60: 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20  fix1DbExec(&rc, 
fd70: 64 62 2c 0a 20 20 20 20 20 20 20 20 20 22 43 52  db,.         "CR
fd80: 45 41 54 45 20 49 4e 44 45 58 20 49 46 20 4e 4f  EATE INDEX IF NO
fd90: 54 20 45 58 49 53 54 53 20 5c 22 25 77 5c 22 2e  T EXISTS \"%w\".
fda0: 5c 22 25 77 5f 69 6e 64 65 78 5f 25 6c 6c 78 5c  \"%w_index_%llx\
fdb0: 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  " ".            
fdc0: 22 4f 4e 20 5c 22 25 77 5f 76 6f 63 61 62 5c 22  "ON \"%w_vocab\"
fdd0: 28 6c 61 6e 67 69 64 2c 6b 32 29 3b 22 2c 0a 20  (langid,k2);",. 
fde0: 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
fdf0: 20 7a 4d 6f 64 75 6c 65 2c 20 72 2c 20 7a 54 61   zModule, r, zTa
fe00: 62 6c 65 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  bleName.      );
fe10: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
fe20: 3d 33 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =3; rc==SQLITE_O
fe30: 4b 20 26 26 20 69 3c 61 72 67 63 3b 20 69 2b 2b  K && i<argc; i++
fe40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  ){.      if( mem
fe50: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 65 64 69  cmp(argv[i],"edi
fe60: 74 5f 63 6f 73 74 5f 74 61 62 6c 65 3d 22 2c 31  t_cost_table=",1
fe70: 36 29 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 7a  6)==0 && pNew->z
fe80: 43 6f 73 74 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  CostTable==0 ){.
fe90: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 43          pNew->zC
fea0: 6f 73 74 54 61 62 6c 65 20 3d 20 73 70 65 6c 6c  ostTable = spell
feb0: 66 69 78 31 44 65 71 75 6f 74 65 28 26 61 72 67  fix1Dequote(&arg
fec0: 76 5b 69 5d 5b 31 36 5d 29 3b 0a 20 20 20 20 20  v[i][16]);.     
fed0: 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 7a 43 6f     if( pNew->zCo
fee0: 73 74 54 61 62 6c 65 3d 3d 30 20 29 20 72 63 20  stTable==0 ) rc 
fef0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
ff00: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
ff10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ff20: 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33  *pzErr = sqlite3
ff30: 5f 6d 70 72 69 6e 74 66 28 22 62 61 64 20 61 72  _mprintf("bad ar
ff40: 67 75 6d 65 6e 74 20 74 6f 20 73 70 65 6c 6c 66  gument to spellf
ff50: 69 78 31 28 29 3a 20 5c 22 25 73 5c 22 22 2c 20  ix1(): \"%s\"", 
ff60: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
ff70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
ff80: 52 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  R; .    }.  }.. 
ff90: 20 69 66 28 20 72 63 20 26 26 20 70 4e 65 77 20   if( rc && pNew 
ffa0: 29 7b 0a 20 20 20 20 2a 70 70 56 54 61 62 20 3d  ){.    *ppVTab =
ffb0: 20 30 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78   0;.    spellfix
ffc0: 31 55 6e 69 6e 69 74 28 30 2c 20 26 70 4e 65 77  1Uninit(0, &pNew
ffd0: 2d 3e 62 61 73 65 29 3b 0a 20 20 7d 65 6c 73 65  ->base);.  }else
ffe0: 7b 0a 20 20 20 20 2a 70 70 56 54 61 62 20 3d 20  {.    *ppVTab = 
fff0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29  (sqlite3_vtab *)
10000 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pNew;.  }.  retu
10010 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10020 54 68 65 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64  The xConnect and
10030 20 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 73   xCreate methods
10040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
10050 70 65 6c 6c 66 69 78 31 43 6f 6e 6e 65 63 74 28  pellfix1Connect(
10060 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
10070 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
10080 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
10090 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
100a0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
100b0 20 2a 2a 70 70 56 54 61 62 2c 0a 20 20 63 68 61   **ppVTab,.  cha
100c0 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72  r **pzErr.){.  r
100d0 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 49  eturn spellfix1I
100e0 6e 69 74 28 30 2c 20 64 62 2c 20 70 41 75 78 2c  nit(0, db, pAux,
100f0 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56   argc, argv, ppV
10100 54 61 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 73  Tab, pzErr);.}.s
10110 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
10120 69 78 31 43 72 65 61 74 65 28 0a 20 20 73 71 6c  ix1Create(.  sql
10130 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
10140 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
10150 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
10160 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
10170 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
10180 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  Tab,.  char **pz
10190 45 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Err.){.  return 
101a0 73 70 65 6c 6c 66 69 78 31 49 6e 69 74 28 31 2c  spellfix1Init(1,
101b0 20 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c   db, pAux, argc,
101c0 20 61 72 67 76 2c 20 70 70 56 54 61 62 2c 20 70   argv, ppVTab, p
101d0 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
101e0 43 6c 65 61 72 20 61 6c 6c 20 6f 66 20 74 68 65  Clear all of the
101f0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 61 20   content from a 
10200 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  cursor..*/.stati
10210 63 20 76 6f 69 64 20 73 70 65 6c 6c 66 69 78 31  c void spellfix1
10220 52 65 73 65 74 43 75 72 73 6f 72 28 73 70 65 6c  ResetCursor(spel
10230 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
10240 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
10250 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d  for(i=0; i<pCur-
10260 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nRow; i++){.   
10270 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
10280 75 72 2d 3e 61 5b 69 5d 2e 7a 57 6f 72 64 29 3b  ur->a[i].zWord);
10290 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 6e 52 6f  .  }.  pCur->nRo
102a0 77 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  w = 0;.  pCur->i
102b0 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Row = 0;.  pCur-
102c0 3e 6e 53 65 61 72 63 68 20 3d 20 30 3b 0a 20 20  >nSearch = 0;.  
102d0 69 66 28 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53  if( pCur->pFullS
102e0 63 61 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  can ){.    sqlit
102f0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72  e3_finalize(pCur
10300 2d 3e 70 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20  ->pFullScan);.  
10310 20 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61    pCur->pFullSca
10320 6e 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  n = 0;.  }.}../*
10330 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 63  .** Resize the c
10340 75 72 73 6f 72 20 74 6f 20 68 6f 6c 64 20 75 70  ursor to hold up
10350 20 74 6f 20 4e 20 72 6f 77 73 20 6f 66 20 63 6f   to N rows of co
10360 6e 74 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ntent.*/.static 
10370 76 6f 69 64 20 73 70 65 6c 6c 66 69 78 31 52 65  void spellfix1Re
10380 73 69 7a 65 43 75 72 73 6f 72 28 73 70 65 6c 6c  sizeCursor(spell
10390 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75  fix1_cursor *pCu
103a0 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 73 74 72  r, int N){.  str
103b0 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f  uct spellfix1_ro
103c0 77 20 2a 61 4e 65 77 3b 0a 20 20 61 73 73 65 72  w *aNew;.  asser
103d0 74 28 20 4e 3e 3d 70 43 75 72 2d 3e 6e 52 6f 77  t( N>=pCur->nRow
103e0 20 29 3b 0a 20 20 61 4e 65 77 20 3d 20 73 71 6c   );.  aNew = sql
103f0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 43 75  ite3_realloc(pCu
10400 72 2d 3e 61 2c 20 73 69 7a 65 6f 66 28 70 43 75  r->a, sizeof(pCu
10410 72 2d 3e 61 5b 30 5d 29 2a 4e 29 3b 0a 20 20 69  r->a[0])*N);.  i
10420 66 28 20 61 4e 65 77 3d 3d 30 20 26 26 20 4e 3e  f( aNew==0 && N>
10430 30 20 29 7b 0a 20 20 20 20 73 70 65 6c 6c 66 69  0 ){.    spellfi
10440 78 31 52 65 73 65 74 43 75 72 73 6f 72 28 70 43  x1ResetCursor(pC
10450 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
10460 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 29 3b 0a  _free(pCur->a);.
10470 20 20 20 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63      pCur->nAlloc
10480 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
10490 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  a = 0;.  }else{.
104a0 20 20 20 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63      pCur->nAlloc
104b0 20 3d 20 4e 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = N;.    pCur->
104c0 61 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  a = aNew;.  }.}.
104d0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
104e0 66 75 7a 7a 79 2d 73 65 61 72 63 68 20 63 75 72  fuzzy-search cur
104f0 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sor..*/.static i
10500 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 6c 6f 73  nt spellfix1Clos
10510 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  e(sqlite3_vtab_c
10520 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73  ursor *cur){.  s
10530 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
10540 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69  *pCur = (spellfi
10550 78 31 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b  x1_cursor *)cur;
10560 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65  .  spellfix1Rese
10570 74 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  tCursor(pCur);. 
10580 20 73 70 65 6c 6c 66 69 78 31 52 65 73 69 7a 65   spellfix1Resize
10590 43 75 72 73 6f 72 28 70 43 75 72 2c 20 30 29 3b  Cursor(pCur, 0);
105a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
105b0 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b  pCur->zPattern);
105c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
105d0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
105e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
105f0 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74  .** Search for t
10600 65 72 6d 73 20 6f 66 20 74 68 65 73 65 20 66 6f  erms of these fo
10610 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 41 29  rms:.**.**   (A)
10620 20 20 20 20 77 6f 72 64 20 4d 41 54 43 48 20 24      word MATCH $
10630 73 74 72 0a 2a 2a 20 20 20 28 42 29 20 20 20 20  str.**   (B)    
10640 6c 61 6e 67 69 64 20 3d 3d 20 24 6c 61 6e 67 69  langid == $langi
10650 64 0a 2a 2a 20 20 20 28 43 29 20 20 20 20 74 6f  d.**   (C)    to
10660 70 20 3d 20 24 74 6f 70 0a 2a 2a 20 20 20 28 44  p = $top.**   (D
10670 29 20 20 20 20 73 63 6f 70 65 20 3d 20 24 73 63  )    scope = $sc
10680 6f 70 65 0a 2a 2a 20 20 20 28 45 29 20 20 20 20  ope.**   (E)    
10690 64 69 73 74 61 6e 63 65 20 3c 20 24 64 69 73 74  distance < $dist
106a0 61 6e 63 65 0a 2a 2a 20 20 20 28 46 29 20 20 20  ance.**   (F)   
106b0 20 64 69 73 74 61 6e 63 65 20 3c 3d 20 24 64 69   distance <= $di
106c0 73 74 61 6e 63 65 0a 2a 2a 0a 2a 2a 20 54 68 65  stance.**.** The
106d0 20 70 6c 61 6e 20 6e 75 6d 62 65 72 20 69 73 20   plan number is 
106e0 61 20 62 69 74 20 6d 61 73 6b 20 66 6f 72 6d 65  a bit mask forme
106f0 64 20 77 69 74 68 20 74 68 65 73 65 20 62 69 74  d with these bit
10700 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 78 30 31 20  s:.**.**   0x01 
10710 20 20 28 41 29 20 69 73 20 66 6f 75 6e 64 0a 2a    (A) is found.*
10720 2a 20 20 20 30 78 30 32 20 20 20 28 42 29 20 69  *   0x02   (B) i
10730 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 30  s found.**   0x0
10740 34 20 20 20 28 43 29 20 69 73 20 66 6f 75 6e 64  4   (C) is found
10750 0a 2a 2a 20 20 20 30 78 30 38 20 20 20 28 44 29  .**   0x08   (D)
10760 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30   is found.**   0
10770 78 31 30 20 20 20 28 45 29 20 69 73 20 66 6f 75  x10   (E) is fou
10780 6e 64 0a 2a 2a 20 20 20 30 78 32 30 20 20 20 28  nd.**   0x20   (
10790 46 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 0a 2a  F) is found.**.*
107a0 2a 20 66 69 6c 74 65 72 2e 61 72 67 76 5b 2a 5d  * filter.argv[*]
107b0 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 73   values contains
107c0 20 24 73 74 72 2c 20 24 6c 61 6e 67 69 64 2c 20   $str, $langid, 
107d0 24 74 6f 70 2c 20 61 6e 64 20 24 73 63 6f 70 65  $top, and $scope
107e0 2c 0a 2a 2a 20 69 66 20 73 70 65 63 69 66 69 65  ,.** if specifie
107f0 64 20 61 6e 64 20 69 6e 20 74 68 61 74 20 6f 72  d and in that or
10800 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
10810 6e 74 20 73 70 65 6c 6c 66 69 78 31 42 65 73 74  nt spellfix1Best
10820 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74  Index(sqlite3_vt
10830 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33  ab *tab, sqlite3
10840 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
10850 78 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 50  xInfo){.  int iP
10860 6c 61 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  lan = 0;.  int i
10870 4c 61 6e 67 54 65 72 6d 20 3d 20 2d 31 3b 0a 20  LangTerm = -1;. 
10880 20 69 6e 74 20 69 54 6f 70 54 65 72 6d 20 3d 20   int iTopTerm = 
10890 2d 31 3b 0a 20 20 69 6e 74 20 69 53 63 6f 70 65  -1;.  int iScope
108a0 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  Term = -1;.  int
108b0 20 69 44 69 73 74 54 65 72 6d 20 3d 20 2d 31 3b   iDistTerm = -1;
108c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
108d0 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  t struct sqlite3
108e0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
108f0 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  t *pConstraint;.
10900 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    pConstraint = 
10910 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
10920 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30  raint;.  for(i=0
10930 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
10940 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20  onstraint; i++, 
10950 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a  pConstraint++){.
10960 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61      if( pConstra
10970 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29  int->usable==0 )
10980 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
10990 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  /* Terms of the 
109a0 66 6f 72 6d 3a 20 20 77 6f 72 64 20 4d 41 54 43  form:  word MATC
109b0 48 20 24 73 74 72 20 2a 2f 0a 20 20 20 20 69 66  H $str */.    if
109c0 28 20 28 69 50 6c 61 6e 20 26 20 31 29 3d 3d 30  ( (iPlan & 1)==0
109d0 20 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74   .     && pConst
109e0 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  raint->iColumn==
109f0 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52  SPELLFIX_COL_WOR
10a00 44 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74  D.     && pConst
10a10 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54  raint->op==SQLIT
10a20 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10a30 4e 54 5f 4d 41 54 43 48 0a 20 20 20 20 29 7b 0a  NT_MATCH.    ){.
10a40 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 31        iPlan |= 1
10a50 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
10a60 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
10a70 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
10a80 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78 49  = 1;.      pIdxI
10a90 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
10aa0 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20  Usage[i].omit = 
10ab0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
10ac0 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   Terms of the fo
10ad0 72 6d 3a 20 20 6c 61 6e 67 69 64 20 3d 20 24 6c  rm:  langid = $l
10ae0 61 6e 67 69 64 20 20 2a 2f 0a 20 20 20 20 69 66  angid  */.    if
10af0 28 20 28 69 50 6c 61 6e 20 26 20 32 29 3d 3d 30  ( (iPlan & 2)==0
10b00 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10b10 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53  aint->iColumn==S
10b20 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47  PELLFIX_COL_LANG
10b30 49 44 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73  ID.     && pCons
10b40 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49  traint->op==SQLI
10b50 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
10b60 49 4e 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20  INT_EQ.    ){.  
10b70 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 32 3b 0a      iPlan |= 2;.
10b80 20 20 20 20 20 20 69 4c 61 6e 67 54 65 72 6d 20        iLangTerm 
10b90 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = i;.    }..    
10ba0 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  /* Terms of the 
10bb0 66 6f 72 6d 3a 20 20 74 6f 70 20 3d 20 24 74 6f  form:  top = $to
10bc0 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50  p */.    if( (iP
10bd0 6c 61 6e 20 26 20 34 29 3d 3d 30 0a 20 20 20 20  lan & 4)==0.    
10be0 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
10bf0 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46  >iColumn==SPELLF
10c00 49 58 5f 43 4f 4c 5f 54 4f 50 0a 20 20 20 20 20  IX_COL_TOP.     
10c10 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
10c20 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
10c30 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20  _CONSTRAINT_EQ. 
10c40 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61     ){.      iPla
10c50 6e 20 7c 3d 20 34 3b 0a 20 20 20 20 20 20 69 54  n |= 4;.      iT
10c60 6f 70 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20  opTerm = i;.    
10c70 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20  }..    /* Terms 
10c80 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 73 63  of the form:  sc
10c90 6f 70 65 20 3d 20 24 73 63 6f 70 65 20 2a 2f 0a  ope = $scope */.
10ca0 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26      if( (iPlan &
10cb0 20 38 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70   8)==0.     && p
10cc0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
10cd0 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f  umn==SPELLFIX_CO
10ce0 4c 5f 53 43 4f 50 45 0a 20 20 20 20 20 26 26 20  L_SCOPE.     && 
10cf0 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
10d00 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
10d10 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20 20  NSTRAINT_EQ.    
10d20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c  ){.      iPlan |
10d30 3d 20 38 3b 0a 20 20 20 20 20 20 69 53 63 6f 70  = 8;.      iScop
10d40 65 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d  eTerm = i;.    }
10d50 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f  ..    /* Terms o
10d60 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 64 69 73  f the form:  dis
10d70 74 61 6e 63 65 20 3c 20 24 64 69 73 74 20 6f 72  tance < $dist or
10d80 20 64 69 73 74 61 6e 63 65 20 3c 3d 20 24 64 69   distance <= $di
10d90 73 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69  st */.    if( (i
10da0 50 6c 61 6e 20 26 20 28 31 36 7c 33 32 29 29 3d  Plan & (16|32))=
10db0 3d 30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73  =0.     && pCons
10dc0 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d  traint->iColumn=
10dd0 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49  =SPELLFIX_COL_DI
10de0 53 54 41 4e 43 45 0a 20 20 20 20 20 26 26 20 28  STANCE.     && (
10df0 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
10e00 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
10e10 4e 53 54 52 41 49 4e 54 5f 4c 54 0a 20 20 20 20  NSTRAINT_LT.    
10e20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6e 73 74 72        || pConstr
10e30 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  aint->op==SQLITE
10e40 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10e50 54 5f 4c 45 29 0a 20 20 20 20 29 7b 0a 20 20 20  T_LE).    ){.   
10e60 20 20 20 69 50 6c 61 6e 20 7c 3d 20 70 43 6f 6e     iPlan |= pCon
10e70 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c  straint->op==SQL
10e80 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
10e90 41 49 4e 54 5f 4c 54 20 3f 20 31 36 20 3a 20 33  AINT_LT ? 16 : 3
10ea0 32 3b 0a 20 20 20 20 20 20 69 44 69 73 74 54 65  2;.      iDistTe
10eb0 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  rm = i;.    }.  
10ec0 7d 0a 20 20 69 66 28 20 69 50 6c 61 6e 26 31 20  }.  if( iPlan&1 
10ed0 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
10ee0 20 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   2;.    pIdxInfo
10ef0 2d 3e 69 64 78 4e 75 6d 20 3d 20 69 50 6c 61 6e  ->idxNum = iPlan
10f00 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
10f10 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d 31 0a  fo->nOrderBy==1.
10f20 20 20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f       && pIdxInfo
10f30 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e 69 43  ->aOrderBy[0].iC
10f40 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f  olumn==SPELLFIX_
10f50 43 4f 4c 5f 53 43 4f 52 45 0a 20 20 20 20 20 26  COL_SCORE.     &
10f60 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  & pIdxInfo->aOrd
10f70 65 72 42 79 5b 30 5d 2e 64 65 73 63 3d 3d 30 0a  erBy[0].desc==0.
10f80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64      ){.      pId
10f90 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
10fa0 6e 73 75 6d 65 64 20 3d 20 31 3b 20 20 2f 2a 20  nsumed = 1;  /* 
10fb0 44 65 66 61 75 6c 74 20 6f 72 64 65 72 20 62 79  Default order by
10fc0 20 69 53 63 6f 72 65 20 2a 2f 0a 20 20 20 20 7d   iScore */.    }
10fd0 0a 20 20 20 20 69 66 28 20 69 50 6c 61 6e 26 32  .    if( iPlan&2
10fe0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e   ){.      pIdxIn
10ff0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
11000 73 61 67 65 5b 69 4c 61 6e 67 54 65 72 6d 5d 2e  sage[iLangTerm].
11010 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b  argvIndex = idx+
11020 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  +;.      pIdxInf
11030 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11040 61 67 65 5b 69 4c 61 6e 67 54 65 72 6d 5d 2e 6f  age[iLangTerm].o
11050 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  mit = 1;.    }. 
11060 20 20 20 69 66 28 20 69 50 6c 61 6e 26 34 20 29     if( iPlan&4 )
11070 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  {.      pIdxInfo
11080 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
11090 67 65 5b 69 54 6f 70 54 65 72 6d 5d 2e 61 72 67  ge[iTopTerm].arg
110a0 76 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a  vIndex = idx++;.
110b0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
110c0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
110d0 5b 69 54 6f 70 54 65 72 6d 5d 2e 6f 6d 69 74 20  [iTopTerm].omit 
110e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
110f0 66 28 20 69 50 6c 61 6e 26 38 20 29 7b 0a 20 20  f( iPlan&8 ){.  
11100 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
11110 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
11120 53 63 6f 70 65 54 65 72 6d 5d 2e 61 72 67 76 49  ScopeTerm].argvI
11130 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20  ndex = idx++;.  
11140 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
11150 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
11160 53 63 6f 70 65 54 65 72 6d 5d 2e 6f 6d 69 74 20  ScopeTerm].omit 
11170 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
11180 66 28 20 69 50 6c 61 6e 26 28 31 36 7c 33 32 29  f( iPlan&(16|32)
11190 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e   ){.      pIdxIn
111a0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
111b0 73 61 67 65 5b 69 44 69 73 74 54 65 72 6d 5d 2e  sage[iDistTerm].
111c0 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b  argvIndex = idx+
111d0 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  +;.      pIdxInf
111e0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
111f0 61 67 65 5b 69 44 69 73 74 54 65 72 6d 5d 2e 6f  age[iDistTerm].o
11200 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  mit = 1;.    }. 
11210 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
11220 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
11230 75 62 6c 65 29 31 30 30 30 30 3b 0a 20 20 7d 65  uble)10000;.  }e
11240 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  lse{.    pIdxInf
11250 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20  o->idxNum = 0;. 
11260 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
11270 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
11280 75 62 6c 65 29 31 30 30 30 30 30 30 30 3b 0a 20  uble)10000000;. 
11290 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
112a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
112b0 4f 70 65 6e 20 61 20 6e 65 77 20 66 75 7a 7a 79  Open a new fuzzy
112c0 2d 73 65 61 72 63 68 20 63 75 72 73 6f 72 2e 0a  -search cursor..
112d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
112e0 65 6c 6c 66 69 78 31 4f 70 65 6e 28 73 71 6c 69  ellfix1Open(sqli
112f0 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c  te3_vtab *pVTab,
11300 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
11310 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
11320 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  {.  spellfix1_vt
11330 61 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69  ab *p = (spellfi
11340 78 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a  x1_vtab*)pVTab;.
11350 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73    spellfix1_curs
11360 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75 72  or *pCur;.  pCur
11370 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
11380 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29  c( sizeof(*pCur)
11390 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d   );.  if( pCur==
113a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
113b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  E_NOMEM;.  memse
113c0 74 28 70 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f  t(pCur, 0, sizeo
113d0 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 43 75  f(*pCur));.  pCu
113e0 72 2d 3e 70 56 54 61 62 20 3d 20 70 3b 0a 20 20  r->pVTab = p;.  
113f0 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75  *ppCursor = &pCu
11400 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72  r->base;.  retur
11410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11420 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 61 20 64  /*.** Adjust a d
11430 69 73 74 61 6e 63 65 20 6d 65 61 73 75 72 65 6d  istance measurem
11440 65 6e 74 20 62 79 20 74 68 65 20 77 6f 72 64 73  ent by the words
11450 20 72 61 6e 6b 20 69 6e 20 6f 72 64 65 72 20 74   rank in order t
11460 6f 20 73 68 6f 77 0a 2a 2a 20 70 72 65 66 65 72  o show.** prefer
11470 65 6e 63 65 20 74 6f 20 63 6f 6d 6d 6f 6e 20 77  ence to common w
11480 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
11490 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 53 63 6f  int spellfix1Sco
114a0 72 65 28 69 6e 74 20 69 44 69 73 74 61 6e 63 65  re(int iDistance
114b0 2c 20 69 6e 74 20 69 52 61 6e 6b 29 7b 0a 20 20  , int iRank){.  
114c0 69 6e 74 20 69 4c 6f 67 32 3b 0a 20 20 66 6f 72  int iLog2;.  for
114d0 28 69 4c 6f 67 32 3d 30 3b 20 69 52 61 6e 6b 3e  (iLog2=0; iRank>
114e0 30 3b 20 69 4c 6f 67 32 2b 2b 2c 20 69 52 61 6e  0; iLog2++, iRan
114f0 6b 3e 3e 3d 31 29 7b 7d 0a 20 20 72 65 74 75 72  k>>=1){}.  retur
11500 6e 20 69 44 69 73 74 61 6e 63 65 20 2b 20 33 32  n iDistance + 32
11510 20 2d 20 69 4c 6f 67 32 3b 0a 7d 0a 0a 2f 2a 0a   - iLog2;.}../*.
11520 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  ** Compare two s
11530 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 6f 62 6a  pellfix1_row obj
11540 65 63 74 73 20 66 6f 72 20 73 6f 72 74 69 6e 67  ects for sorting
11550 20 70 75 72 70 6f 73 65 73 20 69 6e 20 71 73 6f   purposes in qso
11560 72 74 28 29 20 73 75 63 68 0a 2a 2a 20 74 68 61  rt() such.** tha
11570 74 20 74 68 65 79 20 73 6f 72 74 20 69 6e 20 6f  t they sort in o
11580 72 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73 69  rder of increasi
11590 6e 67 20 64 69 73 74 61 6e 63 65 2e 0a 2a 2f 0a  ng distance..*/.
115a0 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
115b0 66 69 78 31 52 6f 77 43 6f 6d 70 61 72 65 28 63  fix1RowCompare(c
115c0 6f 6e 73 74 20 76 6f 69 64 20 2a 41 2c 20 63 6f  onst void *A, co
115d0 6e 73 74 20 76 6f 69 64 20 2a 42 29 7b 0a 20 20  nst void *B){.  
115e0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70 65  const struct spe
115f0 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 61 20 3d 20  llfix1_row *a = 
11600 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70  (const struct sp
11610 65 6c 6c 66 69 78 31 5f 72 6f 77 2a 29 41 3b 0a  ellfix1_row*)A;.
11620 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
11630 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 62 20  pellfix1_row *b 
11640 3d 20 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20  = (const struct 
11650 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 2a 29 42  spellfix1_row*)B
11660 3b 0a 20 20 72 65 74 75 72 6e 20 61 2d 3e 69 53  ;.  return a->iS
11670 63 6f 72 65 20 2d 20 62 2d 3e 69 53 63 6f 72 65  core - b->iScore
11680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72  ;.}../*.** A str
11690 75 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 70  ucture used to p
116a0 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ass information 
116b0 66 72 6f 6d 20 73 70 65 6c 6c 66 69 78 31 46 69  from spellfix1Fi
116c0 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 29 0a 2a  lterForMatch().*
116d0 2a 20 69 6e 74 6f 20 73 70 65 6c 6c 66 69 78 31  * into spellfix1
116e0 52 75 6e 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 74  RunQuery()..*/.t
116f0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 61  ypedef struct Ma
11700 74 63 68 51 75 65 72 79 20 7b 0a 20 20 73 70 65  tchQuery {.  spe
11710 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70  llfix1_cursor *p
11720 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur;          /*
11730 20 54 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   The cursor bein
11740 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 73  g queried */.  s
11750 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
11760 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
11770 2f 2a 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20  /* shadow table 
11780 71 75 65 72 79 20 73 74 61 74 6d 65 6e 74 20 2a  query statment *
11790 2f 0a 20 20 63 68 61 72 20 7a 48 61 73 68 5b 53  /.  char zHash[S
117a0 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d  PELLFIX_MX_HASH]
117b0 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72  ;    /* The curr
117c0 65 6e 74 20 70 68 6f 6e 65 68 61 73 68 20 66 6f  ent phonehash fo
117d0 72 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20  r zPattern */.  
117e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
117f0 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tern;           
11800 20 2f 2a 20 54 72 61 6e 73 6c 69 74 65 72 61 74   /* Transliterat
11810 65 64 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  ed input string 
11820 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72  */.  int nPatter
11830 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11840 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
11850 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20  of zPattern */. 
11860 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
11870 72 69 6e 67 20 2a 70 4d 61 74 63 68 53 74 72 33  ring *pMatchStr3
11880 3b 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 75 6e  ; /* Original un
11890 69 63 6f 64 65 20 73 74 72 69 6e 67 20 2a 2f 0a  icode string */.
118a0 20 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69    EditDist3Confi
118b0 67 20 2a 70 43 6f 6e 66 69 67 33 3b 20 20 20 20  g *pConfig3;    
118c0 20 20 20 2f 2a 20 45 64 69 74 2d 64 69 73 74 61     /* Edit-dista
118d0 6e 63 65 20 63 6f 73 74 20 63 6f 65 66 66 69 63  nce cost coeffic
118e0 69 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ients */.  const
118f0 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a   EditDist3Lang *
11900 70 4c 61 6e 67 3b 20 20 20 20 20 20 2f 2a 20 54  pLang;      /* T
11910 68 65 20 73 65 6c 65 63 74 65 64 20 6c 61 6e 67  he selected lang
11920 75 61 67 65 20 63 6f 65 66 66 69 63 69 65 6e 74  uage coefficient
11930 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  s */.  int iLang
11940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11950 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
11960 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20  anguage id */.  
11970 69 6e 74 20 69 53 63 6f 70 65 3b 20 20 20 20 20  int iScope;     
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 63 6f 70   /* Default scop
119a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 61 78 44  e */.  int iMaxD
119b0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
119c0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
119d0 75 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69 74 20  um allowed edit 
119e0 64 69 73 74 61 6e 63 65 2c 20 6f 72 20 2d 31 20  distance, or -1 
119f0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
11a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a10 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
11a20 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 75  ode */.  int nRu
11a30 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
11a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11a50 20 70 72 69 6f 72 20 72 75 6e 73 20 66 6f 72 20   prior runs for 
11a60 74 68 65 20 73 61 6d 65 20 7a 50 61 74 74 65 72  the same zPatter
11a70 6e 20 2a 2f 0a 20 20 63 68 61 72 20 61 7a 50 72  n */.  char azPr
11a80 69 6f 72 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  ior[SPELLFIX_MX_
11a90 52 55 4e 5d 5b 53 50 45 4c 4c 46 49 58 5f 4d 58  RUN][SPELLFIX_MX
11aa0 5f 48 41 53 48 5d 3b 20 20 2f 2a 20 50 72 69 6f  _HASH];  /* Prio
11ab0 72 20 68 61 73 68 65 73 20 2a 2f 0a 7d 20 4d 61  r hashes */.} Ma
11ac0 74 63 68 51 75 65 72 79 3b 0a 0a 2f 2a 0a 2a 2a  tchQuery;../*.**
11ad0 20 52 75 6e 20 61 20 71 75 65 72 79 20 6c 6f 6f   Run a query loo
11ae0 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  king for the bes
11af0 74 20 6d 61 74 63 68 65 73 20 61 67 61 69 6e 73  t matches agains
11b00 74 20 7a 50 61 74 74 65 72 6e 20 75 73 69 6e 67  t zPattern using
11b10 0a 2a 2a 20 7a 48 61 73 68 20 61 73 20 74 68 65  .** zHash as the
11b20 20 63 68 61 72 61 63 74 65 72 20 63 6c 61 73 73   character class
11b30 20 73 65 65 64 20 68 61 73 68 2e 0a 2a 2f 0a 73   seed hash..*/.s
11b40 74 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c  tatic void spell
11b50 66 69 78 31 52 75 6e 51 75 65 72 79 28 4d 61 74  fix1RunQuery(Mat
11b60 63 68 51 75 65 72 79 20 2a 70 2c 20 63 6f 6e 73  chQuery *p, cons
11b70 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 2c 20  t char *zQuery, 
11b80 69 6e 74 20 6e 51 75 65 72 79 29 7b 0a 20 20 63  int nQuery){.  c
11b90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 31 3b 0a  onst char *zK1;.
11ba0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
11bb0 6f 72 64 3b 0a 20 20 69 6e 74 20 69 44 69 73 74  ord;.  int iDist
11bc0 3b 0a 20 20 69 6e 74 20 69 52 61 6e 6b 3b 0a 20  ;.  int iRank;. 
11bd0 20 69 6e 74 20 69 53 63 6f 72 65 3b 0a 20 20 69   int iScore;.  i
11be0 6e 74 20 69 57 6f 72 73 74 20 3d 20 30 3b 0a 20  nt iWorst = 0;. 
11bf0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
11c00 69 64 78 57 6f 72 73 74 20 3d 20 2d 31 3b 0a 20  idxWorst = -1;. 
11c10 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53   int i;.  int iS
11c20 63 6f 70 65 20 3d 20 70 2d 3e 69 53 63 6f 70 65  cope = p->iScope
11c30 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  ;.  spellfix1_cu
11c40 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e  rsor *pCur = p->
11c50 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pCur;.  sqlite3_
11c60 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
11c70 3e 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 7a  >pStmt;.  char z
11c80 48 61 73 68 31 5b 53 50 45 4c 4c 46 49 58 5f 4d  Hash1[SPELLFIX_M
11c90 58 5f 48 41 53 48 5d 3b 0a 20 20 63 68 61 72 20  X_HASH];.  char 
11ca0 7a 48 61 73 68 32 5b 53 50 45 4c 4c 46 49 58 5f  zHash2[SPELLFIX_
11cb0 4d 58 5f 48 41 53 48 5d 3b 0a 20 20 63 68 61 72  MX_HASH];.  char
11cc0 20 2a 7a 43 6c 61 73 73 3b 0a 20 20 69 6e 74 20   *zClass;.  int 
11cd0 6e 43 6c 61 73 73 3b 0a 20 20 69 6e 74 20 72 63  nClass;.  int rc
11ce0 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 61  ;..  if( pCur->a
11cf0 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 20 72  ==0 || p->rc ) r
11d00 65 74 75 72 6e 3b 20 20 20 2f 2a 20 50 72 69 6f  eturn;   /* Prio
11d10 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  r memory allocat
11d20 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  ion failure */. 
11d30 20 7a 43 6c 61 73 73 20 3d 20 28 63 68 61 72 2a   zClass = (char*
11d40 29 70 68 6f 6e 65 74 69 63 48 61 73 68 28 28 75  )phoneticHash((u
11d50 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 51  nsigned char*)zQ
11d60 75 65 72 79 2c 20 6e 51 75 65 72 79 29 3b 0a 20  uery, nQuery);. 
11d70 20 69 66 28 20 7a 43 6c 61 73 73 3d 3d 30 20 29   if( zClass==0 )
11d80 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
11d90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11da0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 43  return;.  }.  nC
11db0 6c 61 73 73 20 3d 20 28 69 6e 74 29 73 74 72 6c  lass = (int)strl
11dc0 65 6e 28 7a 43 6c 61 73 73 29 3b 0a 20 20 69 66  en(zClass);.  if
11dd0 28 20 6e 43 6c 61 73 73 3e 53 50 45 4c 4c 46 49  ( nClass>SPELLFI
11de0 58 5f 4d 58 5f 48 41 53 48 2d 32 20 29 7b 0a 20  X_MX_HASH-2 ){. 
11df0 20 20 20 6e 43 6c 61 73 73 20 3d 20 53 50 45 4c     nClass = SPEL
11e00 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 3b 0a  LFIX_MX_HASH-2;.
11e10 20 20 20 20 7a 43 6c 61 73 73 5b 6e 43 6c 61 73      zClass[nClas
11e20 73 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  s] = 0;.  }.  if
11e30 28 20 6e 43 6c 61 73 73 3c 3d 69 53 63 6f 70 65  ( nClass<=iScope
11e40 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 43 6c 61   ){.    if( nCla
11e50 73 73 3e 32 20 29 7b 0a 20 20 20 20 20 20 69 53  ss>2 ){.      iS
11e60 63 6f 70 65 20 3d 20 6e 43 6c 61 73 73 2d 31 3b  cope = nClass-1;
11e70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11e80 20 20 69 53 63 6f 70 65 20 3d 20 6e 43 6c 61 73    iScope = nClas
11e90 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d  s;.    }.  }.  m
11ea0 65 6d 63 70 79 28 7a 48 61 73 68 31 2c 20 7a 43  emcpy(zHash1, zC
11eb0 6c 61 73 73 2c 20 69 53 63 6f 70 65 29 3b 0a 20  lass, iScope);. 
11ec0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
11ed0 6c 61 73 73 29 3b 0a 20 20 7a 48 61 73 68 31 5b  lass);.  zHash1[
11ee0 69 53 63 6f 70 65 5d 20 3d 20 30 3b 0a 20 20 6d  iScope] = 0;.  m
11ef0 65 6d 63 70 79 28 7a 48 61 73 68 32 2c 20 7a 48  emcpy(zHash2, zH
11f00 61 73 68 31 2c 20 69 53 63 6f 70 65 29 3b 0a 20  ash1, iScope);. 
11f10 20 7a 48 61 73 68 32 5b 69 53 63 6f 70 65 5d 20   zHash2[iScope] 
11f20 3d 20 27 5a 27 3b 0a 20 20 7a 48 61 73 68 32 5b  = 'Z';.  zHash2[
11f30 69 53 63 6f 70 65 2b 31 5d 20 3d 20 30 3b 0a 23  iScope+1] = 0;.#
11f40 69 66 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52  if SPELLFIX_MX_R
11f50 55 4e 3e 31 0a 20 20 66 6f 72 28 69 3d 30 3b 20  UN>1.  for(i=0; 
11f60 69 3c 70 2d 3e 6e 52 75 6e 3b 20 69 2b 2b 29 7b  i<p->nRun; i++){
11f70 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
11f80 70 2d 3e 61 7a 50 72 69 6f 72 5b 69 5d 2c 20 7a  p->azPrior[i], z
11f90 48 61 73 68 31 29 3d 3d 30 20 29 20 72 65 74 75  Hash1)==0 ) retu
11fa0 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
11fb0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 75 6e   assert( p->nRun
11fc0 3c 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e  <SPELLFIX_MX_RUN
11fd0 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e   );.  memcpy(p->
11fe0 61 7a 50 72 69 6f 72 5b 70 2d 3e 6e 52 75 6e 2b  azPrior[p->nRun+
11ff0 2b 5d 2c 20 7a 48 61 73 68 31 2c 20 69 53 63 6f  +], zHash1, iSco
12000 70 65 2b 31 29 3b 0a 20 20 69 66 28 20 73 71 6c  pe+1);.  if( sql
12010 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
12020 53 74 6d 74 2c 20 31 2c 20 7a 48 61 73 68 31 2c  Stmt, 1, zHash1,
12030 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
12040 49 43 29 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  IC)==SQLITE_NOME
12050 4d 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f  M.   || sqlite3_
12060 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
12070 20 32 2c 20 7a 48 61 73 68 32 2c 20 2d 31 2c 20   2, zHash2, -1, 
12080 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3d 3d  SQLITE_STATIC)==
12090 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 29  SQLITE_NOMEM.  )
120a0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
120b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
120c0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 69 66 20  return;.  }.#if 
120d0 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 3e  SPELLFIX_MX_RUN>
120e0 31 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  1.  for(i=0; i<p
120f0 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b  Cur->nRow; i++){
12100 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
12110 5b 69 5d 2e 69 53 63 6f 72 65 3e 69 57 6f 72 73  [i].iScore>iWors
12120 74 20 29 7b 0a 20 20 20 20 20 20 69 57 6f 72 73  t ){.      iWors
12130 74 20 3d 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69  t = pCur->a[i].i
12140 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 69 64 78  Score;.      idx
12150 57 6f 72 73 74 20 3d 20 69 3b 0a 20 20 20 20 7d  Worst = i;.    }
12160 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
12170 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
12180 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
12190 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
121a0 69 4d 61 74 63 68 6c 65 6e 20 3d 20 2d 31 3b 0a  iMatchlen = -1;.
121b0 20 20 20 20 69 52 61 6e 6b 20 3d 20 73 71 6c 69      iRank = sqli
121c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
121d0 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 66  Stmt, 2);.    if
121e0 28 20 70 2d 3e 70 4d 61 74 63 68 53 74 72 33 20  ( p->pMatchStr3 
121f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 6f  ){.      int nWo
12200 72 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rd = sqlite3_col
12210 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
12220 20 31 29 3b 0a 20 20 20 20 20 20 7a 57 6f 72 64   1);.      zWord
12230 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
12240 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
12250 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  ext(pStmt, 1);. 
12260 20 20 20 20 20 69 44 69 73 74 20 3d 20 65 64 69       iDist = edi
12270 74 44 69 73 74 33 43 6f 72 65 28 70 2d 3e 70 4d  tDist3Core(p->pM
12280 61 74 63 68 53 74 72 33 2c 20 7a 57 6f 72 64 2c  atchStr3, zWord,
12290 20 6e 57 6f 72 64 2c 20 70 2d 3e 70 4c 61 6e 67   nWord, p->pLang
122a0 2c 20 26 69 4d 61 74 63 68 6c 65 6e 29 3b 0a 20  , &iMatchlen);. 
122b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
122c0 7a 4b 31 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zK1 = (const cha
122d0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
122e0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33 29  n_text(pStmt, 3)
122f0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4b 31 3d  ;.      if( zK1=
12300 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12310 20 20 20 20 20 69 44 69 73 74 20 3d 20 65 64 69       iDist = edi
12320 74 64 69 73 74 31 28 70 2d 3e 7a 50 61 74 74 65  tdist1(p->zPatte
12330 72 6e 2c 20 7a 4b 31 2c 20 30 29 3b 0a 20 20 20  rn, zK1, 0);.   
12340 20 7d 0a 20 20 20 20 69 66 28 20 69 44 69 73 74   }.    if( iDist
12350 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  <0 ){.      p->r
12360 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
12370 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12380 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 6e     }.    pCur->n
12390 53 65 61 72 63 68 2b 2b 3b 0a 20 20 20 20 69 53  Search++;.    iS
123a0 63 6f 72 65 20 3d 20 73 70 65 6c 6c 66 69 78 31  core = spellfix1
123b0 53 63 6f 72 65 28 69 44 69 73 74 2c 69 52 61 6e  Score(iDist,iRan
123c0 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  k);.    if( p->i
123d0 4d 61 78 44 69 73 74 3e 3d 30 20 29 7b 0a 20 20  MaxDist>=0 ){.  
123e0 20 20 20 20 69 66 28 20 69 44 69 73 74 3e 70 2d      if( iDist>p-
123f0 3e 69 4d 61 78 44 69 73 74 20 29 20 63 6f 6e 74  >iMaxDist ) cont
12400 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
12410 70 43 75 72 2d 3e 6e 52 6f 77 3e 3d 70 43 75 72  pCur->nRow>=pCur
12420 2d 3e 6e 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20  ->nAlloc-1 ){.  
12430 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31 52        spellfix1R
12440 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72  esizeCursor(pCur
12450 2c 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 2a 32  , pCur->nAlloc*2
12460 20 2b 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20   + 10);.        
12470 69 66 28 20 70 43 75 72 2d 3e 61 3d 3d 30 20 29  if( pCur->a==0 )
12480 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12490 20 20 20 20 20 20 69 64 78 20 3d 20 70 43 75 72        idx = pCur
124a0 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73  ->nRow;.    }els
124b0 65 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77  e if( pCur->nRow
124c0 3c 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  <pCur->nAlloc ){
124d0 0a 20 20 20 20 20 20 69 64 78 20 3d 20 70 43 75  .      idx = pCu
124e0 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 7d 65 6c  r->nRow;.    }el
124f0 73 65 20 69 66 28 20 69 53 63 6f 72 65 3c 69 57  se if( iScore<iW
12500 6f 72 73 74 20 29 7b 0a 20 20 20 20 20 20 69 64  orst ){.      id
12510 78 20 3d 20 69 64 78 57 6f 72 73 74 3b 0a 20 20  x = idxWorst;.  
12520 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12530 28 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57  (pCur->a[idx].zW
12540 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ord);.    }else{
12550 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
12560 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
12570 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64 20 3d 20  >a[idx].zWord = 
12580 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12590 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  "%s", sqlite3_co
125a0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
125b0 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1));.    if( pC
125c0 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64  ur->a[idx].zWord
125d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
125e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
125f0 4d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  M;.      break;.
12600 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
12610 61 5b 69 64 78 5d 2e 69 52 6f 77 69 64 20 3d 20  a[idx].iRowid = 
12620 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
12630 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a  nt64(pStmt, 0);.
12640 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d      pCur->a[idx]
12650 2e 69 52 61 6e 6b 20 3d 20 69 52 61 6e 6b 3b 0a  .iRank = iRank;.
12660 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d      pCur->a[idx]
12670 2e 69 44 69 73 74 61 6e 63 65 20 3d 20 69 44 69  .iDistance = iDi
12680 73 74 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b  st;.    pCur->a[
12690 69 64 78 5d 2e 69 53 63 6f 72 65 20 3d 20 69 53  idx].iScore = iS
126a0 63 6f 72 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e  core;.    pCur->
126b0 61 5b 69 64 78 5d 2e 69 4d 61 74 63 68 6c 65 6e  a[idx].iMatchlen
126c0 20 3d 20 69 4d 61 74 63 68 6c 65 6e 3b 0a 20 20   = iMatchlen;.  
126d0 20 20 6d 65 6d 63 70 79 28 70 43 75 72 2d 3e 61    memcpy(pCur->a
126e0 5b 69 64 78 5d 2e 7a 48 61 73 68 2c 20 7a 48 61  [idx].zHash, zHa
126f0 73 68 31 2c 20 69 53 63 6f 70 65 2b 31 29 3b 0a  sh1, iScope+1);.
12700 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 52      if( pCur->nR
12710 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20  ow<pCur->nAlloc 
12720 29 20 70 43 75 72 2d 3e 6e 52 6f 77 2b 2b 3b 0a  ) pCur->nRow++;.
12730 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 52      if( pCur->nR
12740 6f 77 3d 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63  ow==pCur->nAlloc
12750 20 29 7b 0a 20 20 20 20 20 20 69 57 6f 72 73 74   ){.      iWorst
12760 20 3d 20 70 43 75 72 2d 3e 61 5b 30 5d 2e 69 53   = pCur->a[0].iS
12770 63 6f 72 65 3b 0a 20 20 20 20 20 20 69 64 78 57  core;.      idxW
12780 6f 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  orst = 0;.      
12790 66 6f 72 28 69 3d 31 3b 20 69 3c 70 43 75 72 2d  for(i=1; i<pCur-
127a0 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nRow; i++){.   
127b0 20 20 20 20 20 69 53 63 6f 72 65 20 3d 20 70 43       iScore = pC
127c0 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72 65 3b  ur->a[i].iScore;
127d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 57 6f  .        if( iWo
127e0 72 73 74 3c 69 53 63 6f 72 65 20 29 7b 0a 20 20  rst<iScore ){.  
127f0 20 20 20 20 20 20 20 20 69 57 6f 72 73 74 20 3d          iWorst =
12800 20 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 20   iScore;.       
12810 20 20 20 69 64 78 57 6f 72 73 74 20 3d 20 69 3b     idxWorst = i;
12820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12830 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
12840 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
12850 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
12860 72 63 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b  rc ) p->rc = rc;
12870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  .}../*.** This v
12880 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 78 46  ersion of the xF
12890 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 77 6f 72  ilter method wor
128a0 6b 20 69 66 20 74 68 65 20 4d 41 54 43 48 20 74  k if the MATCH t
128b0 65 72 6d 20 69 73 20 70 72 65 73 65 6e 74 0a 2a  erm is present.*
128c0 2a 20 61 6e 64 20 77 65 20 61 72 65 20 64 6f 69  * and we are doi
128d0 6e 67 20 61 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74  ng a scan..*/.st
128e0 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69  atic int spellfi
128f0 78 31 46 69 6c 74 65 72 46 6f 72 4d 61 74 63 68  x1FilterForMatch
12900 28 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  (.  spellfix1_cu
12910 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 69 6e  rsor *pCur,.  in
12920 74 20 69 64 78 4e 75 6d 2c 0a 20 20 69 6e 74 20  t idxNum,.  int 
12930 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
12940 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
12950 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
12960 20 63 68 61 72 20 2a 7a 4d 61 74 63 68 54 68 69   char *zMatchThi
12970 73 3b 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 74  s;   /* RHS of t
12980 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f  he MATCH operato
12990 72 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33  r */.  EditDist3
129a0 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 4d 61 74  FromString *pMat
129b0 63 68 53 74 72 33 20 3d 20 30 3b 20 2f 2a 20 7a  chStr3 = 0; /* z
129c0 4d 61 74 63 68 54 68 69 73 20 61 73 20 61 6e 20  MatchThis as an 
129d0 65 64 69 74 64 69 73 74 20 73 74 72 69 6e 67 20  editdist string 
129e0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 74  */.  char *zPatt
129f0 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ern;            
12a00 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
12a10 6c 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 7a 4d  literation of zM
12a20 61 74 63 68 54 68 69 73 20 2a 2f 0a 20 20 69 6e  atchThis */.  in
12a30 74 20 6e 50 61 74 74 65 72 6e 3b 20 20 20 20 20  t nPattern;     
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 50   /* Length of zP
12a60 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  attern */.  int 
12a70 69 4c 69 6d 69 74 20 3d 20 32 30 3b 20 20 20 20  iLimit = 20;    
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12a90 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20  * Max number of 
12aa0 72 6f 77 73 20 6f 66 20 6f 75 74 70 75 74 20 2a  rows of output *
12ab0 2f 0a 20 20 69 6e 74 20 69 53 63 6f 70 65 20 3d  /.  int iScope =
12ac0 20 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   3;             
12ad0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
12ae0 69 73 20 6d 61 6e 79 20 63 68 61 72 61 63 74 65  is many characte
12af0 72 73 20 6f 66 20 7a 43 6c 61 73 73 20 2a 2f 0a  rs of zClass */.
12b00 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 30 3b    int iLang = 0;
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65       /* Language
12b30 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
12b40 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12b60 20 53 51 4c 20 6f 66 20 73 68 61 64 6f 77 20 74   SQL of shadow t
12b70 61 62 6c 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  able query */.  
12b80 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
12b90 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
12ba0 20 20 20 2f 2a 20 53 68 61 64 6f 77 20 74 61 62     /* Shadow tab
12bb0 6c 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  le query */.  in
12bc0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12bf0 2a 2f 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 31  */.  int idx = 1
12c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c10 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
12c20 61 76 61 69 6c 61 62 6c 65 20 66 69 6c 74 65 72  available filter
12c30 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
12c40 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a  spellfix1_vtab *
12c50 70 20 3d 20 70 43 75 72 2d 3e 70 56 54 61 62 3b  p = pCur->pVTab;
12c60 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
12c70 6c 20 74 61 62 6c 65 20 74 68 61 74 20 6f 77 6e  l table that own
12c80 73 20 70 43 75 72 20 2a 2f 0a 20 20 4d 61 74 63  s pCur */.  Matc
12c90 68 51 75 65 72 79 20 78 3b 20 20 20 20 20 20 20  hQuery x;       
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12cb0 2a 20 46 6f 72 20 70 61 73 73 69 6e 67 20 69 6e  * For passing in
12cc0 66 6f 20 74 6f 20 52 75 6e 51 75 65 72 79 28 29  fo to RunQuery()
12cd0 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74   */..  /* Load t
12ce0 68 65 20 63 6f 73 74 20 74 61 62 6c 65 20 69 66  he cost table if
12cf0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72   we have not alr
12d00 65 61 64 79 20 64 6f 6e 65 20 73 6f 20 2a 2f 0a  eady done so */.
12d10 20 20 69 66 28 20 70 2d 3e 7a 43 6f 73 74 54 61    if( p->zCostTa
12d20 62 6c 65 21 3d 30 20 26 26 20 70 2d 3e 70 43 6f  ble!=0 && p->pCo
12d30 6e 66 69 67 33 3d 3d 30 20 29 7b 0a 20 20 20 20  nfig3==0 ){.    
12d40 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d 20 73 71  p->pConfig3 = sq
12d50 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
12d60 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e 66 69 67 33  zeof(p->pConfig3
12d70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
12d80 70 2d 3e 70 43 6f 6e 66 69 67 33 3d 3d 30 20 29  p->pConfig3==0 )
12d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12da0 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  OMEM;.    memset
12db0 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 30 2c  (p->pConfig3, 0,
12dc0 20 73 69 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e 66   sizeof(p->pConf
12dd0 69 67 33 5b 30 5d 29 29 3b 0a 20 20 20 20 72 63  ig3[0]));.    rc
12de0 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66   = editDist3Conf
12df0 69 67 4c 6f 61 64 28 70 2d 3e 70 43 6f 6e 66 69  igLoad(p->pConfi
12e00 67 33 2c 20 70 2d 3e 64 62 2c 20 70 2d 3e 7a 43  g3, p->db, p->zC
12e10 6f 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  ostTable);.    i
12e20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12e30 63 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  c;.  }.  memset(
12e40 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29  &x, 0, sizeof(x)
12e50 29 3b 0a 20 20 78 2e 69 53 63 6f 70 65 20 3d 20  );.  x.iScope = 
12e60 33 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 73  3;  /* Default s
12e70 63 6f 70 65 20 69 66 20 6e 6f 6e 65 20 73 70 65  cope if none spe
12e80 63 69 66 69 65 64 20 62 79 20 22 57 48 45 52 45  cified by "WHERE
12e90 20 73 63 6f 70 65 3d 4e 22 20 2a 2f 0a 20 20 78   scope=N" */.  x
12ea0 2e 69 4d 61 78 44 69 73 74 20 3d 20 2d 31 3b 20  .iMaxDist = -1; 
12eb0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
12ec0 6f 77 65 64 20 65 64 69 74 20 64 69 73 74 61 6e  owed edit distan
12ed0 63 65 20 2a 2f 0a 0a 20 20 69 66 28 20 69 64 78  ce */..  if( idx
12ee0 4e 75 6d 26 32 20 29 7b 0a 20 20 20 20 69 4c 61  Num&2 ){.    iLa
12ef0 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ng = sqlite3_val
12f00 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78 2b  ue_int(argv[idx+
12f10 2b 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  +]);.  }.  if( i
12f20 64 78 4e 75 6d 26 34 20 29 7b 0a 20 20 20 20 69  dxNum&4 ){.    i
12f30 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f  Limit = sqlite3_
12f40 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 69  value_int(argv[i
12f50 64 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28 20  dx++]);.    if( 
12f60 69 4c 69 6d 69 74 3c 31 20 29 20 69 4c 69 6d 69  iLimit<1 ) iLimi
12f70 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 1;.  }.  if(
12f80 20 69 64 78 4e 75 6d 26 38 20 29 7b 0a 20 20 20   idxNum&8 ){.   
12f90 20 78 2e 69 53 63 6f 70 65 20 3d 20 73 71 6c 69   x.iScope = sqli
12fa0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
12fb0 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 20 20  gv[idx++]);.    
12fc0 69 66 28 20 78 2e 69 53 63 6f 70 65 3c 31 20 29  if( x.iScope<1 )
12fd0 20 78 2e 69 53 63 6f 70 65 20 3d 20 31 3b 0a 20   x.iScope = 1;. 
12fe0 20 20 20 69 66 28 20 78 2e 69 53 63 6f 70 65 3e     if( x.iScope>
12ff0 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48  SPELLFIX_MX_HASH
13000 2d 32 20 29 20 78 2e 69 53 63 6f 70 65 20 3d 20  -2 ) x.iScope = 
13010 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48  SPELLFIX_MX_HASH
13020 2d 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64  -2;.  }.  if( id
13030 78 4e 75 6d 26 28 31 36 7c 33 32 29 20 29 7b 0a  xNum&(16|32) ){.
13040 20 20 20 20 78 2e 69 4d 61 78 44 69 73 74 20 3d      x.iMaxDist =
13050 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
13060 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b  nt(argv[idx++]);
13070 0a 20 20 20 20 69 66 28 20 69 64 78 4e 75 6d 26  .    if( idxNum&
13080 31 36 20 29 20 78 2e 69 4d 61 78 44 69 73 74 2d  16 ) x.iMaxDist-
13090 2d 3b 0a 20 20 20 20 69 66 28 20 78 2e 69 4d 61  -;.    if( x.iMa
130a0 78 44 69 73 74 3c 30 20 29 20 78 2e 69 4d 61 78  xDist<0 ) x.iMax
130b0 44 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Dist = 0;.  }.  
130c0 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43 75  spellfix1ResetCu
130d0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 73 70  rsor(pCur);.  sp
130e0 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75 72  ellfix1ResizeCur
130f0 73 6f 72 28 70 43 75 72 2c 20 69 4c 69 6d 69 74  sor(pCur, iLimit
13100 29 3b 0a 20 20 7a 4d 61 74 63 68 54 68 69 73 20  );.  zMatchThis 
13110 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13120 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
13130 20 69 66 28 20 7a 4d 61 74 63 68 54 68 69 73 3d   if( zMatchThis=
13140 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13150 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
13160 70 43 6f 6e 66 69 67 33 20 29 7b 0a 20 20 20 20  pConfig3 ){.    
13170 78 2e 70 4c 61 6e 67 20 3d 20 65 64 69 74 44 69  x.pLang = editDi
13180 73 74 33 46 69 6e 64 4c 61 6e 67 28 70 2d 3e 70  st3FindLang(p->p
13190 43 6f 6e 66 69 67 33 2c 20 69 4c 61 6e 67 29 3b  Config3, iLang);
131a0 0a 20 20 20 20 70 4d 61 74 63 68 53 74 72 33 20  .    pMatchStr3 
131b0 3d 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53  = editDist3FromS
131c0 74 72 69 6e 67 4e 65 77 28 78 2e 70 4c 61 6e 67  tringNew(x.pLang
131d0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
131e0 4d 61 74 63 68 54 68 69 73 2c 20 2d 31 29 3b 0a  MatchThis, -1);.
131f0 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 53 74      if( pMatchSt
13200 72 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78  r3==0 ){.      x
13210 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  .rc = SQLITE_NOM
13220 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  EM;.      goto f
13230 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20 20 20 20  ilter_exit;.    
13240 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  }.  }else{.    x
13250 2e 70 4c 61 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  .pLang = 0;.  }.
13260 20 20 7a 50 61 74 74 65 72 6e 20 3d 20 28 63 68    zPattern = (ch
13270 61 72 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74  ar*)transliterat
13280 65 28 7a 4d 61 74 63 68 54 68 69 73 2c 20 73 71  e(zMatchThis, sq
13290 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
132a0 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 73  s(argv[0]));.  s
132b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
132c0 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 70  ->zPattern);.  p
132d0 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 20 3d 20  Cur->zPattern = 
132e0 7a 50 61 74 74 65 72 6e 3b 0a 20 20 69 66 28 20  zPattern;.  if( 
132f0 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20  zPattern==0 ){. 
13300 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49 54 45     x.rc = SQLITE
13310 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
13320 20 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20 20   filter_exit;.  
13330 7d 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 28  }.  nPattern = (
13340 69 6e 74 29 73 74 72 6c 65 6e 28 7a 50 61 74 74  int)strlen(zPatt
13350 65 72 6e 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  ern);.  if( zPat
13360 74 65 72 6e 5b 6e 50 61 74 74 65 72 6e 2d 31 5d  tern[nPattern-1]
13370 3d 3d 27 2a 27 20 29 20 6e 50 61 74 74 65 72 6e  =='*' ) nPattern
13380 2d 2d 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  --;.  zSql = sql
13390 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
133a0 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 20 77     "SELECT id, w
133b0 6f 72 64 2c 20 72 61 6e 6b 2c 20 6b 31 22 0a 20  ord, rank, k1". 
133c0 20 20 20 20 22 20 20 46 52 4f 4d 20 5c 22 25 77      "  FROM \"%w
133d0 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22  \".\"%w_vocab\""
133e0 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 6c 61  .     " WHERE la
133f0 6e 67 69 64 3d 25 64 20 41 4e 44 20 6b 32 3e 3d  ngid=%d AND k2>=
13400 3f 31 20 41 4e 44 20 6b 32 3c 3f 32 22 2c 0a 20  ?1 AND k2<?2",. 
13410 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20      p->zDbName, 
13420 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 69  p->zTableName, i
13430 4c 61 6e 67 0a 20 20 29 3b 0a 20 20 69 66 28 20  Lang.  );.  if( 
13440 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 78  zSql==0 ){.    x
13450 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  .rc = SQLITE_NOM
13460 45 4d 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20  EM;.    pStmt = 
13470 30 3b 0a 20 20 20 20 67 6f 74 6f 20 66 69 6c 74  0;.    goto filt
13480 65 72 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 72  er_exit;.  }.  r
13490 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
134a0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
134b0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
134c0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
134d0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 70 43 75 72  ee(zSql);.  pCur
134e0 2d 3e 69 4c 61 6e 67 20 3d 20 69 4c 61 6e 67 3b  ->iLang = iLang;
134f0 0a 20 20 78 2e 70 43 75 72 20 3d 20 70 43 75 72  .  x.pCur = pCur
13500 3b 0a 20 20 78 2e 70 53 74 6d 74 20 3d 20 70 53  ;.  x.pStmt = pS
13510 74 6d 74 3b 0a 20 20 78 2e 7a 50 61 74 74 65 72  tmt;.  x.zPatter
13520 6e 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a 20 20  n = zPattern;.  
13530 78 2e 6e 50 61 74 74 65 72 6e 20 3d 20 6e 50 61  x.nPattern = nPa
13540 74 74 65 72 6e 3b 0a 20 20 78 2e 70 4d 61 74 63  ttern;.  x.pMatc
13550 68 53 74 72 33 20 3d 20 70 4d 61 74 63 68 53 74  hStr3 = pMatchSt
13560 72 33 3b 0a 20 20 78 2e 69 4c 61 6e 67 20 3d 20  r3;.  x.iLang = 
13570 69 4c 61 6e 67 3b 0a 20 20 78 2e 72 63 20 3d 20  iLang;.  x.rc = 
13580 72 63 3b 0a 20 20 78 2e 70 43 6f 6e 66 69 67 33  rc;.  x.pConfig3
13590 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 33 3b 0a   = p->pConfig3;.
135a0 20 20 69 66 28 20 78 2e 72 63 3d 3d 53 51 4c 49    if( x.rc==SQLI
135b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 70 65  TE_OK ){.    spe
135c0 6c 6c 66 69 78 31 52 75 6e 51 75 65 72 79 28 26  llfix1RunQuery(&
135d0 78 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61  x, zPattern, nPa
135e0 74 74 65 72 6e 29 3b 0a 20 20 7d 0a 0a 20 20 69  ttern);.  }..  i
135f0 66 28 20 70 43 75 72 2d 3e 61 20 29 7b 0a 20 20  f( pCur->a ){.  
13600 20 20 71 73 6f 72 74 28 70 43 75 72 2d 3e 61 2c    qsort(pCur->a,
13610 20 70 43 75 72 2d 3e 6e 52 6f 77 2c 20 73 69 7a   pCur->nRow, siz
13620 65 6f 66 28 70 43 75 72 2d 3e 61 5b 30 5d 29 2c  eof(pCur->a[0]),
13630 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 43 6f 6d   spellfix1RowCom
13640 70 61 72 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  pare);.    pCur-
13650 3e 69 54 6f 70 20 3d 20 69 4c 69 6d 69 74 3b 0a  >iTop = iLimit;.
13660 20 20 20 20 70 43 75 72 2d 3e 69 53 63 6f 70 65      pCur->iScope
13670 20 3d 20 69 53 63 6f 70 65 3b 0a 20 20 7d 65 6c   = iScope;.  }el
13680 73 65 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20 53  se{.    x.rc = S
13690 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
136a0 0a 0a 66 69 6c 74 65 72 5f 65 78 69 74 3a 0a 20  ..filter_exit:. 
136b0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
136c0 65 28 70 53 74 6d 74 29 3b 0a 20 20 65 64 69 74  e(pStmt);.  edit
136d0 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 44  Dist3FromStringD
136e0 65 6c 65 74 65 28 70 4d 61 74 63 68 53 74 72 33  elete(pMatchStr3
136f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 2e 72 63  );.  return x.rc
13700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13710 76 65 72 73 69 6f 6e 20 6f 66 20 78 46 69 6c 74  version of xFilt
13720 65 72 20 68 61 6e 64 6c 65 73 20 61 20 66 75 6c  er handles a ful
13730 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 63 61 73  l-table scan cas
13740 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
13750 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46  spellfix1FilterF
13760 6f 72 46 75 6c 6c 53 63 61 6e 28 0a 20 20 73 70  orFullScan(.  sp
13770 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
13780 70 43 75 72 2c 0a 20 20 69 6e 74 20 69 64 78 4e  pCur,.  int idxN
13790 75 6d 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  um,.  int argc,.
137a0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
137b0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
137c0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  rc;.  char *zSql
137d0 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  ;.  spellfix1_vt
137e0 61 62 20 2a 70 56 54 61 62 20 3d 20 70 43 75 72  ab *pVTab = pCur
137f0 2d 3e 70 56 54 61 62 3b 0a 20 20 73 70 65 6c 6c  ->pVTab;.  spell
13800 66 69 78 31 52 65 73 65 74 43 75 72 73 6f 72 28  fix1ResetCursor(
13810 70 43 75 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  pCur);.  zSql = 
13820 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
13830 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 77 6f  .     "SELECT wo
13840 72 64 2c 20 72 61 6e 6b 2c 20 4e 55 4c 4c 2c 20  rd, rank, NULL, 
13850 6c 61 6e 67 69 64 2c 20 69 64 20 46 52 4f 4d 20  langid, id FROM 
13860 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
13870 62 5c 22 22 2c 0a 20 20 20 20 20 70 56 54 61 62  b\"",.     pVTab
13880 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 56 54 61 62  ->zDbName, pVTab
13890 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  ->zTableName);. 
138a0 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
138b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
138c0 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  EM;.  rc = sqlit
138d0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 56  e3_prepare_v2(pV
138e0 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  Tab->db, zSql, -
138f0 31 2c 20 26 70 43 75 72 2d 3e 70 46 75 6c 6c 53  1, &pCur->pFullS
13900 63 61 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  can, 0);.  sqlit
13910 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
13920 20 70 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 70 43   pCur->nRow = pC
13930 75 72 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20  ur->iRow = 0;.  
13940 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13950 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
13960 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d  lite3_step(pCur-
13970 3e 70 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20 20  >pFullScan);.   
13980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13990 52 4f 57 20 29 7b 20 70 43 75 72 2d 3e 69 52 6f  ROW ){ pCur->iRo
139a0 77 20 3d 20 2d 31 3b 20 72 63 20 3d 20 53 51 4c  w = -1; rc = SQL
139b0 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 20 20 69 66  ITE_OK; }.    if
139c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
139d0 45 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45  E ){ rc = SQLITE
139e0 5f 4f 4b 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  _OK; }.  }else{.
139f0 20 20 20 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d      pCur->iRow =
13a00 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
13a10 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
13a20 61 6c 6c 65 64 20 74 6f 20 22 72 65 77 69 6e 64  alled to "rewind
13a30 22 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  " a cursor back 
13a40 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
13a50 20 73 6f 20 74 68 61 74 0a 2a 2a 20 69 74 20 73   so that.** it s
13a60 74 61 72 74 73 20 69 74 73 20 6f 75 74 70 75 74  tarts its output
13a70 20 6f 76 65 72 20 61 67 61 69 6e 2e 20 20 41 6c   over again.  Al
13a80 77 61 79 73 20 63 61 6c 6c 65 64 20 61 74 20 6c  ways called at l
13a90 65 61 73 74 20 6f 6e 63 65 0a 2a 2a 20 70 72 69  east once.** pri
13aa0 6f 72 20 74 6f 20 61 6e 79 20 73 70 65 6c 6c 66  or to any spellf
13ab0 69 78 31 43 6f 6c 75 6d 6e 2c 20 73 70 65 6c 6c  ix1Column, spell
13ac0 66 69 78 31 52 6f 77 69 64 2c 20 6f 72 20 73 70  fix1Rowid, or sp
13ad0 65 6c 6c 66 69 78 31 45 6f 66 20 63 61 6c 6c 2e  ellfix1Eof call.
13ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13af0 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 28 0a  pellfix1Filter(.
13b00 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
13b10 75 72 73 6f 72 20 2a 63 75 72 2c 20 0a 20 20 69  ursor *cur, .  i
13b20 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74  nt idxNum, const
13b30 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20   char *idxStr,. 
13b40 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
13b50 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
13b60 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63  ){.  spellfix1_c
13b70 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73  ursor *pCur = (s
13b80 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
13b90 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b  *)cur;.  int rc;
13ba0 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20  .  if( idxNum & 
13bb0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 70  1 ){.    rc = sp
13bc0 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72  ellfix1FilterFor
13bd0 4d 61 74 63 68 28 70 43 75 72 2c 20 69 64 78 4e  Match(pCur, idxN
13be0 75 6d 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  um, argc, argv);
13bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
13c00 20 3d 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74   = spellfix1Filt
13c10 65 72 46 6f 72 46 75 6c 6c 53 63 61 6e 28 70 43  erForFullScan(pC
13c20 75 72 2c 20 69 64 78 4e 75 6d 2c 20 61 72 67 63  ur, idxNum, argc
13c30 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 20 20 72  , argv);.  }.  r
13c40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
13c50 0a 2a 2a 20 41 64 76 61 6e 63 65 20 61 20 63 75  .** Advance a cu
13c60 72 73 6f 72 20 74 6f 20 69 74 73 20 6e 65 78 74  rsor to its next
13c70 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 0a 2a   row of output.*
13c80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
13c90 6c 6c 66 69 78 31 4e 65 78 74 28 73 71 6c 69 74  llfix1Next(sqlit
13ca0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
13cb0 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  cur){.  spellfix
13cc0 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  1_cursor *pCur =
13cd0 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73   (spellfix1_curs
13ce0 6f 72 20 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20  or *)cur;.  int 
13cf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13d00 20 20 69 66 28 20 70 43 75 72 2d 3e 69 52 6f 77    if( pCur->iRow
13d10 20 3c 20 70 43 75 72 2d 3e 6e 52 6f 77 20 29 7b   < pCur->nRow ){
13d20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
13d30 46 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20  FullScan ){.    
13d40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
13d50 74 65 70 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53  tep(pCur->pFullS
13d60 63 61 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  can);.      if( 
13d70 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
13d80 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 70 43   pCur->iRow = pC
13d90 75 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  ur->nRow;.      
13da0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
13db0 4f 57 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OW || rc==SQLITE
13dc0 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
13dd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
13de0 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  e{.      pCur->i
13df0 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Row++;.    }.  }
13e00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13e10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
13e20 55 45 20 69 66 20 77 65 20 61 72 65 20 61 74 20  UE if we are at 
13e30 74 68 65 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 0a  the end-of-file.
13e40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
13e50 65 6c 6c 66 69 78 31 45 6f 66 28 73 71 6c 69 74  ellfix1Eof(sqlit
13e60 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
13e70 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  cur){.  spellfix
13e80 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  1_cursor *pCur =
13e90 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73   (spellfix1_curs
13ea0 6f 72 20 2a 29 63 75 72 3b 0a 20 20 72 65 74 75  or *)cur;.  retu
13eb0 72 6e 20 70 43 75 72 2d 3e 69 52 6f 77 3e 3d 70  rn pCur->iRow>=p
13ec0 43 75 72 2d 3e 6e 52 6f 77 3b 0a 7d 0a 0a 2f 2a  Cur->nRow;.}../*
13ed0 0a 2a 2a 20 52 65 74 75 72 6e 20 63 6f 6c 75 6d  .** Return colum
13ee0 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ns from the curr
13ef0 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ent row..*/.stat
13f00 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
13f10 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
13f20 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
13f30 75 72 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ur,.  sqlite3_co
13f40 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e  ntext *ctx,.  in
13f50 74 20 69 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69  t i.){.  spellfi
13f60 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  x1_cursor *pCur 
13f70 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  = (spellfix1_cur
13f80 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20  sor*)cur;.  if( 
13f90 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20  pCur->pFullScan 
13fa0 29 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d 53 50  ){.    if( i<=SP
13fb0 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49  ELLFIX_COL_LANGI
13fc0 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
13fd0 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
13fe0 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ctx, sqlite3_col
13ff0 75 6d 6e 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e  umn_value(pCur->
14000 70 46 75 6c 6c 53 63 61 6e 2c 20 69 29 29 3b 0a  pFullScan, i));.
14010 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14020 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14030 6e 75 6c 6c 28 63 74 78 29 3b 0a 20 20 20 20 7d  null(ctx);.    }
14040 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14050 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 77 69  TE_OK;.  }.  swi
14060 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61  tch( i ){.    ca
14070 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
14080 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  WORD: {.      sq
14090 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
140a0 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70  t(ctx, pCur->a[p
140b0 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64  Cur->iRow].zWord
140c0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
140d0 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  TIC);.      brea
140e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
140f0 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52  e SPELLFIX_COL_R
14100 41 4e 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ANK: {.      sql
14110 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
14120 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75  ctx, pCur->a[pCu
14130 72 2d 3e 69 52 6f 77 5d 2e 69 52 61 6e 6b 29 3b  r->iRow].iRank);
14140 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14150 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45    }.    case SPE
14160 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e  LLFIX_COL_DISTAN
14170 43 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CE: {.      sqli
14180 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
14190 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72  tx, pCur->a[pCur
141a0 2d 3e 69 52 6f 77 5d 2e 69 44 69 73 74 61 6e 63  ->iRow].iDistanc
141b0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
141c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
141d0 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e  SPELLFIX_COL_LAN
141e0 47 49 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  GID: {.      sql
141f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
14200 63 74 78 2c 20 70 43 75 72 2d 3e 69 4c 61 6e 67  ctx, pCur->iLang
14210 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14220 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14230 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52  PELLFIX_COL_SCOR
14240 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
14250 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
14260 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d  x, pCur->a[pCur-
14270 3e 69 52 6f 77 5d 2e 69 53 63 6f 72 65 29 3b 0a  >iRow].iScore);.
14280 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14290 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c   }.    case SPEL
142a0 4c 46 49 58 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45  LFIX_COL_MATCHLE
142b0 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  N: {.      int i
142c0 4d 61 74 63 68 6c 65 6e 20 3d 20 70 43 75 72 2d  Matchlen = pCur-
142d0 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69  >a[pCur->iRow].i
142e0 4d 61 74 63 68 6c 65 6e 3b 0a 20 20 20 20 20 20  Matchlen;.      
142f0 69 66 28 20 69 4d 61 74 63 68 6c 65 6e 3c 30 20  if( iMatchlen<0 
14300 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
14310 50 61 74 74 65 72 6e 20 3d 20 28 69 6e 74 29 73  Pattern = (int)s
14320 74 72 6c 65 6e 28 70 43 75 72 2d 3e 7a 50 61 74  trlen(pCur->zPat
14330 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 63  tern);.        c
14340 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 70 43 75  har *zWord = pCu
14350 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d  r->a[pCur->iRow]
14360 2e 7a 57 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  .zWord;.        
14370 69 6e 74 20 6e 57 6f 72 64 20 3d 20 28 69 6e 74  int nWord = (int
14380 29 73 74 72 6c 65 6e 28 7a 57 6f 72 64 29 3b 0a  )strlen(zWord);.
14390 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
143a0 74 74 65 72 6e 3e 30 20 26 26 20 70 43 75 72 2d  ttern>0 && pCur-
143b0 3e 7a 50 61 74 74 65 72 6e 5b 6e 50 61 74 74 65  >zPattern[nPatte
143c0 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20  rn-1]=='*' ){.  
143d0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
143e0 72 61 6e 73 6c 69 74 3b 0a 20 20 20 20 20 20 20  ranslit;.       
143f0 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
14400 20 20 20 20 20 20 7a 54 72 61 6e 73 6c 69 74 20        zTranslit 
14410 3d 20 28 63 68 61 72 20 2a 29 74 72 61 6e 73 6c  = (char *)transl
14420 69 74 65 72 61 74 65 28 28 75 6e 73 69 67 6e 65  iterate((unsigne
14430 64 20 63 68 61 72 20 2a 29 7a 57 6f 72 64 2c 20  d char *)zWord, 
14440 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  nWord);.        
14450 20 20 69 66 28 20 21 7a 54 72 61 6e 73 6c 69 74    if( !zTranslit
14460 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14470 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
14480 20 20 72 65 73 20 3d 20 65 64 69 74 64 69 73 74    res = editdist
14490 31 28 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e  1(pCur->zPattern
144a0 2c 20 7a 54 72 61 6e 73 6c 69 74 2c 20 26 69 4d  , zTranslit, &iM
144b0 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20  atchlen);.      
144c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
144d0 28 7a 54 72 61 6e 73 6c 69 74 29 3b 0a 20 20 20  (zTranslit);.   
144e0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30         if( res<0
144f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14500 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
14510 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 74 72    iMatchlen = tr
14520 61 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65  anslen_to_charle
14530 6e 28 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20  n(zWord, nWord, 
14540 69 4d 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20  iMatchlen);.    
14550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14560 20 20 20 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d       iMatchlen =
14570 20 75 74 66 38 43 68 61 72 6c 65 6e 28 7a 57 6f   utf8Charlen(zWo
14580 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20  rd, nWord);.    
14590 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
145a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
145b0 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 69 4d 61  ult_int(ctx, iMa
145c0 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62  tchlen);.      b
145d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
145e0 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  case SPELLFIX_CO
145f0 4c 5f 50 48 4f 4e 45 48 41 53 48 3a 20 7b 0a 20  L_PHONEHASH: {. 
14600 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
14610 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43  ult_text(ctx, pC
14620 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77  ur->a[pCur->iRow
14630 5d 2e 7a 48 61 73 68 2c 20 2d 31 2c 20 53 51 4c  ].zHash, -1, SQL
14640 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
14650 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14660 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49      case SPELLFI
14670 58 5f 43 4f 4c 5f 54 4f 50 3a 20 7b 0a 20 20 20  X_COL_TOP: {.   
14680 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
14690 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d  t_int(ctx, pCur-
146a0 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 62 72  >iTop);.      br
146b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
146c0 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ase SPELLFIX_COL
146d0 5f 53 43 4f 50 45 3a 20 7b 0a 20 20 20 20 20 20  _SCOPE: {.      
146e0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
146f0 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 69 53  nt(ctx, pCur->iS
14700 63 6f 70 65 29 3b 0a 20 20 20 20 20 20 62 72 65  cope);.      bre
14710 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14720 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
14730 53 52 43 48 43 4e 54 3a 20 7b 0a 20 20 20 20 20  SRCHCNT: {.     
14740 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14750 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 6e  int(ctx, pCur->n
14760 53 65 61 72 63 68 29 3b 0a 20 20 20 20 20 20 62  Search);.      b
14770 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14780 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
14790 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
147a0 6e 75 6c 6c 28 63 74 78 29 3b 0a 20 20 20 20 20  null(ctx);.     
147b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
147c0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
147d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
147e0 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61  he rowid..*/.sta
147f0 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
14800 31 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76  1Rowid(sqlite3_v
14810 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
14820 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
14830 52 6f 77 69 64 29 7b 0a 20 20 73 70 65 6c 6c 66  Rowid){.  spellf
14840 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
14850 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75   = (spellfix1_cu
14860 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66 28  rsor*)cur;.  if(
14870 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e   pCur->pFullScan
14880 20 29 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64 20   ){.    *pRowid 
14890 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
148a0 5f 69 6e 74 36 34 28 70 43 75 72 2d 3e 70 46 75  _int64(pCur->pFu
148b0 6c 6c 53 63 61 6e 2c 20 34 29 3b 0a 20 20 7d 65  llScan, 4);.  }e
148c0 6c 73 65 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64  lse{.    *pRowid
148d0 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d   = pCur->a[pCur-
148e0 3e 69 52 6f 77 5d 2e 69 52 6f 77 69 64 3b 0a 20  >iRow].iRowid;. 
148f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14900 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14910 54 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65  The xUpdate() me
14920 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
14930 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 55 70 64  int spellfix1Upd
14940 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ate(.  sqlite3_v
14950 74 61 62 20 2a 70 56 54 61 62 2c 0a 20 20 69 6e  tab *pVTab,.  in
14960 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
14970 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 2c 0a  3_value **argv,.
14980 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a    sqlite_int64 *
14990 70 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20  pRowid.){.  int 
149a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
149b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
149c0 72 6f 77 69 64 2c 20 6e 65 77 52 6f 77 69 64 3b  rowid, newRowid;
149d0 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  .  spellfix1_vta
149e0 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69 78  b *p = (spellfix
149f0 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a 20  1_vtab*)pVTab;. 
14a00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14a10 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67  ->db;..  if( arg
14a20 63 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41  c==1 ){.    /* A
14a30 20 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f   delete operatio
14a40 6e 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 67  n on the rowid g
14a50 69 76 65 6e 20 62 79 20 61 72 67 76 5b 30 5d 20  iven by argv[0] 
14a60 2a 2f 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 2a  */.    rowid = *
14a70 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  pRowid = sqlite3
14a80 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
14a90 76 5b 30 5d 29 3b 0a 20 20 20 20 73 70 65 6c 6c  v[0]);.    spell
14aa0 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20  fix1DbExec(&rc, 
14ab0 64 62 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  db, "DELETE FROM
14ac0 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63   \"%w\".\"%w_voc
14ad0 61 62 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20  ab\" ".         
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14af0 20 20 22 20 57 48 45 52 45 20 69 64 3d 25 6c 6c    " WHERE id=%ll
14b00 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
14b10 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65        p->zDbName
14b20 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c  , p->zTableName,
14b30 20 72 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65   rowid);.  }else
14b40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  {.    const unsi
14b50 67 6e 65 64 20 63 68 61 72 20 2a 7a 57 6f 72 64  gned char *zWord
14b60 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
14b70 5f 74 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c  _text(argv[SPELL
14b80 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29  FIX_COL_WORD+2])
14b90 3b 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72 64 20  ;.    int nWord 
14ba0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
14bb0 62 79 74 65 73 28 61 72 67 76 5b 53 50 45 4c 4c  bytes(argv[SPELL
14bc0 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29  FIX_COL_WORD+2])
14bd0 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20  ;.    int iLang 
14be0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
14bf0 69 6e 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49  int(argv[SPELLFI
14c00 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 2b 32 5d 29  X_COL_LANGID+2])
14c10 3b 0a 20 20 20 20 69 6e 74 20 69 52 61 6e 6b 20  ;.    int iRank 
14c20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
14c30 69 6e 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49  int(argv[SPELLFI
14c40 58 5f 43 4f 4c 5f 52 41 4e 4b 2b 32 5d 29 3b 0a  X_COL_RANK+2]);.
14c50 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
14c60 65 64 20 63 68 61 72 20 2a 7a 53 6f 75 6e 64 73  ed char *zSounds
14c70 6c 69 6b 65 20 3d 0a 20 20 20 20 20 20 20 20 20  like =.         
14c80 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
14c90 74 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46  text(argv[SPELLF
14ca0 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b  IX_COL_SOUNDSLIK
14cb0 45 2b 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e  E+2]);.    int n
14cc0 53 6f 75 6e 64 73 6c 69 6b 65 20 3d 20 73 71 6c  Soundslike = sql
14cd0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
14ce0 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43  (argv[SPELLFIX_C
14cf0 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d  OL_SOUNDSLIKE+2]
14d00 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b 31  );.    char *zK1
14d10 2c 20 2a 7a 4b 32 3b 0a 20 20 20 20 69 6e 74 20  , *zK2;.    int 
14d20 69 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 0a  i;.    char c;..
14d30 20 20 20 20 69 66 28 20 7a 57 6f 72 64 3d 3d 30      if( zWord==0
14d40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73   ){.      /* Ins
14d50 65 72 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erts of the form
14d60 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  :  INSERT INTO t
14d70 61 62 6c 65 28 63 6f 6d 6d 61 6e 64 29 20 56 41  able(command) VA
14d80 4c 55 45 53 28 27 78 79 7a 7a 79 27 29 3b 0a 20  LUES('xyzzy');. 
14d90 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 7a 57       ** cause zW
14da0 6f 72 64 20 74 6f 20 62 65 20 4e 55 4c 4c 2c 20  ord to be NULL, 
14db0 73 6f 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68  so we look at th
14dc0 65 20 22 63 6f 6d 6d 61 6e 64 22 20 63 6f 6c 75  e "command" colu
14dd0 6d 6e 20 74 6f 20 73 65 65 0a 20 20 20 20 20 20  mn to see.      
14de0 2a 2a 20 77 68 61 74 20 73 70 65 63 69 61 6c 20  ** what special 
14df0 61 63 74 69 6f 6e 73 20 74 6f 20 74 61 6b 65 20  actions to take 
14e00 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
14e10 68 61 72 20 2a 7a 43 6d 64 20 3d 20 0a 20 20 20  har *zCmd = .   
14e20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
14e30 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
14e40 5f 74 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c  _text(argv[SPELL
14e50 46 49 58 5f 43 4f 4c 5f 43 4f 4d 4d 41 4e 44 2b  FIX_COL_COMMAND+
14e60 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  2]);.      if( z
14e70 43 6d 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cmd==0 ){.      
14e80 20 20 70 56 54 61 62 2d 3e 7a 45 72 72 4d 73 67    pVTab->zErrMsg
14e90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14ea0 74 66 28 22 25 73 2e 77 6f 72 64 20 6d 61 79 20  tf("%s.word may 
14eb0 6e 6f 74 20 62 65 20 4e 55 4c 4c 22 2c 0a 20 20  not be NULL",.  
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ee0 20 20 20 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65         p->zTable
14ef0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Name);.        r
14f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
14f10 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 7d  STRAINT;.      }
14f20 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
14f30 70 28 7a 43 6d 64 2c 22 72 65 73 65 74 22 29 3d  p(zCmd,"reset")=
14f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
14f50 20 52 65 73 65 74 20 74 68 65 20 20 65 64 69 74   Reset the  edit
14f60 20 63 6f 73 74 20 74 61 62 6c 65 20 28 69 66 20   cost table (if 
14f70 74 68 65 72 65 20 69 73 20 6f 6e 65 29 2e 20 2a  there is one). *
14f80 2f 0a 20 20 20 20 20 20 20 20 65 64 69 74 44 69  /.        editDi
14f90 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74 65 28  st3ConfigDelete(
14fa0 70 2d 3e 70 43 6f 6e 66 69 67 33 29 3b 0a 20 20  p->pConfig3);.  
14fb0 20 20 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67        p->pConfig
14fc0 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  3 = 0;.        r
14fd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14ff0 56 54 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  VTab->zErrMsg = 
15000 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15010 22 75 6e 6b 6e 6f 77 6e 20 76 61 6c 75 65 20 66  "unknown value f
15020 6f 72 20 25 73 2e 63 6f 6d 6d 61 6e 64 3a 20 5c  or %s.command: \
15030 22 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  "%w\"",.        
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15060 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 43  ->zTableName, zC
15070 6d 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  md);.      retur
15080 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
15090 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 52      }.    if( iR
150a0 61 6e 6b 3c 31 20 29 20 69 52 61 6e 6b 20 3d 20  ank<1 ) iRank = 
150b0 31 3b 0a 20 20 20 20 69 66 28 20 7a 53 6f 75 6e  1;.    if( zSoun
150c0 64 73 6c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20  dslike ){.      
150d0 7a 4b 31 20 3d 20 28 63 68 61 72 2a 29 74 72 61  zK1 = (char*)tra
150e0 6e 73 6c 69 74 65 72 61 74 65 28 7a 53 6f 75 6e  nsliterate(zSoun
150f0 64 73 6c 69 6b 65 2c 20 6e 53 6f 75 6e 64 73 6c  dslike, nSoundsl
15100 69 6b 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ike);.    }else{
15110 0a 20 20 20 20 20 20 7a 4b 31 20 3d 20 28 63 68  .      zK1 = (ch
15120 61 72 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74  ar*)transliterat
15130 65 28 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b  e(zWord, nWord);
15140 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
15150 4b 31 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  K1==0 ) return S
15160 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15170 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
15180 4b 31 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  K1[i])!=0; i++){
15190 0a 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 27  .       if( c>='
151a0 41 27 20 26 26 20 63 3c 3d 27 5a 27 20 29 20 7a  A' && c<='Z' ) z
151b0 4b 31 5b 69 5d 20 2b 3d 20 27 61 27 20 2d 20 27  K1[i] += 'a' - '
151c0 41 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4b  A';.    }.    zK
151d0 32 20 3d 20 28 63 68 61 72 2a 29 70 68 6f 6e 65  2 = (char*)phone
151e0 74 69 63 48 61 73 68 28 28 63 6f 6e 73 74 20 75  ticHash((const u
151f0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 4b  nsigned char*)zK
15200 31 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 7a  1, i);.    if( z
15210 4b 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  K2==0 ){.      s
15220 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b 31 29  qlite3_free(zK1)
15230 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
15240 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15250 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
15260 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
15270 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
15280 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 73 70 65  ULL ){.      spe
15290 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63  llfix1DbExec(&rc
152a0 2c 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  , db,.          
152b0 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
152c0 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
152d0 62 5c 22 28 72 61 6e 6b 2c 6c 61 6e 67 69 64 2c  b\"(rank,langid,
152e0 77 6f 72 64 2c 6b 31 2c 6b 32 29 20 22 0a 20 20  word,k1,k2) ".  
152f0 20 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55             "VALU
15300 45 53 28 25 64 2c 25 64 2c 25 51 2c 25 51 2c 25  ES(%d,%d,%Q,%Q,%
15310 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Q)",.           
15320 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d    p->zDbName, p-
15330 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20  >zTableName,.   
15340 20 20 20 20 20 20 20 20 20 20 69 52 61 6e 6b 2c            iRank,
15350 20 69 4c 61 6e 67 2c 20 7a 57 6f 72 64 2c 20 7a   iLang, zWord, z
15360 4b 31 2c 20 7a 4b 32 0a 20 20 20 20 20 20 29 3b  K1, zK2.      );
15370 0a 20 20 20 20 20 20 2a 70 52 6f 77 69 64 20 3d  .      *pRowid =
15380 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
15390 73 65 72 74 5f 72 6f 77 69 64 28 64 62 29 3b 0a  sert_rowid(db);.
153a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
153b0 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33   rowid = sqlite3
153c0 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
153d0 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6e 65 77  v[0]);.      new
153e0 52 6f 77 69 64 20 3d 20 2a 70 52 6f 77 69 64 20  Rowid = *pRowid 
153f0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
15400 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a  int64(argv[1]);.
15410 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44        spellfix1D
15420 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20  bExec(&rc, db,. 
15430 20 20 20 20 20 20 20 20 20 20 20 20 22 55 50 44              "UPD
15440 41 54 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f  ATE \"%w\".\"%w_
15450 76 6f 63 61 62 5c 22 20 53 45 54 20 69 64 3d 25  vocab\" SET id=%
15460 6c 6c 64 2c 20 72 61 6e 6b 3d 25 64 2c 20 6c 61  lld, rank=%d, la
15470 6e 67 69 64 3d 25 64 2c 22 0a 20 20 20 20 20 20  ngid=%d,".      
15480 20 20 20 20 20 20 20 22 20 77 6f 72 64 3d 25 51         " word=%Q
15490 2c 20 6b 31 3d 25 51 2c 20 6b 32 3d 25 51 20 57  , k1=%Q, k2=%Q W
154a0 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 2c 0a 20  HERE id=%lld",. 
154b0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
154c0 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c  DbName, p->zTabl
154d0 65 4e 61 6d 65 2c 20 6e 65 77 52 6f 77 69 64 2c  eName, newRowid,
154e0 20 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 0a 20   iRank, iLang,. 
154f0 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 6f 72              zWor
15500 64 2c 20 7a 4b 31 2c 20 7a 4b 32 2c 20 72 6f 77  d, zK1, zK2, row
15510 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
15520 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
15530 65 65 28 7a 4b 31 29 3b 0a 20 20 20 20 73 71 6c  ee(zK1);.    sql
15540 69 74 65 33 5f 66 72 65 65 28 7a 4b 32 29 3b 0a  ite3_free(zK2);.
15550 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 61 6d 65  .}../*.** Rename
15570 20 74 68 65 20 73 70 65 6c 6c 66 69 78 31 20 74   the spellfix1 t
15580 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
15590 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 65 6e  int spellfix1Ren
155a0 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ame(sqlite3_vtab
155b0 20 2a 70 56 54 61 62 2c 20 63 6f 6e 73 74 20 63   *pVTab, const c
155c0 68 61 72 20 2a 7a 4e 65 77 29 7b 0a 20 20 73 70  har *zNew){.  sp
155d0 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20  ellfix1_vtab *p 
155e0 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  = (spellfix1_vta
155f0 62 2a 29 70 56 54 61 62 3b 0a 20 20 73 71 6c 69  b*)pVTab;.  sqli
15600 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
15610 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15620 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
15630 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  NewName = sqlite
15640 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
15650 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 7a 4e 65  zNew);.  if( zNe
15660 77 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  wName==0 ){.    
15670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
15680 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 70 65 6c 6c  MEM;.  }.  spell
15690 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20  fix1DbExec(&rc, 
156a0 64 62 2c 20 0a 20 20 20 20 20 22 41 4c 54 45 52  db, .     "ALTER
156b0 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22   TABLE \"%w\".\"
156c0 25 77 5f 76 6f 63 61 62 5c 22 20 52 45 4e 41 4d  %w_vocab\" RENAM
156d0 45 20 54 4f 20 5c 22 25 77 5f 76 6f 63 61 62 5c  E TO \"%w_vocab\
156e0 22 22 2c 0a 20 20 20 20 20 70 2d 3e 7a 44 62 4e  "",.     p->zDbN
156f0 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61  ame, p->zTableNa
15700 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65 0a 20 20 29  me, zNewName.  )
15710 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
15730 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 61  ite3_free(p->zTa
15740 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  bleName);.    p-
15750 3e 7a 54 61 62 6c 65 4e 61 6d 65 20 3d 20 7a 4e  >zTableName = zN
15760 65 77 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b  ewName;.  }else{
15770 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15780 65 28 7a 4e 65 77 4e 61 6d 65 29 3b 0a 20 20 7d  e(zNewName);.  }
15790 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
157a0 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61  ../*.** A virtua
157b0 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74  l table module t
157c0 68 61 74 20 70 72 6f 76 69 64 65 73 20 66 75 7a  hat provides fuz
157d0 7a 79 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74  zy search..*/.st
157e0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64  atic sqlite3_mod
157f0 75 6c 65 20 73 70 65 6c 6c 66 69 78 31 4d 6f 64  ule spellfix1Mod
15800 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20  ule = {.  0,    
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
15830 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 72 65  /.  spellfix1Cre
15840 61 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ate,         /* 
15850 78 43 72 65 61 74 65 20 2d 20 68 61 6e 64 6c 65  xCreate - handle
15860 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
15870 54 41 42 4c 45 20 2a 2f 0a 20 20 73 70 65 6c 6c  TABLE */.  spell
15880 66 69 78 31 43 6f 6e 6e 65 63 74 2c 20 20 20 20  fix1Connect,    
15890 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
158a0 2d 20 72 65 63 6f 6e 6e 65 63 74 65 64 20 74 6f  - reconnected to
158b0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62   an existing tab
158c0 6c 65 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  le */.  spellfix
158d0 31 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  1BestIndex,     
158e0 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d   /* xBestIndex -
158f0 20 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   figure out how 
15900 74 6f 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f  to do a query */
15910 0a 20 20 73 70 65 6c 6c 66 69 78 31 44 69 73 63  .  spellfix1Disc
15920 6f 6e 6e 65 63 74 2c 20 20 20 20 20 2f 2a 20 78  onnect,     /* x
15930 44 69 73 63 6f 6e 6e 65 63 74 20 2d 20 63 6c 6f  Disconnect - clo
15940 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
15950 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 44 65  */.  spellfix1De
15960 73 74 72 6f 79 2c 20 20 20 20 20 20 20 20 2f 2a  stroy,        /*
15970 20 78 44 65 73 74 72 6f 79 20 2d 20 68 61 6e 64   xDestroy - hand
15980 6c 65 20 44 52 4f 50 20 54 41 42 4c 45 20 2a 2f  le DROP TABLE */
15990 0a 20 20 73 70 65 6c 6c 66 69 78 31 4f 70 65 6e  .  spellfix1Open
159a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
159b0 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75  Open - open a cu
159c0 72 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  rsor */.  spellf
159d0 69 78 31 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ix1Close,       
159e0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63     /* xClose - c
159f0 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  lose a cursor */
15a00 0a 20 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74  .  spellfix1Filt
15a10 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  er,         /* x
15a20 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75  Filter - configu
15a30 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69  re scan constrai
15a40 6e 74 73 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  nts */.  spellfi
15a50 78 31 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  x1Next,         
15a60 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
15a70 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
15a80 0a 20 20 73 70 65 6c 6c 66 69 78 31 45 6f 66 2c  .  spellfix1Eof,
15a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15aa0 45 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20  Eof - check for 
15ab0 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20  end of scan */. 
15ac0 20 73 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e   spellfix1Column
15ad0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f  ,         /* xCo
15ae0 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61  lumn - read data
15af0 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 52   */.  spellfix1R
15b00 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f  owid,          /
15b10 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20  * xRowid - read 
15b20 64 61 74 61 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  data */.  spellf
15b30 69 78 31 55 70 64 61 74 65 2c 20 20 20 20 20 20  ix1Update,      
15b40 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f     /* xUpdate */
15b50 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
15b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15b70 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  Begin */.  0,   
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b90 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
15ba0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
15bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
15bc0 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20  ommit */.  0,   
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
15bf0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c10 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f  * xFindMethod */
15c20 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 6e 61  .  spellfix1Rena
15c30 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  me,         /* x
15c40 52 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  Rename */.};../*
15c50 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65  .** Register the
15c60 20 76 61 72 69 6f 75 73 20 66 75 6e 63 74 69 6f   various functio
15c70 6e 73 20 61 6e 64 20 74 68 65 20 76 69 72 74 75  ns and the virtu
15c80 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  al table..*/.sta
15c90 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
15ca0 31 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65  1Register(sqlite
15cb0 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
15cc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15cd0 69 6e 74 20 69 3b 0a 20 20 72 63 20 3d 20 73 71  int i;.  rc = sq
15ce0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
15cf0 63 74 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c  ction(db, "spell
15d00 66 69 78 31 5f 74 72 61 6e 73 6c 69 74 22 2c 20  fix1_translit", 
15d10 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
15d20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 20 20 20 20 74 72 61 6e 73 6c 69 74 65 72 61       translitera
15d50 74 65 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  teSqlFunc, 0, 0)
15d60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
15d80 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
15d90 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73  _function(db, "s
15da0 70 65 6c 6c 66 69 78 31 5f 65 64 69 74 64 69 73  pellfix1_editdis
15db0 74 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  t", 2, SQLITE_UT
15dc0 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 20 20 20 20 20 20 20 20 65 64 69 74 64 69 73           editdis
15df0 74 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  tSqlFunc, 0, 0);
15e00 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
15e10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15e20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
15e30 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
15e40 20 22 73 70 65 6c 6c 66 69 78 31 5f 70 68 6f 6e   "spellfix1_phon
15e50 65 68 61 73 68 22 2c 20 31 2c 20 53 51 4c 49 54  ehash", 1, SQLIT
15e60 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 68 6f               pho
15e90 6e 65 74 69 63 48 61 73 68 53 71 6c 46 75 6e 63  neticHashSqlFunc
15ea0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
15eb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15ec0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15ed0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
15ee0 74 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66  tion(db, "spellf
15ef0 69 78 31 5f 73 63 72 69 70 74 63 6f 64 65 22 2c  ix1_scriptcode",
15f00 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
15f10 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 20 20 20 73 63 72 69 70 74 43 6f 64 65        scriptCode
15f40 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
15f50 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
15f70 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
15f80 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73  te_module(db, "s
15f90 70 65 6c 6c 66 69 78 31 22 2c 20 26 73 70 65 6c  pellfix1", &spel
15fa0 6c 66 69 78 31 4d 6f 64 75 6c 65 2c 20 30 29 3b  lfix1Module, 0);
15fb0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
15fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15fd0 72 63 20 3d 20 65 64 69 74 44 69 73 74 33 49 6e  rc = editDist3In
15fe0 73 74 61 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 0a  stall(db);.  }..
15ff0 20 20 2f 2a 20 56 65 72 69 66 79 20 73 61 6e 69    /* Verify sani
16000 74 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73 6c  ty of the transl
16010 69 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  it[] table */.  
16020 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
16030 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65  f(translit)/size
16040 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 2d  of(translit[0])-
16050 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  1; i++){.    ass
16060 65 72 74 28 20 74 72 61 6e 73 6c 69 74 5b 69 5d  ert( translit[i]
16070 2e 63 46 72 6f 6d 3c 74 72 61 6e 73 6c 69 74 5b  .cFrom<translit[
16080 69 2b 31 5d 2e 63 46 72 6f 6d 20 29 3b 0a 20 20  i+1].cFrom );.  
16090 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
160a0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 43 4f  }..#if SQLITE_CO
160b0 52 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  RE || defined(SQ
160c0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
160d0 20 52 65 67 69 73 74 65 72 20 74 68 65 20 73 70   Register the sp
160e0 65 6c 6c 66 69 78 31 20 76 69 72 74 75 61 6c 20  ellfix1 virtual 
160f0 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73  table and its as
16100 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f  sociated functio
16110 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
16120 65 33 5f 73 70 65 6c 6c 66 69 78 31 5f 72 65 67  e3_spellfix1_reg
16130 69 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64  ister(sqlite3 *d
16140 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65  b){.  return spe
16150 6c 6c 66 69 78 31 52 65 67 69 73 74 65 72 28 64  llfix1Register(d
16160 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  b);.}.#endif...#
16170 69 66 20 21 53 51 4c 49 54 45 5f 43 4f 52 45 0a  if !SQLITE_CORE.
16180 2f 2a 0a 2a 2a 20 45 78 74 65 6e 73 69 6f 6e 20  /*.** Extension 
16190 6c 6f 61 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  load function..*
161a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70  /.int sqlite3_sp
161b0 65 6c 6c 66 69 78 31 5f 69 6e 69 74 28 0a 20 20  ellfix1_init(.  
161c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
161d0 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c  char **pzErrMsg,
161e0 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65   .  const sqlite
161f0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a  3_api_routines *
16200 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45  pApi.){.  SQLITE
16210 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32  _EXTENSION_INIT2
16220 28 70 41 70 69 29 3b 0a 20 20 72 65 74 75 72 6e  (pApi);.  return
16230 20 73 70 65 6c 6c 66 69 78 31 52 65 67 69 73 74   spellfix1Regist
16240 65 72 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  er(db);.}.#endif
16250 20 2f 2a 20 21 53 51 4c 49 54 45 5f 43 4f 52 45   /* !SQLITE_CORE
16260 20 2a 2f 0a                                       */.