/ Hex Artifact Content
Login

Artifact 41cf26c6b89fcaa8798ae10ae64d39c1f1d9d6995152e545bd491c13058b8fac:


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 28   documentation (
0210: 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
0220: 65 2e 6f 72 67 2f 73 70 65 6c 6c 66 69 78 31 2e  e.org/spellfix1.
0230: 68 74 6d 6c 29 20 66 6f 72 20 64 65 74 61 69 6c  html) for detail
0240: 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  s..*/.#include "
0250: 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 53 51  sqlite3ext.h".SQ
0260: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
0270: 4e 49 54 31 0a 0a 23 69 66 6e 64 65 66 20 53 51  NIT1..#ifndef SQ
0280: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0290: 4e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72  N.# include <str
02a0: 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ing.h>.# include
02b0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 20 69 6e 63   <stdio.h>.# inc
02c0: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02d0: 23 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  # include <asser
02e0: 74 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 41 4c  t.h>.# define AL
02f0: 57 41 59 53 28 58 29 20 20 31 0a 23 20 64 65 66  WAYS(X)  1.# def
0300: 69 6e 65 20 4e 45 56 45 52 28 58 29 20 20 20 30  ine NEVER(X)   0
0310: 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69 67  .  typedef unsig
0320: 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 20 20 74  ned char u8;.  t
0330: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0340: 73 68 6f 72 74 20 75 31 36 3b 0a 23 65 6e 64 69  short u16;.#endi
0350: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70  f.#include <ctyp
0360: 65 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51  e.h>..#ifndef SQ
0370: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
0380: 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 43 68  LTABLE../*.** Ch
0390: 61 72 61 63 74 65 72 20 63 6c 61 73 73 65 73 20  aracter classes 
03a0: 66 6f 72 20 41 53 43 49 49 20 63 68 61 72 61 63  for ASCII charac
03b0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 20  ters:.**.**   0 
03c0: 20 20 27 27 20 20 20 20 20 20 20 20 53 69 6c 65    ''        Sile
03d0: 6e 74 20 6c 65 74 74 65 72 73 3a 20 20 20 48 20  nt letters:   H 
03e0: 57 0a 2a 2a 20 20 20 31 20 20 20 27 41 27 20 20  W.**   1   'A'  
03f0: 20 20 20 20 20 41 6e 79 20 76 6f 77 65 6c 3a 20       Any vowel: 
0400: 20 20 41 20 45 20 49 20 4f 20 55 20 28 59 29 0a    A E I O U (Y).
0410: 2a 2a 20 20 20 32 20 20 20 27 42 27 20 20 20 20  **   2   'B'    
0420: 20 20 20 41 20 62 69 6c 61 62 65 61 6c 20 73 74     A bilabeal st
0430: 6f 70 20 6f 72 20 66 72 69 63 61 74 69 76 65 3a  op or fricative:
0440: 20 20 42 20 46 20 50 20 56 20 57 0a 2a 2a 20 20    B F P V W.**  
0450: 20 33 20 20 20 27 43 27 20 20 20 20 20 20 20 4f   3   'C'       O
0460: 74 68 65 72 20 66 72 69 63 61 74 69 76 65 73 20  ther fricatives 
0470: 6f 72 20 62 61 63 6b 20 73 74 6f 70 73 3a 20 20  or back stops:  
0480: 43 20 47 20 4a 20 4b 20 51 20 53 20 58 20 5a 0a  C G J K Q S X Z.
0490: 2a 2a 20 20 20 34 20 20 20 27 44 27 20 20 20 20  **   4   'D'    
04a0: 20 20 20 41 6c 76 65 6f 6c 61 72 20 73 74 6f 70     Alveolar stop
04b0: 73 3a 20 20 44 20 54 0a 2a 2a 20 20 20 35 20 20  s:  D T.**   5  
04c0: 20 27 48 27 20 20 20 20 20 20 20 4c 65 74 74 65   'H'       Lette
04d0: 72 20 48 20 61 74 20 74 68 65 20 62 65 67 69 6e  r H at the begin
04e0: 6e 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 0a 2a  ning of a word.*
04f0: 2a 20 20 20 36 20 20 20 27 4c 27 20 20 20 20 20  *   6   'L'     
0500: 20 20 47 6c 69 64 65 3a 20 20 4c 0a 2a 2a 20 20    Glide:  L.**  
0510: 20 37 20 20 20 27 52 27 20 20 20 20 20 20 20 53   7   'R'       S
0520: 65 6d 69 76 6f 77 65 6c 3a 20 20 52 0a 2a 2a 20  emivowel:  R.** 
0530: 20 20 38 20 20 20 27 4d 27 20 20 20 20 20 20 20    8   'M'       
0540: 4e 61 73 61 6c 73 3a 20 20 4d 20 4e 0a 2a 2a 20  Nasals:  M N.** 
0550: 20 20 39 20 20 20 27 59 27 20 20 20 20 20 20 20    9   'Y'       
0560: 4c 65 74 74 65 72 20 59 20 61 74 20 74 68 65 20  Letter Y at the 
0570: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 77  beginning of a w
0580: 6f 72 64 2e 0a 2a 2a 20 20 20 31 30 20 20 27 39  ord..**   10  '9
0590: 27 20 20 20 20 20 20 20 44 69 67 69 74 73 3a 20  '       Digits: 
05a0: 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20  0 1 2 3 4 5 6 7 
05b0: 38 20 39 0a 2a 2a 20 20 20 31 31 20 20 27 20 27  8 9.**   11  ' '
05c0: 20 20 20 20 20 20 20 57 68 69 74 65 20 73 70 61         White spa
05d0: 63 65 0a 2a 2a 20 20 20 31 32 20 20 27 3f 27 20  ce.**   12  '?' 
05e0: 20 20 20 20 20 20 4f 74 68 65 72 2e 0a 2a 2f 0a        Other..*/.
05f0: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 53  #define CCLASS_S
0600: 49 4c 45 4e 54 20 20 20 20 20 20 20 20 20 30 0a  ILENT         0.
0610: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 56  #define CCLASS_V
0620: 4f 57 45 4c 20 20 20 20 20 20 20 20 20 20 31 0a  OWEL          1.
0630: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 42  #define CCLASS_B
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 0a                2.
0650: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 43  #define CCLASS_C
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 0a                3.
0670: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 44  #define CCLASS_D
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 0a                4.
0690: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 48  #define CCLASS_H
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 0a                5.
06b0: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 4c  #define CCLASS_L
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 0a                6.
06d0: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 52  #define CCLASS_R
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37 0a                7.
06f0: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 4d  #define CCLASS_M
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 0a                8.
0710: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 59  #define CCLASS_Y
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39 0a                9.
0730: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 44  #define CCLASS_D
0740: 49 47 49 54 20 20 20 20 20 20 20 20 20 31 30 0a  IGIT         10.
0750: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 53  #define CCLASS_S
0760: 50 41 43 45 20 20 20 20 20 20 20 20 20 31 31 0a  PACE         11.
0770: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 4f  #define CCLASS_O
0780: 54 48 45 52 20 20 20 20 20 20 20 20 20 31 32 0a  THER         12.
0790: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
07a0: 77 69 6e 67 20 74 61 62 6c 65 20 67 69 76 65 73  wing table gives
07b0: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 63   the character c
07c0: 6c 61 73 73 20 66 6f 72 20 6e 6f 6e 2d 69 6e 69  lass for non-ini
07d0: 74 69 61 6c 20 41 53 43 49 49 0a 2a 2a 20 63 68  tial ASCII.** ch
07e0: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
07f0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
0800: 65 64 20 63 68 61 72 20 6d 69 64 43 6c 61 73 73  ed char midClass
0810: 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 20 20 2a 2f 20  [] = {. /*   */ 
0820: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0830: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0840: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0850: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0860: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0870: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
0880: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0890: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
08a0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
08b0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
08c0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
08d0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
08e0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
08f0: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53  /*   */ CCLASS_S
0900: 50 41 43 45 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  PACE,    /*   */
0910: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0920: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0930: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0940: 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 20 20 20  CCLASS_SPACE,   
0950: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0960: 53 50 41 43 45 2c 20 20 20 2f 2a 20 20 20 2a 2f  SPACE,   /*   */
0970: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0980: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0990: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
09a0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
09b0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
09c0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
09d0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
09e0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
09f0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0a00: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0a10: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0a20: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
0a30: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0a40: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0a50: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0a60: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0a70: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0a80: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0a90: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0aa0: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0ab0: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
0ac0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0ad0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0ae0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0af0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0b00: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0b10: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0b20: 20 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 0a 20   CCLASS_SPACE,. 
0b30: 2f 2a 20 21 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* ! */ CCLASS_O
0b40: 54 48 45 52 2c 20 20 20 20 2f 2a 20 22 20 2a 2f  THER,    /* " */
0b50: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0b60: 20 2f 2a 20 23 20 2a 2f 20 43 43 4c 41 53 53 5f   /* # */ CCLASS_
0b70: 4f 54 48 45 52 2c 0a 20 2f 2a 20 24 20 2a 2f 20  OTHER,. /* $ */ 
0b80: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0b90: 20 2f 2a 20 25 20 2a 2f 20 43 43 4c 41 53 53 5f   /* % */ CCLASS_
0ba0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 26 20 2a 2f  OTHER,   /* & */
0bb0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0bc0: 2f 2a 20 27 20 2a 2f 20 43 43 4c 41 53 53 5f 53  /* ' */ CCLASS_S
0bd0: 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 28 20 2a 2f  ILENT,   /* ( */
0be0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0bf0: 20 2f 2a 20 29 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ) */ CCLASS_
0c00: 4f 54 48 45 52 2c 0a 20 2f 2a 20 2a 20 2a 2f 20  OTHER,. /* * */ 
0c10: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0c20: 20 2f 2a 20 2b 20 2a 2f 20 43 43 4c 41 53 53 5f   /* + */ CCLASS_
0c30: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 2c 20 2a 2f  OTHER,   /* , */
0c40: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0c50: 2f 2a 20 2d 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* - */ CCLASS_O
0c60: 54 48 45 52 2c 20 20 20 20 2f 2a 20 2e 20 2a 2f  THER,    /* . */
0c70: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0c80: 20 2f 2a 20 2f 20 2a 2f 20 43 43 4c 41 53 53 5f   /* / */ CCLASS_
0c90: 4f 54 48 45 52 2c 0a 20 2f 2a 20 30 20 2a 2f 20  OTHER,. /* 0 */ 
0ca0: 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20  CCLASS_DIGIT,   
0cb0: 20 2f 2a 20 31 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 1 */ CCLASS_
0cc0: 44 49 47 49 54 2c 20 20 20 2f 2a 20 32 20 2a 2f  DIGIT,   /* 2 */
0cd0: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20   CCLASS_DIGIT,. 
0ce0: 2f 2a 20 33 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* 3 */ CCLASS_D
0cf0: 49 47 49 54 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  IGIT,    /* 4 */
0d00: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20   CCLASS_DIGIT,  
0d10: 20 2f 2a 20 35 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 5 */ CCLASS_
0d20: 44 49 47 49 54 2c 0a 20 2f 2a 20 36 20 2a 2f 20  DIGIT,. /* 6 */ 
0d30: 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20  CCLASS_DIGIT,   
0d40: 20 2f 2a 20 37 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 7 */ CCLASS_
0d50: 44 49 47 49 54 2c 20 20 20 2f 2a 20 38 20 2a 2f  DIGIT,   /* 8 */
0d60: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20   CCLASS_DIGIT,. 
0d70: 2f 2a 20 39 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* 9 */ CCLASS_D
0d80: 49 47 49 54 2c 20 20 20 20 2f 2a 20 3a 20 2a 2f  IGIT,    /* : */
0d90: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0da0: 20 2f 2a 20 3b 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ; */ CCLASS_
0db0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 3c 20 2a 2f 20  OTHER,. /* < */ 
0dc0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0dd0: 20 2f 2a 20 3d 20 2a 2f 20 43 43 4c 41 53 53 5f   /* = */ CCLASS_
0de0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 3e 20 2a 2f  OTHER,   /* > */
0df0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0e00: 2f 2a 20 3f 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* ? */ CCLASS_O
0e10: 54 48 45 52 2c 20 20 20 20 2f 2a 20 40 20 2a 2f  THER,    /* @ */
0e20: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0e30: 20 2f 2a 20 41 20 2a 2f 20 43 43 4c 41 53 53 5f   /* A */ CCLASS_
0e40: 56 4f 57 45 4c 2c 0a 20 2f 2a 20 42 20 2a 2f 20  VOWEL,. /* B */ 
0e50: 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20  CCLASS_B,       
0e60: 20 2f 2a 20 43 20 2a 2f 20 43 43 4c 41 53 53 5f   /* C */ CCLASS_
0e70: 43 2c 20 20 20 20 20 20 20 2f 2a 20 44 20 2a 2f  C,       /* D */
0e80: 20 43 43 4c 41 53 53 5f 44 2c 0a 20 2f 2a 20 45   CCLASS_D,. /* E
0e90: 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c   */ CCLASS_VOWEL
0ea0: 2c 20 20 20 20 2f 2a 20 46 20 2a 2f 20 43 43 4c  ,    /* F */ CCL
0eb0: 41 53 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_B,       /* 
0ec0: 47 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20  G */ CCLASS_C,. 
0ed0: 2f 2a 20 48 20 2a 2f 20 43 43 4c 41 53 53 5f 53  /* H */ CCLASS_S
0ee0: 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 49 20 2a 2f  ILENT,   /* I */
0ef0: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
0f00: 20 2f 2a 20 4a 20 2a 2f 20 43 43 4c 41 53 53 5f   /* J */ CCLASS_
0f10: 43 2c 0a 20 2f 2a 20 4b 20 2a 2f 20 43 43 4c 41  C,. /* K */ CCLA
0f20: 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_C,        /* 
0f30: 4c 20 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c 20 20  L */ CCLASS_L,  
0f40: 20 20 20 20 20 2f 2a 20 4d 20 2a 2f 20 43 43 4c       /* M */ CCL
0f50: 41 53 53 5f 4d 2c 0a 20 2f 2a 20 4e 20 2a 2f 20  ASS_M,. /* N */ 
0f60: 43 43 4c 41 53 53 5f 4d 2c 20 20 20 20 20 20 20  CCLASS_M,       
0f70: 20 2f 2a 20 4f 20 2a 2f 20 43 43 4c 41 53 53 5f   /* O */ CCLASS_
0f80: 56 4f 57 45 4c 2c 20 20 20 2f 2a 20 50 20 2a 2f  VOWEL,   /* P */
0f90: 20 43 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20 51   CCLASS_B,. /* Q
0fa0: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
0fb0: 20 20 20 20 20 2f 2a 20 52 20 2a 2f 20 43 43 4c       /* R */ CCL
0fc0: 41 53 53 5f 52 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_R,       /* 
0fd0: 53 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20  S */ CCLASS_C,. 
0fe0: 2f 2a 20 54 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* T */ CCLASS_D
0ff0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 20 2a 2f  ,        /* U */
1000: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
1010: 20 2f 2a 20 56 20 2a 2f 20 43 43 4c 41 53 53 5f   /* V */ CCLASS_
1020: 42 2c 0a 20 2f 2a 20 57 20 2a 2f 20 43 43 4c 41  B,. /* W */ CCLA
1030: 53 53 5f 42 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_B,        /* 
1040: 58 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  X */ CCLASS_C,  
1050: 20 20 20 20 20 2f 2a 20 59 20 2a 2f 20 43 43 4c       /* Y */ CCL
1060: 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 5a  ASS_VOWEL,. /* Z
1070: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
1080: 20 20 20 20 20 2f 2a 20 5b 20 2a 2f 20 43 43 4c       /* [ */ CCL
1090: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
10a0: 5c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  \ */ CCLASS_OTHE
10b0: 52 2c 0a 20 2f 2a 20 5d 20 2a 2f 20 43 43 4c 41  R,. /* ] */ CCLA
10c0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
10d0: 5e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ^ */ CCLASS_OTHE
10e0: 52 2c 20 20 20 2f 2a 20 5f 20 2a 2f 20 43 43 4c  R,   /* _ */ CCL
10f0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 60  ASS_OTHER,. /* `
1100: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1110: 2c 20 20 20 20 2f 2a 20 61 20 2a 2f 20 43 43 4c  ,    /* a */ CCL
1120: 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20  ASS_VOWEL,   /* 
1130: 62 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20  b */ CCLASS_B,. 
1140: 2f 2a 20 63 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* c */ CCLASS_C
1150: 2c 20 20 20 20 20 20 20 20 2f 2a 20 64 20 2a 2f  ,        /* d */
1160: 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20 20 20   CCLASS_D,      
1170: 20 2f 2a 20 65 20 2a 2f 20 43 43 4c 41 53 53 5f   /* e */ CCLASS_
1180: 56 4f 57 45 4c 2c 0a 20 2f 2a 20 66 20 2a 2f 20  VOWEL,. /* f */ 
1190: 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20  CCLASS_B,       
11a0: 20 2f 2a 20 67 20 2a 2f 20 43 43 4c 41 53 53 5f   /* g */ CCLASS_
11b0: 43 2c 20 20 20 20 20 20 20 2f 2a 20 68 20 2a 2f  C,       /* h */
11c0: 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c 0a   CCLASS_SILENT,.
11d0: 20 2f 2a 20 69 20 2a 2f 20 43 43 4c 41 53 53 5f   /* i */ CCLASS_
11e0: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 6a 20 2a  VOWEL,    /* j *
11f0: 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20  / CCLASS_C,     
1200: 20 20 2f 2a 20 6b 20 2a 2f 20 43 43 4c 41 53 53    /* k */ CCLASS
1210: 5f 43 2c 0a 20 2f 2a 20 6c 20 2a 2f 20 43 43 4c  _C,. /* l */ CCL
1220: 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_L,        /*
1230: 20 6d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 20   m */ CCLASS_M, 
1240: 20 20 20 20 20 20 2f 2a 20 6e 20 2a 2f 20 43 43        /* n */ CC
1250: 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 6f 20 2a 2f  LASS_M,. /* o */
1260: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
1270: 20 20 2f 2a 20 70 20 2a 2f 20 43 43 4c 41 53 53    /* p */ CCLASS
1280: 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 71 20 2a  _B,       /* q *
1290: 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20  / CCLASS_C,. /* 
12a0: 72 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c 20 20  r */ CCLASS_R,  
12b0: 20 20 20 20 20 20 2f 2a 20 73 20 2a 2f 20 43 43        /* s */ CC
12c0: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a  LASS_C,       /*
12d0: 20 74 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a   t */ CCLASS_D,.
12e0: 20 2f 2a 20 75 20 2a 2f 20 43 43 4c 41 53 53 5f   /* u */ CCLASS_
12f0: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 76 20 2a  VOWEL,    /* v *
1300: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
1310: 20 20 2f 2a 20 77 20 2a 2f 20 43 43 4c 41 53 53    /* w */ CCLASS
1320: 5f 42 2c 0a 20 2f 2a 20 78 20 2a 2f 20 43 43 4c  _B,. /* x */ CCL
1330: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_C,        /*
1340: 20 79 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   y */ CCLASS_VOW
1350: 45 4c 2c 20 20 20 2f 2a 20 7a 20 2a 2f 20 43 43  EL,   /* z */ CC
1360: 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 7b 20 2a 2f  LASS_C,. /* { */
1370: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
1380: 20 20 2f 2a 20 7c 20 2a 2f 20 43 43 4c 41 53 53    /* | */ CCLASS
1390: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 7d 20 2a  _OTHER,   /* } *
13a0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
13b0: 20 2f 2a 20 7e 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ~ */ CCLASS_
13c0: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a  OTHER,    /*   *
13d0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
13e0: 20 20 0a 7d 3b 0a 2f 2a 20 0a 2a 2a 20 54 68 69    .};./* .** Thi
13f0: 73 20 74 61 62 6c 65 73 20 67 69 76 65 73 20 74  s tables gives t
1400: 68 65 20 63 68 61 72 61 63 74 65 72 20 63 6c 61  he character cla
1410: 73 73 20 66 6f 72 20 41 53 43 49 49 20 63 68 61  ss for ASCII cha
1420: 72 61 63 74 65 72 73 20 74 68 61 74 20 66 6f 72  racters that for
1430: 6d 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  m the.** initial
1440: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 20   character of a 
1450: 77 6f 72 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  word.  The only 
1460: 64 69 66 66 65 72 65 6e 63 65 20 66 72 6f 6d 20  difference from 
1470: 6d 69 64 43 6c 61 73 73 20 69 73 20 77 69 74 68  midClass is with
1480: 0a 2a 2a 20 74 68 65 20 6c 65 74 74 65 72 73 20  .** the letters 
1490: 48 2c 20 57 2c 20 61 6e 64 20 59 2e 0a 2a 2f 0a  H, W, and Y..*/.
14a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
14b0: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 69 74 43  igned char initC
14c0: 6c 61 73 73 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 20  lass[] = {. /*  
14d0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
14e0: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
14f0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1500: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1510: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1520: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1530: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1540: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1550: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
1560: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1570: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
1580: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1590: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
15a0: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
15b0: 53 53 5f 53 50 41 43 45 2c 20 20 20 20 2f 2a 20  SS_SPACE,    /* 
15c0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
15d0: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
15e0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
15f0: 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43 45   */ CCLASS_SPACE
1600: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
1610: 41 53 53 5f 53 50 41 43 45 2c 20 20 20 2f 2a 20  ASS_SPACE,   /* 
1620: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1630: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1640: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1650: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1660: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1670: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
1680: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1690: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
16a0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
16b0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
16c0: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
16d0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
16e0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
16f0: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1700: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
1710: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1720: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
1730: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1740: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1750: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1760: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1770: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1780: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1790: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
17a0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
17b0: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
17c0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
17d0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43    */ CCLASS_SPAC
17e0: 45 2c 0a 20 2f 2a 20 21 20 2a 2f 20 43 43 4c 41  E,. /* ! */ CCLA
17f0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1800: 22 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  " */ CCLASS_OTHE
1810: 52 2c 20 20 20 2f 2a 20 23 20 2a 2f 20 43 43 4c  R,   /* # */ CCL
1820: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 24  ASS_OTHER,. /* $
1830: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1840: 2c 20 20 20 20 2f 2a 20 25 20 2a 2f 20 43 43 4c  ,    /* % */ CCL
1850: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1860: 26 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  & */ CCLASS_OTHE
1870: 52 2c 0a 20 2f 2a 20 27 20 2a 2f 20 43 43 4c 41  R,. /* ' */ CCLA
1880: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1890: 28 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ( */ CCLASS_OTHE
18a0: 52 2c 20 20 20 2f 2a 20 29 20 2a 2f 20 43 43 4c  R,   /* ) */ CCL
18b0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 2a  ASS_OTHER,. /* *
18c0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
18d0: 2c 20 20 20 20 2f 2a 20 2b 20 2a 2f 20 43 43 4c  ,    /* + */ CCL
18e0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
18f0: 2c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  , */ CCLASS_OTHE
1900: 52 2c 0a 20 2f 2a 20 2d 20 2a 2f 20 43 43 4c 41  R,. /* - */ CCLA
1910: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1920: 2e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  . */ CCLASS_OTHE
1930: 52 2c 20 20 20 2f 2a 20 2f 20 2a 2f 20 43 43 4c  R,   /* / */ CCL
1940: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 30  ASS_OTHER,. /* 0
1950: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54   */ CCLASS_DIGIT
1960: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 20 43 43 4c  ,    /* 1 */ CCL
1970: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20  ASS_DIGIT,   /* 
1980: 32 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  2 */ CCLASS_DIGI
1990: 54 2c 0a 20 2f 2a 20 33 20 2a 2f 20 43 43 4c 41  T,. /* 3 */ CCLA
19a0: 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20  SS_DIGIT,    /* 
19b0: 34 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  4 */ CCLASS_DIGI
19c0: 54 2c 20 20 20 2f 2a 20 35 20 2a 2f 20 43 43 4c  T,   /* 5 */ CCL
19d0: 41 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20 36  ASS_DIGIT,. /* 6
19e0: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54   */ CCLASS_DIGIT
19f0: 2c 20 20 20 20 2f 2a 20 37 20 2a 2f 20 43 43 4c  ,    /* 7 */ CCL
1a00: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20  ASS_DIGIT,   /* 
1a10: 38 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  8 */ CCLASS_DIGI
1a20: 54 2c 0a 20 2f 2a 20 39 20 2a 2f 20 43 43 4c 41  T,. /* 9 */ CCLA
1a30: 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20  SS_DIGIT,    /* 
1a40: 3a 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  : */ CCLASS_OTHE
1a50: 52 2c 20 20 20 2f 2a 20 3b 20 2a 2f 20 43 43 4c  R,   /* ; */ CCL
1a60: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 3c  ASS_OTHER,. /* <
1a70: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1a80: 2c 20 20 20 20 2f 2a 20 3d 20 2a 2f 20 43 43 4c  ,    /* = */ CCL
1a90: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1aa0: 3e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  > */ CCLASS_OTHE
1ab0: 52 2c 0a 20 2f 2a 20 3f 20 2a 2f 20 43 43 4c 41  R,. /* ? */ CCLA
1ac0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1ad0: 40 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  @ */ CCLASS_OTHE
1ae0: 52 2c 20 20 20 2f 2a 20 41 20 2a 2f 20 43 43 4c  R,   /* A */ CCL
1af0: 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 42  ASS_VOWEL,. /* B
1b00: 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20   */ CCLASS_B,   
1b10: 20 20 20 20 20 2f 2a 20 43 20 2a 2f 20 43 43 4c       /* C */ CCL
1b20: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_C,       /* 
1b30: 44 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a 20  D */ CCLASS_D,. 
1b40: 2f 2a 20 45 20 2a 2f 20 43 43 4c 41 53 53 5f 56  /* E */ CCLASS_V
1b50: 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 46 20 2a 2f  OWEL,    /* F */
1b60: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
1b70: 20 2f 2a 20 47 20 2a 2f 20 43 43 4c 41 53 53 5f   /* G */ CCLASS_
1b80: 43 2c 0a 20 2f 2a 20 48 20 2a 2f 20 43 43 4c 41  C,. /* H */ CCLA
1b90: 53 53 5f 53 49 4c 45 4e 54 2c 20 20 20 2f 2a 20  SS_SILENT,   /* 
1ba0: 49 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  I */ CCLASS_VOWE
1bb0: 4c 2c 20 20 20 2f 2a 20 4a 20 2a 2f 20 43 43 4c  L,   /* J */ CCL
1bc0: 41 53 53 5f 43 2c 0a 20 2f 2a 20 4b 20 2a 2f 20  ASS_C,. /* K */ 
1bd0: 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20  CCLASS_C,       
1be0: 20 2f 2a 20 4c 20 2a 2f 20 43 43 4c 41 53 53 5f   /* L */ CCLASS_
1bf0: 4c 2c 20 20 20 20 20 20 20 2f 2a 20 4d 20 2a 2f  L,       /* M */
1c00: 20 43 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 4e   CCLASS_M,. /* N
1c10: 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 20 20 20   */ CCLASS_M,   
1c20: 20 20 20 20 20 2f 2a 20 4f 20 2a 2f 20 43 43 4c       /* O */ CCL
1c30: 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20  ASS_VOWEL,   /* 
1c40: 50 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20  P */ CCLASS_B,. 
1c50: 2f 2a 20 51 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* Q */ CCLASS_C
1c60: 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 20 2a 2f  ,        /* R */
1c70: 20 43 43 4c 41 53 53 5f 52 2c 20 20 20 20 20 20   CCLASS_R,      
1c80: 20 2f 2a 20 53 20 2a 2f 20 43 43 4c 41 53 53 5f   /* S */ CCLASS_
1c90: 43 2c 0a 20 2f 2a 20 54 20 2a 2f 20 43 43 4c 41  C,. /* T */ CCLA
1ca0: 53 53 5f 44 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_D,        /* 
1cb0: 55 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  U */ CCLASS_VOWE
1cc0: 4c 2c 20 20 20 2f 2a 20 56 20 2a 2f 20 43 43 4c  L,   /* V */ CCL
1cd0: 41 53 53 5f 42 2c 0a 20 2f 2a 20 57 20 2a 2f 20  ASS_B,. /* W */ 
1ce0: 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20  CCLASS_B,       
1cf0: 20 2f 2a 20 58 20 2a 2f 20 43 43 4c 41 53 53 5f   /* X */ CCLASS_
1d00: 43 2c 20 20 20 20 20 20 20 2f 2a 20 59 20 2a 2f  C,       /* Y */
1d10: 20 43 43 4c 41 53 53 5f 59 2c 0a 20 2f 2a 20 5a   CCLASS_Y,. /* Z
1d20: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
1d30: 20 20 20 20 20 2f 2a 20 5b 20 2a 2f 20 43 43 4c       /* [ */ CCL
1d40: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1d50: 5c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  \ */ CCLASS_OTHE
1d60: 52 2c 0a 20 2f 2a 20 5d 20 2a 2f 20 43 43 4c 41  R,. /* ] */ CCLA
1d70: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1d80: 5e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ^ */ CCLASS_OTHE
1d90: 52 2c 20 20 20 2f 2a 20 5f 20 2a 2f 20 43 43 4c  R,   /* _ */ CCL
1da0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 60  ASS_OTHER,. /* `
1db0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1dc0: 2c 20 20 20 20 2f 2a 20 61 20 2a 2f 20 43 43 4c  ,    /* a */ CCL
1dd0: 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20  ASS_VOWEL,   /* 
1de0: 62 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20  b */ CCLASS_B,. 
1df0: 2f 2a 20 63 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* c */ CCLASS_C
1e00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 64 20 2a 2f  ,        /* d */
1e10: 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20 20 20   CCLASS_D,      
1e20: 20 2f 2a 20 65 20 2a 2f 20 43 43 4c 41 53 53 5f   /* e */ CCLASS_
1e30: 56 4f 57 45 4c 2c 0a 20 2f 2a 20 66 20 2a 2f 20  VOWEL,. /* f */ 
1e40: 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20  CCLASS_B,       
1e50: 20 2f 2a 20 67 20 2a 2f 20 43 43 4c 41 53 53 5f   /* g */ CCLASS_
1e60: 43 2c 20 20 20 20 20 20 20 2f 2a 20 68 20 2a 2f  C,       /* h */
1e70: 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c 0a   CCLASS_SILENT,.
1e80: 20 2f 2a 20 69 20 2a 2f 20 43 43 4c 41 53 53 5f   /* i */ CCLASS_
1e90: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 6a 20 2a  VOWEL,    /* j *
1ea0: 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20  / CCLASS_C,     
1eb0: 20 20 2f 2a 20 6b 20 2a 2f 20 43 43 4c 41 53 53    /* k */ CCLASS
1ec0: 5f 43 2c 0a 20 2f 2a 20 6c 20 2a 2f 20 43 43 4c  _C,. /* l */ CCL
1ed0: 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_L,        /*
1ee0: 20 6d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 20   m */ CCLASS_M, 
1ef0: 20 20 20 20 20 20 2f 2a 20 6e 20 2a 2f 20 43 43        /* n */ CC
1f00: 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 6f 20 2a 2f  LASS_M,. /* o */
1f10: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
1f20: 20 20 2f 2a 20 70 20 2a 2f 20 43 43 4c 41 53 53    /* p */ CCLASS
1f30: 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 71 20 2a  _B,       /* q *
1f40: 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20  / CCLASS_C,. /* 
1f50: 72 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c 20 20  r */ CCLASS_R,  
1f60: 20 20 20 20 20 20 2f 2a 20 73 20 2a 2f 20 43 43        /* s */ CC
1f70: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a  LASS_C,       /*
1f80: 20 74 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a   t */ CCLASS_D,.
1f90: 20 2f 2a 20 75 20 2a 2f 20 43 43 4c 41 53 53 5f   /* u */ CCLASS_
1fa0: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 76 20 2a  VOWEL,    /* v *
1fb0: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
1fc0: 20 20 2f 2a 20 77 20 2a 2f 20 43 43 4c 41 53 53    /* w */ CCLASS
1fd0: 5f 42 2c 0a 20 2f 2a 20 78 20 2a 2f 20 43 43 4c  _B,. /* x */ CCL
1fe0: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_C,        /*
1ff0: 20 79 20 2a 2f 20 43 43 4c 41 53 53 5f 59 2c 20   y */ CCLASS_Y, 
2000: 20 20 20 20 20 20 2f 2a 20 7a 20 2a 2f 20 43 43        /* z */ CC
2010: 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 7b 20 2a 2f  LASS_C,. /* { */
2020: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
2030: 20 20 2f 2a 20 7c 20 2a 2f 20 43 43 4c 41 53 53    /* | */ CCLASS
2040: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 7d 20 2a  _OTHER,   /* } *
2050: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
2060: 20 2f 2a 20 7e 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ~ */ CCLASS_
2070: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a  OTHER,    /*   *
2080: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
2090: 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70    .};../*.** Map
20a0: 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 63 68  ping from the ch
20b0: 61 72 61 63 74 65 72 20 63 6c 61 73 73 20 6e 75  aracter class nu
20c0: 6d 62 65 72 20 28 30 2d 31 33 29 20 74 6f 20 61  mber (0-13) to a
20d0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 65 61 63 68   symbol for each
20e0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 63 6c  .** character cl
20f0: 61 73 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ass.  Note that 
2100: 69 6e 69 74 43 6c 61 73 73 5b 5d 20 63 61 6e 20  initClass[] can 
2110: 62 65 20 75 73 65 64 20 74 6f 20 6d 61 70 20 74  be used to map t
2120: 68 65 20 63 6c 61 73 73 0a 2a 2a 20 73 79 6d 62  he class.** symb
2130: 6f 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ol back into the
2140: 20 63 6c 61 73 73 20 6e 75 6d 62 65 72 2e 0a 2a   class number..*
2150: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
2160: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
2170: 73 73 4e 61 6d 65 5b 5d 20 3d 20 22 2e 41 42 43  ssName[] = ".ABC
2180: 44 48 4c 52 4d 59 39 20 3f 22 3b 0a 0a 2f 2a 0a  DHLRMY9 ?";../*.
2190: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 22 70  ** Generate a "p
21a0: 68 6f 6e 65 74 69 63 20 68 61 73 68 22 20 66 72  honetic hash" fr
21b0: 6f 6d 20 61 20 73 74 72 69 6e 67 20 6f 66 20 41  om a string of A
21c0: 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73 0a  SCII characters.
21d0: 2a 2a 20 69 6e 20 7a 49 6e 5b 30 2e 2e 6e 49 6e  ** in zIn[0..nIn
21e0: 2d 31 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4d  -1]..**.**   * M
21f0: 61 70 20 63 68 61 72 61 63 74 65 72 73 20 62 79  ap characters by
2200: 20 63 68 61 72 61 63 74 65 72 20 63 6c 61 73 73   character class
2210: 20 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76   as defined abov
2220: 65 2e 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 64  e..**   * Omit d
2230: 6f 75 62 6c 65 2d 6c 65 74 74 65 72 73 0a 2a 2a  ouble-letters.**
2240: 20 20 20 2a 20 4f 6d 69 74 20 76 6f 77 65 6c 73     * Omit vowels
2250: 20 62 65 73 69 64 65 20 52 20 61 6e 64 20 4c 0a   beside R and L.
2260: 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 54 20 77 68  **   * Omit T wh
2270: 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 43  en followed by C
2280: 48 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 57 20  H.**   * Omit W 
2290: 77 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79  when followed by
22a0: 20 52 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 44   R.**   * Omit D
22b0: 20 77 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62   when followed b
22c0: 79 20 4a 20 6f 72 20 47 0a 2a 2a 20 20 20 2a 20  y J or G.**   * 
22d0: 4f 6d 69 74 20 4b 20 69 6e 20 4b 4e 20 6f 72 20  Omit K in KN or 
22e0: 47 20 69 6e 20 47 4e 20 61 74 20 74 68 65 20 62  G in GN at the b
22f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 77 6f  eginning of a wo
2300: 72 64 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  rd.**.** Space t
2310: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c  o hold the resul
2320: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  t is obtained fr
2330: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
2340: 63 28 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  c().**.** Return
2350: 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20   NULL if memory 
2360: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2370: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  .  .*/.static un
2380: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 68 6f  signed char *pho
2390: 6e 65 74 69 63 48 61 73 68 28 63 6f 6e 73 74 20  neticHash(const 
23a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
23b0: 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20  In, int nIn){.  
23c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
23d0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Out = sqlite3_ma
23e0: 6c 6c 6f 63 36 34 28 20 6e 49 6e 20 2b 20 31 20  lloc64( nIn + 1 
23f0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
2400: 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 63 68  t nOut = 0;.  ch
2410: 61 72 20 63 50 72 65 76 20 3d 20 30 78 37 37 3b  ar cPrev = 0x77;
2420: 0a 20 20 63 68 61 72 20 63 50 72 65 76 58 20 3d  .  char cPrevX =
2430: 20 30 78 37 37 3b 0a 20 20 63 6f 6e 73 74 20 75   0x77;.  const u
2440: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 43  nsigned char *aC
2450: 6c 61 73 73 20 3d 20 69 6e 69 74 43 6c 61 73 73  lass = initClass
2460: 3b 0a 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30  ;..  if( zOut==0
2470: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2480: 66 28 20 6e 49 6e 3e 32 20 29 7b 0a 20 20 20 20  f( nIn>2 ){.    
2490: 73 77 69 74 63 68 28 20 7a 49 6e 5b 30 5d 20 29  switch( zIn[0] )
24a0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 67 27  {.      case 'g'
24b0: 3a 20 0a 20 20 20 20 20 20 63 61 73 65 20 27 6b  : .      case 'k
24c0: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ': {.        if(
24d0: 20 7a 49 6e 5b 31 5d 3d 3d 27 6e 27 20 29 7b 20   zIn[1]=='n' ){ 
24e0: 7a 49 6e 2b 2b 3b 20 6e 49 6e 2d 2d 3b 20 7d 0a  zIn++; nIn--; }.
24f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2510: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49  .  for(i=0; i<nI
2520: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73  n; i++){.    uns
2530: 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 7a  igned char c = z
2540: 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69  In[i];.    if( i
2550: 2b 31 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20  +1<nIn ){.      
2560: 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 7a 49  if( c=='w' && zI
2570: 6e 5b 69 2b 31 5d 3d 3d 27 72 27 20 29 20 63 6f  n[i+1]=='r' ) co
2580: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2590: 28 20 63 3d 3d 27 64 27 20 26 26 20 28 7a 49 6e  ( c=='d' && (zIn
25a0: 5b 69 2b 31 5d 3d 3d 27 6a 27 20 7c 7c 20 7a 49  [i+1]=='j' || zI
25b0: 6e 5b 69 2b 31 5d 3d 3d 27 67 27 29 20 29 20 63  n[i+1]=='g') ) c
25c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
25d0: 66 28 20 69 2b 32 3c 6e 49 6e 20 29 7b 0a 20 20  f( i+2<nIn ){.  
25e0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 74 27        if( c=='t'
25f0: 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 63   && zIn[i+1]=='c
2600: 27 20 26 26 20 7a 49 6e 5b 69 2b 32 5d 3d 3d 27  ' && zIn[i+2]=='
2610: 68 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  h' ) continue;. 
2620: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2630: 20 63 20 3d 20 61 43 6c 61 73 73 5b 63 26 30 78   c = aClass[c&0x
2640: 37 66 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  7f];.    if( c==
2650: 43 43 4c 41 53 53 5f 53 50 41 43 45 20 29 20 63  CCLASS_SPACE ) c
2660: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2670: 20 63 3d 3d 43 43 4c 41 53 53 5f 4f 54 48 45 52   c==CCLASS_OTHER
2680: 20 26 26 20 63 50 72 65 76 21 3d 43 43 4c 41 53   && cPrev!=CCLAS
2690: 53 5f 44 49 47 49 54 20 29 20 63 6f 6e 74 69 6e  S_DIGIT ) contin
26a0: 75 65 3b 0a 20 20 20 20 61 43 6c 61 73 73 20 3d  ue;.    aClass =
26b0: 20 6d 69 64 43 6c 61 73 73 3b 0a 20 20 20 20 69   midClass;.    i
26c0: 66 28 20 63 3d 3d 43 43 4c 41 53 53 5f 56 4f 57  f( c==CCLASS_VOW
26d0: 45 4c 20 26 26 20 28 63 50 72 65 76 58 3d 3d 43  EL && (cPrevX==C
26e0: 43 4c 41 53 53 5f 52 20 7c 7c 20 63 50 72 65 76  CLASS_R || cPrev
26f0: 58 3d 3d 43 43 4c 41 53 53 5f 4c 29 20 29 7b 0a  X==CCLASS_L) ){.
2700: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2710: 20 2f 2a 20 4e 6f 20 76 6f 77 65 6c 73 20 62 65   /* No vowels be
2720: 73 69 64 65 20 4c 20 6f 72 20 52 20 2a 2f 20 0a  side L or R */ .
2730: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 63      }.    if( (c
2740: 3d 3d 43 43 4c 41 53 53 5f 52 20 7c 7c 20 63 3d  ==CCLASS_R || c=
2750: 3d 43 43 4c 41 53 53 5f 4c 29 20 26 26 20 63 50  =CCLASS_L) && cP
2760: 72 65 76 58 3d 3d 43 43 4c 41 53 53 5f 56 4f 57  revX==CCLASS_VOW
2770: 45 4c 20 29 7b 0a 20 20 20 20 20 20 20 6e 4f 75  EL ){.       nOu
2780: 74 2d 2d 3b 20 20 20 2f 2a 20 4e 6f 20 76 6f 77  t--;   /* No vow
2790: 65 6c 73 20 62 65 73 69 64 65 20 4c 20 6f 72 20  els beside L or 
27a0: 52 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  R */.    }.    c
27b0: 50 72 65 76 20 3d 20 63 3b 0a 20 20 20 20 69 66  Prev = c;.    if
27c0: 28 20 63 3d 3d 43 43 4c 41 53 53 5f 53 49 4c 45  ( c==CCLASS_SILE
27d0: 4e 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  NT ) continue;. 
27e0: 20 20 20 63 50 72 65 76 58 20 3d 20 63 3b 0a 20     cPrevX = c;. 
27f0: 20 20 20 63 20 3d 20 63 6c 61 73 73 4e 61 6d 65     c = className
2800: 5b 63 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [c];.    assert(
2810: 20 6e 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 20 20   nOut>=0 );.    
2820: 69 66 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 63  if( nOut==0 || c
2830: 21 3d 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 29  !=zOut[nOut-1] )
2840: 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20   zOut[nOut++] = 
2850: 63 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6e 4f  c;.  }.  zOut[nO
2860: 75 74 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ut] = 0;.  retur
2870: 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zOut;.}../*.**
2880: 20 54 68 69 73 20 69 73 20 61 6e 20 53 51 4c 20   This is an SQL 
2890: 66 75 6e 63 74 69 6f 6e 20 77 72 61 70 70 65 72  function wrapper
28a0: 20 61 72 6f 75 6e 64 20 70 68 6f 6e 65 74 69 63   around phonetic
28b0: 48 61 73 68 28 29 2e 20 20 53 65 65 0a 2a 2a 20  Hash().  See.** 
28c0: 74 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  the description 
28d0: 6f 66 20 70 68 6f 6e 65 74 69 63 48 61 73 68 28  of phoneticHash(
28e0: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
28f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
2900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 68 6f  .static void pho
2910: 6e 65 74 69 63 48 61 73 68 53 71 6c 46 75 6e 63  neticHashSqlFunc
2920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2930: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
2940: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
2950: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
2960: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
2970: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a  gned char *zIn;.
2980: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2990: 2a 7a 4f 75 74 3b 0a 0a 20 20 7a 49 6e 20 3d 20  *zOut;..  zIn = 
29a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
29b0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
29c0: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75  f( zIn==0 ) retu
29d0: 72 6e 3b 0a 20 20 7a 4f 75 74 20 3d 20 70 68 6f  rn;.  zOut = pho
29e0: 6e 65 74 69 63 48 61 73 68 28 7a 49 6e 2c 20 73  neticHash(zIn, s
29f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2a00: 65 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20  es(argv[0]));.  
2a10: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( zOut==0 ){. 
2a20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2a30: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
2a40: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  ntext);.  }else{
2a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2a60: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
2a70: 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20 2d  , (char*)zOut, -
2a80: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
2a90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2aa0: 65 74 75 72 6e 20 74 68 65 20 63 68 61 72 61 63  eturn the charac
2ab0: 74 65 72 20 63 6c 61 73 73 20 6e 75 6d 62 65 72  ter class number
2ac0: 20 66 6f 72 20 61 20 63 68 61 72 61 63 74 65 72   for a character
2ad0: 20 67 69 76 65 6e 20 69 74 73 0a 2a 2a 20 63 6f   given its.** co
2ae0: 6e 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntext..*/.static
2af0: 20 63 68 61 72 20 63 68 61 72 61 63 74 65 72 43   char characterC
2b00: 6c 61 73 73 28 63 68 61 72 20 63 50 72 65 76 2c  lass(char cPrev,
2b10: 20 63 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75   char c){.  retu
2b20: 72 6e 20 63 50 72 65 76 3d 3d 30 20 3f 20 69 6e  rn cPrev==0 ? in
2b30: 69 74 43 6c 61 73 73 5b 63 26 30 78 37 66 5d 20  itClass[c&0x7f] 
2b40: 3a 20 6d 69 64 43 6c 61 73 73 5b 63 26 30 78 37  : midClass[c&0x7
2b50: 66 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  f];.}../*.** Ret
2b60: 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
2b70: 69 6e 73 65 72 74 69 6e 67 20 6f 72 20 64 65 6c  inserting or del
2b80: 65 74 69 6e 67 20 63 68 61 72 61 63 74 65 72 20  eting character 
2b90: 63 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  c immediately.**
2ba0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 61   following chara
2bb0: 63 74 65 72 20 63 50 72 65 76 2e 20 20 49 66 20  cter cPrev.  If 
2bc0: 63 50 72 65 76 3d 3d 30 2c 20 74 68 61 74 20 6d  cPrev==0, that m
2bd0: 65 61 6e 73 20 63 20 69 73 20 74 68 65 20 66 69  eans c is the fi
2be0: 72 73 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  rst.** character
2bf0: 20 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f   of the word..*/
2c00: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
2c10: 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63  rtOrDeleteCost(c
2c20: 68 61 72 20 63 50 72 65 76 2c 20 63 68 61 72 20  har cPrev, char 
2c30: 63 2c 20 63 68 61 72 20 63 4e 65 78 74 29 7b 0a  c, char cNext){.
2c40: 20 20 63 68 61 72 20 63 6c 61 73 73 43 20 3d 20    char classC = 
2c50: 63 68 61 72 61 63 74 65 72 43 6c 61 73 73 28 63  characterClass(c
2c60: 50 72 65 76 2c 20 63 29 3b 0a 20 20 63 68 61 72  Prev, c);.  char
2c70: 20 63 6c 61 73 73 43 70 72 65 76 3b 0a 0a 20 20   classCprev;..  
2c80: 69 66 28 20 63 6c 61 73 73 43 3d 3d 43 43 4c 41  if( classC==CCLA
2c90: 53 53 5f 53 49 4c 45 4e 54 20 29 7b 0a 20 20 20  SS_SILENT ){.   
2ca0: 20 2f 2a 20 49 6e 73 65 72 74 20 6f 72 20 64 65   /* Insert or de
2cb0: 6c 65 74 65 20 22 73 69 6c 65 6e 74 22 20 63 68  lete "silent" ch
2cc0: 61 72 61 63 74 65 72 73 20 73 75 63 68 20 61 73  aracters such as
2cd0: 20 48 20 6f 72 20 57 20 2a 2f 0a 20 20 20 20 72   H or W */.    r
2ce0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2cf0: 66 28 20 63 50 72 65 76 3d 3d 63 20 29 7b 0a 20  f( cPrev==c ){. 
2d00: 20 20 20 2f 2a 20 52 65 70 65 61 74 65 64 20 63     /* Repeated c
2d10: 68 61 72 61 63 74 65 72 73 2c 20 6f 72 20 6d 69  haracters, or mi
2d20: 73 73 20 61 20 72 65 70 65 61 74 20 2a 2f 0a 20  ss a repeat */. 
2d30: 20 20 20 72 65 74 75 72 6e 20 31 30 3b 0a 20 20     return 10;.  
2d40: 7d 0a 20 20 69 66 28 20 63 6c 61 73 73 43 3d 3d  }.  if( classC==
2d50: 43 43 4c 41 53 53 5f 56 4f 57 45 4c 20 26 26 20  CCLASS_VOWEL && 
2d60: 28 63 50 72 65 76 3d 3d 27 72 27 20 7c 7c 20 63  (cPrev=='r' || c
2d70: 4e 65 78 74 3d 3d 27 72 27 29 20 29 7b 0a 20 20  Next=='r') ){.  
2d80: 20 20 72 65 74 75 72 6e 20 32 30 3b 20 20 2f 2a    return 20;  /*
2d90: 20 49 6e 73 65 72 74 20 61 20 76 6f 77 65 6c 20   Insert a vowel 
2da0: 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
2db0: 27 72 27 20 2a 2f 0a 20 20 7d 0a 20 20 63 6c 61  'r' */.  }.  cla
2dc0: 73 73 43 70 72 65 76 20 3d 20 63 68 61 72 61 63  ssCprev = charac
2dd0: 74 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c 20  terClass(cPrev, 
2de0: 63 50 72 65 76 29 3b 0a 20 20 69 66 28 20 63 6c  cPrev);.  if( cl
2df0: 61 73 73 43 3d 3d 63 6c 61 73 73 43 70 72 65 76  assC==classCprev
2e00: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6c 61 73   ){.    if( clas
2e10: 73 43 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c  sC==CCLASS_VOWEL
2e20: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d   ){.      /* Rem
2e30: 6f 76 65 20 6f 72 20 61 64 64 20 61 20 6e 65 77  ove or add a new
2e40: 20 76 6f 77 65 6c 20 74 6f 20 61 20 76 6f 77 65   vowel to a vowe
2e50: 6c 20 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20 20  l cluster */.   
2e60: 20 20 20 72 65 74 75 72 6e 20 31 35 3b 0a 20 20     return 15;.  
2e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2e80: 2a 20 52 65 6d 6f 76 65 20 6f 72 20 61 64 64 20  * Remove or add 
2e90: 61 20 63 6f 6e 73 6f 6e 61 6e 74 20 6e 6f 74 20  a consonant not 
2ea0: 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6c 61 73  in the same clas
2eb0: 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  s */.      retur
2ec0: 6e 20 35 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n 50;.    }.  }.
2ed0: 0a 20 20 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20  .  /* any other 
2ee0: 63 68 61 72 61 63 74 65 72 20 69 6e 73 65 72 74  character insert
2ef0: 69 6f 6e 20 6f 72 20 64 65 6c 65 74 69 6f 6e 20  ion or deletion 
2f00: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 30 30 3b  */.  return 100;
2f10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 76 69 64 65  .}../*.** Divide
2f20: 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 20 63   the insertion c
2f30: 6f 73 74 20 62 79 20 74 68 69 73 20 66 61 63 74  ost by this fact
2f40: 6f 72 20 77 68 65 6e 20 61 70 70 65 6e 64 69 6e  or when appendin
2f50: 67 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  g to the.** end 
2f60: 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a  of the word..*/.
2f70: 23 64 65 66 69 6e 65 20 46 49 4e 41 4c 5f 49 4e  #define FINAL_IN
2f80: 53 5f 43 4f 53 54 5f 44 49 56 20 20 34 0a 0a 2f  S_COST_DIV  4../
2f90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2fa0: 63 6f 73 74 20 6f 66 20 73 75 62 73 74 69 74 75  cost of substitu
2fb0: 74 69 6e 67 20 63 54 6f 20 69 6e 20 70 6c 61 63  ting cTo in plac
2fc0: 65 20 6f 66 20 63 46 72 6f 6d 20 61 73 73 75 6d  e of cFrom assum
2fd0: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  ing.** the previ
2fe0: 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 69 73  ous character is
2ff0: 20 63 50 72 65 76 2e 20 20 49 66 20 63 50 72 65   cPrev.  If cPre
3000: 76 3d 3d 30 20 74 68 65 6e 20 63 54 6f 20 69 73  v==0 then cTo is
3010: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 68   the first.** ch
3020: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 77  aracter of the w
3030: 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ord..*/.static i
3040: 6e 74 20 73 75 62 73 74 69 74 75 74 65 43 6f 73  nt substituteCos
3050: 74 28 63 68 61 72 20 63 50 72 65 76 2c 20 63 68  t(char cPrev, ch
3060: 61 72 20 63 46 72 6f 6d 2c 20 63 68 61 72 20 63  ar cFrom, char c
3070: 54 6f 29 7b 0a 20 20 63 68 61 72 20 63 6c 61 73  To){.  char clas
3080: 73 46 72 6f 6d 2c 20 63 6c 61 73 73 54 6f 3b 0a  sFrom, classTo;.
3090: 20 20 69 66 28 20 63 46 72 6f 6d 3d 3d 63 54 6f    if( cFrom==cTo
30a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 61 63 74   ){.    /* Exact
30b0: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 72 65   match */.    re
30c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
30d0: 28 20 63 46 72 6f 6d 3d 3d 28 63 54 6f 5e 30 78  ( cFrom==(cTo^0x
30e0: 32 30 29 20 26 26 20 28 28 63 54 6f 3e 3d 27 41  20) && ((cTo>='A
30f0: 27 20 26 26 20 63 54 6f 3c 3d 27 5a 27 29 20 7c  ' && cTo<='Z') |
3100: 7c 20 28 63 54 6f 3e 3d 27 61 27 20 26 26 20 63  | (cTo>='a' && c
3110: 54 6f 3c 3d 27 7a 27 29 29 20 29 7b 0a 20 20 20  To<='z')) ){.   
3120: 20 2f 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20   /* differ only 
3130: 69 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 72  in case */.    r
3140: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63  eturn 0;.  }.  c
3150: 6c 61 73 73 46 72 6f 6d 20 3d 20 63 68 61 72 61  lassFrom = chara
3160: 63 74 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c  cterClass(cPrev,
3170: 20 63 46 72 6f 6d 29 3b 0a 20 20 63 6c 61 73 73   cFrom);.  class
3180: 54 6f 20 3d 20 63 68 61 72 61 63 74 65 72 43 6c  To = characterCl
3190: 61 73 73 28 63 50 72 65 76 2c 20 63 54 6f 29 3b  ass(cPrev, cTo);
31a0: 0a 20 20 69 66 28 20 63 6c 61 73 73 46 72 6f 6d  .  if( classFrom
31b0: 3d 3d 63 6c 61 73 73 54 6f 20 29 7b 0a 20 20 20  ==classTo ){.   
31c0: 20 2f 2a 20 53 61 6d 65 20 63 68 61 72 61 63 74   /* Same charact
31d0: 65 72 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20  er class */.    
31e0: 72 65 74 75 72 6e 20 34 30 3b 0a 20 20 7d 0a 20  return 40;.  }. 
31f0: 20 69 66 28 20 63 6c 61 73 73 46 72 6f 6d 3e 3d   if( classFrom>=
3200: 43 43 4c 41 53 53 5f 42 20 26 26 20 63 6c 61 73  CCLASS_B && clas
3210: 73 46 72 6f 6d 3c 3d 43 43 4c 41 53 53 5f 59 0a  sFrom<=CCLASS_Y.
3220: 20 20 20 20 20 20 26 26 20 63 6c 61 73 73 54 6f        && classTo
3230: 3e 3d 43 43 4c 41 53 53 5f 42 20 26 26 20 63 6c  >=CCLASS_B && cl
3240: 61 73 73 54 6f 3c 3d 43 43 4c 41 53 53 5f 59 20  assTo<=CCLASS_Y 
3250: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ){.    /* Conver
3260: 74 20 66 72 6f 6d 20 6f 6e 65 20 63 6f 6e 73 6f  t from one conso
3270: 6e 61 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72 2c  nant to another,
3280: 20 62 75 74 20 69 6e 20 61 20 64 69 66 66 65 72   but in a differ
3290: 65 6e 74 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20  ent class */.   
32a0: 20 72 65 74 75 72 6e 20 37 35 3b 0a 20 20 7d 0a   return 75;.  }.
32b0: 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 73    /* Any other s
32c0: 75 62 73 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  ubsitution */.  
32d0: 72 65 74 75 72 6e 20 31 30 30 3b 0a 7d 0a 0a 2f  return 100;.}../
32e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 77 6f 20 73  *.** Given two s
32f0: 74 72 69 6e 67 73 20 7a 41 20 61 6e 64 20 7a 42  trings zA and zB
3300: 20 77 68 69 63 68 20 61 72 65 20 70 75 72 65 20   which are pure 
3310: 41 53 43 49 49 2c 20 72 65 74 75 72 6e 20 74 68  ASCII, return th
3320: 65 20 63 6f 73 74 0a 2a 2a 20 6f 66 20 74 72 61  e cost.** of tra
3330: 6e 73 66 6f 72 6d 69 6e 67 20 7a 41 20 69 6e 74  nsforming zA int
3340: 6f 20 7a 42 2e 20 20 49 66 20 7a 41 20 65 6e 64  o zB.  If zA end
3350: 73 20 77 69 74 68 20 27 2a 27 20 61 73 73 75 6d  s with '*' assum
3360: 65 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  e that it is.** 
3370: 61 20 70 72 65 66 69 78 20 6f 66 20 7a 42 20 61  a prefix of zB a
3380: 6e 64 20 67 69 76 65 20 6f 6e 6c 79 20 6d 69 6e  nd give only min
3390: 69 6d 61 6c 20 70 65 6e 61 6c 74 79 20 66 6f 72  imal penalty for
33a0: 20 65 78 74 72 61 20 63 68 61 72 61 63 74 65 72   extra character
33b0: 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 6e 64 20  s.** on the end 
33c0: 6f 66 20 7a 42 2e 0a 2a 2a 0a 2a 2a 20 53 6d 61  of zB..**.** Sma
33d0: 6c 6c 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 61  ller numbers mea
33e0: 6e 20 61 20 63 6c 6f 73 65 72 20 6d 61 74 63 68  n a closer match
33f0: 2e 0a 2a 2a 0a 2a 2a 20 4e 65 67 61 74 69 76 65  ..**.** Negative
3400: 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
3410: 20 61 6e 20 65 72 72 6f 72 3a 0a 2a 2a 20 20 20   an error:.**   
3420: 20 2d 31 20 20 4f 6e 65 20 6f 66 20 74 68 65 20   -1  One of the 
3430: 69 6e 70 75 74 73 20 69 73 20 4e 55 4c 4c 0a 2a  inputs is NULL.*
3440: 2a 20 20 20 20 2d 32 20 20 4e 6f 6e 2d 41 53 43  *    -2  Non-ASC
3450: 49 49 20 63 68 61 72 61 63 74 65 72 73 20 6f 6e  II characters on
3460: 20 69 6e 70 75 74 0a 2a 2a 20 20 20 20 2d 33 20   input.**    -3 
3470: 20 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   Unable to alloc
3480: 61 74 65 20 6d 65 6d 6f 72 79 20 0a 2a 2a 0a 2a  ate memory .**.*
3490: 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69 73 20  * If pnMatch is 
34a0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a  not NULL, then *
34b0: 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74 20 74  pnMatch is set t
34c0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
34d0: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 7a 42 20 74  bytes.** of zB t
34e0: 68 61 74 20 6d 61 74 63 68 65 64 20 74 68 65 20  hat matched the 
34f0: 70 61 74 74 65 72 6e 20 69 6e 20 7a 41 2e 20 49  pattern in zA. I
3500: 66 20 7a 41 20 64 6f 65 73 20 6e 6f 74 20 65 6e  f zA does not en
3510: 64 20 77 69 74 68 20 61 20 27 2a 27 2c 0a 2a 2a  d with a '*',.**
3520: 20 74 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65   then this value
3530: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e   is always the n
3540: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
3550: 6e 20 7a 42 20 28 69 2e 65 2e 20 73 74 72 6c 65  n zB (i.e. strle
3560: 6e 28 7a 42 29 29 2e 0a 2a 2a 20 49 66 20 7a 41  n(zB))..** If zA
3570: 20 64 6f 65 73 20 65 6e 64 20 69 6e 20 61 20 27   does end in a '
3580: 2a 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  *', then it is t
3590: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
35a0: 65 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  es in the prefix
35b0: 0a 2a 2a 20 6f 66 20 7a 42 20 74 68 61 74 20 77  .** of zB that w
35c0: 61 73 20 64 65 65 6d 65 64 20 74 6f 20 6d 61 74  as deemed to mat
35d0: 63 68 20 7a 41 2e 0a 2a 2f 0a 73 74 61 74 69 63  ch zA..*/.static
35e0: 20 69 6e 74 20 65 64 69 74 64 69 73 74 31 28 63   int editdist1(c
35f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63  onst char *zA, c
3600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 69  onst char *zB, i
3610: 6e 74 20 2a 70 6e 4d 61 74 63 68 29 7b 0a 20 20  nt *pnMatch){.  
3620: 69 6e 74 20 6e 41 2c 20 6e 42 3b 20 20 20 20 20  int nA, nB;     
3630: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3640: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
3650: 6e 20 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20  n zA[] and zB[] 
3660: 2a 2f 0a 20 20 69 6e 74 20 78 41 2c 20 78 42 3b  */.  int xA, xB;
3670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3680: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 66 6f 72  oop counters for
3690: 20 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a   zA[] and zB[] *
36a0: 2f 0a 20 20 63 68 61 72 20 63 41 20 3d 20 30 2c  /.  char cA = 0,
36b0: 20 63 42 3b 20 20 20 20 20 20 20 2f 2a 20 43 75   cB;       /* Cu
36c0: 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 20  rrent character 
36d0: 6f 66 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a  of zA and zB */.
36e0: 20 20 63 68 61 72 20 63 41 70 72 65 76 2c 20 63    char cAprev, c
36f0: 42 70 72 65 76 3b 20 20 20 2f 2a 20 50 72 65 76  Bprev;   /* Prev
3700: 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 6f  ious character o
3710: 66 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20  f zA and zB */. 
3720: 20 63 68 61 72 20 63 41 6e 65 78 74 2c 20 63 42   char cAnext, cB
3730: 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
3740: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 41 20  character in zA 
3750: 61 6e 64 20 7a 42 20 2a 2f 0a 20 20 69 6e 74 20  and zB */.  int 
3760: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3770: 20 20 20 2f 2a 20 4e 6f 72 74 68 2d 77 65 73 74     /* North-west
3780: 20 63 6f 73 74 20 76 61 6c 75 65 20 2a 2f 0a 20   cost value */. 
3790: 20 69 6e 74 20 64 63 20 3d 20 30 3b 20 20 20 20   int dc = 0;    
37a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 74 68          /* North
37b0: 2d 77 65 73 74 20 63 68 61 72 61 63 74 65 72 20  -west character 
37c0: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72  value */.  int r
37d0: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
37e0: 20 20 2f 2a 20 46 69 6e 61 6c 20 72 65 73 75 6c    /* Final resul
37f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 6d 3b 20 20  t */.  int *m;  
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3810: 20 54 68 65 20 63 6f 73 74 20 6d 61 74 72 69 78   The cost matrix
3820: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 78 3b 20   */.  char *cx; 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3840: 43 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68  Corresponding ch
3850: 61 72 61 63 74 65 72 20 76 61 6c 75 65 73 20 2a  aracter values *
3860: 2f 0a 20 20 69 6e 74 20 2a 74 6f 46 72 65 65 20  /.  int *toFree 
3870: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  = 0;       /* Ma
3880: 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 2a 2f 0a  lloced space */.
3890: 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30    int nMatch = 0
38a0: 3b 0a 20 20 69 6e 74 20 6d 53 74 61 63 6b 5b 36  ;.  int mStack[6
38b0: 30 2b 31 35 5d 3b 20 20 20 20 20 2f 2a 20 53 74  0+15];     /* St
38c0: 61 63 6b 20 73 70 61 63 65 20 74 6f 20 75 73 65  ack space to use
38d0: 20 69 66 20 6e 6f 74 20 74 6f 6f 20 6d 75 63 68   if not too much
38e0: 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20   is needed */.. 
38f0: 20 2f 2a 20 45 61 72 6c 79 20 6f 75 74 20 69 66   /* Early out if
3900: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
3910: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 7a   NULL */.  if( z
3920: 41 3d 3d 30 20 7c 7c 20 7a 42 3d 3d 30 20 29 20  A==0 || zB==0 ) 
3930: 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 2f 2a  return -1;..  /*
3940: 20 53 6b 69 70 20 61 6e 79 20 63 6f 6d 6d 6f 6e   Skip any common
3950: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 77 68 69   prefix */.  whi
3960: 6c 65 28 20 7a 41 5b 30 5d 20 26 26 20 7a 41 5b  le( zA[0] && zA[
3970: 30 5d 3d 3d 7a 42 5b 30 5d 20 29 7b 20 64 63 20  0]==zB[0] ){ dc 
3980: 3d 20 7a 41 5b 30 5d 3b 20 7a 41 2b 2b 3b 20 7a  = zA[0]; zA++; z
3990: 42 2b 2b 3b 20 6e 4d 61 74 63 68 2b 2b 3b 20 7d  B++; nMatch++; }
39a0: 0a 20 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29  .  if( pnMatch )
39b0: 20 2a 70 6e 4d 61 74 63 68 20 3d 20 6e 4d 61 74   *pnMatch = nMat
39c0: 63 68 3b 0a 20 20 69 66 28 20 7a 41 5b 30 5d 3d  ch;.  if( zA[0]=
39d0: 3d 30 20 26 26 20 7a 42 5b 30 5d 3d 3d 30 20 29  =0 && zB[0]==0 )
39e0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 23 69 66 20   return 0;..#if 
39f0: 30 0a 20 20 70 72 69 6e 74 66 28 22 41 3d 5c 22  0.  printf("A=\"
3a00: 25 73 5c 22 20 42 3d 5c 22 25 73 5c 22 20 64 63  %s\" B=\"%s\" dc
3a10: 3d 25 63 5c 6e 22 2c 20 7a 41 2c 20 7a 42 2c 20  =%c\n", zA, zB, 
3a20: 64 63 3f 64 63 3a 27 20 27 29 3b 0a 23 65 6e 64  dc?dc:' ');.#end
3a30: 69 66 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  if..  /* Verify 
3a40: 69 6e 70 75 74 20 73 74 72 69 6e 67 73 20 61 6e  input strings an
3a50: 64 20 6d 65 61 73 75 72 65 20 74 68 65 69 72 20  d measure their 
3a60: 6c 65 6e 67 74 68 73 20 2a 2f 0a 20 20 66 6f 72  lengths */.  for
3a70: 28 6e 41 3d 30 3b 20 7a 41 5b 6e 41 5d 3b 20 6e  (nA=0; zA[nA]; n
3a80: 41 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 41  A++){.    if( zA
3a90: 5b 6e 41 5d 26 30 78 38 30 20 29 20 72 65 74 75  [nA]&0x80 ) retu
3aa0: 72 6e 20 2d 32 3b 0a 20 20 7d 0a 20 20 66 6f 72  rn -2;.  }.  for
3ab0: 28 6e 42 3d 30 3b 20 7a 42 5b 6e 42 5d 3b 20 6e  (nB=0; zB[nB]; n
3ac0: 42 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 42  B++){.    if( zB
3ad0: 5b 6e 42 5d 26 30 78 38 30 20 29 20 72 65 74 75  [nB]&0x80 ) retu
3ae0: 72 6e 20 2d 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn -2;.  }..  /*
3af0: 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
3b00: 69 6e 67 20 69 66 20 65 69 74 68 65 72 20 73 74  ing if either st
3b10: 72 69 6e 67 20 69 73 20 65 6d 70 74 79 20 2a 2f  ring is empty */
3b20: 0a 20 20 69 66 28 20 6e 41 3d 3d 30 20 29 7b 0a  .  if( nA==0 ){.
3b30: 20 20 20 20 63 42 70 72 65 76 20 3d 20 28 63 68      cBprev = (ch
3b40: 61 72 29 64 63 3b 0a 20 20 20 20 66 6f 72 28 78  ar)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 28 63 68 61 72 29 64 63 3b 0a 20  ev = (char)dc;. 
3c10: 20 20 20 66 6f 72 28 78 41 3d 72 65 73 3d 30 3b     for(xA=res=0;
3c20: 20 28 63 41 20 3d 20 7a 41 5b 78 41 5d 29 21 3d   (cA = zA[xA])!=
3c30: 30 3b 20 78 41 2b 2b 29 7b 0a 20 20 20 20 20 20  0; xA++){.      
3c40: 72 65 73 20 2b 3d 20 69 6e 73 65 72 74 4f 72 44  res += insertOrD
3c50: 65 6c 65 74 65 43 6f 73 74 28 63 41 70 72 65 76  eleteCost(cAprev
3c60: 2c 20 63 41 2c 20 7a 41 5b 78 41 2b 31 5d 29 3b  , cA, zA[xA+1]);
3c70: 0a 20 20 20 20 20 20 63 41 70 72 65 76 20 3d 20  .      cAprev = 
3c80: 63 41 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  cA;.    }.    re
3c90: 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d 0a 0a 20  turn res;.  }.. 
3ca0: 20 2f 2a 20 41 20 69 73 20 61 20 70 72 65 66 69   /* A is a prefi
3cb0: 78 20 6f 66 20 42 20 2a 2f 0a 20 20 69 66 28 20  x of B */.  if( 
3cc0: 7a 41 5b 30 5d 3d 3d 27 2a 27 20 26 26 20 7a 41  zA[0]=='*' && zA
3cd0: 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [1]==0 ) return 
3ce0: 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  0;..  /* Allocat
3cf0: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
3d00: 20 74 68 65 20 57 61 67 6e 65 72 20 6d 61 74 72   the Wagner matr
3d10: 69 78 20 2a 2f 0a 20 20 69 66 28 20 6e 42 3c 28  ix */.  if( nB<(
3d20: 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b 29 2a 34  sizeof(mStack)*4
3d30: 29 2f 28 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b  )/(sizeof(mStack
3d40: 5b 30 5d 29 2a 35 29 20 29 7b 0a 20 20 20 20 6d  [0])*5) ){.    m
3d50: 20 3d 20 6d 53 74 61 63 6b 3b 0a 20 20 7d 65 6c   = mStack;.  }el
3d60: 73 65 7b 0a 20 20 20 20 6d 20 3d 20 74 6f 46 72  se{.    m = toFr
3d70: 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ee = sqlite3_mal
3d80: 6c 6f 63 36 34 28 20 28 6e 42 2b 31 29 2a 35 2a  loc64( (nB+1)*5*
3d90: 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 2f 34 20 29  sizeof(m[0])/4 )
3da0: 3b 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29  ;.    if( m==0 )
3db0: 20 72 65 74 75 72 6e 20 2d 33 3b 0a 20 20 7d 0a   return -3;.  }.
3dc0: 20 20 63 78 20 3d 20 28 63 68 61 72 2a 29 26 6d    cx = (char*)&m
3dd0: 5b 6e 42 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 43 6f  [nB+1];..  /* Co
3de0: 6d 70 75 74 65 20 74 68 65 20 57 61 67 6e 65 72  mpute the Wagner
3df0: 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 2a   edit distance *
3e00: 2f 0a 20 20 6d 5b 30 5d 20 3d 20 30 3b 0a 20 20  /.  m[0] = 0;.  
3e10: 63 78 5b 30 5d 20 3d 20 28 63 68 61 72 29 64 63  cx[0] = (char)dc
3e20: 3b 0a 20 20 63 42 70 72 65 76 20 3d 20 28 63 68  ;.  cBprev = (ch
3e30: 61 72 29 64 63 3b 0a 20 20 66 6f 72 28 78 42 3d  ar)dc;.  for(xB=
3e40: 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b 2b 29  1; xB<=nB; xB++)
3e50: 7b 0a 20 20 20 20 63 42 6e 65 78 74 20 3d 20 7a  {.    cBnext = z
3e60: 42 5b 78 42 5d 3b 0a 20 20 20 20 63 42 20 3d 20  B[xB];.    cB = 
3e70: 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20 20 20 63 78  zB[xB-1];.    cx
3e80: 5b 78 42 5d 20 3d 20 63 42 3b 0a 20 20 20 20 6d  [xB] = cB;.    m
3e90: 5b 78 42 5d 20 3d 20 6d 5b 78 42 2d 31 5d 20 2b  [xB] = m[xB-1] +
3ea0: 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43   insertOrDeleteC
3eb0: 6f 73 74 28 63 42 70 72 65 76 2c 20 63 42 2c 20  ost(cBprev, cB, 
3ec0: 63 42 6e 65 78 74 29 3b 0a 20 20 20 20 63 42 70  cBnext);.    cBp
3ed0: 72 65 76 20 3d 20 63 42 3b 0a 20 20 7d 0a 20 20  rev = cB;.  }.  
3ee0: 63 41 70 72 65 76 20 3d 20 28 63 68 61 72 29 64  cAprev = (char)d
3ef0: 63 3b 0a 20 20 66 6f 72 28 78 41 3d 31 3b 20 78  c;.  for(xA=1; x
3f00: 41 3c 3d 6e 41 3b 20 78 41 2b 2b 29 7b 0a 20 20  A<=nA; xA++){.  
3f10: 20 20 69 6e 74 20 6c 61 73 74 41 20 3d 20 28 78    int lastA = (x
3f20: 41 3d 3d 6e 41 29 3b 0a 20 20 20 20 63 41 20 3d  A==nA);.    cA =
3f30: 20 7a 41 5b 78 41 2d 31 5d 3b 0a 20 20 20 20 63   zA[xA-1];.    c
3f40: 41 6e 65 78 74 20 3d 20 7a 41 5b 78 41 5d 3b 0a  Anext = zA[xA];.
3f50: 20 20 20 20 69 66 28 20 63 41 3d 3d 27 2a 27 20      if( cA=='*' 
3f60: 26 26 20 6c 61 73 74 41 20 29 20 62 72 65 61 6b  && lastA ) break
3f70: 3b 0a 20 20 20 20 64 20 3d 20 6d 5b 30 5d 3b 0a  ;.    d = m[0];.
3f80: 20 20 20 20 64 63 20 3d 20 63 78 5b 30 5d 3b 0a      dc = cx[0];.
3f90: 20 20 20 20 6d 5b 30 5d 20 3d 20 64 20 2b 20 69      m[0] = d + i
3fa0: 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73  nsertOrDeleteCos
3fb0: 74 28 63 41 70 72 65 76 2c 20 63 41 2c 20 63 41  t(cAprev, cA, cA
3fc0: 6e 65 78 74 29 3b 0a 20 20 20 20 63 42 70 72 65  next);.    cBpre
3fd0: 76 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 78  v = 0;.    for(x
3fe0: 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b  B=1; xB<=nB; xB+
3ff0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f  +){.      int to
4000: 74 61 6c 43 6f 73 74 2c 20 69 6e 73 43 6f 73 74  talCost, insCost
4010: 2c 20 64 65 6c 43 6f 73 74 2c 20 73 75 62 43 6f  , delCost, subCo
4020: 73 74 2c 20 6e 63 78 3b 0a 20 20 20 20 20 20 63  st, ncx;.      c
4030: 42 20 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20  B = zB[xB-1];.  
4040: 20 20 20 20 63 42 6e 65 78 74 20 3d 20 7a 42 5b      cBnext = zB[
4050: 78 42 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  xB];..      /* C
4060: 6f 73 74 20 74 6f 20 69 6e 73 65 72 74 20 63 42  ost to insert cB
4070: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 73 43 6f 73   */.      insCos
4080: 74 20 3d 20 69 6e 73 65 72 74 4f 72 44 65 6c 65  t = insertOrDele
4090: 74 65 43 6f 73 74 28 63 78 5b 78 42 2d 31 5d 2c  teCost(cx[xB-1],
40a0: 20 63 42 2c 20 63 42 6e 65 78 74 29 3b 0a 20 20   cB, cBnext);.  
40b0: 20 20 20 20 69 66 28 20 6c 61 73 74 41 20 29 20      if( lastA ) 
40c0: 69 6e 73 43 6f 73 74 20 2f 3d 20 46 49 4e 41 4c  insCost /= FINAL
40d0: 5f 49 4e 53 5f 43 4f 53 54 5f 44 49 56 3b 0a 0a  _INS_COST_DIV;..
40e0: 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f        /* Cost to
40f0: 20 64 65 6c 65 74 65 20 63 41 20 2a 2f 0a 20 20   delete cA */.  
4100: 20 20 20 20 64 65 6c 43 6f 73 74 20 3d 20 69 6e      delCost = in
4110: 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74  sertOrDeleteCost
4120: 28 63 78 5b 78 42 5d 2c 20 63 41 2c 20 63 42 6e  (cx[xB], cA, cBn
4130: 65 78 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ext);..      /* 
4140: 43 6f 73 74 20 74 6f 20 73 75 62 73 74 69 74 75  Cost to substitu
4150: 74 65 20 63 41 2d 3e 63 42 20 2a 2f 0a 20 20 20  te cA->cB */.   
4160: 20 20 20 73 75 62 43 6f 73 74 20 3d 20 73 75 62     subCost = sub
4170: 73 74 69 74 75 74 65 43 6f 73 74 28 63 78 5b 78  stituteCost(cx[x
4180: 42 2d 31 5d 2c 20 63 41 2c 20 63 42 29 3b 0a 0a  B-1], cA, cB);..
4190: 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 63 6f        /* Best co
41a0: 73 74 20 2a 2f 0a 20 20 20 20 20 20 74 6f 74 61  st */.      tota
41b0: 6c 43 6f 73 74 20 3d 20 69 6e 73 43 6f 73 74 20  lCost = insCost 
41c0: 2b 20 6d 5b 78 42 2d 31 5d 3b 0a 20 20 20 20 20  + m[xB-1];.     
41d0: 20 6e 63 78 20 3d 20 63 42 3b 0a 20 20 20 20 20   ncx = cB;.     
41e0: 20 69 66 28 20 28 64 65 6c 43 6f 73 74 20 2b 20   if( (delCost + 
41f0: 6d 5b 78 42 5d 29 3c 74 6f 74 61 6c 43 6f 73 74  m[xB])<totalCost
4200: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 74 61   ){.        tota
4210: 6c 43 6f 73 74 20 3d 20 64 65 6c 43 6f 73 74 20  lCost = delCost 
4220: 2b 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20 20  + m[xB];.       
4230: 20 6e 63 78 20 3d 20 63 41 3b 0a 20 20 20 20 20   ncx = cA;.     
4240: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 75   }.      if( (su
4250: 62 43 6f 73 74 20 2b 20 64 29 3c 74 6f 74 61 6c  bCost + d)<total
4260: 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
4270: 74 6f 74 61 6c 43 6f 73 74 20 3d 20 73 75 62 43  totalCost = subC
4280: 6f 73 74 20 2b 20 64 3b 0a 20 20 20 20 20 20 7d  ost + d;.      }
4290: 0a 0a 23 69 66 20 30 0a 20 20 20 20 20 20 70 72  ..#if 0.      pr
42a0: 69 6e 74 66 28 22 25 64 2c 25 64 20 64 3d 25 34  intf("%d,%d d=%4
42b0: 64 20 75 3d 25 34 64 20 72 3d 25 34 64 20 64 63  d u=%4d r=%4d dc
42c0: 3d 25 63 20 63 41 3d 25 63 20 63 42 3d 25 63 22  =%c cA=%c cB=%c"
42d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
42e0: 69 6e 73 3d 25 34 64 20 64 65 6c 3d 25 34 64 20  ins=%4d del=%4d 
42f0: 73 75 62 3d 25 34 64 20 74 3d 25 34 64 20 6e 63  sub=%4d t=%4d nc
4300: 78 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  x=%c\n",.       
4310: 20 20 20 20 20 20 78 41 2c 20 78 42 2c 20 64 2c        xA, xB, d,
4320: 20 6d 5b 78 42 5d 2c 20 6d 5b 78 42 2d 31 5d 2c   m[xB], m[xB-1],
4330: 20 64 63 3f 64 63 3a 27 20 27 2c 20 63 41 2c 20   dc?dc:' ', cA, 
4340: 63 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  cB,.            
4350: 20 69 6e 73 43 6f 73 74 2c 20 64 65 6c 43 6f 73   insCost, delCos
4360: 74 2c 20 73 75 62 43 6f 73 74 2c 20 74 6f 74 61  t, subCost, tota
4370: 6c 43 6f 73 74 2c 20 6e 63 78 3f 6e 63 78 3a 27  lCost, ncx?ncx:'
4380: 20 27 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20   ');.#endif..   
4390: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
43a0: 20 6d 61 74 72 69 78 20 2a 2f 0a 20 20 20 20 20   matrix */.     
43b0: 20 64 20 3d 20 6d 5b 78 42 5d 3b 0a 20 20 20 20   d = m[xB];.    
43c0: 20 20 64 63 20 3d 20 63 78 5b 78 42 5d 3b 0a 20    dc = cx[xB];. 
43d0: 20 20 20 20 20 6d 5b 78 42 5d 20 3d 20 74 6f 74       m[xB] = tot
43e0: 61 6c 43 6f 73 74 3b 0a 20 20 20 20 20 20 63 78  alCost;.      cx
43f0: 5b 78 42 5d 20 3d 20 28 63 68 61 72 29 6e 63 78  [xB] = (char)ncx
4400: 3b 0a 20 20 20 20 20 20 63 42 70 72 65 76 20 3d  ;.      cBprev =
4410: 20 63 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   cB;.    }.    c
4420: 41 70 72 65 76 20 3d 20 63 41 3b 0a 20 20 7d 0a  Aprev = cA;.  }.
4430: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 77  .  /* Free the w
4440: 61 67 6e 65 72 20 6d 61 74 72 69 78 20 61 6e 64  agner matrix and
4450: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   return the resu
4460: 6c 74 20 2a 2f 0a 20 20 69 66 28 20 63 41 3d 3d  lt */.  if( cA==
4470: 27 2a 27 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  '*' ){.    res =
4480: 20 6d 5b 31 5d 3b 0a 20 20 20 20 66 6f 72 28 78   m[1];.    for(x
4490: 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b  B=1; xB<=nB; xB+
44a0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 5b  +){.      if( m[
44b0: 78 42 5d 3c 72 65 73 20 29 7b 0a 20 20 20 20 20  xB]<res ){.     
44c0: 20 20 20 72 65 73 20 3d 20 6d 5b 78 42 5d 3b 0a     res = m[xB];.
44d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 4d 61          if( pnMa
44e0: 74 63 68 20 29 20 2a 70 6e 4d 61 74 63 68 20 3d  tch ) *pnMatch =
44f0: 20 78 42 2b 6e 4d 61 74 63 68 3b 0a 20 20 20 20   xB+nMatch;.    
4500: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
4510: 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 6d 5b 6e  e{.    res = m[n
4520: 42 5d 3b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  B];.    /* In th
4530: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
4540: 65 6e 74 61 74 69 6f 6e 2c 20 70 6e 4d 61 74 63  entation, pnMatc
4550: 68 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c  h is always NULL
4560: 20 69 66 20 7a 41 20 64 6f 65 73 0a 20 20 20 20   if zA does.    
4570: 2a 2a 20 6e 6f 74 20 65 6e 64 20 69 6e 20 22 2a  ** not end in "*
4580: 22 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  " */.    assert(
4590: 20 70 6e 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 20   pnMatch==0 );. 
45a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
45b0: 65 28 74 6f 46 72 65 65 29 3b 0a 20 20 72 65 74  e(toFree);.  ret
45c0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
45d0: 2a 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65  * Function:    e
45e0: 64 69 74 64 69 73 74 28 41 2c 42 29 0a 2a 2a 0a  ditdist(A,B).**.
45f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
4600: 73 74 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  st of transformi
4610: 6e 67 20 73 74 72 69 6e 67 20 41 20 69 6e 74 6f  ng string A into
4620: 20 73 74 72 69 6e 67 20 42 2e 20 20 42 6f 74 68   string B.  Both
4630: 20 73 74 72 69 6e 67 73 0a 2a 2a 20 6d 75 73 74   strings.** must
4640: 20 62 65 20 70 75 72 65 20 41 53 43 49 49 20 74   be pure ASCII t
4650: 65 78 74 2e 20 20 49 66 20 41 20 65 6e 64 73 20  ext.  If A ends 
4660: 77 69 74 68 20 27 2a 27 20 74 68 65 6e 20 69 74  with '*' then it
4670: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62   is assumed to b
4680: 65 0a 2a 2a 20 61 20 70 72 65 66 69 78 20 6f 66  e.** a prefix of
4690: 20 42 20 61 6e 64 20 65 78 74 72 61 20 63 68 61   B and extra cha
46a0: 72 61 63 74 65 72 73 20 6f 6e 20 74 68 65 20 65  racters on the e
46b0: 6e 64 20 6f 66 20 42 20 68 61 76 65 20 6d 69 6e  nd of B have min
46c0: 69 6d 61 6c 20 61 64 64 69 74 69 6f 6e 61 6c 0a  imal additional.
46d0: 2a 2a 20 63 6f 73 74 2e 0a 2a 2f 0a 73 74 61 74  ** cost..*/.stat
46e0: 69 63 20 76 6f 69 64 20 65 64 69 74 64 69 73 74  ic void editdist
46f0: 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  SqlFunc(.  sqlit
4700: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4710: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
4720: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4730: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
4740: 20 72 65 73 20 3d 20 65 64 69 74 64 69 73 74 31   res = editdist1
4750: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
4760: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
4770: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
4780: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a  _text(argv[0]),.
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
47b0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
47c0: 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 0a 20 20  ext(argv[1]),.  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 30 29 3b 0a 20 20 69 66 28 20 72 65 73 3c    0);.  if( res<
47f0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73  0 ){.    if( res
4800: 3d 3d 28 2d 33 29 20 29 7b 0a 20 20 20 20 20 20  ==(-3) ){.      
4810: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
4820: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
4830: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  xt);.    }else i
4840: 66 28 20 72 65 73 3d 3d 28 2d 32 29 20 29 7b 0a  f( res==(-2) ){.
4850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4860: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
4870: 78 74 2c 20 22 6e 6f 6e 2d 41 53 43 49 49 20 69  xt, "non-ASCII i
4880: 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69 73 74  nput to editdist
4890: 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65  ()", -1);.    }e
48a0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
48b0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
48c0: 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69  context, "NULL i
48d0: 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69 73 74  nput to editdist
48e0: 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ()", -1);.    }.
48f0: 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 73 71    }else{ .    sq
4900: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4910: 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b 0a  (context, res);.
4920: 20 20 7d 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66    }.}../* End of
4930: 20 74 68 65 20 66 69 78 65 64 2d 63 6f 73 74 20   the fixed-cost 
4940: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 69 6d  edit distance im
4950: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 2a  plementation.***
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a  ****************
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67  *********.** Beg
4a00: 69 6e 3a 20 43 6f 6e 66 69 67 75 72 61 62 6c 65  in: Configurable
4a10: 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64   cost unicode ed
4a20: 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74  it distance rout
4a30: 69 6e 65 73 0a 2a 2f 0a 2f 2a 20 46 6f 72 77 61  ines.*/./* Forwa
4a40: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
4a50: 66 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  f structures */.
4a60: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
4a70: 64 69 74 44 69 73 74 33 43 6f 73 74 20 45 64 69  ditDist3Cost Edi
4a80: 74 44 69 73 74 33 43 6f 73 74 3b 0a 74 79 70 65  tDist3Cost;.type
4a90: 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44  def struct EditD
4aa0: 69 73 74 33 43 6f 6e 66 69 67 20 45 64 69 74 44  ist3Config EditD
4ab0: 69 73 74 33 43 6f 6e 66 69 67 3b 0a 74 79 70 65  ist3Config;.type
4ac0: 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44  def struct EditD
4ad0: 69 73 74 33 50 6f 69 6e 74 20 45 64 69 74 44 69  ist3Point EditDi
4ae0: 73 74 33 50 6f 69 6e 74 3b 0a 74 79 70 65 64 65  st3Point;.typede
4af0: 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69 73  f struct EditDis
4b00: 74 33 46 72 6f 6d 20 45 64 69 74 44 69 73 74 33  t3From EditDist3
4b10: 46 72 6f 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  From;.typedef st
4b20: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 46 72  ruct EditDist3Fr
4b30: 6f 6d 53 74 72 69 6e 67 20 45 64 69 74 44 69 73  omString EditDis
4b40: 74 33 46 72 6f 6d 53 74 72 69 6e 67 3b 0a 74 79  t3FromString;.ty
4b50: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69  pedef struct Edi
4b60: 74 44 69 73 74 33 54 6f 20 45 64 69 74 44 69 73  tDist3To EditDis
4b70: 74 33 54 6f 3b 0a 74 79 70 65 64 65 66 20 73 74  t3To;.typedef st
4b80: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54 6f  ruct EditDist3To
4b90: 53 74 72 69 6e 67 20 45 64 69 74 44 69 73 74 33  String EditDist3
4ba0: 54 6f 53 74 72 69 6e 67 3b 0a 74 79 70 65 64 65  ToString;.typede
4bb0: 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69 73  f struct EditDis
4bc0: 74 33 4c 61 6e 67 20 45 64 69 74 44 69 73 74 33  t3Lang EditDist3
4bd0: 4c 61 6e 67 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  Lang;.../*.** An
4be0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 65 64   entry in the ed
4bf0: 69 74 20 63 6f 73 74 20 74 61 62 6c 65 0a 2a 2f  it cost table.*/
4c00: 0a 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74  .struct EditDist
4c10: 33 43 6f 73 74 20 7b 0a 20 20 45 64 69 74 44 69  3Cost {.  EditDi
4c20: 73 74 33 43 6f 73 74 20 2a 70 4e 65 78 74 3b 20  st3Cost *pNext; 
4c30: 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f 73 74      /* Next cost
4c40: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 38   element */.  u8
4c50: 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
4c60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4c70: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 46  r of bytes in aF
4c80: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 6e 54 6f 3b  rom */.  u8 nTo;
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4cb0: 62 79 74 65 73 20 69 6e 20 61 54 6f 20 2a 2f 0a  bytes in aTo */.
4cc0: 20 20 75 31 36 20 69 43 6f 73 74 3b 20 20 20 20    u16 iCost;    
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4ce0: 6f 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  ost of this tran
4cf0: 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  sformation */.  
4d00: 63 68 61 72 20 61 5b 34 5d 20 20 20 20 3b 20 20  char a[4]    ;  
4d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
4d20: 4d 20 73 74 72 69 6e 67 20 66 6f 6c 6c 6f 77 65  M string followe
4d30: 64 20 62 79 20 54 4f 20 73 74 72 69 6e 67 20 2a  d by TO string *
4d40: 2f 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61  /.  /* Additiona
4d50: 6c 20 54 4f 20 61 6e 64 20 46 52 4f 4d 20 73 74  l TO and FROM st
4d60: 72 69 6e 67 20 62 79 74 65 73 20 61 70 70 65 6e  ring bytes appen
4d70: 64 65 64 20 61 73 20 6e 65 63 65 73 73 61 72 79  ded as necessary
4d80: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 64   */.};../*.** Ed
4d90: 69 74 20 63 6f 73 74 73 20 66 6f 72 20 61 20 70  it costs for a p
4da0: 61 72 74 69 63 75 6c 61 72 20 6c 61 6e 67 75 61  articular langua
4db0: 67 65 20 49 44 20 0a 2a 2f 0a 73 74 72 75 63 74  ge ID .*/.struct
4dc0: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 7b   EditDist3Lang {
4dd0: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20 20  .  int iLang;   
4de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
4df0: 67 75 61 67 65 20 49 44 20 2a 2f 0a 20 20 69 6e  guage ID */.  in
4e00: 74 20 69 49 6e 73 43 6f 73 74 3b 20 20 20 20 20  t iInsCost;     
4e10: 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
4e20: 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73 74 20 2a  insertion cost *
4e30: 2f 0a 20 20 69 6e 74 20 69 44 65 6c 43 6f 73 74  /.  int iDelCost
4e40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  ;          /* De
4e50: 66 61 75 6c 74 20 64 65 6c 65 74 69 6f 6e 20 63  fault deletion c
4e60: 6f 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ost */.  int iSu
4e70: 62 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  bCost;          
4e80: 2f 2a 20 44 65 66 61 75 6c 74 20 73 75 62 73 74  /* Default subst
4e90: 69 74 75 74 69 6f 6e 20 63 6f 73 74 20 2a 2f 0a  itution cost */.
4ea0: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
4eb0: 2a 70 43 6f 73 74 3b 20 20 2f 2a 20 43 6f 73 74  *pCost;  /* Cost
4ec0: 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.};.../*.** 
4ed0: 54 68 65 20 64 65 66 61 75 6c 74 20 45 64 69 74  The default Edit
4ee0: 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a 65 63 74  Dist3Lang object
4ef0: 2c 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 63  , with default c
4f00: 6f 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osts..*/.static 
4f10: 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c  const EditDist3L
4f20: 61 6e 67 20 65 64 69 74 44 69 73 74 33 4c 61 6e  ang editDist3Lan
4f30: 67 20 3d 20 7b 20 30 2c 20 31 30 30 2c 20 31 30  g = { 0, 100, 10
4f40: 30 2c 20 31 35 30 2c 20 30 20 7d 3b 0a 0a 2f 2a  0, 150, 0 };../*
4f50: 0a 2a 2a 20 43 6f 6d 70 6c 65 74 65 20 63 6f 6e  .** Complete con
4f60: 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  figuration.*/.st
4f70: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 43 6f  ruct EditDist3Co
4f80: 6e 66 69 67 20 7b 0a 20 20 69 6e 74 20 6e 4c 61  nfig {.  int nLa
4f90: 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ng;             
4fa0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 61 6e  /* Number of lan
4fb0: 67 75 61 67 65 20 49 44 73 2e 20 20 53 69 7a 65  guage IDs.  Size
4fc0: 20 6f 66 20 61 5b 5d 20 2a 2f 0a 20 20 45 64 69   of a[] */.  Edi
4fd0: 74 44 69 73 74 33 4c 61 6e 67 20 2a 61 3b 20 20  tDist3Lang *a;  
4fe0: 20 20 20 20 2f 2a 20 4f 6e 65 20 66 6f 72 20 65      /* One for e
4ff0: 61 63 68 20 64 69 73 74 69 6e 63 74 20 6c 61 6e  ach distinct lan
5000: 67 75 61 67 65 20 49 44 20 2a 2f 0a 7d 3b 0a 0a  guage ID */.};..
5010: 2f 2a 0a 2a 2a 20 45 78 74 72 61 20 69 6e 66 6f  /*.** Extra info
5020: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
5030: 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ch character in 
5040: 74 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 2e  the FROM string.
5050: 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44  .*/.struct EditD
5060: 69 73 74 33 46 72 6f 6d 20 7b 0a 20 20 69 6e 74  ist3From {.  int
5070: 20 6e 53 75 62 73 74 3b 20 20 20 20 20 20 20 20   nSubst;        
5080: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5090: 6f 66 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  of substitution 
50a0: 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a  cost entries */.
50b0: 20 20 69 6e 74 20 6e 44 65 6c 3b 20 20 20 20 20    int nDel;     
50c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
50d0: 6d 62 65 72 20 6f 66 20 64 65 6c 65 74 69 6f 6e  mber of deletion
50e0: 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f   cost entries */
50f0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
5100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5110: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
5120: 6e 20 74 68 69 73 20 63 68 61 72 61 63 74 65 72  n this character
5130: 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43   */.  EditDist3C
5140: 6f 73 74 20 2a 2a 61 70 53 75 62 73 74 3b 20 2f  ost **apSubst; /
5150: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 73 74  * Array of subst
5160: 69 74 75 74 69 6f 6e 20 63 6f 73 74 73 20 66 6f  itution costs fo
5170: 72 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a  r this element *
5180: 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73  /.  EditDist3Cos
5190: 74 20 2a 2a 61 70 44 65 6c 3b 20 20 20 2f 2a 20  t **apDel;   /* 
51a0: 41 72 72 61 79 20 6f 66 20 64 65 6c 65 74 69 6f  Array of deletio
51b0: 6e 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a  n cost entries *
51c0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 72  /.};../*.** A pr
51d0: 65 63 6f 6d 70 69 6c 65 64 20 46 52 4f 4d 20 73  ecompiled FROM s
51e0: 74 72 69 6e 67 2e 0a 2a 0a 2a 2a 20 49 6e 20 74  tring..*.** In t
51f0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
5200: 65 20 65 78 70 65 63 74 20 74 68 65 20 46 52 4f  e expect the FRO
5210: 4d 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 72  M string to be r
5220: 65 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  eused multiple t
5230: 69 6d 65 73 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  imes..** In othe
5240: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 6f 6d  r words, the com
5250: 6d 6f 6e 20 63 61 73 65 20 77 69 6c 6c 20 62 65  mon case will be
5260: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
5270: 65 64 69 74 20 64 69 73 74 61 6e 63 65 0a 2a 2a  edit distance.**
5280: 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 6f   from a single o
5290: 72 69 67 69 6e 20 73 74 72 69 6e 67 20 74 6f 20  rigin string to 
52a0: 6d 75 6c 74 69 70 6c 65 20 74 61 72 67 65 74 20  multiple target 
52b0: 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 72 75  strings..*/.stru
52c0: 63 74 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  ct EditDist3From
52d0: 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61 72 20  String {.  char 
52e0: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
52f0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
5300: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
5310: 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  FROM string */. 
5320: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
5330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5340: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
5350: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 73 74  s in the FROM st
5360: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ring */.  int is
5370: 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
5380: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 6e     /* True if en
5390: 64 73 20 77 69 74 68 20 27 2a 27 20 63 68 61 72  ds with '*' char
53a0: 61 63 74 65 72 20 2a 2f 0a 20 20 45 64 69 74 44  acter */.  EditD
53b0: 69 73 74 33 46 72 6f 6d 20 2a 61 3b 20 20 20 20  ist3From *a;    
53c0: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66      /* Extra inf
53d0: 6f 20 61 62 6f 75 74 20 65 61 63 68 20 63 68 61  o about each cha
53e0: 72 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 73 74  r of the FROM st
53f0: 72 69 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ring */.};../*.*
5400: 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  * Extra informat
5410: 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20 63  ion about each c
5420: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
5430: 54 4f 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  TO string..*/.st
5440: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54 6f  ruct EditDist3To
5450: 20 7b 0a 20 20 69 6e 74 20 6e 49 6e 73 3b 20 20   {.  int nIns;  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5470: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 73 65 72   Number of inser
5480: 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74 72 69 65  tion cost entrie
5490: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  s */.  int nByte
54a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
54c0: 65 73 20 69 6e 20 74 68 69 73 20 63 68 61 72 61  es in this chara
54d0: 63 74 65 72 20 2a 2f 0a 20 20 45 64 69 74 44 69  cter */.  EditDi
54e0: 73 74 33 43 6f 73 74 20 2a 2a 61 70 49 6e 73 3b  st3Cost **apIns;
54f0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 64     /* Array of d
5500: 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74  eletion cost ent
5510: 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ries */.};../*.*
5520: 2a 20 41 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  * A precompiled 
5530: 46 52 4f 4d 20 73 74 72 69 6e 67 0a 2a 2f 0a 73  FROM string.*/.s
5540: 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54  truct EditDist3T
5550: 6f 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61 72  oString {.  char
5560: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
5570: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5580: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
5590: 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20   TO string */.  
55a0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
55b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
55c0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
55d0: 20 69 6e 20 74 68 65 20 54 4f 20 73 74 72 69 6e   in the TO strin
55e0: 67 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33  g */.  EditDist3
55f0: 54 6f 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  To *a;          
5600: 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 20 61 62  /* Extra info ab
5610: 6f 75 74 20 65 61 63 68 20 63 68 61 72 20 6f 66  out each char of
5620: 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a   the TO string *
5630: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  /.};../*.** Clea
5640: 72 20 6f 72 20 64 65 6c 65 74 65 20 61 6e 20 69  r or delete an i
5650: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 6f  nstance of the o
5660: 62 6a 65 63 74 20 74 68 61 74 20 72 65 63 6f 72  bject that recor
5670: 64 73 20 61 6c 6c 20 65 64 69 74 2d 64 69 73 74  ds all edit-dist
5680: 61 6e 63 65 0a 2a 2a 20 77 65 69 67 68 74 73 2e  ance.** weights.
5690: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
56a0: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43  editDist3ConfigC
56b0: 6c 65 61 72 28 45 64 69 74 44 69 73 74 33 43 6f  lear(EditDist3Co
56c0: 6e 66 69 67 20 2a 70 29 7b 0a 20 20 69 6e 74 20  nfig *p){.  int 
56d0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
56e0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
56f0: 30 3b 20 69 3c 70 2d 3e 6e 4c 61 6e 67 3b 20 69  0; i<p->nLang; i
5700: 2b 2b 29 7b 0a 20 20 20 20 45 64 69 74 44 69 73  ++){.    EditDis
5710: 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 2a  t3Cost *pCost, *
5720: 70 4e 65 78 74 3b 0a 20 20 20 20 70 43 6f 73 74  pNext;.    pCost
5730: 20 3d 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 73 74   = p->a[i].pCost
5740: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f  ;.    while( pCo
5750: 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  st ){.      pNex
5760: 74 20 3d 20 70 43 6f 73 74 2d 3e 70 4e 65 78 74  t = pCost->pNext
5770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5780: 66 72 65 65 28 70 43 6f 73 74 29 3b 0a 20 20 20  free(pCost);.   
5790: 20 20 20 70 43 6f 73 74 20 3d 20 70 4e 65 78 74     pCost = pNext
57a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
57b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 29  lite3_free(p->a)
57c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
57d0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
57e0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
57f0: 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74  Dist3ConfigDelet
5800: 65 28 76 6f 69 64 20 2a 70 49 6e 29 7b 0a 20 20  e(void *pIn){.  
5810: 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20  EditDist3Config 
5820: 2a 70 20 3d 20 28 45 64 69 74 44 69 73 74 33 43  *p = (EditDist3C
5830: 6f 6e 66 69 67 2a 29 70 49 6e 3b 0a 20 20 65 64  onfig*)pIn;.  ed
5840: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43 6c 65  itDist3ConfigCle
5850: 61 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ar(p);.  sqlite3
5860: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
5870: 2a 2a 20 4c 6f 61 64 20 61 6c 6c 20 65 64 69 74  ** Load all edit
5880: 2d 64 69 73 74 61 6e 63 65 20 77 65 69 67 68 74  -distance weight
5890: 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 2e 0a  s from a table..
58a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64  */.static int ed
58b0: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c 6f 61  itDist3ConfigLoa
58c0: 64 28 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  d(.  EditDist3Co
58d0: 6e 66 69 67 20 2a 70 2c 20 20 20 20 20 20 2f 2a  nfig *p,      /*
58e0: 20 54 68 65 20 65 64 69 74 20 64 69 73 74 61 6e   The edit distan
58f0: 63 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ce configuration
5900: 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20 73 71   to load */.  sq
5910: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
5920: 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 66 72        /* Load fr
5930: 6f 6d 20 74 68 69 73 20 64 61 74 61 62 61 73 65  om this database
5940: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
5950: 20 2a 7a 54 61 62 6c 65 20 20 20 20 20 20 2f 2a   *zTable      /*
5960: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
5970: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  le from which to
5980: 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71   load */.){.  sq
5990: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
59a0: 74 3b 0a 20 20 69 6e 74 20 72 63 2c 20 72 63 32  t;.  int rc, rc2
59b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
59c0: 20 20 69 6e 74 20 69 4c 61 6e 67 50 72 65 76 20    int iLangPrev 
59d0: 3d 20 2d 39 39 39 39 3b 0a 20 20 45 64 69 74 44  = -9999;.  EditD
59e0: 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 20  ist3Lang *pLang 
59f0: 3d 20 30 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73  = 0;..  zSql = s
5a00: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5a10: 53 45 4c 45 43 54 20 69 4c 61 6e 67 2c 20 63 46  SELECT iLang, cF
5a20: 72 6f 6d 2c 20 63 54 6f 2c 20 69 43 6f 73 74 22  rom, cTo, iCost"
5a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5a40: 20 20 20 20 20 20 20 20 20 20 22 20 46 52 4f 4d            " FROM
5a50: 20 5c 22 25 77 5c 22 20 57 48 45 52 45 20 69 4c   \"%w\" WHERE iL
5a60: 61 6e 67 3e 3d 30 20 4f 52 44 45 52 20 42 59 20  ang>=0 ORDER BY 
5a70: 69 4c 61 6e 67 22 2c 20 7a 54 61 62 6c 65 29 3b  iLang", zTable);
5a80: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
5a90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5aa0: 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OMEM;.  rc = sql
5ab0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
5ac0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
5ad0: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
5ae0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
5af0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5b00: 63 3b 0a 20 20 65 64 69 74 44 69 73 74 33 43 6f  c;.  editDist3Co
5b10: 6e 66 69 67 43 6c 65 61 72 28 70 29 3b 0a 20 20  nfigClear(p);.  
5b20: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
5b30: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
5b40: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
5b50: 74 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74 65  t iLang = sqlite
5b60: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
5b70: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73  mt, 0);.    cons
5b80: 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20  t char *zFrom = 
5b90: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
5ba0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
5bb0: 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
5bc0: 69 6e 74 20 6e 46 72 6f 6d 20 3d 20 7a 46 72 6f  int nFrom = zFro
5bd0: 6d 20 3f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m ? sqlite3_colu
5be0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
5bf0: 31 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73  1) : 0;.    cons
5c00: 74 20 63 68 61 72 20 2a 7a 54 6f 20 3d 20 28 63  t char *zTo = (c
5c10: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5c20: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
5c30: 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e  Stmt, 2);.    in
5c40: 74 20 6e 54 6f 20 3d 20 7a 54 6f 20 3f 20 73 71  t nTo = zTo ? sq
5c50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
5c60: 65 73 28 70 53 74 6d 74 2c 20 32 29 20 3a 20 30  es(pStmt, 2) : 0
5c70: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 73 74 20  ;.    int iCost 
5c80: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
5c90: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
5ca0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 72  .    assert( zFr
5cb0: 6f 6d 21 3d 30 20 7c 7c 20 6e 46 72 6f 6d 3d 3d  om!=0 || nFrom==
5cc0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5cd0: 20 7a 54 6f 21 3d 30 20 7c 7c 20 6e 54 6f 3d 3d   zTo!=0 || nTo==
5ce0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  0 );.    if( nFr
5cf0: 6f 6d 3e 31 30 30 20 7c 7c 20 6e 54 6f 3e 31 30  om>100 || nTo>10
5d00: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5d10: 20 20 69 66 28 20 69 43 6f 73 74 3c 30 20 29 20    if( iCost<0 ) 
5d20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5d30: 28 20 70 4c 61 6e 67 3d 3d 30 20 7c 7c 20 69 4c  ( pLang==0 || iL
5d40: 61 6e 67 21 3d 69 4c 61 6e 67 50 72 65 76 20 29  ang!=iLangPrev )
5d50: 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69 73 74  {.      EditDist
5d60: 33 4c 61 6e 67 20 2a 70 4e 65 77 3b 0a 20 20 20  3Lang *pNew;.   
5d70: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
5d80: 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
5d90: 2c 20 28 70 2d 3e 6e 4c 61 6e 67 2b 31 29 2a 73  , (p->nLang+1)*s
5da0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 29 3b  izeof(p->a[0]));
5db0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d  .      if( pNew=
5dc0: 3d 30 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54  =0 ){ rc = SQLIT
5dd0: 45 5f 4e 4f 4d 45 4d 3b 20 62 72 65 61 6b 3b 20  E_NOMEM; break; 
5de0: 7d 0a 20 20 20 20 20 20 70 2d 3e 61 20 3d 20 70  }.      p->a = p
5df0: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67  New;.      pLang
5e00: 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 4c 61 6e   = &p->a[p->nLan
5e10: 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 61  g];.      p->nLa
5e20: 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 61 6e  ng++;.      pLan
5e30: 67 2d 3e 69 4c 61 6e 67 20 3d 20 69 4c 61 6e 67  g->iLang = iLang
5e40: 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  ;.      pLang->i
5e50: 49 6e 73 43 6f 73 74 20 3d 20 31 30 30 3b 0a 20  InsCost = 100;. 
5e60: 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 44 65 6c       pLang->iDel
5e70: 43 6f 73 74 20 3d 20 31 30 30 3b 0a 20 20 20 20  Cost = 100;.    
5e80: 20 20 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73    pLang->iSubCos
5e90: 74 20 3d 20 31 35 30 3b 0a 20 20 20 20 20 20 70  t = 150;.      p
5ea0: 4c 61 6e 67 2d 3e 70 43 6f 73 74 20 3d 20 30 3b  Lang->pCost = 0;
5eb0: 0a 20 20 20 20 20 20 69 4c 61 6e 67 50 72 65 76  .      iLangPrev
5ec0: 20 3d 20 69 4c 61 6e 67 3b 0a 20 20 20 20 7d 0a   = iLang;.    }.
5ed0: 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 31      if( nFrom==1
5ee0: 20 26 26 20 7a 46 72 6f 6d 5b 30 5d 3d 3d 27 3f   && zFrom[0]=='?
5ef0: 27 20 26 26 20 6e 54 6f 3d 3d 30 20 29 7b 0a 20  ' && nTo==0 ){. 
5f00: 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 44 65 6c       pLang->iDel
5f10: 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a 20 20  Cost = iCost;.  
5f20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 6f    }else if( nFro
5f30: 6d 3d 3d 30 20 26 26 20 6e 54 6f 3d 3d 31 20 26  m==0 && nTo==1 &
5f40: 26 20 7a 54 6f 5b 30 5d 3d 3d 27 3f 27 20 29 7b  & zTo[0]=='?' ){
5f50: 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 49  .      pLang->iI
5f60: 6e 73 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a  nsCost = iCost;.
5f70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
5f80: 72 6f 6d 3d 3d 31 20 26 26 20 6e 54 6f 3d 3d 31  rom==1 && nTo==1
5f90: 20 26 26 20 7a 46 72 6f 6d 5b 30 5d 3d 3d 27 3f   && zFrom[0]=='?
5fa0: 27 20 26 26 20 7a 54 6f 5b 30 5d 3d 3d 27 3f 27  ' && zTo[0]=='?'
5fb0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d   ){.      pLang-
5fc0: 3e 69 53 75 62 43 6f 73 74 20 3d 20 69 43 6f 73  >iSubCost = iCos
5fd0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
5fe0: 20 20 20 20 45 64 69 74 44 69 73 74 33 43 6f 73      EditDist3Cos
5ff0: 74 20 2a 70 43 6f 73 74 3b 0a 20 20 20 20 20 20  t *pCost;.      
6000: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 6e 46 72  int nExtra = nFr
6010: 6f 6d 20 2b 20 6e 54 6f 20 2d 20 34 3b 0a 20 20  om + nTo - 4;.  
6020: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3c 30      if( nExtra<0
6030: 20 29 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20   ) nExtra = 0;. 
6040: 20 20 20 20 20 70 43 6f 73 74 20 3d 20 73 71 6c       pCost = sql
6050: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
6060: 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 20 2b 20  izeof(*pCost) + 
6070: 6e 45 78 74 72 61 20 29 3b 0a 20 20 20 20 20 20  nExtra );.      
6080: 69 66 28 20 70 43 6f 73 74 3d 3d 30 20 29 7b 20  if( pCost==0 ){ 
6090: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
60a0: 4d 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  M; break; }.    
60b0: 20 20 70 43 6f 73 74 2d 3e 6e 46 72 6f 6d 20 3d    pCost->nFrom =
60c0: 20 28 75 38 29 6e 46 72 6f 6d 3b 0a 20 20 20 20   (u8)nFrom;.    
60d0: 20 20 70 43 6f 73 74 2d 3e 6e 54 6f 20 3d 20 28    pCost->nTo = (
60e0: 75 38 29 6e 54 6f 3b 0a 20 20 20 20 20 20 70 43  u8)nTo;.      pC
60f0: 6f 73 74 2d 3e 69 43 6f 73 74 20 3d 20 28 75 31  ost->iCost = (u1
6100: 36 29 69 43 6f 73 74 3b 0a 20 20 20 20 20 20 6d  6)iCost;.      m
6110: 65 6d 63 70 79 28 70 43 6f 73 74 2d 3e 61 2c 20  emcpy(pCost->a, 
6120: 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 29 3b 0a 20  zFrom, nFrom);. 
6130: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 73       memcpy(pCos
6140: 74 2d 3e 61 20 2b 20 6e 46 72 6f 6d 2c 20 7a 54  t->a + nFrom, zT
6150: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 70  o, nTo);.      p
6160: 43 6f 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Cost->pNext = pL
6170: 61 6e 67 2d 3e 70 43 6f 73 74 3b 0a 20 20 20 20  ang->pCost;.    
6180: 20 20 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 20 3d    pLang->pCost =
6190: 20 70 43 6f 73 74 3b 20 0a 20 20 20 20 7d 0a 20   pCost; .    }. 
61a0: 20 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74   }.  rc2 = sqlit
61b0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
61c0: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
61d0: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
61e0: 63 32 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c2;.  return rc;
61f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6200: 20 74 68 65 20 6c 65 6e 67 74 68 20 28 69 6e 20   the length (in 
6210: 62 79 74 65 73 29 20 6f 66 20 61 20 75 74 66 2d  bytes) of a utf-
6220: 38 20 63 68 61 72 61 63 74 65 72 2e 20 20 4f 72  8 character.  Or
6230: 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75   return a maximu
6240: 6d 0a 2a 2a 20 6f 66 20 4e 2e 0a 2a 2f 0a 73 74  m.** of N..*/.st
6250: 61 74 69 63 20 69 6e 74 20 75 74 66 38 4c 65 6e  atic int utf8Len
6260: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  (unsigned char c
6270: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20  , int N){.  int 
6280: 6c 65 6e 20 3d 20 31 3b 0a 20 20 69 66 28 20 63  len = 1;.  if( c
6290: 3e 30 78 37 66 20 29 7b 0a 20 20 20 20 69 66 28  >0x7f ){.    if(
62a0: 20 28 63 26 30 78 65 30 29 3d 3d 30 78 63 30 20   (c&0xe0)==0xc0 
62b0: 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 32  ){.      len = 2
62c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
62d0: 28 63 26 30 78 66 30 29 3d 3d 30 78 65 30 20 29  (c&0xf0)==0xe0 )
62e0: 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 33 3b  {.      len = 3;
62f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6300: 20 20 6c 65 6e 20 3d 20 34 3b 0a 20 20 20 20 7d    len = 4;.    }
6310: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 3e 4e  .  }.  if( len>N
6320: 20 29 20 6c 65 6e 20 3d 20 4e 3b 0a 20 20 72 65   ) len = N;.  re
6330: 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a  turn len;.}../*.
6340: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  ** Return TRUE (
6350: 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
6360: 20 54 6f 20 73 69 64 65 20 6f 66 20 74 68 65 20   To side of the 
6370: 67 69 76 65 6e 20 63 6f 73 74 20 6d 61 74 63 68  given cost match
6380: 65 73 0a 2a 2a 20 74 68 65 20 67 69 76 65 6e 20  es.** the given 
6390: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
63a0: 63 20 69 6e 74 20 6d 61 74 63 68 54 6f 28 45 64  c int matchTo(Ed
63b0: 69 74 44 69 73 74 33 43 6f 73 74 20 2a 70 2c 20  itDist3Cost *p, 
63c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
63d0: 6e 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e  nt n){.  if( p->
63e0: 6e 54 6f 3e 6e 20 29 20 72 65 74 75 72 6e 20 30  nTo>n ) return 0
63f0: 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28  ;.  if( strncmp(
6400: 70 2d 3e 61 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 7a  p->a+p->nFrom, z
6410: 2c 20 70 2d 3e 6e 54 6f 29 21 3d 30 20 29 20 72  , p->nTo)!=0 ) r
6420: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
6430: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 1;.}../*.** Re
6440: 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
6450: 65 72 6f 29 20 69 66 20 74 68 65 20 46 72 6f 6d  ero) if the From
6460: 20 73 69 64 65 20 6f 66 20 74 68 65 20 67 69 76   side of the giv
6470: 65 6e 20 63 6f 73 74 20 6d 61 74 63 68 65 73 0a  en cost matches.
6480: 2a 2a 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ** the given str
6490: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
64a0: 6e 74 20 6d 61 74 63 68 46 72 6f 6d 28 45 64 69  nt matchFrom(Edi
64b0: 74 44 69 73 74 33 43 6f 73 74 20 2a 70 2c 20 63  tDist3Cost *p, c
64c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
64d0: 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t n){.  assert( 
64e0: 70 2d 3e 6e 46 72 6f 6d 3c 3d 6e 20 29 3b 0a 20  p->nFrom<=n );. 
64f0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 2d 3e   if( strncmp(p->
6500: 61 2c 20 7a 2c 20 70 2d 3e 6e 46 72 6f 6d 29 21  a, z, p->nFrom)!
6510: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
6520: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
6530: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
6540: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 6f 66 20 74 68  (non-zero) of th
6550: 65 20 6e 65 78 74 20 46 52 4f 4d 20 63 68 61 72  e next FROM char
6560: 61 63 74 65 72 20 61 6e 64 20 74 68 65 20 6e 65  acter and the ne
6570: 78 74 20 54 4f 0a 2a 2a 20 63 68 61 72 61 63 74  xt TO.** charact
6580: 65 72 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  er are the same.
6590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
65a0: 61 74 63 68 46 72 6f 6d 54 6f 28 0a 20 20 45 64  atchFromTo(.  Ed
65b0: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
65c0: 67 20 2a 70 53 74 72 2c 20 20 2f 2a 20 4c 65 66  g *pStr,  /* Lef
65d0: 74 20 68 61 6e 64 20 73 74 72 69 6e 67 20 2a 2f  t hand string */
65e0: 0a 20 20 69 6e 74 20 6e 31 2c 20 20 20 20 20 20  .  int n1,      
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6600: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6d 70 61  * Index of compa
6610: 72 69 73 6f 6e 20 63 68 61 72 61 63 74 65 72 20  rison character 
6620: 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
6630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 2c   const char *z2,
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6650: 52 69 67 68 74 2d 68 61 6e 64 6c 20 63 6f 6d 70  Right-handl comp
6660: 61 72 69 73 6f 6e 20 63 68 61 72 61 63 74 65 72  arison character
6670: 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 20 20 20 20   */.  int n2    
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 20 20 2f 2a 20 42 79 74 65 73 20 72 65 6d 61 69    /* Bytes remai
66a0: 6e 69 6e 67 20 69 6e 20 7a 32 5b 5d 20 2a 2f 0a  ning in z2[] */.
66b0: 29 7b 0a 20 20 69 6e 74 20 62 31 20 3d 20 70 53  ){.  int b1 = pS
66c0: 74 72 2d 3e 61 5b 6e 31 5d 2e 6e 42 79 74 65 3b  tr->a[n1].nByte;
66d0: 0a 20 20 69 66 28 20 62 31 3e 6e 32 20 29 20 72  .  if( b1>n2 ) r
66e0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6d  eturn 0;.  if( m
66f0: 65 6d 63 6d 70 28 70 53 74 72 2d 3e 7a 2b 6e 31  emcmp(pStr->z+n1
6700: 2c 20 7a 32 2c 20 62 31 29 21 3d 30 20 29 20 72  , z2, b1)!=0 ) r
6710: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
6720: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 1;.}../*.** De
6730: 6c 65 74 65 20 61 6e 20 45 64 69 74 44 69 73 74  lete an EditDist
6740: 33 46 72 6f 6d 53 74 72 69 6e 67 20 6f 62 6a 65  3FromString obje
6750: 63 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  cct.*/.static vo
6760: 69 64 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d  id editDist3From
6770: 53 74 72 69 6e 67 44 65 6c 65 74 65 28 45 64 69  StringDelete(Edi
6780: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
6790: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
67a0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f   if( p ){.    fo
67b0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 3b 20 69  r(i=0; i<p->n; i
67c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
67d0: 65 33 5f 66 72 65 65 28 70 2d 3e 61 5b 69 5d 2e  e3_free(p->a[i].
67e0: 61 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71  apDel);.      sq
67f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 5b  lite3_free(p->a[
6800: 69 5d 2e 61 70 53 75 62 73 74 29 3b 0a 20 20 20  i].apSubst);.   
6810: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
6820: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
6830: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 45 64  *.** Create a Ed
6840: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
6850: 67 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  g object..*/.sta
6860: 74 69 63 20 45 64 69 74 44 69 73 74 33 46 72 6f  tic EditDist3Fro
6870: 6d 53 74 72 69 6e 67 20 2a 65 64 69 74 44 69 73  mString *editDis
6880: 74 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28  t3FromStringNew(
6890: 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73  .  const EditDis
68a0: 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 0a 20  t3Lang *pLang,. 
68b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 0a   const char *z,.
68c0: 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 45 64 69    int n.){.  Edi
68d0: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
68e0: 20 2a 70 53 74 72 3b 0a 20 20 45 64 69 74 44 69   *pStr;.  EditDi
68f0: 73 74 33 43 6f 73 74 20 2a 70 3b 0a 20 20 69 6e  st3Cost *p;.  in
6900: 74 20 69 3b 0a 0a 20 20 69 66 28 20 7a 3d 3d 30  t i;..  if( z==0
6910: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
6920: 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 28 69 6e  f( n<0 ) n = (in
6930: 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 70  t)strlen(z);.  p
6940: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Str = sqlite3_ma
6950: 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
6960: 70 53 74 72 29 20 2b 20 73 69 7a 65 6f 66 28 70  pStr) + sizeof(p
6970: 53 74 72 2d 3e 61 5b 30 5d 29 2a 6e 20 2b 20 6e  Str->a[0])*n + n
6980: 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 53   + 1 );.  if( pS
6990: 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  tr==0 ) return 0
69a0: 3b 0a 20 20 70 53 74 72 2d 3e 61 20 3d 20 28 45  ;.  pStr->a = (E
69b0: 64 69 74 44 69 73 74 33 46 72 6f 6d 2a 29 26 70  ditDist3From*)&p
69c0: 53 74 72 5b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74  Str[1];.  memset
69d0: 28 70 53 74 72 2d 3e 61 2c 20 30 2c 20 73 69 7a  (pStr->a, 0, siz
69e0: 65 6f 66 28 70 53 74 72 2d 3e 61 5b 30 5d 29 2a  eof(pStr->a[0])*
69f0: 6e 29 3b 0a 20 20 70 53 74 72 2d 3e 6e 20 3d 20  n);.  pStr->n = 
6a00: 6e 3b 0a 20 20 70 53 74 72 2d 3e 7a 20 3d 20 28  n;.  pStr->z = (
6a10: 63 68 61 72 2a 29 26 70 53 74 72 2d 3e 61 5b 6e  char*)&pStr->a[n
6a20: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 53 74 72  ];.  memcpy(pStr
6a30: 2d 3e 7a 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20  ->z, z, n+1);.  
6a40: 69 66 28 20 6e 20 26 26 20 7a 5b 6e 2d 31 5d 3d  if( n && z[n-1]=
6a50: 3d 27 2a 27 20 29 7b 0a 20 20 20 20 70 53 74 72  ='*' ){.    pStr
6a60: 2d 3e 69 73 50 72 65 66 69 78 20 3d 20 31 3b 0a  ->isPrefix = 1;.
6a70: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 70 53 74      n--;.    pSt
6a80: 72 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 70 53 74 72  r->n--;.    pStr
6a90: 2d 3e 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 65  ->z[n] = 0;.  }e
6aa0: 6c 73 65 7b 0a 20 20 20 20 70 53 74 72 2d 3e 69  lse{.    pStr->i
6ab0: 73 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 7d  sPrefix = 0;.  }
6ac0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
6ad0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 64 69 74  ; i++){.    Edit
6ae0: 44 69 73 74 33 46 72 6f 6d 20 2a 70 46 72 6f 6d  Dist3From *pFrom
6af0: 20 3d 20 26 70 53 74 72 2d 3e 61 5b 69 5d 3b 0a   = &pStr->a[i];.
6b00: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 72 6f 6d      memset(pFrom
6b10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 72  , 0, sizeof(*pFr
6b20: 6f 6d 29 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  om));.    pFrom-
6b30: 3e 6e 42 79 74 65 20 3d 20 75 74 66 38 4c 65 6e  >nByte = utf8Len
6b40: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
6b50: 7a 5b 69 5d 2c 20 6e 2d 69 29 3b 0a 20 20 20 20  z[i], n-i);.    
6b60: 66 6f 72 28 70 3d 70 4c 61 6e 67 2d 3e 70 43 6f  for(p=pLang->pCo
6b70: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  st; p; p=p->pNex
6b80: 74 29 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69  t){.      EditDi
6b90: 73 74 33 43 6f 73 74 20 2a 2a 61 70 4e 65 77 3b  st3Cost **apNew;
6ba0: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 70 2d 3e  .      if( i+p->
6bb0: 6e 46 72 6f 6d 3e 6e 20 29 20 63 6f 6e 74 69 6e  nFrom>n ) contin
6bc0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61  ue;.      if( ma
6bd0: 74 63 68 46 72 6f 6d 28 70 2c 20 7a 2b 69 2c 20  tchFrom(p, z+i, 
6be0: 6e 2d 69 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  n-i)==0 ) contin
6bf0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ue;.      if( p-
6c00: 3e 6e 54 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >nTo==0 ){.     
6c10: 20 20 20 61 70 4e 65 77 20 3d 20 73 71 6c 69 74     apNew = sqlit
6c20: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 46 72  e3_realloc64(pFr
6c30: 6f 6d 2d 3e 61 70 44 65 6c 2c 0a 20 20 20 20 20  om->apDel,.     
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
6c60: 66 28 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f 6d  f(*apNew)*(pFrom
6c70: 2d 3e 6e 44 65 6c 2b 31 29 29 3b 0a 20 20 20 20  ->nDel+1));.    
6c80: 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30      if( apNew==0
6c90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6ca0: 20 20 70 46 72 6f 6d 2d 3e 61 70 44 65 6c 20 3d    pFrom->apDel =
6cb0: 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20   apNew;.        
6cc0: 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e 6e 44 65  apNew[pFrom->nDe
6cd0: 6c 2b 2b 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20  l++] = p;.      
6ce0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
6cf0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
6d00: 65 61 6c 6c 6f 63 36 34 28 70 46 72 6f 6d 2d 3e  ealloc64(pFrom->
6d10: 61 70 53 75 62 73 74 2c 0a 20 20 20 20 20 20 20  apSubst,.       
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
6d40: 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f 6d 2d 3e  *apNew)*(pFrom->
6d50: 6e 53 75 62 73 74 2b 31 29 29 3b 0a 20 20 20 20  nSubst+1));.    
6d60: 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30      if( apNew==0
6d70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6d80: 20 20 70 46 72 6f 6d 2d 3e 61 70 53 75 62 73 74    pFrom->apSubst
6d90: 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20   = apNew;.      
6da0: 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e 6e    apNew[pFrom->n
6db0: 53 75 62 73 74 2b 2b 5d 20 3d 20 70 3b 0a 20 20  Subst++] = p;.  
6dc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6dd0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 65  if( p ){.      e
6de0: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
6df0: 6e 67 44 65 6c 65 74 65 28 70 53 74 72 29 3b 0a  ngDelete(pStr);.
6e00: 20 20 20 20 20 20 70 53 74 72 20 3d 20 30 3b 0a        pStr = 0;.
6e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6e20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6e30: 70 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  pStr;.}../*.** U
6e40: 70 64 61 74 65 20 65 6e 74 72 79 20 6d 5b 69 5d  pdate entry m[i]
6e50: 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
6e60: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 66 20   the minimum of 
6e70: 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
6e80: 65 0a 2a 2a 20 61 6e 64 20 6d 5b 6a 5d 2b 69 43  e.** and m[j]+iC
6e90: 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
6ea0: 65 20 69 43 6f 73 74 20 69 73 20 31 2c 30 30 30  e iCost is 1,000
6eb0: 2c 30 30 30 20 6f 72 20 67 72 65 61 74 65 72 2c  ,000 or greater,
6ec0: 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
6ed0: 68 65 20 63 6f 73 74 20 74 6f 20 62 65 0a 2a 2a  he cost to be.**
6ee0: 20 69 6e 66 69 6e 69 74 65 20 61 6e 64 20 73 6b   infinite and sk
6ef0: 69 70 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a  ip the update..*
6f00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
6f10: 64 61 74 65 43 6f 73 74 28 0a 20 20 75 6e 73 69  dateCost(.  unsi
6f20: 67 6e 65 64 20 69 6e 74 20 2a 6d 2c 0a 20 20 69  gned int *m,.  i
6f30: 6e 74 20 69 2c 0a 20 20 69 6e 74 20 6a 2c 0a 20  nt i,.  int j,. 
6f40: 20 69 6e 74 20 69 43 6f 73 74 0a 29 7b 0a 20 20   int iCost.){.  
6f50: 61 73 73 65 72 74 28 20 69 43 6f 73 74 3e 3d 30  assert( iCost>=0
6f60: 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 73 74 3c   );.  if( iCost<
6f70: 31 30 30 30 30 20 29 7b 0a 20 20 20 20 75 6e 73  10000 ){.    uns
6f80: 69 67 6e 65 64 20 69 6e 74 20 62 20 3d 20 6d 5b  igned int b = m[
6f90: 6a 5d 20 2b 20 69 43 6f 73 74 3b 0a 20 20 20 20  j] + iCost;.    
6fa0: 69 66 28 20 62 3c 6d 5b 69 5d 20 29 20 6d 5b 69  if( b<m[i] ) m[i
6fb0: 5d 20 3d 20 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ] = b;.  }.}../*
6fc0: 0a 2a 2a 20 48 6f 77 20 6d 75 63 68 20 73 74 61  .** How much sta
6fd0: 63 6b 20 73 70 61 63 65 20 28 69 6e 74 20 62 79  ck space (int by
6fe0: 74 65 73 29 20 74 6f 20 75 73 65 20 66 6f 72 20  tes) to use for 
6ff0: 57 61 67 6e 65 72 20 6d 61 74 72 69 78 20 69 6e  Wagner matrix in
7000: 20 0a 2a 2a 20 65 64 69 74 44 69 73 74 33 43 6f   .** editDist3Co
7010: 72 65 28 29 2e 20 20 49 66 20 6d 6f 72 65 20 73  re().  If more s
7020: 70 61 63 65 20 74 68 61 6e 20 74 68 69 73 20 69  pace than this i
7030: 73 20 72 65 71 75 69 72 65 64 2c 20 74 68 65 20  s required, the 
7040: 65 6e 74 69 72 65 0a 2a 2a 20 6d 61 74 72 69 78  entire.** matrix
7050: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
7060: 68 65 20 68 65 61 70 2e 20 20 54 6f 20 72 65 64  he heap.  To red
7070: 75 63 65 20 74 68 65 20 6c 6f 61 64 20 6f 6e 20  uce the load on 
7080: 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  the memory.** al
7090: 6c 6f 63 61 74 6f 72 2c 20 6d 61 6b 65 20 74 68  locator, make th
70a0: 69 73 20 76 61 6c 75 65 20 61 73 20 6c 61 72 67  is value as larg
70b0: 65 20 61 73 20 70 72 61 63 74 69 63 61 6c 20 66  e as practical f
70c0: 6f 72 20 74 68 65 0a 2a 2a 20 61 72 63 68 69 74  or the.** archit
70d0: 65 63 74 75 72 65 20 69 6e 20 75 73 65 2e 0a 2a  ecture in use..*
70e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
70f0: 5f 53 50 45 4c 4c 46 49 58 5f 53 54 41 43 4b 41  _SPELLFIX_STACKA
7100: 4c 4c 4f 43 5f 53 5a 0a 23 20 64 65 66 69 6e 65  LLOC_SZ.# define
7110: 20 53 51 4c 49 54 45 5f 53 50 45 4c 4c 46 49 58   SQLITE_SPELLFIX
7120: 5f 53 54 41 43 4b 41 4c 4c 4f 43 5f 53 5a 20 20  _STACKALLOC_SZ  
7130: 28 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f  (1024).#endif../
7140: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 65 64  * Compute the ed
7150: 69 74 20 64 69 73 74 61 6e 63 65 20 62 65 74 77  it distance betw
7160: 65 65 6e 20 74 77 6f 20 73 74 72 69 6e 67 73 2e  een two strings.
7170: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
7180: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
7190: 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
71a0: 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ber which is the
71b0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
71c0: 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69 73  ** If pnMatch is
71d0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
71e0: 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74 20  *pnMatch is set 
71f0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
7200: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 28   characters.** (
7210: 6e 6f 74 20 62 79 74 65 73 29 20 69 6e 20 7a 32  not bytes) in z2
7220: 20 74 68 61 74 20 6d 61 74 63 68 65 64 20 74 68   that matched th
7230: 65 20 73 65 61 72 63 68 20 70 61 74 74 65 72 6e  e search pattern
7240: 20 69 6e 20 2a 70 46 72 6f 6d 2e 20 49 66 20 70   in *pFrom. If p
7250: 46 72 6f 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  From does.** not
7260: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 61 74   contain the pat
7270: 74 65 72 6e 20 66 6f 72 20 61 20 70 72 65 66 69  tern for a prefi
7280: 78 2d 73 65 61 72 63 68 2c 20 74 68 65 6e 20 74  x-search, then t
7290: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
72a0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63  e number.** of c
72b0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 32 2e  haracters in z2.
72c0: 20 49 66 20 70 46 72 6f 6d 20 64 6f 65 73 20 63   If pFrom does c
72d0: 6f 6e 74 61 69 6e 20 61 20 70 72 65 66 69 78 20  ontain a prefix 
72e0: 73 65 61 72 63 68 20 70 61 74 74 65 72 6e 2c 20  search pattern, 
72f0: 74 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 74 68  then.** it is th
7300: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
7310: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 70 72  acters in the pr
7320: 65 66 69 78 20 6f 66 20 7a 32 20 74 68 61 74 20  efix of z2 that 
7330: 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20 0a 2a  was deemed to .*
7340: 2a 20 6d 61 74 63 68 20 70 46 72 6f 6d 2e 0a 2a  * match pFrom..*
7350: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69  /.static int edi
7360: 74 44 69 73 74 33 43 6f 72 65 28 0a 20 20 45 64  tDist3Core(.  Ed
7370: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
7380: 67 20 2a 70 46 72 6f 6d 2c 20 20 2f 2a 20 54 68  g *pFrom,  /* Th
7390: 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f  e FROM string */
73a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
73b0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
73c0: 2f 2a 20 54 68 65 20 54 4f 20 73 74 72 69 6e 67  /* The TO string
73d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 20 20   */.  int n2,   
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
7400: 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f  the TO string */
7410: 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73  .  const EditDis
7420: 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 20 20  t3Lang *pLang,  
7430: 2f 2a 20 45 64 69 74 20 77 65 69 67 68 74 73 20  /* Edit weights 
7440: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
7450: 20 6c 61 6e 67 75 61 67 65 20 49 44 20 2a 2f 0a   language ID */.
7460: 20 20 69 6e 74 20 2a 70 6e 4d 61 74 63 68 20 20    int *pnMatch  
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7480: 2a 20 4f 55 54 3a 20 43 68 61 72 61 63 74 65 72  * OUT: Character
7490: 73 20 69 6e 20 6d 61 74 63 68 65 64 20 70 72 65  s in matched pre
74a0: 66 69 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  fix */.){.  int 
74b0: 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 31 2c 20  k, n;.  int i1, 
74c0: 62 31 3b 0a 20 20 69 6e 74 20 69 32 2c 20 62 32  b1;.  int i2, b2
74d0: 3b 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f  ;.  EditDist3Fro
74e0: 6d 53 74 72 69 6e 67 20 66 20 3d 20 2a 70 46 72  mString f = *pFr
74f0: 6f 6d 3b 0a 20 20 45 64 69 74 44 69 73 74 33 54  om;.  EditDist3T
7500: 6f 20 2a 61 32 3b 0a 20 20 75 6e 73 69 67 6e 65  o *a2;.  unsigne
7510: 64 20 69 6e 74 20 2a 6d 3b 0a 20 20 75 6e 73 69  d int *m;.  unsi
7520: 67 6e 65 64 20 69 6e 74 20 2a 70 54 6f 46 72 65  gned int *pToFre
7530: 65 3b 0a 20 20 69 6e 74 20 73 7a 52 6f 77 3b 0a  e;.  int szRow;.
7540: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
7550: 2a 70 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  *p;.  int res;. 
7560: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
7570: 6e 42 79 74 65 3b 0a 20 20 75 6e 73 69 67 6e 65  nByte;.  unsigne
7580: 64 20 69 6e 74 20 73 74 61 63 6b 53 70 61 63 65  d int stackSpace
7590: 5b 53 51 4c 49 54 45 5f 53 50 45 4c 4c 46 49 58  [SQLITE_SPELLFIX
75a0: 5f 53 54 41 43 4b 41 4c 4c 4f 43 5f 53 5a 2f 73  _STACKALLOC_SZ/s
75b0: 69 7a 65 6f 66 28 75 6e 73 69 67 6e 65 64 20 69  izeof(unsigned i
75c0: 6e 74 29 5d 3b 0a 0a 20 20 2f 2a 20 61 6c 6c 6f  nt)];..  /* allo
75d0: 63 61 74 65 20 74 68 65 20 57 61 67 6e 65 72 20  cate the Wagner 
75e0: 6d 61 74 72 69 78 20 61 6e 64 20 74 68 65 20 61  matrix and the a
75f0: 54 6f 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 74  To[] array for t
7600: 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a  he TO string */.
7610: 20 20 6e 20 3d 20 28 66 2e 6e 2b 31 29 2a 28 6e    n = (f.n+1)*(n
7620: 32 2b 31 29 3b 0a 20 20 6e 20 3d 20 28 6e 2b 31  2+1);.  n = (n+1
7630: 29 26 7e 31 3b 0a 20 20 6e 42 79 74 65 20 3d 20  )&~1;.  nByte = 
7640: 6e 2a 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 20 2b  n*sizeof(m[0]) +
7650: 20 73 69 7a 65 6f 66 28 61 32 5b 30 5d 29 2a 6e   sizeof(a2[0])*n
7660: 32 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d  2;.  if( nByte<=
7670: 73 69 7a 65 6f 66 28 73 74 61 63 6b 53 70 61 63  sizeof(stackSpac
7680: 65 29 20 29 7b 0a 20 20 20 20 6d 20 3d 20 73 74  e) ){.    m = st
7690: 61 63 6b 53 70 61 63 65 3b 0a 20 20 20 20 70 54  ackSpace;.    pT
76a0: 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  oFree = 0;.  }el
76b0: 73 65 7b 0a 20 20 20 20 6d 20 3d 20 70 54 6f 46  se{.    m = pToF
76c0: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ree = sqlite3_ma
76d0: 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 20 29 3b  lloc64( nByte );
76e0: 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 20  .    if( m==0 ) 
76f0: 72 65 74 75 72 6e 20 2d 31 3b 20 20 20 20 20 20  return -1;      
7700: 20 20 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20        /* Out of 
7710: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 7d 0a 20 20  memory */.  }.  
7720: 61 32 20 3d 20 28 45 64 69 74 44 69 73 74 33 54  a2 = (EditDist3T
7730: 6f 2a 29 26 6d 5b 6e 5d 3b 0a 20 20 6d 65 6d 73  o*)&m[n];.  mems
7740: 65 74 28 61 32 2c 20 30 2c 20 73 69 7a 65 6f 66  et(a2, 0, sizeof
7750: 28 61 32 5b 30 5d 29 2a 6e 32 29 3b 0a 0a 20 20  (a2[0])*n2);..  
7760: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 61  /* Fill in the a
7770: 31 5b 5d 20 6d 61 74 72 69 78 20 66 6f 72 20 61  1[] matrix for a
7780: 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20 6f 66  ll characters of
7790: 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a   the TO string *
77a0: 2f 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20 69 32  /.  for(i2=0; i2
77b0: 3c 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20 20 20 20  <n2; i2++){.    
77c0: 61 32 5b 69 32 5d 2e 6e 42 79 74 65 20 3d 20 75  a2[i2].nByte = u
77d0: 74 66 38 4c 65 6e 28 28 75 6e 73 69 67 6e 65 64  tf8Len((unsigned
77e0: 20 63 68 61 72 29 7a 32 5b 69 32 5d 2c 20 6e 32   char)z2[i2], n2
77f0: 2d 69 32 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d  -i2);.    for(p=
7800: 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 3b 20 70 3b  pLang->pCost; p;
7810: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
7820: 20 20 20 20 45 64 69 74 44 69 73 74 33 43 6f 73      EditDist3Cos
7830: 74 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20 20  t **apNew;.     
7840: 20 69 66 28 20 70 2d 3e 6e 46 72 6f 6d 3e 30 20   if( p->nFrom>0 
7850: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7860: 20 20 69 66 28 20 69 32 2b 70 2d 3e 6e 54 6f 3e    if( i2+p->nTo>
7870: 6e 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  n2 ) continue;. 
7880: 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 54 6f       if( matchTo
7890: 28 70 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32  (p, z2+i2, n2-i2
78a0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
78b0: 0a 20 20 20 20 20 20 61 32 5b 69 32 5d 2e 6e 49  .      a2[i2].nI
78c0: 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 61 70 4e 65  ns++;.      apNe
78d0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
78e0: 6c 6f 63 36 34 28 61 32 5b 69 32 5d 2e 61 70 49  loc64(a2[i2].apI
78f0: 6e 73 2c 20 73 69 7a 65 6f 66 28 2a 61 70 4e 65  ns, sizeof(*apNe
7900: 77 29 2a 61 32 5b 69 32 5d 2e 6e 49 6e 73 29 3b  w)*a2[i2].nIns);
7910: 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
7920: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
7930: 65 73 20 3d 20 2d 31 3b 20 20 2f 2a 20 4f 75 74  es = -1;  /* Out
7940: 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
7950: 20 20 20 20 20 20 67 6f 74 6f 20 65 64 69 74 44        goto editD
7960: 69 73 74 33 41 62 6f 72 74 3b 0a 20 20 20 20 20  ist3Abort;.     
7970: 20 7d 0a 20 20 20 20 20 20 61 32 5b 69 32 5d 2e   }.      a2[i2].
7980: 61 70 49 6e 73 20 3d 20 61 70 4e 65 77 3b 0a 20  apIns = apNew;. 
7990: 20 20 20 20 20 61 32 5b 69 32 5d 2e 61 70 49 6e       a2[i2].apIn
79a0: 73 5b 61 32 5b 69 32 5d 2e 6e 49 6e 73 2d 31 5d  s[a2[i2].nIns-1]
79b0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = p;.    }.  }.
79c0: 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 6f  .  /* Prepare to
79d0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 69 6e   compute the min
79e0: 69 6d 75 6d 20 65 64 69 74 20 64 69 73 74 61 6e  imum edit distan
79f0: 63 65 20 2a 2f 0a 20 20 73 7a 52 6f 77 20 3d 20  ce */.  szRow = 
7a00: 66 2e 6e 2b 31 3b 0a 20 20 6d 65 6d 73 65 74 28  f.n+1;.  memset(
7a10: 6d 2c 20 30 78 30 31 2c 20 28 6e 32 2b 31 29 2a  m, 0x01, (n2+1)*
7a20: 73 7a 52 6f 77 2a 73 69 7a 65 6f 66 28 6d 5b 30  szRow*sizeof(m[0
7a30: 5d 29 29 3b 0a 20 20 6d 5b 30 5d 20 3d 20 30 3b  ]));.  m[0] = 0;
7a40: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 66 69 6c  ..  /* First fil
7a50: 6c 20 69 6e 20 74 68 65 20 74 6f 70 2d 72 6f 77  l in the top-row
7a60: 20 6f 66 20 74 68 65 20 6d 61 74 72 69 78 20 77   of the matrix w
7a70: 69 74 68 20 46 52 4f 4d 20 64 65 6c 65 74 69 6f  ith FROM deletio
7a80: 6e 20 63 6f 73 74 73 20 2a 2f 0a 20 20 66 6f 72  n costs */.  for
7a90: 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20 69  (i1=0; i1<f.n; i
7aa0: 31 20 2b 3d 20 62 31 29 7b 0a 20 20 20 20 62 31  1 += b1){.    b1
7ab0: 20 3d 20 66 2e 61 5b 69 31 5d 2e 6e 42 79 74 65   = f.a[i1].nByte
7ac0: 3b 0a 20 20 20 20 75 70 64 61 74 65 43 6f 73 74  ;.    updateCost
7ad0: 28 6d 2c 20 69 31 2b 62 31 2c 20 69 31 2c 20 70  (m, i1+b1, i1, p
7ae0: 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f 73 74 29 3b  Lang->iDelCost);
7af0: 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
7b00: 66 2e 61 5b 69 31 5d 2e 6e 44 65 6c 3b 20 6b 2b  f.a[i1].nDel; k+
7b10: 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 66 2e  +){.      p = f.
7b20: 61 5b 69 31 5d 2e 61 70 44 65 6c 5b 6b 5d 3b 0a  a[i1].apDel[k];.
7b30: 20 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74        updateCost
7b40: 28 6d 2c 20 69 31 2b 70 2d 3e 6e 46 72 6f 6d 2c  (m, i1+p->nFrom,
7b50: 20 69 31 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a   i1, p->iCost);.
7b60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7b70: 46 69 6c 6c 20 69 6e 20 61 6c 6c 20 73 75 62 73  Fill in all subs
7b80: 65 71 75 65 6e 74 20 72 6f 77 73 2c 20 74 6f 70  equent rows, top
7b90: 2d 74 6f 2d 62 6f 74 74 6f 6d 2c 20 6c 65 66 74  -to-bottom, left
7ba0: 2d 74 6f 2d 72 69 67 68 74 20 2a 2f 0a 20 20 66  -to-right */.  f
7bb0: 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b 20  or(i2=0; i2<n2; 
7bc0: 69 32 20 2b 3d 20 62 32 29 7b 0a 20 20 20 20 69  i2 += b2){.    i
7bd0: 6e 74 20 72 78 3b 20 20 20 20 20 20 2f 2a 20 53  nt rx;      /* S
7be0: 74 61 72 74 69 6e 67 20 69 6e 64 65 78 20 66 6f  tarting index fo
7bf0: 72 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f  r current row */
7c00: 0a 20 20 20 20 69 6e 74 20 72 78 70 3b 20 20 20  .    int rxp;   
7c10: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 69 6e    /* Starting in
7c20: 64 65 78 20 66 6f 72 20 70 72 65 76 69 6f 75 73  dex for previous
7c30: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 62 32 20 3d   row */.    b2 =
7c40: 20 61 32 5b 69 32 5d 2e 6e 42 79 74 65 3b 0a 20   a2[i2].nByte;. 
7c50: 20 20 20 72 78 20 3d 20 73 7a 52 6f 77 2a 28 69     rx = szRow*(i
7c60: 32 2b 62 32 29 3b 0a 20 20 20 20 72 78 70 20 3d  2+b2);.    rxp =
7c70: 20 73 7a 52 6f 77 2a 69 32 3b 0a 20 20 20 20 75   szRow*i2;.    u
7c80: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 72 78 2c  pdateCost(m, rx,
7c90: 20 72 78 70 2c 20 70 4c 61 6e 67 2d 3e 69 49 6e   rxp, pLang->iIn
7ca0: 73 43 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72 28  sCost);.    for(
7cb0: 6b 3d 30 3b 20 6b 3c 61 32 5b 69 32 5d 2e 6e 49  k=0; k<a2[i2].nI
7cc0: 6e 73 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ns; k++){.      
7cd0: 70 20 3d 20 61 32 5b 69 32 5d 2e 61 70 49 6e 73  p = a2[i2].apIns
7ce0: 5b 6b 5d 3b 0a 20 20 20 20 20 20 75 70 64 61 74  [k];.      updat
7cf0: 65 43 6f 73 74 28 6d 2c 20 73 7a 52 6f 77 2a 28  eCost(m, szRow*(
7d00: 69 32 2b 70 2d 3e 6e 54 6f 29 2c 20 72 78 70 2c  i2+p->nTo), rxp,
7d10: 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20   p->iCost);.    
7d20: 7d 0a 20 20 20 20 66 6f 72 28 69 31 3d 30 3b 20  }.    for(i1=0; 
7d30: 69 31 3c 66 2e 6e 3b 20 69 31 2b 3d 62 31 29 7b  i1<f.n; i1+=b1){
7d40: 0a 20 20 20 20 20 20 69 6e 74 20 63 78 3b 20 20  .      int cx;  
7d50: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75    /* Index of cu
7d60: 72 72 65 6e 74 20 63 65 6c 6c 20 2a 2f 0a 20 20  rrent cell */.  
7d70: 20 20 20 20 69 6e 74 20 63 78 70 3b 20 20 20 2f      int cxp;   /
7d80: 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20  * Index of cell 
7d90: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
7da0: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
7db0: 20 69 6e 74 20 63 78 64 3b 20 20 20 2f 2a 20 49   int cxd;   /* I
7dc0: 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20  ndex of cell to 
7dd0: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 6f 6e 65  the left and one
7de0: 20 72 6f 77 20 61 62 6f 76 65 20 2a 2f 0a 20 20   row above */.  
7df0: 20 20 20 20 69 6e 74 20 63 78 75 3b 20 20 20 2f      int cxu;   /
7e00: 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20  * Index of cell 
7e10: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 62 6f 76  immediately abov
7e20: 65 20 2a 2f 0a 20 20 20 20 20 20 62 31 20 3d 20  e */.      b1 = 
7e30: 66 2e 61 5b 69 31 5d 2e 6e 42 79 74 65 3b 0a 20  f.a[i1].nByte;. 
7e40: 20 20 20 20 20 63 78 70 20 3d 20 72 78 20 2b 20       cxp = rx + 
7e50: 69 31 3b 0a 20 20 20 20 20 20 63 78 20 3d 20 63  i1;.      cx = c
7e60: 78 70 20 2b 20 62 31 3b 0a 20 20 20 20 20 20 63  xp + b1;.      c
7e70: 78 64 20 3d 20 72 78 70 20 2b 20 69 31 3b 0a 20  xd = rxp + i1;. 
7e80: 20 20 20 20 20 63 78 75 20 3d 20 63 78 64 20 2b       cxu = cxd +
7e90: 20 62 31 3b 0a 20 20 20 20 20 20 75 70 64 61 74   b1;.      updat
7ea0: 65 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 70  eCost(m, cx, cxp
7eb0: 2c 20 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f 73  , pLang->iDelCos
7ec0: 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  t);.      for(k=
7ed0: 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 44 65  0; k<f.a[i1].nDe
7ee0: 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
7ef0: 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70 44   p = f.a[i1].apD
7f00: 65 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 75  el[k];.        u
7f10: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 70  pdateCost(m, cxp
7f20: 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 63 78 70 2c 20  +p->nFrom, cxp, 
7f30: 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20 20  p->iCost);.     
7f40: 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65 43   }.      updateC
7f50: 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 75 2c 20  ost(m, cx, cxu, 
7f60: 70 4c 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 29  pLang->iInsCost)
7f70: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63  ;.      if( matc
7f80: 68 46 72 6f 6d 54 6f 28 26 66 2c 20 69 31 2c 20  hFromTo(&f, i1, 
7f90: 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29 20 29 7b  z2+i2, n2-i2) ){
7fa0: 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 43  .        updateC
7fb0: 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 64 2c 20  ost(m, cx, cxd, 
7fc0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
7fd0: 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20    updateCost(m, 
7fe0: 63 78 2c 20 63 78 64 2c 20 70 4c 61 6e 67 2d 3e  cx, cxd, pLang->
7ff0: 69 53 75 62 43 6f 73 74 29 3b 0a 20 20 20 20 20  iSubCost);.     
8000: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b   for(k=0; k<f.a[
8010: 69 31 5d 2e 6e 53 75 62 73 74 3b 20 6b 2b 2b 29  i1].nSubst; k++)
8020: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66 2e  {.        p = f.
8030: 61 5b 69 31 5d 2e 61 70 53 75 62 73 74 5b 6b 5d  a[i1].apSubst[k]
8040: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61  ;.        if( ma
8050: 74 63 68 54 6f 28 70 2c 20 7a 32 2b 69 32 2c 20  tchTo(p, z2+i2, 
8060: 6e 32 2d 69 32 29 20 29 7b 0a 20 20 20 20 20 20  n2-i2) ){.      
8070: 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d      updateCost(m
8080: 2c 20 63 78 64 2b 70 2d 3e 6e 46 72 6f 6d 2b 73  , cxd+p->nFrom+s
8090: 7a 52 6f 77 2a 70 2d 3e 6e 54 6f 2c 20 63 78 64  zRow*p->nTo, cxd
80a0: 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20  , p->iCost);.   
80b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
80c0: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 30 20     }.  }..#if 0 
80d0: 20 2f 2a 20 45 6e 61 62 6c 65 20 66 6f 72 20 64   /* Enable for d
80e0: 65 62 75 67 67 69 6e 67 20 2a 2f 0a 20 20 70 72  ebugging */.  pr
80f0: 69 6e 74 66 28 22 20 20 20 20 20 20 20 20 20 5e  intf("         ^
8100: 22 29 3b 0a 20 20 66 6f 72 28 69 31 3d 30 3b 20  ");.  for(i1=0; 
8110: 69 31 3c 66 2e 6e 3b 20 69 31 2b 2b 29 20 70 72  i1<f.n; i1++) pr
8120: 69 6e 74 66 28 22 20 25 63 2d 25 32 78 22 2c 20  intf(" %c-%2x", 
8130: 66 2e 7a 5b 69 31 5d 2c 20 66 2e 7a 5b 69 31 5d  f.z[i1], f.z[i1]
8140: 26 30 78 66 66 29 3b 0a 20 20 70 72 69 6e 74 66  &0xff);.  printf
8150: 28 22 5c 6e 20 20 20 5e 3a 22 29 3b 0a 20 20 66  ("\n   ^:");.  f
8160: 6f 72 28 69 31 3d 30 3b 20 69 31 3c 73 7a 52 6f  or(i1=0; i1<szRo
8170: 77 3b 20 69 31 2b 2b 29 7b 0a 20 20 20 20 69 6e  w; i1++){.    in
8180: 74 20 76 20 3d 20 6d 5b 69 31 5d 3b 0a 20 20 20  t v = m[i1];.   
8190: 20 69 66 28 20 76 3e 39 39 39 39 20 29 20 70 72   if( v>9999 ) pr
81a0: 69 6e 74 66 28 22 20 2a 2a 2a 2a 22 29 3b 0a 20  intf(" ****");. 
81b0: 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
81c0: 70 72 69 6e 74 66 28 22 20 25 34 64 22 2c 20 76  printf(" %4d", v
81d0: 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28  );.  }.  printf(
81e0: 22 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 32 3d  "\n");.  for(i2=
81f0: 30 3b 20 69 32 3c 6e 32 3b 20 69 32 2b 2b 29 7b  0; i2<n2; i2++){
8200: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 63 2d  .    printf("%c-
8210: 25 30 32 78 3a 22 2c 20 7a 32 5b 69 32 5d 2c 20  %02x:", z2[i2], 
8220: 7a 32 5b 69 32 5d 26 30 78 66 66 29 3b 0a 20 20  z2[i2]&0xff);.  
8230: 20 20 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 73    for(i1=0; i1<s
8240: 7a 52 6f 77 3b 20 69 31 2b 2b 29 7b 0a 20 20 20  zRow; i1++){.   
8250: 20 20 20 69 6e 74 20 76 20 3d 20 6d 5b 28 69 32     int v = m[(i2
8260: 2b 31 29 2a 73 7a 52 6f 77 2b 69 31 5d 3b 0a 20  +1)*szRow+i1];. 
8270: 20 20 20 20 20 69 66 28 20 76 3e 39 39 39 39 20       if( v>9999 
8280: 29 20 70 72 69 6e 74 66 28 22 20 2a 2a 2a 2a 22  ) printf(" ****"
8290: 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20  );.      else   
82a0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25        printf(" %
82b0: 34 64 22 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20  4d", v);.    }. 
82c0: 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
82d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
82e0: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 61 6c  * Free memory al
82f0: 6c 6f 63 61 74 69 6f 6e 73 20 61 6e 64 20 72 65  locations and re
8300: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
8310: 2a 2f 0a 20 20 72 65 73 20 3d 20 28 69 6e 74 29  */.  res = (int)
8320: 6d 5b 73 7a 52 6f 77 2a 28 6e 32 2b 31 29 2d 31  m[szRow*(n2+1)-1
8330: 5d 3b 0a 20 20 6e 20 3d 20 6e 32 3b 0a 20 20 69  ];.  n = n2;.  i
8340: 66 28 20 66 2e 69 73 50 72 65 66 69 78 20 29 7b  f( f.isPrefix ){
8350: 0a 20 20 20 20 66 6f 72 28 69 32 3d 31 3b 20 69  .    for(i2=1; i
8360: 32 3c 3d 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20 20  2<=n2; i2++){.  
8370: 20 20 20 20 69 6e 74 20 62 20 3d 20 6d 5b 73 7a      int b = m[sz
8380: 52 6f 77 2a 69 32 2d 31 5d 3b 0a 20 20 20 20 20  Row*i2-1];.     
8390: 20 69 66 28 20 62 3c 3d 72 65 73 20 29 7b 20 0a   if( b<=res ){ .
83a0: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 62 3b          res = b;
83b0: 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 69 32 20  .        n = i2 
83c0: 2d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  - 1;.      }.   
83d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 4d   }.  }.  if( pnM
83e0: 61 74 63 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  atch ){.    int 
83f0: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20  nExtra = 0;.    
8400: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b 2b  for(k=0; k<n; k+
8410: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a  +){.      if( (z
8420: 32 5b 6b 5d 20 26 20 30 78 63 30 29 3d 3d 30 78  2[k] & 0xc0)==0x
8430: 38 30 20 29 20 6e 45 78 74 72 61 2b 2b 3b 0a 20  80 ) nExtra++;. 
8440: 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4d 61 74 63     }.    *pnMatc
8450: 68 20 3d 20 6e 20 2d 20 6e 45 78 74 72 61 3b 0a  h = n - nExtra;.
8460: 20 20 7d 0a 0a 65 64 69 74 44 69 73 74 33 41 62    }..editDist3Ab
8470: 6f 72 74 3a 0a 20 20 66 6f 72 28 69 32 3d 30 3b  ort:.  for(i2=0;
8480: 20 69 32 3c 6e 32 3b 20 69 32 2b 2b 29 20 73 71   i2<n2; i2++) sq
8490: 6c 69 74 65 33 5f 66 72 65 65 28 61 32 5b 69 32  lite3_free(a2[i2
84a0: 5d 2e 61 70 49 6e 73 29 3b 0a 20 20 73 71 6c 69  ].apIns);.  sqli
84b0: 74 65 33 5f 66 72 65 65 28 70 54 6f 46 72 65 65  te3_free(pToFree
84c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
84d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
84e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 45 64 69   appropriate Edi
84f0: 74 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a 65 63  tDist3Lang objec
8500: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  t..*/.static con
8510: 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  st EditDist3Lang
8520: 20 2a 65 64 69 74 44 69 73 74 33 46 69 6e 64 4c   *editDist3FindL
8530: 61 6e 67 28 0a 20 20 45 64 69 74 44 69 73 74 33  ang(.  EditDist3
8540: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
8550: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 0a 29 7b 0a  .  int iLang.){.
8560: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
8570: 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
8580: 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lang; i++){.    
8590: 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 5b 69  if( pConfig->a[i
85a0: 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61 6e 67 20 29  ].iLang==iLang )
85b0: 20 72 65 74 75 72 6e 20 26 70 43 6f 6e 66 69 67   return &pConfig
85c0: 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ->a[i];.  }.  re
85d0: 74 75 72 6e 20 26 65 64 69 74 44 69 73 74 33 4c  turn &editDist3L
85e0: 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75  ang;.}../*.** Fu
85f0: 6e 63 74 69 6f 6e 3a 20 20 20 20 65 64 69 74 64  nction:    editd
8600: 69 73 74 33 28 41 2c 42 2c 69 4c 61 6e 67 29 0a  ist3(A,B,iLang).
8610: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
8620: 65 64 69 74 64 69 73 74 33 28 74 61 62 6c 65 6e  editdist3(tablen
8630: 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ame).**.** Retur
8640: 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 72  n the cost of tr
8650: 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74 72 69 6e  ansforming strin
8660: 67 20 41 20 69 6e 74 6f 20 73 74 72 69 6e 67 20  g A into string 
8670: 42 20 75 73 69 6e 67 20 65 64 69 74 0a 2a 2a 20  B using edit.** 
8680: 77 65 69 67 68 74 73 20 66 6f 72 20 69 4c 61 6e  weights for iLan
8690: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  g..**.** The sec
86a0: 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61 64 73 20 65  ond form loads e
86b0: 64 69 74 20 77 65 69 67 68 74 73 20 69 6e 74 6f  dit weights into
86c0: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 61 20 74   memory from a t
86d0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
86e0: 76 6f 69 64 20 65 64 69 74 44 69 73 74 33 53 71  void editDist3Sq
86f0: 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  lFunc(.  sqlite3
8700: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
8710: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
8720: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8730: 2a 61 72 67 76 0a 29 7b 0a 20 20 45 64 69 74 44  *argv.){.  EditD
8740: 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  ist3Config *pCon
8750: 66 69 67 20 3d 20 28 45 64 69 74 44 69 73 74 33  fig = (EditDist3
8760: 43 6f 6e 66 69 67 2a 29 73 71 6c 69 74 65 33 5f  Config*)sqlite3_
8770: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
8780: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t);.  sqlite3 *d
8790: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
87a0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
87b0: 6e 74 65 78 74 29 3b 0a 20 20 69 6e 74 20 72 63  ntext);.  int rc
87c0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20  ;.  if( argc==1 
87d0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
87e0: 72 20 2a 7a 54 61 62 6c 65 20 3d 20 28 63 6f 6e  r *zTable = (con
87f0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
8800: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8810: 5b 30 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 65  [0]);.    rc = e
8820: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c 6f  ditDist3ConfigLo
8830: 61 64 28 70 43 6f 6e 66 69 67 2c 20 64 62 2c 20  ad(pConfig, db, 
8840: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
8850: 20 72 63 20 29 20 73 71 6c 69 74 65 33 5f 72 65   rc ) sqlite3_re
8860: 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
8870: 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20 20  context, rc);.  
8880: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
8890: 20 63 68 61 72 20 2a 7a 41 20 3d 20 28 63 6f 6e   char *zA = (con
88a0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
88b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
88c0: 5b 30 5d 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  [0]);.    const 
88d0: 63 68 61 72 20 2a 7a 42 20 3d 20 28 63 6f 6e 73  char *zB = (cons
88e0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
88f0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8900: 31 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 41 20  1]);.    int nA 
8910: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8920: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
8930: 20 20 20 20 69 6e 74 20 6e 42 20 3d 20 73 71 6c      int nB = sql
8940: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8950: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
8960: 6e 74 20 69 4c 61 6e 67 20 3d 20 61 72 67 63 3d  nt iLang = argc=
8970: 3d 33 20 3f 20 73 71 6c 69 74 65 33 5f 76 61 6c  =3 ? sqlite3_val
8980: 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 20  ue_int(argv[2]) 
8990: 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  : 0;.    const E
89a0: 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70 4c  ditDist3Lang *pL
89b0: 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74 33 46  ang = editDist3F
89c0: 69 6e 64 4c 61 6e 67 28 70 43 6f 6e 66 69 67 2c  indLang(pConfig,
89d0: 20 69 4c 61 6e 67 29 3b 0a 20 20 20 20 45 64 69   iLang);.    Edi
89e0: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
89f0: 20 2a 70 46 72 6f 6d 3b 0a 20 20 20 20 69 6e 74   *pFrom;.    int
8a00: 20 64 69 73 74 3b 0a 0a 20 20 20 20 70 46 72 6f   dist;..    pFro
8a10: 6d 20 3d 20 65 64 69 74 44 69 73 74 33 46 72 6f  m = editDist3Fro
8a20: 6d 53 74 72 69 6e 67 4e 65 77 28 70 4c 61 6e 67  mStringNew(pLang
8a30: 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20 20 20 20 69  , zA, nA);.    i
8a40: 66 28 20 70 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( pFrom==0 ){. 
8a50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8a60: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
8a70: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
8a80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8a90: 20 20 64 69 73 74 20 3d 20 65 64 69 74 44 69 73    dist = editDis
8aa0: 74 33 43 6f 72 65 28 70 46 72 6f 6d 2c 20 7a 42  t3Core(pFrom, zB
8ab0: 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c 20 30 29 3b  , nB, pLang, 0);
8ac0: 0a 20 20 20 20 65 64 69 74 44 69 73 74 33 46 72  .    editDist3Fr
8ad0: 6f 6d 53 74 72 69 6e 67 44 65 6c 65 74 65 28 70  omStringDelete(p
8ae0: 46 72 6f 6d 29 3b 0a 20 20 20 20 69 66 28 20 64  From);.    if( d
8af0: 69 73 74 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ist==(-1) ){.   
8b00: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8b10: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
8b20: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73  ntext);.    }els
8b30: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
8b40: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
8b50: 65 78 74 2c 20 64 69 73 74 29 3b 0a 20 20 20 20  ext, dist);.    
8b60: 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  }.  } .}../*.** 
8b70: 52 65 67 69 73 74 65 72 20 74 68 65 20 65 64 69  Register the edi
8b80: 74 44 69 73 74 33 20 66 75 6e 63 74 69 6f 6e 20  tDist3 function 
8b90: 77 69 74 68 20 53 51 4c 69 74 65 0a 2a 2f 0a 73  with SQLite.*/.s
8ba0: 74 61 74 69 63 20 69 6e 74 20 65 64 69 74 44 69  tatic int editDi
8bb0: 73 74 33 49 6e 73 74 61 6c 6c 28 73 71 6c 69 74  st3Install(sqlit
8bc0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
8bd0: 63 3b 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  c;.  EditDist3Co
8be0: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
8bf0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
8c00: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66 69  ( sizeof(*pConfi
8c10: 67 29 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e  g) );.  if( pCon
8c20: 66 69 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  fig==0 ) return 
8c30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8c40: 6d 65 6d 73 65 74 28 70 43 6f 6e 66 69 67 2c 20  memset(pConfig, 
8c50: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66  0, sizeof(*pConf
8c60: 69 67 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ig));.  rc = sql
8c70: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8c80: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69  tion_v2(db, "edi
8c90: 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20  tdist3",.       
8ca0: 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45         2, SQLITE
8cb0: 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44 45 54  _UTF8|SQLITE_DET
8cc0: 45 52 4d 49 4e 49 53 54 49 43 2c 20 70 43 6f 6e  ERMINISTIC, pCon
8cd0: 66 69 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fig,.           
8ce0: 20 20 20 65 64 69 74 44 69 73 74 33 53 71 6c 46     editDist3SqlF
8cf0: 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  unc, 0, 0, 0);. 
8d00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8d10: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
8d20: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8d30: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65  nction_v2(db, "e
8d40: 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20  ditdist3",.     
8d50: 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 53 51             3, SQ
8d60: 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45  LITE_UTF8|SQLITE
8d70: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
8d80: 70 43 6f 6e 66 69 67 2c 0a 20 20 20 20 20 20 20  pConfig,.       
8d90: 20 20 20 20 20 20 20 20 20 65 64 69 74 44 69 73           editDis
8da0: 74 33 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 2c  t3SqlFunc, 0, 0,
8db0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
8dc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8dd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8de0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8df0: 5f 76 32 28 64 62 2c 20 22 65 64 69 74 64 69 73  _v2(db, "editdis
8e00: 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t3",.           
8e10: 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55       1, SQLITE_U
8e20: 54 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52  TF8|SQLITE_DETER
8e30: 4d 49 4e 49 53 54 49 43 2c 20 70 43 6f 6e 66 69  MINISTIC, pConfi
8e40: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
8e50: 20 20 20 65 64 69 74 44 69 73 74 33 53 71 6c 46     editDist3SqlF
8e60: 75 6e 63 2c 20 30 2c 20 30 2c 20 65 64 69 74 44  unc, 0, 0, editD
8e70: 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74 65  ist3ConfigDelete
8e80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8e90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
8ea0: 6e 66 69 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  nfig);.  }.  ret
8eb0: 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64  urn rc;.}./* End
8ec0: 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 20 63 6f   configurable co
8ed0: 73 74 20 75 6e 69 63 6f 64 65 20 65 64 69 74 20  st unicode edit 
8ee0: 64 69 73 74 61 6e 63 65 20 72 6f 75 74 69 6e 65  distance routine
8ef0: 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s.**************
8f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f40: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
8f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
8f90: 2a 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 6c 69  ** Begin transli
8fa0: 74 65 72 61 74 65 20 75 6e 69 63 6f 64 65 2d 74  terate unicode-t
8fb0: 6f 2d 61 73 63 69 69 20 69 6d 70 6c 65 6d 65 6e  o-ascii implemen
8fc0: 74 61 74 69 6f 6e 0a 2a 2f 0a 0a 23 69 66 20 21  tation.*/..#if !
8fd0: 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54  SQLITE_AMALGAMAT
8fe0: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6c  ION./*.** This l
8ff0: 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69 73 20 75  ookup table is u
9000: 73 65 64 20 74 6f 20 68 65 6c 70 20 64 65 63 6f  sed to help deco
9010: 64 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  de the first byt
9020: 65 20 6f 66 0a 2a 2a 20 61 20 6d 75 6c 74 69 2d  e of.** a multi-
9030: 62 79 74 65 20 55 54 46 38 20 63 68 61 72 61 63  byte UTF8 charac
9040: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ter..*/.static c
9050: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
9060: 61 72 20 73 71 6c 69 74 65 33 55 74 66 38 54 72  ar sqlite3Utf8Tr
9070: 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20 30 78 30  ans1[] = {.  0x0
9080: 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30  0, 0x01, 0x02, 0
9090: 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c  x03, 0x04, 0x05,
90a0: 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30   0x06, 0x07,.  0
90b0: 78 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61 2c  x08, 0x09, 0x0a,
90c0: 20 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78 30   0x0b, 0x0c, 0x0
90d0: 64 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a 20  d, 0x0e, 0x0f,. 
90e0: 20 30 78 31 30 2c 20 30 78 31 31 2c 20 30 78 31   0x10, 0x11, 0x1
90f0: 32 2c 20 30 78 31 33 2c 20 30 78 31 34 2c 20 30  2, 0x13, 0x14, 0
9100: 78 31 35 2c 20 30 78 31 36 2c 20 30 78 31 37 2c  x15, 0x16, 0x17,
9110: 0a 20 20 30 78 31 38 2c 20 30 78 31 39 2c 20 30  .  0x18, 0x19, 0
9120: 78 31 61 2c 20 30 78 31 62 2c 20 30 78 31 63 2c  x1a, 0x1b, 0x1c,
9130: 20 30 78 31 64 2c 20 30 78 31 65 2c 20 30 78 31   0x1d, 0x1e, 0x1
9140: 66 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c  f,.  0x00, 0x01,
9150: 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30   0x02, 0x03, 0x0
9160: 34 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30  4, 0x05, 0x06, 0
9170: 78 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78 30  x07,.  0x08, 0x0
9180: 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20 30  9, 0x0a, 0x0b, 0
9190: 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65 2c  x0c, 0x0d, 0x0e,
91a0: 20 30 78 30 66 2c 0a 20 20 30 78 30 30 2c 20 30   0x0f,.  0x00, 0
91b0: 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c  x01, 0x02, 0x03,
91c0: 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30   0x04, 0x05, 0x0
91d0: 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 30 2c  6, 0x07,.  0x00,
91e0: 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30   0x01, 0x02, 0x0
91f0: 33 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30  3, 0x00, 0x01, 0
9200: 78 30 30 2c 20 30 78 30 30 2c 0a 7d 3b 0a 23 65  x00, 0x00,.};.#e
9210: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
9220: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
9230: 74 68 65 20 66 69 72 73 74 20 55 54 46 2d 38 20  the first UTF-8 
9240: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
9250: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
9260: 69 63 20 69 6e 74 20 75 74 66 38 52 65 61 64 28  ic int utf8Read(
9270: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
9280: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69  har *z, int n, i
9290: 6e 74 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  nt *pSize){.  in
92a0: 74 20 63 2c 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c  t c, i;..  /* Al
92b0: 6c 20 63 61 6c 6c 65 72 73 20 74 6f 20 74 68 69  l callers to thi
92c0: 73 20 72 6f 75 74 69 6e 65 20 28 69 6e 20 74 68  s routine (in th
92d0: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
92e0: 65 6e 74 61 74 69 6f 6e 29 0a 20 20 2a 2a 20 61  entation).  ** a
92f0: 6c 77 61 79 73 20 68 61 76 65 20 6e 3e 30 2e 20  lways have n>0. 
9300: 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6e  */.  if( NEVER(n
9310: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 63 20 3d 20  ==0) ){.    c = 
9320: 69 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  i = 0;.  }else{.
9330: 20 20 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20      c = z[0];.  
9340: 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 69 66 28    i = 1;.    if(
9350: 20 63 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20   c>=0xc0 ){.    
9360: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66    c = sqlite3Utf
9370: 38 54 72 61 6e 73 31 5b 63 2d 30 78 63 30 5d 3b  8Trans1[c-0xc0];
9380: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
9390: 6e 20 26 26 20 28 7a 5b 69 5d 20 26 20 30 78 63  n && (z[i] & 0xc
93a0: 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  0)==0x80 ){.    
93b0: 20 20 20 20 63 20 3d 20 28 63 3c 3c 36 29 20 2b      c = (c<<6) +
93c0: 20 28 30 78 33 66 20 26 20 7a 5b 69 2b 2b 5d 29   (0x3f & z[i++])
93d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
93e0: 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 69    }.  *pSize = i
93f0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
9400: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9410: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
9420: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 75 74  acters in the ut
9430: 66 2d 38 20 73 74 72 69 6e 67 20 69 6e 20 74 68  f-8 string in th
9440: 65 20 6e 49 6e 20 62 79 74 65 0a 2a 2a 20 62 75  e nIn byte.** bu
9450: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
9460: 62 79 20 7a 49 6e 2e 0a 2a 2f 0a 73 74 61 74 69  by zIn..*/.stati
9470: 63 20 69 6e 74 20 75 74 66 38 43 68 61 72 6c 65  c int utf8Charle
9480: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  n(const char *zI
9490: 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69  n, int nIn){.  i
94a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 68 61  nt i;.  int nCha
94b0: 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  r = 0;.  for(i=0
94c0: 3b 20 69 3c 6e 49 6e 3b 20 6e 43 68 61 72 2b 2b  ; i<nIn; nChar++
94d0: 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  ){.    int sz;. 
94e0: 20 20 20 75 74 66 38 52 65 61 64 28 28 63 6f 6e     utf8Read((con
94f0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
9500: 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49 6e 2d   *)&zIn[i], nIn-
9510: 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 20 2b  i, &sz);.    i +
9520: 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = sz;.  }.  retu
9530: 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a  rn nChar;.}../*.
9540: 2a 2a 20 54 61 62 6c 65 20 6f 66 20 74 72 61 6e  ** Table of tran
9550: 73 6c 61 74 69 6f 6e 73 20 66 72 6f 6d 20 75 6e  slations from un
9560: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73  icode characters
9570: 20 69 6e 74 6f 20 41 53 43 49 49 2e 0a 2a 2f 0a   into ASCII..*/.
9580: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
9590: 75 63 74 20 7b 0a 20 75 6e 73 69 67 6e 65 64 20  uct {. unsigned 
95a0: 73 68 6f 72 74 20 69 6e 74 20 63 46 72 6f 6d 3b  short int cFrom;
95b0: 0a 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  . unsigned char 
95c0: 63 54 6f 30 2c 20 63 54 6f 31 3b 0a 7d 20 74 72  cTo0, cTo1;.} tr
95d0: 61 6e 73 6c 69 74 5b 5d 20 3d 20 7b 0a 20 20 7b  anslit[] = {.  {
95e0: 20 30 78 30 30 41 30 2c 20 20 30 78 32 30 2c 20   0x00A0,  0x20, 
95f0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c2 a0 20 74  0x00 },  /* .. t
9600: 6f 20 20 20 2a 2f 0a 20 20 7b 20 30 78 30 30 42  o   */.  { 0x00B
9610: 35 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d  5,  0x75, 0x00 }
9620: 2c 20 20 2f 2a 20 c2 b5 20 74 6f 20 75 20 2a 2f  ,  /* .. to u */
9630: 0a 20 20 7b 20 30 78 30 30 43 30 2c 20 20 30 78  .  { 0x00C0,  0x
9640: 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  41, 0x00 },  /* 
9650: c3 80 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30  .. to A */.  { 0
9660: 78 30 30 43 31 2c 20 20 30 78 34 31 2c 20 30 78  x00C1,  0x41, 0x
9670: 30 30 20 7d 2c 20 20 2f 2a 20 c3 81 20 74 6f 20  00 },  /* .. to 
9680: 41 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 32 2c  A */.  { 0x00C2,
9690: 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20    0x41, 0x00 }, 
96a0: 20 2f 2a 20 c3 82 20 74 6f 20 41 20 2a 2f 0a 20   /* .. to A */. 
96b0: 20 7b 20 30 78 30 30 43 33 2c 20 20 30 78 34 31   { 0x00C3,  0x41
96c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 83  , 0x00 },  /* ..
96d0: 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30   to A */.  { 0x0
96e0: 30 43 34 2c 20 20 30 78 34 31 2c 20 30 78 36 35  0C4,  0x41, 0x65
96f0: 20 7d 2c 20 20 2f 2a 20 c3 84 20 74 6f 20 41 65   },  /* .. to Ae
9700: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 35 2c 20   */.  { 0x00C5, 
9710: 20 30 78 34 31 2c 20 30 78 36 31 20 7d 2c 20 20   0x41, 0x61 },  
9720: 2f 2a 20 c3 85 20 74 6f 20 41 61 20 2a 2f 0a 20  /* .. to Aa */. 
9730: 20 7b 20 30 78 30 30 43 36 2c 20 20 30 78 34 31   { 0x00C6,  0x41
9740: 2c 20 30 78 34 35 20 7d 2c 20 20 2f 2a 20 c3 86  , 0x45 },  /* ..
9750: 20 74 6f 20 41 45 20 2a 2f 0a 20 20 7b 20 30 78   to AE */.  { 0x
9760: 30 30 43 37 2c 20 20 30 78 34 33 2c 20 30 78 30  00C7,  0x43, 0x0
9770: 30 20 7d 2c 20 20 2f 2a 20 c3 87 20 74 6f 20 43  0 },  /* .. to C
9780: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 38 2c 20   */.  { 0x00C8, 
9790: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
97a0: 2f 2a 20 c3 88 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
97b0: 7b 20 30 78 30 30 43 39 2c 20 20 30 78 34 35 2c  { 0x00C9,  0x45,
97c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 89 20   0x00 },  /* .. 
97d0: 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to E */.  { 0x00
97e0: 43 41 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20  CA,  0x45, 0x00 
97f0: 7d 2c 20 20 2f 2a 20 c3 8a 20 74 6f 20 45 20 2a  },  /* .. to E *
9800: 2f 0a 20 20 7b 20 30 78 30 30 43 42 2c 20 20 30  /.  { 0x00CB,  0
9810: 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x45, 0x00 },  /*
9820: 20 c3 8b 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
9830: 30 78 30 30 43 43 2c 20 20 30 78 34 39 2c 20 30  0x00CC,  0x49, 0
9840: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8c 20 74 6f  x00 },  /* .. to
9850: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 44   I */.  { 0x00CD
9860: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
9870: 20 20 2f 2a 20 c3 8d 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
9880: 20 20 7b 20 30 78 30 30 43 45 2c 20 20 30 78 34    { 0x00CE,  0x4
9890: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  9, 0x00 },  /* .
98a0: 8e 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
98b0: 30 30 43 46 2c 20 20 30 78 34 39 2c 20 30 78 30  00CF,  0x49, 0x0
98c0: 30 20 7d 2c 20 20 2f 2a 20 c3 8f 20 74 6f 20 49  0 },  /* .. to I
98d0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 30 2c 20   */.  { 0x00D0, 
98e0: 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x44, 0x00 },  
98f0: 2f 2a 20 c3 90 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
9900: 7b 20 30 78 30 30 44 31 2c 20 20 30 78 34 45 2c  { 0x00D1,  0x4E,
9910: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 91 20   0x00 },  /* .. 
9920: 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to N */.  { 0x00
9930: 44 32 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20  D2,  0x4F, 0x00 
9940: 7d 2c 20 20 2f 2a 20 c3 92 20 74 6f 20 4f 20 2a  },  /* .. to O *
9950: 2f 0a 20 20 7b 20 30 78 30 30 44 33 2c 20 20 30  /.  { 0x00D3,  0
9960: 78 34 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4F, 0x00 },  /*
9970: 20 c3 93 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
9980: 30 78 30 30 44 34 2c 20 20 30 78 34 46 2c 20 30  0x00D4,  0x4F, 0
9990: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 94 20 74 6f  x00 },  /* .. to
99a0: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 35   O */.  { 0x00D5
99b0: 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c  ,  0x4F, 0x00 },
99c0: 20 20 2f 2a 20 c3 95 20 74 6f 20 4f 20 2a 2f 0a    /* .. to O */.
99d0: 20 20 7b 20 30 78 30 30 44 36 2c 20 20 30 78 34    { 0x00D6,  0x4
99e0: 46 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3  F, 0x65 },  /* .
99f0: 96 20 74 6f 20 4f 65 20 2a 2f 0a 20 20 7b 20 30  . to Oe */.  { 0
9a00: 78 30 30 44 37 2c 20 20 30 78 37 38 2c 20 30 78  x00D7,  0x78, 0x
9a10: 30 30 20 7d 2c 20 20 2f 2a 20 c3 97 20 74 6f 20  00 },  /* .. to 
9a20: 78 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 38 2c  x */.  { 0x00D8,
9a30: 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c 20    0x4F, 0x00 }, 
9a40: 20 2f 2a 20 c3 98 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
9a50: 20 7b 20 30 78 30 30 44 39 2c 20 20 30 78 35 35   { 0x00D9,  0x55
9a60: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 99  , 0x00 },  /* ..
9a70: 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30   to U */.  { 0x0
9a80: 30 44 41 2c 20 20 30 78 35 35 2c 20 30 78 30 30  0DA,  0x55, 0x00
9a90: 20 7d 2c 20 20 2f 2a 20 c3 9a 20 74 6f 20 55 20   },  /* .. to U 
9aa0: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 42 2c 20 20  */.  { 0x00DB,  
9ab0: 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x55, 0x00 },  /
9ac0: 2a 20 c3 9b 20 74 6f 20 55 20 2a 2f 0a 20 20 7b  * .. to U */.  {
9ad0: 20 30 78 30 30 44 43 2c 20 20 30 78 35 35 2c 20   0x00DC,  0x55, 
9ae0: 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 9c 20 74  0x65 },  /* .. t
9af0: 6f 20 55 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o Ue */.  { 0x00
9b00: 44 44 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20  DD,  0x59, 0x00 
9b10: 7d 2c 20 20 2f 2a 20 c3 9d 20 74 6f 20 59 20 2a  },  /* .. to Y *
9b20: 2f 0a 20 20 7b 20 30 78 30 30 44 45 2c 20 20 30  /.  { 0x00DE,  0
9b30: 78 35 34 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a  x54, 0x68 },  /*
9b40: 20 c3 9e 20 74 6f 20 54 68 20 2a 2f 0a 20 20 7b   .. to Th */.  {
9b50: 20 30 78 30 30 44 46 2c 20 20 30 78 37 33 2c 20   0x00DF,  0x73, 
9b60: 30 78 37 33 20 7d 2c 20 20 2f 2a 20 c3 9f 20 74  0x73 },  /* .. t
9b70: 6f 20 73 73 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o ss */.  { 0x00
9b80: 45 30 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20  E0,  0x61, 0x00 
9b90: 7d 2c 20 20 2f 2a 20 c3 a0 20 74 6f 20 61 20 2a  },  /* .. to a *
9ba0: 2f 0a 20 20 7b 20 30 78 30 30 45 31 2c 20 20 30  /.  { 0x00E1,  0
9bb0: 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x61, 0x00 },  /*
9bc0: 20 c3 a1 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20   .. to a */.  { 
9bd0: 30 78 30 30 45 32 2c 20 20 30 78 36 31 2c 20 30  0x00E2,  0x61, 0
9be0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a2 20 74 6f  x00 },  /* .. to
9bf0: 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 33   a */.  { 0x00E3
9c00: 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c  ,  0x61, 0x00 },
9c10: 20 20 2f 2a 20 c3 a3 20 74 6f 20 61 20 2a 2f 0a    /* .. to a */.
9c20: 20 20 7b 20 30 78 30 30 45 34 2c 20 20 30 78 36    { 0x00E4,  0x6
9c30: 31 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3  1, 0x65 },  /* .
9c40: a4 20 74 6f 20 61 65 20 2a 2f 0a 20 20 7b 20 30  . to ae */.  { 0
9c50: 78 30 30 45 35 2c 20 20 30 78 36 31 2c 20 30 78  x00E5,  0x61, 0x
9c60: 36 31 20 7d 2c 20 20 2f 2a 20 c3 a5 20 74 6f 20  61 },  /* .. to 
9c70: 61 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 36  aa */.  { 0x00E6
9c80: 2c 20 20 30 78 36 31 2c 20 30 78 36 35 20 7d 2c  ,  0x61, 0x65 },
9c90: 20 20 2f 2a 20 c3 a6 20 74 6f 20 61 65 20 2a 2f    /* .. to ae */
9ca0: 0a 20 20 7b 20 30 78 30 30 45 37 2c 20 20 30 78  .  { 0x00E7,  0x
9cb0: 36 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  63, 0x00 },  /* 
9cc0: c3 a7 20 74 6f 20 63 20 2a 2f 0a 20 20 7b 20 30  .. to c */.  { 0
9cd0: 78 30 30 45 38 2c 20 20 30 78 36 35 2c 20 30 78  x00E8,  0x65, 0x
9ce0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 a8 20 74 6f 20  00 },  /* .. to 
9cf0: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 39 2c  e */.  { 0x00E9,
9d00: 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20    0x65, 0x00 }, 
9d10: 20 2f 2a 20 c3 a9 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
9d20: 20 7b 20 30 78 30 30 45 41 2c 20 20 30 78 36 35   { 0x00EA,  0x65
9d30: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 aa  , 0x00 },  /* ..
9d40: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
9d50: 30 45 42 2c 20 20 30 78 36 35 2c 20 30 78 30 30  0EB,  0x65, 0x00
9d60: 20 7d 2c 20 20 2f 2a 20 c3 ab 20 74 6f 20 65 20   },  /* .. to e 
9d70: 2a 2f 0a 20 20 7b 20 30 78 30 30 45 43 2c 20 20  */.  { 0x00EC,  
9d80: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
9d90: 2a 20 c3 ac 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
9da0: 20 30 78 30 30 45 44 2c 20 20 30 78 36 39 2c 20   0x00ED,  0x69, 
9db0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ad 20 74  0x00 },  /* .. t
9dc0: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45  o i */.  { 0x00E
9dd0: 45 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d  E,  0x69, 0x00 }
9de0: 2c 20 20 2f 2a 20 c3 ae 20 74 6f 20 69 20 2a 2f  ,  /* .. to i */
9df0: 0a 20 20 7b 20 30 78 30 30 45 46 2c 20 20 30 78  .  { 0x00EF,  0x
9e00: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
9e10: c3 af 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
9e20: 78 30 30 46 30 2c 20 20 30 78 36 34 2c 20 30 78  x00F0,  0x64, 0x
9e30: 30 30 20 7d 2c 20 20 2f 2a 20 c3 b0 20 74 6f 20  00 },  /* .. to 
9e40: 64 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 31 2c  d */.  { 0x00F1,
9e50: 20 20 30 78 36 45 2c 20 30 78 30 30 20 7d 2c 20    0x6E, 0x00 }, 
9e60: 20 2f 2a 20 c3 b1 20 74 6f 20 6e 20 2a 2f 0a 20   /* .. to n */. 
9e70: 20 7b 20 30 78 30 30 46 32 2c 20 20 30 78 36 46   { 0x00F2,  0x6F
9e80: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b2  , 0x00 },  /* ..
9e90: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
9ea0: 30 46 33 2c 20 20 30 78 36 46 2c 20 30 78 30 30  0F3,  0x6F, 0x00
9eb0: 20 7d 2c 20 20 2f 2a 20 c3 b3 20 74 6f 20 6f 20   },  /* .. to o 
9ec0: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 34 2c 20 20  */.  { 0x00F4,  
9ed0: 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6F, 0x00 },  /
9ee0: 2a 20 c3 b4 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b  * .. to o */.  {
9ef0: 20 30 78 30 30 46 35 2c 20 20 30 78 36 46 2c 20   0x00F5,  0x6F, 
9f00: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b5 20 74  0x00 },  /* .. t
9f10: 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46  o o */.  { 0x00F
9f20: 36 2c 20 20 30 78 36 46 2c 20 30 78 36 35 20 7d  6,  0x6F, 0x65 }
9f30: 2c 20 20 2f 2a 20 c3 b6 20 74 6f 20 6f 65 20 2a  ,  /* .. to oe *
9f40: 2f 0a 20 20 7b 20 30 78 30 30 46 37 2c 20 20 30  /.  { 0x00F7,  0
9f50: 78 33 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x3A, 0x00 },  /*
9f60: 20 c3 b7 20 74 6f 20 3a 20 2a 2f 0a 20 20 7b 20   .. to : */.  { 
9f70: 30 78 30 30 46 38 2c 20 20 30 78 36 46 2c 20 30  0x00F8,  0x6F, 0
9f80: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b8 20 74 6f  x00 },  /* .. to
9f90: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 39   o */.  { 0x00F9
9fa0: 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c  ,  0x75, 0x00 },
9fb0: 20 20 2f 2a 20 c3 b9 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
9fc0: 20 20 7b 20 30 78 30 30 46 41 2c 20 20 30 78 37    { 0x00FA,  0x7
9fd0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  5, 0x00 },  /* .
9fe0: ba 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78  . to u */.  { 0x
9ff0: 30 30 46 42 2c 20 20 30 78 37 35 2c 20 30 78 30  00FB,  0x75, 0x0
a000: 30 20 7d 2c 20 20 2f 2a 20 c3 bb 20 74 6f 20 75  0 },  /* .. to u
a010: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 43 2c 20   */.  { 0x00FC, 
a020: 20 30 78 37 35 2c 20 30 78 36 35 20 7d 2c 20 20   0x75, 0x65 },  
a030: 2f 2a 20 c3 bc 20 74 6f 20 75 65 20 2a 2f 0a 20  /* .. to ue */. 
a040: 20 7b 20 30 78 30 30 46 44 2c 20 20 30 78 37 39   { 0x00FD,  0x79
a050: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bd  , 0x00 },  /* ..
a060: 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30   to y */.  { 0x0
a070: 30 46 45 2c 20 20 30 78 37 34 2c 20 30 78 36 38  0FE,  0x74, 0x68
a080: 20 7d 2c 20 20 2f 2a 20 c3 be 20 74 6f 20 74 68   },  /* .. to th
a090: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 46 2c 20   */.  { 0x00FF, 
a0a0: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
a0b0: 2f 2a 20 c3 bf 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
a0c0: 7b 20 30 78 30 31 30 30 2c 20 20 30 78 34 31 2c  { 0x0100,  0x41,
a0d0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 80 20   0x00 },  /* .. 
a0e0: 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to A */.  { 0x01
a0f0: 30 31 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20  01,  0x61, 0x00 
a100: 7d 2c 20 20 2f 2a 20 c4 81 20 74 6f 20 61 20 2a  },  /* .. to a *
a110: 2f 0a 20 20 7b 20 30 78 30 31 30 32 2c 20 20 30  /.  { 0x0102,  0
a120: 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x41, 0x00 },  /*
a130: 20 c4 82 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
a140: 30 78 30 31 30 33 2c 20 20 30 78 36 31 2c 20 30  0x0103,  0x61, 0
a150: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 83 20 74 6f  x00 },  /* .. to
a160: 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 34   a */.  { 0x0104
a170: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
a180: 20 20 2f 2a 20 c4 84 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
a190: 20 20 7b 20 30 78 30 31 30 35 2c 20 20 30 78 36    { 0x0105,  0x6
a1a0: 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  1, 0x00 },  /* .
a1b0: 85 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78  . to a */.  { 0x
a1c0: 30 31 30 36 2c 20 20 30 78 34 33 2c 20 30 78 30  0106,  0x43, 0x0
a1d0: 30 20 7d 2c 20 20 2f 2a 20 c4 86 20 74 6f 20 43  0 },  /* .. to C
a1e0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 37 2c 20   */.  { 0x0107, 
a1f0: 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x63, 0x00 },  
a200: 2f 2a 20 c4 87 20 74 6f 20 63 20 2a 2f 0a 20 20  /* .. to c */.  
a210: 7b 20 30 78 30 31 30 38 2c 20 20 30 78 34 33 2c  { 0x0108,  0x43,
a220: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 88 20   0x68 },  /* .. 
a230: 74 6f 20 43 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Ch */.  { 0x0
a240: 31 30 39 2c 20 20 30 78 36 33 2c 20 30 78 36 38  109,  0x63, 0x68
a250: 20 7d 2c 20 20 2f 2a 20 c4 89 20 74 6f 20 63 68   },  /* .. to ch
a260: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 41 2c 20   */.  { 0x010A, 
a270: 20 30 78 34 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x43, 0x00 },  
a280: 2f 2a 20 c4 8a 20 74 6f 20 43 20 2a 2f 0a 20 20  /* .. to C */.  
a290: 7b 20 30 78 30 31 30 42 2c 20 20 30 78 36 33 2c  { 0x010B,  0x63,
a2a0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8b 20   0x00 },  /* .. 
a2b0: 74 6f 20 63 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to c */.  { 0x01
a2c0: 30 43 2c 20 20 30 78 34 33 2c 20 30 78 30 30 20  0C,  0x43, 0x00 
a2d0: 7d 2c 20 20 2f 2a 20 c4 8c 20 74 6f 20 43 20 2a  },  /* .. to C *
a2e0: 2f 0a 20 20 7b 20 30 78 30 31 30 44 2c 20 20 30  /.  { 0x010D,  0
a2f0: 78 36 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x63, 0x00 },  /*
a300: 20 c4 8d 20 74 6f 20 63 20 2a 2f 0a 20 20 7b 20   .. to c */.  { 
a310: 30 78 30 31 30 45 2c 20 20 30 78 34 34 2c 20 30  0x010E,  0x44, 0
a320: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8e 20 74 6f  x00 },  /* .. to
a330: 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 46   D */.  { 0x010F
a340: 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c  ,  0x64, 0x00 },
a350: 20 20 2f 2a 20 c4 8f 20 74 6f 20 64 20 2a 2f 0a    /* .. to d */.
a360: 20 20 7b 20 30 78 30 31 31 30 2c 20 20 30 78 34    { 0x0110,  0x4
a370: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  4, 0x00 },  /* .
a380: 90 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78  . to D */.  { 0x
a390: 30 31 31 31 2c 20 20 30 78 36 34 2c 20 30 78 30  0111,  0x64, 0x0
a3a0: 30 20 7d 2c 20 20 2f 2a 20 c4 91 20 74 6f 20 64  0 },  /* .. to d
a3b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 32 2c 20   */.  { 0x0112, 
a3c0: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
a3d0: 2f 2a 20 c4 92 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
a3e0: 7b 20 30 78 30 31 31 33 2c 20 20 30 78 36 35 2c  { 0x0113,  0x65,
a3f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 93 20   0x00 },  /* .. 
a400: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to e */.  { 0x01
a410: 31 34 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20  14,  0x45, 0x00 
a420: 7d 2c 20 20 2f 2a 20 c4 94 20 74 6f 20 45 20 2a  },  /* .. to E *
a430: 2f 0a 20 20 7b 20 30 78 30 31 31 35 2c 20 20 30  /.  { 0x0115,  0
a440: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
a450: 20 c4 95 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
a460: 30 78 30 31 31 36 2c 20 20 30 78 34 35 2c 20 30  0x0116,  0x45, 0
a470: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 96 20 74 6f  x00 },  /* .. to
a480: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 37   E */.  { 0x0117
a490: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
a4a0: 20 20 2f 2a 20 c4 97 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
a4b0: 20 20 7b 20 30 78 30 31 31 38 2c 20 20 30 78 34    { 0x0118,  0x4
a4c0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  5, 0x00 },  /* .
a4d0: 98 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
a4e0: 30 31 31 39 2c 20 20 30 78 36 35 2c 20 30 78 30  0119,  0x65, 0x0
a4f0: 30 20 7d 2c 20 20 2f 2a 20 c4 99 20 74 6f 20 65  0 },  /* .. to e
a500: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 41 2c 20   */.  { 0x011A, 
a510: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
a520: 2f 2a 20 c4 9a 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
a530: 7b 20 30 78 30 31 31 42 2c 20 20 30 78 36 35 2c  { 0x011B,  0x65,
a540: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9b 20   0x00 },  /* .. 
a550: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to e */.  { 0x01
a560: 31 43 2c 20 20 30 78 34 37 2c 20 30 78 36 38 20  1C,  0x47, 0x68 
a570: 7d 2c 20 20 2f 2a 20 c4 9c 20 74 6f 20 47 68 20  },  /* .. to Gh 
a580: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 44 2c 20 20  */.  { 0x011D,  
a590: 30 78 36 37 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x67, 0x68 },  /
a5a0: 2a 20 c4 9d 20 74 6f 20 67 68 20 2a 2f 0a 20 20  * .. to gh */.  
a5b0: 7b 20 30 78 30 31 31 45 2c 20 20 30 78 34 37 2c  { 0x011E,  0x47,
a5c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9e 20   0x00 },  /* .. 
a5d0: 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to G */.  { 0x01
a5e0: 31 46 2c 20 20 30 78 36 37 2c 20 30 78 30 30 20  1F,  0x67, 0x00 
a5f0: 7d 2c 20 20 2f 2a 20 c4 9f 20 74 6f 20 67 20 2a  },  /* .. to g *
a600: 2f 0a 20 20 7b 20 30 78 30 31 32 30 2c 20 20 30  /.  { 0x0120,  0
a610: 78 34 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x47, 0x00 },  /*
a620: 20 c4 a0 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20   .. to G */.  { 
a630: 30 78 30 31 32 31 2c 20 20 30 78 36 37 2c 20 30  0x0121,  0x67, 0
a640: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a1 20 74 6f  x00 },  /* .. to
a650: 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 32   g */.  { 0x0122
a660: 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c  ,  0x47, 0x00 },
a670: 20 20 2f 2a 20 c4 a2 20 74 6f 20 47 20 2a 2f 0a    /* .. to G */.
a680: 20 20 7b 20 30 78 30 31 32 33 2c 20 20 30 78 36    { 0x0123,  0x6
a690: 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  7, 0x00 },  /* .
a6a0: a3 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78  . to g */.  { 0x
a6b0: 30 31 32 34 2c 20 20 30 78 34 38 2c 20 30 78 36  0124,  0x48, 0x6
a6c0: 38 20 7d 2c 20 20 2f 2a 20 c4 a4 20 74 6f 20 48  8 },  /* .. to H
a6d0: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 35 2c  h */.  { 0x0125,
a6e0: 20 20 30 78 36 38 2c 20 30 78 36 38 20 7d 2c 20    0x68, 0x68 }, 
a6f0: 20 2f 2a 20 c4 a5 20 74 6f 20 68 68 20 2a 2f 0a   /* .. to hh */.
a700: 20 20 7b 20 30 78 30 31 32 36 2c 20 20 30 78 34    { 0x0126,  0x4
a710: 38 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  8, 0x00 },  /* .
a720: a6 20 74 6f 20 48 20 2a 2f 0a 20 20 7b 20 30 78  . to H */.  { 0x
a730: 30 31 32 37 2c 20 20 30 78 36 38 2c 20 30 78 30  0127,  0x68, 0x0
a740: 30 20 7d 2c 20 20 2f 2a 20 c4 a7 20 74 6f 20 68  0 },  /* .. to h
a750: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 38 2c 20   */.  { 0x0128, 
a760: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
a770: 2f 2a 20 c4 a8 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
a780: 7b 20 30 78 30 31 32 39 2c 20 20 30 78 36 39 2c  { 0x0129,  0x69,
a790: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a9 20   0x00 },  /* .. 
a7a0: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to i */.  { 0x01
a7b0: 32 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  2A,  0x49, 0x00 
a7c0: 7d 2c 20 20 2f 2a 20 c4 aa 20 74 6f 20 49 20 2a  },  /* .. to I *
a7d0: 2f 0a 20 20 7b 20 30 78 30 31 32 42 2c 20 20 30  /.  { 0x012B,  0
a7e0: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
a7f0: 20 c4 ab 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
a800: 30 78 30 31 32 43 2c 20 20 30 78 34 39 2c 20 30  0x012C,  0x49, 0
a810: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ac 20 74 6f  x00 },  /* .. to
a820: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 44   I */.  { 0x012D
a830: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
a840: 20 20 2f 2a 20 c4 ad 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
a850: 20 20 7b 20 30 78 30 31 32 45 2c 20 20 30 78 34    { 0x012E,  0x4
a860: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  9, 0x00 },  /* .
a870: ae 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
a880: 30 31 32 46 2c 20 20 30 78 36 39 2c 20 30 78 30  012F,  0x69, 0x0
a890: 30 20 7d 2c 20 20 2f 2a 20 c4 af 20 74 6f 20 69  0 },  /* .. to i
a8a0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 30 2c 20   */.  { 0x0130, 
a8b0: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
a8c0: 2f 2a 20 c4 b0 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
a8d0: 7b 20 30 78 30 31 33 31 2c 20 20 30 78 36 39 2c  { 0x0131,  0x69,
a8e0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b1 20   0x00 },  /* .. 
a8f0: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to i */.  { 0x01
a900: 33 32 2c 20 20 30 78 34 39 2c 20 30 78 34 41 20  32,  0x49, 0x4A 
a910: 7d 2c 20 20 2f 2a 20 c4 b2 20 74 6f 20 49 4a 20  },  /* .. to IJ 
a920: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 33 2c 20 20  */.  { 0x0133,  
a930: 30 78 36 39 2c 20 30 78 36 41 20 7d 2c 20 20 2f  0x69, 0x6A },  /
a940: 2a 20 c4 b3 20 74 6f 20 69 6a 20 2a 2f 0a 20 20  * .. to ij */.  
a950: 7b 20 30 78 30 31 33 34 2c 20 20 30 78 34 41 2c  { 0x0134,  0x4A,
a960: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 b4 20   0x68 },  /* .. 
a970: 74 6f 20 4a 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Jh */.  { 0x0
a980: 31 33 35 2c 20 20 30 78 36 41 2c 20 30 78 36 38  135,  0x6A, 0x68
a990: 20 7d 2c 20 20 2f 2a 20 c4 b5 20 74 6f 20 6a 68   },  /* .. to jh
a9a0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 36 2c 20   */.  { 0x0136, 
a9b0: 20 30 78 34 42 2c 20 30 78 30 30 20 7d 2c 20 20   0x4B, 0x00 },  
a9c0: 2f 2a 20 c4 b6 20 74 6f 20 4b 20 2a 2f 0a 20 20  /* .. to K */.  
a9d0: 7b 20 30 78 30 31 33 37 2c 20 20 30 78 36 42 2c  { 0x0137,  0x6B,
a9e0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b7 20   0x00 },  /* .. 
a9f0: 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to k */.  { 0x01
aa00: 33 38 2c 20 20 30 78 36 42 2c 20 30 78 30 30 20  38,  0x6B, 0x00 
aa10: 7d 2c 20 20 2f 2a 20 c4 b8 20 74 6f 20 6b 20 2a  },  /* .. to k *
aa20: 2f 0a 20 20 7b 20 30 78 30 31 33 39 2c 20 20 30  /.  { 0x0139,  0
aa30: 78 34 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4C, 0x00 },  /*
aa40: 20 c4 b9 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20   .. to L */.  { 
aa50: 30 78 30 31 33 41 2c 20 20 30 78 36 43 2c 20 30  0x013A,  0x6C, 0
aa60: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ba 20 74 6f  x00 },  /* .. to
aa70: 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 42   l */.  { 0x013B
aa80: 2c 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d 2c  ,  0x4C, 0x00 },
aa90: 20 20 2f 2a 20 c4 bb 20 74 6f 20 4c 20 2a 2f 0a    /* .. to L */.
aaa0: 20 20 7b 20 30 78 30 31 33 43 2c 20 20 30 78 36    { 0x013C,  0x6
aab0: 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  C, 0x00 },  /* .
aac0: bc 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78  . to l */.  { 0x
aad0: 30 31 33 44 2c 20 20 30 78 34 43 2c 20 30 78 30  013D,  0x4C, 0x0
aae0: 30 20 7d 2c 20 20 2f 2a 20 c4 bd 20 74 6f 20 4c  0 },  /* .. to L
aaf0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 45 2c 20   */.  { 0x013E, 
ab00: 20 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20 20   0x6C, 0x00 },  
ab10: 2f 2a 20 c4 be 20 74 6f 20 6c 20 2a 2f 0a 20 20  /* .. to l */.  
ab20: 7b 20 30 78 30 31 33 46 2c 20 20 30 78 34 43 2c  { 0x013F,  0x4C,
ab30: 20 30 78 32 45 20 7d 2c 20 20 2f 2a 20 c4 bf 20   0x2E },  /* .. 
ab40: 74 6f 20 4c 2e 20 2a 2f 0a 20 20 7b 20 30 78 30  to L. */.  { 0x0
ab50: 31 34 30 2c 20 20 30 78 36 43 2c 20 30 78 32 45  140,  0x6C, 0x2E
ab60: 20 7d 2c 20 20 2f 2a 20 c5 80 20 74 6f 20 6c 2e   },  /* .. to l.
ab70: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 31 2c 20   */.  { 0x0141, 
ab80: 20 30 78 34 43 2c 20 30 78 30 30 20 7d 2c 20 20   0x4C, 0x00 },  
ab90: 2f 2a 20 c5 81 20 74 6f 20 4c 20 2a 2f 0a 20 20  /* .. to L */.  
aba0: 7b 20 30 78 30 31 34 32 2c 20 20 30 78 36 43 2c  { 0x0142,  0x6C,
abb0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 82 20   0x00 },  /* .. 
abc0: 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to l */.  { 0x01
abd0: 34 33 2c 20 20 30 78 34 45 2c 20 30 78 30 30 20  43,  0x4E, 0x00 
abe0: 7d 2c 20 20 2f 2a 20 c5 83 20 74 6f 20 4e 20 2a  },  /* .. to N *
abf0: 2f 0a 20 20 7b 20 30 78 30 31 34 34 2c 20 20 30  /.  { 0x0144,  0
ac00: 78 36 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6E, 0x00 },  /*
ac10: 20 c5 84 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20   .. to n */.  { 
ac20: 30 78 30 31 34 35 2c 20 20 30 78 34 45 2c 20 30  0x0145,  0x4E, 0
ac30: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 85 20 74 6f  x00 },  /* .. to
ac40: 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 36   N */.  { 0x0146
ac50: 2c 20 20 30 78 36 45 2c 20 30 78 30 30 20 7d 2c  ,  0x6E, 0x00 },
ac60: 20 20 2f 2a 20 c5 86 20 74 6f 20 6e 20 2a 2f 0a    /* .. to n */.
ac70: 20 20 7b 20 30 78 30 31 34 37 2c 20 20 30 78 34    { 0x0147,  0x4
ac80: 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  E, 0x00 },  /* .
ac90: 87 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78  . to N */.  { 0x
aca0: 30 31 34 38 2c 20 20 30 78 36 45 2c 20 30 78 30  0148,  0x6E, 0x0
acb0: 30 20 7d 2c 20 20 2f 2a 20 c5 88 20 74 6f 20 6e  0 },  /* .. to n
acc0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 39 2c 20   */.  { 0x0149, 
acd0: 20 30 78 32 37 2c 20 30 78 36 45 20 7d 2c 20 20   0x27, 0x6E },  
ace0: 2f 2a 20 c5 89 20 74 6f 20 27 6e 20 2a 2f 0a 20  /* .. to 'n */. 
acf0: 20 7b 20 30 78 30 31 34 41 2c 20 20 30 78 34 45   { 0x014A,  0x4E
ad00: 2c 20 30 78 34 37 20 7d 2c 20 20 2f 2a 20 c5 8a  , 0x47 },  /* ..
ad10: 20 74 6f 20 4e 47 20 2a 2f 0a 20 20 7b 20 30 78   to NG */.  { 0x
ad20: 30 31 34 42 2c 20 20 30 78 36 45 2c 20 30 78 36  014B,  0x6E, 0x6
ad30: 37 20 7d 2c 20 20 2f 2a 20 c5 8b 20 74 6f 20 6e  7 },  /* .. to n
ad40: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 43 2c  g */.  { 0x014C,
ad50: 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c 20    0x4F, 0x00 }, 
ad60: 20 2f 2a 20 c5 8c 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
ad70: 20 7b 20 30 78 30 31 34 44 2c 20 20 30 78 36 46   { 0x014D,  0x6F
ad80: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8d  , 0x00 },  /* ..
ad90: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
ada0: 31 34 45 2c 20 20 30 78 34 46 2c 20 30 78 30 30  14E,  0x4F, 0x00
adb0: 20 7d 2c 20 20 2f 2a 20 c5 8e 20 74 6f 20 4f 20   },  /* .. to O 
adc0: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 46 2c 20 20  */.  { 0x014F,  
add0: 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6F, 0x00 },  /
ade0: 2a 20 c5 8f 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b  * .. to o */.  {
adf0: 20 30 78 30 31 35 30 2c 20 20 30 78 34 46 2c 20   0x0150,  0x4F, 
ae00: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 90 20 74  0x00 },  /* .. t
ae10: 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35  o O */.  { 0x015
ae20: 31 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d  1,  0x6F, 0x00 }
ae30: 2c 20 20 2f 2a 20 c5 91 20 74 6f 20 6f 20 2a 2f  ,  /* .. to o */
ae40: 0a 20 20 7b 20 30 78 30 31 35 32 2c 20 20 30 78  .  { 0x0152,  0x
ae50: 34 46 2c 20 30 78 34 35 20 7d 2c 20 20 2f 2a 20  4F, 0x45 },  /* 
ae60: c5 92 20 74 6f 20 4f 45 20 2a 2f 0a 20 20 7b 20  .. to OE */.  { 
ae70: 30 78 30 31 35 33 2c 20 20 30 78 36 46 2c 20 30  0x0153,  0x6F, 0
ae80: 78 36 35 20 7d 2c 20 20 2f 2a 20 c5 93 20 74 6f  x65 },  /* .. to
ae90: 20 6f 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35   oe */.  { 0x015
aea0: 34 2c 20 20 30 78 35 32 2c 20 30 78 30 30 20 7d  4,  0x52, 0x00 }
aeb0: 2c 20 20 2f 2a 20 c5 94 20 74 6f 20 52 20 2a 2f  ,  /* .. to R */
aec0: 0a 20 20 7b 20 30 78 30 31 35 35 2c 20 20 30 78  .  { 0x0155,  0x
aed0: 37 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  72, 0x00 },  /* 
aee0: c5 95 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30  .. to r */.  { 0
aef0: 78 30 31 35 36 2c 20 20 30 78 35 32 2c 20 30 78  x0156,  0x52, 0x
af00: 30 30 20 7d 2c 20 20 2f 2a 20 c5 96 20 74 6f 20  00 },  /* .. to 
af10: 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 37 2c  R */.  { 0x0157,
af20: 20 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20    0x72, 0x00 }, 
af30: 20 2f 2a 20 c5 97 20 74 6f 20 72 20 2a 2f 0a 20   /* .. to r */. 
af40: 20 7b 20 30 78 30 31 35 38 2c 20 20 30 78 35 32   { 0x0158,  0x52
af50: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 98  , 0x00 },  /* ..
af60: 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30   to R */.  { 0x0
af70: 31 35 39 2c 20 20 30 78 37 32 2c 20 30 78 30 30  159,  0x72, 0x00
af80: 20 7d 2c 20 20 2f 2a 20 c5 99 20 74 6f 20 72 20   },  /* .. to r 
af90: 2a 2f 0a 20 20 7b 20 30 78 30 31 35 41 2c 20 20  */.  { 0x015A,  
afa0: 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x53, 0x00 },  /
afb0: 2a 20 c5 9a 20 74 6f 20 53 20 2a 2f 0a 20 20 7b  * .. to S */.  {
afc0: 20 30 78 30 31 35 42 2c 20 20 30 78 37 33 2c 20   0x015B,  0x73, 
afd0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9b 20 74  0x00 },  /* .. t
afe0: 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35  o s */.  { 0x015
aff0: 43 2c 20 20 30 78 35 33 2c 20 30 78 36 38 20 7d  C,  0x53, 0x68 }
b000: 2c 20 20 2f 2a 20 c5 9c 20 74 6f 20 53 68 20 2a  ,  /* .. to Sh *
b010: 2f 0a 20 20 7b 20 30 78 30 31 35 44 2c 20 20 30  /.  { 0x015D,  0
b020: 78 37 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a  x73, 0x68 },  /*
b030: 20 c5 9d 20 74 6f 20 73 68 20 2a 2f 0a 20 20 7b   .. to sh */.  {
b040: 20 30 78 30 31 35 45 2c 20 20 30 78 35 33 2c 20   0x015E,  0x53, 
b050: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9e 20 74  0x00 },  /* .. t
b060: 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35  o S */.  { 0x015
b070: 46 2c 20 20 30 78 37 33 2c 20 30 78 30 30 20 7d  F,  0x73, 0x00 }
b080: 2c 20 20 2f 2a 20 c5 9f 20 74 6f 20 73 20 2a 2f  ,  /* .. to s */
b090: 0a 20 20 7b 20 30 78 30 31 36 30 2c 20 20 30 78  .  { 0x0160,  0x
b0a0: 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  53, 0x00 },  /* 
b0b0: c5 a0 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30  .. to S */.  { 0
b0c0: 78 30 31 36 31 2c 20 20 30 78 37 33 2c 20 30 78  x0161,  0x73, 0x
b0d0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 a1 20 74 6f 20  00 },  /* .. to 
b0e0: 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 32 2c  s */.  { 0x0162,
b0f0: 20 20 30 78 35 34 2c 20 30 78 30 30 20 7d 2c 20    0x54, 0x00 }, 
b100: 20 2f 2a 20 c5 a2 20 74 6f 20 54 20 2a 2f 0a 20   /* .. to T */. 
b110: 20 7b 20 30 78 30 31 36 33 2c 20 20 30 78 37 34   { 0x0163,  0x74
b120: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a3  , 0x00 },  /* ..
b130: 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30   to t */.  { 0x0
b140: 31 36 34 2c 20 20 30 78 35 34 2c 20 30 78 30 30  164,  0x54, 0x00
b150: 20 7d 2c 20 20 2f 2a 20 c5 a4 20 74 6f 20 54 20   },  /* .. to T 
b160: 2a 2f 0a 20 20 7b 20 30 78 30 31 36 35 2c 20 20  */.  { 0x0165,  
b170: 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x74, 0x00 },  /
b180: 2a 20 c5 a5 20 74 6f 20 74 20 2a 2f 0a 20 20 7b  * .. to t */.  {
b190: 20 30 78 30 31 36 36 2c 20 20 30 78 35 34 2c 20   0x0166,  0x54, 
b1a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a6 20 74  0x00 },  /* .. t
b1b0: 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36  o T */.  { 0x016
b1c0: 37 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d  7,  0x74, 0x00 }
b1d0: 2c 20 20 2f 2a 20 c5 a7 20 74 6f 20 74 20 2a 2f  ,  /* .. to t */
b1e0: 0a 20 20 7b 20 30 78 30 31 36 38 2c 20 20 30 78  .  { 0x0168,  0x
b1f0: 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  55, 0x00 },  /* 
b200: c5 a8 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30  .. to U */.  { 0
b210: 78 30 31 36 39 2c 20 20 30 78 37 35 2c 20 30 78  x0169,  0x75, 0x
b220: 30 30 20 7d 2c 20 20 2f 2a 20 c5 a9 20 74 6f 20  00 },  /* .. to 
b230: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 41 2c  u */.  { 0x016A,
b240: 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20    0x55, 0x00 }, 
b250: 20 2f 2a 20 c5 aa 20 74 6f 20 55 20 2a 2f 0a 20   /* .. to U */. 
b260: 20 7b 20 30 78 30 31 36 42 2c 20 20 30 78 37 35   { 0x016B,  0x75
b270: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ab  , 0x00 },  /* ..
b280: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
b290: 31 36 43 2c 20 20 30 78 35 35 2c 20 30 78 30 30  16C,  0x55, 0x00
b2a0: 20 7d 2c 20 20 2f 2a 20 c5 ac 20 74 6f 20 55 20   },  /* .. to U 
b2b0: 2a 2f 0a 20 20 7b 20 30 78 30 31 36 44 2c 20 20  */.  { 0x016D,  
b2c0: 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x75, 0x00 },  /
b2d0: 2a 20 c5 ad 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
b2e0: 20 30 78 30 31 36 45 2c 20 20 30 78 35 35 2c 20   0x016E,  0x55, 
b2f0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ae 20 74  0x00 },  /* .. t
b300: 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36  o U */.  { 0x016
b310: 46 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d  F,  0x75, 0x00 }
b320: 2c 20 20 2f 2a 20 c5 af 20 74 6f 20 75 20 2a 2f  ,  /* .. to u */
b330: 0a 20 20 7b 20 30 78 30 31 37 30 2c 20 20 30 78  .  { 0x0170,  0x
b340: 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  55, 0x00 },  /* 
b350: c5 b0 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30  .. to U */.  { 0
b360: 78 30 31 37 31 2c 20 20 30 78 37 35 2c 20 30 78  x0171,  0x75, 0x
b370: 30 30 20 7d 2c 20 20 2f 2a 20 c5 b1 20 74 6f 20  00 },  /* .. to 
b380: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 32 2c  u */.  { 0x0172,
b390: 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20    0x55, 0x00 }, 
b3a0: 20 2f 2a 20 c5 b2 20 74 6f 20 55 20 2a 2f 0a 20   /* .. to U */. 
b3b0: 20 7b 20 30 78 30 31 37 33 2c 20 20 30 78 37 35   { 0x0173,  0x75
b3c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b3  , 0x00 },  /* ..
b3d0: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
b3e0: 31 37 34 2c 20 20 30 78 35 37 2c 20 30 78 30 30  174,  0x57, 0x00
b3f0: 20 7d 2c 20 20 2f 2a 20 c5 b4 20 74 6f 20 57 20   },  /* .. to W 
b400: 2a 2f 0a 20 20 7b 20 30 78 30 31 37 35 2c 20 20  */.  { 0x0175,  
b410: 30 78 37 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x77, 0x00 },  /
b420: 2a 20 c5 b5 20 74 6f 20 77 20 2a 2f 0a 20 20 7b  * .. to w */.  {
b430: 20 30 78 30 31 37 36 2c 20 20 30 78 35 39 2c 20   0x0176,  0x59, 
b440: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b6 20 74  0x00 },  /* .. t
b450: 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37  o Y */.  { 0x017
b460: 37 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d  7,  0x79, 0x00 }
b470: 2c 20 20 2f 2a 20 c5 b7 20 74 6f 20 79 20 2a 2f  ,  /* .. to y */
b480: 0a 20 20 7b 20 30 78 30 31 37 38 2c 20 20 30 78  .  { 0x0178,  0x
b490: 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  59, 0x00 },  /* 
b4a0: c5 b8 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30  .. to Y */.  { 0
b4b0: 78 30 31 37 39 2c 20 20 30 78 35 41 2c 20 30 78  x0179,  0x5A, 0x
b4c0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 b9 20 74 6f 20  00 },  /* .. to 
b4d0: 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 41 2c  Z */.  { 0x017A,
b4e0: 20 20 30 78 37 41 2c 20 30 78 30 30 20 7d 2c 20    0x7A, 0x00 }, 
b4f0: 20 2f 2a 20 c5 ba 20 74 6f 20 7a 20 2a 2f 0a 20   /* .. to z */. 
b500: 20 7b 20 30 78 30 31 37 42 2c 20 20 30 78 35 41   { 0x017B,  0x5A
b510: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bb  , 0x00 },  /* ..
b520: 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30   to Z */.  { 0x0
b530: 31 37 43 2c 20 20 30 78 37 41 2c 20 30 78 30 30  17C,  0x7A, 0x00
b540: 20 7d 2c 20 20 2f 2a 20 c5 bc 20 74 6f 20 7a 20   },  /* .. to z 
b550: 2a 2f 0a 20 20 7b 20 30 78 30 31 37 44 2c 20 20  */.  { 0x017D,  
b560: 30 78 35 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x5A, 0x00 },  /
b570: 2a 20 c5 bd 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b  * .. to Z */.  {
b580: 20 30 78 30 31 37 45 2c 20 20 30 78 37 41 2c 20   0x017E,  0x7A, 
b590: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 be 20 74  0x00 },  /* .. t
b5a0: 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37  o z */.  { 0x017
b5b0: 46 2c 20 20 30 78 37 33 2c 20 30 78 30 30 20 7d  F,  0x73, 0x00 }
b5c0: 2c 20 20 2f 2a 20 c5 bf 20 74 6f 20 73 20 2a 2f  ,  /* .. to s */
b5d0: 0a 20 20 7b 20 30 78 30 31 39 32 2c 20 20 30 78  .  { 0x0192,  0x
b5e0: 36 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  66, 0x00 },  /* 
b5f0: c6 92 20 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30  .. to f */.  { 0
b600: 78 30 32 31 38 2c 20 20 30 78 35 33 2c 20 30 78  x0218,  0x53, 0x
b610: 30 30 20 7d 2c 20 20 2f 2a 20 c8 98 20 74 6f 20  00 },  /* .. to 
b620: 53 20 2a 2f 0a 20 20 7b 20 30 78 30 32 31 39 2c  S */.  { 0x0219,
b630: 20 20 30 78 37 33 2c 20 30 78 30 30 20 7d 2c 20    0x73, 0x00 }, 
b640: 20 2f 2a 20 c8 99 20 74 6f 20 73 20 2a 2f 0a 20   /* .. to s */. 
b650: 20 7b 20 30 78 30 32 31 41 2c 20 20 30 78 35 34   { 0x021A,  0x54
b660: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9a  , 0x00 },  /* ..
b670: 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30   to T */.  { 0x0
b680: 32 31 42 2c 20 20 30 78 37 34 2c 20 30 78 30 30  21B,  0x74, 0x00
b690: 20 7d 2c 20 20 2f 2a 20 c8 9b 20 74 6f 20 74 20   },  /* .. to t 
b6a0: 2a 2f 0a 20 20 7b 20 30 78 30 33 38 36 2c 20 20  */.  { 0x0386,  
b6b0: 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x41, 0x00 },  /
b6c0: 2a 20 ce 86 20 74 6f 20 41 20 2a 2f 0a 20 20 7b  * .. to A */.  {
b6d0: 20 30 78 30 33 38 38 2c 20 20 30 78 34 35 2c 20   0x0388,  0x45, 
b6e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 88 20 74  0x00 },  /* .. t
b6f0: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38  o E */.  { 0x038
b700: 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  9,  0x49, 0x00 }
b710: 2c 20 20 2f 2a 20 ce 89 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
b720: 0a 20 20 7b 20 30 78 30 33 38 41 2c 20 20 30 78  .  { 0x038A,  0x
b730: 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  49, 0x00 },  /* 
b740: ce 8a 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
b750: 78 30 33 38 43 2c 20 20 30 78 34 66 2c 20 30 78  x038C,  0x4f, 0x
b760: 30 30 20 7d 2c 20 20 2f 2a 20 ce 8c 20 74 6f 20  00 },  /* .. to 
b770: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 45 2c  O */.  { 0x038E,
b780: 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20    0x59, 0x00 }, 
b790: 20 2f 2a 20 ce 8e 20 74 6f 20 59 20 2a 2f 0a 20   /* .. to Y */. 
b7a0: 20 7b 20 30 78 30 33 38 46 2c 20 20 30 78 34 66   { 0x038F,  0x4f
b7b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 8f  , 0x00 },  /* ..
b7c0: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
b7d0: 33 39 30 2c 20 20 30 78 36 39 2c 20 30 78 30 30  390,  0x69, 0x00
b7e0: 20 7d 2c 20 20 2f 2a 20 ce 90 20 74 6f 20 69 20   },  /* .. to i 
b7f0: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 31 2c 20 20  */.  { 0x0391,  
b800: 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x41, 0x00 },  /
b810: 2a 20 ce 91 20 74 6f 20 41 20 2a 2f 0a 20 20 7b  * .. to A */.  {
b820: 20 30 78 30 33 39 32 2c 20 20 30 78 34 32 2c 20   0x0392,  0x42, 
b830: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 92 20 74  0x00 },  /* .. t
b840: 6f 20 42 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39  o B */.  { 0x039
b850: 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d  3,  0x47, 0x00 }
b860: 2c 20 20 2f 2a 20 ce 93 20 74 6f 20 47 20 2a 2f  ,  /* .. to G */
b870: 0a 20 20 7b 20 30 78 30 33 39 34 2c 20 20 30 78  .  { 0x0394,  0x
b880: 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  44, 0x00 },  /* 
b890: ce 94 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30  .. to D */.  { 0
b8a0: 78 30 33 39 35 2c 20 20 30 78 34 35 2c 20 30 78  x0395,  0x45, 0x
b8b0: 30 30 20 7d 2c 20 20 2f 2a 20 ce 95 20 74 6f 20  00 },  /* .. to 
b8c0: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 36 2c  E */.  { 0x0396,
b8d0: 20 20 30 78 35 61 2c 20 30 78 30 30 20 7d 2c 20    0x5a, 0x00 }, 
b8e0: 20 2f 2a 20 ce 96 20 74 6f 20 5a 20 2a 2f 0a 20   /* .. to Z */. 
b8f0: 20 7b 20 30 78 30 33 39 37 2c 20 20 30 78 34 39   { 0x0397,  0x49
b900: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 97  , 0x00 },  /* ..
b910: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
b920: 33 39 38 2c 20 20 30 78 35 34 2c 20 30 78 36 38  398,  0x54, 0x68
b930: 20 7d 2c 20 20 2f 2a 20 ce 98 20 74 6f 20 54 68   },  /* .. to Th
b940: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 39 2c 20   */.  { 0x0399, 
b950: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
b960: 2f 2a 20 ce 99 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
b970: 7b 20 30 78 30 33 39 41 2c 20 20 30 78 34 62 2c  { 0x039A,  0x4b,
b980: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9a 20   0x00 },  /* .. 
b990: 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to K */.  { 0x03
b9a0: 39 42 2c 20 20 30 78 34 63 2c 20 30 78 30 30 20  9B,  0x4c, 0x00 
b9b0: 7d 2c 20 20 2f 2a 20 ce 9b 20 74 6f 20 4c 20 2a  },  /* .. to L *
b9c0: 2f 0a 20 20 7b 20 30 78 30 33 39 43 2c 20 20 30  /.  { 0x039C,  0
b9d0: 78 34 64 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4d, 0x00 },  /*
b9e0: 20 ce 9c 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b 20   .. to M */.  { 
b9f0: 30 78 30 33 39 44 2c 20 20 30 78 34 65 2c 20 30  0x039D,  0x4e, 0
ba00: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9d 20 74 6f  x00 },  /* .. to
ba10: 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 45   N */.  { 0x039E
ba20: 2c 20 20 30 78 35 38 2c 20 30 78 30 30 20 7d 2c  ,  0x58, 0x00 },
ba30: 20 20 2f 2a 20 ce 9e 20 74 6f 20 58 20 2a 2f 0a    /* .. to X */.
ba40: 20 20 7b 20 30 78 30 33 39 46 2c 20 20 30 78 34    { 0x039F,  0x4
ba50: 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  f, 0x00 },  /* .
ba60: 9f 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
ba70: 30 33 41 30 2c 20 20 30 78 35 30 2c 20 30 78 30  03A0,  0x50, 0x0
ba80: 30 20 7d 2c 20 20 2f 2a 20 ce a0 20 74 6f 20 50  0 },  /* .. to P
ba90: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 31 2c 20   */.  { 0x03A1, 
baa0: 20 30 78 35 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x52, 0x00 },  
bab0: 2f 2a 20 ce a1 20 74 6f 20 52 20 2a 2f 0a 20 20  /* .. to R */.  
bac0: 7b 20 30 78 30 33 41 33 2c 20 20 30 78 35 33 2c  { 0x03A3,  0x53,
bad0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a3 20   0x00 },  /* .. 
bae0: 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to S */.  { 0x03
baf0: 41 34 2c 20 20 30 78 35 34 2c 20 30 78 30 30 20  A4,  0x54, 0x00 
bb00: 7d 2c 20 20 2f 2a 20 ce a4 20 74 6f 20 54 20 2a  },  /* .. to T *
bb10: 2f 0a 20 20 7b 20 30 78 30 33 41 35 2c 20 20 30  /.  { 0x03A5,  0
bb20: 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x59, 0x00 },  /*
bb30: 20 ce a5 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20   .. to Y */.  { 
bb40: 30 78 30 33 41 36 2c 20 20 30 78 34 36 2c 20 30  0x03A6,  0x46, 0
bb50: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a6 20 74 6f  x00 },  /* .. to
bb60: 20 46 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 37   F */.  { 0x03A7
bb70: 2c 20 20 30 78 34 33 2c 20 30 78 36 38 20 7d 2c  ,  0x43, 0x68 },
bb80: 20 20 2f 2a 20 ce a7 20 74 6f 20 43 68 20 2a 2f    /* .. to Ch */
bb90: 0a 20 20 7b 20 30 78 30 33 41 38 2c 20 20 30 78  .  { 0x03A8,  0x
bba0: 35 30 2c 20 30 78 37 33 20 7d 2c 20 20 2f 2a 20  50, 0x73 },  /* 
bbb0: ce a8 20 74 6f 20 50 73 20 2a 2f 0a 20 20 7b 20  .. to Ps */.  { 
bbc0: 30 78 30 33 41 39 2c 20 20 30 78 34 66 2c 20 30  0x03A9,  0x4f, 0
bbd0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a9 20 74 6f  x00 },  /* .. to
bbe0: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 41   O */.  { 0x03AA
bbf0: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
bc00: 20 20 2f 2a 20 ce aa 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
bc10: 20 20 7b 20 30 78 30 33 41 42 2c 20 20 30 78 35    { 0x03AB,  0x5
bc20: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  9, 0x00 },  /* .
bc30: ab 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78  . to Y */.  { 0x
bc40: 30 33 41 43 2c 20 20 30 78 36 31 2c 20 30 78 30  03AC,  0x61, 0x0
bc50: 30 20 7d 2c 20 20 2f 2a 20 ce ac 20 74 6f 20 61  0 },  /* .. to a
bc60: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 44 2c 20   */.  { 0x03AD, 
bc70: 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x65, 0x00 },  
bc80: 2f 2a 20 ce ad 20 74 6f 20 65 20 2a 2f 0a 20 20  /* .. to e */.  
bc90: 7b 20 30 78 30 33 41 45 2c 20 20 30 78 36 39 2c  { 0x03AE,  0x69,
bca0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ae 20   0x00 },  /* .. 
bcb0: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to i */.  { 0x03
bcc0: 41 46 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  AF,  0x69, 0x00 
bcd0: 7d 2c 20 20 2f 2a 20 ce af 20 74 6f 20 69 20 2a  },  /* .. to i *
bce0: 2f 0a 20 20 7b 20 30 78 30 33 42 31 2c 20 20 30  /.  { 0x03B1,  0
bcf0: 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x61, 0x00 },  /*
bd00: 20 ce b1 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20   .. to a */.  { 
bd10: 30 78 30 33 42 32 2c 20 20 30 78 36 32 2c 20 30  0x03B2,  0x62, 0
bd20: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b2 20 74 6f  x00 },  /* .. to
bd30: 20 62 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 33   b */.  { 0x03B3
bd40: 2c 20 20 30 78 36 37 2c 20 30 78 30 30 20 7d 2c  ,  0x67, 0x00 },
bd50: 20 20 2f 2a 20 ce b3 20 74 6f 20 67 20 2a 2f 0a    /* .. to g */.
bd60: 20 20 7b 20 30 78 30 33 42 34 2c 20 20 30 78 36    { 0x03B4,  0x6
bd70: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  4, 0x00 },  /* .
bd80: b4 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78  . to d */.  { 0x
bd90: 30 33 42 35 2c 20 20 30 78 36 35 2c 20 30 78 30  03B5,  0x65, 0x0
bda0: 30 20 7d 2c 20 20 2f 2a 20 ce b5 20 74 6f 20 65  0 },  /* .. to e
bdb0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 36 2c 20   */.  { 0x03B6, 
bdc0: 20 30 78 37 61 2c 20 30 78 30 30 20 7d 2c 20 20   0x7a, 0x00 },  
bdd0: 2f 2a 20 ce b6 20 74 6f 20 7a 20 2a 2f 0a 20 20  /* .. to z */.  
bde0: 7b 20 30 78 30 33 42 37 2c 20 20 30 78 36 39 2c  { 0x03B7,  0x69,
bdf0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b7 20   0x00 },  /* .. 
be00: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to i */.  { 0x03
be10: 42 38 2c 20 20 30 78 37 34 2c 20 30 78 36 38 20  B8,  0x74, 0x68 
be20: 7d 2c 20 20 2f 2a 20 ce b8 20 74 6f 20 74 68 20  },  /* .. to th 
be30: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 39 2c 20 20  */.  { 0x03B9,  
be40: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
be50: 2a 20 ce b9 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
be60: 20 30 78 30 33 42 41 2c 20 20 30 78 36 62 2c 20   0x03BA,  0x6b, 
be70: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ba 20 74  0x00 },  /* .. t
be80: 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o k */.  { 0x03B
be90: 42 2c 20 20 30 78 36 63 2c 20 30 78 30 30 20 7d  B,  0x6c, 0x00 }
bea0: 2c 20 20 2f 2a 20 ce bb 20 74 6f 20 6c 20 2a 2f  ,  /* .. to l */
beb0: 0a 20 20 7b 20 30 78 30 33 42 43 2c 20 20 30 78  .  { 0x03BC,  0x
bec0: 36 64 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6d, 0x00 },  /* 
bed0: ce bc 20 74 6f 20 6d 20 2a 2f 0a 20 20 7b 20 30  .. to m */.  { 0
bee0: 78 30 33 42 44 2c 20 20 30 78 36 65 2c 20 30 78  x03BD,  0x6e, 0x
bef0: 30 30 20 7d 2c 20 20 2f 2a 20 ce bd 20 74 6f 20  00 },  /* .. to 
bf00: 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 45 2c  n */.  { 0x03BE,
bf10: 20 20 30 78 37 38 2c 20 30 78 30 30 20 7d 2c 20    0x78, 0x00 }, 
bf20: 20 2f 2a 20 ce be 20 74 6f 20 78 20 2a 2f 0a 20   /* .. to x */. 
bf30: 20 7b 20 30 78 30 33 42 46 2c 20 20 30 78 36 66   { 0x03BF,  0x6f
bf40: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bf  , 0x00 },  /* ..
bf50: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
bf60: 33 43 30 2c 20 20 30 78 37 30 2c 20 30 78 30 30  3C0,  0x70, 0x00
bf70: 20 7d 2c 20 20 2f 2a 20 cf 80 20 74 6f 20 70 20   },  /* .. to p 
bf80: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 31 2c 20 20  */.  { 0x03C1,  
bf90: 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x72, 0x00 },  /
bfa0: 2a 20 cf 81 20 74 6f 20 72 20 2a 2f 0a 20 20 7b  * .. to r */.  {
bfb0: 20 30 78 30 33 43 33 2c 20 20 30 78 37 33 2c 20   0x03C3,  0x73, 
bfc0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 83 20 74  0x00 },  /* .. t
bfd0: 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43  o s */.  { 0x03C
bfe0: 34 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d  4,  0x74, 0x00 }
bff0: 2c 20 20 2f 2a 20 cf 84 20 74 6f 20 74 20 2a 2f  ,  /* .. to t */
c000: 0a 20 20 7b 20 30 78 30 33 43 35 2c 20 20 30 78  .  { 0x03C5,  0x
c010: 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  79, 0x00 },  /* 
c020: cf 85 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30  .. to y */.  { 0
c030: 78 30 33 43 36 2c 20 20 30 78 36 36 2c 20 30 78  x03C6,  0x66, 0x
c040: 30 30 20 7d 2c 20 20 2f 2a 20 cf 86 20 74 6f 20  00 },  /* .. to 
c050: 66 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 37 2c  f */.  { 0x03C7,
c060: 20 20 30 78 36 33 2c 20 30 78 36 38 20 7d 2c 20    0x63, 0x68 }, 
c070: 20 2f 2a 20 cf 87 20 74 6f 20 63 68 20 2a 2f 0a   /* .. to ch */.
c080: 20 20 7b 20 30 78 30 33 43 38 2c 20 20 30 78 37    { 0x03C8,  0x7
c090: 30 2c 20 30 78 37 33 20 7d 2c 20 20 2f 2a 20 cf  0, 0x73 },  /* .
c0a0: 88 20 74 6f 20 70 73 20 2a 2f 0a 20 20 7b 20 30  . to ps */.  { 0
c0b0: 78 30 33 43 39 2c 20 20 30 78 36 66 2c 20 30 78  x03C9,  0x6f, 0x
c0c0: 30 30 20 7d 2c 20 20 2f 2a 20 cf 89 20 74 6f 20  00 },  /* .. to 
c0d0: 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 41 2c  o */.  { 0x03CA,
c0e0: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
c0f0: 20 2f 2a 20 cf 8a 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
c100: 20 7b 20 30 78 30 33 43 42 2c 20 20 30 78 37 39   { 0x03CB,  0x79
c110: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8b  , 0x00 },  /* ..
c120: 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30   to y */.  { 0x0
c130: 33 43 43 2c 20 20 30 78 36 66 2c 20 30 78 30 30  3CC,  0x6f, 0x00
c140: 20 7d 2c 20 20 2f 2a 20 cf 8c 20 74 6f 20 6f 20   },  /* .. to o 
c150: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 44 2c 20 20  */.  { 0x03CD,  
c160: 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x79, 0x00 },  /
c170: 2a 20 cf 8d 20 74 6f 20 79 20 2a 2f 0a 20 20 7b  * .. to y */.  {
c180: 20 30 78 30 33 43 45 2c 20 20 30 78 36 39 2c 20   0x03CE,  0x69, 
c190: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8e 20 74  0x00 },  /* .. t
c1a0: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30  o i */.  { 0x040
c1b0: 30 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  0,  0x45, 0x00 }
c1c0: 2c 20 20 2f 2a 20 d0 80 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
c1d0: 0a 20 20 7b 20 30 78 30 34 30 31 2c 20 20 30 78  .  { 0x0401,  0x
c1e0: 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  45, 0x00 },  /* 
c1f0: d0 81 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
c200: 78 30 34 30 32 2c 20 20 30 78 34 34 2c 20 30 78  x0402,  0x44, 0x
c210: 30 30 20 7d 2c 20 20 2f 2a 20 d0 82 20 74 6f 20  00 },  /* .. to 
c220: 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 33 2c  D */.  { 0x0403,
c230: 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c 20    0x47, 0x00 }, 
c240: 20 2f 2a 20 d0 83 20 74 6f 20 47 20 2a 2f 0a 20   /* .. to G */. 
c250: 20 7b 20 30 78 30 34 30 34 2c 20 20 30 78 34 35   { 0x0404,  0x45
c260: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 84  , 0x00 },  /* ..
c270: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
c280: 34 30 35 2c 20 20 30 78 35 61 2c 20 30 78 30 30  405,  0x5a, 0x00
c290: 20 7d 2c 20 20 2f 2a 20 d0 85 20 74 6f 20 5a 20   },  /* .. to Z 
c2a0: 2a 2f 0a 20 20 7b 20 30 78 30 34 30 36 2c 20 20  */.  { 0x0406,  
c2b0: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
c2c0: 2a 20 d0 86 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
c2d0: 20 30 78 30 34 30 37 2c 20 20 30 78 34 39 2c 20   0x0407,  0x49, 
c2e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 87 20 74  0x00 },  /* .. t
c2f0: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30  o I */.  { 0x040
c300: 38 2c 20 20 30 78 34 61 2c 20 30 78 30 30 20 7d  8,  0x4a, 0x00 }
c310: 2c 20 20 2f 2a 20 d0 88 20 74 6f 20 4a 20 2a 2f  ,  /* .. to J */
c320: 0a 20 20 7b 20 30 78 30 34 30 39 2c 20 20 30 78  .  { 0x0409,  0x
c330: 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  49, 0x00 },  /* 
c340: d0 89 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
c350: 78 30 34 30 41 2c 20 20 30 78 34 65 2c 20 30 78  x040A,  0x4e, 0x
c360: 30 30 20 7d 2c 20 20 2f 2a 20 d0 8a 20 74 6f 20  00 },  /* .. to 
c370: 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 42 2c  N */.  { 0x040B,
c380: 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20    0x44, 0x00 }, 
c390: 20 2f 2a 20 d0 8b 20 74 6f 20 44 20 2a 2f 0a 20   /* .. to D */. 
c3a0: 20 7b 20 30 78 30 34 30 43 2c 20 20 30 78 34 62   { 0x040C,  0x4b
c3b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8c  , 0x00 },  /* ..
c3c0: 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30   to K */.  { 0x0
c3d0: 34 30 44 2c 20 20 30 78 34 39 2c 20 30 78 30 30  40D,  0x49, 0x00
c3e0: 20 7d 2c 20 20 2f 2a 20 d0 8d 20 74 6f 20 49 20   },  /* .. to I 
c3f0: 2a 2f 0a 20 20 7b 20 30 78 30 34 30 45 2c 20 20  */.  { 0x040E,  
c400: 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x55, 0x00 },  /
c410: 2a 20 d0 8e 20 74 6f 20 55 20 2a 2f 0a 20 20 7b  * .. to U */.  {
c420: 20 30 78 30 34 30 46 2c 20 20 30 78 34 34 2c 20   0x040F,  0x44, 
c430: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8f 20 74  0x00 },  /* .. t
c440: 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o D */.  { 0x041
c450: 30 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d  0,  0x41, 0x00 }
c460: 2c 20 20 2f 2a 20 d0 90 20 74 6f 20 41 20 2a 2f  ,  /* .. to A */
c470: 0a 20 20 7b 20 30 78 30 34 31 31 2c 20 20 30 78  .  { 0x0411,  0x
c480: 34 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  42, 0x00 },  /* 
c490: d0 91 20 74 6f 20 42 20 2a 2f 0a 20 20 7b 20 30  .. to B */.  { 0
c4a0: 78 30 34 31 32 2c 20 20 30 78 35 36 2c 20 30 78  x0412,  0x56, 0x
c4b0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 92 20 74 6f 20  00 },  /* .. to 
c4c0: 56 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 33 2c  V */.  { 0x0413,
c4d0: 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c 20    0x47, 0x00 }, 
c4e0: 20 2f 2a 20 d0 93 20 74 6f 20 47 20 2a 2f 0a 20   /* .. to G */. 
c4f0: 20 7b 20 30 78 30 34 31 34 2c 20 20 30 78 34 34   { 0x0414,  0x44
c500: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 94  , 0x00 },  /* ..
c510: 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30   to D */.  { 0x0
c520: 34 31 35 2c 20 20 30 78 34 35 2c 20 30 78 30 30  415,  0x45, 0x00
c530: 20 7d 2c 20 20 2f 2a 20 d0 95 20 74 6f 20 45 20   },  /* .. to E 
c540: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 36 2c 20 20  */.  { 0x0416,  
c550: 30 78 35 61 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x5a, 0x68 },  /
c560: 2a 20 d0 96 20 74 6f 20 5a 68 20 2a 2f 0a 20 20  * .. to Zh */.  
c570: 7b 20 30 78 30 34 31 37 2c 20 20 30 78 35 61 2c  { 0x0417,  0x5a,
c580: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 97 20   0x00 },  /* .. 
c590: 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to Z */.  { 0x04
c5a0: 31 38 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  18,  0x49, 0x00 
c5b0: 7d 2c 20 20 2f 2a 20 d0 98 20 74 6f 20 49 20 2a  },  /* .. to I *
c5c0: 2f 0a 20 20 7b 20 30 78 30 34 31 39 2c 20 20 30  /.  { 0x0419,  0
c5d0: 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x49, 0x00 },  /*
c5e0: 20 d0 99 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20   .. to I */.  { 
c5f0: 30 78 30 34 31 41 2c 20 20 30 78 34 62 2c 20 30  0x041A,  0x4b, 0
c600: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9a 20 74 6f  x00 },  /* .. to
c610: 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 42   K */.  { 0x041B
c620: 2c 20 20 30 78 34 63 2c 20 30 78 30 30 20 7d 2c  ,  0x4c, 0x00 },
c630: 20 20 2f 2a 20 d0 9b 20 74 6f 20 4c 20 2a 2f 0a    /* .. to L */.
c640: 20 20 7b 20 30 78 30 34 31 43 2c 20 20 30 78 34    { 0x041C,  0x4
c650: 64 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  d, 0x00 },  /* .
c660: 9c 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b 20 30 78  . to M */.  { 0x
c670: 30 34 31 44 2c 20 20 30 78 34 65 2c 20 30 78 30  041D,  0x4e, 0x0
c680: 30 20 7d 2c 20 20 2f 2a 20 d0 9d 20 74 6f 20 4e  0 },  /* .. to N
c690: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 45 2c 20   */.  { 0x041E, 
c6a0: 20 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20   0x4f, 0x00 },  
c6b0: 2f 2a 20 d0 9e 20 74 6f 20 4f 20 2a 2f 0a 20 20  /* .. to O */.  
c6c0: 7b 20 30 78 30 34 31 46 2c 20 20 30 78 35 30 2c  { 0x041F,  0x50,
c6d0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9f 20   0x00 },  /* .. 
c6e0: 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to P */.  { 0x04
c6f0: 32 30 2c 20 20 30 78 35 32 2c 20 30 78 30 30 20  20,  0x52, 0x00 
c700: 7d 2c 20 20 2f 2a 20 d0 a0 20 74 6f 20 52 20 2a  },  /* .. to R *
c710: 2f 0a 20 20 7b 20 30 78 30 34 32 31 2c 20 20 30  /.  { 0x0421,  0
c720: 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x53, 0x00 },  /*
c730: 20 d0 a1 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20   .. to S */.  { 
c740: 30 78 30 34 32 32 2c 20 20 30 78 35 34 2c 20 30  0x0422,  0x54, 0
c750: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a2 20 74 6f  x00 },  /* .. to
c760: 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 33   T */.  { 0x0423
c770: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
c780: 20 20 2f 2a 20 d0 a3 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
c790: 20 20 7b 20 30 78 30 34 32 34 2c 20 20 30 78 34    { 0x0424,  0x4
c7a0: 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  6, 0x00 },  /* .
c7b0: a4 20 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78  . to F */.  { 0x
c7c0: 30 34 32 35 2c 20 20 30 78 34 62 2c 20 30 78 36  0425,  0x4b, 0x6
c7d0: 38 20 7d 2c 20 20 2f 2a 20 d0 a5 20 74 6f 20 4b  8 },  /* .. to K
c7e0: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 36 2c  h */.  { 0x0426,
c7f0: 20 20 30 78 35 34 2c 20 30 78 36 33 20 7d 2c 20    0x54, 0x63 }, 
c800: 20 2f 2a 20 d0 a6 20 74 6f 20 54 63 20 2a 2f 0a   /* .. to Tc */.
c810: 20 20 7b 20 30 78 30 34 32 37 2c 20 20 30 78 34    { 0x0427,  0x4
c820: 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0  3, 0x68 },  /* .
c830: a7 20 74 6f 20 43 68 20 2a 2f 0a 20 20 7b 20 30  . to Ch */.  { 0
c840: 78 30 34 32 38 2c 20 20 30 78 35 33 2c 20 30 78  x0428,  0x53, 0x
c850: 36 38 20 7d 2c 20 20 2f 2a 20 d0 a8 20 74 6f 20  68 },  /* .. to 
c860: 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 39  Sh */.  { 0x0429
c870: 2c 20 20 30 78 35 33 2c 20 30 78 36 38 20 7d 2c  ,  0x53, 0x68 },
c880: 20 20 2f 2a 20 d0 a9 20 74 6f 20 53 68 63 68 20    /* .. to Shch 
c890: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 41 2c 20 20  */.  { 0x042A,  
c8a0: 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x61, 0x00 },  /
c8b0: 2a 20 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30  *  to A */.  { 0
c8c0: 78 30 34 32 42 2c 20 20 30 78 35 39 2c 20 30 78  x042B,  0x59, 0x
c8d0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 ab 20 74 6f 20  00 },  /* .. to 
c8e0: 59 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 43 2c  Y */.  { 0x042C,
c8f0: 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20    0x59, 0x00 }, 
c900: 20 2f 2a 20 20 74 6f 20 59 20 2a 2f 0a 20 20 7b   /*  to Y */.  {
c910: 20 30 78 30 34 32 44 2c 20 20 30 78 34 35 2c 20   0x042D,  0x45, 
c920: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ad 20 74  0x00 },  /* .. t
c930: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32  o E */.  { 0x042
c940: 45 2c 20 20 30 78 34 39 2c 20 30 78 37 35 20 7d  E,  0x49, 0x75 }
c950: 2c 20 20 2f 2a 20 d0 ae 20 74 6f 20 49 75 20 2a  ,  /* .. to Iu *
c960: 2f 0a 20 20 7b 20 30 78 30 34 32 46 2c 20 20 30  /.  { 0x042F,  0
c970: 78 34 39 2c 20 30 78 36 31 20 7d 2c 20 20 2f 2a  x49, 0x61 },  /*
c980: 20 d0 af 20 74 6f 20 49 61 20 2a 2f 0a 20 20 7b   .. to Ia */.  {
c990: 20 30 78 30 34 33 30 2c 20 20 30 78 36 31 2c 20   0x0430,  0x61, 
c9a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b0 20 74  0x00 },  /* .. t
c9b0: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33  o a */.  { 0x043
c9c0: 31 2c 20 20 30 78 36 32 2c 20 30 78 30 30 20 7d  1,  0x62, 0x00 }
c9d0: 2c 20 20 2f 2a 20 d0 b1 20 74 6f 20 62 20 2a 2f  ,  /* .. to b */
c9e0: 0a 20 20 7b 20 30 78 30 34 33 32 2c 20 20 30 78  .  { 0x0432,  0x
c9f0: 37 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  76, 0x00 },  /* 
ca00: d0 b2 20 74 6f 20 76 20 2a 2f 0a 20 20 7b 20 30  .. to v */.  { 0
ca10: 78 30 34 33 33 2c 20 20 30 78 36 37 2c 20 30 78  x0433,  0x67, 0x
ca20: 30 30 20 7d 2c 20 20 2f 2a 20 d0 b3 20 74 6f 20  00 },  /* .. to 
ca30: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 34 2c  g */.  { 0x0434,
ca40: 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20    0x64, 0x00 }, 
ca50: 20 2f 2a 20 d0 b4 20 74 6f 20 64 20 2a 2f 0a 20   /* .. to d */. 
ca60: 20 7b 20 30 78 30 34 33 35 2c 20 20 30 78 36 35   { 0x0435,  0x65
ca70: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b5  , 0x00 },  /* ..
ca80: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
ca90: 34 33 36 2c 20 20 30 78 37 61 2c 20 30 78 36 38  436,  0x7a, 0x68
caa0: 20 7d 2c 20 20 2f 2a 20 d0 b6 20 74 6f 20 7a 68   },  /* .. to zh
cab0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 37 2c 20   */.  { 0x0437, 
cac0: 20 30 78 37 61 2c 20 30 78 30 30 20 7d 2c 20 20   0x7a, 0x00 },  
cad0: 2f 2a 20 d0 b7 20 74 6f 20 7a 20 2a 2f 0a 20 20  /* .. to z */.  
cae0: 7b 20 30 78 30 34 33 38 2c 20 20 30 78 36 39 2c  { 0x0438,  0x69,
caf0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b8 20   0x00 },  /* .. 
cb00: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to i */.  { 0x04
cb10: 33 39 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  39,  0x69, 0x00 
cb20: 7d 2c 20 20 2f 2a 20 d0 b9 20 74 6f 20 69 20 2a  },  /* .. to i *
cb30: 2f 0a 20 20 7b 20 30 78 30 34 33 41 2c 20 20 30  /.  { 0x043A,  0
cb40: 78 36 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6b, 0x00 },  /*
cb50: 20 d0 ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20   .. to k */.  { 
cb60: 30 78 30 34 33 42 2c 20 20 30 78 36 63 2c 20 30  0x043B,  0x6c, 0
cb70: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bb 20 74 6f  x00 },  /* .. to
cb80: 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 43   l */.  { 0x043C
cb90: 2c 20 20 30 78 36 64 2c 20 30 78 30 30 20 7d 2c  ,  0x6d, 0x00 },
cba0: 20 20 2f 2a 20 d0 bc 20 74 6f 20 6d 20 2a 2f 0a    /* .. to m */.
cbb0: 20 20 7b 20 30 78 30 34 33 44 2c 20 20 30 78 36    { 0x043D,  0x6
cbc0: 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  e, 0x00 },  /* .
cbd0: bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78  . to n */.  { 0x
cbe0: 30 34 33 45 2c 20 20 30 78 36 66 2c 20 30 78 30  043E,  0x6f, 0x0
cbf0: 30 20 7d 2c 20 20 2f 2a 20 d0 be 20 74 6f 20 6f  0 },  /* .. to o
cc00: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 46 2c 20   */.  { 0x043F, 
cc10: 20 30 78 37 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x70, 0x00 },  
cc20: 2f 2a 20 d0 bf 20 74 6f 20 70 20 2a 2f 0a 20 20  /* .. to p */.  
cc30: 7b 20 30 78 30 34 34 30 2c 20 20 30 78 37 32 2c  { 0x0440,  0x72,
cc40: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 80 20   0x00 },  /* .. 
cc50: 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to r */.  { 0x04
cc60: 34 31 2c 20 20 30 78 37 33 2c 20 30 78 30 30 20  41,  0x73, 0x00 
cc70: 7d 2c 20 20 2f 2a 20 d1 81 20 74 6f 20 73 20 2a  },  /* .. to s *
cc80: 2f 0a 20 20 7b 20 30 78 30 34 34 32 2c 20 20 30  /.  { 0x0442,  0
cc90: 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x74, 0x00 },  /*
cca0: 20 d1 82 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20   .. to t */.  { 
ccb0: 30 78 30 34 34 33 2c 20 20 30 78 37 35 2c 20 30  0x0443,  0x75, 0
ccc0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 83 20 74 6f  x00 },  /* .. to
ccd0: 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 34   u */.  { 0x0444
cce0: 2c 20 20 30 78 36 36 2c 20 30 78 30 30 20 7d 2c  ,  0x66, 0x00 },
ccf0: 20 20 2f 2a 20 d1 84 20 74 6f 20 66 20 2a 2f 0a    /* .. to f */.
cd00: 20 20 7b 20 30 78 30 34 34 35 2c 20 20 30 78 36    { 0x0445,  0x6
cd10: 62 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d1  b, 0x68 },  /* .
cd20: 85 20 74 6f 20 6b 68 20 2a 2f 0a 20 20 7b 20 30  . to kh */.  { 0
cd30: 78 30 34 34 36 2c 20 20 30 78 37 34 2c 20 30 78  x0446,  0x74, 0x
cd40: 36 33 20 7d 2c 20 20 2f 2a 20 d1 86 20 74 6f 20  63 },  /* .. to 
cd50: 74 63 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 37  tc */.  { 0x0447
cd60: 2c 20 20 30 78 36 33 2c 20 30 78 36 38 20 7d 2c  ,  0x63, 0x68 },
cd70: 20 20 2f 2a 20 d1 87 20 74 6f 20 63 68 20 2a 2f    /* .. to ch */
cd80: 0a 20 20 7b 20 30 78 30 34 34 38 2c 20 20 30 78  .  { 0x0448,  0x
cd90: 37 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  73, 0x68 },  /* 
cda0: d1 88 20 74 6f 20 73 68 20 2a 2f 0a 20 20 7b 20  .. to sh */.  { 
cdb0: 30 78 30 34 34 39 2c 20 20 30 78 37 33 2c 20 30  0x0449,  0x73, 0
cdc0: 78 36 38 20 7d 2c 20 20 2f 2a 20 d1 89 20 74 6f  x68 },  /* .. to
cdd0: 20 73 68 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30   shch */.  { 0x0
cde0: 34 34 41 2c 20 20 30 78 36 31 2c 20 30 78 30 30  44A,  0x61, 0x00
cdf0: 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 61 20 2a 2f   },  /*  to a */
ce00: 0a 20 20 7b 20 30 78 30 34 34 42 2c 20 20 30 78  .  { 0x044B,  0x
ce10: 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  79, 0x00 },  /* 
ce20: d1 8b 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30  .. to y */.  { 0
ce30: 78 30 34 34 43 2c 20 20 30 78 37 39 2c 20 30 78  x044C,  0x79, 0x
ce40: 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 79 20  00 },  /*  to y 
ce50: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 44 2c 20 20  */.  { 0x044D,  
ce60: 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x65, 0x00 },  /
ce70: 2a 20 d1 8d 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
ce80: 20 30 78 30 34 34 45 2c 20 20 30 78 36 39 2c 20   0x044E,  0x69, 
ce90: 30 78 37 35 20 7d 2c 20 20 2f 2a 20 d1 8e 20 74  0x75 },  /* .. t
cea0: 6f 20 69 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34  o iu */.  { 0x04
ceb0: 34 46 2c 20 20 30 78 36 39 2c 20 30 78 36 31 20  4F,  0x69, 0x61 
cec0: 7d 2c 20 20 2f 2a 20 d1 8f 20 74 6f 20 69 61 20  },  /* .. to ia 
ced0: 2a 2f 0a 20 20 7b 20 30 78 30 34 35 30 2c 20 20  */.  { 0x0450,  
cee0: 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x65, 0x00 },  /
cef0: 2a 20 d1 90 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
cf00: 20 30 78 30 34 35 31 2c 20 20 30 78 36 35 2c 20   0x0451,  0x65, 
cf10: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 91 20 74  0x00 },  /* .. t
cf20: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35  o e */.  { 0x045
cf30: 32 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d  2,  0x64, 0x00 }
cf40: 2c 20 20 2f 2a 20 d1 92 20 74 6f 20 64 20 2a 2f  ,  /* .. to d */
cf50: 0a 20 20 7b 20 30 78 30 34 35 33 2c 20 20 30 78  .  { 0x0453,  0x
cf60: 36 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  67, 0x00 },  /* 
cf70: d1 93 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30  .. to g */.  { 0
cf80: 78 30 34 35 34 2c 20 20 30 78 36 35 2c 20 30 78  x0454,  0x65, 0x
cf90: 30 30 20 7d 2c 20 20 2f 2a 20 d1 94 20 74 6f 20  00 },  /* .. to 
cfa0: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 35 2c  e */.  { 0x0455,
cfb0: 20 20 30 78 37 61 2c 20 30 78 30 30 20 7d 2c 20    0x7a, 0x00 }, 
cfc0: 20 2f 2a 20 d1 95 20 74 6f 20 7a 20 2a 2f 0a 20   /* .. to z */. 
cfd0: 20 7b 20 30 78 30 34 35 36 2c 20 20 30 78 36 39   { 0x0456,  0x69
cfe0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 96  , 0x00 },  /* ..
cff0: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
d000: 34 35 37 2c 20 20 30 78 36 39 2c 20 30 78 30 30  457,  0x69, 0x00
d010: 20 7d 2c 20 20 2f 2a 20 d1 97 20 74 6f 20 69 20   },  /* .. to i 
d020: 2a 2f 0a 20 20 7b 20 30 78 30 34 35 38 2c 20 20  */.  { 0x0458,  
d030: 30 78 36 61 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6a, 0x00 },  /
d040: 2a 20 d1 98 20 74 6f 20 6a 20 2a 2f 0a 20 20 7b  * .. to j */.  {
d050: 20 30 78 30 34 35 39 2c 20 20 30 78 36 39 2c 20   0x0459,  0x69, 
d060: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 99 20 74  0x00 },  /* .. t
d070: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35  o i */.  { 0x045
d080: 41 2c 20 20 30 78 36 65 2c 20 30 78 30 30 20 7d  A,  0x6e, 0x00 }
d090: 2c 20 20 2f 2a 20 d1 9a 20 74 6f 20 6e 20 2a 2f  ,  /* .. to n */
d0a0: 0a 20 20 7b 20 30 78 30 34 35 42 2c 20 20 30 78  .  { 0x045B,  0x
d0b0: 36 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  64, 0x00 },  /* 
d0c0: d1 9b 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30  .. to d */.  { 0
d0d0: 78 30 34 35 43 2c 20 20 30 78 36 62 2c 20 30 78  x045C,  0x6b, 0x
d0e0: 30 30 20 7d 2c 20 20 2f 2a 20 d1 9c 20 74 6f 20  00 },  /* .. to 
d0f0: 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 44 2c  k */.  { 0x045D,
d100: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
d110: 20 2f 2a 20 d1 9d 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
d120: 20 7b 20 30 78 30 34 35 45 2c 20 20 30 78 37 35   { 0x045E,  0x75
d130: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9e  , 0x00 },  /* ..
d140: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
d150: 34 35 46 2c 20 20 30 78 36 34 2c 20 30 78 30 30  45F,  0x64, 0x00
d160: 20 7d 2c 20 20 2f 2a 20 d1 9f 20 74 6f 20 64 20   },  /* .. to d 
d170: 2a 2f 0a 20 20 7b 20 30 78 31 45 30 32 2c 20 20  */.  { 0x1E02,  
d180: 30 78 34 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x42, 0x00 },  /
d190: 2a 20 e1 b8 82 20 74 6f 20 42 20 2a 2f 0a 20 20  * ... to B */.  
d1a0: 7b 20 30 78 31 45 30 33 2c 20 20 30 78 36 32 2c  { 0x1E03,  0x62,
d1b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 83   0x00 },  /* ...
d1c0: 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78 31   to b */.  { 0x1
d1d0: 45 30 41 2c 20 20 30 78 34 34 2c 20 30 78 30 30  E0A,  0x44, 0x00
d1e0: 20 7d 2c 20 20 2f 2a 20 e1 b8 8a 20 74 6f 20 44   },  /* ... to D
d1f0: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30 42 2c 20   */.  { 0x1E0B, 
d200: 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x64, 0x00 },  
d210: 2f 2a 20 e1 b8 8b 20 74 6f 20 64 20 2a 2f 0a 20  /* ... to d */. 
d220: 20 7b 20 30 78 31 45 31 45 2c 20 20 30 78 34 36   { 0x1E1E,  0x46
d230: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8  , 0x00 },  /* ..
d240: 9e 20 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78  . to F */.  { 0x
d250: 31 45 31 46 2c 20 20 30 78 36 36 2c 20 30 78 30  1E1F,  0x66, 0x0
d260: 30 20 7d 2c 20 20 2f 2a 20 e1 b8 9f 20 74 6f 20  0 },  /* ... to 
d270: 66 20 2a 2f 0a 20 20 7b 20 30 78 31 45 34 30 2c  f */.  { 0x1E40,
d280: 20 20 30 78 34 44 2c 20 30 78 30 30 20 7d 2c 20    0x4D, 0x00 }, 
d290: 20 2f 2a 20 e1 b9 80 20 74 6f 20 4d 20 2a 2f 0a   /* ... to M */.
d2a0: 20 20 7b 20 30 78 31 45 34 31 2c 20 20 30 78 36    { 0x1E41,  0x6
d2b0: 44 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  D, 0x00 },  /* .
d2c0: b9 81 20 74 6f 20 6d 20 2a 2f 0a 20 20 7b 20 30  .. to m */.  { 0
d2d0: 78 31 45 35 36 2c 20 20 30 78 35 30 2c 20 30 78  x1E56,  0x50, 0x
d2e0: 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 96 20 74 6f  00 },  /* ... to
d2f0: 20 50 20 2a 2f 0a 20 20 7b 20 30 78 31 45 35 37   P */.  { 0x1E57
d300: 2c 20 20 30 78 37 30 2c 20 30 78 30 30 20 7d 2c  ,  0x70, 0x00 },
d310: 20 20 2f 2a 20 e1 b9 97 20 74 6f 20 70 20 2a 2f    /* ... to p */
d320: 0a 20 20 7b 20 30 78 31 45 36 30 2c 20 20 30 78  .  { 0x1E60,  0x
d330: 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  53, 0x00 },  /* 
d340: e1 b9 a0 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20  ... to S */.  { 
d350: 30 78 31 45 36 31 2c 20 20 30 78 37 33 2c 20 30  0x1E61,  0x73, 0
d360: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 a1 20 74  x00 },  /* ... t
d370: 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36  o s */.  { 0x1E6
d380: 41 2c 20 20 30 78 35 34 2c 20 30 78 30 30 20 7d  A,  0x54, 0x00 }
d390: 2c 20 20 2f 2a 20 e1 b9 aa 20 74 6f 20 54 20 2a  ,  /* ... to T *
d3a0: 2f 0a 20 20 7b 20 30 78 31 45 36 42 2c 20 20 30  /.  { 0x1E6B,  0
d3b0: 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x74, 0x00 },  /*
d3c0: 20 e1 b9 ab 20 74 6f 20 74 20 2a 2f 0a 20 20 7b   ... to t */.  {
d3d0: 20 30 78 31 45 38 30 2c 20 20 30 78 35 37 2c 20   0x1E80,  0x57, 
d3e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 80 20  0x00 },  /* ... 
d3f0: 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to W */.  { 0x1E
d400: 38 31 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20  81,  0x77, 0x00 
d410: 7d 2c 20 20 2f 2a 20 e1 ba 81 20 74 6f 20 77 20  },  /* ... to w 
d420: 2a 2f 0a 20 20 7b 20 30 78 31 45 38 32 2c 20 20  */.  { 0x1E82,  
d430: 30 78 35 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x57, 0x00 },  /
d440: 2a 20 e1 ba 82 20 74 6f 20 57 20 2a 2f 0a 20 20  * ... to W */.  
d450: 7b 20 30 78 31 45 38 33 2c 20 20 30 78 37 37 2c  { 0x1E83,  0x77,
d460: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 83   0x00 },  /* ...
d470: 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31   to w */.  { 0x1
d480: 45 38 34 2c 20 20 30 78 35 37 2c 20 30 78 30 30  E84,  0x57, 0x00
d490: 20 7d 2c 20 20 2f 2a 20 e1 ba 84 20 74 6f 20 57   },  /* ... to W
d4a0: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 35 2c 20   */.  { 0x1E85, 
d4b0: 20 30 78 37 37 2c 20 30 78 30 30 20 7d 2c 20 20   0x77, 0x00 },  
d4c0: 2f 2a 20 e1 ba 85 20 74 6f 20 77 20 2a 2f 0a 20  /* ... to w */. 
d4d0: 20 7b 20 30 78 31 45 46 32 2c 20 20 30 78 35 39   { 0x1EF2,  0x59
d4e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 bb  , 0x00 },  /* ..
d4f0: b2 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78  . to Y */.  { 0x
d500: 31 45 46 33 2c 20 20 30 78 37 39 2c 20 30 78 30  1EF3,  0x79, 0x0
d510: 30 20 7d 2c 20 20 2f 2a 20 e1 bb b3 20 74 6f 20  0 },  /* ... to 
d520: 79 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 30 2c  y */.  { 0xFB00,
d530: 20 20 30 78 36 36 2c 20 30 78 36 36 20 7d 2c 20    0x66, 0x66 }, 
d540: 20 2f 2a 20 ef ac 80 20 74 6f 20 66 66 20 2a 2f   /* ... to ff */
d550: 0a 20 20 7b 20 30 78 46 42 30 31 2c 20 20 30 78  .  { 0xFB01,  0x
d560: 36 36 2c 20 30 78 36 39 20 7d 2c 20 20 2f 2a 20  66, 0x69 },  /* 
d570: ef ac 81 20 74 6f 20 66 69 20 2a 2f 0a 20 20 7b  ... to fi */.  {
d580: 20 30 78 46 42 30 32 2c 20 20 30 78 36 36 2c 20   0xFB02,  0x66, 
d590: 30 78 36 43 20 7d 2c 20 20 2f 2a 20 ef ac 82 20  0x6C },  /* ... 
d5a0: 74 6f 20 66 6c 20 2a 2f 0a 20 20 7b 20 30 78 46  to fl */.  { 0xF
d5b0: 42 30 35 2c 20 20 30 78 37 33 2c 20 30 78 37 34  B05,  0x73, 0x74
d5c0: 20 7d 2c 20 20 2f 2a 20 ef ac 85 20 74 6f 20 73   },  /* ... to s
d5d0: 74 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 36 2c  t */.  { 0xFB06,
d5e0: 20 20 30 78 37 33 2c 20 30 78 37 34 20 7d 2c 20    0x73, 0x74 }, 
d5f0: 20 2f 2a 20 ef ac 86 20 74 6f 20 73 74 20 2a 2f   /* ... to st */
d600: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .};../*.** Conve
d610: 72 74 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  rt the input str
d620: 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38 20 69  ing from UTF-8 i
d630: 6e 74 6f 20 70 75 72 65 20 41 53 43 49 49 20 62  nto pure ASCII b
d640: 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 2a 2a 20  y converting.** 
d650: 61 6c 6c 20 6e 6f 6e 2d 41 53 43 49 49 20 63 68  all non-ASCII ch
d660: 61 72 61 63 74 65 72 73 20 74 6f 20 73 6f 6d 65  aracters to some
d670: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
d680: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
d690: 65 0a 2a 2a 20 41 53 43 49 49 20 73 75 62 73 65  e.** ASCII subse
d6a0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
d6b0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 6d 69 67  urned string mig
d6c0: 68 74 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20  ht contain more 
d6d0: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 6e 20  characters than 
d6e0: 74 68 65 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a  the input..**.**
d6f0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
d700: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d710: 6e 67 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 71  ng comes from sq
d720: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
d730: 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  nd.** should be 
d740: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
d750: 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ler..*/.static u
d760: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 72  nsigned char *tr
d770: 61 6e 73 6c 69 74 65 72 61 74 65 28 63 6f 6e 73  ansliterate(cons
d780: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
d790: 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a  *zIn, int nIn){.
d7a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
d7b0: 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f  *zOut = sqlite3_
d7c0: 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2a 34 20  malloc64( nIn*4 
d7d0: 2b 20 31 20 29 3b 0a 20 20 69 6e 74 20 63 2c 20  + 1 );.  int c, 
d7e0: 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69 66 28 20  sz, nOut;.  if( 
d7f0: 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  zOut==0 ) return
d800: 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20 30 3b 0a   0;.  nOut = 0;.
d810: 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29    while( nIn>0 )
d820: 7b 0a 20 20 20 20 63 20 3d 20 75 74 66 38 52 65  {.    c = utf8Re
d830: 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20 26 73 7a  ad(zIn, nIn, &sz
d840: 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 73 7a  );.    zIn += sz
d850: 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20 73 7a 3b  ;.    nIn -= sz;
d860: 0a 20 20 20 20 69 66 28 20 63 3c 3d 31 32 37 20  .    if( c<=127 
d870: 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f  ){.      zOut[nO
d880: 75 74 2b 2b 5d 20 3d 20 28 75 6e 73 69 67 6e 65  ut++] = (unsigne
d890: 64 20 63 68 61 72 29 63 3b 0a 20 20 20 20 7d 65  d char)c;.    }e
d8a0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  lse{.      int x
d8b0: 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a 20 20  Top, xBtm, x;.  
d8c0: 20 20 20 20 78 54 6f 70 20 3d 20 73 69 7a 65 6f      xTop = sizeo
d8d0: 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65  f(translit)/size
d8e0: 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 20  of(translit[0]) 
d8f0: 2d 20 31 3b 0a 20 20 20 20 20 20 78 42 74 6d 20  - 1;.      xBtm 
d900: 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 0;.      while
d910: 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20 29 7b 0a  ( xTop>=xBtm ){.
d920: 20 20 20 20 20 20 20 20 78 20 3d 20 28 78 54 6f          x = (xTo
d930: 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a 20 20 20  p + xBtm)/2;.   
d940: 20 20 20 20 20 69 66 28 20 74 72 61 6e 73 6c 69       if( transli
d950: 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20 29 7b  t[x].cFrom==c ){
d960: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b  .          zOut[
d970: 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61 6e 73 6c  nOut++] = transl
d980: 69 74 5b 78 5d 2e 63 54 6f 30 3b 0a 20 20 20 20  it[x].cTo0;.    
d990: 20 20 20 20 20 20 69 66 28 20 74 72 61 6e 73 6c        if( transl
d9a0: 69 74 5b 78 5d 2e 63 54 6f 31 20 29 7b 0a 20 20  it[x].cTo1 ){.  
d9b0: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e            zOut[n
d9c0: 4f 75 74 2b 2b 5d 20 3d 20 74 72 61 6e 73 6c 69  Out++] = transli
d9d0: 74 5b 78 5d 2e 63 54 6f 31 3b 0a 20 20 20 20 20  t[x].cTo1;.     
d9e0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 6e         /* Add an
d9f0: 20 65 78 74 72 61 20 22 63 68 22 20 61 66 74 65   extra "ch" afte
da00: 72 20 74 68 65 20 22 73 68 22 20 66 6f 72 20 d0  r the "sh" for .
da10: a9 20 61 6e 64 20 d1 89 20 2a 2f 0a 20 20 20 20  . and .. */.    
da20: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
da30: 78 30 34 32 39 20 7c 7c 20 63 3d 3d 20 30 78 30  x0429 || c== 0x0
da40: 34 34 39 20 29 7b 0a 20 20 20 20 20 20 20 20 20  449 ){.         
da50: 20 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b       zOut[nOut++
da60: 5d 20 3d 20 27 63 27 3b 0a 20 20 20 20 20 20 20  ] = 'c';.       
da70: 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74         zOut[nOut
da80: 2b 2b 5d 20 3d 20 27 68 27 3b 0a 20 20 20 20 20  ++] = 'h';.     
da90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
daa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
dab0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
dac0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
dad0: 65 6c 73 65 20 69 66 28 20 74 72 61 6e 73 6c 69  else if( transli
dae0: 74 5b 78 5d 2e 63 46 72 6f 6d 3e 63 20 29 7b 0a  t[x].cFrom>c ){.
daf0: 20 20 20 20 20 20 20 20 20 20 78 54 6f 70 20 3d            xTop =
db00: 20 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   x-1;.        }e
db10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 78  lse{.          x
db20: 42 74 6d 20 3d 20 78 2b 31 3b 0a 20 20 20 20 20  Btm = x+1;.     
db30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
db40: 20 20 20 69 66 28 20 63 20 29 20 7a 4f 75 74 5b     if( c ) zOut[
db50: 6e 4f 75 74 2b 2b 5d 20 3d 20 27 3f 27 3b 0a 20  nOut++] = '?';. 
db60: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b     }.  }.  zOut[
db70: 6e 4f 75 74 5d 20 3d 20 30 3b 0a 20 20 72 65 74  nOut] = 0;.  ret
db80: 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a  urn zOut;.}../*.
db90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
dba0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
dbb0: 72 73 20 69 6e 20 74 68 65 20 73 68 6f 72 74 65  rs in the shorte
dbc0: 73 74 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  st prefix of the
dbd0: 20 69 6e 70 75 74 0a 2a 2a 20 73 74 72 69 6e 67   input.** string
dbe0: 20 74 68 61 74 20 74 72 61 6e 73 6c 69 74 65 72   that transliter
dbf0: 61 74 65 73 20 74 6f 20 61 6e 20 41 53 43 49 49  ates to an ASCII
dc00: 20 73 74 72 69 6e 67 20 6e 54 72 61 6e 73 20 62   string nTrans b
dc10: 79 74 65 73 20 6f 72 20 6c 6f 6e 67 65 72 2e 0a  ytes or longer..
dc20: 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 72  ** Or, if the tr
dc30: 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 6f 66  ansliteration of
dc40: 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
dc50: 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6e  g is less than n
dc60: 54 72 61 6e 73 0a 2a 2a 20 62 79 74 65 73 20 69  Trans.** bytes i
dc70: 6e 20 73 69 7a 65 2c 20 72 65 74 75 72 6e 20 74  n size, return t
dc80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
dc90: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 69  racters in the i
dca0: 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  nput string..*/.
dcb0: 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73  static int trans
dcc0: 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65 6e 28 63  len_to_charlen(c
dcd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
dce0: 69 6e 74 20 6e 49 6e 2c 20 69 6e 74 20 6e 54 72  int nIn, int nTr
dcf0: 61 6e 73 29 7b 0a 20 20 69 6e 74 20 69 2c 20 63  ans){.  int i, c
dd00: 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69 6e  , sz, nOut;.  in
dd10: 74 20 6e 43 68 61 72 3b 0a 0a 20 20 69 20 3d 20  t nChar;..  i = 
dd20: 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nOut = 0;.  for(
dd30: 6e 43 68 61 72 3d 30 3b 20 69 3c 6e 49 6e 20 26  nChar=0; i<nIn &
dd40: 26 20 6e 4f 75 74 3c 6e 54 72 61 6e 73 3b 20 6e  & nOut<nTrans; n
dd50: 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 63 20 3d  Char++){.    c =
dd60: 20 75 74 66 38 52 65 61 64 28 28 63 6f 6e 73 74   utf8Read((const
dd70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
dd80: 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49 6e 2d 69 2c  )&zIn[i], nIn-i,
dd90: 20 26 73 7a 29 3b 0a 20 20 20 20 69 20 2b 3d 20   &sz);.    i += 
dda0: 73 7a 3b 0a 0a 20 20 20 20 6e 4f 75 74 2b 2b 3b  sz;..    nOut++;
ddb0: 0a 20 20 20 20 69 66 28 20 63 3e 3d 31 32 38 20  .    if( c>=128 
ddc0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 54 6f  ){.      int xTo
ddd0: 70 2c 20 78 42 74 6d 2c 20 78 3b 0a 20 20 20 20  p, xBtm, x;.    
dde0: 20 20 78 54 6f 70 20 3d 20 73 69 7a 65 6f 66 28    xTop = sizeof(
ddf0: 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65 6f 66  translit)/sizeof
de00: 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 20 2d 20  (translit[0]) - 
de10: 31 3b 0a 20 20 20 20 20 20 78 42 74 6d 20 3d 20  1;.      xBtm = 
de20: 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
de30: 78 54 6f 70 3e 3d 78 42 74 6d 20 29 7b 0a 20 20  xTop>=xBtm ){.  
de40: 20 20 20 20 20 20 78 20 3d 20 28 78 54 6f 70 20        x = (xTop 
de50: 2b 20 78 42 74 6d 29 2f 32 3b 0a 20 20 20 20 20  + xBtm)/2;.     
de60: 20 20 20 69 66 28 20 74 72 61 6e 73 6c 69 74 5b     if( translit[
de70: 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20 29 7b 0a 20  x].cFrom==c ){. 
de80: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61           if( tra
de90: 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 20 29 20  nslit[x].cTo1 ) 
dea0: 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nOut++;.        
deb0: 20 20 69 66 28 20 63 3d 3d 30 78 30 34 32 39 20    if( c==0x0429 
dec0: 7c 7c 20 63 3d 3d 20 30 78 30 34 34 39 20 29 20  || c== 0x0449 ) 
ded0: 6e 4f 75 74 20 2b 3d 20 32 3b 0a 20 20 20 20 20  nOut += 2;.     
dee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
def0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 72      }else if( tr
df00: 61 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3e  anslit[x].cFrom>
df10: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  c ){.          x
df20: 54 6f 70 20 3d 20 78 2d 31 3b 0a 20 20 20 20 20  Top = x-1;.     
df30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
df40: 20 20 20 20 78 42 74 6d 20 3d 20 78 2b 31 3b 0a      xBtm = x+1;.
df50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
df70: 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a  eturn nChar;.}..
df80: 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70 65 6c 6c 66  ./*.**    spellf
df90: 69 78 31 5f 74 72 61 6e 73 6c 69 74 28 58 29 0a  ix1_translit(X).
dfa0: 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  **.** Convert a 
dfb0: 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 74  string that cont
dfc0: 61 69 6e 73 20 6e 6f 6e 2d 41 53 43 49 49 20 52  ains non-ASCII R
dfd0: 6f 6d 61 6e 20 63 68 61 72 61 63 74 65 72 73 20  oman characters 
dfe0: 69 6e 74 6f 20 0a 2a 2a 20 70 75 72 65 20 41 53  into .** pure AS
dff0: 43 49 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  CII..*/.static v
e000: 6f 69 64 20 74 72 61 6e 73 6c 69 74 65 72 61 74  oid transliterat
e010: 65 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  eSqlFunc(.  sqli
e020: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
e030: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
e040: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
e050: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
e060: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
e070: 72 20 2a 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33  r *zIn = sqlite3
e080: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
e090: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20  [0]);.  int nIn 
e0a0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
e0b0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
e0c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
e0d0: 2a 7a 4f 75 74 20 3d 20 74 72 61 6e 73 6c 69 74  *zOut = translit
e0e0: 65 72 61 74 65 28 7a 49 6e 2c 20 6e 49 6e 29 3b  erate(zIn, nIn);
e0f0: 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29  .  if( zOut==0 )
e100: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
e110: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
e120: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c  (context);.  }el
e130: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
e140: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
e150: 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74  ext, (char*)zOut
e160: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72  , -1, sqlite3_fr
e170: 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ee);.  }.}../*.*
e180: 2a 20 20 20 20 73 70 65 6c 6c 66 69 78 31 5f 73  *    spellfix1_s
e190: 63 72 69 70 74 63 6f 64 65 28 58 29 0a 2a 2a 0a  criptcode(X).**.
e1a0: 2a 2a 20 54 72 79 20 74 6f 20 64 65 74 65 72 6d  ** Try to determ
e1b0: 69 6e 65 20 74 68 65 20 64 6f 6d 69 6e 61 6e 74  ine the dominant
e1c0: 20 73 63 72 69 70 74 20 75 73 65 64 20 62 79 20   script used by 
e1d0: 74 68 65 20 77 6f 72 64 20 58 20 61 6e 64 20 72  the word X and r
e1e0: 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20 49 53 4f  eturn.** its ISO
e1f0: 20 31 35 39 32 34 20 6e 75 6d 65 72 69 63 20 63   15924 numeric c
e200: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
e210: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
e220: 61 74 69 6f 6e 20 6f 6e 6c 79 20 75 6e 64 65 72  ation only under
e230: 73 74 61 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f  stands the follo
e240: 77 69 6e 67 20 73 63 72 69 70 74 73 3a 0a 2a 2a  wing scripts:.**
e250: 0a 2a 2a 20 20 20 20 32 31 35 20 20 28 4c 61 74  .**    215  (Lat
e260: 69 6e 29 0a 2a 2a 20 20 20 20 32 32 30 20 20 28  in).**    220  (
e270: 43 79 72 69 6c 6c 69 63 29 0a 2a 2a 20 20 20 20  Cyrillic).**    
e280: 32 30 30 20 20 28 47 72 65 65 6b 29 0a 2a 2a 0a  200  (Greek).**.
e290: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e2a0: 77 69 6c 6c 20 72 65 74 75 72 6e 20 39 39 38 20  will return 998 
e2b0: 69 66 20 74 68 65 20 69 6e 70 75 74 20 58 20 63  if the input X c
e2c0: 6f 6e 74 61 69 6e 73 20 63 68 61 72 61 63 74 65  ontains characte
e2d0: 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f  rs from.** two o
e2e0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 62  r more of the ab
e2f0: 6f 76 65 20 73 63 72 69 70 74 73 20 6f 72 20 39  ove scripts or 9
e300: 39 39 20 69 66 20 58 20 63 6f 6e 74 61 69 6e 73  99 if X contains
e310: 20 6e 6f 20 63 68 61 72 61 63 74 65 72 73 0a 2a   no characters.*
e320: 2a 20 66 72 6f 6d 20 61 6e 79 20 6f 66 20 74 68  * from any of th
e330: 65 20 61 62 6f 76 65 20 73 63 72 69 70 74 73 2e  e above scripts.
e340: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e350: 73 63 72 69 70 74 43 6f 64 65 53 71 6c 46 75 6e  scriptCodeSqlFun
e360: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
e370: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
e380: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
e390: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
e3a0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  v.){.  const uns
e3b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20  igned char *zIn 
e3c0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
e3d0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
e3e0: 20 69 6e 74 20 6e 49 6e 20 3d 20 73 71 6c 69 74   int nIn = sqlit
e3f0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
e400: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 63  rgv[0]);.  int c
e410: 2c 20 73 7a 3b 0a 20 20 69 6e 74 20 73 63 72 69  , sz;.  int scri
e420: 70 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 6e  ptMask = 0;.  in
e430: 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 73 65 65  t res;.  int see
e440: 6e 44 69 67 69 74 20 3d 20 30 3b 0a 23 20 64 65  nDigit = 0;.# de
e450: 66 69 6e 65 20 53 43 52 49 50 54 5f 4c 41 54 49  fine SCRIPT_LATI
e460: 4e 20 20 20 20 20 20 20 30 78 30 30 30 31 0a 23  N       0x0001.#
e470: 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f 43   define SCRIPT_C
e480: 59 52 49 4c 4c 49 43 20 20 20 20 30 78 30 30 30  YRILLIC    0x000
e490: 32 0a 23 20 64 65 66 69 6e 65 20 53 43 52 49 50  2.# define SCRIP
e4a0: 54 5f 47 52 45 45 4b 20 20 20 20 20 20 20 30 78  T_GREEK       0x
e4b0: 30 30 30 34 0a 23 20 64 65 66 69 6e 65 20 53 43  0004.# define SC
e4c0: 52 49 50 54 5f 48 45 42 52 45 57 20 20 20 20 20  RIPT_HEBREW     
e4d0: 20 30 78 30 30 30 38 0a 23 20 64 65 66 69 6e 65   0x0008.# define
e4e0: 20 53 43 52 49 50 54 5f 41 52 41 42 49 43 20 20   SCRIPT_ARABIC  
e4f0: 20 20 20 20 30 78 30 30 31 30 0a 0a 20 20 77 68      0x0010..  wh
e500: 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20  ile( nIn>0 ){.  
e510: 20 20 63 20 3d 20 75 74 66 38 52 65 61 64 28 7a    c = utf8Read(z
e520: 49 6e 2c 20 6e 49 6e 2c 20 26 73 7a 29 3b 0a 20  In, nIn, &sz);. 
e530: 20 20 20 7a 49 6e 20 2b 3d 20 73 7a 3b 0a 20 20     zIn += sz;.  
e540: 20 20 6e 49 6e 20 2d 3d 20 73 7a 3b 0a 20 20 20    nIn -= sz;.   
e550: 20 69 66 28 20 63 3c 30 78 30 32 61 66 20 29 7b   if( c<0x02af ){
e560: 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d 30 78  .      if( c>=0x
e570: 38 30 20 7c 7c 20 6d 69 64 43 6c 61 73 73 5b 63  80 || midClass[c
e580: 26 30 78 37 66 5d 3c 43 43 4c 41 53 53 5f 44 49  &0x7f]<CCLASS_DI
e590: 47 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  GIT ){.        s
e5a0: 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52  criptMask |= SCR
e5b0: 49 50 54 5f 4c 41 54 49 4e 3b 0a 20 20 20 20 20  IPT_LATIN;.     
e5c0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 30   }else if( c>='0
e5d0: 27 20 26 26 20 63 3c 3d 27 39 27 20 29 7b 0a 20  ' && c<='9' ){. 
e5e0: 20 20 20 20 20 20 20 73 65 65 6e 44 69 67 69 74         seenDigit
e5f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
e600: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 30    }else if( c>=0
e610: 78 30 34 30 30 20 26 26 20 63 3c 3d 30 78 30 34  x0400 && c<=0x04
e620: 66 66 20 29 7b 0a 20 20 20 20 20 20 73 63 72 69  ff ){.      scri
e630: 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52 49 50 54  ptMask |= SCRIPT
e640: 5f 43 59 52 49 4c 4c 49 43 3b 0a 20 20 20 20 7d  _CYRILLIC;.    }
e650: 65 6c 73 65 20 69 66 28 20 63 3e 3d 30 78 30 33  else if( c>=0x03
e660: 38 36 20 26 26 20 63 3c 3d 30 78 30 33 63 65 20  86 && c<=0x03ce 
e670: 29 7b 0a 20 20 20 20 20 20 73 63 72 69 70 74 4d  ){.      scriptM
e680: 61 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 47 52  ask |= SCRIPT_GR
e690: 45 45 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EEK;.    }else i
e6a0: 66 28 20 63 3e 3d 30 78 30 35 39 30 20 26 26 20  f( c>=0x0590 && 
e6b0: 63 3c 3d 30 78 30 35 66 66 20 29 7b 0a 20 20 20  c<=0x05ff ){.   
e6c0: 20 20 20 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d     scriptMask |=
e6d0: 20 53 43 52 49 50 54 5f 48 45 42 52 45 57 3b 0a   SCRIPT_HEBREW;.
e6e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e      }else if( c>
e6f0: 3d 30 78 30 36 30 30 20 26 26 20 63 3c 3d 30 78  =0x0600 && c<=0x
e700: 30 36 66 66 20 29 7b 0a 20 20 20 20 20 20 73 63  06ff ){.      sc
e710: 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52 49  riptMask |= SCRI
e720: 50 54 5f 41 52 41 42 49 43 3b 0a 20 20 20 20 7d  PT_ARABIC;.    }
e730: 0a 20 20 7d 0a 20 20 69 66 28 20 73 63 72 69 70  .  }.  if( scrip
e740: 74 4d 61 73 6b 3d 3d 30 20 26 26 20 73 65 65 6e  tMask==0 && seen
e750: 44 69 67 69 74 20 29 20 73 63 72 69 70 74 4d 61  Digit ) scriptMa
e760: 73 6b 20 3d 20 53 43 52 49 50 54 5f 4c 41 54 49  sk = SCRIPT_LATI
e770: 4e 3b 0a 20 20 73 77 69 74 63 68 28 20 73 63 72  N;.  switch( scr
e780: 69 70 74 4d 61 73 6b 20 29 7b 0a 20 20 20 20 63  iptMask ){.    c
e790: 61 73 65 20 30 3a 20 20 20 20 20 20 20 20 20 20  ase 0:          
e7a0: 20 20 20 20 20 20 72 65 73 20 3d 20 39 39 39 3b        res = 999;
e7b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
e7c0: 20 53 43 52 49 50 54 5f 4c 41 54 49 4e 3a 20 20   SCRIPT_LATIN:  
e7d0: 20 20 20 72 65 73 20 3d 20 32 31 35 3b 20 62 72     res = 215; br
e7e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 43  eak;.    case SC
e7f0: 52 49 50 54 5f 43 59 52 49 4c 4c 49 43 3a 20 20  RIPT_CYRILLIC:  
e800: 72 65 73 20 3d 20 32 32 30 3b 20 62 72 65 61 6b  res = 220; break
e810: 3b 0a 20 20 20 20 63 61 73 65 20 53 43 52 49 50  ;.    case SCRIP
e820: 54 5f 47 52 45 45 4b 3a 20 20 20 20 20 72 65 73  T_GREEK:     res
e830: 20 3d 20 32 30 30 3b 20 62 72 65 61 6b 3b 0a 20   = 200; break;. 
e840: 20 20 20 63 61 73 65 20 53 43 52 49 50 54 5f 48     case SCRIPT_H
e850: 45 42 52 45 57 3a 20 20 20 20 72 65 73 20 3d 20  EBREW:    res = 
e860: 31 32 35 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  125; break;.    
e870: 63 61 73 65 20 53 43 52 49 50 54 5f 41 52 41 42  case SCRIPT_ARAB
e880: 49 43 3a 20 20 20 20 72 65 73 20 3d 20 31 36 30  IC:    res = 160
e890: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ; break;.    def
e8a0: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
e8b0: 20 20 20 20 72 65 73 20 3d 20 39 39 38 3b 20 62      res = 998; b
e8c0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  reak;.  }.  sqli
e8d0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
e8e0: 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b 0a 7d 0a  ontext, res);.}.
e8f0: 0a 2f 2a 20 45 6e 64 20 74 72 61 6e 73 6c 69 74  ./* End translit
e900: 65 72 61 74 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  erate.**********
e910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e950: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
e960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9a0: 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 73 70 65  ***.** Begin spe
e9b0: 6c 6c 66 69 78 31 20 76 69 72 74 75 61 6c 20 74  llfix1 virtual t
e9c0: 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 20 4d 61 78  able..*/../* Max
e9d0: 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61  imum length of a
e9e0: 20 70 68 6f 6e 65 68 61 73 68 20 75 73 65 64 20   phonehash used 
e9f0: 66 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68 65  for querying the
ea00: 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20 2a 2f   shadow table */
ea10: 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
ea20: 58 5f 4d 58 5f 48 41 53 48 20 20 33 32 0a 0a 2f  X_MX_HASH  32../
ea30: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
ea40: 20 6f 66 20 68 61 73 68 20 73 74 72 69 6e 67 73   of hash strings
ea50: 20 74 6f 20 65 78 61 6d 69 6e 65 20 70 65 72 20   to examine per 
ea60: 71 75 65 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  query */.#define
ea70: 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e   SPELLFIX_MX_RUN
ea80: 20 20 20 31 0a 0a 74 79 70 65 64 65 66 20 73 74     1..typedef st
ea90: 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 76  ruct spellfix1_v
eaa0: 74 61 62 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  tab spellfix1_vt
eab0: 61 62 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ab;.typedef stru
eac0: 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  ct spellfix1_cur
ead0: 73 6f 72 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  sor spellfix1_cu
eae0: 72 73 6f 72 3b 0a 0a 2f 2a 20 46 75 7a 7a 79 2d  rsor;../* Fuzzy-
eaf0: 73 65 61 72 63 68 20 76 69 72 74 75 61 6c 20 74  search virtual t
eb00: 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 73  able object */.s
eb10: 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f  truct spellfix1_
eb20: 76 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33  vtab {.  sqlite3
eb30: 5f 76 74 61 62 20 62 61 73 65 3b 20 20 20 20 20  _vtab base;     
eb40: 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73      /* Base clas
eb50: 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73  s - must be firs
eb60: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
eb70: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
eb80: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
eb90: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  nnection */.  ch
eba0: 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 20 20 20 20  ar *zDbName;    
ebb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
ebc0: 20 6f 66 20 64 61 74 61 62 61 73 65 20 68 6f 6c   of database hol
ebd0: 64 69 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20  ding this table 
ebe0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 6c  */.  char *zTabl
ebf0: 65 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  eName;          
ec00: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76  /* Name of the v
ec10: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
ec20: 20 20 63 68 61 72 20 2a 7a 43 6f 73 74 54 61 62    char *zCostTab
ec30: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le;          /* 
ec40: 54 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 65 64  Table holding ed
ec50: 69 74 2d 64 69 73 74 61 6e 63 65 20 63 6f 73 74  it-distance cost
ec60: 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 64   numbers */.  Ed
ec70: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70  itDist3Config *p
ec80: 43 6f 6e 66 69 67 33 3b 20 2f 2a 20 50 61 72 73  Config3; /* Pars
ec90: 65 64 20 65 64 69 74 20 64 69 73 74 61 6e 63 65  ed edit distance
eca0: 20 63 6f 73 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   costs */.};../*
ecb0: 20 46 75 7a 7a 79 2d 73 65 61 72 63 68 20 63 75   Fuzzy-search cu
ecc0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73  rsor object */.s
ecd0: 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f  truct spellfix1_
ece0: 63 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  cursor {.  sqlit
ecf0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
ed00: 61 73 65 3b 20 20 20 20 2f 2a 20 42 61 73 65 20  ase;    /* Base 
ed10: 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20  class - must be 
ed20: 66 69 72 73 74 20 2a 2f 0a 20 20 73 70 65 6c 6c  first */.  spell
ed30: 66 69 78 31 5f 76 74 61 62 20 2a 70 56 54 61 62  fix1_vtab *pVTab
ed40: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  ;       /* The t
ed50: 61 62 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68  able to which th
ed60: 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
ed70: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  s */.  char *zPa
ed80: 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20  ttern;          
ed90: 20 20 20 20 2f 2a 20 72 68 73 20 6f 66 20 4d 41      /* rhs of MA
eda0: 54 43 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  TCH clause */.  
edb0: 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20 20 20 20  int idxNum;     
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
edd0: 69 64 78 4e 75 6d 20 76 61 6c 75 65 20 70 61 73  idxNum value pas
ede0: 73 65 64 20 74 6f 20 78 46 69 6c 74 65 72 28 29  sed to xFilter()
edf0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20   */.  int nRow; 
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ee20: 72 6f 77 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  rows of content 
ee30: 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b  */.  int nAlloc;
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
ee60: 6c 6c 6f 63 61 74 65 64 20 72 6f 77 73 20 2a 2f  llocated rows */
ee70: 0a 20 20 69 6e 74 20 69 52 6f 77 3b 20 20 20 20  .  int iRow;    
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee90: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 20 6f  /* Current row o
eea0: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  f content */.  i
eeb0: 6e 74 20 69 4c 61 6e 67 3b 20 20 20 20 20 20 20  nt iLang;       
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
eed0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 61 6e 67  alue of the lang
eee0: 69 64 3d 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  id= constraint *
eef0: 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b 20 20 20  /.  int iTop;   
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65   /* Value of the
ef20: 20 74 6f 70 3d 20 63 6f 6e 73 74 72 61 69 6e 74   top= constraint
ef30: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63 6f 70 65   */.  int iScope
ef40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ef50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
ef60: 68 65 20 73 63 6f 70 65 3d 20 63 6f 6e 73 74 72  he scope= constr
ef70: 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  aint */.  int nS
ef80: 65 61 72 63 68 3b 20 20 20 20 20 20 20 20 20 20  earch;          
ef90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
efa0: 20 6f 66 20 76 6f 63 61 62 75 6c 61 72 79 20 69   of vocabulary i
efb0: 74 65 6d 73 20 63 68 65 63 6b 65 64 20 2a 2f 0a  tems checked */.
efc0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
efd0: 70 46 75 6c 6c 53 63 61 6e 3b 20 20 20 20 20 2f  pFullScan;     /
efe0: 2a 20 53 68 61 64 6f 77 20 71 75 65 72 79 20 66  * Shadow query f
eff0: 6f 72 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  or a full table 
f000: 73 63 61 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  scan */.  struct
f010: 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 7b   spellfix1_row {
f020: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61         /* For ea
f030: 63 68 20 72 6f 77 20 6f 66 20 63 6f 6e 74 65 6e  ch row of conten
f040: 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  t */.    sqlite3
f050: 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 3b 20 20  _int64 iRowid;  
f060: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
f070: 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a 2f 0a  for this row */.
f080: 20 20 20 20 63 68 61 72 20 2a 7a 57 6f 72 64 3b      char *zWord;
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 2f 2a 20 54 65 78 74 20 66 6f 72 20 74 68    /* Text for th
f0b0: 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  is row */.    in
f0c0: 74 20 69 52 61 6e 6b 3b 20 20 20 20 20 20 20 20  t iRank;        
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f0e0: 61 6e 6b 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ank for this row
f0f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 69 73   */.    int iDis
f100: 74 61 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  tance;          
f110: 20 20 20 20 20 20 2f 2a 20 44 69 73 74 61 6e 63        /* Distanc
f120: 65 20 66 72 6f 6d 20 70 61 74 74 65 72 6e 20 66  e from pattern f
f130: 6f 72 20 74 68 69 73 20 72 6f 77 20 2a 2f 0a 20  or this row */. 
f140: 20 20 20 69 6e 74 20 69 53 63 6f 72 65 3b 20 20     int iScore;  
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 2f 2a 20 53 63 6f 72 65 20 66 6f 72 20 73 6f   /* Score for so
f170: 72 74 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  rting */.    int
f180: 20 69 4d 61 74 63 68 6c 65 6e 3b 20 20 20 20 20   iMatchlen;     
f190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f1a0: 6c 75 65 20 6f 66 20 6d 61 74 63 68 6c 65 6e 20  lue of matchlen 
f1b0: 63 6f 6c 75 6d 6e 20 28 6f 72 20 2d 31 29 20 2a  column (or -1) *
f1c0: 2f 0a 20 20 20 20 63 68 61 72 20 7a 48 61 73 68  /.    char zHash
f1d0: 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53  [SPELLFIX_MX_HAS
f1e0: 48 5d 3b 20 2f 2a 20 74 68 65 20 70 68 6f 6e 65  H]; /* the phone
f1f0: 68 61 73 68 20 75 73 65 64 20 66 6f 72 20 74 68  hash used for th
f200: 69 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20 7d 20  is match */.  } 
f210: 2a 61 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *a; .};../*.** C
f220: 6f 6e 73 74 72 75 63 74 20 6f 6e 65 20 6f 72 20  onstruct one or 
f230: 6d 6f 72 65 20 53 51 4c 20 73 74 61 74 65 6d 65  more SQL stateme
f240: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6f 72  nts from the for
f250: 6d 61 74 20 73 74 72 69 6e 67 20 67 69 76 65 6e  mat string given
f260: 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 65 76 61  .** and then eva
f270: 6c 75 61 74 65 20 74 68 6f 73 65 20 73 74 61 74  luate those stat
f280: 65 6d 65 6e 74 73 2e 20 54 68 65 20 73 75 63 63  ements. The succ
f290: 65 73 73 20 63 6f 64 65 20 69 73 20 77 72 69 74  ess code is writ
f2a0: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 63  ten.** into *pRc
f2b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20  ..**.** If *pRc 
f2c0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
f2d0: 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
f2e0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
f2f0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
f300: 69 64 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78  id spellfix1DbEx
f310: 65 63 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  ec(.  int *pRc, 
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f330: 53 75 63 63 65 73 73 20 63 6f 64 65 20 2a 2f 0a  Success code */.
f340: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
f350: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
f360: 62 61 73 65 20 69 6e 20 77 68 69 63 68 20 74 6f  base in which to
f370: 20 72 75 6e 20 53 51 4c 20 2a 2f 0a 20 20 63 6f   run SQL */.  co
f380: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
f390: 74 2c 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 73  t,   /* Format s
f3a0: 74 72 69 6e 67 20 66 6f 72 20 53 51 4c 20 2a 2f  tring for SQL */
f3b0: 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  .  ...          
f3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
f3d0: 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 6f  uments to the fo
f3e0: 72 6d 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 29  rmat string */.)
f3f0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
f400: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
f410: 69 66 28 20 2a 70 52 63 20 29 20 72 65 74 75 72  if( *pRc ) retur
f420: 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  n;.  va_start(ap
f430: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
f440: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  ql = sqlite3_vmp
f450: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
f460: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
f470: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
f480: 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51  ){.    *pRc = SQ
f490: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
f4a0: 6c 73 65 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  lse{.    *pRc = 
f4b0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
f4c0: 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
f4d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
f4e0: 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(zSql);.  }.}..
f4f0: 2f 2a 0a 2a 2a 20 78 44 69 73 63 6f 6e 6e 65 63  /*.** xDisconnec
f500: 74 2f 78 44 65 73 74 72 6f 79 20 6d 65 74 68 6f  t/xDestroy metho
f510: 64 20 66 6f 72 20 74 68 65 20 66 75 7a 7a 79 2d  d for the fuzzy-
f520: 73 65 61 72 63 68 20 6d 6f 64 75 6c 65 2e 0a 2a  search module..*
f530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
f540: 6c 6c 66 69 78 31 55 6e 69 6e 69 74 28 69 6e 74  llfix1Uninit(int
f550: 20 69 73 44 65 73 74 72 6f 79 2c 20 73 71 6c 69   isDestroy, sqli
f560: 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 29  te3_vtab *pVTab)
f570: 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  {.  spellfix1_vt
f580: 61 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69  ab *p = (spellfi
f590: 78 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a  x1_vtab*)pVTab;.
f5a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f5b0: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73 44 65  E_OK;.  if( isDe
f5c0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 73 71 6c  stroy ){.    sql
f5d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
f5e0: 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44  ;.    spellfix1D
f5f0: 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 22  bExec(&rc, db, "
f600: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
f610: 49 53 54 53 20 5c 22 25 77 5c 22 2e 5c 22 25 77  ISTS \"%w\".\"%w
f620: 5f 76 6f 63 61 62 5c 22 22 2c 0a 20 20 20 20 20  _vocab\"",.     
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
f640: 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62  zDbName, p->zTab
f650: 6c 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  leName);.  }.  i
f660: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f670: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
f680: 66 72 65 65 28 70 2d 3e 7a 54 61 62 6c 65 4e 61  free(p->zTableNa
f690: 6d 65 29 3b 0a 20 20 20 20 65 64 69 74 44 69 73  me);.    editDis
f6a0: 74 33 43 6f 6e 66 69 67 44 65 6c 65 74 65 28 70  t3ConfigDelete(p
f6b0: 2d 3e 70 43 6f 6e 66 69 67 33 29 3b 0a 20 20 20  ->pConfig3);.   
f6c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
f6d0: 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20 20  >zCostTable);.  
f6e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f6f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f700: 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
f710: 20 73 70 65 6c 6c 66 69 78 31 44 69 73 63 6f 6e   spellfix1Discon
f720: 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61  nect(sqlite3_vta
f730: 62 20 2a 70 56 54 61 62 29 7b 0a 20 20 72 65 74  b *pVTab){.  ret
f740: 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 55 6e 69  urn spellfix1Uni
f750: 6e 69 74 28 30 2c 20 70 56 54 61 62 29 3b 0a 7d  nit(0, pVTab);.}
f760: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
f770: 6c 66 69 78 31 44 65 73 74 72 6f 79 28 73 71 6c  lfix1Destroy(sql
f780: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
f790: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c  ){.  return spel
f7a0: 6c 66 69 78 31 55 6e 69 6e 69 74 28 31 2c 20 70  lfix1Uninit(1, p
f7b0: 56 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VTab);.}../*.** 
f7c0: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 61  Make a copy of a
f7d0: 20 73 74 72 69 6e 67 2e 20 20 52 65 6d 6f 76 65   string.  Remove
f7e0: 20 6c 65 61 64 69 6e 67 20 61 6e 64 20 74 72 61   leading and tra
f7f0: 69 6c 69 6e 67 20 77 68 69 74 65 73 70 61 63 65  iling whitespace
f800: 0a 2a 2a 20 61 6e 64 20 64 65 71 75 6f 74 65 20  .** and dequote 
f810: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  it..*/.static ch
f820: 61 72 20 2a 73 70 65 6c 6c 66 69 78 31 44 65 71  ar *spellfix1Deq
f830: 75 6f 74 65 28 63 6f 6e 73 74 20 63 68 61 72 20  uote(const char 
f840: 2a 7a 49 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *zIn){.  char *z
f850: 4f 75 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Out;.  int i, j;
f860: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69  .  char c;.  whi
f870: 6c 65 28 20 69 73 73 70 61 63 65 28 28 75 6e 73  le( isspace((uns
f880: 69 67 6e 65 64 20 63 68 61 72 29 7a 49 6e 5b 30  igned char)zIn[0
f890: 5d 29 20 29 20 7a 49 6e 2b 2b 3b 0a 20 20 7a 4f  ]) ) zIn++;.  zO
f8a0: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ut = sqlite3_mpr
f8b0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 49 6e 29 3b  intf("%s", zIn);
f8c0: 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29  .  if( zOut==0 )
f8d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 20 3d   return 0;.  i =
f8e0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75   (int)strlen(zOu
f8f0: 74 29 3b 0a 23 69 66 20 30 20 20 2f 2a 20 54 68  t);.#if 0  /* Th
f900: 65 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 65  e parser will ne
f910: 76 65 72 20 6c 65 61 76 65 20 73 70 61 63 65 73  ver leave spaces
f920: 20 61 74 20 74 68 65 20 65 6e 64 20 2a 2f 0a 20   at the end */. 
f930: 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20 69   while( i>0 && i
f940: 73 73 70 61 63 65 28 7a 4f 75 74 5b 69 2d 31 5d  sspace(zOut[i-1]
f950: 29 20 29 7b 20 69 2d 2d 3b 20 7d 0a 23 65 6e 64  ) ){ i--; }.#end
f960: 69 66 0a 20 20 7a 4f 75 74 5b 69 5d 20 3d 20 30  if.  zOut[i] = 0
f970: 3b 0a 20 20 63 20 3d 20 7a 4f 75 74 5b 30 5d 3b  ;.  c = zOut[0];
f980: 0a 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c  .  if( c=='\'' |
f990: 7c 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  | c=='"' ){.    
f9a0: 66 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 41 4c  for(i=1, j=0; AL
f9b0: 57 41 59 53 28 7a 4f 75 74 5b 69 5d 29 3b 20 69  WAYS(zOut[i]); i
f9c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b  ++){.      zOut[
f9d0: 6a 2b 2b 5d 20 3d 20 7a 4f 75 74 5b 69 5d 3b 0a  j++] = zOut[i];.
f9e0: 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74 5b 69        if( zOut[i
f9f0: 5d 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==c ){.        
fa00: 69 66 28 20 7a 4f 75 74 5b 69 2b 31 5d 3d 3d 63  if( zOut[i+1]==c
fa10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   ){.          i+
fa20: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
fa30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74  {.          zOut
fa40: 5b 6a 2d 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [j-1] = 0;.     
fa50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fa60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
fa70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
fa80: 20 7a 4f 75 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   zOut;.}.../*.**
fa90: 20 78 43 6f 6e 6e 65 63 74 2f 78 43 72 65 61 74   xConnect/xCreat
faa0: 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 65  e method for the
fab0: 20 73 70 65 6c 6c 66 69 78 31 20 6d 6f 64 75 6c   spellfix1 modul
fac0: 65 2e 20 41 72 67 75 6d 65 6e 74 73 20 61 72 65  e. Arguments are
fad0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30  :.**.**   argv[0
fae0: 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61  ]   -> module na
faf0: 6d 65 20 20 28 22 73 70 65 6c 6c 66 69 78 31 22  me  ("spellfix1"
fb00: 29 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d 20 20  ).**   argv[1]  
fb10: 20 2d 3e 20 64 61 74 61 62 61 73 65 20 6e 61 6d   -> database nam
fb20: 65 0a 2a 2a 20 20 20 61 72 67 76 5b 32 5d 20 20  e.**   argv[2]  
fb30: 20 2d 3e 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a   -> table name.*
fb40: 2a 20 20 20 61 72 67 76 5b 33 5d 2e 2e 20 2d 3e  *   argv[3].. ->
fb50: 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65   optional argume
fb60: 6e 74 73 20 28 69 2e 65 2e 20 22 65 64 69 74 5f  nts (i.e. "edit_
fb70: 63 6f 73 74 5f 74 61 62 6c 65 22 20 70 61 72 61  cost_table" para
fb80: 6d 65 74 65 72 29 0a 2a 2f 0a 73 74 61 74 69 63  meter).*/.static
fb90: 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 49 6e   int spellfix1In
fba0: 69 74 28 0a 20 20 69 6e 74 20 69 73 43 72 65 61  it(.  int isCrea
fbb0: 74 65 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te,.  sqlite3 *d
fbc0: 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
fbd0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
fbe0: 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
fbf0: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
fc00: 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a 20 20  tab **ppVTab,.  
fc10: 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
fc20: 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62    spellfix1_vtab
fc30: 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 2f 2a   *pNew = 0;.  /*
fc40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f   const char *zMo
fc50: 64 75 6c 65 20 3d 20 61 72 67 76 5b 30 5d 3b 20  dule = argv[0]; 
fc60: 2f 2f 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  // not used */. 
fc70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
fc80: 4e 61 6d 65 20 3d 20 61 72 67 76 5b 31 5d 3b 0a  Name = argv[1];.
fc90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
fca0: 61 62 6c 65 4e 61 6d 65 20 3d 20 61 72 67 76 5b  ableName = argv[
fcb0: 32 5d 3b 0a 20 20 69 6e 74 20 6e 44 62 4e 61 6d  2];.  int nDbNam
fcc0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
fcd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
fce0: 3b 0a 0a 20 20 6e 44 62 4e 61 6d 65 20 3d 20 28  ;..  nDbName = (
fcf0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 62 4e 61  int)strlen(zDbNa
fd00: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
fd10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
fd20: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
fd30: 6e 44 62 4e 61 6d 65 20 2b 20 31 29 3b 0a 20 20  nDbName + 1);.  
fd40: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
fd50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
fd60: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
fd70: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
fd80: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
fd90: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 44 62  );.    pNew->zDb
fda0: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
fdb0: 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  New[1];.    memc
fdc0: 70 79 28 70 4e 65 77 2d 3e 7a 44 62 4e 61 6d 65  py(pNew->zDbName
fdd0: 2c 20 7a 44 62 4e 61 6d 65 2c 20 6e 44 62 4e 61  , zDbName, nDbNa
fde0: 6d 65 2b 31 29 3b 0a 20 20 20 20 70 4e 65 77 2d  me+1);.    pNew-
fdf0: 3e 7a 54 61 62 6c 65 4e 61 6d 65 20 3d 20 73 71  >zTableName = sq
fe00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
fe10: 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 29 3b  s", zTableName);
fe20: 0a 20 20 20 20 70 4e 65 77 2d 3e 64 62 20 3d 20  .    pNew->db = 
fe30: 64 62 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  db;.    if( pNew
fe40: 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20  ->zTableName==0 
fe50: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
fe60: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
fe70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
fe80: 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  = sqlite3_declar
fe90: 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20 20 20  e_vtab(db, .    
fea0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
feb0: 41 42 4c 45 20 78 28 77 6f 72 64 2c 72 61 6e 6b  ABLE x(word,rank
fec0: 2c 64 69 73 74 61 6e 63 65 2c 6c 61 6e 67 69 64  ,distance,langid
fed0: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
fee0: 73 63 6f 72 65 2c 20 6d 61 74 63 68 6c 65 6e 2c  score, matchlen,
fef0: 20 70 68 6f 6e 65 68 61 73 68 20 48 49 44 44 45   phonehash HIDDE
ff00: 4e 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  N, ".           
ff10: 22 74 6f 70 20 48 49 44 44 45 4e 2c 20 73 63 6f  "top HIDDEN, sco
ff20: 70 65 20 48 49 44 44 45 4e 2c 20 73 72 63 68 63  pe HIDDEN, srchc
ff30: 6e 74 20 48 49 44 44 45 4e 2c 20 22 0a 20 20 20  nt HIDDEN, ".   
ff40: 20 20 20 20 20 20 20 20 22 73 6f 75 6e 64 73 6c          "soundsl
ff50: 69 6b 65 20 48 49 44 44 45 4e 2c 20 63 6f 6d 6d  ike HIDDEN, comm
ff60: 61 6e 64 20 48 49 44 44 45 4e 29 22 0a 20 20 20  and HIDDEN)".   
ff70: 20 20 20 29 3b 0a 23 64 65 66 69 6e 65 20 53 50     );.#define SP
ff80: 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 20  ELLFIX_COL_WORD 
ff90: 20 20 20 20 20 20 20 20 20 20 20 30 0a 23 64 65             0.#de
ffa0: 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  fine SPELLFIX_CO
ffb0: 4c 5f 52 41 4e 4b 20 20 20 20 20 20 20 20 20 20  L_RANK          
ffc0: 20 20 31 0a 23 64 65 66 69 6e 65 20 53 50 45 4c    1.#define SPEL
ffd0: 4c 46 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e 43  LFIX_COL_DISTANC
ffe0: 45 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69  E        2.#defi
fff0: 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  ne SPELLFIX_COL_
10000 4c 41 4e 47 49 44 20 20 20 20 20 20 20 20 20 20  LANGID          
10010 33 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46  3.#define SPELLF
10020 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 20 20 20 20  IX_COL_SCORE    
10030 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65         4.#define
10040 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4d 41   SPELLFIX_COL_MA
10050 54 43 48 4c 45 4e 20 20 20 20 20 20 20 20 35 0a  TCHLEN        5.
10060 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
10070 5f 43 4f 4c 5f 50 48 4f 4e 45 48 41 53 48 20 20  _COL_PHONEHASH  
10080 20 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 53       6.#define S
10090 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54 4f 50 20  PELLFIX_COL_TOP 
100a0 20 20 20 20 20 20 20 20 20 20 20 20 37 0a 23 64              7.#d
100b0 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43  efine SPELLFIX_C
100c0 4f 4c 5f 53 43 4f 50 45 20 20 20 20 20 20 20 20  OL_SCOPE        
100d0 20 20 20 38 0a 23 64 65 66 69 6e 65 20 53 50 45     8.#define SPE
100e0 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52 43 48 43 4e  LLFIX_COL_SRCHCN
100f0 54 20 20 20 20 20 20 20 20 20 39 0a 23 64 65 66  T         9.#def
10100 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
10110 5f 53 4f 55 4e 44 53 4c 49 4b 45 20 20 20 20 20  _SOUNDSLIKE     
10120 31 30 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c  10.#define SPELL
10130 46 49 58 5f 43 4f 4c 5f 43 4f 4d 4d 41 4e 44 20  FIX_COL_COMMAND 
10140 20 20 20 20 20 20 20 31 31 0a 20 20 20 20 7d 0a         11.    }.
10150 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10160 54 45 5f 4f 4b 20 26 26 20 69 73 43 72 65 61 74  TE_OK && isCreat
10170 65 20 29 7b 0a 20 20 20 20 20 20 73 70 65 6c 6c  e ){.      spell
10180 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20  fix1DbExec(&rc, 
10190 64 62 2c 0a 20 20 20 20 20 20 20 20 20 22 43 52  db,.         "CR
101a0 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
101b0 54 20 45 58 49 53 54 53 20 5c 22 25 77 5c 22 2e  T EXISTS \"%w\".
101c0 5c 22 25 77 5f 76 6f 63 61 62 5c 22 28 5c 6e 22  \"%w_vocab\"(\n"
101d0 0a 20 20 20 20 20 20 20 20 20 22 20 20 69 64 20  .         "  id 
101e0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
101f0 4b 45 59 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  KEY,\n".        
10200 20 22 20 20 72 61 6e 6b 20 49 4e 54 2c 5c 6e 22   "  rank INT,\n"
10210 0a 20 20 20 20 20 20 20 20 20 22 20 20 6c 61 6e  .         "  lan
10220 67 69 64 20 49 4e 54 2c 5c 6e 22 0a 20 20 20 20  gid INT,\n".    
10230 20 20 20 20 20 22 20 20 77 6f 72 64 20 54 45 58       "  word TEX
10240 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22  T,\n".         "
10250 20 20 6b 31 20 54 45 58 54 2c 5c 6e 22 0a 20 20    k1 TEXT,\n".  
10260 20 20 20 20 20 20 20 22 20 20 6b 32 20 54 45 58         "  k2 TEX
10270 54 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 29  T\n".         ")
10280 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  ;\n",.         z
10290 44 62 4e 61 6d 65 2c 20 7a 54 61 62 6c 65 4e 61  DbName, zTableNa
102a0 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
102b0 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65    spellfix1DbExe
102c0 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20  c(&rc, db,.     
102d0 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45      "CREATE INDE
102e0 58 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  X IF NOT EXISTS 
102f0 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
10300 62 5f 69 6e 64 65 78 5f 6c 61 6e 67 69 64 5f 6b  b_index_langid_k
10310 32 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  2\" ".          
10320 20 20 22 4f 4e 20 5c 22 25 77 5f 76 6f 63 61 62    "ON \"%w_vocab
10330 5c 22 28 6c 61 6e 67 69 64 2c 6b 32 29 3b 22 2c  \"(langid,k2);",
10340 0a 20 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  .         zDbNam
10350 65 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  e, zTableName, z
10360 54 61 62 6c 65 4e 61 6d 65 0a 20 20 20 20 20 20  TableName.      
10370 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
10380 28 69 3d 33 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=3; rc==SQLITE
10390 5f 4f 4b 20 26 26 20 69 3c 61 72 67 63 3b 20 69  _OK && i<argc; i
103a0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
103b0 74 72 6e 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  trncmp(argv[i],"
103c0 65 64 69 74 5f 63 6f 73 74 5f 74 61 62 6c 65 3d  edit_cost_table=
103d0 22 2c 31 36 29 3d 3d 30 20 26 26 20 70 4e 65 77  ",16)==0 && pNew
103e0 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d 30 20  ->zCostTable==0 
103f0 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
10400 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d 20 73 70  >zCostTable = sp
10410 65 6c 6c 66 69 78 31 44 65 71 75 6f 74 65 28 26  ellfix1Dequote(&
10420 61 72 67 76 5b 69 5d 5b 31 36 5d 29 3b 0a 20 20  argv[i][16]);.  
10430 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
10440 7a 43 6f 73 74 54 61 62 6c 65 3d 3d 30 20 29 20  zCostTable==0 ) 
10450 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10460 4d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  M;.        conti
10470 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
10480 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c 69     *pzErr = sqli
10490 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 62 61 64  te3_mprintf("bad
104a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 70 65   argument to spe
104b0 6c 6c 66 69 78 31 28 29 3a 20 5c 22 25 73 5c 22  llfix1(): \"%s\"
104c0 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
104d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
104e0 52 52 4f 52 3b 20 0a 20 20 20 20 7d 0a 20 20 7d  RROR; .    }.  }
104f0 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 70 4e  ..  if( rc && pN
10500 65 77 20 29 7b 0a 20 20 20 20 2a 70 70 56 54 61  ew ){.    *ppVTa
10510 62 20 3d 20 30 3b 0a 20 20 20 20 73 70 65 6c 6c  b = 0;.    spell
10520 66 69 78 31 55 6e 69 6e 69 74 28 30 2c 20 26 70  fix1Uninit(0, &p
10530 4e 65 77 2d 3e 62 61 73 65 29 3b 0a 20 20 7d 65  New->base);.  }e
10540 6c 73 65 7b 0a 20 20 20 20 2a 70 70 56 54 61 62  lse{.    *ppVTab
10550 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61 62   = (sqlite3_vtab
10560 20 2a 29 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   *)pNew;.  }.  r
10570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10580 2a 2a 20 54 68 65 20 78 43 6f 6e 6e 65 63 74 20  ** The xConnect 
10590 61 6e 64 20 78 43 72 65 61 74 65 20 6d 65 74 68  and xCreate meth
105a0 6f 64 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ods.*/.static in
105b0 74 20 73 70 65 6c 6c 66 69 78 31 43 6f 6e 6e 65  t spellfix1Conne
105c0 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
105d0 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
105e0 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
105f0 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
10600 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
10610 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a 20 20  tab **ppVTab,.  
10620 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
10630 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c 66 69    return spellfi
10640 78 31 49 6e 69 74 28 30 2c 20 64 62 2c 20 70 41  x1Init(0, db, pA
10650 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  ux, argc, argv, 
10660 70 70 56 54 61 62 2c 20 70 7a 45 72 72 29 3b 0a  ppVTab, pzErr);.
10670 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  }.static int spe
10680 6c 6c 66 69 78 31 43 72 65 61 74 65 28 0a 20 20  llfix1Create(.  
10690 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
106a0 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
106b0 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
106c0 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
106d0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
106e0 70 70 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVTab,.  char *
106f0 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75  *pzErr.){.  retu
10700 72 6e 20 73 70 65 6c 6c 66 69 78 31 49 6e 69 74  rn spellfix1Init
10710 28 31 2c 20 64 62 2c 20 70 41 75 78 2c 20 61 72  (1, db, pAux, ar
10720 67 63 2c 20 61 72 67 76 2c 20 70 70 56 54 61 62  gc, argv, ppVTab
10730 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pzErr);.}../*.
10740 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 6f 66 20  ** Clear all of 
10750 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  the content from
10760 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
10770 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66  atic void spellf
10780 69 78 31 52 65 73 65 74 43 75 72 73 6f 72 28 73  ix1ResetCursor(s
10790 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
107a0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCur){.  int i;
107b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
107c0 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a  ur->nRow; i++){.
107d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
107e0 28 70 43 75 72 2d 3e 61 5b 69 5d 2e 7a 57 6f 72  (pCur->a[i].zWor
107f0 64 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  d);.  }.  pCur->
10800 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43 75 72  nRow = 0;.  pCur
10810 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43  ->iRow = 0;.  pC
10820 75 72 2d 3e 6e 53 65 61 72 63 68 20 3d 20 30 3b  ur->nSearch = 0;
10830 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46 75  .  if( pCur->pFu
10840 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 73 71  llScan ){.    sq
10850 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
10860 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 29 3b  Cur->pFullScan);
10870 0a 20 20 20 20 70 43 75 72 2d 3e 70 46 75 6c 6c  .    pCur->pFull
10880 53 63 61 6e 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Scan = 0;.  }.}.
10890 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68  ./*.** Resize th
108a0 65 20 63 75 72 73 6f 72 20 74 6f 20 68 6f 6c 64  e cursor to hold
108b0 20 75 70 20 74 6f 20 4e 20 72 6f 77 73 20 6f 66   up to N rows of
108c0 20 63 6f 6e 74 65 6e 74 0a 2a 2f 0a 73 74 61 74   content.*/.stat
108d0 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66 69 78  ic void spellfix
108e0 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28 73 70  1ResizeCursor(sp
108f0 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
10900 70 43 75 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  pCur, int N){.  
10910 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31  struct spellfix1
10920 5f 72 6f 77 20 2a 61 4e 65 77 3b 0a 20 20 61 73  _row *aNew;.  as
10930 73 65 72 74 28 20 4e 3e 3d 70 43 75 72 2d 3e 6e  sert( N>=pCur->n
10940 52 6f 77 20 29 3b 0a 20 20 61 4e 65 77 20 3d 20  Row );.  aNew = 
10950 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
10960 34 28 70 43 75 72 2d 3e 61 2c 20 73 69 7a 65 6f  4(pCur->a, sizeo
10970 66 28 70 43 75 72 2d 3e 61 5b 30 5d 29 2a 4e 29  f(pCur->a[0])*N)
10980 3b 0a 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20  ;.  if( aNew==0 
10990 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 73 70  && N>0 ){.    sp
109a0 65 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73  ellfix1ResetCurs
109b0 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 73 71  or(pCur);.    sq
109c0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
109d0 3e 61 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e  >a);.    pCur->n
109e0 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  Alloc = 0;.    p
109f0 43 75 72 2d 3e 61 20 3d 20 30 3b 0a 20 20 7d 65  Cur->a = 0;.  }e
10a00 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 6e  lse{.    pCur->n
10a10 41 6c 6c 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70  Alloc = N;.    p
10a20 43 75 72 2d 3e 61 20 3d 20 61 4e 65 77 3b 0a 20  Cur->a = aNew;. 
10a30 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   }.}.../*.** Clo
10a40 73 65 20 61 20 66 75 7a 7a 79 2d 73 65 61 72 63  se a fuzzy-searc
10a50 68 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  h cursor..*/.sta
10a60 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
10a70 31 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  1Close(sqlite3_v
10a80 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
10a90 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  {.  spellfix1_cu
10aa0 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70  rsor *pCur = (sp
10ab0 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
10ac0 29 63 75 72 3b 0a 20 20 73 70 65 6c 6c 66 69 78  )cur;.  spellfix
10ad0 31 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75  1ResetCursor(pCu
10ae0 72 29 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52  r);.  spellfix1R
10af0 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72  esizeCursor(pCur
10b00 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
10b10 66 72 65 65 28 70 43 75 72 2d 3e 7a 50 61 74 74  free(pCur->zPatt
10b20 65 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ern);.  sqlite3_
10b30 66 72 65 65 28 70 43 75 72 29 3b 0a 20 20 72 65  free(pCur);.  re
10b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10b50 7d 0a 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c  }..#define SPELL
10b60 46 49 58 5f 49 44 58 4e 55 4d 5f 4d 41 54 43 48  FIX_IDXNUM_MATCH
10b70 20 20 30 78 30 31 20 20 20 20 20 20 20 20 20 2f    0x01         /
10b80 2a 20 77 6f 72 64 20 4d 41 54 43 48 20 24 73 74  * word MATCH $st
10b90 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 45  r */.#define SPE
10ba0 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 4c 41 4e  LLFIX_IDXNUM_LAN
10bb0 47 49 44 20 30 78 30 32 20 20 20 20 20 20 20 20  GID 0x02        
10bc0 20 2f 2a 20 6c 61 6e 67 69 64 20 3d 3d 20 24 6c   /* langid == $l
10bd0 61 6e 67 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65  angid */.#define
10be0 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
10bf0 5f 54 4f 50 20 20 20 20 30 78 30 34 20 20 20 20  _TOP    0x04    
10c00 20 20 20 20 20 2f 2a 20 74 6f 70 20 3d 20 24 74       /* top = $t
10c10 6f 70 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  op */.#define SP
10c20 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 53 43  ELLFIX_IDXNUM_SC
10c30 4f 50 45 20 20 30 78 30 38 20 20 20 20 20 20 20  OPE  0x08       
10c40 20 20 2f 2a 20 73 63 6f 70 65 20 3d 20 24 73 63    /* scope = $sc
10c50 6f 70 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ope */.#define S
10c60 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44  PELLFIX_IDXNUM_D
10c70 49 53 54 4c 54 20 30 78 31 30 20 20 20 20 20 20  ISTLT 0x10      
10c80 20 20 20 2f 2a 20 64 69 73 74 61 6e 63 65 20 3c     /* distance <
10c90 20 24 64 69 73 74 61 6e 63 65 20 2a 2f 0a 23 64   $distance */.#d
10ca0 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49  efine SPELLFIX_I
10cb0 44 58 4e 55 4d 5f 44 49 53 54 4c 45 20 30 78 32  DXNUM_DISTLE 0x2
10cc0 30 20 20 20 20 20 20 20 20 20 2f 2a 20 64 69 73  0         /* dis
10cd0 74 61 6e 63 65 20 3c 3d 20 24 64 69 73 74 61 6e  tance <= $distan
10ce0 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  ce */.#define SP
10cf0 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 52 4f  ELLFIX_IDXNUM_RO
10d00 57 49 44 20 20 30 78 34 30 20 20 20 20 20 20 20  WID  0x40       
10d10 20 20 2f 2a 20 72 6f 77 69 64 20 3d 20 24 72 6f    /* rowid = $ro
10d20 77 69 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  wid */.#define S
10d30 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44  PELLFIX_IDXNUM_D
10d40 49 53 54 20 20 20 28 30 78 31 30 7c 30 78 32 30  IST   (0x10|0x20
10d50 29 20 20 2f 2a 20 44 49 53 54 4c 54 20 61 6e 64  )  /* DISTLT and
10d60 20 44 49 53 54 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a   DISTLE */../*.*
10d70 2a 0a 2a 2a 20 54 68 65 20 70 6c 61 6e 20 6e 75  *.** The plan nu
10d80 6d 62 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  mber is a bitmas
10d90 6b 20 6f 66 20 74 68 65 20 53 50 45 4c 4c 46 49  k of the SPELLFI
10da0 58 5f 49 44 58 4e 55 4d 5f 2a 20 76 61 6c 75 65  X_IDXNUM_* value
10db0 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 61 62 6f  s defined.** abo
10dc0 76 65 2e 0a 2a 2a 0a 2a 2a 20 66 69 6c 74 65 72  ve..**.** filter
10dd0 2e 61 72 67 76 5b 2a 5d 20 76 61 6c 75 65 73 20  .argv[*] values 
10de0 63 6f 6e 74 61 69 6e 73 20 24 73 74 72 2c 20 24  contains $str, $
10df0 6c 61 6e 67 69 64 2c 20 24 74 6f 70 2c 20 24 73  langid, $top, $s
10e00 63 6f 70 65 20 61 6e 64 20 24 72 6f 77 69 64 0a  cope and $rowid.
10e10 2a 2a 20 69 66 20 73 70 65 63 69 66 69 65 64 20  ** if specified 
10e20 61 6e 64 20 69 6e 20 74 68 61 74 20 6f 72 64 65  and in that orde
10e30 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
10e40 20 73 70 65 6c 6c 66 69 78 31 42 65 73 74 49 6e   spellfix1BestIn
10e50 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62  dex(sqlite3_vtab
10e60 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69   *tab, sqlite3_i
10e70 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
10e80 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 50 6c 61  nfo){.  int iPla
10e90 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 61  n = 0;.  int iLa
10ea0 6e 67 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69  ngTerm = -1;.  i
10eb0 6e 74 20 69 54 6f 70 54 65 72 6d 20 3d 20 2d 31  nt iTopTerm = -1
10ec0 3b 0a 20 20 69 6e 74 20 69 53 63 6f 70 65 54 65  ;.  int iScopeTe
10ed0 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  rm = -1;.  int i
10ee0 44 69 73 74 54 65 72 6d 20 3d 20 2d 31 3b 0a 20  DistTerm = -1;. 
10ef0 20 69 6e 74 20 69 52 6f 77 69 64 54 65 72 6d 20   int iRowidTerm 
10f00 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  = -1;.  int i;. 
10f10 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
10f20 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
10f30 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61  traint *pConstra
10f40 69 6e 74 3b 0a 20 20 70 43 6f 6e 73 74 72 61 69  int;.  pConstrai
10f50 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  nt = pIdxInfo->a
10f60 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
10f70 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
10f80 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
10f90 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74  i++, pConstraint
10fa0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  ++){.    if( pCo
10fb0 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65  nstraint->usable
10fc0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
10fd0 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
10fe0 20 74 68 65 20 66 6f 72 6d 3a 20 20 77 6f 72 64   the form:  word
10ff0 20 4d 41 54 43 48 20 24 73 74 72 20 2a 2f 0a 20   MATCH $str */. 
11000 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
11010 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
11020 4d 41 54 43 48 29 3d 3d 30 20 0a 20 20 20 20 20  MATCH)==0 .     
11030 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
11040 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49  iColumn==SPELLFI
11050 58 5f 43 4f 4c 5f 57 4f 52 44 0a 20 20 20 20 20  X_COL_WORD.     
11060 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
11070 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
11080 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
11090 48 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  H.    ){.      i
110a0 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58  Plan |= SPELLFIX
110b0 5f 49 44 58 4e 55 4d 5f 4d 41 54 43 48 3b 0a 20  _IDXNUM_MATCH;. 
110c0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61       pIdxInfo->a
110d0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
110e0 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31  i].argvIndex = 1
110f0 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
11100 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
11110 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  ge[i].omit = 1;.
11120 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65      }..    /* Te
11130 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  rms of the form:
11140 20 20 6c 61 6e 67 69 64 20 3d 20 24 6c 61 6e 67    langid = $lang
11150 69 64 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  id  */.    if( (
11160 69 50 6c 61 6e 20 26 20 53 50 45 4c 4c 46 49 58  iPlan & SPELLFIX
11170 5f 49 44 58 4e 55 4d 5f 4c 41 4e 47 49 44 29 3d  _IDXNUM_LANGID)=
11180 3d 30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73  =0.     && pCons
11190 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d  traint->iColumn=
111a0 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41  =SPELLFIX_COL_LA
111b0 4e 47 49 44 0a 20 20 20 20 20 26 26 20 70 43 6f  NGID.     && pCo
111c0 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51  nstraint->op==SQ
111d0 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
111e0 52 41 49 4e 54 5f 45 51 0a 20 20 20 20 29 7b 0a  RAINT_EQ.    ){.
111f0 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 53        iPlan |= S
11200 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 4c  PELLFIX_IDXNUM_L
11210 41 4e 47 49 44 3b 0a 20 20 20 20 20 20 69 4c 61  ANGID;.      iLa
11220 6e 67 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20  ngTerm = i;.    
11230 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20  }..    /* Terms 
11240 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 74 6f  of the form:  to
11250 70 20 3d 20 24 74 6f 70 20 2a 2f 0a 20 20 20 20  p = $top */.    
11260 69 66 28 20 28 69 50 6c 61 6e 20 26 20 53 50 45  if( (iPlan & SPE
11270 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 54 4f 50  LLFIX_IDXNUM_TOP
11280 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43 6f  )==0.     && pCo
11290 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
112a0 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  n==SPELLFIX_COL_
112b0 54 4f 50 0a 20 20 20 20 20 26 26 20 70 43 6f 6e  TOP.     && pCon
112c0 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c  straint->op==SQL
112d0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
112e0 41 49 4e 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20  AINT_EQ.    ){. 
112f0 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 53 50       iPlan |= SP
11300 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 54 4f  ELLFIX_IDXNUM_TO
11310 50 3b 0a 20 20 20 20 20 20 69 54 6f 70 54 65 72  P;.      iTopTer
11320 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20  m = i;.    }..  
11330 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68    /* Terms of th
11340 65 20 66 6f 72 6d 3a 20 20 73 63 6f 70 65 20 3d  e form:  scope =
11350 20 24 73 63 6f 70 65 20 2a 2f 0a 20 20 20 20 69   $scope */.    i
11360 66 28 20 28 69 50 6c 61 6e 20 26 20 53 50 45 4c  f( (iPlan & SPEL
11370 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 53 43 4f 50  LFIX_IDXNUM_SCOP
11380 45 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43  E)==0.     && pC
11390 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
113a0 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  mn==SPELLFIX_COL
113b0 5f 53 43 4f 50 45 0a 20 20 20 20 20 26 26 20 70  _SCOPE.     && p
113c0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
113d0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
113e0 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20 20 29  STRAINT_EQ.    )
113f0 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d  {.      iPlan |=
11400 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
11410 5f 53 43 4f 50 45 3b 0a 20 20 20 20 20 20 69 53  _SCOPE;.      iS
11420 63 6f 70 65 54 65 72 6d 20 3d 20 69 3b 0a 20 20  copeTerm = i;.  
11430 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d    }..    /* Term
11440 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
11450 64 69 73 74 61 6e 63 65 20 3c 20 24 64 69 73 74  distance < $dist
11460 20 6f 72 20 64 69 73 74 61 6e 63 65 20 3c 3d 20   or distance <= 
11470 24 64 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 28  $dist */.    if(
11480 20 28 69 50 6c 61 6e 20 26 20 53 50 45 4c 4c 46   (iPlan & SPELLF
11490 49 58 5f 49 44 58 4e 55 4d 5f 44 49 53 54 29 3d  IX_IDXNUM_DIST)=
114a0 3d 30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73  =0.     && pCons
114b0 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d  traint->iColumn=
114c0 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49  =SPELLFIX_COL_DI
114d0 53 54 41 4e 43 45 0a 20 20 20 20 20 26 26 20 28  STANCE.     && (
114e0 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
114f0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
11500 4e 53 54 52 41 49 4e 54 5f 4c 54 0a 20 20 20 20  NSTRAINT_LT.    
11510 20 20 20 20 20 20 7c 7c 20 70 43 6f 6e 73 74 72        || pConstr
11520 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  aint->op==SQLITE
11530 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
11540 54 5f 4c 45 29 0a 20 20 20 20 29 7b 0a 20 20 20  T_LE).    ){.   
11550 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69     if( pConstrai
11560 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  nt->op==SQLITE_I
11570 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
11580 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 50  LT ){.        iP
11590 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f  lan |= SPELLFIX_
115a0 49 44 58 4e 55 4d 5f 44 49 53 54 4c 54 3b 0a 20  IDXNUM_DISTLT;. 
115b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
115c0 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 53 50 45      iPlan |= SPE
115d0 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44 49 53  LLFIX_IDXNUM_DIS
115e0 54 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TLE;.      }.   
115f0 20 20 20 69 44 69 73 74 54 65 72 6d 20 3d 20 69     iDistTerm = i
11600 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11610 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  Terms of the for
11620 6d 3a 20 20 64 69 73 74 61 6e 63 65 20 3c 20 24  m:  distance < $
11630 64 69 73 74 20 6f 72 20 64 69 73 74 61 6e 63 65  dist or distance
11640 20 3c 3d 20 24 64 69 73 74 20 2a 2f 0a 20 20 20   <= $dist */.   
11650 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20 53 50   if( (iPlan & SP
11660 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 52 4f  ELLFIX_IDXNUM_RO
11670 57 49 44 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  WID)==0.     && 
11680 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f  pConstraint->iCo
11690 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 26 26 20 70  lumn<0.     && p
116a0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
116b0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
116c0 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20 20 29  STRAINT_EQ.    )
116d0 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d  {.      iPlan |=
116e0 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
116f0 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20 69 52  _ROWID;.      iR
11700 6f 77 69 64 54 65 72 6d 20 3d 20 69 3b 0a 20 20  owidTerm = i;.  
11710 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 50    }.  }.  if( iP
11720 6c 61 6e 26 53 50 45 4c 4c 46 49 58 5f 49 44 58  lan&SPELLFIX_IDX
11730 4e 55 4d 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  NUM_MATCH ){.   
11740 20 69 6e 74 20 69 64 78 20 3d 20 32 3b 0a 20 20   int idx = 2;.  
11750 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
11760 75 6d 20 3d 20 69 50 6c 61 6e 3b 0a 20 20 20 20  um = iPlan;.    
11770 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  if( pIdxInfo->nO
11780 72 64 65 72 42 79 3d 3d 31 0a 20 20 20 20 20 26  rderBy==1.     &
11790 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  & pIdxInfo->aOrd
117a0 65 72 42 79 5b 30 5d 2e 69 43 6f 6c 75 6d 6e 3d  erBy[0].iColumn=
117b0 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43  =SPELLFIX_COL_SC
117c0 4f 52 45 0a 20 20 20 20 20 26 26 20 70 49 64 78  ORE.     && pIdx
117d0 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30  Info->aOrderBy[0
117e0 5d 2e 64 65 73 63 3d 3d 30 0a 20 20 20 20 29 7b  ].desc==0.    ){
117f0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
11800 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
11810 20 3d 20 31 3b 20 20 2f 2a 20 44 65 66 61 75 6c   = 1;  /* Defaul
11820 74 20 6f 72 64 65 72 20 62 79 20 69 53 63 6f 72  t order by iScor
11830 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  e */.    }.    i
11840 66 28 20 69 50 6c 61 6e 26 53 50 45 4c 4c 46 49  f( iPlan&SPELLFI
11850 58 5f 49 44 58 4e 55 4d 5f 4c 41 4e 47 49 44 20  X_IDXNUM_LANGID 
11860 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  ){.      pIdxInf
11870 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11880 61 67 65 5b 69 4c 61 6e 67 54 65 72 6d 5d 2e 61  age[iLangTerm].a
11890 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b  rgvIndex = idx++
118a0 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
118b0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
118c0 67 65 5b 69 4c 61 6e 67 54 65 72 6d 5d 2e 6f 6d  ge[iLangTerm].om
118d0 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  it = 1;.    }.  
118e0 20 20 69 66 28 20 69 50 6c 61 6e 26 53 50 45 4c    if( iPlan&SPEL
118f0 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 54 4f 50 20  LFIX_IDXNUM_TOP 
11900 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  ){.      pIdxInf
11910 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11920 61 67 65 5b 69 54 6f 70 54 65 72 6d 5d 2e 61 72  age[iTopTerm].ar
11930 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b  gvIndex = idx++;
11940 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
11950 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
11960 65 5b 69 54 6f 70 54 65 72 6d 5d 2e 6f 6d 69 74  e[iTopTerm].omit
11970 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
11980 69 66 28 20 69 50 6c 61 6e 26 53 50 45 4c 4c 46  if( iPlan&SPELLF
11990 49 58 5f 49 44 58 4e 55 4d 5f 53 43 4f 50 45 20  IX_IDXNUM_SCOPE 
119a0 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  ){.      pIdxInf
119b0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
119c0 61 67 65 5b 69 53 63 6f 70 65 54 65 72 6d 5d 2e  age[iScopeTerm].
119d0 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b  argvIndex = idx+
119e0 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  +;.      pIdxInf
119f0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11a00 61 67 65 5b 69 53 63 6f 70 65 54 65 72 6d 5d 2e  age[iScopeTerm].
11a10 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  omit = 1;.    }.
11a20 20 20 20 20 69 66 28 20 69 50 6c 61 6e 26 53 50      if( iPlan&SP
11a30 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44 49  ELLFIX_IDXNUM_DI
11a40 53 54 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  ST ){.      pIdx
11a50 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
11a60 74 55 73 61 67 65 5b 69 44 69 73 74 54 65 72 6d  tUsage[iDistTerm
11a70 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64  ].argvIndex = id
11a80 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49  x++;.      pIdxI
11a90 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
11aa0 55 73 61 67 65 5b 69 44 69 73 74 54 65 72 6d 5d  Usage[iDistTerm]
11ab0 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  .omit = 1;.    }
11ac0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
11ad0 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31  stimatedCost = 1
11ae0 65 35 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e5;.  }else if( 
11af0 28 69 50 6c 61 6e 20 26 20 53 50 45 4c 4c 46 49  (iPlan & SPELLFI
11b00 58 5f 49 44 58 4e 55 4d 5f 52 4f 57 49 44 29 20  X_IDXNUM_ROWID) 
11b10 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  ){.    pIdxInfo-
11b20 3e 69 64 78 4e 75 6d 20 3d 20 53 50 45 4c 4c 46  >idxNum = SPELLF
11b30 49 58 5f 49 44 58 4e 55 4d 5f 52 4f 57 49 44 3b  IX_IDXNUM_ROWID;
11b40 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  .    pIdxInfo->a
11b50 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
11b60 69 52 6f 77 69 64 54 65 72 6d 5d 2e 61 72 67 76  iRowidTerm].argv
11b70 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 70  Index = 1;.    p
11b80 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
11b90 61 69 6e 74 55 73 61 67 65 5b 69 52 6f 77 69 64  aintUsage[iRowid
11ba0 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  Term].omit = 1;.
11bb0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
11bc0 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 35 3b  timatedCost = 5;
11bd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
11be0 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
11bf0 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   0;.    pIdxInfo
11c00 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
11c10 3d 20 31 65 35 30 3b 0a 20 20 7d 0a 20 20 72 65  = 1e50;.  }.  re
11c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11c30 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
11c40 6e 65 77 20 66 75 7a 7a 79 2d 73 65 61 72 63 68  new fuzzy-search
11c50 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
11c60 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
11c70 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  Open(sqlite3_vta
11c80 62 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65  b *pVTab, sqlite
11c90 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
11ca0 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 73 70 65  ppCursor){.  spe
11cb0 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d  llfix1_vtab *p =
11cc0 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62   (spellfix1_vtab
11cd0 2a 29 70 56 54 61 62 3b 0a 20 20 73 70 65 6c 6c  *)pVTab;.  spell
11ce0 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75  fix1_cursor *pCu
11cf0 72 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69  r;.  pCur = sqli
11d00 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
11d10 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20  zeof(*pCur) );. 
11d20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72   if( pCur==0 ) r
11d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11d40 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75  EM;.  memset(pCu
11d50 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  r, 0, sizeof(*pC
11d60 75 72 29 29 3b 0a 20 20 70 43 75 72 2d 3e 70 56  ur));.  pCur->pV
11d70 54 61 62 20 3d 20 70 3b 0a 20 20 2a 70 70 43 75  Tab = p;.  *ppCu
11d80 72 73 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62 61  rsor = &pCur->ba
11d90 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  se;.  return SQL
11da0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11db0 20 41 64 6a 75 73 74 20 61 20 64 69 73 74 61 6e   Adjust a distan
11dc0 63 65 20 6d 65 61 73 75 72 65 6d 65 6e 74 20 62  ce measurement b
11dd0 79 20 74 68 65 20 77 6f 72 64 73 20 72 61 6e 6b  y the words rank
11de0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 68 6f   in order to sho
11df0 77 0a 2a 2a 20 70 72 65 66 65 72 65 6e 63 65 20  w.** preference 
11e00 74 6f 20 63 6f 6d 6d 6f 6e 20 77 6f 72 64 73 2e  to common words.
11e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
11e20 70 65 6c 6c 66 69 78 31 53 63 6f 72 65 28 69 6e  pellfix1Score(in
11e30 74 20 69 44 69 73 74 61 6e 63 65 2c 20 69 6e 74  t iDistance, int
11e40 20 69 52 61 6e 6b 29 7b 0a 20 20 69 6e 74 20 69   iRank){.  int i
11e50 4c 6f 67 32 3b 0a 20 20 66 6f 72 28 69 4c 6f 67  Log2;.  for(iLog
11e60 32 3d 30 3b 20 69 52 61 6e 6b 3e 30 3b 20 69 4c  2=0; iRank>0; iL
11e70 6f 67 32 2b 2b 2c 20 69 52 61 6e 6b 3e 3e 3d 31  og2++, iRank>>=1
11e80 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 69  ){}.  return iDi
11e90 73 74 61 6e 63 65 20 2b 20 33 32 20 2d 20 69 4c  stance + 32 - iL
11ea0 6f 67 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  og2;.}../*.** Co
11eb0 6d 70 61 72 65 20 74 77 6f 20 73 70 65 6c 6c 66  mpare two spellf
11ec0 69 78 31 5f 72 6f 77 20 6f 62 6a 65 63 74 73 20  ix1_row objects 
11ed0 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
11ee0 6f 73 65 73 20 69 6e 20 71 73 6f 72 74 28 29 20  oses in qsort() 
11ef0 73 75 63 68 0a 2a 2a 20 74 68 61 74 20 74 68 65  such.** that the
11f00 79 20 73 6f 72 74 20 69 6e 20 6f 72 64 65 72 20  y sort in order 
11f10 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 64 69  of increasing di
11f20 73 74 61 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  stance..*/.stati
11f30 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 43 44 45  c int SQLITE_CDE
11f40 43 4c 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 43  CL spellfix1RowC
11f50 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69  ompare(const voi
11f60 64 20 2a 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *A, const void
11f70 20 2a 42 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74   *B){.  const st
11f80 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 72  ruct spellfix1_r
11f90 6f 77 20 2a 61 20 3d 20 28 63 6f 6e 73 74 20 73  ow *a = (const s
11fa0 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f  truct spellfix1_
11fb0 72 6f 77 2a 29 41 3b 0a 20 20 63 6f 6e 73 74 20  row*)A;.  const 
11fc0 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31  struct spellfix1
11fd0 5f 72 6f 77 20 2a 62 20 3d 20 28 63 6f 6e 73 74  _row *b = (const
11fe0 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78   struct spellfix
11ff0 31 5f 72 6f 77 2a 29 42 3b 0a 20 20 72 65 74 75  1_row*)B;.  retu
12000 72 6e 20 61 2d 3e 69 53 63 6f 72 65 20 2d 20 62  rn a->iScore - b
12010 2d 3e 69 53 63 6f 72 65 3b 0a 7d 0a 0a 2f 2a 0a  ->iScore;.}../*.
12020 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 75  ** A structure u
12030 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  sed to pass info
12040 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 73 70 65  rmation from spe
12050 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d  llfix1FilterForM
12060 61 74 63 68 28 29 0a 2a 2a 20 69 6e 74 6f 20 73  atch().** into s
12070 70 65 6c 6c 66 69 78 31 52 75 6e 51 75 65 72 79  pellfix1RunQuery
12080 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ()..*/.typedef s
12090 74 72 75 63 74 20 4d 61 74 63 68 51 75 65 72 79  truct MatchQuery
120a0 20 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63   {.  spellfix1_c
120b0 75 72 73 6f 72 20 2a 70 43 75 72 3b 20 20 20 20  ursor *pCur;    
120c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
120d0 73 6f 72 20 62 65 69 6e 67 20 71 75 65 72 69 65  sor being querie
120e0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  d */.  sqlite3_s
120f0 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
12100 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 64 6f          /* shado
12110 77 20 74 61 62 6c 65 20 71 75 65 72 79 20 73 74  w table query st
12120 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72  atment */.  char
12130 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46 49 58 5f   zHash[SPELLFIX_
12140 4d 58 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20  MX_HASH];    /* 
12150 54 68 65 20 63 75 72 72 65 6e 74 20 70 68 6f 6e  The current phon
12160 65 68 61 73 68 20 66 6f 72 20 7a 50 61 74 74 65  ehash for zPatte
12170 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  rn */.  const ch
12180 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20  ar *zPattern;   
12190 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e           /* Tran
121a0 73 6c 69 74 65 72 61 74 65 64 20 69 6e 70 75 74  sliterated input
121b0 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   string */.  int
121c0 20 6e 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20   nPattern;      
121d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121e0 20 4c 65 6e 67 74 68 20 6f 66 20 7a 50 61 74 74   Length of zPatt
121f0 65 72 6e 20 2a 2f 0a 20 20 45 64 69 74 44 69 73  ern */.  EditDis
12200 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 4d  t3FromString *pM
12210 61 74 63 68 53 74 72 33 3b 20 2f 2a 20 4f 72 69  atchStr3; /* Ori
12220 67 69 6e 61 6c 20 75 6e 69 63 6f 64 65 20 73 74  ginal unicode st
12230 72 69 6e 67 20 2a 2f 0a 20 20 45 64 69 74 44 69  ring */.  EditDi
12240 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  st3Config *pConf
12250 69 67 33 3b 20 20 20 20 20 20 20 2f 2a 20 45 64  ig3;       /* Ed
12260 69 74 2d 64 69 73 74 61 6e 63 65 20 63 6f 73 74  it-distance cost
12270 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20 2a 2f   coefficients */
12280 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73  .  const EditDis
12290 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 3b 20 20  t3Lang *pLang;  
122a0 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63      /* The selec
122b0 74 65 64 20 6c 61 6e 67 75 61 67 65 20 63 6f 65  ted language coe
122c0 66 66 69 63 69 65 6e 74 73 20 2a 2f 0a 20 20 69  fficients */.  i
122d0 6e 74 20 69 4c 61 6e 67 3b 20 20 20 20 20 20 20  nt iLang;       
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 2f 2a 20 54 68 65 20 6c 61 6e 67 75 61 67 65 20  /* The language 
12300 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63 6f  id */.  int iSco
12310 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
12320 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61           /* Defa
12330 75 6c 74 20 73 63 6f 70 65 20 2a 2f 0a 20 20 69  ult scope */.  i
12340 6e 74 20 69 4d 61 78 44 69 73 74 3b 20 20 20 20  nt iMaxDist;    
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12360 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
12370 65 64 20 65 64 69 74 20 64 69 73 74 61 6e 63 65  ed edit distance
12380 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 69 6e 74  , or -1 */.  int
12390 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
123b0 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
123c0 20 69 6e 74 20 6e 52 75 6e 3b 20 20 20 20 20 20   int nRun;      
123d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
123e0 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 72  umber of prior r
123f0 75 6e 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  uns for the same
12400 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63   zPattern */.  c
12410 68 61 72 20 61 7a 50 72 69 6f 72 5b 53 50 45 4c  har azPrior[SPEL
12420 4c 46 49 58 5f 4d 58 5f 52 55 4e 5d 5b 53 50 45  LFIX_MX_RUN][SPE
12430 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20  LLFIX_MX_HASH]; 
12440 20 2f 2a 20 50 72 69 6f 72 20 68 61 73 68 65 73   /* Prior hashes
12450 20 2a 2f 0a 7d 20 4d 61 74 63 68 51 75 65 72 79   */.} MatchQuery
12460 3b 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 71  ;../*.** Run a q
12470 75 65 72 79 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  uery looking for
12480 20 74 68 65 20 62 65 73 74 20 6d 61 74 63 68 65   the best matche
12490 73 20 61 67 61 69 6e 73 74 20 7a 50 61 74 74 65  s against zPatte
124a0 72 6e 20 75 73 69 6e 67 0a 2a 2a 20 7a 48 61 73  rn using.** zHas
124b0 68 20 61 73 20 74 68 65 20 63 68 61 72 61 63 74  h as the charact
124c0 65 72 20 63 6c 61 73 73 20 73 65 65 64 20 68 61  er class seed ha
124d0 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sh..*/.static vo
124e0 69 64 20 73 70 65 6c 6c 66 69 78 31 52 75 6e 51  id spellfix1RunQ
124f0 75 65 72 79 28 4d 61 74 63 68 51 75 65 72 79 20  uery(MatchQuery 
12500 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
12510 7a 51 75 65 72 79 2c 20 69 6e 74 20 6e 51 75 65  zQuery, int nQue
12520 72 79 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ry){.  const cha
12530 72 20 2a 7a 4b 31 3b 0a 20 20 63 6f 6e 73 74 20  r *zK1;.  const 
12540 63 68 61 72 20 2a 7a 57 6f 72 64 3b 0a 20 20 69  char *zWord;.  i
12550 6e 74 20 69 44 69 73 74 3b 0a 20 20 69 6e 74 20  nt iDist;.  int 
12560 69 52 61 6e 6b 3b 0a 20 20 69 6e 74 20 69 53 63  iRank;.  int iSc
12570 6f 72 65 3b 0a 20 20 69 6e 74 20 69 57 6f 72 73  ore;.  int iWors
12580 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 64 78  t = 0;.  int idx
12590 3b 0a 20 20 69 6e 74 20 69 64 78 57 6f 72 73 74  ;.  int idxWorst
125a0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 3b 0a   = -1;.  int i;.
125b0 20 20 69 6e 74 20 69 53 63 6f 70 65 20 3d 20 70    int iScope = p
125c0 2d 3e 69 53 63 6f 70 65 3b 0a 20 20 73 70 65 6c  ->iScope;.  spel
125d0 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
125e0 75 72 20 3d 20 70 2d 3e 70 43 75 72 3b 0a 20 20  ur = p->pCur;.  
125f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
12600 74 6d 74 20 3d 20 70 2d 3e 70 53 74 6d 74 3b 0a  tmt = p->pStmt;.
12610 20 20 63 68 61 72 20 7a 48 61 73 68 31 5b 53 50    char zHash1[SP
12620 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b  ELLFIX_MX_HASH];
12630 0a 20 20 63 68 61 72 20 7a 48 61 73 68 32 5b 53  .  char zHash2[S
12640 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d  PELLFIX_MX_HASH]
12650 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6c 61 73 73  ;.  char *zClass
12660 3b 0a 20 20 69 6e 74 20 6e 43 6c 61 73 73 3b 0a  ;.  int nClass;.
12670 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
12680 20 70 43 75 72 2d 3e 61 3d 3d 30 20 7c 7c 20 70   pCur->a==0 || p
12690 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 20 20  ->rc ) return;  
126a0 20 2f 2a 20 50 72 69 6f 72 20 6d 65 6d 6f 72 79   /* Prior memory
126b0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
126c0 75 72 65 20 2a 2f 0a 20 20 7a 43 6c 61 73 73 20  ure */.  zClass 
126d0 3d 20 28 63 68 61 72 2a 29 70 68 6f 6e 65 74 69  = (char*)phoneti
126e0 63 48 61 73 68 28 28 75 6e 73 69 67 6e 65 64 20  cHash((unsigned 
126f0 63 68 61 72 2a 29 7a 51 75 65 72 79 2c 20 6e 51  char*)zQuery, nQ
12700 75 65 72 79 29 3b 0a 20 20 69 66 28 20 7a 43 6c  uery);.  if( zCl
12710 61 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ass==0 ){.    p-
12720 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
12730 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
12740 20 20 7d 0a 20 20 6e 43 6c 61 73 73 20 3d 20 28    }.  nClass = (
12750 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43 6c 61 73  int)strlen(zClas
12760 73 29 3b 0a 20 20 69 66 28 20 6e 43 6c 61 73 73  s);.  if( nClass
12770 3e 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53  >SPELLFIX_MX_HAS
12780 48 2d 32 20 29 7b 0a 20 20 20 20 6e 43 6c 61 73  H-2 ){.    nClas
12790 73 20 3d 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  s = SPELLFIX_MX_
127a0 48 41 53 48 2d 32 3b 0a 20 20 20 20 7a 43 6c 61  HASH-2;.    zCla
127b0 73 73 5b 6e 43 6c 61 73 73 5d 20 3d 20 30 3b 0a  ss[nClass] = 0;.
127c0 20 20 7d 0a 20 20 69 66 28 20 6e 43 6c 61 73 73    }.  if( nClass
127d0 3c 3d 69 53 63 6f 70 65 20 29 7b 0a 20 20 20 20  <=iScope ){.    
127e0 69 66 28 20 6e 43 6c 61 73 73 3e 32 20 29 7b 0a  if( nClass>2 ){.
127f0 20 20 20 20 20 20 69 53 63 6f 70 65 20 3d 20 6e        iScope = n
12800 43 6c 61 73 73 2d 31 3b 0a 20 20 20 20 7d 65 6c  Class-1;.    }el
12810 73 65 7b 0a 20 20 20 20 20 20 69 53 63 6f 70 65  se{.      iScope
12820 20 3d 20 6e 43 6c 61 73 73 3b 0a 20 20 20 20 7d   = nClass;.    }
12830 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 48  .  }.  memcpy(zH
12840 61 73 68 31 2c 20 7a 43 6c 61 73 73 2c 20 69 53  ash1, zClass, iS
12850 63 6f 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  cope);.  sqlite3
12860 5f 66 72 65 65 28 7a 43 6c 61 73 73 29 3b 0a 20  _free(zClass);. 
12870 20 7a 48 61 73 68 31 5b 69 53 63 6f 70 65 5d 20   zHash1[iScope] 
12880 3d 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 48  = 0;.  memcpy(zH
12890 61 73 68 32 2c 20 7a 48 61 73 68 31 2c 20 69 53  ash2, zHash1, iS
128a0 63 6f 70 65 29 3b 0a 20 20 7a 48 61 73 68 32 5b  cope);.  zHash2[
128b0 69 53 63 6f 70 65 5d 20 3d 20 27 5a 27 3b 0a 20  iScope] = 'Z';. 
128c0 20 7a 48 61 73 68 32 5b 69 53 63 6f 70 65 2b 31   zHash2[iScope+1
128d0 5d 20 3d 20 30 3b 0a 23 69 66 20 53 50 45 4c 4c  ] = 0;.#if SPELL
128e0 46 49 58 5f 4d 58 5f 52 55 4e 3e 31 0a 20 20 66  FIX_MX_RUN>1.  f
128f0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 75  or(i=0; i<p->nRu
12900 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
12910 20 73 74 72 63 6d 70 28 70 2d 3e 61 7a 50 72 69   strcmp(p->azPri
12920 6f 72 5b 69 5d 2c 20 7a 48 61 73 68 31 29 3d 3d  or[i], zHash1)==
12930 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
12940 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
12950 20 70 2d 3e 6e 52 75 6e 3c 53 50 45 4c 4c 46 49   p->nRun<SPELLFI
12960 58 5f 4d 58 5f 52 55 4e 20 29 3b 0a 20 20 6d 65  X_MX_RUN );.  me
12970 6d 63 70 79 28 70 2d 3e 61 7a 50 72 69 6f 72 5b  mcpy(p->azPrior[
12980 70 2d 3e 6e 52 75 6e 2b 2b 5d 2c 20 7a 48 61 73  p->nRun++], zHas
12990 68 31 2c 20 69 53 63 6f 70 65 2b 31 29 3b 0a 20  h1, iScope+1);. 
129a0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 62 69 6e   if( sqlite3_bin
129b0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
129c0 20 7a 48 61 73 68 31 2c 20 2d 31 2c 20 53 51 4c   zHash1, -1, SQL
129d0 49 54 45 5f 53 54 41 54 49 43 29 3d 3d 53 51 4c  ITE_STATIC)==SQL
129e0 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 7c 7c 20  ITE_NOMEM.   || 
129f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
12a00 74 28 70 53 74 6d 74 2c 20 32 2c 20 7a 48 61 73  t(pStmt, 2, zHas
12a10 68 32 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  h2, -1, SQLITE_S
12a20 54 41 54 49 43 29 3d 3d 53 51 4c 49 54 45 5f 4e  TATIC)==SQLITE_N
12a30 4f 4d 45 4d 0a 20 20 29 7b 0a 20 20 20 20 70 2d  OMEM.  ){.    p-
12a40 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
12a50 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
12a60 20 20 7d 0a 23 69 66 20 53 50 45 4c 4c 46 49 58    }.#if SPELLFIX
12a70 5f 4d 58 5f 52 55 4e 3e 31 0a 20 20 66 6f 72 28  _MX_RUN>1.  for(
12a80 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f  i=0; i<pCur->nRo
12a90 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  w; i++){.    if(
12aa0 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f   pCur->a[i].iSco
12ab0 72 65 3e 69 57 6f 72 73 74 20 29 7b 0a 20 20 20  re>iWorst ){.   
12ac0 20 20 20 69 57 6f 72 73 74 20 3d 20 70 43 75 72     iWorst = pCur
12ad0 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72 65 3b 0a 20  ->a[i].iScore;. 
12ae0 20 20 20 20 20 69 64 78 57 6f 72 73 74 20 3d 20       idxWorst = 
12af0 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  i;.    }.  }.#en
12b00 64 69 66 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  dif.  while( sql
12b10 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
12b20 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
12b30 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c 65      int iMatchle
12b40 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 69 52 61 6e  n = -1;.    iRan
12b50 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  k = sqlite3_colu
12b60 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29  mn_int(pStmt, 2)
12b70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4d 61  ;.    if( p->pMa
12b80 74 63 68 53 74 72 33 20 29 7b 0a 20 20 20 20 20  tchStr3 ){.     
12b90 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 73 71 6c   int nWord = sql
12ba0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
12bb0 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  s(pStmt, 1);.   
12bc0 20 20 20 7a 57 6f 72 64 20 3d 20 28 63 6f 6e 73     zWord = (cons
12bd0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
12be0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
12bf0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 44 69  t, 1);.      iDi
12c00 73 74 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f  st = editDist3Co
12c10 72 65 28 70 2d 3e 70 4d 61 74 63 68 53 74 72 33  re(p->pMatchStr3
12c20 2c 20 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20  , zWord, nWord, 
12c30 70 2d 3e 70 4c 61 6e 67 2c 20 26 69 4d 61 74 63  p->pLang, &iMatc
12c40 68 6c 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  hlen);.    }else
12c50 7b 0a 20 20 20 20 20 20 7a 4b 31 20 3d 20 28 63  {.      zK1 = (c
12c60 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
12c70 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
12c80 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20 20 20 20  Stmt, 3);.      
12c90 69 66 28 20 7a 4b 31 3d 3d 30 20 29 20 63 6f 6e  if( zK1==0 ) con
12ca0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 44 69  tinue;.      iDi
12cb0 73 74 20 3d 20 65 64 69 74 64 69 73 74 31 28 70  st = editdist1(p
12cc0 2d 3e 7a 50 61 74 74 65 72 6e 2c 20 7a 4b 31 2c  ->zPattern, zK1,
12cd0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
12ce0 66 28 20 69 44 69 73 74 3c 30 20 29 7b 0a 20 20  f( iDist<0 ){.  
12cf0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
12d00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
12d10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12d20 20 70 43 75 72 2d 3e 6e 53 65 61 72 63 68 2b 2b   pCur->nSearch++
12d30 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  ;.    .    /* If
12d40 20 74 68 65 72 65 20 69 73 20 61 20 22 64 69 73   there is a "dis
12d50 74 61 6e 63 65 20 3c 20 24 64 69 73 74 22 20 6f  tance < $dist" o
12d60 72 20 22 64 69 73 74 61 6e 63 65 20 3c 3d 20 24  r "distance <= $
12d70 64 69 73 74 22 20 63 6f 6e 73 74 72 61 69 6e 74  dist" constraint
12d80 2c 0a 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 69  ,.    ** check i
12d90 66 20 74 68 69 73 20 72 6f 77 20 6d 65 65 74 73  f this row meets
12da0 20 69 74 2e 20 49 66 20 6e 6f 74 2c 20 6a 75 6d   it. If not, jum
12db0 70 20 62 61 63 6b 20 75 70 20 74 6f 20 74 68 65  p back up to the
12dc0 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20 20   top of the.    
12dd0 2a 2a 20 6c 6f 6f 70 20 74 6f 20 70 72 6f 63 65  ** loop to proce
12de0 73 73 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e  ss the next row.
12df0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
12e00 68 65 20 72 6f 77 20 64 6f 65 73 20 6d 61 74 63  he row does matc
12e10 68 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 69 73  h the.    ** dis
12e20 74 61 6e 63 65 20 63 6f 6e 73 74 72 61 69 6e 74  tance constraint
12e30 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 70  , check if the p
12e40 43 75 72 2d 3e 61 5b 5d 20 61 72 72 61 79 20 69  Cur->a[] array i
12e50 73 20 61 6c 72 65 61 64 79 20 66 75 6c 6c 2e 0a  s already full..
12e60 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20      ** If it is 
12e70 61 6e 64 20 6e 6f 20 65 78 70 6c 69 63 69 74 20  and no explicit 
12e80 22 74 6f 70 20 3d 20 3f 22 20 63 6f 6e 73 74 72  "top = ?" constr
12e90 61 69 6e 74 20 77 61 73 20 70 72 65 73 65 6e 74  aint was present
12ea0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 71   in the.    ** q
12eb0 75 65 72 79 2c 20 67 72 6f 77 20 74 68 65 20 61  uery, grow the a
12ec0 72 72 61 79 20 74 6f 20 65 6e 73 75 72 65 20 74  rray to ensure t
12ed0 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
12ee0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 2e 20   the new entry. 
12ef0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
12f00 70 2d 3e 69 4d 61 78 44 69 73 74 3e 3d 30 29 3d  p->iMaxDist>=0)=
12f10 3d 28 28 70 43 75 72 2d 3e 69 64 78 4e 75 6d 20  =((pCur->idxNum 
12f20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  & SPELLFIX_IDXNU
12f30 4d 5f 44 49 53 54 29 20 3f 20 31 20 3a 20 30 29  M_DIST) ? 1 : 0)
12f40 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   );.    if( p->i
12f50 4d 61 78 44 69 73 74 3e 3d 30 20 29 7b 0a 20 20  MaxDist>=0 ){.  
12f60 20 20 20 20 69 66 28 20 69 44 69 73 74 3e 70 2d      if( iDist>p-
12f70 3e 69 4d 61 78 44 69 73 74 20 29 20 63 6f 6e 74  >iMaxDist ) cont
12f80 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
12f90 70 43 75 72 2d 3e 6e 52 6f 77 3e 3d 70 43 75 72  pCur->nRow>=pCur
12fa0 2d 3e 6e 41 6c 6c 6f 63 20 26 26 20 28 70 43 75  ->nAlloc && (pCu
12fb0 72 2d 3e 69 64 78 4e 75 6d 20 26 20 53 50 45 4c  r->idxNum & SPEL
12fc0 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 54 4f 50 29  LFIX_IDXNUM_TOP)
12fd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
12fe0 70 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75  pellfix1ResizeCu
12ff0 72 73 6f 72 28 70 43 75 72 2c 20 70 43 75 72 2d  rsor(pCur, pCur-
13000 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 29 3b  >nAlloc*2 + 10);
13010 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
13020 72 2d 3e 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b  r->a==0 ) break;
13030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
13040 20 20 20 20 69 53 63 6f 72 65 20 3d 20 73 70 65      iScore = spe
13050 6c 6c 66 69 78 31 53 63 6f 72 65 28 69 44 69 73  llfix1Score(iDis
13060 74 2c 69 52 61 6e 6b 29 3b 0a 20 20 20 20 69 66  t,iRank);.    if
13070 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3c 70 43 75  ( pCur->nRow<pCu
13080 72 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  r->nAlloc ){.   
13090 20 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 6e     idx = pCur->n
130a0 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Row;.    }else i
130b0 66 28 20 69 53 63 6f 72 65 3c 69 57 6f 72 73 74  f( iScore<iWorst
130c0 20 29 7b 0a 20 20 20 20 20 20 69 64 78 20 3d 20   ){.      idx = 
130d0 69 64 78 57 6f 72 73 74 3b 0a 20 20 20 20 20 20  idxWorst;.      
130e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
130f0 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64 29  r->a[idx].zWord)
13100 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13110 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
13120 20 7d 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b   }..    pCur->a[
13130 69 64 78 5d 2e 7a 57 6f 72 64 20 3d 20 73 71 6c  idx].zWord = sql
13140 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
13150 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
13160 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
13170 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
13180 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64 3d 3d 30  >a[idx].zWord==0
13190 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
131a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
131b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
131c0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69   }.    pCur->a[i
131d0 64 78 5d 2e 69 52 6f 77 69 64 20 3d 20 73 71 6c  dx].iRowid = sql
131e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
131f0 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  4(pStmt, 0);.   
13200 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 52   pCur->a[idx].iR
13210 61 6e 6b 20 3d 20 69 52 61 6e 6b 3b 0a 20 20 20  ank = iRank;.   
13220 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 44   pCur->a[idx].iD
13230 69 73 74 61 6e 63 65 20 3d 20 69 44 69 73 74 3b  istance = iDist;
13240 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78  .    pCur->a[idx
13250 5d 2e 69 53 63 6f 72 65 20 3d 20 69 53 63 6f 72  ].iScore = iScor
13260 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69  e;.    pCur->a[i
13270 64 78 5d 2e 69 4d 61 74 63 68 6c 65 6e 20 3d 20  dx].iMatchlen = 
13280 69 4d 61 74 63 68 6c 65 6e 3b 0a 20 20 20 20 6d  iMatchlen;.    m
13290 65 6d 63 70 79 28 70 43 75 72 2d 3e 61 5b 69 64  emcpy(pCur->a[id
132a0 78 5d 2e 7a 48 61 73 68 2c 20 7a 48 61 73 68 31  x].zHash, zHash1
132b0 2c 20 69 53 63 6f 70 65 2b 31 29 3b 0a 20 20 20  , iScope+1);.   
132c0 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3c   if( pCur->nRow<
132d0 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29 20 70  pCur->nAlloc ) p
132e0 43 75 72 2d 3e 6e 52 6f 77 2b 2b 3b 0a 20 20 20  Cur->nRow++;.   
132f0 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3d   if( pCur->nRow=
13300 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  =pCur->nAlloc ){
13310 0a 20 20 20 20 20 20 69 57 6f 72 73 74 20 3d 20  .      iWorst = 
13320 70 43 75 72 2d 3e 61 5b 30 5d 2e 69 53 63 6f 72  pCur->a[0].iScor
13330 65 3b 0a 20 20 20 20 20 20 69 64 78 57 6f 72 73  e;.      idxWors
13340 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  t = 0;.      for
13350 28 69 3d 31 3b 20 69 3c 70 43 75 72 2d 3e 6e 52  (i=1; i<pCur->nR
13360 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; i++){.      
13370 20 20 69 53 63 6f 72 65 20 3d 20 70 43 75 72 2d    iScore = pCur-
13380 3e 61 5b 69 5d 2e 69 53 63 6f 72 65 3b 0a 20 20  >a[i].iScore;.  
13390 20 20 20 20 20 20 69 66 28 20 69 57 6f 72 73 74        if( iWorst
133a0 3c 69 53 63 6f 72 65 20 29 7b 0a 20 20 20 20 20  <iScore ){.     
133b0 20 20 20 20 20 69 57 6f 72 73 74 20 3d 20 69 53       iWorst = iS
133c0 63 6f 72 65 3b 0a 20 20 20 20 20 20 20 20 20 20  core;.          
133d0 69 64 78 57 6f 72 73 74 20 3d 20 69 3b 0a 20 20  idxWorst = i;.  
133e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
133f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
13400 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
13410 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Stmt);.  if( rc 
13420 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a  ) p->rc = rc;.}.
13430 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
13440 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74  ion of the xFilt
13450 65 72 20 6d 65 74 68 6f 64 20 77 6f 72 6b 20 69  er method work i
13460 66 20 74 68 65 20 4d 41 54 43 48 20 74 65 72 6d  f the MATCH term
13470 20 69 73 20 70 72 65 73 65 6e 74 0a 2a 2a 20 61   is present.** a
13480 6e 64 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  nd we are doing 
13490 61 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  a scan..*/.stati
134a0 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46  c int spellfix1F
134b0 69 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 0a 20  ilterForMatch(. 
134c0 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
134d0 72 20 2a 70 43 75 72 2c 0a 20 20 69 6e 74 20 61  r *pCur,.  int a
134e0 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
134f0 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
13500 20 69 6e 74 20 69 64 78 4e 75 6d 20 3d 20 70 43   int idxNum = pC
13510 75 72 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 63 6f  ur->idxNum;.  co
13520 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
13530 72 20 2a 7a 4d 61 74 63 68 54 68 69 73 3b 20 20  r *zMatchThis;  
13540 20 2f 2a 20 52 48 53 20 6f 66 20 74 68 65 20 4d   /* RHS of the M
13550 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ATCH operator */
13560 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  .  EditDist3From
13570 53 74 72 69 6e 67 20 2a 70 4d 61 74 63 68 53 74  String *pMatchSt
13580 72 33 20 3d 20 30 3b 20 2f 2a 20 7a 4d 61 74 63  r3 = 0; /* zMatc
13590 68 54 68 69 73 20 61 73 20 61 6e 20 65 64 69 74  hThis as an edit
135a0 64 69 73 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  dist string */. 
135b0 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b   char *zPattern;
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 69 74 65      /* Translite
135e0 72 61 74 69 6f 6e 20 6f 66 20 7a 4d 61 74 63 68  ration of zMatch
135f0 54 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  This */.  int nP
13600 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20  attern;         
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13620 4c 65 6e 67 74 68 20 6f 66 20 7a 50 61 74 74 65  Length of zPatte
13630 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  rn */.  int iLim
13640 69 74 20 3d 20 32 30 3b 20 20 20 20 20 20 20 20  it = 20;        
13650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
13660 78 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  x number of rows
13670 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
13680 69 6e 74 20 69 53 63 6f 70 65 20 3d 20 33 3b 20  int iScope = 3; 
13690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136a0 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 6d     /* Use this m
136b0 61 6e 79 20 63 68 61 72 61 63 74 65 72 73 20 6f  any characters o
136c0 66 20 7a 43 6c 61 73 73 20 2a 2f 0a 20 20 69 6e  f zClass */.  in
136d0 74 20 69 4c 61 6e 67 20 3d 20 30 3b 20 20 20 20  t iLang = 0;    
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 63 6f 64   /* Language cod
13700 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  e */.  char *zSq
13710 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
13720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
13730 20 6f 66 20 73 68 61 64 6f 77 20 74 61 62 6c 65   of shadow table
13740 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
13750 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
13760 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
13770 2a 20 53 68 61 64 6f 77 20 74 61 62 6c 65 20 71  * Shadow table q
13780 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  uery */.  int rc
13790 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
137b0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
137c0 20 69 6e 74 20 69 64 78 20 3d 20 31 3b 20 20 20   int idx = 1;   
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
137f0 6c 61 62 6c 65 20 66 69 6c 74 65 72 20 70 61 72  lable filter par
13800 61 6d 65 74 65 72 20 2a 2f 0a 20 20 73 70 65 6c  ameter */.  spel
13810 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20  lfix1_vtab *p = 
13820 70 43 75 72 2d 3e 70 56 54 61 62 3b 20 20 20 2f  pCur->pVTab;   /
13830 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 74 61  * The virtual ta
13840 62 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 70 43  ble that owns pC
13850 75 72 20 2a 2f 0a 20 20 4d 61 74 63 68 51 75 65  ur */.  MatchQue
13860 72 79 20 78 3b 20 20 20 20 20 20 20 20 20 20 20  ry x;           
13870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
13880 72 20 70 61 73 73 69 6e 67 20 69 6e 66 6f 20 74  r passing info t
13890 6f 20 52 75 6e 51 75 65 72 79 28 29 20 2a 2f 0a  o RunQuery() */.
138a0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63  .  /* Load the c
138b0 6f 73 74 20 74 61 62 6c 65 20 69 66 20 77 65 20  ost table if we 
138c0 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79  have not already
138d0 20 64 6f 6e 65 20 73 6f 20 2a 2f 0a 20 20 69 66   done so */.  if
138e0 28 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 21  ( p->zCostTable!
138f0 3d 30 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67  =0 && p->pConfig
13900 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  3==0 ){.    p->p
13910 43 6f 6e 66 69 67 33 20 3d 20 73 71 6c 69 74 65  Config3 = sqlite
13920 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
13930 6f 66 28 70 2d 3e 70 43 6f 6e 66 69 67 33 5b 30  of(p->pConfig3[0
13940 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ]) );.    if( p-
13950 3e 70 43 6f 6e 66 69 67 33 3d 3d 30 20 29 20 72  >pConfig3==0 ) r
13960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13970 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  EM;.    memset(p
13980 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 30 2c 20 73  ->pConfig3, 0, s
13990 69 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e 66 69 67  izeof(p->pConfig
139a0 33 5b 30 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d  3[0]));.    rc =
139b0 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   editDist3Config
139c0 4c 6f 61 64 28 70 2d 3e 70 43 6f 6e 66 69 67 33  Load(p->pConfig3
139d0 2c 20 70 2d 3e 64 62 2c 20 70 2d 3e 7a 43 6f 73  , p->db, p->zCos
139e0 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  tTable);.    if(
139f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13a00 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 78  .  }.  memset(&x
13a10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
13a20 0a 20 20 78 2e 69 53 63 6f 70 65 20 3d 20 33 3b  .  x.iScope = 3;
13a30 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 63 6f    /* Default sco
13a40 70 65 20 69 66 20 6e 6f 6e 65 20 73 70 65 63 69  pe if none speci
13a50 66 69 65 64 20 62 79 20 22 57 48 45 52 45 20 73  fied by "WHERE s
13a60 63 6f 70 65 3d 4e 22 20 2a 2f 0a 20 20 78 2e 69  cope=N" */.  x.i
13a70 4d 61 78 44 69 73 74 20 3d 20 2d 31 3b 20 20 20  MaxDist = -1;   
13a80 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
13a90 65 64 20 65 64 69 74 20 64 69 73 74 61 6e 63 65  ed edit distance
13aa0 20 2a 2f 0a 0a 20 20 69 66 28 20 69 64 78 4e 75   */..  if( idxNu
13ab0 6d 26 32 20 29 7b 0a 20 20 20 20 69 4c 61 6e 67  m&2 ){.    iLang
13ac0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
13ad0 5f 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d  _int(argv[idx++]
13ae0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78  );.  }.  if( idx
13af0 4e 75 6d 26 34 20 29 7b 0a 20 20 20 20 69 4c 69  Num&4 ){.    iLi
13b00 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  mit = sqlite3_va
13b10 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78  lue_int(argv[idx
13b20 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  ++]);.    if( iL
13b30 69 6d 69 74 3c 31 20 29 20 69 4c 69 6d 69 74 20  imit<1 ) iLimit 
13b40 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  = 1;.  }.  if( i
13b50 64 78 4e 75 6d 26 38 20 29 7b 0a 20 20 20 20 78  dxNum&8 ){.    x
13b60 2e 69 53 63 6f 70 65 20 3d 20 73 71 6c 69 74 65  .iScope = sqlite
13b70 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
13b80 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66  [idx++]);.    if
13b90 28 20 78 2e 69 53 63 6f 70 65 3c 31 20 29 20 78  ( x.iScope<1 ) x
13ba0 2e 69 53 63 6f 70 65 20 3d 20 31 3b 0a 20 20 20  .iScope = 1;.   
13bb0 20 69 66 28 20 78 2e 69 53 63 6f 70 65 3e 53 50   if( x.iScope>SP
13bc0 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32  ELLFIX_MX_HASH-2
13bd0 20 29 20 78 2e 69 53 63 6f 70 65 20 3d 20 53 50   ) x.iScope = SP
13be0 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32  ELLFIX_MX_HASH-2
13bf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78 4e  ;.  }.  if( idxN
13c00 75 6d 26 28 31 36 7c 33 32 29 20 29 7b 0a 20 20  um&(16|32) ){.  
13c10 20 20 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 73    x.iMaxDist = s
13c20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
13c30 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20  (argv[idx++]);. 
13c40 20 20 20 69 66 28 20 69 64 78 4e 75 6d 26 31 36     if( idxNum&16
13c50 20 29 20 78 2e 69 4d 61 78 44 69 73 74 2d 2d 3b   ) x.iMaxDist--;
13c60 0a 20 20 20 20 69 66 28 20 78 2e 69 4d 61 78 44  .    if( x.iMaxD
13c70 69 73 74 3c 30 20 29 20 78 2e 69 4d 61 78 44 69  ist<0 ) x.iMaxDi
13c80 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 70  st = 0;.  }.  sp
13c90 65 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73  ellfix1ResetCurs
13ca0 6f 72 28 70 43 75 72 29 3b 0a 20 20 73 70 65 6c  or(pCur);.  spel
13cb0 6c 66 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f  lfix1ResizeCurso
13cc0 72 28 70 43 75 72 2c 20 69 4c 69 6d 69 74 29 3b  r(pCur, iLimit);
13cd0 0a 20 20 7a 4d 61 74 63 68 54 68 69 73 20 3d 20  .  zMatchThis = 
13ce0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13cf0 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
13d00 66 28 20 7a 4d 61 74 63 68 54 68 69 73 3d 3d 30  f( zMatchThis==0
13d10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13d20 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43  _OK;.  if( p->pC
13d30 6f 6e 66 69 67 33 20 29 7b 0a 20 20 20 20 78 2e  onfig3 ){.    x.
13d40 70 4c 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74  pLang = editDist
13d50 33 46 69 6e 64 4c 61 6e 67 28 70 2d 3e 70 43 6f  3FindLang(p->pCo
13d60 6e 66 69 67 33 2c 20 69 4c 61 6e 67 29 3b 0a 20  nfig3, iLang);. 
13d70 20 20 20 70 4d 61 74 63 68 53 74 72 33 20 3d 20     pMatchStr3 = 
13d80 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  editDist3FromStr
13d90 69 6e 67 4e 65 77 28 78 2e 70 4c 61 6e 67 2c 20  ingNew(x.pLang, 
13da0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4d 61  (const char*)zMa
13db0 74 63 68 54 68 69 73 2c 20 2d 31 29 3b 0a 20 20  tchThis, -1);.  
13dc0 20 20 69 66 28 20 70 4d 61 74 63 68 53 74 72 33    if( pMatchStr3
13dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 2e 72  ==0 ){.      x.r
13de0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13df0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6c  ;.      goto fil
13e00 74 65 72 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ter_exit;.    }.
13e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 70    }else{.    x.p
13e20 4c 61 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Lang = 0;.  }.  
13e30 7a 50 61 74 74 65 72 6e 20 3d 20 28 63 68 61 72  zPattern = (char
13e40 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28  *)transliterate(
13e50 7a 4d 61 74 63 68 54 68 69 73 2c 20 73 71 6c 69  zMatchThis, sqli
13e60 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
13e70 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 73 71 6c  argv[0]));.  sql
13e80 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
13e90 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 70 43 75  zPattern);.  pCu
13ea0 72 2d 3e 7a 50 61 74 74 65 72 6e 20 3d 20 7a 50  r->zPattern = zP
13eb0 61 74 74 65 72 6e 3b 0a 20 20 69 66 28 20 7a 50  attern;.  if( zP
13ec0 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20  attern==0 ){.   
13ed0 20 78 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   x.rc = SQLITE_N
13ee0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66  OMEM;.    goto f
13ef0 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20 20 7d 0a  ilter_exit;.  }.
13f00 20 20 6e 50 61 74 74 65 72 6e 20 3d 20 28 69 6e    nPattern = (in
13f10 74 29 73 74 72 6c 65 6e 28 7a 50 61 74 74 65 72  t)strlen(zPatter
13f20 6e 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65  n);.  if( zPatte
13f30 72 6e 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3d 3d  rn[nPattern-1]==
13f40 27 2a 27 20 29 20 6e 50 61 74 74 65 72 6e 2d 2d  '*' ) nPattern--
13f50 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
13f60 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
13f70 20 22 53 45 4c 45 43 54 20 69 64 2c 20 77 6f 72   "SELECT id, wor
13f80 64 2c 20 72 61 6e 6b 2c 20 6b 31 22 0a 20 20 20  d, rank, k1".   
13f90 20 20 22 20 20 46 52 4f 4d 20 5c 22 25 77 5c 22    "  FROM \"%w\"
13fa0 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22 0a 20  .\"%w_vocab\"". 
13fb0 20 20 20 20 22 20 57 48 45 52 45 20 6c 61 6e 67      " WHERE lang
13fc0 69 64 3d 25 64 20 41 4e 44 20 6b 32 3e 3d 3f 31  id=%d AND k2>=?1
13fd0 20 41 4e 44 20 6b 32 3c 3f 32 22 2c 0a 20 20 20   AND k2<?2",.   
13fe0 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d    p->zDbName, p-
13ff0 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 69 4c 61  >zTableName, iLa
14000 6e 67 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 53  ng.  );.  if( zS
14010 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 78 2e 72  ql==0 ){.    x.r
14020 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14030 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b  ;.    pStmt = 0;
14040 0a 20 20 20 20 67 6f 74 6f 20 66 69 6c 74 65 72  .    goto filter
14050 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 72 63 20  _exit;.  }.  rc 
14060 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
14070 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
14080 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
14090 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
140a0 28 7a 53 71 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  (zSql);.  pCur->
140b0 69 4c 61 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a 20  iLang = iLang;. 
140c0 20 78 2e 70 43 75 72 20 3d 20 70 43 75 72 3b 0a   x.pCur = pCur;.
140d0 20 20 78 2e 70 53 74 6d 74 20 3d 20 70 53 74 6d    x.pStmt = pStm
140e0 74 3b 0a 20 20 78 2e 7a 50 61 74 74 65 72 6e 20  t;.  x.zPattern 
140f0 3d 20 7a 50 61 74 74 65 72 6e 3b 0a 20 20 78 2e  = zPattern;.  x.
14100 6e 50 61 74 74 65 72 6e 20 3d 20 6e 50 61 74 74  nPattern = nPatt
14110 65 72 6e 3b 0a 20 20 78 2e 70 4d 61 74 63 68 53  ern;.  x.pMatchS
14120 74 72 33 20 3d 20 70 4d 61 74 63 68 53 74 72 33  tr3 = pMatchStr3
14130 3b 0a 20 20 78 2e 69 4c 61 6e 67 20 3d 20 69 4c  ;.  x.iLang = iL
14140 61 6e 67 3b 0a 20 20 78 2e 72 63 20 3d 20 72 63  ang;.  x.rc = rc
14150 3b 0a 20 20 78 2e 70 43 6f 6e 66 69 67 33 20 3d  ;.  x.pConfig3 =
14160 20 70 2d 3e 70 43 6f 6e 66 69 67 33 3b 0a 20 20   p->pConfig3;.  
14170 69 66 28 20 78 2e 72 63 3d 3d 53 51 4c 49 54 45  if( x.rc==SQLITE
14180 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 70 65 6c 6c  _OK ){.    spell
14190 66 69 78 31 52 75 6e 51 75 65 72 79 28 26 78 2c  fix1RunQuery(&x,
141a0 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61 74 74   zPattern, nPatt
141b0 65 72 6e 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ern);.  }..  if(
141c0 20 70 43 75 72 2d 3e 61 20 29 7b 0a 20 20 20 20   pCur->a ){.    
141d0 71 73 6f 72 74 28 70 43 75 72 2d 3e 61 2c 20 70  qsort(pCur->a, p
141e0 43 75 72 2d 3e 6e 52 6f 77 2c 20 73 69 7a 65 6f  Cur->nRow, sizeo
141f0 66 28 70 43 75 72 2d 3e 61 5b 30 5d 29 2c 20 73  f(pCur->a[0]), s
14200 70 65 6c 6c 66 69 78 31 52 6f 77 43 6f 6d 70 61  pellfix1RowCompa
14210 72 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  re);.    pCur->i
14220 54 6f 70 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20  Top = iLimit;.  
14230 20 20 70 43 75 72 2d 3e 69 53 63 6f 70 65 20 3d    pCur->iScope =
14240 20 69 53 63 6f 70 65 3b 0a 20 20 7d 65 6c 73 65   iScope;.  }else
14250 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c  {.    x.rc = SQL
14260 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
14270 66 69 6c 74 65 72 5f 65 78 69 74 3a 0a 20 20 73  filter_exit:.  s
14280 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
14290 70 53 74 6d 74 29 3b 0a 20 20 65 64 69 74 44 69  pStmt);.  editDi
142a0 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c  st3FromStringDel
142b0 65 74 65 28 70 4d 61 74 63 68 53 74 72 33 29 3b  ete(pMatchStr3);
142c0 0a 20 20 72 65 74 75 72 6e 20 78 2e 72 63 3b 0a  .  return x.rc;.
142d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  }../*.** This ve
142e0 72 73 69 6f 6e 20 6f 66 20 78 46 69 6c 74 65 72  rsion of xFilter
142f0 20 68 61 6e 64 6c 65 73 20 61 20 66 75 6c 6c 2d   handles a full-
14300 74 61 62 6c 65 20 73 63 61 6e 20 63 61 73 65 0a  table scan case.
14310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
14320 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72  ellfix1FilterFor
14330 46 75 6c 6c 53 63 61 6e 28 0a 20 20 73 70 65 6c  FullScan(.  spel
14340 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
14350 75 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  ur,.  int argc,.
14360 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
14370 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
14380 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14390 20 20 69 6e 74 20 69 64 78 4e 75 6d 20 3d 20 70    int idxNum = p
143a0 43 75 72 2d 3e 69 64 78 4e 75 6d 3b 0a 20 20 63  Cur->idxNum;.  c
143b0 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 70 65  har *zSql;.  spe
143c0 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 56 54  llfix1_vtab *pVT
143d0 61 62 20 3d 20 70 43 75 72 2d 3e 70 56 54 61 62  ab = pCur->pVTab
143e0 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73  ;.  spellfix1Res
143f0 65 74 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  etCursor(pCur);.
14400 20 20 61 73 73 65 72 74 28 20 69 64 78 4e 75 6d    assert( idxNum
14410 3d 3d 30 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d 36  ==0 || idxNum==6
14420 34 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  4 );.  zSql = sq
14430 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
14440 20 20 20 20 22 53 45 4c 45 43 54 20 77 6f 72 64      "SELECT word
14450 2c 20 72 61 6e 6b 2c 20 4e 55 4c 4c 2c 20 6c 61  , rank, NULL, la
14460 6e 67 69 64 2c 20 69 64 20 46 52 4f 4d 20 5c 22  ngid, id FROM \"
14470 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c  %w\".\"%w_vocab\
14480 22 25 73 22 2c 0a 20 20 20 20 20 70 56 54 61 62  "%s",.     pVTab
14490 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 56 54 61 62  ->zDbName, pVTab
144a0 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  ->zTableName,.  
144b0 20 20 20 28 28 69 64 78 4e 75 6d 20 26 20 36 34     ((idxNum & 64
144c0 29 20 3f 20 22 20 57 48 45 52 45 20 72 6f 77 69  ) ? " WHERE rowi
144d0 64 3d 3f 22 20 3a 20 22 22 29 0a 20 20 29 3b 0a  d=?" : "").  );.
144e0 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
144f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14500 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  MEM;.  rc = sqli
14510 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
14520 56 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  VTab->db, zSql, 
14530 2d 31 2c 20 26 70 43 75 72 2d 3e 70 46 75 6c 6c  -1, &pCur->pFull
14540 53 63 61 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Scan, 0);.  sqli
14550 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
14560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14570 5f 4f 4b 20 26 26 20 28 69 64 78 4e 75 6d 20 26  _OK && (idxNum &
14580 20 36 34 29 20 29 7b 0a 20 20 20 20 61 73 73 65   64) ){.    asse
14590 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
145a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
145b0 62 69 6e 64 5f 76 61 6c 75 65 28 70 43 75 72 2d  bind_value(pCur-
145c0 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 31 2c 20 61  >pFullScan, 1, a
145d0 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70  rgv[0]);.  }.  p
145e0 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 70 43 75 72  Cur->nRow = pCur
145f0 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66  ->iRow = 0;.  if
14600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14610 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14620 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d 3e 70  te3_step(pCur->p
14630 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20 20 20 69  FullScan);.    i
14640 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  f( rc==SQLITE_RO
14650 57 20 29 7b 20 70 43 75 72 2d 3e 69 52 6f 77 20  W ){ pCur->iRow 
14660 3d 20 2d 31 3b 20 72 63 20 3d 20 53 51 4c 49 54  = -1; rc = SQLIT
14670 45 5f 4f 4b 3b 20 7d 0a 20 20 20 20 69 66 28 20  E_OK; }.    if( 
14680 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
14690 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  ){ rc = SQLITE_O
146a0 4b 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  K; }.  }else{.  
146b0 20 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30    pCur->iRow = 0
146c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
146d0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  c;.}.../*.** Cal
146e0 6c 65 64 20 74 6f 20 22 72 65 77 69 6e 64 22 20  led to "rewind" 
146f0 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
14700 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 73   the beginning s
14710 6f 20 74 68 61 74 0a 2a 2a 20 69 74 20 73 74 61  o that.** it sta
14720 72 74 73 20 69 74 73 20 6f 75 74 70 75 74 20 6f  rts its output o
14730 76 65 72 20 61 67 61 69 6e 2e 20 20 41 6c 77 61  ver again.  Alwa
14740 79 73 20 63 61 6c 6c 65 64 20 61 74 20 6c 65 61  ys called at lea
14750 73 74 20 6f 6e 63 65 0a 2a 2a 20 70 72 69 6f 72  st once.** prior
14760 20 74 6f 20 61 6e 79 20 73 70 65 6c 6c 66 69 78   to any spellfix
14770 31 43 6f 6c 75 6d 6e 2c 20 73 70 65 6c 6c 66 69  1Column, spellfi
14780 78 31 52 6f 77 69 64 2c 20 6f 72 20 73 70 65 6c  x1Rowid, or spel
14790 6c 66 69 78 31 45 6f 66 20 63 61 6c 6c 2e 0a 2a  lfix1Eof call..*
147a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
147b0 6c 6c 66 69 78 31 46 69 6c 74 65 72 28 0a 20 20  llfix1Filter(.  
147c0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
147d0 73 6f 72 20 2a 63 75 72 2c 20 0a 20 20 69 6e 74  sor *cur, .  int
147e0 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
147f0 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
14800 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
14810 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
14820 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  .  spellfix1_cur
14830 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65  sor *pCur = (spe
14840 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 29  llfix1_cursor *)
14850 63 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  cur;.  int rc;. 
14860 20 70 43 75 72 2d 3e 69 64 78 4e 75 6d 20 3d 20   pCur->idxNum = 
14870 69 64 78 4e 75 6d 3b 0a 20 20 69 66 28 20 69 64  idxNum;.  if( id
14880 78 4e 75 6d 20 26 20 31 20 29 7b 0a 20 20 20 20  xNum & 1 ){.    
14890 72 63 20 3d 20 73 70 65 6c 6c 66 69 78 31 46 69  rc = spellfix1Fi
148a0 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 70 43 75  lterForMatch(pCu
148b0 72 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a  r, argc, argv);.
148c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
148d0 3d 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65  = spellfix1Filte
148e0 72 46 6f 72 46 75 6c 6c 53 63 61 6e 28 70 43 75  rForFullScan(pCu
148f0 72 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a  r, argc, argv);.
14900 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14910 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  .}.../*.** Advan
14920 63 65 20 61 20 63 75 72 73 6f 72 20 74 6f 20 69  ce a cursor to i
14930 74 73 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 6f  ts next row of o
14940 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  utput.*/.static 
14950 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 4e 65 78  int spellfix1Nex
14960 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  t(sqlite3_vtab_c
14970 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73  ursor *cur){.  s
14980 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
14990 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69  *pCur = (spellfi
149a0 78 31 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b  x1_cursor *)cur;
149b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
149c0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 43 75  TE_OK;.  if( pCu
149d0 72 2d 3e 69 52 6f 77 20 3c 20 70 43 75 72 2d 3e  r->iRow < pCur->
149e0 6e 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28 20  nRow ){.    if( 
149f0 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20  pCur->pFullScan 
14a00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
14a10 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d  lite3_step(pCur-
14a20 3e 70 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20 20  >pFullScan);.   
14a30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14a40 45 5f 52 4f 57 20 29 20 70 43 75 72 2d 3e 69 52  E_ROW ) pCur->iR
14a50 6f 77 20 3d 20 70 43 75 72 2d 3e 6e 52 6f 77 3b  ow = pCur->nRow;
14a60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
14a70 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 72 63 3d  QLITE_ROW || rc=
14a80 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
14a90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14ab0 70 43 75 72 2d 3e 69 52 6f 77 2b 2b 3b 0a 20 20  pCur->iRow++;.  
14ac0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14ad0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
14ae0 74 75 72 6e 20 54 52 55 45 20 69 66 20 77 65 20  turn TRUE if we 
14af0 61 72 65 20 61 74 20 74 68 65 20 65 6e 64 2d 6f  are at the end-o
14b00 66 2d 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63  f-file.*/.static
14b10 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 45 6f   int spellfix1Eo
14b20 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  f(sqlite3_vtab_c
14b30 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73  ursor *cur){.  s
14b40 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
14b50 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69  *pCur = (spellfi
14b60 78 31 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b  x1_cursor *)cur;
14b70 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
14b80 69 52 6f 77 3e 3d 70 43 75 72 2d 3e 6e 52 6f 77  iRow>=pCur->nRow
14b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14ba0 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
14bb0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a  he current row..
14bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
14bd0 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 28 0a 20  ellfix1Column(. 
14be0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
14bf0 72 73 6f 72 20 2a 63 75 72 2c 0a 20 20 73 71 6c  rsor *cur,.  sql
14c00 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
14c10 78 2c 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20  x,.  int i.){.  
14c20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
14c30 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66   *pCur = (spellf
14c40 69 78 31 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b  ix1_cursor*)cur;
14c50 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46 75  .  if( pCur->pFu
14c60 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 69 66  llScan ){.    if
14c70 28 20 69 3c 3d 53 50 45 4c 4c 46 49 58 5f 43 4f  ( i<=SPELLFIX_CO
14c80 4c 5f 4c 41 4e 47 49 44 20 29 7b 0a 20 20 20 20  L_LANGID ){.    
14c90 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14ca0 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69  _value(ctx, sqli
14cb0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
14cc0 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e  (pCur->pFullScan
14cd0 2c 20 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , i));.    }else
14ce0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14cf0 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 74 78 29  result_null(ctx)
14d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14d20 7d 0a 20 20 73 77 69 74 63 68 28 20 69 20 29 7b  }.  switch( i ){
14d30 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
14d40 49 58 5f 43 4f 4c 5f 57 4f 52 44 3a 20 7b 0a 20  IX_COL_WORD: {. 
14d50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
14d60 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43  ult_text(ctx, pC
14d70 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77  ur->a[pCur->iRow
14d80 5d 2e 7a 57 6f 72 64 2c 20 2d 31 2c 20 53 51 4c  ].zWord, -1, SQL
14d90 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
14da0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14db0 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49      case SPELLFI
14dc0 58 5f 43 4f 4c 5f 52 41 4e 4b 3a 20 7b 0a 20 20  X_COL_RANK: {.  
14dd0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
14de0 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72  lt_int(ctx, pCur
14df0 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e  ->a[pCur->iRow].
14e00 69 52 61 6e 6b 29 3b 0a 20 20 20 20 20 20 62 72  iRank);.      br
14e10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14e20 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ase SPELLFIX_COL
14e30 5f 44 49 53 54 41 4e 43 45 3a 20 7b 0a 20 20 20  _DISTANCE: {.   
14e40 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
14e50 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d  t_int(ctx, pCur-
14e60 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69  >a[pCur->iRow].i
14e70 44 69 73 74 61 6e 63 65 29 3b 0a 20 20 20 20 20  Distance);.     
14e80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14e90 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f    case SPELLFIX_
14ea0 43 4f 4c 5f 4c 41 4e 47 49 44 3a 20 7b 0a 20 20  COL_LANGID: {.  
14eb0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
14ec0 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72  lt_int(ctx, pCur
14ed0 2d 3e 69 4c 61 6e 67 29 3b 0a 20 20 20 20 20 20  ->iLang);.      
14ee0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14ef0 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43   case SPELLFIX_C
14f00 4f 4c 5f 53 43 4f 52 45 3a 20 7b 0a 20 20 20 20  OL_SCORE: {.    
14f10 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14f20 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e  _int(ctx, pCur->
14f30 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 53  a[pCur->iRow].iS
14f40 63 6f 72 65 29 3b 0a 20 20 20 20 20 20 62 72 65  core);.      bre
14f50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14f60 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
14f70 4d 41 54 43 48 4c 45 4e 3a 20 7b 0a 20 20 20 20  MATCHLEN: {.    
14f80 20 20 69 6e 74 20 69 4d 61 74 63 68 6c 65 6e 20    int iMatchlen 
14f90 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e  = pCur->a[pCur->
14fa0 69 52 6f 77 5d 2e 69 4d 61 74 63 68 6c 65 6e 3b  iRow].iMatchlen;
14fb0 0a 20 20 20 20 20 20 69 66 28 20 69 4d 61 74 63  .      if( iMatc
14fc0 68 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  hlen<0 ){.      
14fd0 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 20 3d    int nPattern =
14fe0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 43 75   (int)strlen(pCu
14ff0 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  r->zPattern);.  
15000 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 6f 72        char *zWor
15010 64 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75 72  d = pCur->a[pCur
15020 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64 3b 0a 20  ->iRow].zWord;. 
15030 20 20 20 20 20 20 20 69 6e 74 20 6e 57 6f 72 64         int nWord
15040 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
15050 57 6f 72 64 29 3b 0a 0a 20 20 20 20 20 20 20 20  Word);..        
15060 69 66 28 20 6e 50 61 74 74 65 72 6e 3e 30 20 26  if( nPattern>0 &
15070 26 20 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e  & pCur->zPattern
15080 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3d 3d 27 2a  [nPattern-1]=='*
15090 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ' ){.          c
150a0 68 61 72 20 2a 7a 54 72 61 6e 73 6c 69 74 3b 0a  har *zTranslit;.
150b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65            int re
150c0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 72  s;.          zTr
150d0 61 6e 73 6c 69 74 20 3d 20 28 63 68 61 72 20 2a  anslit = (char *
150e0 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 28  )transliterate((
150f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
15100 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20  zWord, nWord);. 
15110 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 54           if( !zT
15120 72 61 6e 73 6c 69 74 20 29 20 72 65 74 75 72 6e  ranslit ) return
15130 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15140 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 65           res = e
15150 64 69 74 64 69 73 74 31 28 70 43 75 72 2d 3e 7a  ditdist1(pCur->z
15160 50 61 74 74 65 72 6e 2c 20 7a 54 72 61 6e 73 6c  Pattern, zTransl
15170 69 74 2c 20 26 69 4d 61 74 63 68 6c 65 6e 29 3b  it, &iMatchlen);
15180 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15190 65 33 5f 66 72 65 65 28 7a 54 72 61 6e 73 6c 69  e3_free(zTransli
151a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
151b0 28 20 72 65 73 3c 30 20 29 20 72 65 74 75 72 6e  ( res<0 ) return
151c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
151d0 20 20 20 20 20 20 20 20 20 69 4d 61 74 63 68 6c           iMatchl
151e0 65 6e 20 3d 20 74 72 61 6e 73 6c 65 6e 5f 74 6f  en = translen_to
151f0 5f 63 68 61 72 6c 65 6e 28 7a 57 6f 72 64 2c 20  _charlen(zWord, 
15200 6e 57 6f 72 64 2c 20 69 4d 61 74 63 68 6c 65 6e  nWord, iMatchlen
15210 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
15220 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4d 61 74  {.          iMat
15230 63 68 6c 65 6e 20 3d 20 75 74 66 38 43 68 61 72  chlen = utf8Char
15240 6c 65 6e 28 7a 57 6f 72 64 2c 20 6e 57 6f 72 64  len(zWord, nWord
15250 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15260 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
15270 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
15280 74 78 2c 20 69 4d 61 74 63 68 6c 65 6e 29 3b 0a  tx, iMatchlen);.
15290 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
152a0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c   }.    case SPEL
152b0 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e 45 48 41  LFIX_COL_PHONEHA
152c0 53 48 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SH: {.      sqli
152d0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
152e0 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75  ctx, pCur->a[pCu
152f0 72 2d 3e 69 52 6f 77 5d 2e 7a 48 61 73 68 2c 20  r->iRow].zHash, 
15300 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
15310 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
15320 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15330 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54 4f 50  SPELLFIX_COL_TOP
15340 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
15350 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
15360 2c 20 70 43 75 72 2d 3e 69 54 6f 70 29 3b 0a 20  , pCur->iTop);. 
15370 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15380 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c  }.    case SPELL
15390 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 3a 20 7b  FIX_COL_SCOPE: {
153a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
153b0 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70  esult_int(ctx, p
153c0 43 75 72 2d 3e 69 53 63 6f 70 65 29 3b 0a 20 20  Cur->iScope);.  
153d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
153e0 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
153f0 49 58 5f 43 4f 4c 5f 53 52 43 48 43 4e 54 3a 20  IX_COL_SRCHCNT: 
15400 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
15410 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20  result_int(ctx, 
15420 70 43 75 72 2d 3e 6e 53 65 61 72 63 68 29 3b 0a  pCur->nSearch);.
15430 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15440 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
15450 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
15460 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 74 78 29  result_null(ctx)
15470 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15480 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15490 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
154a0 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64 2e  /*.** The rowid.
154b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
154c0 70 65 6c 6c 66 69 78 31 52 6f 77 69 64 28 73 71  pellfix1Rowid(sq
154d0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
154e0 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f 69  r *cur, sqlite_i
154f0 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20  nt64 *pRowid){. 
15500 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
15510 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c  r *pCur = (spell
15520 66 69 78 31 5f 63 75 72 73 6f 72 2a 29 63 75 72  fix1_cursor*)cur
15530 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46  ;.  if( pCur->pF
15540 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 2a  ullScan ){.    *
15550 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  pRowid = sqlite3
15560 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 43  _column_int64(pC
15570 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 34  ur->pFullScan, 4
15580 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15590 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72 2d 3e  *pRowid = pCur->
155a0 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 52  a[pCur->iRow].iR
155b0 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  owid;.  }.  retu
155c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
155d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
155e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
155f0 79 20 74 68 65 20 78 55 70 64 61 74 65 28 29 20  y the xUpdate() 
15600 6d 65 74 68 6f 64 2e 20 49 74 20 72 65 74 75 72  method. It retur
15610 6e 73 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 63  ns a string.** c
15620 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
15630 6e 66 6c 69 63 74 20 6d 6f 64 65 20 74 68 61 74  nflict mode that
15640 20 78 55 70 64 61 74 65 28 29 20 73 68 6f 75 6c   xUpdate() shoul
15650 64 20 75 73 65 20 66 6f 72 20 74 68 65 20 63 75  d use for the cu
15660 72 72 65 6e 74 0a 2a 2a 20 6f 70 65 72 61 74 69  rrent.** operati
15670 6f 6e 2e 20 4f 6e 65 20 6f 66 3a 20 22 52 4f 4c  on. One of: "ROL
15680 4c 42 41 43 4b 22 2c 20 22 49 47 4e 4f 52 45 22  LBACK", "IGNORE"
15690 2c 20 22 41 42 4f 52 54 22 20 6f 72 20 22 52 45  , "ABORT" or "RE
156a0 50 4c 41 43 45 22 2e 0a 2a 2f 0a 73 74 61 74 69  PLACE"..*/.stati
156b0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 70  c const char *sp
156c0 65 6c 6c 66 69 78 31 47 65 74 43 6f 6e 66 6c 69  ellfix1GetConfli
156d0 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ct(sqlite3 *db){
156e0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
156f0 63 68 61 72 20 2a 61 7a 43 6f 6e 66 6c 69 63 74  char *azConflict
15700 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 4e 6f  [] = {.    /* No
15710 74 65 3a 20 49 6e 73 74 65 61 64 20 6f 66 20 22  te: Instead of "
15720 46 41 49 4c 22 20 2d 20 22 41 42 4f 52 54 22 2e  FAIL" - "ABORT".
15730 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43   */.    "ROLLBAC
15740 4b 22 2c 20 22 49 47 4e 4f 52 45 22 2c 20 22 41  K", "IGNORE", "A
15750 42 4f 52 54 22 2c 20 22 41 42 4f 52 54 22 2c 20  BORT", "ABORT", 
15760 22 52 45 50 4c 41 43 45 22 0a 20 20 7d 3b 0a 20  "REPLACE".  };. 
15770 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63 74 20 3d   int eConflict =
15780 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 6f 6e   sqlite3_vtab_on
15790 5f 63 6f 6e 66 6c 69 63 74 28 64 62 29 3b 0a 0a  _conflict(db);..
157a0 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e 66 6c    assert( eConfl
157b0 69 63 74 3d 3d 53 51 4c 49 54 45 5f 52 4f 4c 4c  ict==SQLITE_ROLL
157c0 42 41 43 4b 20 7c 7c 20 65 43 6f 6e 66 6c 69 63  BACK || eConflic
157d0 74 3d 3d 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  t==SQLITE_IGNORE
157e0 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 6f 6e 66  .       || eConf
157f0 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f 46 41 49  lict==SQLITE_FAI
15800 4c 20 7c 7c 20 65 43 6f 6e 66 6c 69 63 74 3d 3d  L || eConflict==
15810 53 51 4c 49 54 45 5f 41 42 4f 52 54 0a 20 20 20  SQLITE_ABORT.   
15820 20 20 20 20 7c 7c 20 65 43 6f 6e 66 6c 69 63 74      || eConflict
15830 3d 3d 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  ==SQLITE_REPLACE
15840 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
15850 53 51 4c 49 54 45 5f 52 4f 4c 4c 42 41 43 4b 3d  SQLITE_ROLLBACK=
15860 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
15870 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 3d 3d 32  SQLITE_IGNORE==2
15880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
15890 4c 49 54 45 5f 46 41 49 4c 3d 3d 33 20 29 3b 0a  LITE_FAIL==3 );.
158a0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
158b0 5f 41 42 4f 52 54 3d 3d 34 20 29 3b 0a 20 20 61  _ABORT==4 );.  a
158c0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 52 45  ssert( SQLITE_RE
158d0 50 4c 41 43 45 3d 3d 35 20 29 3b 0a 0a 20 20 72  PLACE==5 );..  r
158e0 65 74 75 72 6e 20 61 7a 43 6f 6e 66 6c 69 63 74  eturn azConflict
158f0 5b 65 43 6f 6e 66 6c 69 63 74 2d 31 5d 3b 0a 7d  [eConflict-1];.}
15900 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64  ../*.** The xUpd
15910 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2f  ate() method..*/
15920 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
15930 6c 66 69 78 31 55 70 64 61 74 65 28 0a 20 20 73  lfix1Update(.  s
15940 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
15950 61 62 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  ab,.  int argc,.
15960 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
15970 2a 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65  **argv,.  sqlite
15980 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 0a 29  _int64 *pRowid.)
15990 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
159a0 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
159b0 33 5f 69 6e 74 36 34 20 72 6f 77 69 64 2c 20 6e  3_int64 rowid, n
159c0 65 77 52 6f 77 69 64 3b 0a 20 20 73 70 65 6c 6c  ewRowid;.  spell
159d0 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28  fix1_vtab *p = (
159e0 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29  spellfix1_vtab*)
159f0 70 56 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVTab;.  sqlite3
15a00 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
15a10 20 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a   if( argc==1 ){.
15a20 20 20 20 20 2f 2a 20 41 20 64 65 6c 65 74 65 20      /* A delete 
15a30 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
15a40 20 72 6f 77 69 64 20 67 69 76 65 6e 20 62 79 20   rowid given by 
15a50 61 72 67 76 5b 30 5d 20 2a 2f 0a 20 20 20 20 72  argv[0] */.    r
15a60 6f 77 69 64 20 3d 20 2a 70 52 6f 77 69 64 20 3d  owid = *pRowid =
15a70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
15a80 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
15a90 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78     spellfix1DbEx
15aa0 65 63 28 26 72 63 2c 20 64 62 2c 20 22 44 45 4c  ec(&rc, db, "DEL
15ab0 45 54 45 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e  ETE FROM \"%w\".
15ac0 5c 22 25 77 5f 76 6f 63 61 62 5c 22 20 22 0a 20  \"%w_vocab\" ". 
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
15af0 45 20 69 64 3d 25 6c 6c 64 22 2c 0a 20 20 20 20  E id=%lld",.    
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
15b10 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61  >zDbName, p->zTa
15b20 62 6c 65 4e 61 6d 65 2c 20 72 6f 77 69 64 29 3b  bleName, rowid);
15b30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
15b40 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
15b50 72 20 2a 7a 57 6f 72 64 20 3d 20 73 71 6c 69 74  r *zWord = sqlit
15b60 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
15b70 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  gv[SPELLFIX_COL_
15b80 57 4f 52 44 2b 32 5d 29 3b 0a 20 20 20 20 69 6e  WORD+2]);.    in
15b90 74 20 6e 57 6f 72 64 20 3d 20 73 71 6c 69 74 65  t nWord = sqlite
15ba0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
15bb0 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  gv[SPELLFIX_COL_
15bc0 57 4f 52 44 2b 32 5d 29 3b 0a 20 20 20 20 69 6e  WORD+2]);.    in
15bd0 74 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74 65  t iLang = sqlite
15be0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
15bf0 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41  [SPELLFIX_COL_LA
15c00 4e 47 49 44 2b 32 5d 29 3b 0a 20 20 20 20 69 6e  NGID+2]);.    in
15c10 74 20 69 52 61 6e 6b 20 3d 20 73 71 6c 69 74 65  t iRank = sqlite
15c20 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
15c30 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41  [SPELLFIX_COL_RA
15c40 4e 4b 2b 32 5d 29 3b 0a 20 20 20 20 63 6f 6e 73  NK+2]);.    cons
15c50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
15c60 2a 7a 53 6f 75 6e 64 73 6c 69 6b 65 20 3d 0a 20  *zSoundslike =. 
15c70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15c80 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
15c90 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53  v[SPELLFIX_COL_S
15ca0 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d 29 3b 0a 20  OUNDSLIKE+2]);. 
15cb0 20 20 20 69 6e 74 20 6e 53 6f 75 6e 64 73 6c 69     int nSoundsli
15cc0 6b 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ke = sqlite3_val
15cd0 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 53 50  ue_bytes(argv[SP
15ce0 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44  ELLFIX_COL_SOUND
15cf0 53 4c 49 4b 45 2b 32 5d 29 3b 0a 20 20 20 20 63  SLIKE+2]);.    c
15d00 68 61 72 20 2a 7a 4b 31 2c 20 2a 7a 4b 32 3b 0a  har *zK1, *zK2;.
15d10 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
15d20 68 61 72 20 63 3b 0a 20 20 20 20 63 6f 6e 73 74  har c;.    const
15d30 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c 69 63 74   char *zConflict
15d40 20 3d 20 73 70 65 6c 6c 66 69 78 31 47 65 74 43   = spellfix1GetC
15d50 6f 6e 66 6c 69 63 74 28 64 62 29 3b 0a 0a 20 20  onflict(db);..  
15d60 20 20 69 66 28 20 7a 57 6f 72 64 3d 3d 30 20 29    if( zWord==0 )
15d70 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72  {.      /* Inser
15d80 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ts of the form: 
15d90 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62   INSERT INTO tab
15da0 6c 65 28 63 6f 6d 6d 61 6e 64 29 20 56 41 4c 55  le(command) VALU
15db0 45 53 28 27 78 79 7a 7a 79 27 29 3b 0a 20 20 20  ES('xyzzy');.   
15dc0 20 20 20 2a 2a 20 63 61 75 73 65 20 7a 57 6f 72     ** cause zWor
15dd0 64 20 74 6f 20 62 65 20 4e 55 4c 4c 2c 20 73 6f  d to be NULL, so
15de0 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20   we look at the 
15df0 22 63 6f 6d 6d 61 6e 64 22 20 63 6f 6c 75 6d 6e  "command" column
15e00 20 74 6f 20 73 65 65 0a 20 20 20 20 20 20 2a 2a   to see.      **
15e10 20 77 68 61 74 20 73 70 65 63 69 61 6c 20 61 63   what special ac
15e20 74 69 6f 6e 73 20 74 6f 20 74 61 6b 65 20 2a 2f  tions to take */
15e30 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
15e40 72 20 2a 7a 43 6d 64 20 3d 20 0a 20 20 20 20 20  r *zCmd = .     
15e50 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
15e60 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
15e70 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49  ext(argv[SPELLFI
15e80 58 5f 43 4f 4c 5f 43 4f 4d 4d 41 4e 44 2b 32 5d  X_COL_COMMAND+2]
15e90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6d  );.      if( zCm
15ea0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
15eb0 70 56 54 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVTab->zErrMsg =
15ec0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
15ed0 28 22 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  ("NOT NULL const
15ee0 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 25 73  raint failed: %s
15ef0 2e 77 6f 72 64 22 2c 0a 20 20 20 20 20 20 20 20  .word",.        
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b   p->zTableName);
15f30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15f40 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
15f50 54 5f 4e 4f 54 4e 55 4c 4c 3b 0a 20 20 20 20 20  T_NOTNULL;.     
15f60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
15f70 63 6d 70 28 7a 43 6d 64 2c 22 72 65 73 65 74 22  cmp(zCmd,"reset"
15f80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15f90 2f 2a 20 52 65 73 65 74 20 74 68 65 20 20 65 64  /* Reset the  ed
15fa0 69 74 20 63 6f 73 74 20 74 61 62 6c 65 20 28 69  it cost table (i
15fb0 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 2e  f there is one).
15fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 64 69 74   */.        edit
15fd0 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74  Dist3ConfigDelet
15fe0 65 28 70 2d 3e 70 43 6f 6e 66 69 67 33 29 3b 0a  e(p->pConfig3);.
15ff0 20 20 20 20 20 20 20 20 70 2d 3e 70 43 6f 6e 66          p->pConf
16000 69 67 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ig3 = 0;.       
16010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16020 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
16030 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 43 6d   if( strncmp(zCm
16040 64 2c 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62  d,"edit_cost_tab
16050 6c 65 3d 22 2c 31 36 29 3d 3d 30 20 29 7b 0a 20  le=",16)==0 ){. 
16060 20 20 20 20 20 20 20 65 64 69 74 44 69 73 74 33         editDist3
16070 43 6f 6e 66 69 67 44 65 6c 65 74 65 28 70 2d 3e  ConfigDelete(p->
16080 70 43 6f 6e 66 69 67 33 29 3b 0a 20 20 20 20 20  pConfig3);.     
16090 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d     p->pConfig3 =
160a0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
160b0 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73  te3_free(p->zCos
160c0 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  tTable);.       
160d0 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d   p->zCostTable =
160e0 20 73 70 65 6c 6c 66 69 78 31 44 65 71 75 6f 74   spellfix1Dequot
160f0 65 28 7a 43 6d 64 2b 31 36 29 3b 0a 20 20 20 20  e(zCmd+16);.    
16100 20 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 73 74      if( p->zCost
16110 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
16120 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
16130 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a          if( p->z
16140 43 6f 73 74 54 61 62 6c 65 5b 30 5d 3d 3d 30 20  CostTable[0]==0 
16150 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
16160 6d 70 28 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65  mp(p->zCostTable
16170 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"null")==0 ){. 
16180 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16190 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54 61  _free(p->zCostTa
161a0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ble);.          
161b0 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d 20  p->zCostTable = 
161c0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
161d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
161e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
161f0 20 20 20 20 20 70 56 54 61 62 2d 3e 7a 45 72 72       pVTab->zErr
16200 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
16210 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 76  rintf("unknown v
16220 61 6c 75 65 20 66 6f 72 20 25 73 2e 63 6f 6d 6d  alue for %s.comm
16230 61 6e 64 3a 20 5c 22 25 77 5c 22 22 2c 0a 20 20  and: \"%w\"",.  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16260 20 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61       p->zTableNa
16270 6d 65 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 20  me, zCmd);.     
16280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
16290 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
162a0 69 66 28 20 69 52 61 6e 6b 3c 31 20 29 20 69 52  if( iRank<1 ) iR
162b0 61 6e 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ank = 1;.    if(
162c0 20 7a 53 6f 75 6e 64 73 6c 69 6b 65 20 29 7b 0a   zSoundslike ){.
162d0 20 20 20 20 20 20 7a 4b 31 20 3d 20 28 63 68 61        zK1 = (cha
162e0 72 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65  r*)transliterate
162f0 28 7a 53 6f 75 6e 64 73 6c 69 6b 65 2c 20 6e 53  (zSoundslike, nS
16300 6f 75 6e 64 73 6c 69 6b 65 29 3b 0a 20 20 20 20  oundslike);.    
16310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 31  }else{.      zK1
16320 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c   = (char*)transl
16330 69 74 65 72 61 74 65 28 7a 57 6f 72 64 2c 20 6e  iterate(zWord, n
16340 57 6f 72 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Word);.    }.   
16350 20 69 66 28 20 7a 4b 31 3d 3d 30 20 29 20 72 65   if( zK1==0 ) re
16360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
16370 4d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  M;.    for(i=0; 
16380 28 63 20 3d 20 7a 4b 31 5b 69 5d 29 21 3d 30 3b  (c = zK1[i])!=0;
16390 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 69 66   i++){.       if
163a0 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27  ( c>='A' && c<='
163b0 5a 27 20 29 20 7a 4b 31 5b 69 5d 20 2b 3d 20 27  Z' ) zK1[i] += '
163c0 61 27 20 2d 20 27 41 27 3b 0a 20 20 20 20 7d 0a  a' - 'A';.    }.
163d0 20 20 20 20 7a 4b 32 20 3d 20 28 63 68 61 72 2a      zK2 = (char*
163e0 29 70 68 6f 6e 65 74 69 63 48 61 73 68 28 28 63  )phoneticHash((c
163f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
16400 61 72 2a 29 7a 4b 31 2c 20 69 29 3b 0a 20 20 20  ar*)zK1, i);.   
16410 20 69 66 28 20 7a 4b 32 3d 3d 30 20 29 7b 0a 20   if( zK2==0 ){. 
16420 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16430 65 28 7a 4b 31 29 3b 0a 20 20 20 20 20 20 72 65  e(zK1);.      re
16440 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
16450 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
16460 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
16470 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
16480 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
16490 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
164a0 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 31  alue_type(argv[1
164b0 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
164c0 29 7b 0a 20 20 20 20 20 20 20 20 73 70 65 6c 6c  ){.        spell
164d0 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20  fix1DbExec(&rc, 
164e0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
164f0 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
16500 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
16510 62 5c 22 28 72 61 6e 6b 2c 6c 61 6e 67 69 64 2c  b\"(rank,langid,
16520 77 6f 72 64 2c 6b 31 2c 6b 32 29 20 22 0a 20 20  word,k1,k2) ".  
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 22 56 41               "VA
16540 4c 55 45 53 28 25 64 2c 25 64 2c 25 51 2c 25 51  LUES(%d,%d,%Q,%Q
16550 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%Q)",.         
16560 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65        p->zDbName
16570 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c  , p->zTableName,
16580 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16590 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20 7a 57  iRank, iLang, zW
165a0 6f 72 64 2c 20 7a 4b 31 2c 20 7a 4b 32 0a 20 20  ord, zK1, zK2.  
165b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
165c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
165d0 77 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  wRowid = sqlite3
165e0 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
165f0 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  v[1]);.        s
16600 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26  pellfix1DbExec(&
16610 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 20 20  rc, db,.        
16620 20 20 20 20 22 49 4e 53 45 52 54 20 4f 52 20 25      "INSERT OR %
16630 73 20 49 4e 54 4f 20 5c 22 25 77 5c 22 2e 5c 22  s INTO \"%w\".\"
16640 25 77 5f 76 6f 63 61 62 5c 22 28 69 64 2c 72 61  %w_vocab\"(id,ra
16650 6e 6b 2c 6c 61 6e 67 69 64 2c 77 6f 72 64 2c 6b  nk,langid,word,k
16660 31 2c 6b 32 29 20 22 0a 20 20 20 20 20 20 20 20  1,k2) ".        
16670 20 20 20 20 22 56 41 4c 55 45 53 28 25 6c 6c 64      "VALUES(%lld
16680 2c 25 64 2c 25 64 2c 25 51 2c 25 51 2c 25 51 29  ,%d,%d,%Q,%Q,%Q)
16690 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ",.            z
166a0 43 6f 6e 66 6c 69 63 74 2c 20 70 2d 3e 7a 44 62  Conflict, p->zDb
166b0 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e  Name, p->zTableN
166c0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
166d0 20 6e 65 77 52 6f 77 69 64 2c 20 69 52 61 6e 6b   newRowid, iRank
166e0 2c 20 69 4c 61 6e 67 2c 20 7a 57 6f 72 64 2c 20  , iLang, zWord, 
166f0 7a 4b 31 2c 20 7a 4b 32 0a 20 20 20 20 20 20 20  zK1, zK2.       
16700 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
16710 20 20 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69    *pRowid = sqli
16720 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
16730 72 6f 77 69 64 28 64 62 29 3b 0a 20 20 20 20 7d  rowid(db);.    }
16740 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 6f 77 69  else{.      rowi
16750 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
16760 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
16770 3b 0a 20 20 20 20 20 20 6e 65 77 52 6f 77 69 64  ;.      newRowid
16780 20 3d 20 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c   = *pRowid = sql
16790 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
167a0 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20  (argv[1]);.     
167b0 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63   spellfix1DbExec
167c0 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20  (&rc, db,.      
167d0 20 20 20 20 20 20 20 22 55 50 44 41 54 45 20 4f         "UPDATE O
167e0 52 20 25 73 20 5c 22 25 77 5c 22 2e 5c 22 25 77  R %s \"%w\".\"%w
167f0 5f 76 6f 63 61 62 5c 22 20 53 45 54 20 69 64 3d  _vocab\" SET id=
16800 25 6c 6c 64 2c 20 72 61 6e 6b 3d 25 64 2c 20 6c  %lld, rank=%d, l
16810 61 6e 67 69 64 3d 25 64 2c 22 0a 20 20 20 20 20  angid=%d,".     
16820 20 20 20 20 20 20 20 20 22 20 77 6f 72 64 3d 25          " word=%
16830 51 2c 20 6b 31 3d 25 51 2c 20 6b 32 3d 25 51 20  Q, k1=%Q, k2=%Q 
16840 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 2c 0a  WHERE id=%lld",.
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
16860 6e 66 6c 69 63 74 2c 20 70 2d 3e 7a 44 62 4e 61  nflict, p->zDbNa
16870 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
16880 65 2c 20 6e 65 77 52 6f 77 69 64 2c 20 69 52 61  e, newRowid, iRa
16890 6e 6b 2c 20 69 4c 61 6e 67 2c 0a 20 20 20 20 20  nk, iLang,.     
168a0 20 20 20 20 20 20 20 20 7a 57 6f 72 64 2c 20 7a          zWord, z
168b0 4b 31 2c 20 7a 4b 32 2c 20 72 6f 77 69 64 0a 20  K1, zK2, rowid. 
168c0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
168d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
168e0 4b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  K1);.    sqlite3
168f0 5f 66 72 65 65 28 7a 4b 32 29 3b 0a 20 20 7d 0a  _free(zK2);.  }.
16900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16910 2f 2a 0a 2a 2a 20 52 65 6e 61 6d 65 20 74 68 65  /*.** Rename the
16920 20 73 70 65 6c 6c 66 69 78 31 20 74 61 62 6c 65   spellfix1 table
16930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16940 73 70 65 6c 6c 66 69 78 31 52 65 6e 61 6d 65 28  spellfix1Rename(
16950 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
16960 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Tab, const char 
16970 2a 7a 4e 65 77 29 7b 0a 20 20 73 70 65 6c 6c 66  *zNew){.  spellf
16980 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28 73  ix1_vtab *p = (s
16990 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29 70  pellfix1_vtab*)p
169a0 56 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  VTab;.  sqlite3 
169b0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
169c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
169d0 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e  K;.  char *zNewN
169e0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ame = sqlite3_mp
169f0 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 65 77  rintf("%s", zNew
16a00 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77 4e 61 6d  );.  if( zNewNam
16a10 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
16a20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16a30 0a 20 20 7d 0a 20 20 73 70 65 6c 6c 66 69 78 31  .  }.  spellfix1
16a40 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20  DbExec(&rc, db, 
16a50 0a 20 20 20 20 20 22 41 4c 54 45 52 20 54 41 42  .     "ALTER TAB
16a60 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76  LE \"%w\".\"%w_v
16a70 6f 63 61 62 5c 22 20 52 45 4e 41 4d 45 20 54 4f  ocab\" RENAME TO
16a80 20 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22 2c 0a   \"%w_vocab\"",.
16a90 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c       p->zDbName,
16aa0 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20   p->zTableName, 
16ab0 7a 4e 65 77 4e 61 6d 65 0a 20 20 29 3b 0a 20 20  zNewName.  );.  
16ac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16ad0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
16ae0 5f 66 72 65 65 28 70 2d 3e 7a 54 61 62 6c 65 4e  _free(p->zTableN
16af0 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 61  ame);.    p->zTa
16b00 62 6c 65 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61  bleName = zNewNa
16b10 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  me;.  }else{.   
16b20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
16b30 65 77 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72  ewName);.  }.  r
16b40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
16b50 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61  .** A virtual ta
16b60 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68 61 74 20  ble module that 
16b70 70 72 6f 76 69 64 65 73 20 66 75 7a 7a 79 20 73  provides fuzzy s
16b80 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  earch..*/.static
16b90 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
16ba0 73 70 65 6c 6c 66 69 78 31 4d 6f 64 75 6c 65 20  spellfix1Module 
16bb0 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20  = {.  0,        
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16bd0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
16be0 73 70 65 6c 6c 66 69 78 31 43 72 65 61 74 65 2c  spellfix1Create,
16bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65           /* xCre
16c00 61 74 65 20 2d 20 68 61 6e 64 6c 65 20 43 52 45  ate - handle CRE
16c10 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
16c20 45 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  E */.  spellfix1
16c30 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
16c40 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 72 65  /* xConnect - re
16c50 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 6e 20  connected to an 
16c60 65 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a  existing table *
16c70 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 42 65 73  /.  spellfix1Bes
16c80 74 49 6e 64 65 78 2c 20 20 20 20 20 20 2f 2a 20  tIndex,      /* 
16c90 78 42 65 73 74 49 6e 64 65 78 20 2d 20 66 69 67  xBestIndex - fig
16ca0 75 72 65 20 6f 75 74 20 68 6f 77 20 74 6f 20 64  ure out how to d
16cb0 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  o a query */.  s
16cc0 70 65 6c 6c 66 69 78 31 44 69 73 63 6f 6e 6e 65  pellfix1Disconne
16cd0 63 74 2c 20 20 20 20 20 2f 2a 20 78 44 69 73 63  ct,     /* xDisc
16ce0 6f 6e 6e 65 63 74 20 2d 20 63 6c 6f 73 65 20 61  onnect - close a
16cf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16d00 20 73 70 65 6c 6c 66 69 78 31 44 65 73 74 72 6f   spellfix1Destro
16d10 79 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65  y,        /* xDe
16d20 73 74 72 6f 79 20 2d 20 68 61 6e 64 6c 65 20 44  stroy - handle D
16d30 52 4f 50 20 54 41 42 4c 45 20 2a 2f 0a 20 20 73  ROP TABLE */.  s
16d40 70 65 6c 6c 66 69 78 31 4f 70 65 6e 2c 20 20 20  pellfix1Open,   
16d50 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
16d60 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
16d70 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43   */.  spellfix1C
16d80 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
16d90 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
16da0 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73   a cursor */.  s
16db0 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 2c 20  pellfix1Filter, 
16dc0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74          /* xFilt
16dd0 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73  er - configure s
16de0 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  can constraints 
16df0 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 4e 65  */.  spellfix1Ne
16e00 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  xt,           /*
16e10 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65   xNext - advance
16e20 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73   a cursor */.  s
16e30 70 65 6c 6c 66 69 78 31 45 6f 66 2c 20 20 20 20  pellfix1Eof,    
16e40 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20          /* xEof 
16e50 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20  - check for end 
16e60 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 73 70 65  of scan */.  spe
16e70 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c 20 20 20  llfix1Column,   
16e80 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e        /* xColumn
16e90 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
16ea0 20 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64    spellfix1Rowid
16eb0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52  ,          /* xR
16ec0 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
16ed0 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 55   */.  spellfix1U
16ee0 70 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 2f  pdate,         /
16ef0 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30  * xUpdate */.  0
16f00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16f10 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
16f20 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f40 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c  /* xSync */.  0,
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f60 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69         /* xCommi
16f70 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  /* xRollback */.
16fa0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
16fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
16fc0 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  indMethod */.  s
16fd0 70 65 6c 6c 66 69 78 31 52 65 6e 61 6d 65 2c 20  pellfix1Rename, 
16fe0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
16ff0 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  me */.};../*.** 
17000 52 65 67 69 73 74 65 72 20 74 68 65 20 76 61 72  Register the var
17010 69 6f 75 73 20 66 75 6e 63 74 69 6f 6e 73 20 61  ious functions a
17020 6e 64 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  nd the virtual t
17030 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
17040 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 65 67  int spellfix1Reg
17050 69 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64  ister(sqlite3 *d
17060 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
17070 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
17080 69 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  i;.  rc = sqlite
17090 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
170a0 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31  n(db, "spellfix1
170b0 5f 74 72 61 6e 73 6c 69 74 22 2c 20 31 2c 0a 20  _translit", 1,. 
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
170e0 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45  LITE_UTF8|SQLITE
170f0 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
17100 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17120 20 20 20 74 72 61 6e 73 6c 69 74 65 72 61 74 65     transliterate
17130 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
17140 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17150 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
17160 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
17170 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 70 65  unction(db, "spe
17180 6c 6c 66 69 78 31 5f 65 64 69 74 64 69 73 74 22  llfix1_editdist"
17190 2c 20 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 2,.           
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
171c0 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  8|SQLITE_DETERMI
171d0 4e 49 53 54 49 43 2c 20 30 2c 0a 20 20 20 20 20  NISTIC, 0,.     
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
17200 74 64 69 73 74 53 71 6c 46 75 6e 63 2c 20 30 2c  tdistSqlFunc, 0,
17210 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
17220 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17230 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17240 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
17250 28 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f  (db, "spellfix1_
17260 70 68 6f 6e 65 68 61 73 68 22 2c 20 31 2c 0a 20  phonehash", 1,. 
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49  SQLITE_UTF8|SQLI
172a0 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
172b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172d0 20 20 20 20 20 20 20 70 68 6f 6e 65 74 69 63 48         phoneticH
172e0 61 73 68 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  ashSqlFunc, 0, 0
172f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
17300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
17320 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
17330 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 73 63  b, "spellfix1_sc
17340 72 69 70 74 63 6f 64 65 22 2c 20 31 2c 0a 20 20  riptcode", 1,.  
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17370 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49  SQLITE_UTF8|SQLI
17380 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
17390 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 20 20 20 20 73 63 72 69 70 74 43 6f 64         scriptCod
173c0 65 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  eSqlFunc, 0, 0);
173d0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
173e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
173f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
17400 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22  ate_module(db, "
17410 73 70 65 6c 6c 66 69 78 31 22 2c 20 26 73 70 65  spellfix1", &spe
17420 6c 6c 66 69 78 31 4d 6f 64 75 6c 65 2c 20 30 29  llfix1Module, 0)
17430 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
17440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17450 20 72 63 20 3d 20 65 64 69 74 44 69 73 74 33 49   rc = editDist3I
17460 6e 73 74 61 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a  nstall(db);.  }.
17470 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 73 61 6e  .  /* Verify san
17480 69 74 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ity of the trans
17490 6c 69 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20  lit[] table */. 
174a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
174b0 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a  of(translit)/siz
174c0 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29  eof(translit[0])
174d0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  -1; i++){.    as
174e0 73 65 72 74 28 20 74 72 61 6e 73 6c 69 74 5b 69  sert( translit[i
174f0 5d 2e 63 46 72 6f 6d 3c 74 72 61 6e 73 6c 69 74  ].cFrom<translit
17500 5b 69 2b 31 5d 2e 63 46 72 6f 6d 20 29 3b 0a 20  [i+1].cFrom );. 
17510 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
17520 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
17530 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
17540 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LTABLE */../*.**
17550 20 45 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20   Extension load 
17560 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  function..*/.#if
17570 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63  def _WIN32.__dec
17580 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
17590 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69  .#endif.int sqli
175a0 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69  te3_spellfix_ini
175b0 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
175c0 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  , .  char **pzEr
175d0 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73  rMsg, .  const s
175e0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
175f0 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53  nes *pApi.){.  S
17600 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
17610 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 23 69 66  INIT2(pApi);.#if
17620 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17630 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
17640 72 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31  return spellfix1
17650 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 23 65  Register(db);.#e
17660 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
17670 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a                 LITE_OK;.}.