/ Hex Artifact Content
Login

Artifact 93f3961074cebe63c31fcefe62ca2a032ee8dfed:


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 28 20 6e 49 6e 20 2b 20 31 20 29 3b  lloc( nIn + 1 );
23f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2400: 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  nOut = 0;.  char
2410: 20 63 50 72 65 76 20 3d 20 30 78 37 37 3b 0a 20   cPrev = 0x77;. 
2420: 20 63 68 61 72 20 63 50 72 65 76 58 20 3d 20 30   char cPrevX = 0
2430: 78 37 37 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  x77;.  const uns
2440: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 43 6c 61  igned char *aCla
2450: 73 73 20 3d 20 69 6e 69 74 43 6c 61 73 73 3b 0a  ss = initClass;.
2460: 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29  .  if( zOut==0 )
2470: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2480: 20 6e 49 6e 3e 32 20 29 7b 0a 20 20 20 20 73 77   nIn>2 ){.    sw
2490: 69 74 63 68 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a  itch( zIn[0] ){.
24a0: 20 20 20 20 20 20 63 61 73 65 20 27 67 27 3a 20        case 'g': 
24b0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 6b 27 3a  .      case 'k':
24c0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   {.        if( z
24d0: 49 6e 5b 31 5d 3d 3d 27 6e 27 20 29 7b 20 7a 49  In[1]=='n' ){ zI
24e0: 6e 2b 2b 3b 20 6e 49 6e 2d 2d 3b 20 7d 0a 20 20  n++; nIn--; }.  
24f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 3b   for(i=0; i<nIn;
2520: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67   i++){.    unsig
2530: 6e 65 64 20 63 68 61 72 20 63 20 3d 20 7a 49 6e  ned char c = zIn
2540: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 2b 31  [i];.    if( i+1
2550: 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  <nIn ){.      if
2560: 28 20 63 3d 3d 27 77 27 20 26 26 20 7a 49 6e 5b  ( c=='w' && zIn[
2570: 69 2b 31 5d 3d 3d 27 72 27 20 29 20 63 6f 6e 74  i+1]=='r' ) cont
2580: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2590: 63 3d 3d 27 64 27 20 26 26 20 28 7a 49 6e 5b 69  c=='d' && (zIn[i
25a0: 2b 31 5d 3d 3d 27 6a 27 20 7c 7c 20 7a 49 6e 5b  +1]=='j' || zIn[
25b0: 69 2b 31 5d 3d 3d 27 67 27 29 20 29 20 63 6f 6e  i+1]=='g') ) con
25c0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
25d0: 20 69 2b 32 3c 6e 49 6e 20 29 7b 0a 20 20 20 20   i+2<nIn ){.    
25e0: 20 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26      if( c=='t' &
25f0: 26 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 63 27 20  & zIn[i+1]=='c' 
2600: 26 26 20 7a 49 6e 5b 69 2b 32 5d 3d 3d 27 68 27  && zIn[i+2]=='h'
2610: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
2630: 20 3d 20 61 43 6c 61 73 73 5b 63 26 30 78 37 66   = aClass[c&0x7f
2640: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 43 43  ];.    if( c==CC
2650: 4c 41 53 53 5f 53 50 41 43 45 20 29 20 63 6f 6e  LASS_SPACE ) con
2660: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 63  tinue;.    if( c
2670: 3d 3d 43 43 4c 41 53 53 5f 4f 54 48 45 52 20 26  ==CCLASS_OTHER &
2680: 26 20 63 50 72 65 76 21 3d 43 43 4c 41 53 53 5f  & cPrev!=CCLASS_
2690: 44 49 47 49 54 20 29 20 63 6f 6e 74 69 6e 75 65  DIGIT ) continue
26a0: 3b 0a 20 20 20 20 61 43 6c 61 73 73 20 3d 20 6d  ;.    aClass = m
26b0: 69 64 43 6c 61 73 73 3b 0a 20 20 20 20 69 66 28  idClass;.    if(
26c0: 20 63 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c   c==CCLASS_VOWEL
26d0: 20 26 26 20 28 63 50 72 65 76 58 3d 3d 43 43 4c   && (cPrevX==CCL
26e0: 41 53 53 5f 52 20 7c 7c 20 63 50 72 65 76 58 3d  ASS_R || cPrevX=
26f0: 3d 43 43 4c 41 53 53 5f 4c 29 20 29 7b 0a 20 20  =CCLASS_L) ){.  
2700: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
2710: 2a 20 4e 6f 20 76 6f 77 65 6c 73 20 62 65 73 69  * No vowels besi
2720: 64 65 20 4c 20 6f 72 20 52 20 2a 2f 20 0a 20 20  de L or R */ .  
2730: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 63 3d 3d    }.    if( (c==
2740: 43 43 4c 41 53 53 5f 52 20 7c 7c 20 63 3d 3d 43  CCLASS_R || c==C
2750: 43 4c 41 53 53 5f 4c 29 20 26 26 20 63 50 72 65  CLASS_L) && cPre
2760: 76 58 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c  vX==CCLASS_VOWEL
2770: 20 29 7b 0a 20 20 20 20 20 20 20 6e 4f 75 74 2d   ){.       nOut-
2780: 2d 3b 20 20 20 2f 2a 20 4e 6f 20 76 6f 77 65 6c  -;   /* No vowel
2790: 73 20 62 65 73 69 64 65 20 4c 20 6f 72 20 52 20  s beside L or R 
27a0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 50 72  */.    }.    cPr
27b0: 65 76 20 3d 20 63 3b 0a 20 20 20 20 69 66 28 20  ev = c;.    if( 
27c0: 63 3d 3d 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54  c==CCLASS_SILENT
27d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27e0: 20 63 50 72 65 76 58 20 3d 20 63 3b 0a 20 20 20   cPrevX = c;.   
27f0: 20 63 20 3d 20 63 6c 61 73 73 4e 61 6d 65 5b 63   c = className[c
2800: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ];.    assert( n
2810: 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Out>=0 );.    if
2820: 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 63 21 3d  ( nOut==0 || c!=
2830: 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 29 20 7a  zOut[nOut-1] ) z
2840: 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 63 3b  Out[nOut++] = c;
2850: 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  .  }.  zOut[nOut
2860: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
2870: 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zOut;.}../*.** T
2880: 68 69 73 20 69 73 20 61 6e 20 53 51 4c 20 66 75  his is an SQL fu
2890: 6e 63 74 69 6f 6e 20 77 72 61 70 70 65 72 20 61  nction wrapper a
28a0: 72 6f 75 6e 64 20 70 68 6f 6e 65 74 69 63 48 61  round phoneticHa
28b0: 73 68 28 29 2e 20 20 53 65 65 0a 2a 2a 20 74 68  sh().  See.** th
28c0: 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
28d0: 20 70 68 6f 6e 65 74 69 63 48 61 73 68 28 29 20   phoneticHash() 
28e0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
28f0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
2900: 74 61 74 69 63 20 76 6f 69 64 20 70 68 6f 6e 65  tatic void phone
2910: 74 69 63 48 61 73 68 53 71 6c 46 75 6e 63 28 0a  ticHashSqlFunc(.
2920: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2930: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
2940: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
2950: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
2960: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
2970: 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20 20  ed char *zIn;.  
2980: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2990: 4f 75 74 3b 0a 0a 20 20 7a 49 6e 20 3d 20 73 71  Out;..  zIn = sq
29a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
29b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
29c0: 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e   zIn==0 ) return
29d0: 3b 0a 20 20 7a 4f 75 74 20 3d 20 70 68 6f 6e 65  ;.  zOut = phone
29e0: 74 69 63 48 61 73 68 28 7a 49 6e 2c 20 73 71 6c  ticHash(zIn, sql
29f0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2a00: 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 69 66  (argv[0]));.  if
2a10: 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  ( zOut==0 ){.   
2a20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2a30: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
2a40: 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ext);.  }else{. 
2a50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2a60: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
2a70: 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20 2d 31 2c  (char*)zOut, -1,
2a80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
2a90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
2aa0: 75 72 6e 20 74 68 65 20 63 68 61 72 61 63 74 65  urn the characte
2ab0: 72 20 63 6c 61 73 73 20 6e 75 6d 62 65 72 20 66  r class number f
2ac0: 6f 72 20 61 20 63 68 61 72 61 63 74 65 72 20 67  or a character g
2ad0: 69 76 65 6e 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  iven its.** cont
2ae0: 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ext..*/.static c
2af0: 68 61 72 20 63 68 61 72 61 63 74 65 72 43 6c 61  har characterCla
2b00: 73 73 28 63 68 61 72 20 63 50 72 65 76 2c 20 63  ss(char cPrev, c
2b10: 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75 72 6e  har c){.  return
2b20: 20 63 50 72 65 76 3d 3d 30 20 3f 20 69 6e 69 74   cPrev==0 ? init
2b30: 43 6c 61 73 73 5b 63 26 30 78 37 66 5d 20 3a 20  Class[c&0x7f] : 
2b40: 6d 69 64 43 6c 61 73 73 5b 63 26 30 78 37 66 5d  midClass[c&0x7f]
2b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2b60: 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 69 6e  n the cost of in
2b70: 73 65 72 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  serting or delet
2b80: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63 20  ing character c 
2b90: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 66  immediately.** f
2ba0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 61 63 74  ollowing charact
2bb0: 65 72 20 63 50 72 65 76 2e 20 20 49 66 20 63 50  er cPrev.  If cP
2bc0: 72 65 76 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  rev==0, that mea
2bd0: 6e 73 20 63 20 69 73 20 74 68 65 20 66 69 72 73  ns c is the firs
2be0: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 6f  t.** character o
2bf0: 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a 73  f the word..*/.s
2c00: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74  tatic int insert
2c10: 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63 68 61  OrDeleteCost(cha
2c20: 72 20 63 50 72 65 76 2c 20 63 68 61 72 20 63 2c  r cPrev, char c,
2c30: 20 63 68 61 72 20 63 4e 65 78 74 29 7b 0a 20 20   char cNext){.  
2c40: 63 68 61 72 20 63 6c 61 73 73 43 20 3d 20 63 68  char classC = ch
2c50: 61 72 61 63 74 65 72 43 6c 61 73 73 28 63 50 72  aracterClass(cPr
2c60: 65 76 2c 20 63 29 3b 0a 20 20 63 68 61 72 20 63  ev, c);.  char c
2c70: 6c 61 73 73 43 70 72 65 76 3b 0a 0a 20 20 69 66  lassCprev;..  if
2c80: 28 20 63 6c 61 73 73 43 3d 3d 43 43 4c 41 53 53  ( classC==CCLASS
2c90: 5f 53 49 4c 45 4e 54 20 29 7b 0a 20 20 20 20 2f  _SILENT ){.    /
2ca0: 2a 20 49 6e 73 65 72 74 20 6f 72 20 64 65 6c 65  * Insert or dele
2cb0: 74 65 20 22 73 69 6c 65 6e 74 22 20 63 68 61 72  te "silent" char
2cc0: 61 63 74 65 72 73 20 73 75 63 68 20 61 73 20 48  acters such as H
2cd0: 20 6f 72 20 57 20 2a 2f 0a 20 20 20 20 72 65 74   or W */.    ret
2ce0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2cf0: 20 63 50 72 65 76 3d 3d 63 20 29 7b 0a 20 20 20   cPrev==c ){.   
2d00: 20 2f 2a 20 52 65 70 65 61 74 65 64 20 63 68 61   /* Repeated cha
2d10: 72 61 63 74 65 72 73 2c 20 6f 72 20 6d 69 73 73  racters, or miss
2d20: 20 61 20 72 65 70 65 61 74 20 2a 2f 0a 20 20 20   a repeat */.   
2d30: 20 72 65 74 75 72 6e 20 31 30 3b 0a 20 20 7d 0a   return 10;.  }.
2d40: 20 20 69 66 28 20 63 6c 61 73 73 43 3d 3d 43 43    if( classC==CC
2d50: 4c 41 53 53 5f 56 4f 57 45 4c 20 26 26 20 28 63  LASS_VOWEL && (c
2d60: 50 72 65 76 3d 3d 27 72 27 20 7c 7c 20 63 4e 65  Prev=='r' || cNe
2d70: 78 74 3d 3d 27 72 27 29 20 29 7b 0a 20 20 20 20  xt=='r') ){.    
2d80: 72 65 74 75 72 6e 20 32 30 3b 20 20 2f 2a 20 49  return 20;  /* I
2d90: 6e 73 65 72 74 20 61 20 76 6f 77 65 6c 20 62 65  nsert a vowel be
2da0: 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 27 72  fore or after 'r
2db0: 27 20 2a 2f 0a 20 20 7d 0a 20 20 63 6c 61 73 73  ' */.  }.  class
2dc0: 43 70 72 65 76 20 3d 20 63 68 61 72 61 63 74 65  Cprev = characte
2dd0: 72 43 6c 61 73 73 28 63 50 72 65 76 2c 20 63 50  rClass(cPrev, cP
2de0: 72 65 76 29 3b 0a 20 20 69 66 28 20 63 6c 61 73  rev);.  if( clas
2df0: 73 43 3d 3d 63 6c 61 73 73 43 70 72 65 76 20 29  sC==classCprev )
2e00: 7b 0a 20 20 20 20 69 66 28 20 63 6c 61 73 73 43  {.    if( classC
2e10: 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c 20 29  ==CCLASS_VOWEL )
2e20: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76  {.      /* Remov
2e30: 65 20 6f 72 20 61 64 64 20 61 20 6e 65 77 20 76  e or add a new v
2e40: 6f 77 65 6c 20 74 6f 20 61 20 76 6f 77 65 6c 20  owel to a vowel 
2e50: 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  cluster */.     
2e60: 20 72 65 74 75 72 6e 20 31 35 3b 0a 20 20 20 20   return 15;.    
2e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2e80: 52 65 6d 6f 76 65 20 6f 72 20 61 64 64 20 61 20  Remove or add a 
2e90: 63 6f 6e 73 6f 6e 61 6e 74 20 6e 6f 74 20 69 6e  consonant not in
2ea0: 20 74 68 65 20 73 61 6d 65 20 63 6c 61 73 73 20   the same class 
2eb0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
2ec0: 35 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  50;.    }.  }.. 
2ed0: 20 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 63 68   /* any other ch
2ee0: 61 72 61 63 74 65 72 20 69 6e 73 65 72 74 69 6f  aracter insertio
2ef0: 6e 20 6f 72 20 64 65 6c 65 74 69 6f 6e 20 2a 2f  n or deletion */
2f00: 0a 20 20 72 65 74 75 72 6e 20 31 30 30 3b 0a 7d  .  return 100;.}
2f10: 0a 0a 2f 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74  ../*.** Divide t
2f20: 68 65 20 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73  he insertion cos
2f30: 74 20 62 79 20 74 68 69 73 20 66 61 63 74 6f 72  t by this factor
2f40: 20 77 68 65 6e 20 61 70 70 65 6e 64 69 6e 67 20   when appending 
2f50: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
2f60: 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a 23 64   the word..*/.#d
2f70: 65 66 69 6e 65 20 46 49 4e 41 4c 5f 49 4e 53 5f  efine FINAL_INS_
2f80: 43 4f 53 54 5f 44 49 56 20 20 34 0a 0a 2f 2a 0a  COST_DIV  4../*.
2f90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
2fa0: 73 74 20 6f 66 20 73 75 62 73 74 69 74 75 74 69  st of substituti
2fb0: 6e 67 20 63 54 6f 20 69 6e 20 70 6c 61 63 65 20  ng cTo in place 
2fc0: 6f 66 20 63 46 72 6f 6d 20 61 73 73 75 6d 69 6e  of cFrom assumin
2fd0: 67 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  g.** the previou
2fe0: 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20 63  s character is c
2ff0: 50 72 65 76 2e 20 20 49 66 20 63 50 72 65 76 3d  Prev.  If cPrev=
3000: 3d 30 20 74 68 65 6e 20 63 54 6f 20 69 73 20 74  =0 then cTo is t
3010: 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 68 61 72  he first.** char
3020: 61 63 74 65 72 20 6f 66 20 74 68 65 20 77 6f 72  acter of the wor
3030: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
3040: 20 73 75 62 73 74 69 74 75 74 65 43 6f 73 74 28   substituteCost(
3050: 63 68 61 72 20 63 50 72 65 76 2c 20 63 68 61 72  char cPrev, char
3060: 20 63 46 72 6f 6d 2c 20 63 68 61 72 20 63 54 6f   cFrom, char cTo
3070: 29 7b 0a 20 20 63 68 61 72 20 63 6c 61 73 73 46  ){.  char classF
3080: 72 6f 6d 2c 20 63 6c 61 73 73 54 6f 3b 0a 20 20  rom, classTo;.  
3090: 69 66 28 20 63 46 72 6f 6d 3d 3d 63 54 6f 20 29  if( cFrom==cTo )
30a0: 7b 0a 20 20 20 20 2f 2a 20 45 78 61 63 74 20 6d  {.    /* Exact m
30b0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 72 65 74 75  atch */.    retu
30c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
30d0: 63 46 72 6f 6d 3d 3d 28 63 54 6f 5e 30 78 32 30  cFrom==(cTo^0x20
30e0: 29 20 26 26 20 28 28 63 54 6f 3e 3d 27 41 27 20  ) && ((cTo>='A' 
30f0: 26 26 20 63 54 6f 3c 3d 27 5a 27 29 20 7c 7c 20  && cTo<='Z') || 
3100: 28 63 54 6f 3e 3d 27 61 27 20 26 26 20 63 54 6f  (cTo>='a' && cTo
3110: 3c 3d 27 7a 27 29 29 20 29 7b 0a 20 20 20 20 2f  <='z')) ){.    /
3120: 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e  * differ only in
3130: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 72 65 74   case */.    ret
3140: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6c 61  urn 0;.  }.  cla
3150: 73 73 46 72 6f 6d 20 3d 20 63 68 61 72 61 63 74  ssFrom = charact
3160: 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c 20 63  erClass(cPrev, c
3170: 46 72 6f 6d 29 3b 0a 20 20 63 6c 61 73 73 54 6f  From);.  classTo
3180: 20 3d 20 63 68 61 72 61 63 74 65 72 43 6c 61 73   = characterClas
3190: 73 28 63 50 72 65 76 2c 20 63 54 6f 29 3b 0a 20  s(cPrev, cTo);. 
31a0: 20 69 66 28 20 63 6c 61 73 73 46 72 6f 6d 3d 3d   if( classFrom==
31b0: 63 6c 61 73 73 54 6f 20 29 7b 0a 20 20 20 20 2f  classTo ){.    /
31c0: 2a 20 53 61 6d 65 20 63 68 61 72 61 63 74 65 72  * Same character
31d0: 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 72 65   class */.    re
31e0: 74 75 72 6e 20 34 30 3b 0a 20 20 7d 0a 20 20 69  turn 40;.  }.  i
31f0: 66 28 20 63 6c 61 73 73 46 72 6f 6d 3e 3d 43 43  f( classFrom>=CC
3200: 4c 41 53 53 5f 42 20 26 26 20 63 6c 61 73 73 46  LASS_B && classF
3210: 72 6f 6d 3c 3d 43 43 4c 41 53 53 5f 59 0a 20 20  rom<=CCLASS_Y.  
3220: 20 20 20 20 26 26 20 63 6c 61 73 73 54 6f 3e 3d      && classTo>=
3230: 43 43 4c 41 53 53 5f 42 20 26 26 20 63 6c 61 73  CCLASS_B && clas
3240: 73 54 6f 3c 3d 43 43 4c 41 53 53 5f 59 20 29 7b  sTo<=CCLASS_Y ){
3250: 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
3260: 66 72 6f 6d 20 6f 6e 65 20 63 6f 6e 73 6f 6e 61  from one consona
3270: 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72 2c 20 62  nt to another, b
3280: 75 74 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  ut in a differen
3290: 74 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 72  t class */.    r
32a0: 65 74 75 72 6e 20 37 35 3b 0a 20 20 7d 0a 20 20  eturn 75;.  }.  
32b0: 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 73 75 62  /* Any other sub
32c0: 73 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 72 65  sitution */.  re
32d0: 74 75 72 6e 20 31 30 30 3b 0a 7d 0a 0a 2f 2a 0a  turn 100;.}../*.
32e0: 2a 2a 20 47 69 76 65 6e 20 74 77 6f 20 73 74 72  ** Given two str
32f0: 69 6e 67 73 20 7a 41 20 61 6e 64 20 7a 42 20 77  ings zA and zB w
3300: 68 69 63 68 20 61 72 65 20 70 75 72 65 20 41 53  hich are pure AS
3310: 43 49 49 2c 20 72 65 74 75 72 6e 20 74 68 65 20  CII, return the 
3320: 63 6f 73 74 0a 2a 2a 20 6f 66 20 74 72 61 6e 73  cost.** of trans
3330: 66 6f 72 6d 69 6e 67 20 7a 41 20 69 6e 74 6f 20  forming zA into 
3340: 7a 42 2e 20 20 49 66 20 7a 41 20 65 6e 64 73 20  zB.  If zA ends 
3350: 77 69 74 68 20 27 2a 27 20 61 73 73 75 6d 65 20  with '*' assume 
3360: 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 61 20  that it is.** a 
3370: 70 72 65 66 69 78 20 6f 66 20 7a 42 20 61 6e 64  prefix of zB and
3380: 20 67 69 76 65 20 6f 6e 6c 79 20 6d 69 6e 69 6d   give only minim
3390: 61 6c 20 70 65 6e 61 6c 74 79 20 66 6f 72 20 65  al penalty for e
33a0: 78 74 72 61 20 63 68 61 72 61 63 74 65 72 73 0a  xtra characters.
33b0: 2a 2a 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ** on the end of
33c0: 20 7a 42 2e 0a 2a 2a 0a 2a 2a 20 53 6d 61 6c 6c   zB..**.** Small
33d0: 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 61 6e 20  er numbers mean 
33e0: 61 20 63 6c 6f 73 65 72 20 6d 61 74 63 68 2e 0a  a closer match..
33f0: 2a 2a 0a 2a 2a 20 4e 65 67 61 74 69 76 65 20 76  **.** Negative v
3400: 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 61  alues indicate a
3410: 6e 20 65 72 72 6f 72 3a 0a 2a 2a 20 20 20 20 2d  n error:.**    -
3420: 31 20 20 4f 6e 65 20 6f 66 20 74 68 65 20 69 6e  1  One of the in
3430: 70 75 74 73 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  puts is NULL.** 
3440: 20 20 20 2d 32 20 20 4e 6f 6e 2d 41 53 43 49 49     -2  Non-ASCII
3450: 20 63 68 61 72 61 63 74 65 72 73 20 6f 6e 20 69   characters on i
3460: 6e 70 75 74 0a 2a 2a 20 20 20 20 2d 33 20 20 55  nput.**    -3  U
3470: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
3480: 65 20 6d 65 6d 6f 72 79 20 0a 2a 2a 0a 2a 2a 20  e memory .**.** 
3490: 49 66 20 70 6e 4d 61 74 63 68 20 69 73 20 6e 6f  If pnMatch is no
34a0: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 6e  t NULL, then *pn
34b0: 4d 61 74 63 68 20 69 73 20 73 65 74 20 74 6f 20  Match is set to 
34c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
34d0: 74 65 73 0a 2a 2a 20 6f 66 20 7a 42 20 74 68 61  tes.** of zB tha
34e0: 74 20 6d 61 74 63 68 65 64 20 74 68 65 20 70 61  t matched the pa
34f0: 74 74 65 72 6e 20 69 6e 20 7a 41 2e 20 49 66 20  ttern in zA. If 
3500: 7a 41 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  zA does not end 
3510: 77 69 74 68 20 61 20 27 2a 27 2c 0a 2a 2a 20 74  with a '*',.** t
3520: 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65 20 69  hen this value i
3530: 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e 75 6d  s always the num
3540: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
3550: 7a 42 20 28 69 2e 65 2e 20 73 74 72 6c 65 6e 28  zB (i.e. strlen(
3560: 7a 42 29 29 2e 0a 2a 2a 20 49 66 20 7a 41 20 64  zB))..** If zA d
3570: 6f 65 73 20 65 6e 64 20 69 6e 20 61 20 27 2a 27  oes end in a '*'
3580: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
3590: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
35a0: 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 0a 2a   in the prefix.*
35b0: 2a 20 6f 66 20 7a 42 20 74 68 61 74 20 77 61 73  * of zB that was
35c0: 20 64 65 65 6d 65 64 20 74 6f 20 6d 61 74 63 68   deemed to match
35d0: 20 7a 41 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   zA..*/.static i
35e0: 6e 74 20 65 64 69 74 64 69 73 74 31 28 63 6f 6e  nt editdist1(con
35f0: 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e  st char *zA, con
3600: 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 69 6e 74  st char *zB, int
3610: 20 2a 70 6e 4d 61 74 63 68 29 7b 0a 20 20 69 6e   *pnMatch){.  in
3620: 74 20 6e 41 2c 20 6e 42 3b 20 20 20 20 20 20 20  t nA, nB;       
3630: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3640: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
3650: 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a 2f  zA[] and zB[] */
3660: 0a 20 20 69 6e 74 20 78 41 2c 20 78 42 3b 20 20  .  int xA, xB;  
3670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3680: 70 20 63 6f 75 6e 74 65 72 73 20 66 6f 72 20 7a  p counters for z
3690: 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a 2f 0a  A[] and zB[] */.
36a0: 20 20 63 68 61 72 20 63 41 2c 20 63 42 3b 20 20    char cA, cB;  
36b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
36c0: 65 6e 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ent character of
36d0: 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20 20   zA and zB */.  
36e0: 63 68 61 72 20 63 41 70 72 65 76 2c 20 63 42 70  char cAprev, cBp
36f0: 72 65 76 3b 20 20 20 2f 2a 20 50 72 65 76 69 6f  rev;   /* Previo
3700: 75 73 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  us character of 
3710: 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20 20 63  zA and zB */.  c
3720: 68 61 72 20 63 41 6e 65 78 74 2c 20 63 42 6e 65  har cAnext, cBne
3730: 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 63 68  xt;   /* Next ch
3740: 61 72 61 63 74 65 72 20 69 6e 20 7a 41 20 61 6e  aracter in zA an
3750: 64 20 7a 42 20 2a 2f 0a 20 20 69 6e 74 20 64 3b  d zB */.  int d;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 2f 2a 20 4e 6f 72 74 68 2d 77 65 73 74 20 63   /* North-west c
3780: 6f 73 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ost value */.  i
3790: 6e 74 20 64 63 20 3d 20 30 3b 20 20 20 20 20 20  nt dc = 0;      
37a0: 20 20 20 20 20 20 2f 2a 20 4e 6f 72 74 68 2d 77        /* North-w
37b0: 65 73 74 20 63 68 61 72 61 63 74 65 72 20 76 61  est character va
37c0: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  lue */.  int res
37d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37e0: 2f 2a 20 46 69 6e 61 6c 20 72 65 73 75 6c 74 20  /* Final result 
37f0: 2a 2f 0a 20 20 69 6e 74 20 2a 6d 3b 20 20 20 20  */.  int *m;    
3800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3810: 68 65 20 63 6f 73 74 20 6d 61 74 72 69 78 20 2a  he cost matrix *
3820: 2f 0a 20 20 63 68 61 72 20 2a 63 78 3b 20 20 20  /.  char *cx;   
3830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3840: 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68 61 72  rresponding char
3850: 61 63 74 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a  acter values */.
3860: 20 20 69 6e 74 20 2a 74 6f 46 72 65 65 20 3d 20    int *toFree = 
3870: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c  0;       /* Mall
3880: 6f 63 65 64 20 73 70 61 63 65 20 2a 2f 0a 20 20  oced space */.  
3890: 69 6e 74 20 6d 53 74 61 63 6b 5b 36 30 2b 31 35  int mStack[60+15
38a0: 5d 3b 20 20 20 20 20 2f 2a 20 53 74 61 63 6b 20  ];     /* Stack 
38b0: 73 70 61 63 65 20 74 6f 20 75 73 65 20 69 66 20  space to use if 
38c0: 6e 6f 74 20 74 6f 6f 20 6d 75 63 68 20 69 73 20  not too much is 
38d0: 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  needed */.  int 
38e0: 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 0a 20 20 2f  nMatch = 0;..  /
38f0: 2a 20 45 61 72 6c 79 20 6f 75 74 20 69 66 20 65  * Early out if e
3900: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
3910: 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 7a 41 3d  ULL */.  if( zA=
3920: 3d 30 20 7c 7c 20 7a 42 3d 3d 30 20 29 20 72 65  =0 || zB==0 ) re
3930: 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 2f 2a 20 53  turn -1;..  /* S
3940: 6b 69 70 20 61 6e 79 20 63 6f 6d 6d 6f 6e 20 70  kip any common p
3950: 72 65 66 69 78 20 2a 2f 0a 20 20 77 68 69 6c 65  refix */.  while
3960: 28 20 7a 41 5b 30 5d 20 26 26 20 7a 41 5b 30 5d  ( zA[0] && zA[0]
3970: 3d 3d 7a 42 5b 30 5d 20 29 7b 20 64 63 20 3d 20  ==zB[0] ){ dc = 
3980: 7a 41 5b 30 5d 3b 20 7a 41 2b 2b 3b 20 7a 42 2b  zA[0]; zA++; zB+
3990: 2b 3b 20 6e 4d 61 74 63 68 2b 2b 3b 20 7d 0a 20  +; nMatch++; }. 
39a0: 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29 20 2a   if( pnMatch ) *
39b0: 70 6e 4d 61 74 63 68 20 3d 20 6e 4d 61 74 63 68  pnMatch = nMatch
39c0: 3b 0a 20 20 69 66 28 20 7a 41 5b 30 5d 3d 3d 30  ;.  if( zA[0]==0
39d0: 20 26 26 20 7a 42 5b 30 5d 3d 3d 30 20 29 20 72   && zB[0]==0 ) r
39e0: 65 74 75 72 6e 20 30 3b 0a 0a 23 69 66 20 30 0a  eturn 0;..#if 0.
39f0: 20 20 70 72 69 6e 74 66 28 22 41 3d 5c 22 25 73    printf("A=\"%s
3a00: 5c 22 20 42 3d 5c 22 25 73 5c 22 20 64 63 3d 25  \" B=\"%s\" dc=%
3a10: 63 5c 6e 22 2c 20 7a 41 2c 20 7a 42 2c 20 64 63  c\n", zA, zB, dc
3a20: 3f 64 63 3a 27 20 27 29 3b 0a 23 65 6e 64 69 66  ?dc:' ');.#endif
3a30: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 69 6e  ..  /* Verify in
3a40: 70 75 74 20 73 74 72 69 6e 67 73 20 61 6e 64 20  put strings and 
3a50: 6d 65 61 73 75 72 65 20 74 68 65 69 72 20 6c 65  measure their le
3a60: 6e 67 74 68 73 20 2a 2f 0a 20 20 66 6f 72 28 6e  ngths */.  for(n
3a70: 41 3d 30 3b 20 7a 41 5b 6e 41 5d 3b 20 6e 41 2b  A=0; zA[nA]; nA+
3a80: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 41 5b 6e  +){.    if( zA[n
3a90: 41 5d 26 30 78 38 30 20 29 20 72 65 74 75 72 6e  A]&0x80 ) return
3aa0: 20 2d 32 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e   -2;.  }.  for(n
3ab0: 42 3d 30 3b 20 7a 42 5b 6e 42 5d 3b 20 6e 42 2b  B=0; zB[nB]; nB+
3ac0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 42 5b 6e  +){.    if( zB[n
3ad0: 42 5d 26 30 78 38 30 20 29 20 72 65 74 75 72 6e  B]&0x80 ) return
3ae0: 20 2d 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   -2;.  }..  /* S
3af0: 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
3b00: 67 20 69 66 20 65 69 74 68 65 72 20 73 74 72 69  g if either stri
3b10: 6e 67 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20  ng is empty */. 
3b20: 20 69 66 28 20 6e 41 3d 3d 30 20 29 7b 0a 20 20   if( nA==0 ){.  
3b30: 20 20 63 42 70 72 65 76 20 3d 20 64 63 3b 0a 20    cBprev = dc;. 
3b40: 20 20 20 66 6f 72 28 78 42 3d 72 65 73 3d 30 3b     for(xB=res=0;
3b50: 20 28 63 42 20 3d 20 7a 42 5b 78 42 5d 29 21 3d   (cB = zB[xB])!=
3b60: 30 3b 20 78 42 2b 2b 29 7b 0a 20 20 20 20 20 20  0; xB++){.      
3b70: 72 65 73 20 2b 3d 20 69 6e 73 65 72 74 4f 72 44  res += insertOrD
3b80: 65 6c 65 74 65 43 6f 73 74 28 63 42 70 72 65 76  eleteCost(cBprev
3b90: 2c 20 63 42 2c 20 7a 42 5b 78 42 2b 31 5d 29 2f  , cB, zB[xB+1])/
3ba0: 46 49 4e 41 4c 5f 49 4e 53 5f 43 4f 53 54 5f 44  FINAL_INS_COST_D
3bb0: 49 56 3b 0a 20 20 20 20 20 20 63 42 70 72 65 76  IV;.      cBprev
3bc0: 20 3d 20 63 42 3b 0a 20 20 20 20 7d 0a 20 20 20   = cB;.    }.   
3bd0: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d   return res;.  }
3be0: 0a 20 20 69 66 28 20 6e 42 3d 3d 30 20 29 7b 0a  .  if( nB==0 ){.
3bf0: 20 20 20 20 63 41 70 72 65 76 20 3d 20 64 63 3b      cAprev = dc;
3c00: 0a 20 20 20 20 66 6f 72 28 78 41 3d 72 65 73 3d  .    for(xA=res=
3c10: 30 3b 20 28 63 41 20 3d 20 7a 41 5b 78 41 5d 29  0; (cA = zA[xA])
3c20: 21 3d 30 3b 20 78 41 2b 2b 29 7b 0a 20 20 20 20  !=0; xA++){.    
3c30: 20 20 72 65 73 20 2b 3d 20 69 6e 73 65 72 74 4f    res += insertO
3c40: 72 44 65 6c 65 74 65 43 6f 73 74 28 63 41 70 72  rDeleteCost(cApr
3c50: 65 76 2c 20 63 41 2c 20 7a 41 5b 78 41 2b 31 5d  ev, cA, zA[xA+1]
3c60: 29 3b 0a 20 20 20 20 20 20 63 41 70 72 65 76 20  );.      cAprev 
3c70: 3d 20 63 41 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = cA;.    }.    
3c80: 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d 0a  return res;.  }.
3c90: 0a 20 20 2f 2a 20 41 20 69 73 20 61 20 70 72 65  .  /* A is a pre
3ca0: 66 69 78 20 6f 66 20 42 20 2a 2f 0a 20 20 69 66  fix of B */.  if
3cb0: 28 20 7a 41 5b 30 5d 3d 3d 27 2a 27 20 26 26 20  ( zA[0]=='*' && 
3cc0: 7a 41 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75 72  zA[1]==0 ) retur
3cd0: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  n 0;..  /* Alloc
3ce0: 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
3cf0: 7a 65 20 74 68 65 20 57 61 67 6e 65 72 20 6d 61  ze the Wagner ma
3d00: 74 72 69 78 20 2a 2f 0a 20 20 69 66 28 20 6e 42  trix */.  if( nB
3d10: 3c 28 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b 29  <(sizeof(mStack)
3d20: 2a 34 29 2f 28 73 69 7a 65 6f 66 28 6d 53 74 61  *4)/(sizeof(mSta
3d30: 63 6b 5b 30 5d 29 2a 35 29 20 29 7b 0a 20 20 20  ck[0])*5) ){.   
3d40: 20 6d 20 3d 20 6d 53 74 61 63 6b 3b 0a 20 20 7d   m = mStack;.  }
3d50: 65 6c 73 65 7b 0a 20 20 20 20 6d 20 3d 20 74 6f  else{.    m = to
3d60: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Free = sqlite3_m
3d70: 61 6c 6c 6f 63 28 20 28 6e 42 2b 31 29 2a 35 2a  alloc( (nB+1)*5*
3d80: 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 2f 34 20 29  sizeof(m[0])/4 )
3d90: 3b 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29  ;.    if( m==0 )
3da0: 20 72 65 74 75 72 6e 20 2d 33 3b 0a 20 20 7d 0a   return -3;.  }.
3db0: 20 20 63 78 20 3d 20 28 63 68 61 72 2a 29 26 6d    cx = (char*)&m
3dc0: 5b 6e 42 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 43 6f  [nB+1];..  /* Co
3dd0: 6d 70 75 74 65 20 74 68 65 20 57 61 67 6e 65 72  mpute the Wagner
3de0: 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 2a   edit distance *
3df0: 2f 0a 20 20 6d 5b 30 5d 20 3d 20 30 3b 0a 20 20  /.  m[0] = 0;.  
3e00: 63 78 5b 30 5d 20 3d 20 64 63 3b 0a 20 20 63 42  cx[0] = dc;.  cB
3e10: 70 72 65 76 20 3d 20 64 63 3b 0a 20 20 66 6f 72  prev = dc;.  for
3e20: 28 78 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78  (xB=1; xB<=nB; x
3e30: 42 2b 2b 29 7b 0a 20 20 20 20 63 42 6e 65 78 74  B++){.    cBnext
3e40: 20 3d 20 7a 42 5b 78 42 5d 3b 0a 20 20 20 20 63   = zB[xB];.    c
3e50: 42 20 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20  B = zB[xB-1];.  
3e60: 20 20 63 78 5b 78 42 5d 20 3d 20 63 42 3b 0a 20    cx[xB] = cB;. 
3e70: 20 20 20 6d 5b 78 42 5d 20 3d 20 6d 5b 78 42 2d     m[xB] = m[xB-
3e80: 31 5d 20 2b 20 69 6e 73 65 72 74 4f 72 44 65 6c  1] + insertOrDel
3e90: 65 74 65 43 6f 73 74 28 63 42 70 72 65 76 2c 20  eteCost(cBprev, 
3ea0: 63 42 2c 20 63 42 6e 65 78 74 29 3b 0a 20 20 20  cB, cBnext);.   
3eb0: 20 63 42 70 72 65 76 20 3d 20 63 42 3b 0a 20 20   cBprev = cB;.  
3ec0: 7d 0a 20 20 63 41 70 72 65 76 20 3d 20 64 63 3b  }.  cAprev = dc;
3ed0: 0a 20 20 66 6f 72 28 78 41 3d 31 3b 20 78 41 3c  .  for(xA=1; xA<
3ee0: 3d 6e 41 3b 20 78 41 2b 2b 29 7b 0a 20 20 20 20  =nA; xA++){.    
3ef0: 69 6e 74 20 6c 61 73 74 41 20 3d 20 28 78 41 3d  int lastA = (xA=
3f00: 3d 6e 41 29 3b 0a 20 20 20 20 63 41 20 3d 20 7a  =nA);.    cA = z
3f10: 41 5b 78 41 2d 31 5d 3b 0a 20 20 20 20 63 41 6e  A[xA-1];.    cAn
3f20: 65 78 74 20 3d 20 7a 41 5b 78 41 5d 3b 0a 20 20  ext = zA[xA];.  
3f30: 20 20 69 66 28 20 63 41 3d 3d 27 2a 27 20 26 26    if( cA=='*' &&
3f40: 20 6c 61 73 74 41 20 29 20 62 72 65 61 6b 3b 0a   lastA ) break;.
3f50: 20 20 20 20 64 20 3d 20 6d 5b 30 5d 3b 0a 20 20      d = m[0];.  
3f60: 20 20 64 63 20 3d 20 63 78 5b 30 5d 3b 0a 20 20    dc = cx[0];.  
3f70: 20 20 6d 5b 30 5d 20 3d 20 64 20 2b 20 69 6e 73    m[0] = d + ins
3f80: 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28  ertOrDeleteCost(
3f90: 63 41 70 72 65 76 2c 20 63 41 2c 20 63 41 6e 65  cAprev, cA, cAne
3fa0: 78 74 29 3b 0a 20 20 20 20 63 42 70 72 65 76 20  xt);.    cBprev 
3fb0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 78 42 3d  = 0;.    for(xB=
3fc0: 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b 2b 29  1; xB<=nB; xB++)
3fd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 74 61  {.      int tota
3fe0: 6c 43 6f 73 74 2c 20 69 6e 73 43 6f 73 74 2c 20  lCost, insCost, 
3ff0: 64 65 6c 43 6f 73 74 2c 20 73 75 62 43 6f 73 74  delCost, subCost
4000: 2c 20 6e 63 78 3b 0a 20 20 20 20 20 20 63 42 20  , ncx;.      cB 
4010: 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20 20 20  = zB[xB-1];.    
4020: 20 20 63 42 6e 65 78 74 20 3d 20 7a 42 5b 78 42    cBnext = zB[xB
4030: 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 73  ];..      /* Cos
4040: 74 20 74 6f 20 69 6e 73 65 72 74 20 63 42 20 2a  t to insert cB *
4050: 2f 0a 20 20 20 20 20 20 69 6e 73 43 6f 73 74 20  /.      insCost 
4060: 3d 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65  = insertOrDelete
4070: 43 6f 73 74 28 63 78 5b 78 42 2d 31 5d 2c 20 63  Cost(cx[xB-1], c
4080: 42 2c 20 63 42 6e 65 78 74 29 3b 0a 20 20 20 20  B, cBnext);.    
4090: 20 20 69 66 28 20 6c 61 73 74 41 20 29 20 69 6e    if( lastA ) in
40a0: 73 43 6f 73 74 20 2f 3d 20 46 49 4e 41 4c 5f 49  sCost /= FINAL_I
40b0: 4e 53 5f 43 4f 53 54 5f 44 49 56 3b 0a 0a 20 20  NS_COST_DIV;..  
40c0: 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64      /* Cost to d
40d0: 65 6c 65 74 65 20 63 41 20 2a 2f 0a 20 20 20 20  elete cA */.    
40e0: 20 20 64 65 6c 43 6f 73 74 20 3d 20 69 6e 73 65    delCost = inse
40f0: 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63  rtOrDeleteCost(c
4100: 78 5b 78 42 5d 2c 20 63 41 2c 20 63 42 6e 65 78  x[xB], cA, cBnex
4110: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  t);..      /* Co
4120: 73 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65  st to substitute
4130: 20 63 41 2d 3e 63 42 20 2a 2f 0a 20 20 20 20 20   cA->cB */.     
4140: 20 73 75 62 43 6f 73 74 20 3d 20 73 75 62 73 74   subCost = subst
4150: 69 74 75 74 65 43 6f 73 74 28 63 78 5b 78 42 2d  ituteCost(cx[xB-
4160: 31 5d 2c 20 63 41 2c 20 63 42 29 3b 0a 0a 20 20  1], cA, cB);..  
4170: 20 20 20 20 2f 2a 20 42 65 73 74 20 63 6f 73 74      /* Best cost
4180: 20 2a 2f 0a 20 20 20 20 20 20 74 6f 74 61 6c 43   */.      totalC
4190: 6f 73 74 20 3d 20 69 6e 73 43 6f 73 74 20 2b 20  ost = insCost + 
41a0: 6d 5b 78 42 2d 31 5d 3b 0a 20 20 20 20 20 20 6e  m[xB-1];.      n
41b0: 63 78 20 3d 20 63 42 3b 0a 20 20 20 20 20 20 69  cx = cB;.      i
41c0: 66 28 20 28 64 65 6c 43 6f 73 74 20 2b 20 6d 5b  f( (delCost + m[
41d0: 78 42 5d 29 3c 74 6f 74 61 6c 43 6f 73 74 20 29  xB])<totalCost )
41e0: 7b 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c 43  {.        totalC
41f0: 6f 73 74 20 3d 20 64 65 6c 43 6f 73 74 20 2b 20  ost = delCost + 
4200: 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20 20 20 6e  m[xB];.        n
4210: 63 78 20 3d 20 63 41 3b 0a 20 20 20 20 20 20 7d  cx = cA;.      }
4220: 0a 20 20 20 20 20 20 69 66 28 20 28 73 75 62 43  .      if( (subC
4230: 6f 73 74 20 2b 20 64 29 3c 74 6f 74 61 6c 43 6f  ost + d)<totalCo
4240: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f  st ){.        to
4250: 74 61 6c 43 6f 73 74 20 3d 20 73 75 62 43 6f 73  talCost = subCos
4260: 74 20 2b 20 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t + d;.      }..
4270: 23 69 66 20 30 0a 20 20 20 20 20 20 70 72 69 6e  #if 0.      prin
4280: 74 66 28 22 25 64 2c 25 64 20 64 3d 25 34 64 20  tf("%d,%d d=%4d 
4290: 75 3d 25 34 64 20 72 3d 25 34 64 20 64 63 3d 25  u=%4d r=%4d dc=%
42a0: 63 20 63 41 3d 25 63 20 63 42 3d 25 63 22 0a 20  c cA=%c cB=%c". 
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 69 6e              " in
42c0: 73 3d 25 34 64 20 64 65 6c 3d 25 34 64 20 73 75  s=%4d del=%4d su
42d0: 62 3d 25 34 64 20 74 3d 25 34 64 20 6e 63 78 3d  b=%4d t=%4d ncx=
42e0: 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
42f0: 20 20 20 20 78 41 2c 20 78 42 2c 20 64 2c 20 6d      xA, xB, d, m
4300: 5b 78 42 5d 2c 20 6d 5b 78 42 2d 31 5d 2c 20 64  [xB], m[xB-1], d
4310: 63 3f 64 63 3a 27 20 27 2c 20 63 41 2c 20 63 42  c?dc:' ', cA, cB
4320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
4330: 6e 73 43 6f 73 74 2c 20 64 65 6c 43 6f 73 74 2c  nsCost, delCost,
4340: 20 73 75 62 43 6f 73 74 2c 20 74 6f 74 61 6c 43   subCost, totalC
4350: 6f 73 74 2c 20 6e 63 78 3f 6e 63 78 3a 27 20 27  ost, ncx?ncx:' '
4360: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
4370: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6d   /* Update the m
4380: 61 74 72 69 78 20 2a 2f 0a 20 20 20 20 20 20 64  atrix */.      d
4390: 20 3d 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20   = m[xB];.      
43a0: 64 63 20 3d 20 63 78 5b 78 42 5d 3b 0a 20 20 20  dc = cx[xB];.   
43b0: 20 20 20 6d 5b 78 42 5d 20 3d 20 74 6f 74 61 6c     m[xB] = total
43c0: 43 6f 73 74 3b 0a 20 20 20 20 20 20 63 78 5b 78  Cost;.      cx[x
43d0: 42 5d 20 3d 20 6e 63 78 3b 0a 20 20 20 20 20 20  B] = ncx;.      
43e0: 63 42 70 72 65 76 20 3d 20 63 42 3b 0a 20 20 20  cBprev = cB;.   
43f0: 20 7d 0a 20 20 20 20 63 41 70 72 65 76 20 3d 20   }.    cAprev = 
4400: 63 41 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72  cA;.  }..  /* Fr
4410: 65 65 20 74 68 65 20 77 61 67 6e 65 72 20 6d 61  ee the wagner ma
4420: 74 72 69 78 20 61 6e 64 20 72 65 74 75 72 6e 20  trix and return 
4430: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
4440: 69 66 28 20 63 41 3d 3d 27 2a 27 20 29 7b 0a 20  if( cA=='*' ){. 
4450: 20 20 20 72 65 73 20 3d 20 6d 5b 31 5d 3b 0a 20     res = m[1];. 
4460: 20 20 20 66 6f 72 28 78 42 3d 31 3b 20 78 42 3c     for(xB=1; xB<
4470: 3d 6e 42 3b 20 78 42 2b 2b 29 7b 0a 20 20 20 20  =nB; xB++){.    
4480: 20 20 69 66 28 20 6d 5b 78 42 5d 3c 72 65 73 20    if( m[xB]<res 
4490: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
44a0: 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20 20 20   m[xB];.        
44b0: 69 66 28 20 70 6e 4d 61 74 63 68 20 29 20 2a 70  if( pnMatch ) *p
44c0: 6e 4d 61 74 63 68 20 3d 20 78 42 2b 6e 4d 61 74  nMatch = xB+nMat
44d0: 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ch;.      }.    
44e0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
44f0: 65 73 20 3d 20 6d 5b 6e 42 5d 3b 0a 20 20 20 20  es = m[nB];.    
4500: 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  /* In the curren
4510: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
4520: 2c 20 70 6e 4d 61 74 63 68 20 69 73 20 61 6c 77  , pnMatch is alw
4530: 61 79 73 20 4e 55 4c 4c 20 69 66 20 7a 41 20 64  ays NULL if zA d
4540: 6f 65 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  oes.    ** not e
4550: 6e 64 20 69 6e 20 22 2a 22 20 2a 2f 0a 20 20 20  nd in "*" */.   
4560: 20 61 73 73 65 72 74 28 20 70 6e 4d 61 74 63 68   assert( pnMatch
4570: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ==0 );.  }.  sql
4580: 69 74 65 33 5f 66 72 65 65 28 74 6f 46 72 65 65  ite3_free(toFree
4590: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
45a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
45b0: 6f 6e 3a 20 20 20 20 65 64 69 74 64 69 73 74 28  on:    editdist(
45c0: 41 2c 42 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  A,B).**.** Retur
45d0: 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 72  n the cost of tr
45e0: 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74 72 69 6e  ansforming strin
45f0: 67 20 41 20 69 6e 74 6f 20 73 74 72 69 6e 67 20  g A into string 
4600: 42 2e 20 20 42 6f 74 68 20 73 74 72 69 6e 67 73  B.  Both strings
4610: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 70 75 72 65  .** must be pure
4620: 20 41 53 43 49 49 20 74 65 78 74 2e 20 20 49 66   ASCII text.  If
4630: 20 41 20 65 6e 64 73 20 77 69 74 68 20 27 2a 27   A ends with '*'
4640: 20 74 68 65 6e 20 69 74 20 69 73 20 61 73 73 75   then it is assu
4650: 6d 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 70  med to be.** a p
4660: 72 65 66 69 78 20 6f 66 20 42 20 61 6e 64 20 65  refix of B and e
4670: 78 74 72 61 20 63 68 61 72 61 63 74 65 72 73 20  xtra characters 
4680: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 42 20  on the end of B 
4690: 68 61 76 65 20 6d 69 6e 69 6d 61 6c 20 61 64 64  have minimal add
46a0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 63 6f 73 74 2e  itional.** cost.
46b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
46c0: 65 64 69 74 64 69 73 74 53 71 6c 46 75 6e 63 28  editdistSqlFunc(
46d0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
46e0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
46f0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
4700: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
4710: 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 65  ){.  int res = e
4720: 64 69 74 64 69 73 74 31 28 0a 20 20 20 20 20 20  ditdist1(.      
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
4740: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
4750: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
4760: 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20  gv[0]),.        
4770: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
4780: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
4790: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
47a0: 5b 31 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  [1]),.          
47b0: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
47c0: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
47d0: 20 69 66 28 20 72 65 73 3d 3d 28 2d 33 29 20 29   if( res==(-3) )
47e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
47f0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
4800: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
4810: 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d   }else if( res==
4820: 28 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 73 71  (-2) ){.      sq
4830: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
4840: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 6e 6f 6e  or(context, "non
4850: 2d 41 53 43 49 49 20 69 6e 70 75 74 20 74 6f 20  -ASCII input to 
4860: 65 64 69 74 64 69 73 74 28 29 22 2c 20 2d 31 29  editdist()", -1)
4870: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4880: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4890: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
48a0: 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f 20   "NULL input to 
48b0: 65 64 69 74 64 69 73 74 28 29 22 2c 20 2d 31 29  editdist()", -1)
48c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
48d0: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65   .    sqlite3_re
48e0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
48f0: 2c 20 72 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , res);.  }.}../
4900: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 69 78  * End of the fix
4910: 65 64 2d 63 6f 73 74 20 65 64 69 74 20 64 69 73  ed-cost edit dis
4920: 74 61 6e 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61  tance implementa
4930: 74 69 6f 6e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion.***********
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4980: 2a 2a 2a 0a 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 2a 2a 2a 2a 2a  ****************
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 0a 2a 2a 20 42 65 67 69 6e 3a 20 43 6f 6e 66  *.** Begin: Conf
49e0: 69 67 75 72 61 62 6c 65 20 63 6f 73 74 20 75 6e  igurable cost un
49f0: 69 63 6f 64 65 20 65 64 69 74 20 64 69 73 74 61  icode edit dista
4a00: 6e 63 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2f 0a  nce routines.*/.
4a10: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
4a20: 72 61 74 69 6f 6e 20 6f 66 20 73 74 72 75 63 74  ration of struct
4a30: 75 72 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  ures */.typedef 
4a40: 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33  struct EditDist3
4a50: 43 6f 73 74 20 45 64 69 74 44 69 73 74 33 43 6f  Cost EditDist3Co
4a60: 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  st;.typedef stru
4a70: 63 74 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66  ct EditDist3Conf
4a80: 69 67 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66  ig EditDist3Conf
4a90: 69 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ig;.typedef stru
4aa0: 63 74 20 45 64 69 74 44 69 73 74 33 50 6f 69 6e  ct EditDist3Poin
4ab0: 74 20 45 64 69 74 44 69 73 74 33 50 6f 69 6e 74  t EditDist3Point
4ac0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
4ad0: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 20 45   EditDist3From E
4ae0: 64 69 74 44 69 73 74 33 46 72 6f 6d 3b 0a 74 79  ditDist3From;.ty
4af0: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69  pedef struct Edi
4b00: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
4b10: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
4b20: 72 69 6e 67 3b 0a 74 79 70 65 64 65 66 20 73 74  ring;.typedef st
4b30: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54 6f  ruct EditDist3To
4b40: 20 45 64 69 74 44 69 73 74 33 54 6f 3b 0a 74 79   EditDist3To;.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 53 74 72 69 6e 67 20 45  tDist3ToString E
4b70: 64 69 74 44 69 73 74 33 54 6f 53 74 72 69 6e 67  ditDist3ToString
4b80: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
4b90: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 45   EditDist3Lang E
4ba0: 64 69 74 44 69 73 74 33 4c 61 6e 67 3b 0a 0a 0a  ditDist3Lang;...
4bb0: 2f 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 69  /*.** An entry i
4bc0: 6e 20 74 68 65 20 65 64 69 74 20 63 6f 73 74 20  n the edit cost 
4bd0: 74 61 62 6c 65 0a 2a 2f 0a 73 74 72 75 63 74 20  table.*/.struct 
4be0: 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 7b 0a  EditDist3Cost {.
4bf0: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
4c00: 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e  *pNext;     /* N
4c10: 65 78 74 20 63 6f 73 74 20 65 6c 65 6d 65 6e 74  ext cost element
4c20: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 6f 6d 3b 20   */.  u8 nFrom; 
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4c50: 65 73 20 69 6e 20 61 46 72 6f 6d 20 2a 2f 0a 20  es in aFrom */. 
4c60: 20 75 38 20 6e 54 6f 3b 20 20 20 20 20 20 20 20   u8 nTo;        
4c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4c80: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
4c90: 20 61 54 6f 20 2a 2f 0a 20 20 75 31 36 20 69 43   aTo */.  u16 iC
4ca0: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
4cb0: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74      /* Cost of t
4cc0: 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
4cd0: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 61 5b 34  on */.  char a[4
4ce0: 5d 20 20 20 20 3b 20 20 20 20 20 20 20 20 20 20  ]    ;          
4cf0: 20 20 2f 2a 20 46 52 4f 4d 20 73 74 72 69 6e 67    /* FROM string
4d00: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 54 4f 20   followed by TO 
4d10: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 2f 2a 20 41  string */.  /* A
4d20: 64 64 69 74 69 6f 6e 61 6c 20 54 4f 20 61 6e 64  dditional TO and
4d30: 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 62 79 74   FROM string byt
4d40: 65 73 20 61 70 70 65 6e 64 65 64 20 61 73 20 6e  es appended as n
4d50: 65 63 65 73 73 61 72 79 20 2a 2f 0a 7d 3b 0a 0a  ecessary */.};..
4d60: 2f 2a 0a 2a 2a 20 45 64 69 74 20 63 6f 73 74 73  /*.** Edit costs
4d70: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
4d80: 72 20 6c 61 6e 67 75 61 67 65 20 49 44 20 0a 2a  r language ID .*
4d90: 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44 69 73  /.struct EditDis
4da0: 74 33 4c 61 6e 67 20 7b 0a 20 20 69 6e 74 20 69  t3Lang {.  int i
4db0: 4c 61 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20  Lang;           
4dc0: 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 49 44    /* Language ID
4dd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 73 43 6f   */.  int iInsCo
4de0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
4df0: 44 65 66 61 75 6c 74 20 69 6e 73 65 72 74 69 6f  Default insertio
4e00: 6e 20 63 6f 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n cost */.  int 
4e10: 69 44 65 6c 43 6f 73 74 3b 20 20 20 20 20 20 20  iDelCost;       
4e20: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 64 65     /* Default de
4e30: 6c 65 74 69 6f 6e 20 63 6f 73 74 20 2a 2f 0a 20  letion cost */. 
4e40: 20 69 6e 74 20 69 53 75 62 43 6f 73 74 3b 20 20   int iSubCost;  
4e50: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
4e60: 6c 74 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  lt substitution 
4e70: 63 6f 73 74 20 2a 2f 0a 20 20 45 64 69 74 44 69  cost */.  EditDi
4e80: 73 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 3b 20  st3Cost *pCost; 
4e90: 20 2f 2a 20 43 6f 73 74 73 20 2a 2f 0a 7d 3b 0a   /* Costs */.};.
4ea0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  ../*.** The defa
4eb0: 75 6c 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e  ult EditDist3Lan
4ec0: 67 20 6f 62 6a 65 63 74 2c 20 77 69 74 68 20 64  g object, with d
4ed0: 65 66 61 75 6c 74 20 63 6f 73 74 73 2e 0a 2a 2f  efault costs..*/
4ee0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 45 64  .static const Ed
4ef0: 69 74 44 69 73 74 33 4c 61 6e 67 20 65 64 69 74  itDist3Lang edit
4f00: 44 69 73 74 33 4c 61 6e 67 20 3d 20 7b 20 30 2c  Dist3Lang = { 0,
4f10: 20 31 30 30 2c 20 31 30 30 2c 20 31 35 30 2c 20   100, 100, 150, 
4f20: 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0 };../*.** Comp
4f30: 6c 65 74 65 20 63 6f 6e 66 69 67 75 72 61 74 69  lete configurati
4f40: 6f 6e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69  on.*/.struct Edi
4f50: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 7b 0a 20  tDist3Config {. 
4f60: 20 69 6e 74 20 6e 4c 61 6e 67 3b 20 20 20 20 20   int nLang;     
4f70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4f80: 72 20 6f 66 20 6c 61 6e 67 75 61 67 65 20 49 44  r of language ID
4f90: 73 2e 20 20 53 69 7a 65 20 6f 66 20 61 5b 5d 20  s.  Size of a[] 
4fa0: 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 4c 61  */.  EditDist3La
4fb0: 6e 67 20 2a 61 3b 20 20 20 20 20 20 2f 2a 20 4f  ng *a;      /* O
4fc0: 6e 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74  ne for each dist
4fd0: 69 6e 63 74 20 6c 61 6e 67 75 61 67 65 20 49 44  inct language ID
4fe0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 78   */.};../*.** Ex
4ff0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
5000: 61 62 6f 75 74 20 65 61 63 68 20 63 68 61 72 61  about each chara
5010: 63 74 65 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  cter in the FROM
5020: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75   string..*/.stru
5030: 63 74 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  ct EditDist3From
5040: 20 7b 0a 20 20 69 6e 74 20 6e 53 75 62 73 74 3b   {.  int nSubst;
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5060: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 73 74   Number of subst
5070: 69 74 75 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74  itution cost ent
5080: 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ries */.  int nD
5090: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
50a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
50b0: 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65 6e  deletion cost en
50c0: 74 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tries */.  int n
50d0: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
50e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
50f0: 20 62 79 74 65 73 20 69 6e 20 74 68 69 73 20 63   bytes in this c
5100: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 45 64  haracter */.  Ed
5110: 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 61 70  itDist3Cost **ap
5120: 53 75 62 73 74 3b 20 2f 2a 20 41 72 72 61 79 20  Subst; /* Array 
5130: 6f 66 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  of substitution 
5140: 63 6f 73 74 73 20 66 6f 72 20 74 68 69 73 20 65  costs for this e
5150: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 64 69 74  lement */.  Edit
5160: 44 69 73 74 33 43 6f 73 74 20 2a 2a 61 70 44 65  Dist3Cost **apDe
5170: 6c 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  l;   /* Array of
5180: 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65   deletion cost e
5190: 6e 74 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ntries */.};../*
51a0: 0a 2a 2a 20 41 20 70 72 65 63 6f 6d 70 69 6c 65  .** A precompile
51b0: 64 20 46 52 4f 4d 20 73 74 72 69 6e 67 2e 0a 2a  d FROM string..*
51c0: 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** In the commo
51d0: 6e 20 63 61 73 65 20 77 65 20 65 78 70 65 63 74  n case we expect
51e0: 20 74 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67   the FROM string
51f0: 20 74 6f 20 62 65 20 72 65 75 73 65 64 20 6d 75   to be reused mu
5200: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2a  ltiple times..**
5210: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
5220: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
5230: 20 77 69 6c 6c 20 62 65 20 74 6f 20 6d 65 61 73   will be to meas
5240: 75 72 65 20 74 68 65 20 65 64 69 74 20 64 69 73  ure the edit dis
5250: 74 61 6e 63 65 0a 2a 2a 20 66 72 6f 6d 20 61 20  tance.** from a 
5260: 73 69 6e 67 6c 65 20 6f 72 69 67 69 6e 20 73 74  single origin st
5270: 72 69 6e 67 20 74 6f 20 6d 75 6c 74 69 70 6c 65  ring to multiple
5280: 20 74 61 72 67 65 74 20 73 74 72 69 6e 67 73 2e   target strings.
5290: 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44  .*/.struct EditD
52a0: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 7b  ist3FromString {
52b0: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
52d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
52e0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 73 74 72   of the FROM str
52f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ing */.  int n; 
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5320: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
5330: 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f 0a   FROM string */.
5340: 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 3b 20    int isPrefix; 
5350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
5360: 75 65 20 69 66 20 65 6e 64 73 20 77 69 74 68 20  ue if ends with 
5370: 27 2a 27 20 63 68 61 72 61 63 74 65 72 20 2a 2f  '*' character */
5380: 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  .  EditDist3From
5390: 20 2a 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 45   *a;        /* E
53a0: 78 74 72 61 20 69 6e 66 6f 20 61 62 6f 75 74 20  xtra info about 
53b0: 65 61 63 68 20 63 68 61 72 20 6f 66 20 74 68 65  each char of the
53c0: 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f 0a   FROM string */.
53d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 20  };../*.** Extra 
53e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
53f0: 74 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72  t each character
5400: 20 69 6e 20 74 68 65 20 54 4f 20 73 74 72 69 6e   in the TO strin
5410: 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69  g..*/.struct Edi
5420: 74 44 69 73 74 33 54 6f 20 7b 0a 20 20 69 6e 74  tDist3To {.  int
5430: 20 6e 49 6e 73 3b 20 20 20 20 20 20 20 20 20 20   nIns;          
5440: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5450: 6f 66 20 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73  of insertion cos
5460: 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 69  t entries */.  i
5470: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
5480: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5490: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
54a0: 69 73 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  is character */.
54b0: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
54c0: 2a 2a 61 70 49 6e 73 3b 20 20 20 2f 2a 20 41 72  **apIns;   /* Ar
54d0: 72 61 79 20 6f 66 20 64 65 6c 65 74 69 6f 6e 20  ray of deletion 
54e0: 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a  cost entries */.
54f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 72 65 63  };../*.** A prec
5500: 6f 6d 70 69 6c 65 64 20 46 52 4f 4d 20 73 74 72  ompiled FROM str
5510: 69 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64  ing.*/.struct Ed
5520: 69 74 44 69 73 74 33 54 6f 53 74 72 69 6e 67 20  itDist3ToString 
5530: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  {.  char *z;    
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5550: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  The complete tex
5560: 74 20 6f 66 20 74 68 65 20 54 4f 20 73 74 72 69  t of the TO stri
5570: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ng */.  int n;  
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
55a0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
55b0: 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 45  TO string */.  E
55c0: 64 69 74 44 69 73 74 33 54 6f 20 2a 61 3b 20 20  ditDist3To *a;  
55d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
55e0: 20 69 6e 66 6f 20 61 62 6f 75 74 20 65 61 63 68   info about each
55f0: 20 63 68 61 72 20 6f 66 20 74 68 65 20 54 4f 20   char of the TO 
5600: 73 74 72 69 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  string */.};../*
5610: 0a 2a 2a 20 43 6c 65 61 72 20 6f 72 20 64 65 6c  .** Clear or del
5620: 65 74 65 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ete an instance 
5630: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 74 68  of the object th
5640: 61 74 20 72 65 63 6f 72 64 73 20 61 6c 6c 20 65  at records all e
5650: 64 69 74 2d 64 69 73 74 61 6e 63 65 0a 2a 2a 20  dit-distance.** 
5660: 77 65 69 67 68 74 73 2e 0a 2a 2f 0a 73 74 61 74  weights..*/.stat
5670: 69 63 20 76 6f 69 64 20 65 64 69 74 44 69 73 74  ic void editDist
5680: 33 43 6f 6e 66 69 67 43 6c 65 61 72 28 45 64 69  3ConfigClear(Edi
5690: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 29  tDist3Config *p)
56a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
56b0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
56c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
56d0: 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nLang; i++){.   
56e0: 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a   EditDist3Cost *
56f0: 70 43 6f 73 74 2c 20 2a 70 4e 65 78 74 3b 0a 20  pCost, *pNext;. 
5700: 20 20 20 70 43 6f 73 74 20 3d 20 70 2d 3e 61 5b     pCost = p->a[
5710: 69 5d 2e 70 43 6f 73 74 3b 0a 20 20 20 20 77 68  i].pCost;.    wh
5720: 69 6c 65 28 20 70 43 6f 73 74 20 29 7b 0a 20 20  ile( pCost ){.  
5730: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 43 6f 73      pNext = pCos
5740: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
5750: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
5760: 73 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  st);.      pCost
5770: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   = pNext;.    }.
5780: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
5790: 65 65 28 70 2d 3e 61 29 3b 0a 20 20 6d 65 6d 73  ee(p->a);.  mems
57a0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
57b0: 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  *p));.}.static v
57c0: 6f 69 64 20 65 64 69 74 44 69 73 74 33 43 6f 6e  oid editDist3Con
57d0: 66 69 67 44 65 6c 65 74 65 28 76 6f 69 64 20 2a  figDelete(void *
57e0: 70 49 6e 29 7b 0a 20 20 45 64 69 74 44 69 73 74  pIn){.  EditDist
57f0: 33 43 6f 6e 66 69 67 20 2a 70 20 3d 20 28 45 64  3Config *p = (Ed
5800: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 2a 29 70  itDist3Config*)p
5810: 49 6e 3b 0a 20 20 65 64 69 74 44 69 73 74 33 43  In;.  editDist3C
5820: 6f 6e 66 69 67 43 6c 65 61 72 28 70 29 3b 0a 20  onfigClear(p);. 
5830: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
5840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
5850: 61 6c 6c 20 65 64 69 74 2d 64 69 73 74 61 6e 63  all edit-distanc
5860: 65 20 77 65 69 67 68 74 73 20 66 72 6f 6d 20 61  e weights from a
5870: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
5880: 63 20 69 6e 74 20 65 64 69 74 44 69 73 74 33 43  c int editDist3C
5890: 6f 6e 66 69 67 4c 6f 61 64 28 0a 20 20 45 64 69  onfigLoad(.  Edi
58a0: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 2c  tDist3Config *p,
58b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 64 69        /* The edi
58c0: 74 20 64 69 73 74 61 6e 63 65 20 63 6f 6e 66 69  t distance confi
58d0: 67 75 72 61 74 69 6f 6e 20 74 6f 20 6c 6f 61 64  guration to load
58e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
58f0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
5900: 20 4c 6f 61 64 20 66 72 6f 6d 20 74 68 69 73 20   Load from this 
5910: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
5920: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
5930: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
5940: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
5950: 77 68 69 63 68 20 74 6f 20 6c 6f 61 64 20 2a 2f  which to load */
5960: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5970: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
5980: 20 72 63 2c 20 72 63 32 3b 0a 20 20 63 68 61 72   rc, rc2;.  char
5990: 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69 4c   *zSql;.  int iL
59a0: 61 6e 67 50 72 65 76 20 3d 20 2d 39 39 39 39 3b  angPrev = -9999;
59b0: 0a 20 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  .  EditDist3Lang
59c0: 20 2a 70 4c 61 6e 67 20 3d 20 30 3b 0a 0a 20 20   *pLang = 0;..  
59d0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
59e0: 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 69  printf("SELECT i
59f0: 4c 61 6e 67 2c 20 63 46 72 6f 6d 2c 20 63 54 6f  Lang, cFrom, cTo
5a00: 2c 20 69 43 6f 73 74 22 0a 20 20 20 20 20 20 20  , iCost".       
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 22 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20    " FROM \"%w\" 
5a30: 57 48 45 52 45 20 69 4c 61 6e 67 3e 3d 30 20 4f  WHERE iLang>=0 O
5a40: 52 44 45 52 20 42 59 20 69 4c 61 6e 67 22 2c 20  RDER BY iLang", 
5a50: 7a 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 7a  zTable);.  if( z
5a60: 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
5a70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5a80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
5a90: 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  pare(db, zSql, -
5aa0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
5ac0: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
5ad0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 65 64 69  return rc;.  edi
5ae0: 74 44 69 73 74 33 43 6f 6e 66 69 67 43 6c 65 61  tDist3ConfigClea
5af0: 72 28 70 29 3b 0a 20 20 77 68 69 6c 65 28 20 73  r(p);.  while( s
5b00: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
5b10: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
5b20: 7b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20  {.    int iLang 
5b30: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
5b40: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
5b50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5b60: 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63  zFrom = (const c
5b70: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
5b80: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
5b90: 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 46 72 6f  1);.    int nFro
5ba0: 6d 20 3d 20 7a 46 72 6f 6d 20 3f 20 73 71 6c 69  m = zFrom ? sqli
5bb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
5bc0: 28 70 53 74 6d 74 2c 20 31 29 20 3a 20 30 3b 0a  (pStmt, 1) : 0;.
5bd0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5be0: 7a 54 6f 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zTo = (const cha
5bf0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5c00: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29  n_text(pStmt, 2)
5c10: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20  ;.    int nTo = 
5c20: 7a 54 6f 20 3f 20 73 71 6c 69 74 65 33 5f 63 6f  zTo ? sqlite3_co
5c30: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
5c40: 2c 20 32 29 20 3a 20 30 3b 0a 20 20 20 20 69 6e  , 2) : 0;.    in
5c50: 74 20 69 43 6f 73 74 20 3d 20 73 71 6c 69 74 65  t iCost = sqlite
5c60: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
5c70: 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 61 73 73  mt, 3);..    ass
5c80: 65 72 74 28 20 7a 46 72 6f 6d 21 3d 30 20 7c 7c  ert( zFrom!=0 ||
5c90: 20 6e 46 72 6f 6d 3d 3d 30 20 29 3b 0a 20 20 20   nFrom==0 );.   
5ca0: 20 61 73 73 65 72 74 28 20 7a 54 6f 21 3d 30 20   assert( zTo!=0 
5cb0: 7c 7c 20 6e 54 6f 3d 3d 30 20 29 3b 0a 20 20 20  || nTo==0 );.   
5cc0: 20 69 66 28 20 6e 46 72 6f 6d 3e 31 30 30 20 7c   if( nFrom>100 |
5cd0: 7c 20 6e 54 6f 3e 31 30 30 20 29 20 63 6f 6e 74  | nTo>100 ) cont
5ce0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 69 43  inue;.    if( iC
5cf0: 6f 73 74 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65  ost<0 ) continue
5d00: 3b 0a 20 20 20 20 69 66 28 20 70 4c 61 6e 67 3d  ;.    if( pLang=
5d10: 3d 30 20 7c 7c 20 69 4c 61 6e 67 21 3d 69 4c 61  =0 || iLang!=iLa
5d20: 6e 67 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  ngPrev ){.      
5d30: 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70  EditDist3Lang *p
5d40: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  New;.      pNew 
5d50: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
5d60: 63 28 70 2d 3e 61 2c 20 28 70 2d 3e 6e 4c 61 6e  c(p->a, (p->nLan
5d70: 67 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  g+1)*sizeof(p->a
5d80: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
5d90: 20 70 4e 65 77 3d 3d 30 20 29 7b 20 72 63 20 3d   pNew==0 ){ rc =
5da0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20 62   SQLITE_NOMEM; b
5db0: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 70 2d  reak; }.      p-
5dc0: 3e 61 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  >a = pNew;.     
5dd0: 20 70 4c 61 6e 67 20 3d 20 26 70 2d 3e 61 5b 70   pLang = &p->a[p
5de0: 2d 3e 6e 4c 61 6e 67 5d 3b 0a 20 20 20 20 20 20  ->nLang];.      
5df0: 70 2d 3e 6e 4c 61 6e 67 2b 2b 3b 0a 20 20 20 20  p->nLang++;.    
5e00: 20 20 70 4c 61 6e 67 2d 3e 69 4c 61 6e 67 20 3d    pLang->iLang =
5e10: 20 69 4c 61 6e 67 3b 0a 20 20 20 20 20 20 70 4c   iLang;.      pL
5e20: 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 20 3d 20  ang->iInsCost = 
5e30: 31 30 30 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67  100;.      pLang
5e40: 2d 3e 69 44 65 6c 43 6f 73 74 20 3d 20 31 30 30  ->iDelCost = 100
5e50: 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  ;.      pLang->i
5e60: 53 75 62 43 6f 73 74 20 3d 20 31 35 30 3b 0a 20  SubCost = 150;. 
5e70: 20 20 20 20 20 70 4c 61 6e 67 2d 3e 70 43 6f 73       pLang->pCos
5e80: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 4c 61  t = 0;.      iLa
5e90: 6e 67 50 72 65 76 20 3d 20 69 4c 61 6e 67 3b 0a  ngPrev = iLang;.
5ea0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
5eb0: 72 6f 6d 3d 3d 31 20 26 26 20 7a 46 72 6f 6d 5b  rom==1 && zFrom[
5ec0: 30 5d 3d 3d 27 3f 27 20 26 26 20 6e 54 6f 3d 3d  0]=='?' && nTo==
5ed0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67  0 ){.      pLang
5ee0: 2d 3e 69 44 65 6c 43 6f 73 74 20 3d 20 69 43 6f  ->iDelCost = iCo
5ef0: 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  st;.    }else if
5f00: 28 20 6e 46 72 6f 6d 3d 3d 30 20 26 26 20 6e 54  ( nFrom==0 && nT
5f10: 6f 3d 3d 31 20 26 26 20 7a 54 6f 5b 30 5d 3d 3d  o==1 && zTo[0]==
5f20: 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 70 4c 61  '?' ){.      pLa
5f30: 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 20 3d 20 69  ng->iInsCost = i
5f40: 43 6f 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Cost;.    }else 
5f50: 69 66 28 20 6e 46 72 6f 6d 3d 3d 31 20 26 26 20  if( nFrom==1 && 
5f60: 6e 54 6f 3d 3d 31 20 26 26 20 7a 46 72 6f 6d 5b  nTo==1 && zFrom[
5f70: 30 5d 3d 3d 27 3f 27 20 26 26 20 7a 54 6f 5b 30  0]=='?' && zTo[0
5f80: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='?' ){.      
5f90: 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73 74 20  pLang->iSubCost 
5fa0: 3d 20 69 43 6f 73 74 3b 0a 20 20 20 20 7d 65 6c  = iCost;.    }el
5fb0: 73 65 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69  se{.      EditDi
5fc0: 73 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 3b 0a  st3Cost *pCost;.
5fd0: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61        int nExtra
5fe0: 20 3d 20 6e 46 72 6f 6d 20 2b 20 6e 54 6f 20 2d   = nFrom + nTo -
5ff0: 20 34 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   4;.      if( nE
6000: 78 74 72 61 3c 30 20 29 20 6e 45 78 74 72 61 20  xtra<0 ) nExtra 
6010: 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  = 0;.      pCost
6020: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
6030: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74  c( sizeof(*pCost
6040: 29 20 2b 20 6e 45 78 74 72 61 20 29 3b 0a 20 20  ) + nExtra );.  
6050: 20 20 20 20 69 66 28 20 70 43 6f 73 74 3d 3d 30      if( pCost==0
6060: 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   ){ rc = SQLITE_
6070: 4e 4f 4d 45 4d 3b 20 62 72 65 61 6b 3b 20 7d 0a  NOMEM; break; }.
6080: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 46 72        pCost->nFr
6090: 6f 6d 20 3d 20 6e 46 72 6f 6d 3b 0a 20 20 20 20  om = nFrom;.    
60a0: 20 20 70 43 6f 73 74 2d 3e 6e 54 6f 20 3d 20 6e    pCost->nTo = n
60b0: 54 6f 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  To;.      pCost-
60c0: 3e 69 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a  >iCost = iCost;.
60d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f        memcpy(pCo
60e0: 73 74 2d 3e 61 2c 20 7a 46 72 6f 6d 2c 20 6e 46  st->a, zFrom, nF
60f0: 72 6f 6d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rom);.      memc
6100: 70 79 28 70 43 6f 73 74 2d 3e 61 20 2b 20 6e 46  py(pCost->a + nF
6110: 72 6f 6d 2c 20 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  rom, zTo, nTo);.
6120: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 4e 65        pCost->pNe
6130: 78 74 20 3d 20 70 4c 61 6e 67 2d 3e 70 43 6f 73  xt = pLang->pCos
6140: 74 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e  t;.      pLang->
6150: 70 43 6f 73 74 20 3d 20 70 43 6f 73 74 3b 20 0a  pCost = pCost; .
6160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 32 20      }.  }.  rc2 
6170: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
6180: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
6190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
61a0: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 72 65 74   rc = rc2;.  ret
61b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
61c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
61d0: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 6f 66  th (in bytes) of
61e0: 20 61 20 75 74 66 2d 38 20 63 68 61 72 61 63 74   a utf-8 charact
61f0: 65 72 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 61  er.  Or return a
6200: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 6f 66 20 4e   maximum.** of N
6210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6220: 75 74 66 38 4c 65 6e 28 75 6e 73 69 67 6e 65 64  utf8Len(unsigned
6230: 20 63 68 61 72 20 63 2c 20 69 6e 74 20 4e 29 7b   char c, int N){
6240: 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 31 3b 0a  .  int len = 1;.
6250: 20 20 69 66 28 20 63 3e 30 78 37 66 20 29 7b 0a    if( c>0x7f ){.
6260: 20 20 20 20 69 66 28 20 28 63 26 30 78 65 30 29      if( (c&0xe0)
6270: 3d 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  ==0xc0 ){.      
6280: 6c 65 6e 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  len = 2;.    }el
6290: 73 65 20 69 66 28 20 28 63 26 30 78 66 30 29 3d  se if( (c&0xf0)=
62a0: 3d 30 78 65 30 20 29 7b 0a 20 20 20 20 20 20 6c  =0xe0 ){.      l
62b0: 65 6e 20 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  en = 3;.    }els
62c0: 65 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 34  e{.      len = 4
62d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
62e0: 28 20 6c 65 6e 3e 4e 20 29 20 6c 65 6e 20 3d 20  ( len>N ) len = 
62f0: 4e 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  N;.  return len;
6300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6310: 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
6320: 20 69 66 20 74 68 65 20 54 6f 20 73 69 64 65 20   if the To side 
6330: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 73  of the given cos
6340: 74 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65  t matches.** the
6350: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 0a 2a   given string..*
6360: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
6370: 63 68 54 6f 28 45 64 69 74 44 69 73 74 33 43 6f  chTo(EditDist3Co
6380: 73 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  st *p, const cha
6390: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
63a0: 69 66 28 20 70 2d 3e 6e 54 6f 3e 6e 20 29 20 72  if( p->nTo>n ) r
63b0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
63c0: 74 72 6e 63 6d 70 28 70 2d 3e 61 2b 70 2d 3e 6e  trncmp(p->a+p->n
63d0: 46 72 6f 6d 2c 20 7a 2c 20 70 2d 3e 6e 54 6f 29  From, z, p->nTo)
63e0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
63f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
6400: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
6410: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74   (non-zero) if t
6420: 68 65 20 46 72 6f 6d 20 73 69 64 65 20 6f 66 20  he From side of 
6430: 74 68 65 20 67 69 76 65 6e 20 63 6f 73 74 20 6d  the given cost m
6440: 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 67 69  atches.** the gi
6450: 76 65 6e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ven string..*/.s
6460: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 46  tatic int matchF
6470: 72 6f 6d 28 45 64 69 74 44 69 73 74 33 43 6f 73  rom(EditDist3Cos
6480: 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  t *p, const char
6490: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61   *z, int n){.  a
64a0: 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 6f 6d 3c  ssert( p->nFrom<
64b0: 3d 6e 20 29 3b 0a 20 20 69 66 28 20 73 74 72 6e  =n );.  if( strn
64c0: 63 6d 70 28 70 2d 3e 61 2c 20 7a 2c 20 70 2d 3e  cmp(p->a, z, p->
64d0: 6e 46 72 6f 6d 29 21 3d 30 20 29 20 72 65 74 75  nFrom)!=0 ) retu
64e0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
64f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6500: 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
6510: 29 20 6f 66 20 74 68 65 20 6e 65 78 74 20 46 52  ) of the next FR
6520: 4f 4d 20 63 68 61 72 61 63 74 65 72 20 61 6e 64  OM character and
6530: 20 74 68 65 20 6e 65 78 74 20 54 4f 0a 2a 2a 20   the next TO.** 
6540: 63 68 61 72 61 63 74 65 72 20 61 72 65 20 74 68  character are th
6550: 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e same..*/.stati
6560: 63 20 69 6e 74 20 6d 61 74 63 68 46 72 6f 6d 54  c int matchFromT
6570: 6f 28 0a 20 20 45 64 69 74 44 69 73 74 33 46 72  o(.  EditDist3Fr
6580: 6f 6d 53 74 72 69 6e 67 20 2a 70 53 74 72 2c 20  omString *pStr, 
6590: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 74   /* Left hand st
65a0: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 31  ring */.  int n1
65b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
65c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
65d0: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 63 68 61  f comparison cha
65e0: 72 61 63 74 65 72 20 6f 6e 20 74 68 65 20 6c 65  racter on the le
65f0: 66 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ft */.  const ch
6600: 61 72 20 2a 7a 32 2c 20 20 20 20 20 20 20 20 20  ar *z2,         
6610: 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e      /* Right-han
6620: 64 6c 20 63 6f 6d 70 61 72 69 73 6f 6e 20 63 68  dl comparison ch
6630: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
6640: 20 6e 32 20 20 20 20 20 20 20 20 20 20 20 20 20   n2             
6650: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
6660: 73 20 72 65 6d 61 69 6e 69 6e 67 20 69 6e 20 7a  s remaining in z
6670: 32 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  2[] */.){.  int 
6680: 62 31 20 3d 20 70 53 74 72 2d 3e 61 5b 6e 31 5d  b1 = pStr->a[n1]
6690: 2e 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 62 31  .nByte;.  if( b1
66a0: 3e 6e 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >n2 ) return 0;.
66b0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 53 74    if( memcmp(pSt
66c0: 72 2d 3e 7a 2b 6e 31 2c 20 7a 32 2c 20 62 31 29  r->z+n1, z2, b1)
66d0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
66e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
66f0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 45  *.** Delete an E
6700: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
6710: 6e 67 20 6f 62 6a 65 63 63 74 0a 2a 2f 0a 73 74  ng objecct.*/.st
6720: 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 44 69  atic void editDi
6730: 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c  st3FromStringDel
6740: 65 74 65 28 45 64 69 74 44 69 73 74 33 46 72 6f  ete(EditDist3Fro
6750: 6d 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69  mString *p){.  i
6760: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 20 29 7b  nt i;.  if( p ){
6770: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6780: 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  p->n; i++){.    
6790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
67a0: 2d 3e 61 5b 69 5d 2e 61 70 44 65 6c 29 3b 0a 20  ->a[i].apDel);. 
67b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
67c0: 65 28 70 2d 3e 61 5b 69 5d 2e 61 70 53 75 62 73  e(p->a[i].apSubs
67d0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
67e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
67f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
6800: 74 65 20 61 20 45 64 69 74 44 69 73 74 33 46 72  te a EditDist3Fr
6810: 6f 6d 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 2e  omString object.
6820: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 64 69 74 44  .*/.static EditD
6830: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a  ist3FromString *
6840: 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  editDist3FromStr
6850: 69 6e 67 4e 65 77 28 0a 20 20 63 6f 6e 73 74 20  ingNew(.  const 
6860: 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70  EditDist3Lang *p
6870: 4c 61 6e 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Lang,.  const ch
6880: 61 72 20 2a 7a 2c 0a 20 20 69 6e 74 20 6e 0a 29  ar *z,.  int n.)
6890: 7b 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f  {.  EditDist3Fro
68a0: 6d 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20  mString *pStr;. 
68b0: 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a   EditDist3Cost *
68c0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  p;.  int i;..  i
68d0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
68e0: 20 30 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20   0;.  if( n<0 ) 
68f0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
6900: 7a 29 3b 0a 20 20 70 53 74 72 20 3d 20 73 71 6c  z);.  pStr = sql
6910: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
6920: 65 6f 66 28 2a 70 53 74 72 29 20 2b 20 73 69 7a  eof(*pStr) + siz
6930: 65 6f 66 28 70 53 74 72 2d 3e 61 5b 30 5d 29 2a  eof(pStr->a[0])*
6940: 6e 20 2b 20 6e 20 2b 20 31 20 29 3b 0a 20 20 69  n + n + 1 );.  i
6950: 66 28 20 70 53 74 72 3d 3d 30 20 29 20 72 65 74  f( pStr==0 ) ret
6960: 75 72 6e 20 30 3b 0a 20 20 70 53 74 72 2d 3e 61  urn 0;.  pStr->a
6970: 20 3d 20 28 45 64 69 74 44 69 73 74 33 46 72 6f   = (EditDist3Fro
6980: 6d 2a 29 26 70 53 74 72 5b 31 5d 3b 0a 20 20 6d  m*)&pStr[1];.  m
6990: 65 6d 73 65 74 28 70 53 74 72 2d 3e 61 2c 20 30  emset(pStr->a, 0
69a0: 2c 20 73 69 7a 65 6f 66 28 70 53 74 72 2d 3e 61  , sizeof(pStr->a
69b0: 5b 30 5d 29 2a 6e 29 3b 0a 20 20 70 53 74 72 2d  [0])*n);.  pStr-
69c0: 3e 6e 20 3d 20 6e 3b 0a 20 20 70 53 74 72 2d 3e  >n = n;.  pStr->
69d0: 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 53 74 72  z = (char*)&pStr
69e0: 2d 3e 61 5b 6e 5d 3b 0a 20 20 6d 65 6d 63 70 79  ->a[n];.  memcpy
69f0: 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c 20 6e 2b 31  (pStr->z, z, n+1
6a00: 29 3b 0a 20 20 69 66 28 20 6e 20 26 26 20 7a 5b  );.  if( n && z[
6a10: 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20  n-1]=='*' ){.   
6a20: 20 70 53 74 72 2d 3e 69 73 50 72 65 66 69 78 20   pStr->isPrefix 
6a30: 3d 20 31 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  = 1;.    n--;.  
6a40: 20 20 70 53 74 72 2d 3e 6e 2d 2d 3b 0a 20 20 20    pStr->n--;.   
6a50: 20 70 53 74 72 2d 3e 7a 5b 6e 5d 20 3d 20 30 3b   pStr->z[n] = 0;
6a60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
6a70: 74 72 2d 3e 69 73 50 72 65 66 69 78 20 3d 20 30  tr->isPrefix = 0
6a80: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
6a90: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
6aa0: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 20 2a   EditDist3From *
6ab0: 70 46 72 6f 6d 20 3d 20 26 70 53 74 72 2d 3e 61  pFrom = &pStr->a
6ac0: 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  [i];.    memset(
6ad0: 70 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pFrom, 0, sizeof
6ae0: 28 2a 70 46 72 6f 6d 29 29 3b 0a 20 20 20 20 70  (*pFrom));.    p
6af0: 46 72 6f 6d 2d 3e 6e 42 79 74 65 20 3d 20 75 74  From->nByte = ut
6b00: 66 38 4c 65 6e 28 28 75 6e 73 69 67 6e 65 64 20  f8Len((unsigned 
6b10: 63 68 61 72 29 7a 5b 69 5d 2c 20 6e 2d 69 29 3b  char)z[i], n-i);
6b20: 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 61 6e 67  .    for(p=pLang
6b30: 2d 3e 70 43 6f 73 74 3b 20 70 3b 20 70 3d 70 2d  ->pCost; p; p=p-
6b40: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 45  >pNext){.      E
6b50: 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 61  ditDist3Cost **a
6b60: 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28 20  pNew;.      if( 
6b70: 69 2b 70 2d 3e 6e 46 72 6f 6d 3e 6e 20 29 20 63  i+p->nFrom>n ) c
6b80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
6b90: 66 28 20 6d 61 74 63 68 46 72 6f 6d 28 70 2c 20  f( matchFrom(p, 
6ba0: 7a 2b 69 2c 20 6e 2d 69 29 3d 3d 30 20 29 20 63  z+i, n-i)==0 ) c
6bb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
6bc0: 66 28 20 70 2d 3e 6e 54 6f 3d 3d 30 20 29 7b 0a  f( p->nTo==0 ){.
6bd0: 20 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20          apNew = 
6be0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
6bf0: 70 46 72 6f 6d 2d 3e 61 70 44 65 6c 2c 0a 20 20  pFrom->apDel,.  
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
6c20: 7a 65 6f 66 28 2a 61 70 4e 65 77 29 2a 28 70 46  zeof(*apNew)*(pF
6c30: 72 6f 6d 2d 3e 6e 44 65 6c 2b 31 29 29 3b 0a 20  rom->nDel+1));. 
6c40: 20 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77         if( apNew
6c50: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
6c60: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 61 70 44 65       pFrom->apDe
6c70: 6c 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20  l = apNew;.     
6c80: 20 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e     apNew[pFrom->
6c90: 6e 44 65 6c 2b 2b 5d 20 3d 20 70 3b 0a 20 20 20  nDel++] = p;.   
6ca0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6cb0: 20 20 61 70 4e 65 77 20 3d 20 73 71 6c 69 74 65    apNew = sqlite
6cc0: 33 5f 72 65 61 6c 6c 6f 63 28 70 46 72 6f 6d 2d  3_realloc(pFrom-
6cd0: 3e 61 70 53 75 62 73 74 2c 0a 20 20 20 20 20 20  >apSubst,.      
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
6d00: 28 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f 6d 2d  (*apNew)*(pFrom-
6d10: 3e 6e 53 75 62 73 74 2b 31 29 29 3b 0a 20 20 20  >nSubst+1));.   
6d20: 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d       if( apNew==
6d30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
6d40: 20 20 20 70 46 72 6f 6d 2d 3e 61 70 53 75 62 73     pFrom->apSubs
6d50: 74 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20  t = apNew;.     
6d60: 20 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e     apNew[pFrom->
6d70: 6e 53 75 62 73 74 2b 2b 5d 20 3d 20 70 3b 0a 20  nSubst++] = p;. 
6d80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6d90: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
6da0: 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  editDist3FromStr
6db0: 69 6e 67 44 65 6c 65 74 65 28 70 53 74 72 29 3b  ingDelete(pStr);
6dc0: 0a 20 20 20 20 20 20 70 53 74 72 20 3d 20 30 3b  .      pStr = 0;
6dd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6de0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6df0: 20 70 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pStr;.}../*.** 
6e00: 55 70 64 61 74 65 20 65 6e 74 72 79 20 6d 5b 69  Update entry m[i
6e10: 5d 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  ] such that it i
6e20: 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 66  s the minimum of
6e30: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
6e40: 75 65 0a 2a 2a 20 61 6e 64 20 6d 5b 6a 5d 2b 69  ue.** and m[j]+i
6e50: 43 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Cost..**.** If t
6e60: 68 65 20 69 43 6f 73 74 20 69 73 20 31 2c 30 30  he iCost is 1,00
6e70: 30 2c 30 30 30 20 6f 72 20 67 72 65 61 74 65 72  0,000 or greater
6e80: 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20  , then consider 
6e90: 74 68 65 20 63 6f 73 74 20 74 6f 20 62 65 0a 2a  the cost to be.*
6ea0: 2a 20 69 6e 66 69 6e 69 74 65 20 61 6e 64 20 73  * infinite and s
6eb0: 6b 69 70 20 74 68 65 20 75 70 64 61 74 65 2e 0a  kip the update..
6ec0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
6ed0: 70 64 61 74 65 43 6f 73 74 28 0a 20 20 75 6e 73  pdateCost(.  uns
6ee0: 69 67 6e 65 64 20 69 6e 74 20 2a 6d 2c 0a 20 20  igned int *m,.  
6ef0: 69 6e 74 20 69 2c 0a 20 20 69 6e 74 20 6a 2c 0a  int i,.  int j,.
6f00: 20 20 69 6e 74 20 69 43 6f 73 74 0a 29 7b 0a 20    int iCost.){. 
6f10: 20 61 73 73 65 72 74 28 20 69 43 6f 73 74 3e 3d   assert( iCost>=
6f20: 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 73 74  0 );.  if( iCost
6f30: 3c 31 30 30 30 30 20 29 7b 0a 20 20 20 20 75 6e  <10000 ){.    un
6f40: 73 69 67 6e 65 64 20 69 6e 74 20 62 20 3d 20 6d  signed int b = m
6f50: 5b 6a 5d 20 2b 20 69 43 6f 73 74 3b 0a 20 20 20  [j] + iCost;.   
6f60: 20 69 66 28 20 62 3c 6d 5b 69 5d 20 29 20 6d 5b   if( b<m[i] ) m[
6f70: 69 5d 20 3d 20 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f  i] = b;.  }.}../
6f80: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 65 64  * Compute the ed
6f90: 69 74 20 64 69 73 74 61 6e 63 65 20 62 65 74 77  it distance betw
6fa0: 65 65 6e 20 74 77 6f 20 73 74 72 69 6e 67 73 2e  een two strings.
6fb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
6fc0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
6fd0: 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
6fe0: 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ber which is the
6ff0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
7000: 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69 73  ** If pnMatch is
7010: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
7020: 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74 20  *pnMatch is set 
7030: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
7040: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 28   characters.** (
7050: 6e 6f 74 20 62 79 74 65 73 29 20 69 6e 20 7a 32  not bytes) in z2
7060: 20 74 68 61 74 20 6d 61 74 63 68 65 64 20 74 68   that matched th
7070: 65 20 73 65 61 72 63 68 20 70 61 74 74 65 72 6e  e search pattern
7080: 20 69 6e 20 2a 70 46 72 6f 6d 2e 20 49 66 20 70   in *pFrom. If p
7090: 46 72 6f 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  From does.** not
70a0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 61 74   contain the pat
70b0: 74 65 72 6e 20 66 6f 72 20 61 20 70 72 65 66 69  tern for a prefi
70c0: 78 2d 73 65 61 72 63 68 2c 20 74 68 65 6e 20 74  x-search, then t
70d0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
70e0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63  e number.** of c
70f0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 32 2e  haracters in z2.
7100: 20 49 66 20 70 46 72 6f 6d 20 64 6f 65 73 20 63   If pFrom does c
7110: 6f 6e 74 61 69 6e 20 61 20 70 72 65 66 69 78 20  ontain a prefix 
7120: 73 65 61 72 63 68 20 70 61 74 74 65 72 6e 2c 20  search pattern, 
7130: 74 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 74 68  then.** it is th
7140: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
7150: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 70 72  acters in the pr
7160: 65 66 69 78 20 6f 66 20 7a 32 20 74 68 61 74 20  efix of z2 that 
7170: 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20 0a 2a  was deemed to .*
7180: 2a 20 6d 61 74 63 68 20 70 46 72 6f 6d 2e 0a 2a  * match pFrom..*
7190: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69  /.static int edi
71a0: 74 44 69 73 74 33 43 6f 72 65 28 0a 20 20 45 64  tDist3Core(.  Ed
71b0: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
71c0: 67 20 2a 70 46 72 6f 6d 2c 20 20 2f 2a 20 54 68  g *pFrom,  /* Th
71d0: 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f  e FROM string */
71e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
71f0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
7200: 2f 2a 20 54 68 65 20 54 4f 20 73 74 72 69 6e 67  /* The TO string
7210: 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 20 20   */.  int n2,   
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
7240: 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f  the TO string */
7250: 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73  .  const EditDis
7260: 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 20 20  t3Lang *pLang,  
7270: 2f 2a 20 45 64 69 74 20 77 65 69 67 68 74 73 20  /* Edit weights 
7280: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
7290: 20 6c 61 6e 67 75 61 67 65 20 49 44 20 2a 2f 0a   language ID */.
72a0: 20 20 69 6e 74 20 2a 70 6e 4d 61 74 63 68 20 20    int *pnMatch  
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72c0: 2a 20 4f 55 54 3a 20 43 68 61 72 61 63 74 65 72  * OUT: Character
72d0: 73 20 69 6e 20 6d 61 74 63 68 65 64 20 70 72 65  s in matched pre
72e0: 66 69 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  fix */.){.  int 
72f0: 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 31 2c 20  k, n;.  int i1, 
7300: 62 31 3b 0a 20 20 69 6e 74 20 69 32 2c 20 62 32  b1;.  int i2, b2
7310: 3b 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f  ;.  EditDist3Fro
7320: 6d 53 74 72 69 6e 67 20 66 20 3d 20 2a 70 46 72  mString f = *pFr
7330: 6f 6d 3b 0a 20 20 45 64 69 74 44 69 73 74 33 54  om;.  EditDist3T
7340: 6f 20 2a 61 32 3b 0a 20 20 75 6e 73 69 67 6e 65  o *a2;.  unsigne
7350: 64 20 69 6e 74 20 2a 6d 3b 0a 20 20 69 6e 74 20  d int *m;.  int 
7360: 73 7a 52 6f 77 3b 0a 20 20 45 64 69 74 44 69 73  szRow;.  EditDis
7370: 74 33 43 6f 73 74 20 2a 70 3b 0a 20 20 69 6e 74  t3Cost *p;.  int
7380: 20 72 65 73 3b 0a 0a 20 20 2f 2a 20 61 6c 6c 6f   res;..  /* allo
7390: 63 61 74 65 20 74 68 65 20 57 61 67 6e 65 72 20  cate the Wagner 
73a0: 6d 61 74 72 69 78 20 61 6e 64 20 74 68 65 20 61  matrix and the a
73b0: 54 6f 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 74  To[] array for t
73c0: 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a  he TO string */.
73d0: 20 20 6e 20 3d 20 28 66 2e 6e 2b 31 29 2a 28 6e    n = (f.n+1)*(n
73e0: 32 2b 31 29 3b 0a 20 20 6e 20 3d 20 28 6e 2b 31  2+1);.  n = (n+1
73f0: 29 26 7e 31 3b 0a 20 20 6d 20 3d 20 73 71 6c 69  )&~1;.  m = sqli
7400: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2a 73 69  te3_malloc( n*si
7410: 7a 65 6f 66 28 6d 5b 30 5d 29 20 2b 20 73 69 7a  zeof(m[0]) + siz
7420: 65 6f 66 28 61 32 5b 30 5d 29 2a 6e 32 20 29 3b  eof(a2[0])*n2 );
7430: 0a 20 20 69 66 28 20 6d 3d 3d 30 20 29 20 72 65  .  if( m==0 ) re
7440: 74 75 72 6e 20 2d 31 3b 20 20 20 20 20 20 20 20  turn -1;        
7450: 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 6d 65      /* Out of me
7460: 6d 6f 72 79 20 2a 2f 0a 20 20 61 32 20 3d 20 28  mory */.  a2 = (
7470: 45 64 69 74 44 69 73 74 33 54 6f 2a 29 26 6d 5b  EditDist3To*)&m[
7480: 6e 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 32 2c  n];.  memset(a2,
7490: 20 30 2c 20 73 69 7a 65 6f 66 28 61 32 5b 30 5d   0, sizeof(a2[0]
74a0: 29 2a 6e 32 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  )*n2);..  /* Fil
74b0: 6c 20 69 6e 20 74 68 65 20 61 31 5b 5d 20 6d 61  l in the a1[] ma
74c0: 74 72 69 78 20 66 6f 72 20 61 6c 6c 20 63 68 61  trix for all cha
74d0: 72 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 54  racters of the T
74e0: 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 66 6f  O string */.  fo
74f0: 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b 20 69  r(i2=0; i2<n2; i
7500: 32 2b 2b 29 7b 0a 20 20 20 20 61 32 5b 69 32 5d  2++){.    a2[i2]
7510: 2e 6e 42 79 74 65 20 3d 20 75 74 66 38 4c 65 6e  .nByte = utf8Len
7520: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
7530: 7a 32 5b 69 32 5d 2c 20 6e 32 2d 69 32 29 3b 0a  z2[i2], n2-i2);.
7540: 20 20 20 20 66 6f 72 28 70 3d 70 4c 61 6e 67 2d      for(p=pLang-
7550: 3e 70 43 6f 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  >pCost; p; p=p->
7560: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 45 64  pNext){.      Ed
7570: 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 61 70  itDist3Cost **ap
7580: 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  New;.      if( p
7590: 2d 3e 6e 46 72 6f 6d 3e 30 20 29 20 63 6f 6e 74  ->nFrom>0 ) cont
75a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
75b0: 69 32 2b 70 2d 3e 6e 54 6f 3e 6e 32 20 29 20 63  i2+p->nTo>n2 ) c
75c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
75d0: 66 28 20 6d 61 74 63 68 54 6f 28 70 2c 20 7a 32  f( matchTo(p, z2
75e0: 2b 69 32 2c 20 6e 32 2d 69 32 29 3d 3d 30 20 29  +i2, n2-i2)==0 )
75f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7600: 20 61 32 5b 69 32 5d 2e 6e 49 6e 73 2b 2b 3b 0a   a2[i2].nIns++;.
7610: 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 73 71        apNew = sq
7620: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 32  lite3_realloc(a2
7630: 5b 69 32 5d 2e 61 70 49 6e 73 2c 20 73 69 7a 65  [i2].apIns, size
7640: 6f 66 28 2a 61 70 4e 65 77 29 2a 61 32 5b 69 32  of(*apNew)*a2[i2
7650: 5d 2e 6e 49 6e 73 29 3b 0a 20 20 20 20 20 20 69  ].nIns);.      i
7660: 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  f( apNew==0 ){. 
7670: 20 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b         res = -1;
7680: 20 20 2f 2a 20 4f 75 74 20 6f 66 20 6d 65 6d 6f    /* Out of memo
7690: 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  ry */.        go
76a0: 74 6f 20 65 64 69 74 44 69 73 74 33 41 62 6f 72  to editDist3Abor
76b0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
76c0: 20 61 32 5b 69 32 5d 2e 61 70 49 6e 73 20 3d 20   a2[i2].apIns = 
76d0: 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 32 5b  apNew;.      a2[
76e0: 69 32 5d 2e 61 70 49 6e 73 5b 61 32 5b 69 32 5d  i2].apIns[a2[i2]
76f0: 2e 6e 49 6e 73 2d 31 5d 20 3d 20 70 3b 0a 20 20  .nIns-1] = p;.  
7700: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
7710: 65 70 61 72 65 20 74 6f 20 63 6f 6d 70 75 74 65  epare to compute
7720: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 65 64 69   the minimum edi
7730: 74 20 64 69 73 74 61 6e 63 65 20 2a 2f 0a 20 20  t distance */.  
7740: 73 7a 52 6f 77 20 3d 20 66 2e 6e 2b 31 3b 0a 20  szRow = f.n+1;. 
7750: 20 6d 65 6d 73 65 74 28 6d 2c 20 30 78 30 31 2c   memset(m, 0x01,
7760: 20 28 6e 32 2b 31 29 2a 73 7a 52 6f 77 2a 73 69   (n2+1)*szRow*si
7770: 7a 65 6f 66 28 6d 5b 30 5d 29 29 3b 0a 20 20 6d  zeof(m[0]));.  m
7780: 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  [0] = 0;..  /* F
7790: 69 72 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  irst fill in the
77a0: 20 74 6f 70 2d 72 6f 77 20 6f 66 20 74 68 65 20   top-row of the 
77b0: 6d 61 74 72 69 78 20 77 69 74 68 20 46 52 4f 4d  matrix with FROM
77c0: 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 73 20   deletion costs 
77d0: 2a 2f 0a 20 20 66 6f 72 28 69 31 3d 30 3b 20 69  */.  for(i1=0; i
77e0: 31 3c 66 2e 6e 3b 20 69 31 20 2b 3d 20 62 31 29  1<f.n; i1 += b1)
77f0: 7b 0a 20 20 20 20 62 31 20 3d 20 66 2e 61 5b 69  {.    b1 = f.a[i
7800: 31 5d 2e 6e 42 79 74 65 3b 0a 20 20 20 20 75 70  1].nByte;.    up
7810: 64 61 74 65 43 6f 73 74 28 6d 2c 20 69 31 2b 62  dateCost(m, i1+b
7820: 31 2c 20 69 31 2c 20 70 4c 61 6e 67 2d 3e 69 44  1, i1, pLang->iD
7830: 65 6c 43 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72  elCost);.    for
7840: 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e  (k=0; k<f.a[i1].
7850: 6e 44 65 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  nDel; k++){.    
7860: 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70    p = f.a[i1].ap
7870: 44 65 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 75 70  Del[k];.      up
7880: 64 61 74 65 43 6f 73 74 28 6d 2c 20 69 31 2b 70  dateCost(m, i1+p
7890: 2d 3e 6e 46 72 6f 6d 2c 20 69 31 2c 20 70 2d 3e  ->nFrom, i1, p->
78a0: 69 43 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  iCost);.    }.  
78b0: 7d 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  }..  /* Fill in 
78c0: 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72  all subsequent r
78d0: 6f 77 73 2c 20 74 6f 70 2d 74 6f 2d 62 6f 74 74  ows, top-to-bott
78e0: 6f 6d 2c 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68  om, left-to-righ
78f0: 74 20 2a 2f 0a 20 20 66 6f 72 28 69 32 3d 30 3b  t */.  for(i2=0;
7900: 20 69 32 3c 6e 32 3b 20 69 32 20 2b 3d 20 62 32   i2<n2; i2 += b2
7910: 29 7b 0a 20 20 20 20 69 6e 74 20 72 78 3b 20 20  ){.    int rx;  
7920: 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20      /* Starting 
7930: 69 6e 64 65 78 20 66 6f 72 20 63 75 72 72 65 6e  index for curren
7940: 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  t row */.    int
7950: 20 72 78 70 3b 20 20 20 20 20 2f 2a 20 53 74 61   rxp;     /* Sta
7960: 72 74 69 6e 67 20 69 6e 64 65 78 20 66 6f 72 20  rting index for 
7970: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
7980: 20 20 20 20 62 32 20 3d 20 61 32 5b 69 32 5d 2e      b2 = a2[i2].
7990: 6e 42 79 74 65 3b 0a 20 20 20 20 72 78 20 3d 20  nByte;.    rx = 
79a0: 73 7a 52 6f 77 2a 28 69 32 2b 62 32 29 3b 0a 20  szRow*(i2+b2);. 
79b0: 20 20 20 72 78 70 20 3d 20 73 7a 52 6f 77 2a 69     rxp = szRow*i
79c0: 32 3b 0a 20 20 20 20 75 70 64 61 74 65 43 6f 73  2;.    updateCos
79d0: 74 28 6d 2c 20 72 78 2c 20 72 78 70 2c 20 70 4c  t(m, rx, rxp, pL
79e0: 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 29 3b 0a  ang->iInsCost);.
79f0: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 61      for(k=0; k<a
7a00: 32 5b 69 32 5d 2e 6e 49 6e 73 3b 20 6b 2b 2b 29  2[i2].nIns; k++)
7a10: 7b 0a 20 20 20 20 20 20 70 20 3d 20 61 32 5b 69  {.      p = a2[i
7a20: 32 5d 2e 61 70 49 6e 73 5b 6b 5d 3b 0a 20 20 20  2].apIns[k];.   
7a30: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
7a40: 20 73 7a 52 6f 77 2a 28 69 32 2b 70 2d 3e 6e 54   szRow*(i2+p->nT
7a50: 6f 29 2c 20 72 78 70 2c 20 70 2d 3e 69 43 6f 73  o), rxp, p->iCos
7a60: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  t);.    }.    fo
7a70: 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20  r(i1=0; i1<f.n; 
7a80: 69 31 2b 3d 62 31 29 7b 0a 20 20 20 20 20 20 69  i1+=b1){.      i
7a90: 6e 74 20 63 78 3b 20 20 20 20 2f 2a 20 49 6e 64  nt cx;    /* Ind
7aa0: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65  ex of current ce
7ab0: 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ll */.      int 
7ac0: 63 78 70 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20  cxp;   /* Index 
7ad0: 6f 66 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  of cell immediat
7ae0: 65 6c 79 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ely to the left 
7af0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 78 64  */.      int cxd
7b00: 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  ;   /* Index of 
7b10: 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
7b20: 20 61 6e 64 20 6f 6e 65 20 72 6f 77 20 61 62 6f   and one row abo
7b30: 76 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ve */.      int 
7b40: 63 78 75 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20  cxu;   /* Index 
7b50: 6f 66 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  of cell immediat
7b60: 65 6c 79 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ely above */.   
7b70: 20 20 20 62 31 20 3d 20 66 2e 61 5b 69 31 5d 2e     b1 = f.a[i1].
7b80: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 63 78 70  nByte;.      cxp
7b90: 20 3d 20 72 78 20 2b 20 69 31 3b 0a 20 20 20 20   = rx + i1;.    
7ba0: 20 20 63 78 20 3d 20 63 78 70 20 2b 20 62 31 3b    cx = cxp + b1;
7bb0: 0a 20 20 20 20 20 20 63 78 64 20 3d 20 72 78 70  .      cxd = rxp
7bc0: 20 2b 20 69 31 3b 0a 20 20 20 20 20 20 63 78 75   + i1;.      cxu
7bd0: 20 3d 20 63 78 64 20 2b 20 62 31 3b 0a 20 20 20   = cxd + b1;.   
7be0: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
7bf0: 20 63 78 2c 20 63 78 70 2c 20 70 4c 61 6e 67 2d   cx, cxp, pLang-
7c00: 3e 69 44 65 6c 43 6f 73 74 29 3b 0a 20 20 20 20  >iDelCost);.    
7c10: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61    for(k=0; k<f.a
7c20: 5b 69 31 5d 2e 6e 44 65 6c 3b 20 6b 2b 2b 29 7b  [i1].nDel; k++){
7c30: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66 2e 61  .        p = f.a
7c40: 5b 69 31 5d 2e 61 70 44 65 6c 5b 6b 5d 3b 0a 20  [i1].apDel[k];. 
7c50: 20 20 20 20 20 20 20 75 70 64 61 74 65 43 6f 73         updateCos
7c60: 74 28 6d 2c 20 63 78 70 2b 70 2d 3e 6e 46 72 6f  t(m, cxp+p->nFro
7c70: 6d 2c 20 63 78 70 2c 20 70 2d 3e 69 43 6f 73 74  m, cxp, p->iCost
7c80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7c90: 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63   updateCost(m, c
7ca0: 78 2c 20 63 78 75 2c 20 70 4c 61 6e 67 2d 3e 69  x, cxu, pLang->i
7cb0: 49 6e 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  InsCost);.      
7cc0: 69 66 28 20 6d 61 74 63 68 46 72 6f 6d 54 6f 28  if( matchFromTo(
7cd0: 26 66 2c 20 69 31 2c 20 7a 32 2b 69 32 2c 20 6e  &f, i1, z2+i2, n
7ce0: 32 2d 69 32 29 20 29 7b 0a 20 20 20 20 20 20 20  2-i2) ){.       
7cf0: 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63   updateCost(m, c
7d00: 78 2c 20 63 78 64 2c 20 30 29 3b 0a 20 20 20 20  x, cxd, 0);.    
7d10: 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65    }.      update
7d20: 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 64 2c  Cost(m, cx, cxd,
7d30: 20 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73 74   pLang->iSubCost
7d40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  );.      for(k=0
7d50: 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 53 75 62  ; k<f.a[i1].nSub
7d60: 73 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  st; k++){.      
7d70: 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70    p = f.a[i1].ap
7d80: 53 75 62 73 74 5b 6b 5d 3b 0a 20 20 20 20 20 20  Subst[k];.      
7d90: 20 20 69 66 28 20 6d 61 74 63 68 54 6f 28 70 2c    if( matchTo(p,
7da0: 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29 20 29   z2+i2, n2-i2) )
7db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 64 61  {.          upda
7dc0: 74 65 43 6f 73 74 28 6d 2c 20 63 78 64 2b 70 2d  teCost(m, cxd+p-
7dd0: 3e 6e 46 72 6f 6d 2b 73 7a 52 6f 77 2a 70 2d 3e  >nFrom+szRow*p->
7de0: 6e 54 6f 2c 20 63 78 64 2c 20 70 2d 3e 69 43 6f  nTo, cxd, p->iCo
7df0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
7e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7e10: 0a 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e 61 62  ..#if 0  /* Enab
7e20: 6c 65 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  le for debugging
7e30: 20 2a 2f 0a 20 20 70 72 69 6e 74 66 28 22 20 20   */.  printf("  
7e40: 20 20 20 20 20 20 20 5e 22 29 3b 0a 20 20 66 6f         ^");.  fo
7e50: 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20  r(i1=0; i1<f.n; 
7e60: 69 31 2b 2b 29 20 70 72 69 6e 74 66 28 22 20 25  i1++) printf(" %
7e70: 63 2d 25 32 78 22 2c 20 66 2e 7a 5b 69 31 5d 2c  c-%2x", f.z[i1],
7e80: 20 66 2e 7a 5b 69 31 5d 26 30 78 66 66 29 3b 0a   f.z[i1]&0xff);.
7e90: 20 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 5e    printf("\n   ^
7ea0: 3a 22 29 3b 0a 20 20 66 6f 72 28 69 31 3d 30 3b  :");.  for(i1=0;
7eb0: 20 69 31 3c 73 7a 52 6f 77 3b 20 69 31 2b 2b 29   i1<szRow; i1++)
7ec0: 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 6d 5b  {.    int v = m[
7ed0: 69 31 5d 3b 0a 20 20 20 20 69 66 28 20 76 3e 39  i1];.    if( v>9
7ee0: 39 39 39 20 29 20 70 72 69 6e 74 66 28 22 20 2a  999 ) printf(" *
7ef0: 2a 2a 2a 22 29 3b 0a 20 20 20 20 65 6c 73 65 20  ***");.    else 
7f00: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
7f10: 20 25 34 64 22 2c 20 76 29 3b 0a 20 20 7d 0a 20   %4d", v);.  }. 
7f20: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
7f30: 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32   for(i2=0; i2<n2
7f40: 3b 20 69 32 2b 2b 29 7b 0a 20 20 20 20 70 72 69  ; i2++){.    pri
7f50: 6e 74 66 28 22 25 63 2d 25 30 32 78 3a 22 2c 20  ntf("%c-%02x:", 
7f60: 7a 32 5b 69 32 5d 2c 20 7a 32 5b 69 32 5d 26 30  z2[i2], z2[i2]&0
7f70: 78 66 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 31  xff);.    for(i1
7f80: 3d 30 3b 20 69 31 3c 73 7a 52 6f 77 3b 20 69 31  =0; i1<szRow; i1
7f90: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  ++){.      int v
7fa0: 20 3d 20 6d 5b 28 69 32 2b 31 29 2a 73 7a 52 6f   = m[(i2+1)*szRo
7fb0: 77 2b 69 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  w+i1];.      if(
7fc0: 20 76 3e 39 39 39 39 20 29 20 70 72 69 6e 74 66   v>9999 ) printf
7fd0: 28 22 20 2a 2a 2a 2a 22 29 3b 0a 20 20 20 20 20  (" ****");.     
7fe0: 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 70 72   else         pr
7ff0: 69 6e 74 66 28 22 20 25 34 64 22 2c 20 76 29 3b  intf(" %4d", v);
8000: 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
8010: 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e  f("\n");.  }.#en
8020: 64 69 66 0a 0a 20 20 2f 2a 20 46 72 65 65 20 6d  dif..  /* Free m
8030: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
8040: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  s and return the
8050: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 72 65 73   result */.  res
8060: 20 3d 20 28 69 6e 74 29 6d 5b 73 7a 52 6f 77 2a   = (int)m[szRow*
8070: 28 6e 32 2b 31 29 2d 31 5d 3b 0a 20 20 6e 20 3d  (n2+1)-1];.  n =
8080: 20 6e 32 3b 0a 20 20 69 66 28 20 66 2e 69 73 50   n2;.  if( f.isP
8090: 72 65 66 69 78 20 29 7b 0a 20 20 20 20 66 6f 72  refix ){.    for
80a0: 28 69 32 3d 31 3b 20 69 32 3c 3d 6e 32 3b 20 69  (i2=1; i2<=n2; i
80b0: 32 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  2++){.      int 
80c0: 62 20 3d 20 6d 5b 73 7a 52 6f 77 2a 69 32 2d 31  b = m[szRow*i2-1
80d0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 62 3c 3d  ];.      if( b<=
80e0: 72 65 73 20 29 7b 20 0a 20 20 20 20 20 20 20 20  res ){ .        
80f0: 72 65 73 20 3d 20 62 3b 0a 20 20 20 20 20 20 20  res = b;.       
8100: 20 6e 20 3d 20 69 32 20 2d 20 31 3b 0a 20 20 20   n = i2 - 1;.   
8110: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8120: 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29 7b 0a   if( pnMatch ){.
8130: 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d      int nExtra =
8140: 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b   0;.    for(k=0;
8150: 20 6b 3c 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20   k<n; k++){.    
8160: 20 20 69 66 28 20 28 7a 32 5b 6b 5d 20 26 20 30    if( (z2[k] & 0
8170: 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 45 78  xc0)==0x80 ) nEx
8180: 74 72 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  tra++;.    }.   
8190: 20 2a 70 6e 4d 61 74 63 68 20 3d 20 6e 20 2d 20   *pnMatch = n - 
81a0: 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 65 64 69  nExtra;.  }..edi
81b0: 74 44 69 73 74 33 41 62 6f 72 74 3a 0a 20 20 66  tDist3Abort:.  f
81c0: 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b 20  or(i2=0; i2<n2; 
81d0: 69 32 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66 72  i2++) sqlite3_fr
81e0: 65 65 28 61 32 5b 69 32 5d 2e 61 70 49 6e 73 29  ee(a2[i2].apIns)
81f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8200: 28 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (m);.  return re
8210: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  s;.}../*.** Get 
8220: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 45  an appropriate E
8230: 64 69 74 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a  ditDist3Lang obj
8240: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ect..*/.static c
8250: 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c 61  onst EditDist3La
8260: 6e 67 20 2a 65 64 69 74 44 69 73 74 33 46 69 6e  ng *editDist3Fin
8270: 64 4c 61 6e 67 28 0a 20 20 45 64 69 74 44 69 73  dLang(.  EditDis
8280: 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  t3Config *pConfi
8290: 67 2c 0a 20 20 69 6e 74 20 69 4c 61 6e 67 0a 29  g,.  int iLang.)
82a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
82b0: 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
82c0: 3e 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  >nLang; i++){.  
82d0: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
82e0: 5b 69 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61 6e 67  [i].iLang==iLang
82f0: 20 29 20 72 65 74 75 72 6e 20 26 70 43 6f 6e 66   ) return &pConf
8300: 69 67 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ig->a[i];.  }.  
8310: 72 65 74 75 72 6e 20 26 65 64 69 74 44 69 73 74  return &editDist
8320: 33 4c 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  3Lang;.}../*.** 
8330: 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65 64 69  Function:    edi
8340: 74 64 69 73 74 33 28 41 2c 42 2c 69 4c 61 6e 67  tdist3(A,B,iLang
8350: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
8360: 20 20 65 64 69 74 64 69 73 74 33 28 74 61 62 6c    editdist3(tabl
8370: 65 6e 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52 65 74  ename).**.** Ret
8380: 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
8390: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74 72  transforming str
83a0: 69 6e 67 20 41 20 69 6e 74 6f 20 73 74 72 69 6e  ing A into strin
83b0: 67 20 42 20 75 73 69 6e 67 20 65 64 69 74 0a 2a  g B using edit.*
83c0: 2a 20 77 65 69 67 68 74 73 20 66 6f 72 20 69 4c  * weights for iL
83d0: 61 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ang..**.** The s
83e0: 65 63 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61 64 73  econd form loads
83f0: 20 65 64 69 74 20 77 65 69 67 68 74 73 20 69 6e   edit weights in
8400: 74 6f 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 61  to memory from a
8410: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
8420: 63 20 76 6f 69 64 20 65 64 69 74 44 69 73 74 33  c void editDist3
8430: 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  SqlFunc(.  sqlit
8440: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
8450: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
8460: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8470: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 45 64 69   **argv.){.  Edi
8480: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43  tDist3Config *pC
8490: 6f 6e 66 69 67 20 3d 20 28 45 64 69 74 44 69 73  onfig = (EditDis
84a0: 74 33 43 6f 6e 66 69 67 2a 29 73 71 6c 69 74 65  t3Config*)sqlite
84b0: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
84c0: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  ext);.  sqlite3 
84d0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
84e0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
84f0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 6e 74 20  context);.  int 
8500: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  rc;.  if( argc==
8510: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  1 ){.    const c
8520: 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20 28 63  har *zTable = (c
8530: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
8540: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8550: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 63 20 3d  gv[0]);.    rc =
8560: 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   editDist3Config
8570: 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 64 62  Load(pConfig, db
8580: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
8590: 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 5f  f( rc ) sqlite3_
85a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
85b0: 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a  e(context, rc);.
85c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
85d0: 73 74 20 63 68 61 72 20 2a 7a 41 20 3d 20 28 63  st char *zA = (c
85e0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
85f0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8600: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 63 6f 6e 73  gv[0]);.    cons
8610: 74 20 63 68 61 72 20 2a 7a 42 20 3d 20 28 63 6f  t char *zB = (co
8620: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
8630: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8640: 76 5b 31 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e  v[1]);.    int n
8650: 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  A = sqlite3_valu
8660: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
8670: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 20 3d 20 73  ;.    int nB = s
8680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
8690: 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  es(argv[1]);.   
86a0: 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 61 72 67   int iLang = arg
86b0: 63 3d 3d 33 20 3f 20 73 71 6c 69 74 65 33 5f 76  c==3 ? sqlite3_v
86c0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
86d0: 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  ) : 0;.    const
86e0: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a   EditDist3Lang *
86f0: 70 4c 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74  pLang = editDist
8700: 33 46 69 6e 64 4c 61 6e 67 28 70 43 6f 6e 66 69  3FindLang(pConfi
8710: 67 2c 20 69 4c 61 6e 67 29 3b 0a 20 20 20 20 45  g, iLang);.    E
8720: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
8730: 6e 67 20 2a 70 46 72 6f 6d 3b 0a 20 20 20 20 69  ng *pFrom;.    i
8740: 6e 74 20 64 69 73 74 3b 0a 0a 20 20 20 20 70 46  nt dist;..    pF
8750: 72 6f 6d 20 3d 20 65 64 69 74 44 69 73 74 33 46  rom = editDist3F
8760: 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 70 4c 61  romStringNew(pLa
8770: 6e 67 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20 20 20  ng, zA, nA);.   
8780: 20 69 66 28 20 70 46 72 6f 6d 3d 3d 30 20 29 7b   if( pFrom==0 ){
8790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
87a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
87b0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
87c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
87d0: 20 20 20 20 64 69 73 74 20 3d 20 65 64 69 74 44      dist = editD
87e0: 69 73 74 33 43 6f 72 65 28 70 46 72 6f 6d 2c 20  ist3Core(pFrom, 
87f0: 7a 42 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c 20 30  zB, nB, pLang, 0
8800: 29 3b 0a 20 20 20 20 65 64 69 74 44 69 73 74 33  );.    editDist3
8810: 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65 74 65  FromStringDelete
8820: 28 70 46 72 6f 6d 29 3b 0a 20 20 20 20 69 66 28  (pFrom);.    if(
8830: 20 64 69 73 74 3d 3d 28 2d 31 29 20 29 7b 0a 20   dist==(-1) ){. 
8840: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8850: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
8860: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65  context);.    }e
8870: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8880: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
8890: 6e 74 65 78 74 2c 20 64 69 73 74 29 3b 0a 20 20  ntext, dist);.  
88a0: 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a    }.  } .}../*.*
88b0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 65  * Register the e
88c0: 64 69 74 44 69 73 74 33 20 66 75 6e 63 74 69 6f  ditDist3 functio
88d0: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 0a 2a 2f  n with SQLite.*/
88e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74  .static int edit
88f0: 44 69 73 74 33 49 6e 73 74 61 6c 6c 28 73 71 6c  Dist3Install(sql
8900: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
8910: 20 72 63 3b 0a 20 20 45 64 69 74 44 69 73 74 33   rc;.  EditDist3
8920: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
8930: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8940: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66 69  ( sizeof(*pConfi
8950: 67 29 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e  g) );.  if( pCon
8960: 66 69 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  fig==0 ) return 
8970: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8980: 6d 65 6d 73 65 74 28 70 43 6f 6e 66 69 67 2c 20  memset(pConfig, 
8990: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66  0, sizeof(*pConf
89a0: 69 67 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ig));.  rc = sql
89b0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
89c0: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69  tion_v2(db, "edi
89d0: 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20  tdist3",.       
89e0: 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45         2, SQLITE
89f0: 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69 67 2c 20  _UTF8, pConfig, 
8a00: 65 64 69 74 44 69 73 74 33 53 71 6c 46 75 6e 63  editDist3SqlFunc
8a10: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
8a20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8a30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8a40: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8a50: 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69 74  ion_v2(db, "edit
8a60: 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20 20  dist3",.        
8a70: 20 20 20 20 20 20 20 20 33 2c 20 53 51 4c 49 54          3, SQLIT
8a80: 45 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69 67 2c  E_UTF8, pConfig,
8a90: 20 65 64 69 74 44 69 73 74 33 53 71 6c 46 75 6e   editDist3SqlFun
8aa0: 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  c, 0, 0, 0);.  }
8ab0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8ac0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
8ad0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8ae0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
8af0: 22 65 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20  "editdist3",.   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
8b10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 43 6f  SQLITE_UTF8, pCo
8b20: 6e 66 69 67 2c 20 65 64 69 74 44 69 73 74 33 53  nfig, editDist3S
8b30: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 2c 0a 20 20  qlFunc, 0, 0,.  
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
8b50: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c  itDist3ConfigDel
8b60: 65 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ete);.  }else{. 
8b70: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8b80: 70 43 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 20 20  pConfig);.  }.  
8b90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20  return rc;.}./* 
8ba0: 45 6e 64 20 63 6f 6e 66 69 67 75 72 61 62 6c 65  End configurable
8bb0: 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64   cost unicode ed
8bc0: 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74  it distance rout
8bd0: 69 6e 65 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ines.***********
8be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c20: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
8c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c70: 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 72 61 6e  **.** Begin tran
8c80: 73 6c 69 74 65 72 61 74 65 20 75 6e 69 63 6f 64  sliterate unicod
8c90: 65 2d 74 6f 2d 61 73 63 69 69 20 69 6d 70 6c 65  e-to-ascii imple
8ca0: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2f 0a 0a 23 69  mentation.*/..#i
8cb0: 66 20 21 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  f !SQLITE_AMALGA
8cc0: 4d 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  MATION./*.** Thi
8cd0: 73 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69  s lookup table i
8ce0: 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 64  s used to help d
8cf0: 65 63 6f 64 65 20 74 68 65 20 66 69 72 73 74 20  ecode the first 
8d00: 62 79 74 65 20 6f 66 0a 2a 2a 20 61 20 6d 75 6c  byte of.** a mul
8d10: 74 69 2d 62 79 74 65 20 55 54 46 38 20 63 68 61  ti-byte UTF8 cha
8d20: 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
8d30: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8d40: 20 63 68 61 72 20 73 71 6c 69 74 65 33 55 74 66   char sqlite3Utf
8d50: 38 54 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20  8Trans1[] = {.  
8d60: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32  0x00, 0x01, 0x02
8d70: 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78  , 0x03, 0x04, 0x
8d80: 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a  05, 0x06, 0x07,.
8d90: 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78    0x08, 0x09, 0x
8da0: 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20  0a, 0x0b, 0x0c, 
8db0: 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66  0x0d, 0x0e, 0x0f
8dc0: 2c 0a 20 20 30 78 31 30 2c 20 30 78 31 31 2c 20  ,.  0x10, 0x11, 
8dd0: 30 78 31 32 2c 20 30 78 31 33 2c 20 30 78 31 34  0x12, 0x13, 0x14
8de0: 2c 20 30 78 31 35 2c 20 30 78 31 36 2c 20 30 78  , 0x15, 0x16, 0x
8df0: 31 37 2c 0a 20 20 30 78 31 38 2c 20 30 78 31 39  17,.  0x18, 0x19
8e00: 2c 20 30 78 31 61 2c 20 30 78 31 62 2c 20 30 78  , 0x1a, 0x1b, 0x
8e10: 31 63 2c 20 30 78 31 64 2c 20 30 78 31 65 2c 20  1c, 0x1d, 0x1e, 
8e20: 30 78 31 66 2c 0a 20 20 30 78 30 30 2c 20 30 78  0x1f,.  0x00, 0x
8e30: 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20  01, 0x02, 0x03, 
8e40: 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36  0x04, 0x05, 0x06
8e50: 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20  , 0x07,.  0x08, 
8e60: 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62  0x09, 0x0a, 0x0b
8e70: 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78  , 0x0c, 0x0d, 0x
8e80: 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 30 30  0e, 0x0f,.  0x00
8e90: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
8ea0: 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20  03, 0x04, 0x05, 
8eb0: 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78  0x06, 0x07,.  0x
8ec0: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20  00, 0x01, 0x02, 
8ed0: 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 31  0x03, 0x00, 0x01
8ee0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d 3b  , 0x00, 0x00,.};
8ef0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
8f00: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
8f10: 6f 66 20 74 68 65 20 66 69 72 73 74 20 55 54 46  of the first UTF
8f20: 2d 38 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  -8 character in 
8f30: 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  the string..*/.s
8f40: 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 52 65  tatic int utf8Re
8f50: 61 64 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ad(const unsigne
8f60: 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  d char *z, int n
8f70: 2c 20 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a 20  , int *pSize){. 
8f80: 20 69 6e 74 20 63 2c 20 69 3b 0a 0a 20 20 2f 2a   int c, i;..  /*
8f90: 20 41 6c 6c 20 63 61 6c 6c 65 72 73 20 74 6f 20   All callers to 
8fa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 28 69 6e  this routine (in
8fb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
8fc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 0a 20 20 2a  lementation).  *
8fd0: 2a 20 61 6c 77 61 79 73 20 68 61 76 65 20 6e 3e  * always have n>
8fe0: 30 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  0. */.  if( NEVE
8ff0: 52 28 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 63  R(n==0) ){.    c
9000: 20 3d 20 69 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   = i = 0;.  }els
9010: 65 7b 0a 20 20 20 20 63 20 3d 20 7a 5b 30 5d 3b  e{.    c = z[0];
9020: 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
9030: 69 66 28 20 63 3e 3d 30 78 63 30 20 29 7b 0a 20  if( c>=0xc0 ){. 
9040: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
9050: 55 74 66 38 54 72 61 6e 73 31 5b 63 2d 30 78 63  Utf8Trans1[c-0xc
9060: 30 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  0];.      while(
9070: 20 69 3c 6e 20 26 26 20 28 7a 5b 69 5d 20 26 20   i<n && (z[i] & 
9080: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20  0xc0)==0x80 ){. 
9090: 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36         c = (c<<6
90a0: 29 20 2b 20 28 30 78 33 66 20 26 20 7a 5b 69 2b  ) + (0x3f & z[i+
90b0: 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +]);.      }.   
90c0: 20 7d 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20   }.  }.  *pSize 
90d0: 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  = i;.  return c;
90e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
90f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9100: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
9110: 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 69 6e   utf-8 string in
9120: 20 74 68 65 20 6e 49 6e 20 62 79 74 65 0a 2a 2a   the nIn byte.**
9130: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
9140: 74 6f 20 62 79 20 7a 49 6e 2e 0a 2a 2f 0a 73 74  to by zIn..*/.st
9150: 61 74 69 63 20 69 6e 74 20 75 74 66 38 43 68 61  atic int utf8Cha
9160: 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  rlen(const char 
9170: 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a  *zIn, int nIn){.
9180: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
9190: 43 68 61 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Char = 0;.  for(
91a0: 69 3d 30 3b 20 69 3c 6e 49 6e 3b 20 6e 43 68 61  i=0; i<nIn; nCha
91b0: 72 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  r++){.    int sz
91c0: 3b 0a 20 20 20 20 75 74 66 38 52 65 61 64 28 28  ;.    utf8Read((
91d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
91e0: 68 61 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e  har *)&zIn[i], n
91f0: 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20  In-i, &sz);.    
9200: 69 20 2b 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 72  i += sz;.  }.  r
9210: 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a  eturn nChar;.}..
9220: 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f 66 20 74  /*.** Table of t
9230: 72 61 6e 73 6c 61 74 69 6f 6e 73 20 66 72 6f 6d  ranslations from
9240: 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
9250: 65 72 73 20 69 6e 74 6f 20 41 53 43 49 49 2e 0a  ers into ASCII..
9260: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9270: 73 74 72 75 63 74 20 7b 0a 20 75 6e 73 69 67 6e  struct {. unsign
9280: 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 46 72  ed short int cFr
9290: 6f 6d 3b 0a 20 75 6e 73 69 67 6e 65 64 20 63 68  om;. unsigned ch
92a0: 61 72 20 63 54 6f 30 2c 20 63 54 6f 31 3b 0a 7d  ar cTo0, cTo1;.}
92b0: 20 74 72 61 6e 73 6c 69 74 5b 5d 20 3d 20 7b 0a   translit[] = {.
92c0: 20 20 7b 20 30 78 30 30 41 30 2c 20 20 30 78 32    { 0x00A0,  0x2
92d0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c2  0, 0x00 },  /* .
92e0: a0 20 74 6f 20 20 20 2a 2f 0a 20 20 7b 20 30 78  . to   */.  { 0x
92f0: 30 30 42 35 2c 20 20 30 78 37 35 2c 20 30 78 30  00B5,  0x75, 0x0
9300: 30 20 7d 2c 20 20 2f 2a 20 c2 b5 20 74 6f 20 75  0 },  /* .. to u
9310: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 30 2c 20   */.  { 0x00C0, 
9320: 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20   0x41, 0x00 },  
9330: 2f 2a 20 c3 80 20 74 6f 20 41 20 2a 2f 0a 20 20  /* .. to A */.  
9340: 7b 20 30 78 30 30 43 31 2c 20 20 30 78 34 31 2c  { 0x00C1,  0x41,
9350: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 81 20   0x00 },  /* .. 
9360: 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to A */.  { 0x00
9370: 43 32 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20  C2,  0x41, 0x00 
9380: 7d 2c 20 20 2f 2a 20 c3 82 20 74 6f 20 41 20 2a  },  /* .. to A *
9390: 2f 0a 20 20 7b 20 30 78 30 30 43 33 2c 20 20 30  /.  { 0x00C3,  0
93a0: 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x41, 0x00 },  /*
93b0: 20 c3 83 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
93c0: 30 78 30 30 43 34 2c 20 20 30 78 34 31 2c 20 30  0x00C4,  0x41, 0
93d0: 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 84 20 74 6f  x65 },  /* .. to
93e0: 20 41 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43   Ae */.  { 0x00C
93f0: 35 2c 20 20 30 78 34 31 2c 20 30 78 36 31 20 7d  5,  0x41, 0x61 }
9400: 2c 20 20 2f 2a 20 c3 85 20 74 6f 20 41 61 20 2a  ,  /* .. to Aa *
9410: 2f 0a 20 20 7b 20 30 78 30 30 43 36 2c 20 20 30  /.  { 0x00C6,  0
9420: 78 34 31 2c 20 30 78 34 35 20 7d 2c 20 20 2f 2a  x41, 0x45 },  /*
9430: 20 c3 86 20 74 6f 20 41 45 20 2a 2f 0a 20 20 7b   .. to AE */.  {
9440: 20 30 78 30 30 43 37 2c 20 20 30 78 34 33 2c 20   0x00C7,  0x43, 
9450: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 87 20 74  0x00 },  /* .. t
9460: 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43  o C */.  { 0x00C
9470: 38 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  8,  0x45, 0x00 }
9480: 2c 20 20 2f 2a 20 c3 88 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
9490: 0a 20 20 7b 20 30 78 30 30 43 39 2c 20 20 30 78  .  { 0x00C9,  0x
94a0: 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  45, 0x00 },  /* 
94b0: c3 89 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
94c0: 78 30 30 43 41 2c 20 20 30 78 34 35 2c 20 30 78  x00CA,  0x45, 0x
94d0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 8a 20 74 6f 20  00 },  /* .. to 
94e0: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 42 2c  E */.  { 0x00CB,
94f0: 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20    0x45, 0x00 }, 
9500: 20 2f 2a 20 c3 8b 20 74 6f 20 45 20 2a 2f 0a 20   /* .. to E */. 
9510: 20 7b 20 30 78 30 30 43 43 2c 20 20 30 78 34 39   { 0x00CC,  0x49
9520: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8c  , 0x00 },  /* ..
9530: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
9540: 30 43 44 2c 20 20 30 78 34 39 2c 20 30 78 30 30  0CD,  0x49, 0x00
9550: 20 7d 2c 20 20 2f 2a 20 c3 8d 20 74 6f 20 49 20   },  /* .. to I 
9560: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 45 2c 20 20  */.  { 0x00CE,  
9570: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
9580: 2a 20 c3 8e 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
9590: 20 30 78 30 30 43 46 2c 20 20 30 78 34 39 2c 20   0x00CF,  0x49, 
95a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8f 20 74  0x00 },  /* .. t
95b0: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44  o I */.  { 0x00D
95c0: 30 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d  0,  0x44, 0x00 }
95d0: 2c 20 20 2f 2a 20 c3 90 20 74 6f 20 44 20 2a 2f  ,  /* .. to D */
95e0: 0a 20 20 7b 20 30 78 30 30 44 31 2c 20 20 30 78  .  { 0x00D1,  0x
95f0: 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4E, 0x00 },  /* 
9600: c3 91 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30  .. to N */.  { 0
9610: 78 30 30 44 32 2c 20 20 30 78 34 46 2c 20 30 78  x00D2,  0x4F, 0x
9620: 30 30 20 7d 2c 20 20 2f 2a 20 c3 92 20 74 6f 20  00 },  /* .. to 
9630: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 33 2c  O */.  { 0x00D3,
9640: 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c 20    0x4F, 0x00 }, 
9650: 20 2f 2a 20 c3 93 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
9660: 20 7b 20 30 78 30 30 44 34 2c 20 20 30 78 34 46   { 0x00D4,  0x4F
9670: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 94  , 0x00 },  /* ..
9680: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
9690: 30 44 35 2c 20 20 30 78 34 46 2c 20 30 78 30 30  0D5,  0x4F, 0x00
96a0: 20 7d 2c 20 20 2f 2a 20 c3 95 20 74 6f 20 4f 20   },  /* .. to O 
96b0: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 36 2c 20 20  */.  { 0x00D6,  
96c0: 30 78 34 46 2c 20 30 78 36 35 20 7d 2c 20 20 2f  0x4F, 0x65 },  /
96d0: 2a 20 c3 96 20 74 6f 20 4f 65 20 2a 2f 0a 20 20  * .. to Oe */.  
96e0: 7b 20 30 78 30 30 44 37 2c 20 20 30 78 37 38 2c  { 0x00D7,  0x78,
96f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 97 20   0x00 },  /* .. 
9700: 74 6f 20 78 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to x */.  { 0x00
9710: 44 38 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20  D8,  0x4F, 0x00 
9720: 7d 2c 20 20 2f 2a 20 c3 98 20 74 6f 20 4f 20 2a  },  /* .. to O *
9730: 2f 0a 20 20 7b 20 30 78 30 30 44 39 2c 20 20 30  /.  { 0x00D9,  0
9740: 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x55, 0x00 },  /*
9750: 20 c3 99 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20   .. to U */.  { 
9760: 30 78 30 30 44 41 2c 20 20 30 78 35 35 2c 20 30  0x00DA,  0x55, 0
9770: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9a 20 74 6f  x00 },  /* .. to
9780: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 42   U */.  { 0x00DB
9790: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
97a0: 20 20 2f 2a 20 c3 9b 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
97b0: 20 20 7b 20 30 78 30 30 44 43 2c 20 20 30 78 35    { 0x00DC,  0x5
97c0: 35 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3  5, 0x65 },  /* .
97d0: 9c 20 74 6f 20 55 65 20 2a 2f 0a 20 20 7b 20 30  . to Ue */.  { 0
97e0: 78 30 30 44 44 2c 20 20 30 78 35 39 2c 20 30 78  x00DD,  0x59, 0x
97f0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 9d 20 74 6f 20  00 },  /* .. to 
9800: 59 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 45 2c  Y */.  { 0x00DE,
9810: 20 20 30 78 35 34 2c 20 30 78 36 38 20 7d 2c 20    0x54, 0x68 }, 
9820: 20 2f 2a 20 c3 9e 20 74 6f 20 54 68 20 2a 2f 0a   /* .. to Th */.
9830: 20 20 7b 20 30 78 30 30 44 46 2c 20 20 30 78 37    { 0x00DF,  0x7
9840: 33 2c 20 30 78 37 33 20 7d 2c 20 20 2f 2a 20 c3  3, 0x73 },  /* .
9850: 9f 20 74 6f 20 73 73 20 2a 2f 0a 20 20 7b 20 30  . to ss */.  { 0
9860: 78 30 30 45 30 2c 20 20 30 78 36 31 2c 20 30 78  x00E0,  0x61, 0x
9870: 30 30 20 7d 2c 20 20 2f 2a 20 c3 a0 20 74 6f 20  00 },  /* .. to 
9880: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 31 2c  a */.  { 0x00E1,
9890: 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20    0x61, 0x00 }, 
98a0: 20 2f 2a 20 c3 a1 20 74 6f 20 61 20 2a 2f 0a 20   /* .. to a */. 
98b0: 20 7b 20 30 78 30 30 45 32 2c 20 20 30 78 36 31   { 0x00E2,  0x61
98c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a2  , 0x00 },  /* ..
98d0: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
98e0: 30 45 33 2c 20 20 30 78 36 31 2c 20 30 78 30 30  0E3,  0x61, 0x00
98f0: 20 7d 2c 20 20 2f 2a 20 c3 a3 20 74 6f 20 61 20   },  /* .. to a 
9900: 2a 2f 0a 20 20 7b 20 30 78 30 30 45 34 2c 20 20  */.  { 0x00E4,  
9910: 30 78 36 31 2c 20 30 78 36 35 20 7d 2c 20 20 2f  0x61, 0x65 },  /
9920: 2a 20 c3 a4 20 74 6f 20 61 65 20 2a 2f 0a 20 20  * .. to ae */.  
9930: 7b 20 30 78 30 30 45 35 2c 20 20 30 78 36 31 2c  { 0x00E5,  0x61,
9940: 20 30 78 36 31 20 7d 2c 20 20 2f 2a 20 c3 a5 20   0x61 },  /* .. 
9950: 74 6f 20 61 61 20 2a 2f 0a 20 20 7b 20 30 78 30  to aa */.  { 0x0
9960: 30 45 36 2c 20 20 30 78 36 31 2c 20 30 78 36 35  0E6,  0x61, 0x65
9970: 20 7d 2c 20 20 2f 2a 20 c3 a6 20 74 6f 20 61 65   },  /* .. to ae
9980: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 37 2c 20   */.  { 0x00E7, 
9990: 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x63, 0x00 },  
99a0: 2f 2a 20 c3 a7 20 74 6f 20 63 20 2a 2f 0a 20 20  /* .. to c */.  
99b0: 7b 20 30 78 30 30 45 38 2c 20 20 30 78 36 35 2c  { 0x00E8,  0x65,
99c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a8 20   0x00 },  /* .. 
99d0: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to e */.  { 0x00
99e0: 45 39 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20  E9,  0x65, 0x00 
99f0: 7d 2c 20 20 2f 2a 20 c3 a9 20 74 6f 20 65 20 2a  },  /* .. to e *
9a00: 2f 0a 20 20 7b 20 30 78 30 30 45 41 2c 20 20 30  /.  { 0x00EA,  0
9a10: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
9a20: 20 c3 aa 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
9a30: 30 78 30 30 45 42 2c 20 20 30 78 36 35 2c 20 30  0x00EB,  0x65, 0
9a40: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ab 20 74 6f  x00 },  /* .. to
9a50: 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 43   e */.  { 0x00EC
9a60: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
9a70: 20 20 2f 2a 20 c3 ac 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
9a80: 20 20 7b 20 30 78 30 30 45 44 2c 20 20 30 78 36    { 0x00ED,  0x6
9a90: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  9, 0x00 },  /* .
9aa0: ad 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
9ab0: 30 30 45 45 2c 20 20 30 78 36 39 2c 20 30 78 30  00EE,  0x69, 0x0
9ac0: 30 20 7d 2c 20 20 2f 2a 20 c3 ae 20 74 6f 20 69  0 },  /* .. to i
9ad0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 46 2c 20   */.  { 0x00EF, 
9ae0: 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x69, 0x00 },  
9af0: 2f 2a 20 c3 af 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
9b00: 7b 20 30 78 30 30 46 30 2c 20 20 30 78 36 34 2c  { 0x00F0,  0x64,
9b10: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b0 20   0x00 },  /* .. 
9b20: 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to d */.  { 0x00
9b30: 46 31 2c 20 20 30 78 36 45 2c 20 30 78 30 30 20  F1,  0x6E, 0x00 
9b40: 7d 2c 20 20 2f 2a 20 c3 b1 20 74 6f 20 6e 20 2a  },  /* .. to n *
9b50: 2f 0a 20 20 7b 20 30 78 30 30 46 32 2c 20 20 30  /.  { 0x00F2,  0
9b60: 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6F, 0x00 },  /*
9b70: 20 c3 b2 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
9b80: 30 78 30 30 46 33 2c 20 20 30 78 36 46 2c 20 30  0x00F3,  0x6F, 0
9b90: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b3 20 74 6f  x00 },  /* .. to
9ba0: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 34   o */.  { 0x00F4
9bb0: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c  ,  0x6F, 0x00 },
9bc0: 20 20 2f 2a 20 c3 b4 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
9bd0: 20 20 7b 20 30 78 30 30 46 35 2c 20 20 30 78 36    { 0x00F5,  0x6
9be0: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  F, 0x00 },  /* .
9bf0: b5 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
9c00: 30 30 46 36 2c 20 20 30 78 36 46 2c 20 30 78 36  00F6,  0x6F, 0x6
9c10: 35 20 7d 2c 20 20 2f 2a 20 c3 b6 20 74 6f 20 6f  5 },  /* .. to o
9c20: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 37 2c  e */.  { 0x00F7,
9c30: 20 20 30 78 33 41 2c 20 30 78 30 30 20 7d 2c 20    0x3A, 0x00 }, 
9c40: 20 2f 2a 20 c3 b7 20 74 6f 20 3a 20 2a 2f 0a 20   /* .. to : */. 
9c50: 20 7b 20 30 78 30 30 46 38 2c 20 20 30 78 36 46   { 0x00F8,  0x6F
9c60: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b8  , 0x00 },  /* ..
9c70: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
9c80: 30 46 39 2c 20 20 30 78 37 35 2c 20 30 78 30 30  0F9,  0x75, 0x00
9c90: 20 7d 2c 20 20 2f 2a 20 c3 b9 20 74 6f 20 75 20   },  /* .. to u 
9ca0: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 41 2c 20 20  */.  { 0x00FA,  
9cb0: 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x75, 0x00 },  /
9cc0: 2a 20 c3 ba 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
9cd0: 20 30 78 30 30 46 42 2c 20 20 30 78 37 35 2c 20   0x00FB,  0x75, 
9ce0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bb 20 74  0x00 },  /* .. t
9cf0: 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46  o u */.  { 0x00F
9d00: 43 2c 20 20 30 78 37 35 2c 20 30 78 36 35 20 7d  C,  0x75, 0x65 }
9d10: 2c 20 20 2f 2a 20 c3 bc 20 74 6f 20 75 65 20 2a  ,  /* .. to ue *
9d20: 2f 0a 20 20 7b 20 30 78 30 30 46 44 2c 20 20 30  /.  { 0x00FD,  0
9d30: 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x79, 0x00 },  /*
9d40: 20 c3 bd 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20   .. to y */.  { 
9d50: 30 78 30 30 46 45 2c 20 20 30 78 37 34 2c 20 30  0x00FE,  0x74, 0
9d60: 78 36 38 20 7d 2c 20 20 2f 2a 20 c3 be 20 74 6f  x68 },  /* .. to
9d70: 20 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46   th */.  { 0x00F
9d80: 46 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d  F,  0x79, 0x00 }
9d90: 2c 20 20 2f 2a 20 c3 bf 20 74 6f 20 79 20 2a 2f  ,  /* .. to y */
9da0: 0a 20 20 7b 20 30 78 30 31 30 30 2c 20 20 30 78  .  { 0x0100,  0x
9db0: 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  41, 0x00 },  /* 
9dc0: c4 80 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30  .. to A */.  { 0
9dd0: 78 30 31 30 31 2c 20 20 30 78 36 31 2c 20 30 78  x0101,  0x61, 0x
9de0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 81 20 74 6f 20  00 },  /* .. to 
9df0: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 32 2c  a */.  { 0x0102,
9e00: 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20    0x41, 0x00 }, 
9e10: 20 2f 2a 20 c4 82 20 74 6f 20 41 20 2a 2f 0a 20   /* .. to A */. 
9e20: 20 7b 20 30 78 30 31 30 33 2c 20 20 30 78 36 31   { 0x0103,  0x61
9e30: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 83  , 0x00 },  /* ..
9e40: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
9e50: 31 30 34 2c 20 20 30 78 34 31 2c 20 30 78 30 30  104,  0x41, 0x00
9e60: 20 7d 2c 20 20 2f 2a 20 c4 84 20 74 6f 20 41 20   },  /* .. to A 
9e70: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 35 2c 20 20  */.  { 0x0105,  
9e80: 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x61, 0x00 },  /
9e90: 2a 20 c4 85 20 74 6f 20 61 20 2a 2f 0a 20 20 7b  * .. to a */.  {
9ea0: 20 30 78 30 31 30 36 2c 20 20 30 78 34 33 2c 20   0x0106,  0x43, 
9eb0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 86 20 74  0x00 },  /* .. t
9ec0: 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o C */.  { 0x010
9ed0: 37 2c 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d  7,  0x63, 0x00 }
9ee0: 2c 20 20 2f 2a 20 c4 87 20 74 6f 20 63 20 2a 2f  ,  /* .. to c */
9ef0: 0a 20 20 7b 20 30 78 30 31 30 38 2c 20 20 30 78  .  { 0x0108,  0x
9f00: 34 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  43, 0x68 },  /* 
9f10: c4 88 20 74 6f 20 43 68 20 2a 2f 0a 20 20 7b 20  .. to Ch */.  { 
9f20: 30 78 30 31 30 39 2c 20 20 30 78 36 33 2c 20 30  0x0109,  0x63, 0
9f30: 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 89 20 74 6f  x68 },  /* .. to
9f40: 20 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30   ch */.  { 0x010
9f50: 41 2c 20 20 30 78 34 33 2c 20 30 78 30 30 20 7d  A,  0x43, 0x00 }
9f60: 2c 20 20 2f 2a 20 c4 8a 20 74 6f 20 43 20 2a 2f  ,  /* .. to C */
9f70: 0a 20 20 7b 20 30 78 30 31 30 42 2c 20 20 30 78  .  { 0x010B,  0x
9f80: 36 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  63, 0x00 },  /* 
9f90: c4 8b 20 74 6f 20 63 20 2a 2f 0a 20 20 7b 20 30  .. to c */.  { 0
9fa0: 78 30 31 30 43 2c 20 20 30 78 34 33 2c 20 30 78  x010C,  0x43, 0x
9fb0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 8c 20 74 6f 20  00 },  /* .. to 
9fc0: 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 44 2c  C */.  { 0x010D,
9fd0: 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20    0x63, 0x00 }, 
9fe0: 20 2f 2a 20 c4 8d 20 74 6f 20 63 20 2a 2f 0a 20   /* .. to c */. 
9ff0: 20 7b 20 30 78 30 31 30 45 2c 20 20 30 78 34 34   { 0x010E,  0x44
a000: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8e  , 0x00 },  /* ..
a010: 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30   to D */.  { 0x0
a020: 31 30 46 2c 20 20 30 78 36 34 2c 20 30 78 30 30  10F,  0x64, 0x00
a030: 20 7d 2c 20 20 2f 2a 20 c4 8f 20 74 6f 20 64 20   },  /* .. to d 
a040: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 30 2c 20 20  */.  { 0x0110,  
a050: 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x44, 0x00 },  /
a060: 2a 20 c4 90 20 74 6f 20 44 20 2a 2f 0a 20 20 7b  * .. to D */.  {
a070: 20 30 78 30 31 31 31 2c 20 20 30 78 36 34 2c 20   0x0111,  0x64, 
a080: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 91 20 74  0x00 },  /* .. t
a090: 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o d */.  { 0x011
a0a0: 32 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  2,  0x45, 0x00 }
a0b0: 2c 20 20 2f 2a 20 c4 92 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
a0c0: 0a 20 20 7b 20 30 78 30 31 31 33 2c 20 20 30 78  .  { 0x0113,  0x
a0d0: 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  65, 0x00 },  /* 
a0e0: c4 93 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
a0f0: 78 30 31 31 34 2c 20 20 30 78 34 35 2c 20 30 78  x0114,  0x45, 0x
a100: 30 30 20 7d 2c 20 20 2f 2a 20 c4 94 20 74 6f 20  00 },  /* .. to 
a110: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 35 2c  E */.  { 0x0115,
a120: 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20    0x65, 0x00 }, 
a130: 20 2f 2a 20 c4 95 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
a140: 20 7b 20 30 78 30 31 31 36 2c 20 20 30 78 34 35   { 0x0116,  0x45
a150: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 96  , 0x00 },  /* ..
a160: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
a170: 31 31 37 2c 20 20 30 78 36 35 2c 20 30 78 30 30  117,  0x65, 0x00
a180: 20 7d 2c 20 20 2f 2a 20 c4 97 20 74 6f 20 65 20   },  /* .. to e 
a190: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 38 2c 20 20  */.  { 0x0118,  
a1a0: 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x45, 0x00 },  /
a1b0: 2a 20 c4 98 20 74 6f 20 45 20 2a 2f 0a 20 20 7b  * .. to E */.  {
a1c0: 20 30 78 30 31 31 39 2c 20 20 30 78 36 35 2c 20   0x0119,  0x65, 
a1d0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 99 20 74  0x00 },  /* .. t
a1e0: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o e */.  { 0x011
a1f0: 41 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  A,  0x45, 0x00 }
a200: 2c 20 20 2f 2a 20 c4 9a 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
a210: 0a 20 20 7b 20 30 78 30 31 31 42 2c 20 20 30 78  .  { 0x011B,  0x
a220: 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  65, 0x00 },  /* 
a230: c4 9b 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
a240: 78 30 31 31 43 2c 20 20 30 78 34 37 2c 20 30 78  x011C,  0x47, 0x
a250: 36 38 20 7d 2c 20 20 2f 2a 20 c4 9c 20 74 6f 20  68 },  /* .. to 
a260: 47 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 44  Gh */.  { 0x011D
a270: 2c 20 20 30 78 36 37 2c 20 30 78 36 38 20 7d 2c  ,  0x67, 0x68 },
a280: 20 20 2f 2a 20 c4 9d 20 74 6f 20 67 68 20 2a 2f    /* .. to gh */
a290: 0a 20 20 7b 20 30 78 30 31 31 45 2c 20 20 30 78  .  { 0x011E,  0x
a2a0: 34 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  47, 0x00 },  /* 
a2b0: c4 9e 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30  .. to G */.  { 0
a2c0: 78 30 31 31 46 2c 20 20 30 78 36 37 2c 20 30 78  x011F,  0x67, 0x
a2d0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 9f 20 74 6f 20  00 },  /* .. to 
a2e0: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 30 2c  g */.  { 0x0120,
a2f0: 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c 20    0x47, 0x00 }, 
a300: 20 2f 2a 20 c4 a0 20 74 6f 20 47 20 2a 2f 0a 20   /* .. to G */. 
a310: 20 7b 20 30 78 30 31 32 31 2c 20 20 30 78 36 37   { 0x0121,  0x67
a320: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a1  , 0x00 },  /* ..
a330: 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30   to g */.  { 0x0
a340: 31 32 32 2c 20 20 30 78 34 37 2c 20 30 78 30 30  122,  0x47, 0x00
a350: 20 7d 2c 20 20 2f 2a 20 c4 a2 20 74 6f 20 47 20   },  /* .. to G 
a360: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 33 2c 20 20  */.  { 0x0123,  
a370: 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x67, 0x00 },  /
a380: 2a 20 c4 a3 20 74 6f 20 67 20 2a 2f 0a 20 20 7b  * .. to g */.  {
a390: 20 30 78 30 31 32 34 2c 20 20 30 78 34 38 2c 20   0x0124,  0x48, 
a3a0: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 a4 20 74  0x68 },  /* .. t
a3b0: 6f 20 48 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o Hh */.  { 0x01
a3c0: 32 35 2c 20 20 30 78 36 38 2c 20 30 78 36 38 20  25,  0x68, 0x68 
a3d0: 7d 2c 20 20 2f 2a 20 c4 a5 20 74 6f 20 68 68 20  },  /* .. to hh 
a3e0: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 36 2c 20 20  */.  { 0x0126,  
a3f0: 30 78 34 38 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x48, 0x00 },  /
a400: 2a 20 c4 a6 20 74 6f 20 48 20 2a 2f 0a 20 20 7b  * .. to H */.  {
a410: 20 30 78 30 31 32 37 2c 20 20 30 78 36 38 2c 20   0x0127,  0x68, 
a420: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a7 20 74  0x00 },  /* .. t
a430: 6f 20 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o h */.  { 0x012
a440: 38 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  8,  0x49, 0x00 }
a450: 2c 20 20 2f 2a 20 c4 a8 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
a460: 0a 20 20 7b 20 30 78 30 31 32 39 2c 20 20 30 78  .  { 0x0129,  0x
a470: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
a480: c4 a9 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
a490: 78 30 31 32 41 2c 20 20 30 78 34 39 2c 20 30 78  x012A,  0x49, 0x
a4a0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 aa 20 74 6f 20  00 },  /* .. to 
a4b0: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 42 2c  I */.  { 0x012B,
a4c0: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
a4d0: 20 2f 2a 20 c4 ab 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
a4e0: 20 7b 20 30 78 30 31 32 43 2c 20 20 30 78 34 39   { 0x012C,  0x49
a4f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ac  , 0x00 },  /* ..
a500: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
a510: 31 32 44 2c 20 20 30 78 36 39 2c 20 30 78 30 30  12D,  0x69, 0x00
a520: 20 7d 2c 20 20 2f 2a 20 c4 ad 20 74 6f 20 69 20   },  /* .. to i 
a530: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 45 2c 20 20  */.  { 0x012E,  
a540: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
a550: 2a 20 c4 ae 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
a560: 20 30 78 30 31 32 46 2c 20 20 30 78 36 39 2c 20   0x012F,  0x69, 
a570: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 af 20 74  0x00 },  /* .. t
a580: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o i */.  { 0x013
a590: 30 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  0,  0x49, 0x00 }
a5a0: 2c 20 20 2f 2a 20 c4 b0 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
a5b0: 0a 20 20 7b 20 30 78 30 31 33 31 2c 20 20 30 78  .  { 0x0131,  0x
a5c0: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
a5d0: c4 b1 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
a5e0: 78 30 31 33 32 2c 20 20 30 78 34 39 2c 20 30 78  x0132,  0x49, 0x
a5f0: 34 41 20 7d 2c 20 20 2f 2a 20 c4 b2 20 74 6f 20  4A },  /* .. to 
a600: 49 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 33  IJ */.  { 0x0133
a610: 2c 20 20 30 78 36 39 2c 20 30 78 36 41 20 7d 2c  ,  0x69, 0x6A },
a620: 20 20 2f 2a 20 c4 b3 20 74 6f 20 69 6a 20 2a 2f    /* .. to ij */
a630: 0a 20 20 7b 20 30 78 30 31 33 34 2c 20 20 30 78  .  { 0x0134,  0x
a640: 34 41 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  4A, 0x68 },  /* 
a650: c4 b4 20 74 6f 20 4a 68 20 2a 2f 0a 20 20 7b 20  .. to Jh */.  { 
a660: 30 78 30 31 33 35 2c 20 20 30 78 36 41 2c 20 30  0x0135,  0x6A, 0
a670: 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 b5 20 74 6f  x68 },  /* .. to
a680: 20 6a 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33   jh */.  { 0x013
a690: 36 2c 20 20 30 78 34 42 2c 20 30 78 30 30 20 7d  6,  0x4B, 0x00 }
a6a0: 2c 20 20 2f 2a 20 c4 b6 20 74 6f 20 4b 20 2a 2f  ,  /* .. to K */
a6b0: 0a 20 20 7b 20 30 78 30 31 33 37 2c 20 20 30 78  .  { 0x0137,  0x
a6c0: 36 42 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6B, 0x00 },  /* 
a6d0: c4 b7 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30  .. to k */.  { 0
a6e0: 78 30 31 33 38 2c 20 20 30 78 36 42 2c 20 30 78  x0138,  0x6B, 0x
a6f0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 b8 20 74 6f 20  00 },  /* .. to 
a700: 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 39 2c  k */.  { 0x0139,
a710: 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d 2c 20    0x4C, 0x00 }, 
a720: 20 2f 2a 20 c4 b9 20 74 6f 20 4c 20 2a 2f 0a 20   /* .. to L */. 
a730: 20 7b 20 30 78 30 31 33 41 2c 20 20 30 78 36 43   { 0x013A,  0x6C
a740: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ba  , 0x00 },  /* ..
a750: 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30   to l */.  { 0x0
a760: 31 33 42 2c 20 20 30 78 34 43 2c 20 30 78 30 30  13B,  0x4C, 0x00
a770: 20 7d 2c 20 20 2f 2a 20 c4 bb 20 74 6f 20 4c 20   },  /* .. to L 
a780: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 43 2c 20 20  */.  { 0x013C,  
a790: 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6C, 0x00 },  /
a7a0: 2a 20 c4 bc 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b  * .. to l */.  {
a7b0: 20 30 78 30 31 33 44 2c 20 20 30 78 34 43 2c 20   0x013D,  0x4C, 
a7c0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 bd 20 74  0x00 },  /* .. t
a7d0: 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o L */.  { 0x013
a7e0: 45 2c 20 20 30 78 36 43 2c 20 30 78 30 30 20 7d  E,  0x6C, 0x00 }
a7f0: 2c 20 20 2f 2a 20 c4 be 20 74 6f 20 6c 20 2a 2f  ,  /* .. to l */
a800: 0a 20 20 7b 20 30 78 30 31 33 46 2c 20 20 30 78  .  { 0x013F,  0x
a810: 34 43 2c 20 30 78 32 45 20 7d 2c 20 20 2f 2a 20  4C, 0x2E },  /* 
a820: c4 bf 20 74 6f 20 4c 2e 20 2a 2f 0a 20 20 7b 20  .. to L. */.  { 
a830: 30 78 30 31 34 30 2c 20 20 30 78 36 43 2c 20 30  0x0140,  0x6C, 0
a840: 78 32 45 20 7d 2c 20 20 2f 2a 20 c5 80 20 74 6f  x2E },  /* .. to
a850: 20 6c 2e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34   l. */.  { 0x014
a860: 31 2c 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d  1,  0x4C, 0x00 }
a870: 2c 20 20 2f 2a 20 c5 81 20 74 6f 20 4c 20 2a 2f  ,  /* .. to L */
a880: 0a 20 20 7b 20 30 78 30 31 34 32 2c 20 20 30 78  .  { 0x0142,  0x
a890: 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6C, 0x00 },  /* 
a8a0: c5 82 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30  .. to l */.  { 0
a8b0: 78 30 31 34 33 2c 20 20 30 78 34 45 2c 20 30 78  x0143,  0x4E, 0x
a8c0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 83 20 74 6f 20  00 },  /* .. to 
a8d0: 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 34 2c  N */.  { 0x0144,
a8e0: 20 20 30 78 36 45 2c 20 30 78 30 30 20 7d 2c 20    0x6E, 0x00 }, 
a8f0: 20 2f 2a 20 c5 84 20 74 6f 20 6e 20 2a 2f 0a 20   /* .. to n */. 
a900: 20 7b 20 30 78 30 31 34 35 2c 20 20 30 78 34 45   { 0x0145,  0x4E
a910: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 85  , 0x00 },  /* ..
a920: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
a930: 31 34 36 2c 20 20 30 78 36 45 2c 20 30 78 30 30  146,  0x6E, 0x00
a940: 20 7d 2c 20 20 2f 2a 20 c5 86 20 74 6f 20 6e 20   },  /* .. to n 
a950: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 37 2c 20 20  */.  { 0x0147,  
a960: 30 78 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4E, 0x00 },  /
a970: 2a 20 c5 87 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b  * .. to N */.  {
a980: 20 30 78 30 31 34 38 2c 20 20 30 78 36 45 2c 20   0x0148,  0x6E, 
a990: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 88 20 74  0x00 },  /* .. t
a9a0: 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34  o n */.  { 0x014
a9b0: 39 2c 20 20 30 78 32 37 2c 20 30 78 36 45 20 7d  9,  0x27, 0x6E }
a9c0: 2c 20 20 2f 2a 20 c5 89 20 74 6f 20 27 6e 20 2a  ,  /* .. to 'n *
a9d0: 2f 0a 20 20 7b 20 30 78 30 31 34 41 2c 20 20 30  /.  { 0x014A,  0
a9e0: 78 34 45 2c 20 30 78 34 37 20 7d 2c 20 20 2f 2a  x4E, 0x47 },  /*
a9f0: 20 c5 8a 20 74 6f 20 4e 47 20 2a 2f 0a 20 20 7b   .. to NG */.  {
aa00: 20 30 78 30 31 34 42 2c 20 20 30 78 36 45 2c 20   0x014B,  0x6E, 
aa10: 30 78 36 37 20 7d 2c 20 20 2f 2a 20 c5 8b 20 74  0x67 },  /* .. t
aa20: 6f 20 6e 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o ng */.  { 0x01
aa30: 34 43 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20  4C,  0x4F, 0x00 
aa40: 7d 2c 20 20 2f 2a 20 c5 8c 20 74 6f 20 4f 20 2a  },  /* .. to O *
aa50: 2f 0a 20 20 7b 20 30 78 30 31 34 44 2c 20 20 30  /.  { 0x014D,  0
aa60: 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6F, 0x00 },  /*
aa70: 20 c5 8d 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
aa80: 30 78 30 31 34 45 2c 20 20 30 78 34 46 2c 20 30  0x014E,  0x4F, 0
aa90: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8e 20 74 6f  x00 },  /* .. to
aaa0: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 46   O */.  { 0x014F
aab0: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c  ,  0x6F, 0x00 },
aac0: 20 20 2f 2a 20 c5 8f 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
aad0: 20 20 7b 20 30 78 30 31 35 30 2c 20 20 30 78 34    { 0x0150,  0x4
aae0: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  F, 0x00 },  /* .
aaf0: 90 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
ab00: 30 31 35 31 2c 20 20 30 78 36 46 2c 20 30 78 30  0151,  0x6F, 0x0
ab10: 30 20 7d 2c 20 20 2f 2a 20 c5 91 20 74 6f 20 6f  0 },  /* .. to o
ab20: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 32 2c 20   */.  { 0x0152, 
ab30: 20 30 78 34 46 2c 20 30 78 34 35 20 7d 2c 20 20   0x4F, 0x45 },  
ab40: 2f 2a 20 c5 92 20 74 6f 20 4f 45 20 2a 2f 0a 20  /* .. to OE */. 
ab50: 20 7b 20 30 78 30 31 35 33 2c 20 20 30 78 36 46   { 0x0153,  0x6F
ab60: 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c5 93  , 0x65 },  /* ..
ab70: 20 74 6f 20 6f 65 20 2a 2f 0a 20 20 7b 20 30 78   to oe */.  { 0x
ab80: 30 31 35 34 2c 20 20 30 78 35 32 2c 20 30 78 30  0154,  0x52, 0x0
ab90: 30 20 7d 2c 20 20 2f 2a 20 c5 94 20 74 6f 20 52  0 },  /* .. to R
aba0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 35 2c 20   */.  { 0x0155, 
abb0: 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x72, 0x00 },  
abc0: 2f 2a 20 c5 95 20 74 6f 20 72 20 2a 2f 0a 20 20  /* .. to r */.  
abd0: 7b 20 30 78 30 31 35 36 2c 20 20 30 78 35 32 2c  { 0x0156,  0x52,
abe0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 96 20   0x00 },  /* .. 
abf0: 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to R */.  { 0x01
ac00: 35 37 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20  57,  0x72, 0x00 
ac10: 7d 2c 20 20 2f 2a 20 c5 97 20 74 6f 20 72 20 2a  },  /* .. to r *
ac20: 2f 0a 20 20 7b 20 30 78 30 31 35 38 2c 20 20 30  /.  { 0x0158,  0
ac30: 78 35 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x52, 0x00 },  /*
ac40: 20 c5 98 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20   .. to R */.  { 
ac50: 30 78 30 31 35 39 2c 20 20 30 78 37 32 2c 20 30  0x0159,  0x72, 0
ac60: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 99 20 74 6f  x00 },  /* .. to
ac70: 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 41   r */.  { 0x015A
ac80: 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c  ,  0x53, 0x00 },
ac90: 20 20 2f 2a 20 c5 9a 20 74 6f 20 53 20 2a 2f 0a    /* .. to S */.
aca0: 20 20 7b 20 30 78 30 31 35 42 2c 20 20 30 78 37    { 0x015B,  0x7
acb0: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  3, 0x00 },  /* .
acc0: 9b 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
acd0: 30 31 35 43 2c 20 20 30 78 35 33 2c 20 30 78 36  015C,  0x53, 0x6
ace0: 38 20 7d 2c 20 20 2f 2a 20 c5 9c 20 74 6f 20 53  8 },  /* .. to S
acf0: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 44 2c  h */.  { 0x015D,
ad00: 20 20 30 78 37 33 2c 20 30 78 36 38 20 7d 2c 20    0x73, 0x68 }, 
ad10: 20 2f 2a 20 c5 9d 20 74 6f 20 73 68 20 2a 2f 0a   /* .. to sh */.
ad20: 20 20 7b 20 30 78 30 31 35 45 2c 20 20 30 78 35    { 0x015E,  0x5
ad30: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  3, 0x00 },  /* .
ad40: 9e 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78  . to S */.  { 0x
ad50: 30 31 35 46 2c 20 20 30 78 37 33 2c 20 30 78 30  015F,  0x73, 0x0
ad60: 30 20 7d 2c 20 20 2f 2a 20 c5 9f 20 74 6f 20 73  0 },  /* .. to s
ad70: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 30 2c 20   */.  { 0x0160, 
ad80: 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x53, 0x00 },  
ad90: 2f 2a 20 c5 a0 20 74 6f 20 53 20 2a 2f 0a 20 20  /* .. to S */.  
ada0: 7b 20 30 78 30 31 36 31 2c 20 20 30 78 37 33 2c  { 0x0161,  0x73,
adb0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a1 20   0x00 },  /* .. 
adc0: 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to s */.  { 0x01
add0: 36 32 2c 20 20 30 78 35 34 2c 20 30 78 30 30 20  62,  0x54, 0x00 
ade0: 7d 2c 20 20 2f 2a 20 c5 a2 20 74 6f 20 54 20 2a  },  /* .. to T *
adf0: 2f 0a 20 20 7b 20 30 78 30 31 36 33 2c 20 20 30  /.  { 0x0163,  0
ae00: 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x74, 0x00 },  /*
ae10: 20 c5 a3 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20   .. to t */.  { 
ae20: 30 78 30 31 36 34 2c 20 20 30 78 35 34 2c 20 30  0x0164,  0x54, 0
ae30: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a4 20 74 6f  x00 },  /* .. to
ae40: 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 35   T */.  { 0x0165
ae50: 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c  ,  0x74, 0x00 },
ae60: 20 20 2f 2a 20 c5 a5 20 74 6f 20 74 20 2a 2f 0a    /* .. to t */.
ae70: 20 20 7b 20 30 78 30 31 36 36 2c 20 20 30 78 35    { 0x0166,  0x5
ae80: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  4, 0x00 },  /* .
ae90: a6 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78  . to T */.  { 0x
aea0: 30 31 36 37 2c 20 20 30 78 37 34 2c 20 30 78 30  0167,  0x74, 0x0
aeb0: 30 20 7d 2c 20 20 2f 2a 20 c5 a7 20 74 6f 20 74  0 },  /* .. to t
aec0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 38 2c 20   */.  { 0x0168, 
aed0: 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x55, 0x00 },  
aee0: 2f 2a 20 c5 a8 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
aef0: 7b 20 30 78 30 31 36 39 2c 20 20 30 78 37 35 2c  { 0x0169,  0x75,
af00: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a9 20   0x00 },  /* .. 
af10: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to u */.  { 0x01
af20: 36 41 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  6A,  0x55, 0x00 
af30: 7d 2c 20 20 2f 2a 20 c5 aa 20 74 6f 20 55 20 2a  },  /* .. to U *
af40: 2f 0a 20 20 7b 20 30 78 30 31 36 42 2c 20 20 30  /.  { 0x016B,  0
af50: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
af60: 20 c5 ab 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
af70: 30 78 30 31 36 43 2c 20 20 30 78 35 35 2c 20 30  0x016C,  0x55, 0
af80: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ac 20 74 6f  x00 },  /* .. to
af90: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 44   U */.  { 0x016D
afa0: 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c  ,  0x75, 0x00 },
afb0: 20 20 2f 2a 20 c5 ad 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
afc0: 20 20 7b 20 30 78 30 31 36 45 2c 20 20 30 78 35    { 0x016E,  0x5
afd0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  5, 0x00 },  /* .
afe0: ae 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
aff0: 30 31 36 46 2c 20 20 30 78 37 35 2c 20 30 78 30  016F,  0x75, 0x0
b000: 30 20 7d 2c 20 20 2f 2a 20 c5 af 20 74 6f 20 75  0 },  /* .. to u
b010: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 30 2c 20   */.  { 0x0170, 
b020: 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x55, 0x00 },  
b030: 2f 2a 20 c5 b0 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
b040: 7b 20 30 78 30 31 37 31 2c 20 20 30 78 37 35 2c  { 0x0171,  0x75,
b050: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b1 20   0x00 },  /* .. 
b060: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to u */.  { 0x01
b070: 37 32 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  72,  0x55, 0x00 
b080: 7d 2c 20 20 2f 2a 20 c5 b2 20 74 6f 20 55 20 2a  },  /* .. to U *
b090: 2f 0a 20 20 7b 20 30 78 30 31 37 33 2c 20 20 30  /.  { 0x0173,  0
b0a0: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
b0b0: 20 c5 b3 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
b0c0: 30 78 30 31 37 34 2c 20 20 30 78 35 37 2c 20 30  0x0174,  0x57, 0
b0d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b4 20 74 6f  x00 },  /* .. to
b0e0: 20 57 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 35   W */.  { 0x0175
b0f0: 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20 7d 2c  ,  0x77, 0x00 },
b100: 20 20 2f 2a 20 c5 b5 20 74 6f 20 77 20 2a 2f 0a    /* .. to w */.
b110: 20 20 7b 20 30 78 30 31 37 36 2c 20 20 30 78 35    { 0x0176,  0x5
b120: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  9, 0x00 },  /* .
b130: b6 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78  . to Y */.  { 0x
b140: 30 31 37 37 2c 20 20 30 78 37 39 2c 20 30 78 30  0177,  0x79, 0x0
b150: 30 20 7d 2c 20 20 2f 2a 20 c5 b7 20 74 6f 20 79  0 },  /* .. to y
b160: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 38 2c 20   */.  { 0x0178, 
b170: 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x59, 0x00 },  
b180: 2f 2a 20 c5 b8 20 74 6f 20 59 20 2a 2f 0a 20 20  /* .. to Y */.  
b190: 7b 20 30 78 30 31 37 39 2c 20 20 30 78 35 41 2c  { 0x0179,  0x5A,
b1a0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b9 20   0x00 },  /* .. 
b1b0: 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to Z */.  { 0x01
b1c0: 37 41 2c 20 20 30 78 37 41 2c 20 30 78 30 30 20  7A,  0x7A, 0x00 
b1d0: 7d 2c 20 20 2f 2a 20 c5 ba 20 74 6f 20 7a 20 2a  },  /* .. to z *
b1e0: 2f 0a 20 20 7b 20 30 78 30 31 37 42 2c 20 20 30  /.  { 0x017B,  0
b1f0: 78 35 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x5A, 0x00 },  /*
b200: 20 c5 bb 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20   .. to Z */.  { 
b210: 30 78 30 31 37 43 2c 20 20 30 78 37 41 2c 20 30  0x017C,  0x7A, 0
b220: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bc 20 74 6f  x00 },  /* .. to
b230: 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 44   z */.  { 0x017D
b240: 2c 20 20 30 78 35 41 2c 20 30 78 30 30 20 7d 2c  ,  0x5A, 0x00 },
b250: 20 20 2f 2a 20 c5 bd 20 74 6f 20 5a 20 2a 2f 0a    /* .. to Z */.
b260: 20 20 7b 20 30 78 30 31 37 45 2c 20 20 30 78 37    { 0x017E,  0x7
b270: 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  A, 0x00 },  /* .
b280: be 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78  . to z */.  { 0x
b290: 30 31 37 46 2c 20 20 30 78 37 33 2c 20 30 78 30  017F,  0x73, 0x0
b2a0: 30 20 7d 2c 20 20 2f 2a 20 c5 bf 20 74 6f 20 73  0 },  /* .. to s
b2b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 39 32 2c 20   */.  { 0x0192, 
b2c0: 20 30 78 36 36 2c 20 30 78 30 30 20 7d 2c 20 20   0x66, 0x00 },  
b2d0: 2f 2a 20 c6 92 20 74 6f 20 66 20 2a 2f 0a 20 20  /* .. to f */.  
b2e0: 7b 20 30 78 30 32 31 38 2c 20 20 30 78 35 33 2c  { 0x0218,  0x53,
b2f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 98 20   0x00 },  /* .. 
b300: 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 32  to S */.  { 0x02
b310: 31 39 2c 20 20 30 78 37 33 2c 20 30 78 30 30 20  19,  0x73, 0x00 
b320: 7d 2c 20 20 2f 2a 20 c8 99 20 74 6f 20 73 20 2a  },  /* .. to s *
b330: 2f 0a 20 20 7b 20 30 78 30 32 31 41 2c 20 20 30  /.  { 0x021A,  0
b340: 78 35 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x54, 0x00 },  /*
b350: 20 c8 9a 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20   .. to T */.  { 
b360: 30 78 30 32 31 42 2c 20 20 30 78 37 34 2c 20 30  0x021B,  0x74, 0
b370: 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9b 20 74 6f  x00 },  /* .. to
b380: 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 36   t */.  { 0x0386
b390: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
b3a0: 20 20 2f 2a 20 ce 86 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
b3b0: 20 20 7b 20 30 78 30 33 38 38 2c 20 20 30 78 34    { 0x0388,  0x4
b3c0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  5, 0x00 },  /* .
b3d0: 88 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
b3e0: 30 33 38 39 2c 20 20 30 78 34 39 2c 20 30 78 30  0389,  0x49, 0x0
b3f0: 30 20 7d 2c 20 20 2f 2a 20 ce 89 20 74 6f 20 49  0 },  /* .. to I
b400: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 41 2c 20   */.  { 0x038A, 
b410: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
b420: 2f 2a 20 ce 8a 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
b430: 7b 20 30 78 30 33 38 43 2c 20 20 30 78 34 66 2c  { 0x038C,  0x4f,
b440: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 8c 20   0x00 },  /* .. 
b450: 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to O */.  { 0x03
b460: 38 45 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20  8E,  0x59, 0x00 
b470: 7d 2c 20 20 2f 2a 20 ce 8e 20 74 6f 20 59 20 2a  },  /* .. to Y *
b480: 2f 0a 20 20 7b 20 30 78 30 33 38 46 2c 20 20 30  /.  { 0x038F,  0
b490: 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4f, 0x00 },  /*
b4a0: 20 ce 8f 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
b4b0: 30 78 30 33 39 30 2c 20 20 30 78 36 39 2c 20 30  0x0390,  0x69, 0
b4c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 90 20 74 6f  x00 },  /* .. to
b4d0: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 31   i */.  { 0x0391
b4e0: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
b4f0: 20 20 2f 2a 20 ce 91 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
b500: 20 20 7b 20 30 78 30 33 39 32 2c 20 20 30 78 34    { 0x0392,  0x4
b510: 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  2, 0x00 },  /* .
b520: 92 20 74 6f 20 42 20 2a 2f 0a 20 20 7b 20 30 78  . to B */.  { 0x
b530: 30 33 39 33 2c 20 20 30 78 34 37 2c 20 30 78 30  0393,  0x47, 0x0
b540: 30 20 7d 2c 20 20 2f 2a 20 ce 93 20 74 6f 20 47  0 },  /* .. to G
b550: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 34 2c 20   */.  { 0x0394, 
b560: 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x44, 0x00 },  
b570: 2f 2a 20 ce 94 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
b580: 7b 20 30 78 30 33 39 35 2c 20 20 30 78 34 35 2c  { 0x0395,  0x45,
b590: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 95 20   0x00 },  /* .. 
b5a0: 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to E */.  { 0x03
b5b0: 39 36 2c 20 20 30 78 35 61 2c 20 30 78 30 30 20  96,  0x5a, 0x00 
b5c0: 7d 2c 20 20 2f 2a 20 ce 96 20 74 6f 20 5a 20 2a  },  /* .. to Z *
b5d0: 2f 0a 20 20 7b 20 30 78 30 33 39 37 2c 20 20 30  /.  { 0x0397,  0
b5e0: 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x49, 0x00 },  /*
b5f0: 20 ce 97 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20   .. to I */.  { 
b600: 30 78 30 33 39 38 2c 20 20 30 78 35 34 2c 20 30  0x0398,  0x54, 0
b610: 78 36 38 20 7d 2c 20 20 2f 2a 20 ce 98 20 74 6f  x68 },  /* .. to
b620: 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39   Th */.  { 0x039
b630: 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  9,  0x49, 0x00 }
b640: 2c 20 20 2f 2a 20 ce 99 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
b650: 0a 20 20 7b 20 30 78 30 33 39 41 2c 20 20 30 78  .  { 0x039A,  0x
b660: 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4b, 0x00 },  /* 
b670: ce 9a 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30  .. to K */.  { 0
b680: 78 30 33 39 42 2c 20 20 30 78 34 63 2c 20 30 78  x039B,  0x4c, 0x
b690: 30 30 20 7d 2c 20 20 2f 2a 20 ce 9b 20 74 6f 20  00 },  /* .. to 
b6a0: 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 43 2c  L */.  { 0x039C,
b6b0: 20 20 30 78 34 64 2c 20 30 78 30 30 20 7d 2c 20    0x4d, 0x00 }, 
b6c0: 20 2f 2a 20 ce 9c 20 74 6f 20 4d 20 2a 2f 0a 20   /* .. to M */. 
b6d0: 20 7b 20 30 78 30 33 39 44 2c 20 20 30 78 34 65   { 0x039D,  0x4e
b6e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9d  , 0x00 },  /* ..
b6f0: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
b700: 33 39 45 2c 20 20 30 78 35 38 2c 20 30 78 30 30  39E,  0x58, 0x00
b710: 20 7d 2c 20 20 2f 2a 20 ce 9e 20 74 6f 20 58 20   },  /* .. to X 
b720: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 46 2c 20 20  */.  { 0x039F,  
b730: 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4f, 0x00 },  /
b740: 2a 20 ce 9f 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b  * .. to O */.  {
b750: 20 30 78 30 33 41 30 2c 20 20 30 78 35 30 2c 20   0x03A0,  0x50, 
b760: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a0 20 74  0x00 },  /* .. t
b770: 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o P */.  { 0x03A
b780: 31 2c 20 20 30 78 35 32 2c 20 30 78 30 30 20 7d  1,  0x52, 0x00 }
b790: 2c 20 20 2f 2a 20 ce a1 20 74 6f 20 52 20 2a 2f  ,  /* .. to R */
b7a0: 0a 20 20 7b 20 30 78 30 33 41 33 2c 20 20 30 78  .  { 0x03A3,  0x
b7b0: 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  53, 0x00 },  /* 
b7c0: ce a3 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30  .. to S */.  { 0
b7d0: 78 30 33 41 34 2c 20 20 30 78 35 34 2c 20 30 78  x03A4,  0x54, 0x
b7e0: 30 30 20 7d 2c 20 20 2f 2a 20 ce a4 20 74 6f 20  00 },  /* .. to 
b7f0: 54 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 35 2c  T */.  { 0x03A5,
b800: 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20    0x59, 0x00 }, 
b810: 20 2f 2a 20 ce a5 20 74 6f 20 59 20 2a 2f 0a 20   /* .. to Y */. 
b820: 20 7b 20 30 78 30 33 41 36 2c 20 20 30 78 34 36   { 0x03A6,  0x46
b830: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a6  , 0x00 },  /* ..
b840: 20 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78 30   to F */.  { 0x0
b850: 33 41 37 2c 20 20 30 78 34 33 2c 20 30 78 36 38  3A7,  0x43, 0x68
b860: 20 7d 2c 20 20 2f 2a 20 ce a7 20 74 6f 20 43 68   },  /* .. to Ch
b870: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 38 2c 20   */.  { 0x03A8, 
b880: 20 30 78 35 30 2c 20 30 78 37 33 20 7d 2c 20 20   0x50, 0x73 },  
b890: 2f 2a 20 ce a8 20 74 6f 20 50 73 20 2a 2f 0a 20  /* .. to Ps */. 
b8a0: 20 7b 20 30 78 30 33 41 39 2c 20 20 30 78 34 66   { 0x03A9,  0x4f
b8b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a9  , 0x00 },  /* ..
b8c0: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
b8d0: 33 41 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30  3AA,  0x49, 0x00
b8e0: 20 7d 2c 20 20 2f 2a 20 ce aa 20 74 6f 20 49 20   },  /* .. to I 
b8f0: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 42 2c 20 20  */.  { 0x03AB,  
b900: 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x59, 0x00 },  /
b910: 2a 20 ce ab 20 74 6f 20 59 20 2a 2f 0a 20 20 7b  * .. to Y */.  {
b920: 20 30 78 30 33 41 43 2c 20 20 30 78 36 31 2c 20   0x03AC,  0x61, 
b930: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ac 20 74  0x00 },  /* .. t
b940: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o a */.  { 0x03A
b950: 44 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d  D,  0x65, 0x00 }
b960: 2c 20 20 2f 2a 20 ce ad 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
b970: 0a 20 20 7b 20 30 78 30 33 41 45 2c 20 20 30 78  .  { 0x03AE,  0x
b980: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
b990: ce ae 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
b9a0: 78 30 33 41 46 2c 20 20 30 78 36 39 2c 20 30 78  x03AF,  0x69, 0x
b9b0: 30 30 20 7d 2c 20 20 2f 2a 20 ce af 20 74 6f 20  00 },  /* .. to 
b9c0: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 31 2c  i */.  { 0x03B1,
b9d0: 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20    0x61, 0x00 }, 
b9e0: 20 2f 2a 20 ce b1 20 74 6f 20 61 20 2a 2f 0a 20   /* .. to a */. 
b9f0: 20 7b 20 30 78 30 33 42 32 2c 20 20 30 78 36 32   { 0x03B2,  0x62
ba00: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b2  , 0x00 },  /* ..
ba10: 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78 30   to b */.  { 0x0
ba20: 33 42 33 2c 20 20 30 78 36 37 2c 20 30 78 30 30  3B3,  0x67, 0x00
ba30: 20 7d 2c 20 20 2f 2a 20 ce b3 20 74 6f 20 67 20   },  /* .. to g 
ba40: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 34 2c 20 20  */.  { 0x03B4,  
ba50: 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x64, 0x00 },  /
ba60: 2a 20 ce b4 20 74 6f 20 64 20 2a 2f 0a 20 20 7b  * .. to d */.  {
ba70: 20 30 78 30 33 42 35 2c 20 20 30 78 36 35 2c 20   0x03B5,  0x65, 
ba80: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b5 20 74  0x00 },  /* .. t
ba90: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o e */.  { 0x03B
baa0: 36 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20 7d  6,  0x7a, 0x00 }
bab0: 2c 20 20 2f 2a 20 ce b6 20 74 6f 20 7a 20 2a 2f  ,  /* .. to z */
bac0: 0a 20 20 7b 20 30 78 30 33 42 37 2c 20 20 30 78  .  { 0x03B7,  0x
bad0: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
bae0: ce b7 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
baf0: 78 30 33 42 38 2c 20 20 30 78 37 34 2c 20 30 78  x03B8,  0x74, 0x
bb00: 36 38 20 7d 2c 20 20 2f 2a 20 ce b8 20 74 6f 20  68 },  /* .. to 
bb10: 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 39  th */.  { 0x03B9
bb20: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
bb30: 20 20 2f 2a 20 ce b9 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
bb40: 20 20 7b 20 30 78 30 33 42 41 2c 20 20 30 78 36    { 0x03BA,  0x6
bb50: 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  b, 0x00 },  /* .
bb60: ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78  . to k */.  { 0x
bb70: 30 33 42 42 2c 20 20 30 78 36 63 2c 20 30 78 30  03BB,  0x6c, 0x0
bb80: 30 20 7d 2c 20 20 2f 2a 20 ce bb 20 74 6f 20 6c  0 },  /* .. to l
bb90: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 43 2c 20   */.  { 0x03BC, 
bba0: 20 30 78 36 64 2c 20 30 78 30 30 20 7d 2c 20 20   0x6d, 0x00 },  
bbb0: 2f 2a 20 ce bc 20 74 6f 20 6d 20 2a 2f 0a 20 20  /* .. to m */.  
bbc0: 7b 20 30 78 30 33 42 44 2c 20 20 30 78 36 65 2c  { 0x03BD,  0x6e,
bbd0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bd 20   0x00 },  /* .. 
bbe0: 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to n */.  { 0x03
bbf0: 42 45 2c 20 20 30 78 37 38 2c 20 30 78 30 30 20  BE,  0x78, 0x00 
bc00: 7d 2c 20 20 2f 2a 20 ce be 20 74 6f 20 78 20 2a  },  /* .. to x *
bc10: 2f 0a 20 20 7b 20 30 78 30 33 42 46 2c 20 20 30  /.  { 0x03BF,  0
bc20: 78 36 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6f, 0x00 },  /*
bc30: 20 ce bf 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
bc40: 30 78 30 33 43 30 2c 20 20 30 78 37 30 2c 20 30  0x03C0,  0x70, 0
bc50: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 80 20 74 6f  x00 },  /* .. to
bc60: 20 70 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 31   p */.  { 0x03C1
bc70: 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c  ,  0x72, 0x00 },
bc80: 20 20 2f 2a 20 cf 81 20 74 6f 20 72 20 2a 2f 0a    /* .. to r */.
bc90: 20 20 7b 20 30 78 30 33 43 33 2c 20 20 30 78 37    { 0x03C3,  0x7
bca0: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  3, 0x00 },  /* .
bcb0: 83 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
bcc0: 30 33 43 34 2c 20 20 30 78 37 34 2c 20 30 78 30  03C4,  0x74, 0x0
bcd0: 30 20 7d 2c 20 20 2f 2a 20 cf 84 20 74 6f 20 74  0 },  /* .. to t
bce0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 35 2c 20   */.  { 0x03C5, 
bcf0: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
bd00: 2f 2a 20 cf 85 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
bd10: 7b 20 30 78 30 33 43 36 2c 20 20 30 78 36 36 2c  { 0x03C6,  0x66,
bd20: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 86 20   0x00 },  /* .. 
bd30: 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to f */.  { 0x03
bd40: 43 37 2c 20 20 30 78 36 33 2c 20 30 78 36 38 20  C7,  0x63, 0x68 
bd50: 7d 2c 20 20 2f 2a 20 cf 87 20 74 6f 20 63 68 20  },  /* .. to ch 
bd60: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 38 2c 20 20  */.  { 0x03C8,  
bd70: 30 78 37 30 2c 20 30 78 37 33 20 7d 2c 20 20 2f  0x70, 0x73 },  /
bd80: 2a 20 cf 88 20 74 6f 20 70 73 20 2a 2f 0a 20 20  * .. to ps */.  
bd90: 7b 20 30 78 30 33 43 39 2c 20 20 30 78 36 66 2c  { 0x03C9,  0x6f,
bda0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 89 20   0x00 },  /* .. 
bdb0: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to o */.  { 0x03
bdc0: 43 41 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  CA,  0x69, 0x00 
bdd0: 7d 2c 20 20 2f 2a 20 cf 8a 20 74 6f 20 69 20 2a  },  /* .. to i *
bde0: 2f 0a 20 20 7b 20 30 78 30 33 43 42 2c 20 20 30  /.  { 0x03CB,  0
bdf0: 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x79, 0x00 },  /*
be00: 20 cf 8b 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20   .. to y */.  { 
be10: 30 78 30 33 43 43 2c 20 20 30 78 36 66 2c 20 30  0x03CC,  0x6f, 0
be20: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8c 20 74 6f  x00 },  /* .. to
be30: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 44   o */.  { 0x03CD
be40: 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c  ,  0x79, 0x00 },
be50: 20 20 2f 2a 20 cf 8d 20 74 6f 20 79 20 2a 2f 0a    /* .. to y */.
be60: 20 20 7b 20 30 78 30 33 43 45 2c 20 20 30 78 36    { 0x03CE,  0x6
be70: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  9, 0x00 },  /* .
be80: 8e 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
be90: 30 34 30 30 2c 20 20 30 78 34 35 2c 20 30 78 30  0400,  0x45, 0x0
bea0: 30 20 7d 2c 20 20 2f 2a 20 d0 80 20 74 6f 20 45  0 },  /* .. to E
beb0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 31 2c 20   */.  { 0x0401, 
bec0: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
bed0: 2f 2a 20 d0 81 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
bee0: 7b 20 30 78 30 34 30 32 2c 20 20 30 78 34 34 2c  { 0x0402,  0x44,
bef0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 82 20   0x00 },  /* .. 
bf00: 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to D */.  { 0x04
bf10: 30 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20  03,  0x47, 0x00 
bf20: 7d 2c 20 20 2f 2a 20 d0 83 20 74 6f 20 47 20 2a  },  /* .. to G *
bf30: 2f 0a 20 20 7b 20 30 78 30 34 30 34 2c 20 20 30  /.  { 0x0404,  0
bf40: 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x45, 0x00 },  /*
bf50: 20 d0 84 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
bf60: 30 78 30 34 30 35 2c 20 20 30 78 35 61 2c 20 30  0x0405,  0x5a, 0
bf70: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 85 20 74 6f  x00 },  /* .. to
bf80: 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 36   Z */.  { 0x0406
bf90: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
bfa0: 20 20 2f 2a 20 d0 86 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
bfb0: 20 20 7b 20 30 78 30 34 30 37 2c 20 20 30 78 34    { 0x0407,  0x4
bfc0: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  9, 0x00 },  /* .
bfd0: 87 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
bfe0: 30 34 30 38 2c 20 20 30 78 34 61 2c 20 30 78 30  0408,  0x4a, 0x0
bff0: 30 20 7d 2c 20 20 2f 2a 20 d0 88 20 74 6f 20 4a  0 },  /* .. to J
c000: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 39 2c 20   */.  { 0x0409, 
c010: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
c020: 2f 2a 20 d0 89 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
c030: 7b 20 30 78 30 34 30 41 2c 20 20 30 78 34 65 2c  { 0x040A,  0x4e,
c040: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8a 20   0x00 },  /* .. 
c050: 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to N */.  { 0x04
c060: 30 42 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20  0B,  0x44, 0x00 
c070: 7d 2c 20 20 2f 2a 20 d0 8b 20 74 6f 20 44 20 2a  },  /* .. to D *
c080: 2f 0a 20 20 7b 20 30 78 30 34 30 43 2c 20 20 30  /.  { 0x040C,  0
c090: 78 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4b, 0x00 },  /*
c0a0: 20 d0 8c 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20   .. to K */.  { 
c0b0: 30 78 30 34 30 44 2c 20 20 30 78 34 39 2c 20 30  0x040D,  0x49, 0
c0c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8d 20 74 6f  x00 },  /* .. to
c0d0: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 45   I */.  { 0x040E
c0e0: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
c0f0: 20 20 2f 2a 20 d0 8e 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
c100: 20 20 7b 20 30 78 30 34 30 46 2c 20 20 30 78 34    { 0x040F,  0x4
c110: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  4, 0x00 },  /* .
c120: 8f 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78  . to D */.  { 0x
c130: 30 34 31 30 2c 20 20 30 78 34 31 2c 20 30 78 30  0410,  0x41, 0x0
c140: 30 20 7d 2c 20 20 2f 2a 20 d0 90 20 74 6f 20 41  0 },  /* .. to A
c150: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 31 2c 20   */.  { 0x0411, 
c160: 20 30 78 34 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x42, 0x00 },  
c170: 2f 2a 20 d0 91 20 74 6f 20 42 20 2a 2f 0a 20 20  /* .. to B */.  
c180: 7b 20 30 78 30 34 31 32 2c 20 20 30 78 35 36 2c  { 0x0412,  0x56,
c190: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 92 20   0x00 },  /* .. 
c1a0: 74 6f 20 56 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to V */.  { 0x04
c1b0: 31 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20  13,  0x47, 0x00 
c1c0: 7d 2c 20 20 2f 2a 20 d0 93 20 74 6f 20 47 20 2a  },  /* .. to G *
c1d0: 2f 0a 20 20 7b 20 30 78 30 34 31 34 2c 20 20 30  /.  { 0x0414,  0
c1e0: 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x44, 0x00 },  /*
c1f0: 20 d0 94 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20   .. to D */.  { 
c200: 30 78 30 34 31 35 2c 20 20 30 78 34 35 2c 20 30  0x0415,  0x45, 0
c210: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 95 20 74 6f  x00 },  /* .. to
c220: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 36   E */.  { 0x0416
c230: 2c 20 20 30 78 35 61 2c 20 30 78 36 38 20 7d 2c  ,  0x5a, 0x68 },
c240: 20 20 2f 2a 20 d0 96 20 74 6f 20 5a 68 20 2a 2f    /* .. to Zh */
c250: 0a 20 20 7b 20 30 78 30 34 31 37 2c 20 20 30 78  .  { 0x0417,  0x
c260: 35 61 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  5a, 0x00 },  /* 
c270: d0 97 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30  .. to Z */.  { 0
c280: 78 30 34 31 38 2c 20 20 30 78 34 39 2c 20 30 78  x0418,  0x49, 0x
c290: 30 30 20 7d 2c 20 20 2f 2a 20 d0 98 20 74 6f 20  00 },  /* .. to 
c2a0: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 39 2c  I */.  { 0x0419,
c2b0: 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20    0x49, 0x00 }, 
c2c0: 20 2f 2a 20 d0 99 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
c2d0: 20 7b 20 30 78 30 34 31 41 2c 20 20 30 78 34 62   { 0x041A,  0x4b
c2e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9a  , 0x00 },  /* ..
c2f0: 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30   to K */.  { 0x0
c300: 34 31 42 2c 20 20 30 78 34 63 2c 20 30 78 30 30  41B,  0x4c, 0x00
c310: 20 7d 2c 20 20 2f 2a 20 d0 9b 20 74 6f 20 4c 20   },  /* .. to L 
c320: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 43 2c 20 20  */.  { 0x041C,  
c330: 30 78 34 64 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4d, 0x00 },  /
c340: 2a 20 d0 9c 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b  * .. to M */.  {
c350: 20 30 78 30 34 31 44 2c 20 20 30 78 34 65 2c 20   0x041D,  0x4e, 
c360: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9d 20 74  0x00 },  /* .. t
c370: 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o N */.  { 0x041
c380: 45 2c 20 20 30 78 34 66 2c 20 30 78 30 30 20 7d  E,  0x4f, 0x00 }
c390: 2c 20 20 2f 2a 20 d0 9e 20 74 6f 20 4f 20 2a 2f  ,  /* .. to O */
c3a0: 0a 20 20 7b 20 30 78 30 34 31 46 2c 20 20 30 78  .  { 0x041F,  0x
c3b0: 35 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  50, 0x00 },  /* 
c3c0: d0 9f 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30  .. to P */.  { 0
c3d0: 78 30 34 32 30 2c 20 20 30 78 35 32 2c 20 30 78  x0420,  0x52, 0x
c3e0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 a0 20 74 6f 20  00 },  /* .. to 
c3f0: 52 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 31 2c  R */.  { 0x0421,
c400: 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20    0x53, 0x00 }, 
c410: 20 2f 2a 20 d0 a1 20 74 6f 20 53 20 2a 2f 0a 20   /* .. to S */. 
c420: 20 7b 20 30 78 30 34 32 32 2c 20 20 30 78 35 34   { 0x0422,  0x54
c430: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a2  , 0x00 },  /* ..
c440: 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30   to T */.  { 0x0
c450: 34 32 33 2c 20 20 30 78 35 35 2c 20 30 78 30 30  423,  0x55, 0x00
c460: 20 7d 2c 20 20 2f 2a 20 d0 a3 20 74 6f 20 55 20   },  /* .. to U 
c470: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 34 2c 20 20  */.  { 0x0424,  
c480: 30 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x46, 0x00 },  /
c490: 2a 20 d0 a4 20 74 6f 20 46 20 2a 2f 0a 20 20 7b  * .. to F */.  {
c4a0: 20 30 78 30 34 32 35 2c 20 20 30 78 34 62 2c 20   0x0425,  0x4b, 
c4b0: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a5 20 74  0x68 },  /* .. t
c4c0: 6f 20 4b 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34  o Kh */.  { 0x04
c4d0: 32 36 2c 20 20 30 78 35 34 2c 20 30 78 36 33 20  26,  0x54, 0x63 
c4e0: 7d 2c 20 20 2f 2a 20 d0 a6 20 74 6f 20 54 63 20  },  /* .. to Tc 
c4f0: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 37 2c 20 20  */.  { 0x0427,  
c500: 30 78 34 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x43, 0x68 },  /
c510: 2a 20 d0 a7 20 74 6f 20 43 68 20 2a 2f 0a 20 20  * .. to Ch */.  
c520: 7b 20 30 78 30 34 32 38 2c 20 20 30 78 35 33 2c  { 0x0428,  0x53,
c530: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a8 20   0x68 },  /* .. 
c540: 74 6f 20 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Sh */.  { 0x0
c550: 34 32 39 2c 20 20 30 78 35 33 2c 20 30 78 36 38  429,  0x53, 0x68
c560: 20 7d 2c 20 20 2f 2a 20 d0 a9 20 74 6f 20 53 68   },  /* .. to Sh
c570: 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 41  ch */.  { 0x042A
c580: 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c  ,  0x61, 0x00 },
c590: 20 20 2f 2a 20 20 74 6f 20 41 20 2a 2f 0a 20 20    /*  to A */.  
c5a0: 7b 20 30 78 30 34 32 42 2c 20 20 30 78 35 39 2c  { 0x042B,  0x59,
c5b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ab 20   0x00 },  /* .. 
c5c0: 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to Y */.  { 0x04
c5d0: 32 43 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20  2C,  0x59, 0x00 
c5e0: 7d 2c 20 20 2f 2a 20 20 74 6f 20 59 20 2a 2f 0a  },  /*  to Y */.
c5f0: 20 20 7b 20 30 78 30 34 32 44 2c 20 20 30 78 34    { 0x042D,  0x4
c600: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  5, 0x00 },  /* .
c610: ad 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
c620: 30 34 32 45 2c 20 20 30 78 34 39 2c 20 30 78 37  042E,  0x49, 0x7
c630: 35 20 7d 2c 20 20 2f 2a 20 d0 ae 20 74 6f 20 49  5 },  /* .. to I
c640: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 46 2c  u */.  { 0x042F,
c650: 20 20 30 78 34 39 2c 20 30 78 36 31 20 7d 2c 20    0x49, 0x61 }, 
c660: 20 2f 2a 20 d0 af 20 74 6f 20 49 61 20 2a 2f 0a   /* .. to Ia */.
c670: 20 20 7b 20 30 78 30 34 33 30 2c 20 20 30 78 36    { 0x0430,  0x6
c680: 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  1, 0x00 },  /* .
c690: b0 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78  . to a */.  { 0x
c6a0: 30 34 33 31 2c 20 20 30 78 36 32 2c 20 30 78 30  0431,  0x62, 0x0
c6b0: 30 20 7d 2c 20 20 2f 2a 20 d0 b1 20 74 6f 20 62  0 },  /* .. to b
c6c0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 32 2c 20   */.  { 0x0432, 
c6d0: 20 30 78 37 36 2c 20 30 78 30 30 20 7d 2c 20 20   0x76, 0x00 },  
c6e0: 2f 2a 20 d0 b2 20 74 6f 20 76 20 2a 2f 0a 20 20  /* .. to v */.  
c6f0: 7b 20 30 78 30 34 33 33 2c 20 20 30 78 36 37 2c  { 0x0433,  0x67,
c700: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b3 20   0x00 },  /* .. 
c710: 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to g */.  { 0x04
c720: 33 34 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20  34,  0x64, 0x00 
c730: 7d 2c 20 20 2f 2a 20 d0 b4 20 74 6f 20 64 20 2a  },  /* .. to d *
c740: 2f 0a 20 20 7b 20 30 78 30 34 33 35 2c 20 20 30  /.  { 0x0435,  0
c750: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
c760: 20 d0 b5 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
c770: 30 78 30 34 33 36 2c 20 20 30 78 37 61 2c 20 30  0x0436,  0x7a, 0
c780: 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 b6 20 74 6f  x68 },  /* .. to
c790: 20 7a 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33   zh */.  { 0x043
c7a0: 37 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20 7d  7,  0x7a, 0x00 }
c7b0: 2c 20 20 2f 2a 20 d0 b7 20 74 6f 20 7a 20 2a 2f  ,  /* .. to z */
c7c0: 0a 20 20 7b 20 30 78 30 34 33 38 2c 20 20 30 78  .  { 0x0438,  0x
c7d0: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
c7e0: d0 b8 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
c7f0: 78 30 34 33 39 2c 20 20 30 78 36 39 2c 20 30 78  x0439,  0x69, 0x
c800: 30 30 20 7d 2c 20 20 2f 2a 20 d0 b9 20 74 6f 20  00 },  /* .. to 
c810: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 41 2c  i */.  { 0x043A,
c820: 20 20 30 78 36 62 2c 20 30 78 30 30 20 7d 2c 20    0x6b, 0x00 }, 
c830: 20 2f 2a 20 d0 ba 20 74 6f 20 6b 20 2a 2f 0a 20   /* .. to k */. 
c840: 20 7b 20 30 78 30 34 33 42 2c 20 20 30 78 36 63   { 0x043B,  0x6c
c850: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bb  , 0x00 },  /* ..
c860: 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30   to l */.  { 0x0
c870: 34 33 43 2c 20 20 30 78 36 64 2c 20 30 78 30 30  43C,  0x6d, 0x00
c880: 20 7d 2c 20 20 2f 2a 20 d0 bc 20 74 6f 20 6d 20   },  /* .. to m 
c890: 2a 2f 0a 20 20 7b 20 30 78 30 34 33 44 2c 20 20  */.  { 0x043D,  
c8a0: 30 78 36 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6e, 0x00 },  /
c8b0: 2a 20 d0 bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b  * .. to n */.  {
c8c0: 20 30 78 30 34 33 45 2c 20 20 30 78 36 66 2c 20   0x043E,  0x6f, 
c8d0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 be 20 74  0x00 },  /* .. t
c8e0: 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33  o o */.  { 0x043
c8f0: 46 2c 20 20 30 78 37 30 2c 20 30 78 30 30 20 7d  F,  0x70, 0x00 }
c900: 2c 20 20 2f 2a 20 d0 bf 20 74 6f 20 70 20 2a 2f  ,  /* .. to p */
c910: 0a 20 20 7b 20 30 78 30 34 34 30 2c 20 20 30 78  .  { 0x0440,  0x
c920: 37 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  72, 0x00 },  /* 
c930: d1 80 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30  .. to r */.  { 0
c940: 78 30 34 34 31 2c 20 20 30 78 37 33 2c 20 30 78  x0441,  0x73, 0x
c950: 30 30 20 7d 2c 20 20 2f 2a 20 d1 81 20 74 6f 20  00 },  /* .. to 
c960: 73 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 32 2c  s */.  { 0x0442,
c970: 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20    0x74, 0x00 }, 
c980: 20 2f 2a 20 d1 82 20 74 6f 20 74 20 2a 2f 0a 20   /* .. to t */. 
c990: 20 7b 20 30 78 30 34 34 33 2c 20 20 30 78 37 35   { 0x0443,  0x75
c9a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 83  , 0x00 },  /* ..
c9b0: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
c9c0: 34 34 34 2c 20 20 30 78 36 36 2c 20 30 78 30 30  444,  0x66, 0x00
c9d0: 20 7d 2c 20 20 2f 2a 20 d1 84 20 74 6f 20 66 20   },  /* .. to f 
c9e0: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 35 2c 20 20  */.  { 0x0445,  
c9f0: 30 78 36 62 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x6b, 0x68 },  /
ca00: 2a 20 d1 85 20 74 6f 20 6b 68 20 2a 2f 0a 20 20  * .. to kh */.  
ca10: 7b 20 30 78 30 34 34 36 2c 20 20 30 78 37 34 2c  { 0x0446,  0x74,
ca20: 20 30 78 36 33 20 7d 2c 20 20 2f 2a 20 d1 86 20   0x63 },  /* .. 
ca30: 74 6f 20 74 63 20 2a 2f 0a 20 20 7b 20 30 78 30  to tc */.  { 0x0
ca40: 34 34 37 2c 20 20 30 78 36 33 2c 20 30 78 36 38  447,  0x63, 0x68
ca50: 20 7d 2c 20 20 2f 2a 20 d1 87 20 74 6f 20 63 68   },  /* .. to ch
ca60: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 38 2c 20   */.  { 0x0448, 
ca70: 20 30 78 37 33 2c 20 30 78 36 38 20 7d 2c 20 20   0x73, 0x68 },  
ca80: 2f 2a 20 d1 88 20 74 6f 20 73 68 20 2a 2f 0a 20  /* .. to sh */. 
ca90: 20 7b 20 30 78 30 34 34 39 2c 20 20 30 78 37 33   { 0x0449,  0x73
caa0: 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d1 89  , 0x68 },  /* ..
cab0: 20 74 6f 20 73 68 63 68 20 2a 2f 0a 20 20 7b 20   to shch */.  { 
cac0: 30 78 30 34 34 41 2c 20 20 30 78 36 31 2c 20 30  0x044A,  0x61, 0
cad0: 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 61  x00 },  /*  to a
cae0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 42 2c 20   */.  { 0x044B, 
caf0: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
cb00: 2f 2a 20 d1 8b 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
cb10: 7b 20 30 78 30 34 34 43 2c 20 20 30 78 37 39 2c  { 0x044C,  0x79,
cb20: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f   0x00 },  /*  to
cb30: 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 44   y */.  { 0x044D
cb40: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
cb50: 20 20 2f 2a 20 d1 8d 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
cb60: 20 20 7b 20 30 78 30 34 34 45 2c 20 20 30 78 36    { 0x044E,  0x6
cb70: 39 2c 20 30 78 37 35 20 7d 2c 20 20 2f 2a 20 d1  9, 0x75 },  /* .
cb80: 8e 20 74 6f 20 69 75 20 2a 2f 0a 20 20 7b 20 30  . to iu */.  { 0
cb90: 78 30 34 34 46 2c 20 20 30 78 36 39 2c 20 30 78  x044F,  0x69, 0x
cba0: 36 31 20 7d 2c 20 20 2f 2a 20 d1 8f 20 74 6f 20  61 },  /* .. to 
cbb0: 69 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 30  ia */.  { 0x0450
cbc0: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
cbd0: 20 20 2f 2a 20 d1 90 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
cbe0: 20 20 7b 20 30 78 30 34 35 31 2c 20 20 30 78 36    { 0x0451,  0x6
cbf0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  5, 0x00 },  /* .
cc00: 91 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
cc10: 30 34 35 32 2c 20 20 30 78 36 34 2c 20 30 78 30  0452,  0x64, 0x0
cc20: 30 20 7d 2c 20 20 2f 2a 20 d1 92 20 74 6f 20 64  0 },  /* .. to d
cc30: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 33 2c 20   */.  { 0x0453, 
cc40: 20 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20 20   0x67, 0x00 },  
cc50: 2f 2a 20 d1 93 20 74 6f 20 67 20 2a 2f 0a 20 20  /* .. to g */.  
cc60: 7b 20 30 78 30 34 35 34 2c 20 20 30 78 36 35 2c  { 0x0454,  0x65,
cc70: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 94 20   0x00 },  /* .. 
cc80: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to e */.  { 0x04
cc90: 35 35 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20  55,  0x7a, 0x00 
cca0: 7d 2c 20 20 2f 2a 20 d1 95 20 74 6f 20 7a 20 2a  },  /* .. to z *
ccb0: 2f 0a 20 20 7b 20 30 78 30 34 35 36 2c 20 20 30  /.  { 0x0456,  0
ccc0: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
ccd0: 20 d1 96 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
cce0: 30 78 30 34 35 37 2c 20 20 30 78 36 39 2c 20 30  0x0457,  0x69, 0
ccf0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 97 20 74 6f  x00 },  /* .. to
cd00: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 38   i */.  { 0x0458
cd10: 2c 20 20 30 78 36 61 2c 20 30 78 30 30 20 7d 2c  ,  0x6a, 0x00 },
cd20: 20 20 2f 2a 20 d1 98 20 74 6f 20 6a 20 2a 2f 0a    /* .. to j */.
cd30: 20 20 7b 20 30 78 30 34 35 39 2c 20 20 30 78 36    { 0x0459,  0x6
cd40: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  9, 0x00 },  /* .
cd50: 99 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
cd60: 30 34 35 41 2c 20 20 30 78 36 65 2c 20 30 78 30  045A,  0x6e, 0x0
cd70: 30 20 7d 2c 20 20 2f 2a 20 d1 9a 20 74 6f 20 6e  0 },  /* .. to n
cd80: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 42 2c 20   */.  { 0x045B, 
cd90: 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x64, 0x00 },  
cda0: 2f 2a 20 d1 9b 20 74 6f 20 64 20 2a 2f 0a 20 20  /* .. to d */.  
cdb0: 7b 20 30 78 30 34 35 43 2c 20 20 30 78 36 62 2c  { 0x045C,  0x6b,
cdc0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9c 20   0x00 },  /* .. 
cdd0: 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to k */.  { 0x04
cde0: 35 44 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  5D,  0x69, 0x00 
cdf0: 7d 2c 20 20 2f 2a 20 d1 9d 20 74 6f 20 69 20 2a  },  /* .. to i *
ce00: 2f 0a 20 20 7b 20 30 78 30 34 35 45 2c 20 20 30  /.  { 0x045E,  0
ce10: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
ce20: 20 d1 9e 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
ce30: 30 78 30 34 35 46 2c 20 20 30 78 36 34 2c 20 30  0x045F,  0x64, 0
ce40: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9f 20 74 6f  x00 },  /* .. to
ce50: 20 64 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30 32   d */.  { 0x1E02
ce60: 2c 20 20 30 78 34 32 2c 20 30 78 30 30 20 7d 2c  ,  0x42, 0x00 },
ce70: 20 20 2f 2a 20 e1 b8 82 20 74 6f 20 42 20 2a 2f    /* ... to B */
ce80: 0a 20 20 7b 20 30 78 31 45 30 33 2c 20 20 30 78  .  { 0x1E03,  0x
ce90: 36 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  62, 0x00 },  /* 
cea0: e1 b8 83 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20  ... to b */.  { 
ceb0: 30 78 31 45 30 41 2c 20 20 30 78 34 34 2c 20 30  0x1E0A,  0x44, 0
cec0: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 8a 20 74  x00 },  /* ... t
ced0: 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30  o D */.  { 0x1E0
cee0: 42 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d  B,  0x64, 0x00 }
cef0: 2c 20 20 2f 2a 20 e1 b8 8b 20 74 6f 20 64 20 2a  ,  /* ... to d *
cf00: 2f 0a 20 20 7b 20 30 78 31 45 31 45 2c 20 20 30  /.  { 0x1E1E,  0
cf10: 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x46, 0x00 },  /*
cf20: 20 e1 b8 9e 20 74 6f 20 46 20 2a 2f 0a 20 20 7b   ... to F */.  {
cf30: 20 30 78 31 45 31 46 2c 20 20 30 78 36 36 2c 20   0x1E1F,  0x66, 
cf40: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 9f 20  0x00 },  /* ... 
cf50: 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to f */.  { 0x1E
cf60: 34 30 2c 20 20 30 78 34 44 2c 20 30 78 30 30 20  40,  0x4D, 0x00 
cf70: 7d 2c 20 20 2f 2a 20 e1 b9 80 20 74 6f 20 4d 20  },  /* ... to M 
cf80: 2a 2f 0a 20 20 7b 20 30 78 31 45 34 31 2c 20 20  */.  { 0x1E41,  
cf90: 30 78 36 44 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6D, 0x00 },  /
cfa0: 2a 20 e1 b9 81 20 74 6f 20 6d 20 2a 2f 0a 20 20  * ... to m */.  
cfb0: 7b 20 30 78 31 45 35 36 2c 20 20 30 78 35 30 2c  { 0x1E56,  0x50,
cfc0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 96   0x00 },  /* ...
cfd0: 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 31   to P */.  { 0x1
cfe0: 45 35 37 2c 20 20 30 78 37 30 2c 20 30 78 30 30  E57,  0x70, 0x00
cff0: 20 7d 2c 20 20 2f 2a 20 e1 b9 97 20 74 6f 20 70   },  /* ... to p
d000: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 30 2c 20   */.  { 0x1E60, 
d010: 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x53, 0x00 },  
d020: 2f 2a 20 e1 b9 a0 20 74 6f 20 53 20 2a 2f 0a 20  /* ... to S */. 
d030: 20 7b 20 30 78 31 45 36 31 2c 20 20 30 78 37 33   { 0x1E61,  0x73
d040: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9  , 0x00 },  /* ..
d050: a1 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
d060: 31 45 36 41 2c 20 20 30 78 35 34 2c 20 30 78 30  1E6A,  0x54, 0x0
d070: 30 20 7d 2c 20 20 2f 2a 20 e1 b9 aa 20 74 6f 20  0 },  /* ... to 
d080: 54 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 42 2c  T */.  { 0x1E6B,
d090: 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20    0x74, 0x00 }, 
d0a0: 20 2f 2a 20 e1 b9 ab 20 74 6f 20 74 20 2a 2f 0a   /* ... to t */.
d0b0: 20 20 7b 20 30 78 31 45 38 30 2c 20 20 30 78 35    { 0x1E80,  0x5
d0c0: 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  7, 0x00 },  /* .
d0d0: ba 80 20 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30  .. to W */.  { 0
d0e0: 78 31 45 38 31 2c 20 20 30 78 37 37 2c 20 30 78  x1E81,  0x77, 0x
d0f0: 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 81 20 74 6f  00 },  /* ... to
d100: 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 32   w */.  { 0x1E82
d110: 2c 20 20 30 78 35 37 2c 20 30 78 30 30 20 7d 2c  ,  0x57, 0x00 },
d120: 20 20 2f 2a 20 e1 ba 82 20 74 6f 20 57 20 2a 2f    /* ... to W */
d130: 0a 20 20 7b 20 30 78 31 45 38 33 2c 20 20 30 78  .  { 0x1E83,  0x
d140: 37 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  77, 0x00 },  /* 
d150: e1 ba 83 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20  ... to w */.  { 
d160: 30 78 31 45 38 34 2c 20 20 30 78 35 37 2c 20 30  0x1E84,  0x57, 0
d170: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 84 20 74  x00 },  /* ... t
d180: 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38  o W */.  { 0x1E8
d190: 35 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20 7d  5,  0x77, 0x00 }
d1a0: 2c 20 20 2f 2a 20 e1 ba 85 20 74 6f 20 77 20 2a  ,  /* ... to w *
d1b0: 2f 0a 20 20 7b 20 30 78 31 45 46 32 2c 20 20 30  /.  { 0x1EF2,  0
d1c0: 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x59, 0x00 },  /*
d1d0: 20 e1 bb b2 20 74 6f 20 59 20 2a 2f 0a 20 20 7b   ... to Y */.  {
d1e0: 20 30 78 31 45 46 33 2c 20 20 30 78 37 39 2c 20   0x1EF3,  0x79, 
d1f0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 bb b3 20  0x00 },  /* ... 
d200: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 46 42  to y */.  { 0xFB
d210: 30 30 2c 20 20 30 78 36 36 2c 20 30 78 36 36 20  00,  0x66, 0x66 
d220: 7d 2c 20 20 2f 2a 20 ef ac 80 20 74 6f 20 66 66  },  /* ... to ff
d230: 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 31 2c 20   */.  { 0xFB01, 
d240: 20 30 78 36 36 2c 20 30 78 36 39 20 7d 2c 20 20   0x66, 0x69 },  
d250: 2f 2a 20 ef ac 81 20 74 6f 20 66 69 20 2a 2f 0a  /* ... to fi */.
d260: 20 20 7b 20 30 78 46 42 30 32 2c 20 20 30 78 36    { 0xFB02,  0x6
d270: 36 2c 20 30 78 36 43 20 7d 2c 20 20 2f 2a 20 ef  6, 0x6C },  /* .
d280: ac 82 20 74 6f 20 66 6c 20 2a 2f 0a 20 20 7b 20  .. to fl */.  { 
d290: 30 78 46 42 30 35 2c 20 20 30 78 37 33 2c 20 30  0xFB05,  0x73, 0
d2a0: 78 37 34 20 7d 2c 20 20 2f 2a 20 ef ac 85 20 74  x74 },  /* ... t
d2b0: 6f 20 73 74 20 2a 2f 0a 20 20 7b 20 30 78 46 42  o st */.  { 0xFB
d2c0: 30 36 2c 20 20 30 78 37 33 2c 20 30 78 37 34 20  06,  0x73, 0x74 
d2d0: 7d 2c 20 20 2f 2a 20 ef ac 86 20 74 6f 20 73 74  },  /* ... to st
d2e0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
d2f0: 6e 76 65 72 74 20 74 68 65 20 69 6e 70 75 74 20  nvert the input 
d300: 73 74 72 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d  string from UTF-
d310: 38 20 69 6e 74 6f 20 70 75 72 65 20 41 53 43 49  8 into pure ASCI
d320: 49 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  I by converting.
d330: 2a 2a 20 61 6c 6c 20 6e 6f 6e 2d 41 53 43 49 49  ** all non-ASCII
d340: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 73   characters to s
d350: 6f 6d 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ome combination 
d360: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
d370: 20 74 68 65 0a 2a 2a 20 41 53 43 49 49 20 73 75   the.** ASCII su
d380: 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bset..**.** The 
d390: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
d3a0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 6d 6f  might contain mo
d3b0: 72 65 20 63 68 61 72 61 63 74 65 72 73 20 74 68  re characters th
d3c0: 61 6e 20 74 68 65 20 69 6e 70 75 74 2e 0a 2a 2a  an the input..**
d3d0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
d3e0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
d3f0: 74 72 69 6e 67 20 63 6f 6d 65 73 20 66 72 6f 6d  tring comes from
d400: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
d410: 29 20 61 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64 20  ) and.** should 
d420: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
d430: 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
d440: 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  c unsigned char 
d450: 2a 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 63  *transliterate(c
d460: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
d470: 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *zIn, int nIn
d480: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
d490: 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
d4a0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 49 6e 2a 34  e3_malloc( nIn*4
d4b0: 20 2b 20 31 20 29 3b 0a 20 20 69 6e 74 20 63 2c   + 1 );.  int c,
d4c0: 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69 66 28   sz, nOut;.  if(
d4d0: 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72   zOut==0 ) retur
d4e0: 6e 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20 30 3b  n 0;.  nOut = 0;
d4f0: 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20  .  while( nIn>0 
d500: 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66 38 52  ){.    c = utf8R
d510: 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20 26 73  ead(zIn, nIn, &s
d520: 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 73  z);.    zIn += s
d530: 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20 73 7a  z;.    nIn -= sz
d540: 3b 0a 20 20 20 20 69 66 28 20 63 3c 3d 31 32 37  ;.    if( c<=127
d550: 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6e   ){.      zOut[n
d560: 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
d570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
d580: 20 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a   xTop, xBtm, x;.
d590: 20 20 20 20 20 20 78 54 6f 70 20 3d 20 73 69 7a        xTop = siz
d5a0: 65 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69  eof(translit)/si
d5b0: 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d  zeof(translit[0]
d5c0: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 78 42 74  ) - 1;.      xBt
d5d0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  m = 0;.      whi
d5e0: 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20 29  le( xTop>=xBtm )
d5f0: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 78  {.        x = (x
d600: 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a 20  Top + xBtm)/2;. 
d610: 20 20 20 20 20 20 20 69 66 28 20 74 72 61 6e 73         if( trans
d620: 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20  lit[x].cFrom==c 
d630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75  ){.          zOu
d640: 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61 6e  t[nOut++] = tran
d650: 73 6c 69 74 5b 78 5d 2e 63 54 6f 30 3b 0a 20 20  slit[x].cTo0;.  
d660: 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61 6e          if( tran
d670: 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 20 29 7b 0a  slit[x].cTo1 ){.
d680: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74              zOut
d690: 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61 6e 73  [nOut++] = trans
d6a0: 6c 69 74 5b 78 5d 2e 63 54 6f 31 3b 0a 20 20 20  lit[x].cTo1;.   
d6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
d6c0: 61 6e 20 65 78 74 72 61 20 22 63 68 22 20 61 66  an extra "ch" af
d6d0: 74 65 72 20 74 68 65 20 22 73 68 22 20 66 6f 72  ter the "sh" for
d6e0: 20 d0 a9 20 61 6e 64 20 d1 89 20 2a 2f 0a 20 20   .. and .. */.  
d6f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
d700: 3d 30 78 30 34 32 39 20 7c 7c 20 63 3d 3d 20 30  =0x0429 || c== 0
d710: 78 30 34 34 39 20 29 7b 0a 20 20 20 20 20 20 20  x0449 ){.       
d720: 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74         zOut[nOut
d730: 2b 2b 5d 20 3d 20 27 63 27 3b 0a 20 20 20 20 20  ++] = 'c';.     
d740: 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f           zOut[nO
d750: 75 74 2b 2b 5d 20 3d 20 27 68 27 3b 0a 20 20 20  ut++] = 'h';.   
d760: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d780: 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
d790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
d7a0: 20 7d 65 6c 73 65 20 69 66 28 20 74 72 61 6e 73   }else if( trans
d7b0: 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3e 63 20 29  lit[x].cFrom>c )
d7c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 54 6f 70  {.          xTop
d7d0: 20 3d 20 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   = x-1;.        
d7e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d7f0: 20 78 42 74 6d 20 3d 20 78 2b 31 3b 0a 20 20 20   xBtm = x+1;.   
d800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d810: 20 20 20 20 20 69 66 28 20 63 20 29 20 7a 4f 75       if( c ) zOu
d820: 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 27 3f 27 3b  t[nOut++] = '?';
d830: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4f 75  .    }.  }.  zOu
d840: 74 5b 6e 4f 75 74 5d 20 3d 20 30 3b 0a 20 20 72  t[nOut] = 0;.  r
d850: 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f  eturn zOut;.}../
d860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d870: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
d880: 74 65 72 73 20 69 6e 20 74 68 65 20 73 68 6f 72  ters in the shor
d890: 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74  test prefix of t
d8a0: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74 72 69  he input.** stri
d8b0: 6e 67 20 74 68 61 74 20 74 72 61 6e 73 6c 69 74  ng that translit
d8c0: 65 72 61 74 65 73 20 74 6f 20 61 6e 20 41 53 43  erates to an ASC
d8d0: 49 49 20 73 74 72 69 6e 67 20 6e 54 72 61 6e 73  II string nTrans
d8e0: 20 62 79 74 65 73 20 6f 72 20 6c 6f 6e 67 65 72   bytes or longer
d8f0: 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
d900: 74 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20  transliteration 
d910: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  of the input str
d920: 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ing is less than
d930: 20 6e 54 72 61 6e 73 0a 2a 2a 20 62 79 74 65 73   nTrans.** bytes
d940: 20 69 6e 20 73 69 7a 65 2c 20 72 65 74 75 72 6e   in size, return
d950: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
d960: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
d970: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a   input string..*
d980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  /.static int tra
d990: 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65 6e  nslen_to_charlen
d9a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
d9b0: 2c 20 69 6e 74 20 6e 49 6e 2c 20 69 6e 74 20 6e  , int nIn, int n
d9c0: 54 72 61 6e 73 29 7b 0a 20 20 69 6e 74 20 69 2c  Trans){.  int i,
d9d0: 20 63 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20   c, sz, nOut;.  
d9e0: 69 6e 74 20 6e 43 68 61 72 3b 0a 0a 20 20 69 20  int nChar;..  i 
d9f0: 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 66 6f  = nOut = 0;.  fo
da00: 72 28 6e 43 68 61 72 3d 30 3b 20 69 3c 6e 49 6e  r(nChar=0; i<nIn
da10: 20 26 26 20 6e 4f 75 74 3c 6e 54 72 61 6e 73 3b   && nOut<nTrans;
da20: 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 63   nChar++){.    c
da30: 20 3d 20 75 74 66 38 52 65 61 64 28 28 63 6f 6e   = utf8Read((con
da40: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
da50: 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49 6e 2d   *)&zIn[i], nIn-
da60: 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 20 2b  i, &sz);.    i +
da70: 3d 20 73 7a 3b 0a 0a 20 20 20 20 6e 4f 75 74 2b  = sz;..    nOut+
da80: 2b 3b 0a 20 20 20 20 69 66 28 20 63 3e 3d 31 32  +;.    if( c>=12
da90: 38 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  8 ){.      int x
daa0: 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a 20 20  Top, xBtm, x;.  
dab0: 20 20 20 20 78 54 6f 70 20 3d 20 73 69 7a 65 6f      xTop = sizeo
dac0: 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65  f(translit)/size
dad0: 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 20  of(translit[0]) 
dae0: 2d 20 31 3b 0a 20 20 20 20 20 20 78 42 74 6d 20  - 1;.      xBtm 
daf0: 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 0;.      while
db00: 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20 29 7b 0a  ( xTop>=xBtm ){.
db10: 20 20 20 20 20 20 20 20 78 20 3d 20 28 78 54 6f          x = (xTo
db20: 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a 20 20 20  p + xBtm)/2;.   
db30: 20 20 20 20 20 69 66 28 20 74 72 61 6e 73 6c 69       if( transli
db40: 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20 29 7b  t[x].cFrom==c ){
db50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74  .          if( t
db60: 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 20  ranslit[x].cTo1 
db70: 29 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  ) nOut++;.      
db80: 20 20 20 20 69 66 28 20 63 3d 3d 30 78 30 34 32      if( c==0x042
db90: 39 20 7c 7c 20 63 3d 3d 20 30 78 30 34 34 39 20  9 || c== 0x0449 
dba0: 29 20 6e 4f 75 74 20 2b 3d 20 32 3b 0a 20 20 20  ) nOut += 2;.   
dbb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dbc0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dbd0: 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f  translit[x].cFro
dbe0: 6d 3e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  m>c ){.         
dbf0: 20 78 54 6f 70 20 3d 20 78 2d 31 3b 0a 20 20 20   xTop = x-1;.   
dc00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dc10: 20 20 20 20 20 20 78 42 74 6d 20 3d 20 78 2b 31        xBtm = x+1
dc20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dc30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
dc40: 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d   return nChar;.}
dc50: 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70 65 6c  .../*.**    spel
dc60: 6c 66 69 78 31 5f 74 72 61 6e 73 6c 69 74 28 58  lfix1_translit(X
dc70: 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ).**.** Convert 
dc80: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
dc90: 6e 74 61 69 6e 73 20 6e 6f 6e 2d 41 53 43 49 49  ntains non-ASCII
dca0: 20 52 6f 6d 61 6e 20 63 68 61 72 61 63 74 65 72   Roman character
dcb0: 73 20 69 6e 74 6f 20 0a 2a 2a 20 70 75 72 65 20  s into .** pure 
dcc0: 41 53 43 49 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  ASCII..*/.static
dcd0: 20 76 6f 69 64 20 74 72 61 6e 73 6c 69 74 65 72   void transliter
dce0: 61 74 65 53 71 6c 46 75 6e 63 28 0a 20 20 73 71  ateSqlFunc(.  sq
dcf0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
dd00: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
dd10: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
dd20: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
dd30: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
dd40: 68 61 72 20 2a 7a 49 6e 20 3d 20 73 71 6c 69 74  har *zIn = sqlit
dd50: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
dd60: 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 49  gv[0]);.  int nI
dd70: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
dd80: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
dd90: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
dda0: 72 20 2a 7a 4f 75 74 20 3d 20 74 72 61 6e 73 6c  r *zOut = transl
ddb0: 69 74 65 72 61 74 65 28 7a 49 6e 2c 20 6e 49 6e  iterate(zIn, nIn
ddc0: 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30  );.  if( zOut==0
ddd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dde0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
ddf0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  em(context);.  }
de00: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
de10: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
de20: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f  ntext, (char*)zO
de30: 75 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  ut, -1, sqlite3_
de40: 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  free);.  }.}../*
de50: 0a 2a 2a 20 20 20 20 73 70 65 6c 6c 66 69 78 31  .**    spellfix1
de60: 5f 73 63 72 69 70 74 63 6f 64 65 28 58 29 0a 2a  _scriptcode(X).*
de70: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 74 65  *.** Try to dete
de80: 72 6d 69 6e 65 20 74 68 65 20 64 6f 6d 69 6e 61  rmine the domina
de90: 6e 74 20 73 63 72 69 70 74 20 75 73 65 64 20 62  nt script used b
dea0: 79 20 74 68 65 20 77 6f 72 64 20 58 20 61 6e 64  y the word X and
deb0: 20 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20 49   return.** its I
dec0: 53 4f 20 31 35 39 32 34 20 6e 75 6d 65 72 69 63  SO 15924 numeric
ded0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
dee0: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
def0: 6e 74 61 74 69 6f 6e 20 6f 6e 6c 79 20 75 6e 64  ntation only und
df00: 65 72 73 74 61 6e 64 73 20 74 68 65 20 66 6f 6c  erstands the fol
df10: 6c 6f 77 69 6e 67 20 73 63 72 69 70 74 73 3a 0a  lowing scripts:.
df20: 2a 2a 0a 2a 2a 20 20 20 20 32 31 35 20 20 28 4c  **.**    215  (L
df30: 61 74 69 6e 29 0a 2a 2a 20 20 20 20 32 32 30 20  atin).**    220 
df40: 20 28 43 79 72 69 6c 6c 69 63 29 0a 2a 2a 20 20   (Cyrillic).**  
df50: 20 20 32 30 30 20 20 28 47 72 65 65 6b 29 0a 2a    200  (Greek).*
df60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
df70: 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 39 39  e will return 99
df80: 38 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 58  8 if the input X
df90: 20 63 6f 6e 74 61 69 6e 73 20 63 68 61 72 61 63   contains charac
dfa0: 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  ters from.** two
dfb0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
dfc0: 61 62 6f 76 65 20 73 63 72 69 70 74 73 20 6f 72  above scripts or
dfd0: 20 39 39 39 20 69 66 20 58 20 63 6f 6e 74 61 69   999 if X contai
dfe0: 6e 73 20 6e 6f 20 63 68 61 72 61 63 74 65 72 73  ns no characters
dff0: 0a 2a 2a 20 66 72 6f 6d 20 61 6e 79 20 6f 66 20  .** from any of 
e000: 74 68 65 20 61 62 6f 76 65 20 73 63 72 69 70 74  the above script
e010: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
e020: 64 20 73 63 72 69 70 74 43 6f 64 65 53 71 6c 46  d scriptCodeSqlF
e030: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
e040: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
e050: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
e060: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
e070: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
e080: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
e090: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
e0a0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
e0b0: 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 73 71 6c  .  int nIn = sql
e0c0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
e0d0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
e0e0: 20 63 2c 20 73 7a 3b 0a 20 20 69 6e 74 20 73 63   c, sz;.  int sc
e0f0: 72 69 70 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  riptMask = 0;.  
e100: 69 6e 74 20 72 65 73 3b 0a 23 20 64 65 66 69 6e  int res;.# defin
e110: 65 20 53 43 52 49 50 54 5f 4c 41 54 49 4e 20 20  e SCRIPT_LATIN  
e120: 20 20 20 20 20 30 78 30 30 30 31 0a 23 20 64 65       0x0001.# de
e130: 66 69 6e 65 20 53 43 52 49 50 54 5f 43 59 52 49  fine SCRIPT_CYRI
e140: 4c 4c 49 43 20 20 20 20 30 78 30 30 30 32 0a 23  LLIC    0x0002.#
e150: 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f 47   define SCRIPT_G
e160: 52 45 45 4b 20 20 20 20 20 20 20 30 78 30 30 30  REEK       0x000
e170: 34 0a 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e  4..  while( nIn>
e180: 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66  0 ){.    c = utf
e190: 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20  8Read(zIn, nIn, 
e1a0: 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d  &sz);.    zIn +=
e1b0: 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20   sz;.    nIn -= 
e1c0: 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c 30 78  sz;.    if( c<0x
e1d0: 30 32 61 66 20 29 7b 0a 20 20 20 20 20 20 73 63  02af ){.      sc
e1e0: 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52 49  riptMask |= SCRI
e1f0: 50 54 5f 4c 41 54 49 4e 3b 0a 20 20 20 20 7d 65  PT_LATIN;.    }e
e200: 6c 73 65 20 69 66 28 20 63 3e 3d 30 78 30 34 30  lse if( c>=0x040
e210: 30 20 26 26 20 63 3c 3d 30 78 30 34 66 66 20 29  0 && c<=0x04ff )
e220: 7b 0a 20 20 20 20 20 20 73 63 72 69 70 74 4d 61  {.      scriptMa
e230: 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 43 59 52  sk |= SCRIPT_CYR
e240: 49 4c 4c 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65  ILLIC;.    }else
e250: 20 69 66 28 20 63 3e 3d 30 78 30 33 38 36 20 26   if( c>=0x0386 &
e260: 26 20 63 3c 3d 30 78 30 33 63 65 20 29 7b 0a 20  & c<=0x03ce ){. 
e270: 20 20 20 20 20 73 63 72 69 70 74 4d 61 73 6b 20       scriptMask 
e280: 7c 3d 20 53 43 52 49 50 54 5f 47 52 45 45 4b 3b  |= SCRIPT_GREEK;
e290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69  .    }.  }.  swi
e2a0: 74 63 68 28 20 73 63 72 69 70 74 4d 61 73 6b 20  tch( scriptMask 
e2b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 20 20  ){.    case 0:  
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
e2d0: 73 20 3d 20 39 39 39 3b 20 62 72 65 61 6b 3b 0a  s = 999; break;.
e2e0: 20 20 20 20 63 61 73 65 20 53 43 52 49 50 54 5f      case SCRIPT_
e2f0: 4c 41 54 49 4e 3a 20 20 20 20 20 72 65 73 20 3d  LATIN:     res =
e300: 20 32 31 35 3b 20 62 72 65 61 6b 3b 0a 20 20 20   215; break;.   
e310: 20 63 61 73 65 20 53 43 52 49 50 54 5f 43 59 52   case SCRIPT_CYR
e320: 49 4c 4c 49 43 3a 20 20 72 65 73 20 3d 20 32 32  ILLIC:  res = 22
e330: 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  0; break;.    ca
e340: 73 65 20 53 43 52 49 50 54 5f 47 52 45 45 4b 3a  se SCRIPT_GREEK:
e350: 20 20 20 20 20 72 65 73 20 3d 20 32 30 30 3b 20       res = 200; 
e360: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
e370: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  lt:             
e380: 20 20 72 65 73 20 3d 20 39 39 38 3b 20 62 72 65    res = 998; bre
e390: 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ak;.  }.  sqlite
e3a0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
e3b0: 74 65 78 74 2c 20 72 65 73 29 3b 0a 7d 0a 0a 2f  text, res);.}../
e3c0: 2a 20 45 6e 64 20 74 72 61 6e 73 6c 69 74 65 72  * End transliter
e3d0: 61 74 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ate.************
e3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e420: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
e430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e470: 2a 0a 2a 2a 20 42 65 67 69 6e 20 73 70 65 6c 6c  *.** Begin spell
e480: 66 69 78 31 20 76 69 72 74 75 61 6c 20 74 61 62  fix1 virtual tab
e490: 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 20 4d 61 78 69 6d  le..*/../* Maxim
e4a0: 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 70  um length of a p
e4b0: 68 6f 6e 65 68 61 73 68 20 75 73 65 64 20 66 6f  honehash used fo
e4c0: 72 20 71 75 65 72 79 69 6e 67 20 74 68 65 20 73  r querying the s
e4d0: 68 61 64 6f 77 20 74 61 62 6c 65 20 2a 2f 0a 23  hadow table */.#
e4e0: 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
e4f0: 4d 58 5f 48 41 53 48 20 20 38 0a 0a 2f 2a 20 4d  MX_HASH  8../* M
e500: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
e510: 20 68 61 73 68 20 73 74 72 69 6e 67 73 20 74 6f   hash strings to
e520: 20 65 78 61 6d 69 6e 65 20 70 65 72 20 71 75 65   examine per que
e530: 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  ry */.#define SP
e540: 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 20 20 20  ELLFIX_MX_RUN   
e550: 31 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  1..typedef struc
e560: 74 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62  t spellfix1_vtab
e570: 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 3b   spellfix1_vtab;
e580: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
e590: 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
e5a0: 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
e5b0: 72 3b 0a 0a 2f 2a 20 46 75 7a 7a 79 2d 73 65 61  r;../* Fuzzy-sea
e5c0: 72 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  rch virtual tabl
e5d0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75  e object */.stru
e5e0: 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  ct spellfix1_vta
e5f0: 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  b {.  sqlite3_vt
e600: 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  ab base;        
e610: 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d   /* Base class -
e620: 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   must be first *
e630: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e650: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
e660: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ction */.  char 
e670: 2a 7a 44 62 4e 61 6d 65 3b 20 20 20 20 20 20 20  *zDbName;       
e680: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
e690: 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   database holdin
e6a0: 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
e6b0: 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61    char *zTableNa
e6c0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  me;          /* 
e6d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 72 74  Name of the virt
e6e0: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  ual table */.  c
e6f0: 68 61 72 20 2a 7a 43 6f 73 74 54 61 62 6c 65 3b  har *zCostTable;
e700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
e710: 6c 65 20 68 6f 6c 64 69 6e 67 20 65 64 69 74 2d  le holding edit-
e720: 64 69 73 74 61 6e 63 65 20 63 6f 73 74 20 6e 75  distance cost nu
e730: 6d 62 65 72 73 20 2a 2f 0a 20 20 45 64 69 74 44  mbers */.  EditD
e740: 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  ist3Config *pCon
e750: 66 69 67 33 3b 20 2f 2a 20 50 61 72 73 65 64 20  fig3; /* Parsed 
e760: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 63 6f  edit distance co
e770: 73 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 75  sts */.};../* Fu
e780: 7a 7a 79 2d 73 65 61 72 63 68 20 63 75 72 73 6f  zzy-search curso
e790: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75  r object */.stru
e7a0: 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  ct spellfix1_cur
e7b0: 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
e7c0: 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
e7d0: 3b 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61  ;    /* Base cla
e7e0: 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72  ss - must be fir
e7f0: 73 74 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  st */.  spellfix
e800: 31 5f 76 74 61 62 20 2a 70 56 54 61 62 3b 20 20  1_vtab *pVTab;  
e810: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
e820: 65 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  e to which this 
e830: 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 2a  cursor belongs *
e840: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 74 65  /.  char *zPatte
e850: 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rn;             
e860: 20 2f 2a 20 72 68 73 20 6f 66 20 4d 41 54 43 48   /* rhs of MATCH
e870: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
e880: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
e890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e8a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 63  ber of rows of c
e8b0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
e8c0: 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
e8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e8e0: 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  er of allocated 
e8f0: 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rows */.  int iR
e900: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
e910: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
e920: 74 20 72 6f 77 20 6f 66 20 63 6f 6e 74 65 6e 74  t row of content
e930: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b   */.  int iLang;
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
e960: 68 65 20 6c 61 6e 67 69 64 3d 20 63 6f 6e 73 74  he langid= const
e970: 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  raint */.  int i
e980: 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
e990: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
e9a0: 20 6f 66 20 74 68 65 20 74 6f 70 3d 20 63 6f 6e   of the top= con
e9b0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  straint */.  int
e9c0: 20 69 53 63 6f 70 65 3b 20 20 20 20 20 20 20 20   iScope;        
e9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
e9e0: 75 65 20 6f 66 20 74 68 65 20 73 63 6f 70 65 3d  ue of the scope=
e9f0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
ea00: 20 69 6e 74 20 6e 53 65 61 72 63 68 3b 20 20 20   int nSearch;   
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea20: 20 4e 75 6d 62 65 72 20 6f 66 20 76 6f 63 61 62   Number of vocab
ea30: 75 6c 61 72 79 20 69 74 65 6d 73 20 63 68 65 63  ulary items chec
ea40: 6b 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ked */.  sqlite3
ea50: 5f 73 74 6d 74 20 2a 70 46 75 6c 6c 53 63 61 6e  _stmt *pFullScan
ea60: 3b 20 20 20 20 20 2f 2a 20 53 68 61 64 6f 77 20  ;     /* Shadow 
ea70: 71 75 65 72 79 20 66 6f 72 20 61 20 66 75 6c 6c  query for a full
ea80: 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
ea90: 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78   struct spellfix
eaa0: 31 5f 72 6f 77 20 7b 20 20 20 20 20 20 20 2f 2a  1_row {       /*
eab0: 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   For each row of
eac0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
ead0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
eae0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  owid;         /*
eaf0: 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   Rowid for this 
eb00: 72 6f 77 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  row */.    char 
eb10: 2a 7a 57 6f 72 64 3b 20 20 20 20 20 20 20 20 20  *zWord;         
eb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
eb30: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a 2f   for this row */
eb40: 0a 20 20 20 20 69 6e 74 20 69 52 61 6e 6b 3b 20  .    int iRank; 
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 2f 2a 20 52 61 6e 6b 20 66 6f 72 20 74     /* Rank for t
eb70: 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  his row */.    i
eb80: 6e 74 20 69 44 69 73 74 61 6e 63 65 3b 20 20 20  nt iDistance;   
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eba0: 44 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 70 61  Distance from pa
ebb0: 74 74 65 72 6e 20 66 6f 72 20 74 68 69 73 20 72  ttern for this r
ebc0: 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53  ow */.    int iS
ebd0: 63 6f 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  core;           
ebe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 6f 72 65          /* Score
ebf0: 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 2a 2f 0a   for sorting */.
ec00: 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c 65      int iMatchle
ec10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
ec20: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6d 61    /* Value of ma
ec30: 74 63 68 6c 65 6e 20 63 6f 6c 75 6d 6e 20 28 6f  tchlen column (o
ec40: 72 20 2d 31 29 20 2a 2f 0a 20 20 20 20 63 68 61  r -1) */.    cha
ec50: 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46 49 58  r zHash[SPELLFIX
ec60: 5f 4d 58 5f 48 41 53 48 5d 3b 20 2f 2a 20 74 68  _MX_HASH]; /* th
ec70: 65 20 70 68 6f 6e 65 68 61 73 68 20 75 73 65 64  e phonehash used
ec80: 20 66 6f 72 20 74 68 69 73 20 6d 61 74 63 68 20   for this match 
ec90: 2a 2f 0a 20 20 7d 20 2a 61 3b 20 0a 7d 3b 0a 0a  */.  } *a; .};..
eca0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
ecb0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20  one or more SQL 
ecc0: 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f 6d 20  statements from 
ecd0: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
ece0: 67 20 67 69 76 65 6e 0a 2a 2a 20 61 6e 64 20 74  g given.** and t
ecf0: 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 6f  hen evaluate tho
ed00: 73 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 54  se statements. T
ed10: 68 65 20 73 75 63 63 65 73 73 20 63 6f 64 65 20  he success code 
ed20: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
ed30: 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a 2a 2a 20 49  to *pRc..**.** I
ed40: 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74 69 61  f *pRc is initia
ed50: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65  lly non-zero the
ed60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
ed70: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
ed80: 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66  atic void spellf
ed90: 69 78 31 44 62 45 78 65 63 28 0a 20 20 69 6e 74  ix1DbExec(.  int
eda0: 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
edb0: 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63      /* Success c
edc0: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
edd0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
ede0: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77  /* Database in w
edf0: 68 69 63 68 20 74 6f 20 72 75 6e 20 53 51 4c 20  hich to run SQL 
ee00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
ee10: 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 2f 2a 20 46  *zFormat,   /* F
ee20: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72  ormat string for
ee30: 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20   SQL */.  ...   
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
ee60: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
ee70: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69  ng */.){.  va_li
ee80: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
ee90: 53 71 6c 3b 0a 20 20 69 66 28 20 2a 70 52 63 20  Sql;.  if( *pRc 
eea0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73  ) return;.  va_s
eeb0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
eec0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
eed0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
eee0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
eef0: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
ef00: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Sql==0 ){.    *p
ef10: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
ef20: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
ef30: 2a 70 52 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  *pRc = sqlite3_e
ef40: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
ef50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
ef60: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
ef70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 44 69    }.}../*.** xDi
ef80: 73 63 6f 6e 6e 65 63 74 2f 78 44 65 73 74 72 6f  sconnect/xDestro
ef90: 79 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 65  y method for the
efa0: 20 66 75 7a 7a 79 2d 73 65 61 72 63 68 20 6d 6f   fuzzy-search mo
efb0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
efc0: 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 55 6e 69  int spellfix1Uni
efd0: 6e 69 74 28 69 6e 74 20 69 73 44 65 73 74 72 6f  nit(int isDestro
efe0: 79 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  y, sqlite3_vtab 
eff0: 2a 70 56 54 61 62 29 7b 0a 20 20 73 70 65 6c 6c  *pVTab){.  spell
f000: 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28  fix1_vtab *p = (
f010: 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29  spellfix1_vtab*)
f020: 70 56 54 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVTab;.  int rc 
f030: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
f040: 66 28 20 69 73 44 65 73 74 72 6f 79 20 29 7b 0a  f( isDestroy ){.
f050: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
f060: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 70 65  = p->db;.    spe
f070: 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63  llfix1DbExec(&rc
f080: 2c 20 64 62 2c 20 22 44 52 4f 50 20 54 41 42 4c  , db, "DROP TABL
f090: 45 20 49 46 20 45 58 49 53 54 53 20 5c 22 25 77  E IF EXISTS \"%w
f0a0: 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22  \".\"%w_vocab\""
f0b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f0c0: 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20      p->zDbName, 
f0d0: 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  p->zTableName);.
f0e0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
f0f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
f100: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
f110: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20  TableName);.    
f120: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44  editDist3ConfigD
f130: 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69 67  elete(p->pConfig
f140: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  3);.    sqlite3_
f150: 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54 61 62  free(p->zCostTab
f160: 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
f170: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20  _free(p);.  }.  
f180: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
f190: 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
f1a0: 31 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69  1Disconnect(sqli
f1b0: 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 29  te3_vtab *pVTab)
f1c0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c  {.  return spell
f1d0: 66 69 78 31 55 6e 69 6e 69 74 28 30 2c 20 70 56  fix1Uninit(0, pV
f1e0: 54 61 62 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Tab);.}.static i
f1f0: 6e 74 20 73 70 65 6c 6c 66 69 78 31 44 65 73 74  nt spellfix1Dest
f200: 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61 62  roy(sqlite3_vtab
f210: 20 2a 70 56 54 61 62 29 7b 0a 20 20 72 65 74 75   *pVTab){.  retu
f220: 72 6e 20 73 70 65 6c 6c 66 69 78 31 55 6e 69 6e  rn spellfix1Unin
f230: 69 74 28 31 2c 20 70 56 54 61 62 29 3b 0a 7d 0a  it(1, pVTab);.}.
f240: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  ./*.** Make a co
f250: 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 2e 20  py of a string. 
f260: 20 52 65 6d 6f 76 65 20 6c 65 61 64 69 6e 67 20   Remove leading 
f270: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
f280: 74 65 73 70 61 63 65 0a 2a 2a 20 61 6e 64 20 64  tespace.** and d
f290: 65 71 75 6f 74 65 20 69 74 2e 0a 2a 2f 0a 73 74  equote it..*/.st
f2a0: 61 74 69 63 20 63 68 61 72 20 2a 73 70 65 6c 6c  atic char *spell
f2b0: 66 69 78 31 44 65 71 75 6f 74 65 28 63 6f 6e 73  fix1Dequote(cons
f2c0: 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20  t char *zIn){.  
f2d0: 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e  char *zOut;.  in
f2e0: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
f2f0: 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61  ;.  while( isspa
f300: 63 65 28 7a 49 6e 5b 30 5d 29 20 29 20 7a 49 6e  ce(zIn[0]) ) zIn
f310: 2b 2b 3b 0a 20 20 7a 4f 75 74 20 3d 20 73 71 6c  ++;.  zOut = sql
f320: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
f330: 22 2c 20 7a 49 6e 29 3b 0a 20 20 69 66 28 20 7a  ", zIn);.  if( z
f340: 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Out==0 ) return 
f350: 30 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29 73 74  0;.  i = (int)st
f360: 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 23 69 66 20  rlen(zOut);.#if 
f370: 30 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72  0  /* The parser
f380: 20 77 69 6c 6c 20 6e 65 76 65 72 20 6c 65 61 76   will never leav
f390: 65 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20  e spaces at the 
f3a0: 65 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  end */.  while( 
f3b0: 69 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 7a  i>0 && isspace(z
f3c0: 4f 75 74 5b 69 2d 31 5d 29 20 29 7b 20 69 2d 2d  Out[i-1]) ){ i--
f3d0: 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 4f 75  ; }.#endif.  zOu
f3e0: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 63 20 3d 20  t[i] = 0;.  c = 
f3f0: 7a 4f 75 74 5b 30 5d 3b 0a 20 20 69 66 28 20 63  zOut[0];.  if( c
f400: 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27  =='\'' || c=='"'
f410: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c   ){.    for(i=1,
f420: 20 6a 3d 30 3b 20 41 4c 57 41 59 53 28 7a 4f 75   j=0; ALWAYS(zOu
f430: 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[i]); i++){.   
f440: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a     zOut[j++] = z
f450: 4f 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Out[i];.      if
f460: 28 20 7a 4f 75 74 5b 69 5d 3d 3d 63 20 29 7b 0a  ( zOut[i]==c ){.
f470: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74          if( zOut
f480: 5b 69 2b 31 5d 3d 3d 63 20 29 7b 0a 20 20 20 20  [i+1]==c ){.    
f490: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
f4a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f4b0: 20 20 20 20 7a 4f 75 74 5b 6a 2d 31 5d 20 3d 20      zOut[j-1] = 
f4c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
f4d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
f4e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f4f0: 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d    return zOut;.}
f500: 0a 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6e 6e 65 63  .../*.** xConnec
f510: 74 2f 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64  t/xCreate method
f520: 20 66 6f 72 20 74 68 65 20 73 70 65 6c 6c 66 69   for the spellfi
f530: 78 31 20 6d 6f 64 75 6c 65 2e 20 41 72 67 75 6d  x1 module. Argum
f540: 65 6e 74 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ents are:.**.** 
f550: 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d    argv[0]   -> m
f560: 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28 22 73 70  odule name  ("sp
f570: 65 6c 6c 66 69 78 31 22 29 0a 2a 2a 20 20 20 61  ellfix1").**   a
f580: 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61  rgv[1]   -> data
f590: 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61  base name.**   a
f5a0: 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c  rgv[2]   -> tabl
f5b0: 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
f5c0: 5b 33 5d 2e 2e 20 2d 3e 20 6f 70 74 69 6f 6e 61  [3].. -> optiona
f5d0: 6c 20 61 72 67 75 6d 65 6e 74 73 20 28 69 2e 65  l arguments (i.e
f5e0: 2e 20 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62  . "edit_cost_tab
f5f0: 6c 65 22 20 70 61 72 61 6d 65 74 65 72 29 0a 2a  le" parameter).*
f600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
f610: 6c 6c 66 69 78 31 49 6e 69 74 28 0a 20 20 69 6e  llfix1Init(.  in
f620: 74 20 69 73 43 72 65 61 74 65 2c 0a 20 20 73 71  t isCreate,.  sq
f630: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
f640: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
f650: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
f660: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
f670: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
f680: 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  VTab,.  char **p
f690: 7a 45 72 72 0a 29 7b 0a 20 20 73 70 65 6c 6c 66  zErr.){.  spellf
f6a0: 69 78 31 5f 76 74 61 62 20 2a 70 4e 65 77 20 3d  ix1_vtab *pNew =
f6b0: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
f6c0: 20 2a 7a 4d 6f 64 75 6c 65 20 3d 20 61 72 67 76   *zModule = argv
f6d0: 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  [0];.  const cha
f6e0: 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 61 72 67  r *zDbName = arg
f6f0: 76 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  v[1];.  const ch
f700: 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 20 3d  ar *zTableName =
f710: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74 20   argv[2];.  int 
f720: 6e 44 62 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 72  nDbName;.  int r
f730: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f740: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 44 62 4e 61   int i;..  nDbNa
f750: 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
f760: 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 70 4e 65  (zDbName);.  pNe
f770: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
f780: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
f790: 29 20 2b 20 6e 44 62 4e 61 6d 65 20 2b 20 31 29  ) + nDbName + 1)
f7a0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
f7b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
f7c0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
f7d0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  e{.    memset(pN
f7e0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, 0, sizeof(*p
f7f0: 4e 65 77 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d  New));.    pNew-
f800: 3e 7a 44 62 4e 61 6d 65 20 3d 20 28 63 68 61 72  >zDbName = (char
f810: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20  *)&pNew[1];.    
f820: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 44 62  memcpy(pNew->zDb
f830: 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 2c 20 6e  Name, zDbName, n
f840: 44 62 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 70  DbName+1);.    p
f850: 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 20  New->zTableName 
f860: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
f870: 66 28 22 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  f("%s", zTableNa
f880: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 64  me);.    pNew->d
f890: 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 66 28 20  b = db;.    if( 
f8a0: 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65  pNew->zTableName
f8b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
f8c0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
f8d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f8e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
f8f0: 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 0a  clare_vtab(db, .
f900: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
f910: 54 45 20 54 41 42 4c 45 20 78 28 77 6f 72 64 2c  TE TABLE x(word,
f920: 72 61 6e 6b 2c 64 69 73 74 61 6e 63 65 2c 6c 61  rank,distance,la
f930: 6e 67 69 64 2c 20 22 0a 20 20 20 20 20 20 20 20  ngid, ".        
f940: 20 20 20 22 73 63 6f 72 65 2c 20 6d 61 74 63 68     "score, match
f950: 6c 65 6e 2c 20 70 68 6f 6e 65 68 61 73 68 20 48  len, phonehash H
f960: 49 44 44 45 4e 2c 20 22 0a 20 20 20 20 20 20 20  IDDEN, ".       
f970: 20 20 20 20 22 74 6f 70 20 48 49 44 44 45 4e 2c      "top HIDDEN,
f980: 20 73 63 6f 70 65 20 48 49 44 44 45 4e 2c 20 73   scope HIDDEN, s
f990: 72 63 68 63 6e 74 20 48 49 44 44 45 4e 2c 20 22  rchcnt HIDDEN, "
f9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 22 73 6f 75  .           "sou
f9b0: 6e 64 73 6c 69 6b 65 20 48 49 44 44 45 4e 2c 20  ndslike HIDDEN, 
f9c0: 63 6f 6d 6d 61 6e 64 20 48 49 44 44 45 4e 29 22  command HIDDEN)"
f9d0: 0a 20 20 20 20 20 20 29 3b 0a 23 64 65 66 69 6e  .      );.#defin
f9e0: 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57  e SPELLFIX_COL_W
f9f0: 4f 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30  ORD            0
fa00: 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
fa10: 58 5f 43 4f 4c 5f 52 41 4e 4b 20 20 20 20 20 20  X_COL_RANK      
fa20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
fa30: 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49 53  SPELLFIX_COL_DIS
fa40: 54 41 4e 43 45 20 20 20 20 20 20 20 20 32 0a 23  TANCE        2.#
fa50: 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
fa60: 43 4f 4c 5f 4c 41 4e 47 49 44 20 20 20 20 20 20  COL_LANGID      
fa70: 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 53 50      3.#define SP
fa80: 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45  ELLFIX_COL_SCORE
fa90: 20 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65             4.#de
faa0: 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  fine SPELLFIX_CO
fab0: 4c 5f 4d 41 54 43 48 4c 45 4e 20 20 20 20 20 20  L_MATCHLEN      
fac0: 20 20 35 0a 23 64 65 66 69 6e 65 20 53 50 45 4c    5.#define SPEL
fad0: 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e 45 48 41  LFIX_COL_PHONEHA
fae0: 53 48 20 20 20 20 20 20 20 36 0a 23 64 65 66 69  SH       6.#defi
faf0: 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  ne SPELLFIX_COL_
fb00: 54 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20  TOP             
fb10: 37 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46  7.#define SPELLF
fb20: 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 20 20 20 20  IX_COL_SCOPE    
fb30: 20 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65         8.#define
fb40: 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52   SPELLFIX_COL_SR
fb50: 43 48 43 4e 54 20 20 20 20 20 20 20 20 20 39 0a  CHCNT         9.
fb60: 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
fb70: 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 20  _COL_SOUNDSLIKE 
fb80: 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53      10.#define S
fb90: 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43 4f 4d 4d  PELLFIX_COL_COMM
fba0: 41 4e 44 20 20 20 20 20 20 20 20 31 31 0a 20 20  AND        11.  
fbb0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
fbc0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73 43  SQLITE_OK && isC
fbd0: 72 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  reate ){.      s
fbe0: 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26  pellfix1DbExec(&
fbf0: 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 20 20  rc, db,.        
fc00: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
fc10: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 5c 22 25  F NOT EXISTS \"%
fc20: 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22  w\".\"%w_vocab\"
fc30: 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20  (\n".         " 
fc40: 20 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d   id INTEGER PRIM
fc50: 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20 20  ARY KEY,\n".    
fc60: 20 20 20 20 20 22 20 20 72 61 6e 6b 20 49 4e 54       "  rank INT
fc70: 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20  ,\n".         " 
fc80: 20 6c 61 6e 67 69 64 20 49 4e 54 2c 5c 6e 22 0a   langid INT,\n".
fc90: 20 20 20 20 20 20 20 20 20 22 20 20 77 6f 72 64           "  word
fca0: 20 54 45 58 54 2c 5c 6e 22 0a 20 20 20 20 20 20   TEXT,\n".      
fcb0: 20 20 20 22 20 20 6b 31 20 54 45 58 54 2c 5c 6e     "  k1 TEXT,\n
fcc0: 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 6b 32  ".         "  k2
fcd0: 20 54 45 58 54 5c 6e 22 0a 20 20 20 20 20 20 20   TEXT\n".       
fce0: 20 20 22 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20    ");\n",.      
fcf0: 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62     zDbName, zTab
fd00: 6c 65 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  leName.      );.
fd10: 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44        spellfix1D
fd20: 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20  bExec(&rc, db,. 
fd30: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
fd40: 49 4e 44 45 58 20 49 46 20 4e 4f 54 20 45 58 49  INDEX IF NOT EXI
fd50: 53 54 53 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f  STS \"%w\".\"%w_
fd60: 76 6f 63 61 62 5f 69 6e 64 65 78 5f 6c 61 6e 67  vocab_index_lang
fd70: 69 64 5f 6b 32 5c 22 20 22 0a 20 20 20 20 20 20  id_k2\" ".      
fd80: 20 20 20 20 20 20 22 4f 4e 20 5c 22 25 77 5f 76        "ON \"%w_v
fd90: 6f 63 61 62 5c 22 28 6c 61 6e 67 69 64 2c 6b 32  ocab\"(langid,k2
fda0: 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 44  );",.         zD
fdb0: 62 4e 61 6d 65 2c 20 7a 4d 6f 64 75 6c 65 2c 20  bName, zModule, 
fdc0: 7a 54 61 62 6c 65 4e 61 6d 65 0a 20 20 20 20 20  zTableName.     
fdd0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   );.    }.    fo
fde0: 72 28 69 3d 33 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=3; rc==SQLIT
fdf0: 45 5f 4f 4b 20 26 26 20 69 3c 61 72 67 63 3b 20  E_OK && i<argc; 
fe00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
fe10: 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 69 5d 2c  strncmp(argv[i],
fe20: 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62 6c 65  "edit_cost_table
fe30: 3d 22 2c 31 36 29 3d 3d 30 20 26 26 20 70 4e 65  =",16)==0 && pNe
fe40: 77 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d 30  w->zCostTable==0
fe50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   ){.        pNew
fe60: 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d 20 73  ->zCostTable = s
fe70: 70 65 6c 6c 66 69 78 31 44 65 71 75 6f 74 65 28  pellfix1Dequote(
fe80: 26 61 72 67 76 5b 69 5d 5b 31 36 5d 29 3b 0a 20  &argv[i][16]);. 
fe90: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
fea0: 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d 30 20 29  >zCostTable==0 )
feb0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
fec0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  EM;.        cont
fed0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
fee0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71 6c      *pzErr = sql
fef0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 62 61  ite3_mprintf("ba
ff00: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 70  d argument to sp
ff10: 65 6c 6c 66 69 78 31 28 29 3a 20 5c 22 25 73 5c  ellfix1(): \"%s\
ff20: 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  "", argv[i]);.  
ff30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ff40: 45 52 52 4f 52 3b 20 0a 20 20 20 20 7d 0a 20 20  ERROR; .    }.  
ff50: 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20 70  }..  if( rc && p
ff60: 4e 65 77 20 29 7b 0a 20 20 20 20 2a 70 70 56 54  New ){.    *ppVT
ff70: 61 62 20 3d 20 30 3b 0a 20 20 20 20 73 70 65 6c  ab = 0;.    spel
ff80: 6c 66 69 78 31 55 6e 69 6e 69 74 28 30 2c 20 26  lfix1Uninit(0, &
ff90: 70 4e 65 77 2d 3e 62 61 73 65 29 3b 0a 20 20 7d  pNew->base);.  }
ffa0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 56 54 61  else{.    *ppVTa
ffb0: 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74 61  b = (sqlite3_vta
ffc0: 62 20 2a 29 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  b *)pNew;.  }.  
ffd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ffe0: 0a 2a 2a 20 54 68 65 20 78 43 6f 6e 6e 65 63 74  .** The xConnect
fff0: 20 61 6e 64 20 78 43 72 65 61 74 65 20 6d 65 74   and xCreate met
10000 68 6f 64 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hods.*/.static i
10010 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 6f 6e 6e  nt spellfix1Conn
10020 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
10030 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78  db,.  void *pAux
10040 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  ,.  int argc, co
10050 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a  nst char *const*
10060 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argv,.  sqlite3_
10070 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a 20  vtab **ppVTab,. 
10080 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
10090 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c 66  .  return spellf
100a0 69 78 31 49 6e 69 74 28 30 2c 20 64 62 2c 20 70  ix1Init(0, db, p
100b0 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  Aux, argc, argv,
100c0 20 70 70 56 54 61 62 2c 20 70 7a 45 72 72 29 3b   ppVTab, pzErr);
100d0 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  .}.static int sp
100e0 65 6c 6c 66 69 78 31 43 72 65 61 74 65 28 0a 20  ellfix1Create(. 
100f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
10100 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e  void *pAux,.  in
10110 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
10120 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a  ar *const*argv,.
10130 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
10140 2a 70 70 56 54 61 62 2c 0a 20 20 63 68 61 72 20  *ppVTab,.  char 
10150 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74  **pzErr.){.  ret
10160 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 49 6e 69  urn spellfix1Ini
10170 74 28 31 2c 20 64 62 2c 20 70 41 75 78 2c 20 61  t(1, db, pAux, a
10180 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 54 61  rgc, argv, ppVTa
10190 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a  b, pzErr);.}../*
101a0 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 6f 66  .** Clear all of
101b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f   the content fro
101c0 6d 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  m a cursor..*/.s
101d0 74 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c  tatic void spell
101e0 66 69 78 31 52 65 73 65 74 43 75 72 73 6f 72 28  fix1ResetCursor(
101f0 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
10200 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
10210 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
10220 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b  Cur->nRow; i++){
10230 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10240 65 28 70 43 75 72 2d 3e 61 5b 69 5d 2e 7a 57 6f  e(pCur->a[i].zWo
10250 72 64 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  rd);.  }.  pCur-
10260 3e 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43 75  >nRow = 0;.  pCu
10270 72 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 70  r->iRow = 0;.  p
10280 43 75 72 2d 3e 6e 53 65 61 72 63 68 20 3d 20 30  Cur->nSearch = 0
10290 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46  ;.  if( pCur->pF
102a0 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 73  ullScan ){.    s
102b0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
102c0 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 29  pCur->pFullScan)
102d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 46 75 6c  ;.    pCur->pFul
102e0 6c 53 63 61 6e 20 3d 20 30 3b 0a 20 20 7d 0a 7d  lScan = 0;.  }.}
102f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74  ../*.** Resize t
10300 68 65 20 63 75 72 73 6f 72 20 74 6f 20 68 6f 6c  he cursor to hol
10310 64 20 75 70 20 74 6f 20 4e 20 72 6f 77 73 20 6f  d up to N rows o
10320 66 20 63 6f 6e 74 65 6e 74 0a 2a 2f 0a 73 74 61  f content.*/.sta
10330 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66 69  tic void spellfi
10340 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28 73  x1ResizeCursor(s
10350 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
10360 2a 70 43 75 72 2c 20 69 6e 74 20 4e 29 7b 0a 20  *pCur, int N){. 
10370 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78   struct spellfix
10380 31 5f 72 6f 77 20 2a 61 4e 65 77 3b 0a 20 20 61  1_row *aNew;.  a
10390 73 73 65 72 74 28 20 4e 3e 3d 70 43 75 72 2d 3e  ssert( N>=pCur->
103a0 6e 52 6f 77 20 29 3b 0a 20 20 61 4e 65 77 20 3d  nRow );.  aNew =
103b0 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
103c0 28 70 43 75 72 2d 3e 61 2c 20 73 69 7a 65 6f 66  (pCur->a, sizeof
103d0 28 70 43 75 72 2d 3e 61 5b 30 5d 29 2a 4e 29 3b  (pCur->a[0])*N);
103e0 0a 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 26  .  if( aNew==0 &
103f0 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 73 70 65  & N>0 ){.    spe
10400 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f  llfix1ResetCurso
10410 72 28 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c  r(pCur);.    sql
10420 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
10430 61 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 41  a);.    pCur->nA
10440 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 43  lloc = 0;.    pC
10450 75 72 2d 3e 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  ur->a = 0;.  }el
10460 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 41  se{.    pCur->nA
10470 6c 6c 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 43  lloc = N;.    pC
10480 75 72 2d 3e 61 20 3d 20 61 4e 65 77 3b 0a 20 20  ur->a = aNew;.  
10490 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  }.}.../*.** Clos
104a0 65 20 61 20 66 75 7a 7a 79 2d 73 65 61 72 63 68  e a fuzzy-search
104b0 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
104c0 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
104d0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74  Close(sqlite3_vt
104e0 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
104f0 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  .  spellfix1_cur
10500 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65  sor *pCur = (spe
10510 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 29  llfix1_cursor *)
10520 63 75 72 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31  cur;.  spellfix1
10530 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75 72  ResetCursor(pCur
10540 29 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65  );.  spellfix1Re
10550 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72 2c  sizeCursor(pCur,
10560 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
10570 72 65 65 28 70 43 75 72 2d 3e 7a 50 61 74 74 65  ree(pCur->zPatte
10580 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  rn);.  sqlite3_f
10590 72 65 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ree(pCur);.  ret
105a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
105b0 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
105c0 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 73  or terms of thes
105d0 65 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20  e forms:.**.**  
105e0 20 28 41 29 20 20 20 20 77 6f 72 64 20 4d 41 54   (A)    word MAT
105f0 43 48 20 24 73 74 72 0a 2a 2a 20 20 20 28 42 29  CH $str.**   (B)
10600 20 20 20 20 6c 61 6e 67 69 64 20 3d 3d 20 24 6c      langid == $l
10610 61 6e 67 69 64 0a 2a 2a 20 20 20 28 43 29 20 20  angid.**   (C)  
10620 20 20 74 6f 70 20 3d 20 24 74 6f 70 0a 2a 2a 20    top = $top.** 
10630 20 20 28 44 29 20 20 20 20 73 63 6f 70 65 20 3d    (D)    scope =
10640 20 24 73 63 6f 70 65 0a 2a 2a 20 20 20 28 45 29   $scope.**   (E)
10650 20 20 20 20 64 69 73 74 61 6e 63 65 20 3c 20 24      distance < $
10660 64 69 73 74 61 6e 63 65 0a 2a 2a 20 20 20 28 46  distance.**   (F
10670 29 20 20 20 20 64 69 73 74 61 6e 63 65 20 3c 3d  )    distance <=
10680 20 24 64 69 73 74 61 6e 63 65 0a 2a 2a 20 20 20   $distance.**   
10690 28 47 29 20 20 20 20 72 6f 77 69 64 20 3d 20 24  (G)    rowid = $
106a0 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rowid.**.** The 
106b0 70 6c 61 6e 20 6e 75 6d 62 65 72 20 69 73 20 61  plan number is a
106c0 20 62 69 74 20 6d 61 73 6b 20 66 6f 72 6d 65 64   bit mask formed
106d0 20 77 69 74 68 20 74 68 65 73 65 20 62 69 74 73   with these bits
106e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 78 30 31 20 20  :.**.**   0x01  
106f0 20 28 41 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a   (A) is found.**
10700 20 20 20 30 78 30 32 20 20 20 28 42 29 20 69 73     0x02   (B) is
10710 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 30 34   found.**   0x04
10720 20 20 20 28 43 29 20 69 73 20 66 6f 75 6e 64 0a     (C) is found.
10730 2a 2a 20 20 20 30 78 30 38 20 20 20 28 44 29 20  **   0x08   (D) 
10740 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78  is found.**   0x
10750 31 30 20 20 20 28 45 29 20 69 73 20 66 6f 75 6e  10   (E) is foun
10760 64 0a 2a 2a 20 20 20 30 78 32 30 20 20 20 28 46  d.**   0x20   (F
10770 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20  ) is found.**   
10780 30 78 34 30 20 20 20 28 47 29 20 69 73 20 66 6f  0x40   (G) is fo
10790 75 6e 64 0a 2a 2a 0a 2a 2a 20 66 69 6c 74 65 72  und.**.** filter
107a0 2e 61 72 67 76 5b 2a 5d 20 76 61 6c 75 65 73 20  .argv[*] values 
107b0 63 6f 6e 74 61 69 6e 73 20 24 73 74 72 2c 20 24  contains $str, $
107c0 6c 61 6e 67 69 64 2c 20 24 74 6f 70 2c 20 24 73  langid, $top, $s
107d0 63 6f 70 65 20 61 6e 64 20 24 72 6f 77 69 64 0a  cope and $rowid.
107e0 2a 2a 20 69 66 20 73 70 65 63 69 66 69 65 64 20  ** if specified 
107f0 61 6e 64 20 69 6e 20 74 68 61 74 20 6f 72 64 65  and in that orde
10800 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
10810 20 73 70 65 6c 6c 66 69 78 31 42 65 73 74 49 6e   spellfix1BestIn
10820 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62  dex(sqlite3_vtab
10830 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69   *tab, sqlite3_i
10840 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
10850 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 50 6c 61  nfo){.  int iPla
10860 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 61  n = 0;.  int iLa
10870 6e 67 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69  ngTerm = -1;.  i
10880 6e 74 20 69 54 6f 70 54 65 72 6d 20 3d 20 2d 31  nt iTopTerm = -1
10890 3b 0a 20 20 69 6e 74 20 69 53 63 6f 70 65 54 65  ;.  int iScopeTe
108a0 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  rm = -1;.  int i
108b0 44 69 73 74 54 65 72 6d 20 3d 20 2d 31 3b 0a 20  DistTerm = -1;. 
108c0 20 69 6e 74 20 69 52 6f 77 69 64 54 65 72 6d 20   int iRowidTerm 
108d0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  = -1;.  int i;. 
108e0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
108f0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
10900 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61  traint *pConstra
10910 69 6e 74 3b 0a 20 20 70 43 6f 6e 73 74 72 61 69  int;.  pConstrai
10920 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61  nt = pIdxInfo->a
10930 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f  Constraint;.  fo
10940 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66  r(i=0; i<pIdxInf
10950 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  o->nConstraint; 
10960 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74  i++, pConstraint
10970 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f  ++){.    if( pCo
10980 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65  nstraint->usable
10990 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
109a0 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
109b0 20 74 68 65 20 66 6f 72 6d 3a 20 20 77 6f 72 64   the form:  word
109c0 20 4d 41 54 43 48 20 24 73 74 72 20 2a 2f 0a 20   MATCH $str */. 
109d0 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
109e0 31 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  1)==0 .     && p
109f0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
10a00 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f  umn==SPELLFIX_CO
10a10 4c 5f 57 4f 52 44 0a 20 20 20 20 20 26 26 20 70  L_WORD.     && p
10a20 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
10a30 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
10a40 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 0a 20 20  STRAINT_MATCH.  
10a50 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e    ){.      iPlan
10a60 20 7c 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64   |= 1;.      pId
10a70 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
10a80 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
10a90 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  ndex = 1;.      
10aa0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
10ab0 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
10ac0 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  it = 1;.    }.. 
10ad0 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74     /* Terms of t
10ae0 68 65 20 66 6f 72 6d 3a 20 20 6c 61 6e 67 69 64  he form:  langid
10af0 20 3d 20 24 6c 61 6e 67 69 64 20 20 2a 2f 0a 20   = $langid  */. 
10b00 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
10b10 32 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43  2)==0.     && pC
10b20 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
10b30 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  mn==SPELLFIX_COL
10b40 5f 4c 41 4e 47 49 44 0a 20 20 20 20 20 26 26 20  _LANGID.     && 
10b50 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
10b60 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
10b70 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20 20  NSTRAINT_EQ.    
10b80 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c  ){.      iPlan |
10b90 3d 20 32 3b 0a 20 20 20 20 20 20 69 4c 61 6e 67  = 2;.      iLang
10ba0 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  Term = i;.    }.
10bb0 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
10bc0 20 74 68 65 20 66 6f 72 6d 3a 20 20 74 6f 70 20   the form:  top 
10bd0 3d 20 24 74 6f 70 20 2a 2f 0a 20 20 20 20 69 66  = $top */.    if
10be0 28 20 28 69 50 6c 61 6e 20 26 20 34 29 3d 3d 30  ( (iPlan & 4)==0
10bf0 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10c00 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53  aint->iColumn==S
10c10 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54 4f 50 0a  PELLFIX_COL_TOP.
10c20 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
10c30 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  int->op==SQLITE_
10c40 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10c50 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  _EQ.    ){.     
10c60 20 69 50 6c 61 6e 20 7c 3d 20 34 3b 0a 20 20 20   iPlan |= 4;.   
10c70 20 20 20 69 54 6f 70 54 65 72 6d 20 3d 20 69 3b     iTopTerm = i;
10c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
10c90 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
10ca0 3a 20 20 73 63 6f 70 65 20 3d 20 24 73 63 6f 70  :  scope = $scop
10cb0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50  e */.    if( (iP
10cc0 6c 61 6e 20 26 20 38 29 3d 3d 30 0a 20 20 20 20  lan & 8)==0.    
10cd0 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
10ce0 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46  >iColumn==SPELLF
10cf0 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 0a 20 20 20  IX_COL_SCOPE.   
10d00 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
10d10 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
10d20 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
10d30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50  .    ){.      iP
10d40 6c 61 6e 20 7c 3d 20 38 3b 0a 20 20 20 20 20 20  lan |= 8;.      
10d50 69 53 63 6f 70 65 54 65 72 6d 20 3d 20 69 3b 0a  iScopeTerm = i;.
10d60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65      }..    /* Te
10d70 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  rms of the form:
10d80 20 20 64 69 73 74 61 6e 63 65 20 3c 20 24 64 69    distance < $di
10d90 73 74 20 6f 72 20 64 69 73 74 61 6e 63 65 20 3c  st or distance <
10da0 3d 20 24 64 69 73 74 20 2a 2f 0a 20 20 20 20 69  = $dist */.    i
10db0 66 28 20 28 69 50 6c 61 6e 20 26 20 28 31 36 7c  f( (iPlan & (16|
10dc0 33 32 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  32))==0.     && 
10dd0 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f  pConstraint->iCo
10de0 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43  lumn==SPELLFIX_C
10df0 4f 4c 5f 44 49 53 54 41 4e 43 45 0a 20 20 20 20  OL_DISTANCE.    
10e00 20 26 26 20 28 70 43 6f 6e 73 74 72 61 69 6e 74   && (pConstraint
10e10 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
10e20 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
10e30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43  .          || pC
10e40 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53  onstraint->op==S
10e50 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
10e60 54 52 41 49 4e 54 5f 4c 45 29 0a 20 20 20 20 29  TRAINT_LE).    )
10e70 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d  {.      iPlan |=
10e80 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
10e90 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
10ea0 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 3f 20 31  ONSTRAINT_LT ? 1
10eb0 36 20 3a 20 33 32 3b 0a 20 20 20 20 20 20 69 44  6 : 32;.      iD
10ec0 69 73 74 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20  istTerm = i;.   
10ed0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73   }..    /* Terms
10ee0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 64   of the form:  d
10ef0 69 73 74 61 6e 63 65 20 3c 20 24 64 69 73 74 20  istance < $dist 
10f00 6f 72 20 64 69 73 74 61 6e 63 65 20 3c 3d 20 24  or distance <= $
10f10 64 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  dist */.    if( 
10f20 28 69 50 6c 61 6e 20 26 20 36 34 29 3d 3d 30 0a  (iPlan & 64)==0.
10f30 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
10f40 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  int->iColumn<0. 
10f50 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69      && pConstrai
10f60 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  nt->op==SQLITE_I
10f70 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10f80 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  EQ.    ){.      
10f90 69 50 6c 61 6e 20 7c 3d 20 36 34 3b 0a 20 20 20  iPlan |= 64;.   
10fa0 20 20 20 69 52 6f 77 69 64 54 65 72 6d 20 3d 20     iRowidTerm = 
10fb0 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  i;.    }.  }.  i
10fc0 66 28 20 69 50 6c 61 6e 26 31 20 29 7b 0a 20 20  f( iPlan&1 ){.  
10fd0 20 20 69 6e 74 20 69 64 78 20 3d 20 32 3b 0a 20    int idx = 2;. 
10fe0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
10ff0 4e 75 6d 20 3d 20 69 50 6c 61 6e 3b 0a 20 20 20  Num = iPlan;.   
11000 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
11010 4f 72 64 65 72 42 79 3d 3d 31 0a 20 20 20 20 20  OrderBy==1.     
11020 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  && pIdxInfo->aOr
11030 64 65 72 42 79 5b 30 5d 2e 69 43 6f 6c 75 6d 6e  derBy[0].iColumn
11040 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53  ==SPELLFIX_COL_S
11050 43 4f 52 45 0a 20 20 20 20 20 26 26 20 70 49 64  CORE.     && pId
11060 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b  xInfo->aOrderBy[
11070 30 5d 2e 64 65 73 63 3d 3d 30 0a 20 20 20 20 29  0].desc==0.    )
11080 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  {.      pIdxInfo
11090 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
110a0 64 20 3d 20 31 3b 20 20 2f 2a 20 44 65 66 61 75  d = 1;  /* Defau
110b0 6c 74 20 6f 72 64 65 72 20 62 79 20 69 53 63 6f  lt order by iSco
110c0 72 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  re */.    }.    
110d0 69 66 28 20 69 50 6c 61 6e 26 32 20 29 7b 0a 20  if( iPlan&2 ){. 
110e0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61       pIdxInfo->a
110f0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
11100 69 4c 61 6e 67 54 65 72 6d 5d 2e 61 72 67 76 49  iLangTerm].argvI
11110 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20  ndex = idx++;.  
11120 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
11130 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
11140 4c 61 6e 67 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d  LangTerm].omit =
11150 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
11160 28 20 69 50 6c 61 6e 26 34 20 29 7b 0a 20 20 20  ( iPlan&4 ){.   
11170 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
11180 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 54  nstraintUsage[iT
11190 6f 70 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65  opTerm].argvInde
111a0 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20  x = idx++;.     
111b0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
111c0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 54 6f 70  traintUsage[iTop
111d0 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  Term].omit = 1;.
111e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50      }.    if( iP
111f0 6c 61 6e 26 38 20 29 7b 0a 20 20 20 20 20 20 70  lan&8 ){.      p
11200 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
11210 61 69 6e 74 55 73 61 67 65 5b 69 53 63 6f 70 65  aintUsage[iScope
11220 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20  Term].argvIndex 
11230 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70  = idx++;.      p
11240 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
11250 61 69 6e 74 55 73 61 67 65 5b 69 53 63 6f 70 65  aintUsage[iScope
11260 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  Term].omit = 1;.
11270 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50      }.    if( iP
11280 6c 61 6e 26 28 31 36 7c 33 32 29 20 29 7b 0a 20  lan&(16|32) ){. 
11290 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61       pIdxInfo->a
112a0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
112b0 69 44 69 73 74 54 65 72 6d 5d 2e 61 72 67 76 49  iDistTerm].argvI
112c0 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20  ndex = idx++;.  
112d0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
112e0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
112f0 44 69 73 74 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d  DistTerm].omit =
11300 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49   1;.    }.    pI
11310 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
11320 64 43 6f 73 74 20 3d 20 31 65 35 3b 0a 20 20 7d  dCost = 1e5;.  }
11330 65 6c 73 65 20 69 66 28 20 28 69 50 6c 61 6e 20  else if( (iPlan 
11340 26 20 36 34 29 20 29 7b 0a 20 20 20 20 70 49 64  & 64) ){.    pId
11350 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
11360 36 34 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  64;.    pIdxInfo
11370 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
11380 67 65 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e 61  ge[iRowidTerm].a
11390 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20  rgvIndex = 1;.  
113a0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
113b0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 52 6f  straintUsage[iRo
113c0 77 69 64 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20  widTerm].omit = 
113d0 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  1;.    pIdxInfo-
113e0 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
113f0 20 35 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   5;.  }else{.   
11400 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
11410 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
11420 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
11430 73 74 20 3d 20 31 65 35 30 3b 0a 20 20 7d 0a 20  st = 1e50;.  }. 
11440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11450 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  K;.}../*.** Open
11460 20 61 20 6e 65 77 20 66 75 7a 7a 79 2d 73 65 61   a new fuzzy-sea
11470 72 63 68 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  rch cursor..*/.s
11480 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
11490 69 78 31 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  ix1Open(sqlite3_
114a0 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c  vtab *pVTab, sql
114b0 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
114c0 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20   **ppCursor){.  
114d0 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a  spellfix1_vtab *
114e0 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76  p = (spellfix1_v
114f0 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 73 70  tab*)pVTab;.  sp
11500 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
11510 70 43 75 72 3b 0a 20 20 70 43 75 72 20 3d 20 73  pCur;.  pCur = s
11520 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
11530 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a  izeof(*pCur) );.
11540 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20    if( pCur==0 ) 
11550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11560 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  MEM;.  memset(pC
11570 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ur, 0, sizeof(*p
11580 43 75 72 29 29 3b 0a 20 20 70 43 75 72 2d 3e 70  Cur));.  pCur->p
11590 56 54 61 62 20 3d 20 70 3b 0a 20 20 2a 70 70 43  VTab = p;.  *ppC
115a0 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62  ursor = &pCur->b
115b0 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ase;.  return SQ
115c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
115d0 2a 20 41 64 6a 75 73 74 20 61 20 64 69 73 74 61  * Adjust a dista
115e0 6e 63 65 20 6d 65 61 73 75 72 65 6d 65 6e 74 20  nce measurement 
115f0 62 79 20 74 68 65 20 77 6f 72 64 73 20 72 61 6e  by the words ran
11600 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 68  k in order to sh
11610 6f 77 0a 2a 2a 20 70 72 65 66 65 72 65 6e 63 65  ow.** preference
11620 20 74 6f 20 63 6f 6d 6d 6f 6e 20 77 6f 72 64 73   to common words
11630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11640 73 70 65 6c 6c 66 69 78 31 53 63 6f 72 65 28 69  spellfix1Score(i
11650 6e 74 20 69 44 69 73 74 61 6e 63 65 2c 20 69 6e  nt iDistance, in
11660 74 20 69 52 61 6e 6b 29 7b 0a 20 20 69 6e 74 20  t iRank){.  int 
11670 69 4c 6f 67 32 3b 0a 20 20 66 6f 72 28 69 4c 6f  iLog2;.  for(iLo
11680 67 32 3d 30 3b 20 69 52 61 6e 6b 3e 30 3b 20 69  g2=0; iRank>0; i
11690 4c 6f 67 32 2b 2b 2c 20 69 52 61 6e 6b 3e 3e 3d  Log2++, iRank>>=
116a0 31 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69 44  1){}.  return iD
116b0 69 73 74 61 6e 63 65 20 2b 20 33 32 20 2d 20 69  istance + 32 - i
116c0 4c 6f 67 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Log2;.}../*.** C
116d0 6f 6d 70 61 72 65 20 74 77 6f 20 73 70 65 6c 6c  ompare two spell
116e0 66 69 78 31 5f 72 6f 77 20 6f 62 6a 65 63 74 73  fix1_row objects
116f0 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
11700 70 6f 73 65 73 20 69 6e 20 71 73 6f 72 74 28 29  poses in qsort()
11710 20 73 75 63 68 0a 2a 2a 20 74 68 61 74 20 74 68   such.** that th
11720 65 79 20 73 6f 72 74 20 69 6e 20 6f 72 64 65 72  ey sort in order
11730 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 64   of increasing d
11740 69 73 74 61 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  istance..*/.stat
11750 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
11760 52 6f 77 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  RowCompare(const
11770 20 76 6f 69 64 20 2a 41 2c 20 63 6f 6e 73 74 20   void *A, const 
11780 76 6f 69 64 20 2a 42 29 7b 0a 20 20 63 6f 6e 73  void *B){.  cons
11790 74 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69  t struct spellfi
117a0 78 31 5f 72 6f 77 20 2a 61 20 3d 20 28 63 6f 6e  x1_row *a = (con
117b0 73 74 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66  st struct spellf
117c0 69 78 31 5f 72 6f 77 2a 29 41 3b 0a 20 20 63 6f  ix1_row*)A;.  co
117d0 6e 73 74 20 73 74 72 75 63 74 20 73 70 65 6c 6c  nst struct spell
117e0 66 69 78 31 5f 72 6f 77 20 2a 62 20 3d 20 28 63  fix1_row *b = (c
117f0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70 65 6c  onst struct spel
11800 6c 66 69 78 31 5f 72 6f 77 2a 29 42 3b 0a 20 20  lfix1_row*)B;.  
11810 72 65 74 75 72 6e 20 61 2d 3e 69 53 63 6f 72 65  return a->iScore
11820 20 2d 20 62 2d 3e 69 53 63 6f 72 65 3b 0a 7d 0a   - b->iScore;.}.
11830 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
11840 72 65 20 75 73 65 64 20 74 6f 20 70 61 73 73 20  re used to pass 
11850 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
11860 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72   spellfix1Filter
11870 46 6f 72 4d 61 74 63 68 28 29 0a 2a 2a 20 69 6e  ForMatch().** in
11880 74 6f 20 73 70 65 6c 6c 66 69 78 31 52 75 6e 51  to spellfix1RunQ
11890 75 65 72 79 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  uery()..*/.typed
118a0 65 66 20 73 74 72 75 63 74 20 4d 61 74 63 68 51  ef struct MatchQ
118b0 75 65 72 79 20 7b 0a 20 20 73 70 65 6c 6c 66 69  uery {.  spellfi
118c0 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 3b  x1_cursor *pCur;
118d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
118e0 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 71 75   cursor being qu
118f0 65 72 69 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  eried */.  sqlit
11900 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
11910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
11920 68 61 64 6f 77 20 74 61 62 6c 65 20 71 75 65 72  hadow table quer
11930 79 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20  y statment */.  
11940 63 68 61 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c  char zHash[SPELL
11950 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 20 20  FIX_MX_HASH];   
11960 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
11970 70 68 6f 6e 65 68 61 73 68 20 66 6f 72 20 7a 50  phonehash for zP
11980 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73  attern */.  cons
11990 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e  t char *zPattern
119a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
119b0 54 72 61 6e 73 6c 69 74 65 72 61 74 65 64 20 69  Transliterated i
119c0 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  nput string */. 
119d0 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20 20   int nPattern;  
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
11a00 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 45 64 69  Pattern */.  Edi
11a10 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
11a20 20 2a 70 4d 61 74 63 68 53 74 72 33 3b 20 2f 2a   *pMatchStr3; /*
11a30 20 4f 72 69 67 69 6e 61 6c 20 75 6e 69 63 6f 64   Original unicod
11a40 65 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 45 64  e string */.  Ed
11a50 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70  itDist3Config *p
11a60 43 6f 6e 66 69 67 33 3b 20 20 20 20 20 20 20 2f  Config3;       /
11a70 2a 20 45 64 69 74 2d 64 69 73 74 61 6e 63 65 20  * Edit-distance 
11a80 63 6f 73 74 20 63 6f 65 66 66 69 63 69 65 6e 74  cost coefficient
11a90 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 64 69  s */.  const Edi
11aa0 74 44 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e  tDist3Lang *pLan
11ab0 67 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  g;      /* The s
11ac0 65 6c 65 63 74 65 64 20 6c 61 6e 67 75 61 67 65  elected language
11ad0 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20 2a 2f   coefficients */
11ae0 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20 20  .  int iLang;   
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 6e 67 75      /* The langu
11b10 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  age id */.  int 
11b20 69 53 63 6f 70 65 3b 20 20 20 20 20 20 20 20 20  iScope;         
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b40 44 65 66 61 75 6c 74 20 73 63 6f 70 65 20 2a 2f  Default scope */
11b50 0a 20 20 69 6e 74 20 69 4d 61 78 44 69 73 74 3b  .  int iMaxDist;
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
11b80 6c 6c 6f 77 65 64 20 65 64 69 74 20 64 69 73 74  llowed edit dist
11b90 61 6e 63 65 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20  ance, or -1 */. 
11ba0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
11bd0 2a 2f 0a 20 20 69 6e 74 20 6e 52 75 6e 3b 20 20  */.  int nRun;  
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69  /* Number of pri
11c00 6f 72 20 72 75 6e 73 20 66 6f 72 20 74 68 65 20  or runs for the 
11c10 73 61 6d 65 20 7a 50 61 74 74 65 72 6e 20 2a 2f  same zPattern */
11c20 0a 20 20 63 68 61 72 20 61 7a 50 72 69 6f 72 5b  .  char azPrior[
11c30 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 5d  SPELLFIX_MX_RUN]
11c40 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53  [SPELLFIX_MX_HAS
11c50 48 5d 3b 20 20 2f 2a 20 50 72 69 6f 72 20 68 61  H];  /* Prior ha
11c60 73 68 65 73 20 2a 2f 0a 7d 20 4d 61 74 63 68 51  shes */.} MatchQ
11c70 75 65 72 79 3b 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  uery;../*.** Run
11c80 20 61 20 71 75 65 72 79 20 6c 6f 6f 6b 69 6e 67   a query looking
11c90 20 66 6f 72 20 74 68 65 20 62 65 73 74 20 6d 61   for the best ma
11ca0 74 63 68 65 73 20 61 67 61 69 6e 73 74 20 7a 50  tches against zP
11cb0 61 74 74 65 72 6e 20 75 73 69 6e 67 0a 2a 2a 20  attern using.** 
11cc0 7a 48 61 73 68 20 61 73 20 74 68 65 20 63 68 61  zHash as the cha
11cd0 72 61 63 74 65 72 20 63 6c 61 73 73 20 73 65 65  racter class see
11ce0 64 20 68 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69  d hash..*/.stati
11cf0 63 20 76 6f 69 64 20 73 70 65 6c 6c 66 69 78 31  c void spellfix1
11d00 52 75 6e 51 75 65 72 79 28 4d 61 74 63 68 51 75  RunQuery(MatchQu
11d10 65 72 79 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ery *p, const ch
11d20 61 72 20 2a 7a 51 75 65 72 79 2c 20 69 6e 74 20  ar *zQuery, int 
11d30 6e 51 75 65 72 79 29 7b 0a 20 20 63 6f 6e 73 74  nQuery){.  const
11d40 20 63 68 61 72 20 2a 7a 4b 31 3b 0a 20 20 63 6f   char *zK1;.  co
11d50 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 3b  nst char *zWord;
11d60 0a 20 20 69 6e 74 20 69 44 69 73 74 3b 0a 20 20  .  int iDist;.  
11d70 69 6e 74 20 69 52 61 6e 6b 3b 0a 20 20 69 6e 74  int iRank;.  int
11d80 20 69 53 63 6f 72 65 3b 0a 20 20 69 6e 74 20 69   iScore;.  int i
11d90 57 6f 72 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Worst = 0;.  int
11da0 20 69 64 78 3b 0a 20 20 69 6e 74 20 69 64 78 57   idx;.  int idxW
11db0 6f 72 73 74 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  orst = -1;.  int
11dc0 20 69 3b 0a 20 20 69 6e 74 20 69 53 63 6f 70 65   i;.  int iScope
11dd0 20 3d 20 70 2d 3e 69 53 63 6f 70 65 3b 0a 20 20   = p->iScope;.  
11de0 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
11df0 20 2a 70 43 75 72 20 3d 20 70 2d 3e 70 43 75 72   *pCur = p->pCur
11e00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
11e10 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 53 74   *pStmt = p->pSt
11e20 6d 74 3b 0a 20 20 63 68 61 72 20 7a 48 61 73 68  mt;.  char zHash
11e30 31 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41  1[SPELLFIX_MX_HA
11e40 53 48 5d 3b 0a 20 20 63 68 61 72 20 7a 48 61 73  SH];.  char zHas
11e50 68 32 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48  h2[SPELLFIX_MX_H
11e60 41 53 48 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 43  ASH];.  char *zC
11e70 6c 61 73 73 3b 0a 20 20 69 6e 74 20 6e 43 6c 61  lass;.  int nCla
11e80 73 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ss;.  int rc;.. 
11e90 20 69 66 28 20 70 43 75 72 2d 3e 61 3d 3d 30 20   if( pCur->a==0 
11ea0 7c 7c 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  || p->rc ) retur
11eb0 6e 3b 20 20 20 2f 2a 20 50 72 69 6f 72 20 6d 65  n;   /* Prior me
11ec0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
11ed0 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 7a 43 6c  failure */.  zCl
11ee0 61 73 73 20 3d 20 28 63 68 61 72 2a 29 70 68 6f  ass = (char*)pho
11ef0 6e 65 74 69 63 48 61 73 68 28 28 75 6e 73 69 67  neticHash((unsig
11f00 6e 65 64 20 63 68 61 72 2a 29 7a 51 75 65 72 79  ned char*)zQuery
11f10 2c 20 6e 51 75 65 72 79 29 3b 0a 20 20 69 66 28  , nQuery);.  if(
11f20 20 7a 43 6c 61 73 73 3d 3d 30 20 29 7b 0a 20 20   zClass==0 ){.  
11f30 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
11f40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
11f50 72 6e 3b 0a 20 20 7d 0a 20 20 6e 43 6c 61 73 73  rn;.  }.  nClass
11f60 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
11f70 43 6c 61 73 73 29 3b 0a 20 20 69 66 28 20 6e 43  Class);.  if( nC
11f80 6c 61 73 73 3e 53 50 45 4c 4c 46 49 58 5f 4d 58  lass>SPELLFIX_MX
11f90 5f 48 41 53 48 2d 32 20 29 7b 0a 20 20 20 20 6e  _HASH-2 ){.    n
11fa0 43 6c 61 73 73 20 3d 20 53 50 45 4c 4c 46 49 58  Class = SPELLFIX
11fb0 5f 4d 58 5f 48 41 53 48 2d 32 3b 0a 20 20 20 20  _MX_HASH-2;.    
11fc0 7a 43 6c 61 73 73 5b 6e 43 6c 61 73 73 5d 20 3d  zClass[nClass] =
11fd0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43   0;.  }.  if( nC
11fe0 6c 61 73 73 3c 3d 69 53 63 6f 70 65 20 29 7b 0a  lass<=iScope ){.
11ff0 20 20 20 20 69 66 28 20 6e 43 6c 61 73 73 3e 32      if( nClass>2
12000 20 29 7b 0a 20 20 20 20 20 20 69 53 63 6f 70 65   ){.      iScope
12010 20 3d 20 6e 43 6c 61 73 73 2d 31 3b 0a 20 20 20   = nClass-1;.   
12020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53   }else{.      iS
12030 63 6f 70 65 20 3d 20 6e 43 6c 61 73 73 3b 0a 20  cope = nClass;. 
12040 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 63 70     }.  }.  memcp
12050 79 28 7a 48 61 73 68 31 2c 20 7a 43 6c 61 73 73  y(zHash1, zClass
12060 2c 20 69 53 63 6f 70 65 29 3b 0a 20 20 73 71 6c  , iScope);.  sql
12070 69 74 65 33 5f 66 72 65 65 28 7a 43 6c 61 73 73  ite3_free(zClass
12080 29 3b 0a 20 20 7a 48 61 73 68 31 5b 69 53 63 6f  );.  zHash1[iSco
12090 70 65 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 63 70  pe] = 0;.  memcp
120a0 79 28 7a 48 61 73 68 32 2c 20 7a 48 61 73 68 31  y(zHash2, zHash1
120b0 2c 20 69 53 63 6f 70 65 29 3b 0a 20 20 7a 48 61  , iScope);.  zHa
120c0 73 68 32 5b 69 53 63 6f 70 65 5d 20 3d 20 27 5a  sh2[iScope] = 'Z
120d0 27 3b 0a 20 20 7a 48 61 73 68 32 5b 69 53 63 6f  ';.  zHash2[iSco
120e0 70 65 2b 31 5d 20 3d 20 30 3b 0a 23 69 66 20 53  pe+1] = 0;.#if S
120f0 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 3e 31  PELLFIX_MX_RUN>1
12100 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
12110 3e 6e 52 75 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nRun; i++){.   
12120 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61   if( strcmp(p->a
12130 7a 50 72 69 6f 72 5b 69 5d 2c 20 7a 48 61 73 68  zPrior[i], zHash
12140 31 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  1)==0 ) return;.
12150 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73    }.#endif.  ass
12160 65 72 74 28 20 70 2d 3e 6e 52 75 6e 3c 53 50 45  ert( p->nRun<SPE
12170 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 20 29 3b 0a  LLFIX_MX_RUN );.
12180 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 50 72    memcpy(p->azPr
12190 69 6f 72 5b 70 2d 3e 6e 52 75 6e 2b 2b 5d 2c 20  ior[p->nRun++], 
121a0 7a 48 61 73 68 31 2c 20 69 53 63 6f 70 65 2b 31  zHash1, iScope+1
121b0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
121c0 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
121d0 2c 20 31 2c 20 7a 48 61 73 68 31 2c 20 2d 31 2c  , 1, zHash1, -1,
121e0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3d   SQLITE_STATIC)=
121f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20  =SQLITE_NOMEM.  
12200 20 7c 7c 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   || sqlite3_bind
12210 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 2c 20  _text(pStmt, 2, 
12220 7a 48 61 73 68 32 2c 20 2d 31 2c 20 53 51 4c 49  zHash2, -1, SQLI
12230 54 45 5f 53 54 41 54 49 43 29 3d 3d 53 51 4c 49  TE_STATIC)==SQLI
12240 54 45 5f 4e 4f 4d 45 4d 0a 20 20 29 7b 0a 20 20  TE_NOMEM.  ){.  
12250 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
12260 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
12270 72 6e 3b 0a 20 20 7d 0a 23 69 66 20 53 50 45 4c  rn;.  }.#if SPEL
12280 4c 46 49 58 5f 4d 58 5f 52 55 4e 3e 31 0a 20 20  LFIX_MX_RUN>1.  
12290 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d  for(i=0; i<pCur-
122a0 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nRow; i++){.   
122b0 20 69 66 28 20 70 43 75 72 2d 3e 61 5b 69 5d 2e   if( pCur->a[i].
122c0 69 53 63 6f 72 65 3e 69 57 6f 72 73 74 20 29 7b  iScore>iWorst ){
122d0 0a 20 20 20 20 20 20 69 57 6f 72 73 74 20 3d 20  .      iWorst = 
122e0 70 43 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72  pCur->a[i].iScor
122f0 65 3b 0a 20 20 20 20 20 20 69 64 78 57 6f 72 73  e;.      idxWors
12300 74 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = i;.    }.  }
12310 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28  .#endif.  while(
12320 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
12330 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
12340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61 74   ){.    int iMat
12350 63 68 6c 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  chlen = -1;.    
12360 69 52 61 6e 6b 20 3d 20 73 71 6c 69 74 65 33 5f  iRank = sqlite3_
12370 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
12380 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 2);.    if( p-
12390 3e 70 4d 61 74 63 68 53 74 72 33 20 29 7b 0a 20  >pMatchStr3 ){. 
123a0 20 20 20 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d       int nWord =
123b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
123c0 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b  bytes(pStmt, 1);
123d0 0a 20 20 20 20 20 20 7a 57 6f 72 64 20 3d 20 28  .      zWord = (
123e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
123f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
12400 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
12410 20 69 44 69 73 74 20 3d 20 65 64 69 74 44 69 73   iDist = editDis
12420 74 33 43 6f 72 65 28 70 2d 3e 70 4d 61 74 63 68  t3Core(p->pMatch
12430 53 74 72 33 2c 20 7a 57 6f 72 64 2c 20 6e 57 6f  Str3, zWord, nWo
12440 72 64 2c 20 70 2d 3e 70 4c 61 6e 67 2c 20 26 69  rd, p->pLang, &i
12450 4d 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 7d  Matchlen);.    }
12460 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 31 20  else{.      zK1 
12470 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
12480 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
12490 78 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20  xt(pStmt, 3);.  
124a0 20 20 20 20 69 66 28 20 7a 4b 31 3d 3d 30 20 29      if( zK1==0 )
124b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
124c0 20 69 44 69 73 74 20 3d 20 65 64 69 74 64 69 73   iDist = editdis
124d0 74 31 28 70 2d 3e 7a 50 61 74 74 65 72 6e 2c 20  t1(p->zPattern, 
124e0 7a 4b 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  zK1, 0);.    }. 
124f0 20 20 20 69 66 28 20 69 44 69 73 74 3c 30 20 29     if( iDist<0 )
12500 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
12510 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12520 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12530 0a 20 20 20 20 70 43 75 72 2d 3e 6e 53 65 61 72  .    pCur->nSear
12540 63 68 2b 2b 3b 0a 20 20 20 20 69 53 63 6f 72 65  ch++;.    iScore
12550 20 3d 20 73 70 65 6c 6c 66 69 78 31 53 63 6f 72   = spellfix1Scor
12560 65 28 69 44 69 73 74 2c 69 52 61 6e 6b 29 3b 0a  e(iDist,iRank);.
12570 20 20 20 20 69 66 28 20 70 2d 3e 69 4d 61 78 44      if( p->iMaxD
12580 69 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist>=0 ){.      
12590 69 66 28 20 69 44 69 73 74 3e 70 2d 3e 69 4d 61  if( iDist>p->iMa
125a0 78 44 69 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  xDist ) continue
125b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
125c0 2d 3e 6e 52 6f 77 3e 3d 70 43 75 72 2d 3e 6e 41  ->nRow>=pCur->nA
125d0 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  lloc-1 ){.      
125e0 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 69 7a    spellfix1Resiz
125f0 65 43 75 72 73 6f 72 28 70 43 75 72 2c 20 70 43  eCursor(pCur, pC
12600 75 72 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31  ur->nAlloc*2 + 1
12610 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
12620 70 43 75 72 2d 3e 61 3d 3d 30 20 29 20 62 72 65  pCur->a==0 ) bre
12630 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
12640 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 6e 52    idx = pCur->nR
12650 6f 77 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ow;.    }else if
12660 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3c 70 43 75  ( pCur->nRow<pCu
12670 72 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  r->nAlloc ){.   
12680 20 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 6e     idx = pCur->n
12690 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Row;.    }else i
126a0 66 28 20 69 53 63 6f 72 65 3c 69 57 6f 72 73 74  f( iScore<iWorst
126b0 20 29 7b 0a 20 20 20 20 20 20 69 64 78 20 3d 20   ){.      idx = 
126c0 69 64 78 57 6f 72 73 74 3b 0a 20 20 20 20 20 20  idxWorst;.      
126d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
126e0 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64 29  r->a[idx].zWord)
126f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12700 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12710 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69   }.    pCur->a[i
12720 64 78 5d 2e 7a 57 6f 72 64 20 3d 20 73 71 6c 69  dx].zWord = sqli
12730 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
12740 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
12750 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 29  _text(pStmt, 1))
12760 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
12770 61 5b 69 64 78 5d 2e 7a 57 6f 72 64 3d 3d 30 20  a[idx].zWord==0 
12780 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
12790 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
127a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
127b0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64  }.    pCur->a[id
127c0 78 5d 2e 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  x].iRowid = sqli
127d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
127e0 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
127f0 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 52 61  pCur->a[idx].iRa
12800 6e 6b 20 3d 20 69 52 61 6e 6b 3b 0a 20 20 20 20  nk = iRank;.    
12810 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 44 69  pCur->a[idx].iDi
12820 73 74 61 6e 63 65 20 3d 20 69 44 69 73 74 3b 0a  stance = iDist;.
12830 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d      pCur->a[idx]
12840 2e 69 53 63 6f 72 65 20 3d 20 69 53 63 6f 72 65  .iScore = iScore
12850 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64  ;.    pCur->a[id
12860 78 5d 2e 69 4d 61 74 63 68 6c 65 6e 20 3d 20 69  x].iMatchlen = i
12870 4d 61 74 63 68 6c 65 6e 3b 0a 20 20 20 20 6d 65  Matchlen;.    me
12880 6d 63 70 79 28 70 43 75 72 2d 3e 61 5b 69 64 78  mcpy(pCur->a[idx
12890 5d 2e 7a 48 61 73 68 2c 20 7a 48 61 73 68 31 2c  ].zHash, zHash1,
128a0 20 69 53 63 6f 70 65 2b 31 29 3b 0a 20 20 20 20   iScope+1);.    
128b0 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3c 70  if( pCur->nRow<p
128c0 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29 20 70 43  Cur->nAlloc ) pC
128d0 75 72 2d 3e 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20  ur->nRow++;.    
128e0 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3d 3d  if( pCur->nRow==
128f0 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  pCur->nAlloc ){.
12900 20 20 20 20 20 20 69 57 6f 72 73 74 20 3d 20 70        iWorst = p
12910 43 75 72 2d 3e 61 5b 30 5d 2e 69 53 63 6f 72 65  Cur->a[0].iScore
12920 3b 0a 20 20 20 20 20 20 69 64 78 57 6f 72 73 74  ;.      idxWorst
12930 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
12940 69 3d 31 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f  i=1; i<pCur->nRo
12950 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
12960 20 69 53 63 6f 72 65 20 3d 20 70 43 75 72 2d 3e   iScore = pCur->
12970 61 5b 69 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20  a[i].iScore;.   
12980 20 20 20 20 20 69 66 28 20 69 57 6f 72 73 74 3c       if( iWorst<
12990 69 53 63 6f 72 65 20 29 7b 0a 20 20 20 20 20 20  iScore ){.      
129a0 20 20 20 20 69 57 6f 72 73 74 20 3d 20 69 53 63      iWorst = iSc
129b0 6f 72 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ore;.          i
129c0 64 78 57 6f 72 73 74 20 3d 20 69 3b 0a 20 20 20  dxWorst = i;.   
129d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
129e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20     }.  }.  rc = 
129f0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
12a00 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  tmt);.  if( rc )
12a10 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 0a   p->rc = rc;.}..
12a20 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
12a30 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65  on of the xFilte
12a40 72 20 6d 65 74 68 6f 64 20 77 6f 72 6b 20 69 66  r method work if
12a50 20 74 68 65 20 4d 41 54 43 48 20 74 65 72 6d 20   the MATCH term 
12a60 69 73 20 70 72 65 73 65 6e 74 0a 2a 2a 20 61 6e  is present.** an
12a70 64 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  d we are doing a
12a80 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   scan..*/.static
12a90 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46 69   int spellfix1Fi
12aa0 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 0a 20 20  lterForMatch(.  
12ab0 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
12ac0 20 2a 70 43 75 72 2c 0a 20 20 69 6e 74 20 69 64   *pCur,.  int id
12ad0 78 4e 75 6d 2c 0a 20 20 69 6e 74 20 61 72 67 63  xNum,.  int argc
12ae0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
12af0 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
12b00 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12b10 72 20 2a 7a 4d 61 74 63 68 54 68 69 73 3b 20 20  r *zMatchThis;  
12b20 20 2f 2a 20 52 48 53 20 6f 66 20 74 68 65 20 4d   /* RHS of the M
12b30 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 2a 2f  ATCH operator */
12b40 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  .  EditDist3From
12b50 53 74 72 69 6e 67 20 2a 70 4d 61 74 63 68 53 74  String *pMatchSt
12b60 72 33 20 3d 20 30 3b 20 2f 2a 20 7a 4d 61 74 63  r3 = 0; /* zMatc
12b70 68 54 68 69 73 20 61 73 20 61 6e 20 65 64 69 74  hThis as an edit
12b80 64 69 73 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20  dist string */. 
12b90 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b   char *zPattern;
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 69 74 65      /* Translite
12bc0 72 61 74 69 6f 6e 20 6f 66 20 7a 4d 61 74 63 68  ration of zMatch
12bd0 54 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  This */.  int nP
12be0 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20  attern;         
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c00 4c 65 6e 67 74 68 20 6f 66 20 7a 50 61 74 74 65  Length of zPatte
12c10 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d  rn */.  int iLim
12c20 69 74 20 3d 20 32 30 3b 20 20 20 20 20 20 20 20  it = 20;        
12c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
12c40 78 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  x number of rows
12c50 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20   of output */.  
12c60 69 6e 74 20 69 53 63 6f 70 65 20 3d 20 33 3b 20  int iScope = 3; 
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20 6d     /* Use this m
12c90 61 6e 79 20 63 68 61 72 61 63 74 65 72 73 20 6f  any characters o
12ca0 66 20 7a 43 6c 61 73 73 20 2a 2f 0a 20 20 69 6e  f zClass */.  in
12cb0 74 20 69 4c 61 6e 67 20 3d 20 30 3b 20 20 20 20  t iLang = 0;    
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 63 6f 64   /* Language cod
12ce0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  e */.  char *zSq
12cf0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
12d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
12d10 20 6f 66 20 73 68 61 64 6f 77 20 74 61 62 6c 65   of shadow table
12d20 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69   query */.  sqli
12d30 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
12d40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
12d50 2a 20 53 68 61 64 6f 77 20 74 61 62 6c 65 20 71  * Shadow table q
12d60 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  uery */.  int rc
12d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12d90 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
12da0 20 69 6e 74 20 69 64 78 20 3d 20 31 3b 20 20 20   int idx = 1;   
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
12dd0 6c 61 62 6c 65 20 66 69 6c 74 65 72 20 70 61 72  lable filter par
12de0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 73 70 65 6c  ameter */.  spel
12df0 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20  lfix1_vtab *p = 
12e00 70 43 75 72 2d 3e 70 56 54 61 62 3b 20 20 20 2f  pCur->pVTab;   /
12e10 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 74 61  * The virtual ta
12e20 62 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 70 43  ble that owns pC
12e30 75 72 20 2a 2f 0a 20 20 4d 61 74 63 68 51 75 65  ur */.  MatchQue
12e40 72 79 20 78 3b 20 20 20 20 20 20 20 20 20 20 20  ry x;           
12e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
12e60 72 20 70 61 73 73 69 6e 67 20 69 6e 66 6f 20 74  r passing info t
12e70 6f 20 52 75 6e 51 75 65 72 79 28 29 20 2a 2f 0a  o RunQuery() */.
12e80 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63  .  /* Load the c
12e90 6f 73 74 20 74 61 62 6c 65 20 69 66 20 77 65 20  ost table if we 
12ea0 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79  have not already
12eb0 20 64 6f 6e 65 20 73 6f 20 2a 2f 0a 20 20 69 66   done so */.  if
12ec0 28 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 21  ( p->zCostTable!
12ed0 3d 30 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69 67  =0 && p->pConfig
12ee0 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  3==0 ){.    p->p
12ef0 43 6f 6e 66 69 67 33 20 3d 20 73 71 6c 69 74 65  Config3 = sqlite
12f00 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
12f10 28 70 2d 3e 70 43 6f 6e 66 69 67 33 5b 30 5d 29  (p->pConfig3[0])
12f20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
12f30 43 6f 6e 66 69 67 33 3d 3d 30 20 29 20 72 65 74  Config3==0 ) ret
12f40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12f50 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
12f60 70 43 6f 6e 66 69 67 33 2c 20 30 2c 20 73 69 7a  pConfig3, 0, siz
12f70 65 6f 66 28 70 2d 3e 70 43 6f 6e 66 69 67 33 5b  eof(p->pConfig3[
12f80 30 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 65  0]));.    rc = e
12f90 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c 6f  ditDist3ConfigLo
12fa0 61 64 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c 20  ad(p->pConfig3, 
12fb0 70 2d 3e 64 62 2c 20 70 2d 3e 7a 43 6f 73 74 54  p->db, p->zCostT
12fc0 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  able);.    if( r
12fd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
12fe0 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20   }.  memset(&x, 
12ff0 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  0, sizeof(x));. 
13000 20 78 2e 69 53 63 6f 70 65 20 3d 20 33 3b 20 20   x.iScope = 3;  
13010 2f 2a 20 44 65 66 61 75 6c 74 20 73 63 6f 70 65  /* Default scope
13020 20 69 66 20 6e 6f 6e 65 20 73 70 65 63 69 66 69   if none specifi
13030 65 64 20 62 79 20 22 57 48 45 52 45 20 73 63 6f  ed by "WHERE sco
13040 70 65 3d 4e 22 20 2a 2f 0a 20 20 78 2e 69 4d 61  pe=N" */.  x.iMa
13050 78 44 69 73 74 20 3d 20 2d 31 3b 20 20 20 2f 2a  xDist = -1;   /*
13060 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
13070 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 2a   edit distance *
13080 2f 0a 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 26  /..  if( idxNum&
13090 32 20 29 7b 0a 20 20 20 20 69 4c 61 6e 67 20 3d  2 ){.    iLang =
130a0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
130b0 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b  nt(argv[idx++]);
130c0 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78 4e 75  .  }.  if( idxNu
130d0 6d 26 34 20 29 7b 0a 20 20 20 20 69 4c 69 6d 69  m&4 ){.    iLimi
130e0 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
130f0 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b  e_int(argv[idx++
13100 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 69 6d  ]);.    if( iLim
13110 69 74 3c 31 20 29 20 69 4c 69 6d 69 74 20 3d 20  it<1 ) iLimit = 
13120 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78  1;.  }.  if( idx
13130 4e 75 6d 26 38 20 29 7b 0a 20 20 20 20 78 2e 69  Num&8 ){.    x.i
13140 53 63 6f 70 65 20 3d 20 73 71 6c 69 74 65 33 5f  Scope = sqlite3_
13150 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 69  value_int(argv[i
13160 64 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28 20  dx++]);.    if( 
13170 78 2e 69 53 63 6f 70 65 3c 31 20 29 20 78 2e 69  x.iScope<1 ) x.i
13180 53 63 6f 70 65 20 3d 20 31 3b 0a 20 20 20 20 69  Scope = 1;.    i
13190 66 28 20 78 2e 69 53 63 6f 70 65 3e 53 50 45 4c  f( x.iScope>SPEL
131a0 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 20 29  LFIX_MX_HASH-2 )
131b0 20 78 2e 69 53 63 6f 70 65 20 3d 20 53 50 45 4c   x.iScope = SPEL
131c0 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 3b 0a  LFIX_MX_HASH-2;.
131d0 20 20 7d 0a 20 20 69 66 28 20 69 64 78 4e 75 6d    }.  if( idxNum
131e0 26 28 31 36 7c 33 32 29 20 29 7b 0a 20 20 20 20  &(16|32) ){.    
131f0 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 73 71 6c  x.iMaxDist = sql
13200 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
13210 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 20  rgv[idx++]);.   
13220 20 69 66 28 20 69 64 78 4e 75 6d 26 31 36 20 29   if( idxNum&16 )
13230 20 78 2e 69 4d 61 78 44 69 73 74 2d 2d 3b 0a 20   x.iMaxDist--;. 
13240 20 20 20 69 66 28 20 78 2e 69 4d 61 78 44 69 73     if( x.iMaxDis
13250 74 3c 30 20 29 20 78 2e 69 4d 61 78 44 69 73 74  t<0 ) x.iMaxDist
13260 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 70 65 6c   = 0;.  }.  spel
13270 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f 72  lfix1ResetCursor
13280 28 70 43 75 72 29 3b 0a 20 20 73 70 65 6c 6c 66  (pCur);.  spellf
13290 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28  ix1ResizeCursor(
132a0 70 43 75 72 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  pCur, iLimit);. 
132b0 20 7a 4d 61 74 63 68 54 68 69 73 20 3d 20 73 71   zMatchThis = sq
132c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
132d0 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
132e0 20 7a 4d 61 74 63 68 54 68 69 73 3d 3d 30 20 29   zMatchThis==0 )
132f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13300 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e  K;.  if( p->pCon
13310 66 69 67 33 20 29 7b 0a 20 20 20 20 78 2e 70 4c  fig3 ){.    x.pL
13320 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74 33 46  ang = editDist3F
13330 69 6e 64 4c 61 6e 67 28 70 2d 3e 70 43 6f 6e 66  indLang(p->pConf
13340 69 67 33 2c 20 69 4c 61 6e 67 29 3b 0a 20 20 20  ig3, iLang);.   
13350 20 70 4d 61 74 63 68 53 74 72 33 20 3d 20 65 64   pMatchStr3 = ed
13360 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
13370 67 4e 65 77 28 78 2e 70 4c 61 6e 67 2c 20 28 63  gNew(x.pLang, (c
13380 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4d 61 74 63  onst char*)zMatc
13390 68 54 68 69 73 2c 20 2d 31 29 3b 0a 20 20 20 20  hThis, -1);.    
133a0 69 66 28 20 70 4d 61 74 63 68 53 74 72 33 3d 3d  if( pMatchStr3==
133b0 30 20 29 7b 0a 20 20 20 20 20 20 78 2e 72 63 20  0 ){.      x.rc 
133c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
133d0 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6c 74 65        goto filte
133e0 72 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  r_exit;.    }.  
133f0 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 70 4c 61  }else{.    x.pLa
13400 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 50  ng = 0;.  }.  zP
13410 61 74 74 65 72 6e 20 3d 20 28 63 68 61 72 2a 29  attern = (char*)
13420 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a 4d  transliterate(zM
13430 61 74 63 68 54 68 69 73 2c 20 73 71 6c 69 74 65  atchThis, sqlite
13440 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
13450 67 76 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69 74  gv[0]));.  sqlit
13460 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 7a 50  e3_free(pCur->zP
13470 61 74 74 65 72 6e 29 3b 0a 20 20 70 43 75 72 2d  attern);.  pCur-
13480 3e 7a 50 61 74 74 65 72 6e 20 3d 20 7a 50 61 74  >zPattern = zPat
13490 74 65 72 6e 3b 0a 20 20 69 66 28 20 7a 50 61 74  tern;.  if( zPat
134a0 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 78  tern==0 ){.    x
134b0 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  .rc = SQLITE_NOM
134c0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 69 6c  EM;.    goto fil
134d0 74 65 72 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  ter_exit;.  }.  
134e0 6e 50 61 74 74 65 72 6e 20 3d 20 28 69 6e 74 29  nPattern = (int)
134f0 73 74 72 6c 65 6e 28 7a 50 61 74 74 65 72 6e 29  strlen(zPattern)
13500 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e  ;.  if( zPattern
13510 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3d 3d 27 2a  [nPattern-1]=='*
13520 27 20 29 20 6e 50 61 74 74 65 72 6e 2d 2d 3b 0a  ' ) nPattern--;.
13530 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
13540 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 22  _mprintf(.     "
13550 53 45 4c 45 43 54 20 69 64 2c 20 77 6f 72 64 2c  SELECT id, word,
13560 20 72 61 6e 6b 2c 20 6b 31 22 0a 20 20 20 20 20   rank, k1".     
13570 22 20 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c  "  FROM \"%w\".\
13580 22 25 77 5f 76 6f 63 61 62 5c 22 22 0a 20 20 20  "%w_vocab\"".   
13590 20 20 22 20 57 48 45 52 45 20 6c 61 6e 67 69 64    " WHERE langid
135a0 3d 25 64 20 41 4e 44 20 6b 32 3e 3d 3f 31 20 41  =%d AND k2>=?1 A
135b0 4e 44 20 6b 32 3c 3f 32 22 2c 0a 20 20 20 20 20  ND k2<?2",.     
135c0 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a  p->zDbName, p->z
135d0 54 61 62 6c 65 4e 61 6d 65 2c 20 69 4c 61 6e 67  TableName, iLang
135e0 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  .  );.  if( zSql
135f0 3d 3d 30 20 29 7b 0a 20 20 20 20 78 2e 72 63 20  ==0 ){.    x.rc 
13600 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
13610 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20      pStmt = 0;. 
13620 20 20 20 67 6f 74 6f 20 66 69 6c 74 65 72 5f 65     goto filter_e
13630 78 69 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  xit;.  }.  rc = 
13640 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
13650 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
13660 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
13670 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13680 53 71 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 4c  Sql);.  pCur->iL
13690 61 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a 20 20 78  ang = iLang;.  x
136a0 2e 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 20 20  .pCur = pCur;.  
136b0 78 2e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b  x.pStmt = pStmt;
136c0 0a 20 20 78 2e 7a 50 61 74 74 65 72 6e 20 3d 20  .  x.zPattern = 
136d0 7a 50 61 74 74 65 72 6e 3b 0a 20 20 78 2e 6e 50  zPattern;.  x.nP
136e0 61 74 74 65 72 6e 20 3d 20 6e 50 61 74 74 65 72  attern = nPatter
136f0 6e 3b 0a 20 20 78 2e 70 4d 61 74 63 68 53 74 72  n;.  x.pMatchStr
13700 33 20 3d 20 70 4d 61 74 63 68 53 74 72 33 3b 0a  3 = pMatchStr3;.
13710 20 20 78 2e 69 4c 61 6e 67 20 3d 20 69 4c 61 6e    x.iLang = iLan
13720 67 3b 0a 20 20 78 2e 72 63 20 3d 20 72 63 3b 0a  g;.  x.rc = rc;.
13730 20 20 78 2e 70 43 6f 6e 66 69 67 33 20 3d 20 70    x.pConfig3 = p
13740 2d 3e 70 43 6f 6e 66 69 67 33 3b 0a 20 20 69 66  ->pConfig3;.  if
13750 28 20 78 2e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( x.rc==SQLITE_O
13760 4b 20 29 7b 0a 20 20 20 20 73 70 65 6c 6c 66 69  K ){.    spellfi
13770 78 31 52 75 6e 51 75 65 72 79 28 26 78 2c 20 7a  x1RunQuery(&x, z
13780 50 61 74 74 65 72 6e 2c 20 6e 50 61 74 74 65 72  Pattern, nPatter
13790 6e 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  n);.  }..  if( p
137a0 43 75 72 2d 3e 61 20 29 7b 0a 20 20 20 20 71 73  Cur->a ){.    qs
137b0 6f 72 74 28 70 43 75 72 2d 3e 61 2c 20 70 43 75  ort(pCur->a, pCu
137c0 72 2d 3e 6e 52 6f 77 2c 20 73 69 7a 65 6f 66 28  r->nRow, sizeof(
137d0 70 43 75 72 2d 3e 61 5b 30 5d 29 2c 20 73 70 65  pCur->a[0]), spe
137e0 6c 6c 66 69 78 31 52 6f 77 43 6f 6d 70 61 72 65  llfix1RowCompare
137f0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 54 6f  );.    pCur->iTo
13800 70 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20  p = iLimit;.    
13810 70 43 75 72 2d 3e 69 53 63 6f 70 65 20 3d 20 69  pCur->iScope = i
13820 53 63 6f 70 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Scope;.  }else{.
13830 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49 54      x.rc = SQLIT
13840 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 66 69  E_NOMEM;.  }..fi
13850 6c 74 65 72 5f 65 78 69 74 3a 0a 20 20 73 71 6c  lter_exit:.  sql
13860 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
13870 74 6d 74 29 3b 0a 20 20 65 64 69 74 44 69 73 74  tmt);.  editDist
13880 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65 74  3FromStringDelet
13890 65 28 70 4d 61 74 63 68 53 74 72 33 29 3b 0a 20  e(pMatchStr3);. 
138a0 20 72 65 74 75 72 6e 20 78 2e 72 63 3b 0a 7d 0a   return x.rc;.}.
138b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
138c0 69 6f 6e 20 6f 66 20 78 46 69 6c 74 65 72 20 68  ion of xFilter h
138d0 61 6e 64 6c 65 73 20 61 20 66 75 6c 6c 2d 74 61  andles a full-ta
138e0 62 6c 65 20 73 63 61 6e 20 63 61 73 65 0a 2a 2f  ble scan case.*/
138f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
13900 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 46 75  lfix1FilterForFu
13910 6c 6c 53 63 61 6e 28 0a 20 20 73 70 65 6c 6c 66  llScan(.  spellf
13920 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
13930 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 0a  ,.  int idxNum,.
13940 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
13950 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
13960 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gv.){.  int rc =
13970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
13980 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 70 65 6c  ar *zSql;.  spel
13990 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 56 54 61  lfix1_vtab *pVTa
139a0 62 20 3d 20 70 43 75 72 2d 3e 70 56 54 61 62 3b  b = pCur->pVTab;
139b0 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65  .  spellfix1Rese
139c0 74 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  tCursor(pCur);. 
139d0 20 61 73 73 65 72 74 28 20 69 64 78 4e 75 6d 3d   assert( idxNum=
139e0 3d 30 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d 36 34  =0 || idxNum==64
139f0 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c   );.  zSql = sql
13a00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
13a10 20 20 20 22 53 45 4c 45 43 54 20 77 6f 72 64 2c     "SELECT word,
13a20 20 72 61 6e 6b 2c 20 4e 55 4c 4c 2c 20 6c 61 6e   rank, NULL, lan
13a30 67 69 64 2c 20 69 64 20 46 52 4f 4d 20 5c 22 25  gid, id FROM \"%
13a40 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22  w\".\"%w_vocab\"
13a50 25 73 22 2c 0a 20 20 20 20 20 70 56 54 61 62 2d  %s",.     pVTab-
13a60 3e 7a 44 62 4e 61 6d 65 2c 20 70 56 54 61 62 2d  >zDbName, pVTab-
13a70 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20  >zTableName,.   
13a80 20 20 28 28 69 64 78 4e 75 6d 20 26 20 36 34 29    ((idxNum & 64)
13a90 20 3f 20 22 20 57 48 45 52 45 20 72 6f 77 69 64   ? " WHERE rowid
13aa0 3d 3f 22 20 3a 20 22 22 29 0a 20 20 29 3b 0a 20  =?" : "").  );. 
13ab0 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
13ac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
13ad0 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  EM;.  rc = sqlit
13ae0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 56  e3_prepare_v2(pV
13af0 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  Tab->db, zSql, -
13b00 31 2c 20 26 70 43 75 72 2d 3e 70 46 75 6c 6c 53  1, &pCur->pFullS
13b10 63 61 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  can, 0);.  sqlit
13b20 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
13b30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13b40 4f 4b 20 26 26 20 28 69 64 78 4e 75 6d 20 26 20  OK && (idxNum & 
13b50 36 34 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  64) ){.    asser
13b60 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20  t( argc==1 );.  
13b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
13b80 69 6e 64 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e  ind_value(pCur->
13b90 70 46 75 6c 6c 53 63 61 6e 2c 20 31 2c 20 61 72  pFullScan, 1, ar
13ba0 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 43  gv[0]);.  }.  pC
13bb0 75 72 2d 3e 6e 52 6f 77 20 3d 20 70 43 75 72 2d  ur->nRow = pCur-
13bc0 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28  >iRow = 0;.  if(
13bd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13be0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
13bf0 65 33 5f 73 74 65 70 28 70 43 75 72 2d 3e 70 46  e3_step(pCur->pF
13c00 75 6c 6c 53 63 61 6e 29 3b 0a 20 20 20 20 69 66  ullScan);.    if
13c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
13c20 20 29 7b 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d   ){ pCur->iRow =
13c30 20 2d 31 3b 20 72 63 20 3d 20 53 51 4c 49 54 45   -1; rc = SQLITE
13c40 5f 4f 4b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72  _OK; }.    if( r
13c50 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
13c60 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  { rc = SQLITE_OK
13c70 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ; }.  }else{.   
13c80 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30 3b   pCur->iRow = 0;
13c90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13ca0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  ;.}.../*.** Call
13cb0 65 64 20 74 6f 20 22 72 65 77 69 6e 64 22 20 61  ed to "rewind" a
13cc0 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
13cd0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 73 6f  the beginning so
13ce0 20 74 68 61 74 0a 2a 2a 20 69 74 20 73 74 61 72   that.** it star
13cf0 74 73 20 69 74 73 20 6f 75 74 70 75 74 20 6f 76  ts its output ov
13d00 65 72 20 61 67 61 69 6e 2e 20 20 41 6c 77 61 79  er again.  Alway
13d10 73 20 63 61 6c 6c 65 64 20 61 74 20 6c 65 61 73  s called at leas
13d20 74 20 6f 6e 63 65 0a 2a 2a 20 70 72 69 6f 72 20  t once.** prior 
13d30 74 6f 20 61 6e 79 20 73 70 65 6c 6c 66 69 78 31  to any spellfix1
13d40 43 6f 6c 75 6d 6e 2c 20 73 70 65 6c 6c 66 69 78  Column, spellfix
13d50 31 52 6f 77 69 64 2c 20 6f 72 20 73 70 65 6c 6c  1Rowid, or spell
13d60 66 69 78 31 45 6f 66 20 63 61 6c 6c 2e 0a 2a 2f  fix1Eof call..*/
13d70 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
13d80 6c 66 69 78 31 46 69 6c 74 65 72 28 0a 20 20 73  lfix1Filter(.  s
13d90 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
13da0 6f 72 20 2a 63 75 72 2c 20 0a 20 20 69 6e 74 20  or *cur, .  int 
13db0 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68  idxNum, const ch
13dc0 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e  ar *idxStr,.  in
13dd0 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
13de0 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
13df0 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73    spellfix1_curs
13e00 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c  or *pCur = (spel
13e10 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 29 63  lfix1_cursor *)c
13e20 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ur;.  int rc;.  
13e30 69 66 28 20 69 64 78 4e 75 6d 20 26 20 31 20 29  if( idxNum & 1 )
13e40 7b 0a 20 20 20 20 72 63 20 3d 20 73 70 65 6c 6c  {.    rc = spell
13e50 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d 61 74  fix1FilterForMat
13e60 63 68 28 70 43 75 72 2c 20 69 64 78 4e 75 6d 2c  ch(pCur, idxNum,
13e70 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 20 20   argc, argv);.  
13e80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
13e90 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46  spellfix1FilterF
13ea0 6f 72 46 75 6c 6c 53 63 61 6e 28 70 43 75 72 2c  orFullScan(pCur,
13eb0 20 69 64 78 4e 75 6d 2c 20 61 72 67 63 2c 20 61   idxNum, argc, a
13ec0 72 67 76 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rgv);.  }.  retu
13ed0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
13ee0 20 41 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   Advance a curso
13ef0 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20 72 6f  r to its next ro
13f00 77 20 6f 66 20 6f 75 74 70 75 74 0a 2a 2f 0a 73  w of output.*/.s
13f10 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
13f20 69 78 31 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  ix1Next(sqlite3_
13f30 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
13f40 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63  ){.  spellfix1_c
13f50 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73  ursor *pCur = (s
13f60 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
13f70 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20 72 63 20  *)cur;.  int rc 
13f80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
13f90 66 28 20 70 43 75 72 2d 3e 69 52 6f 77 20 3c 20  f( pCur->iRow < 
13fa0 70 43 75 72 2d 3e 6e 52 6f 77 20 29 7b 0a 20 20  pCur->nRow ){.  
13fb0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46 75 6c    if( pCur->pFul
13fc0 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 20 20 72  lScan ){.      r
13fd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
13fe0 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e  (pCur->pFullScan
13ff0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14000 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 70 43  =SQLITE_ROW ) pC
14010 75 72 2d 3e 69 52 6f 77 20 3d 20 70 43 75 72 2d  ur->iRow = pCur-
14020 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  >nRow;.      if(
14030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc==SQLITE_ROW 
14040 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
14050 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
14060 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
14070 20 20 20 20 20 20 70 43 75 72 2d 3e 69 52 6f 77        pCur->iRow
14080 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
14090 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
140a0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
140b0 69 66 20 77 65 20 61 72 65 20 61 74 20 74 68 65  if we are at the
140c0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 0a 2a 2f 0a   end-of-file.*/.
140d0 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
140e0 66 69 78 31 45 6f 66 28 73 71 6c 69 74 65 33 5f  fix1Eof(sqlite3_
140f0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
14100 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63  ){.  spellfix1_c
14110 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73  ursor *pCur = (s
14120 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
14130 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20  *)cur;.  return 
14140 70 43 75 72 2d 3e 69 52 6f 77 3e 3d 70 43 75 72  pCur->iRow>=pCur
14150 2d 3e 6e 52 6f 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->nRow;.}../*.**
14160 20 52 65 74 75 72 6e 20 63 6f 6c 75 6d 6e 73 20   Return columns 
14170 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
14180 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
14190 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 6f 6c  int spellfix1Col
141a0 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  umn(.  sqlite3_v
141b0 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
141c0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
141d0 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 69  xt *ctx,.  int i
141e0 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  .){.  spellfix1_
141f0 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
14200 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
14210 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70 43 75  *)cur;.  if( pCu
14220 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b 0a  r->pFullScan ){.
14230 20 20 20 20 69 66 28 20 69 3c 3d 53 50 45 4c 4c      if( i<=SPELL
14240 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20 29  FIX_COL_LANGID )
14250 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14260 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
14270 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
14280 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70 46 75  _value(pCur->pFu
14290 6c 6c 53 63 61 6e 2c 20 69 29 29 3b 0a 20 20 20  llScan, i));.   
142a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
142b0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
142c0 6c 28 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20  l(ctx);.    }.  
142d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
142e0 4f 4b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  OK;.  }.  switch
142f0 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ( i ){.    case 
14300 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52  SPELLFIX_COL_WOR
14310 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
14320 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
14330 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72  tx, pCur->a[pCur
14340 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64 2c 20 2d  ->iRow].zWord, -
14350 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
14360 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14370 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14380 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b  PELLFIX_COL_RANK
14390 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
143a0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
143b0 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e  , pCur->a[pCur->
143c0 69 52 6f 77 5d 2e 69 52 61 6e 6b 29 3b 0a 20 20  iRow].iRank);.  
143d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
143e0 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
143f0 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e 43 45 3a  IX_COL_DISTANCE:
14400 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
14410 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c  _result_int(ctx,
14420 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69   pCur->a[pCur->i
14430 52 6f 77 5d 2e 69 44 69 73 74 61 6e 63 65 29 3b  Row].iDistance);
14440 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14450 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45    }.    case SPE
14460 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44  LLFIX_COL_LANGID
14470 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
14480 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
14490 2c 20 70 43 75 72 2d 3e 69 4c 61 6e 67 29 3b 0a  , pCur->iLang);.
144a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
144b0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c   }.    case SPEL
144c0 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 3a 20  LFIX_COL_SCORE: 
144d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
144e0 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20  result_int(ctx, 
144f0 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52  pCur->a[pCur->iR
14500 6f 77 5d 2e 69 53 63 6f 72 65 29 3b 0a 20 20 20  ow].iScore);.   
14510 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14520 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49      case SPELLFI
14530 58 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45 4e 3a 20  X_COL_MATCHLEN: 
14540 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61 74  {.      int iMat
14550 63 68 6c 65 6e 20 3d 20 70 43 75 72 2d 3e 61 5b  chlen = pCur->a[
14560 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 4d 61 74  pCur->iRow].iMat
14570 63 68 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  chlen;.      if(
14580 20 69 4d 61 74 63 68 6c 65 6e 3c 30 20 29 7b 0a   iMatchlen<0 ){.
14590 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61 74          int nPat
145a0 74 65 72 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  tern = (int)strl
145b0 65 6e 28 70 43 75 72 2d 3e 7a 50 61 74 74 65 72  en(pCur->zPatter
145c0 6e 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  n);.        char
145d0 20 2a 7a 57 6f 72 64 20 3d 20 70 43 75 72 2d 3e   *zWord = pCur->
145e0 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a 57  a[pCur->iRow].zW
145f0 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
14600 20 6e 57 6f 72 64 20 3d 20 28 69 6e 74 29 73 74   nWord = (int)st
14610 72 6c 65 6e 28 7a 57 6f 72 64 29 3b 0a 0a 20 20  rlen(zWord);..  
14620 20 20 20 20 20 20 69 66 28 20 6e 50 61 74 74 65        if( nPatte
14630 72 6e 3e 30 20 26 26 20 70 43 75 72 2d 3e 7a 50  rn>0 && pCur->zP
14640 61 74 74 65 72 6e 5b 6e 50 61 74 74 65 72 6e 2d  attern[nPattern-
14650 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20  1]=='*' ){.     
14660 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 6e       char *zTran
14670 73 6c 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  slit;.          
14680 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
14690 20 20 20 7a 54 72 61 6e 73 6c 69 74 20 3d 20 28     zTranslit = (
146a0 63 68 61 72 20 2a 29 74 72 61 6e 73 6c 69 74 65  char *)translite
146b0 72 61 74 65 28 28 75 6e 73 69 67 6e 65 64 20 63  rate((unsigned c
146c0 68 61 72 20 2a 29 7a 57 6f 72 64 2c 20 6e 57 6f  har *)zWord, nWo
146d0 72 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rd);.          i
146e0 66 28 20 21 7a 54 72 61 6e 73 6c 69 74 20 29 20  f( !zTranslit ) 
146f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14700 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  MEM;.          r
14710 65 73 20 3d 20 65 64 69 74 64 69 73 74 31 28 70  es = editdist1(p
14720 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 2c 20 7a  Cur->zPattern, z
14730 54 72 61 6e 73 6c 69 74 2c 20 26 69 4d 61 74 63  Translit, &iMatc
14740 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  hlen);.         
14750 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
14760 72 61 6e 73 6c 69 74 29 3b 0a 20 20 20 20 20 20  ranslit);.      
14770 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20      if( res<0 ) 
14780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14790 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  MEM;.          i
147a0 4d 61 74 63 68 6c 65 6e 20 3d 20 74 72 61 6e 73  Matchlen = trans
147b0 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65 6e 28 7a  len_to_charlen(z
147c0 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20 69 4d 61  Word, nWord, iMa
147d0 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  tchlen);.       
147e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
147f0 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 75 74    iMatchlen = ut
14800 66 38 43 68 61 72 6c 65 6e 28 7a 57 6f 72 64 2c  f8Charlen(zWord,
14810 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 20   nWord);.       
14820 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
14830 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14840 5f 69 6e 74 28 63 74 78 2c 20 69 4d 61 74 63 68  _int(ctx, iMatch
14850 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  len);.      brea
14860 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14870 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50  e SPELLFIX_COL_P
14880 48 4f 4e 45 48 41 53 48 3a 20 7b 0a 20 20 20 20  HONEHASH: {.    
14890 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
148a0 5f 74 65 78 74 28 63 74 78 2c 20 70 43 75 72 2d  _text(ctx, pCur-
148b0 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a  >a[pCur->iRow].z
148c0 48 61 73 68 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Hash, -1, SQLITE
148d0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
148e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
148f0 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43   case SPELLFIX_C
14900 4f 4c 5f 54 4f 50 3a 20 7b 0a 20 20 20 20 20 20  OL_TOP: {.      
14910 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
14920 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 69 54  nt(ctx, pCur->iT
14930 6f 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  op);.      break
14940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14950 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43   SPELLFIX_COL_SC
14960 4f 50 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  OPE: {.      sql
14970 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
14980 63 74 78 2c 20 70 43 75 72 2d 3e 69 53 63 6f 70  ctx, pCur->iScop
14990 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
149a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
149b0 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52 43  SPELLFIX_COL_SRC
149c0 48 43 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  HCNT: {.      sq
149d0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
149e0 28 63 74 78 2c 20 70 43 75 72 2d 3e 6e 53 65 61  (ctx, pCur->nSea
149f0 72 63 68 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rch);.      brea
14a00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
14a10 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
14a20 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
14a30 6c 28 63 74 78 29 3b 0a 20 20 20 20 20 20 62 72  l(ctx);.      br
14a40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
14a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14a60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
14a70 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rowid..*/.static
14a80 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 6f   int spellfix1Ro
14a90 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  wid(sqlite3_vtab
14aa0 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71  _cursor *cur, sq
14ab0 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
14ac0 69 64 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  id){.  spellfix1
14ad0 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
14ae0 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
14af0 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70 43  r*)cur;.  if( pC
14b00 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b  ur->pFullScan ){
14b10 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 73  .    *pRowid = s
14b20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
14b30 74 36 34 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53  t64(pCur->pFullS
14b40 63 61 6e 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65  can, 4);.  }else
14b50 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20  {.    *pRowid = 
14b60 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52  pCur->a[pCur->iR
14b70 6f 77 5d 2e 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  ow].iRowid;.  }.
14b80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14b90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
14ba0 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f   xUpdate() metho
14bb0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14bc0 20 73 70 65 6c 6c 66 69 78 31 55 70 64 61 74 65   spellfix1Update
14bd0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
14be0 20 2a 70 56 54 61 62 2c 0a 20 20 69 6e 74 20 61   *pVTab,.  int a
14bf0 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
14c00 61 6c 75 65 20 2a 2a 61 72 67 76 2c 0a 20 20 73  alue **argv,.  s
14c10 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
14c20 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  wid.){.  int rc 
14c30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
14c40 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 6f 77  qlite3_int64 row
14c50 69 64 2c 20 6e 65 77 52 6f 77 69 64 3b 0a 20 20  id, newRowid;.  
14c60 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a  spellfix1_vtab *
14c70 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76  p = (spellfix1_v
14c80 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 73 71  tab*)pVTab;.  sq
14c90 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
14ca0 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  b;..  if( argc==
14cb0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 64 65  1 ){.    /* A de
14cc0 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f  lete operation o
14cd0 6e 20 74 68 65 20 72 6f 77 69 64 20 67 69 76 65  n the rowid give
14ce0 6e 20 62 79 20 61 72 67 76 5b 30 5d 20 2a 2f 0a  n by argv[0] */.
14cf0 20 20 20 20 72 6f 77 69 64 20 3d 20 2a 70 52 6f      rowid = *pRo
14d00 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
14d10 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30  lue_int64(argv[0
14d20 5d 29 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78  ]);.    spellfix
14d30 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  1DbExec(&rc, db,
14d40 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22   "DELETE FROM \"
14d50 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c  %w\".\"%w_vocab\
14d60 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  " ".            
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14d80 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 2c   WHERE id=%lld",
14d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14da0 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70     p->zDbName, p
14db0 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 72 6f  ->zTableName, ro
14dc0 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  wid);.  }else{. 
14dd0 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
14de0 64 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20  d char *zWord = 
14df0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14e00 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  xt(argv[SPELLFIX
14e10 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a 20  _COL_WORD+2]);. 
14e20 20 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 73     int nWord = s
14e30 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
14e40 65 73 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  es(argv[SPELLFIX
14e50 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a 20  _COL_WORD+2]);. 
14e60 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 73     int iLang = s
14e70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
14e80 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43  (argv[SPELLFIX_C
14e90 4f 4c 5f 4c 41 4e 47 49 44 2b 32 5d 29 3b 0a 20  OL_LANGID+2]);. 
14ea0 20 20 20 69 6e 74 20 69 52 61 6e 6b 20 3d 20 73     int iRank = s
14eb0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
14ec0 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43  (argv[SPELLFIX_C
14ed0 4f 4c 5f 52 41 4e 4b 2b 32 5d 29 3b 0a 20 20 20  OL_RANK+2]);.   
14ee0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
14ef0 63 68 61 72 20 2a 7a 53 6f 75 6e 64 73 6c 69 6b  char *zSoundslik
14f00 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  e =.           s
14f10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14f20 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  t(argv[SPELLFIX_
14f30 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b 32  COL_SOUNDSLIKE+2
14f40 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 53 6f 75  ]);.    int nSou
14f50 6e 64 73 6c 69 6b 65 20 3d 20 73 71 6c 69 74 65  ndslike = sqlite
14f60 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
14f70 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  gv[SPELLFIX_COL_
14f80 53 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d 29 3b 0a  SOUNDSLIKE+2]);.
14f90 20 20 20 20 63 68 61 72 20 2a 7a 4b 31 2c 20 2a      char *zK1, *
14fa0 7a 4b 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  zK2;.    int i;.
14fb0 20 20 20 20 63 68 61 72 20 63 3b 0a 0a 20 20 20      char c;..   
14fc0 20 69 66 28 20 7a 57 6f 72 64 3d 3d 30 20 29 7b   if( zWord==0 ){
14fd0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  .      /* Insert
14fe0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
14ff0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 6c  INSERT INTO tabl
15000 65 28 63 6f 6d 6d 61 6e 64 29 20 56 41 4c 55 45  e(command) VALUE
15010 53 28 27 78 79 7a 7a 79 27 29 3b 0a 20 20 20 20  S('xyzzy');.    
15020 20 20 2a 2a 20 63 61 75 73 65 20 7a 57 6f 72 64    ** cause zWord
15030 20 74 6f 20 62 65 20 4e 55 4c 4c 2c 20 73 6f 20   to be NULL, so 
15040 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 22  we look at the "
15050 63 6f 6d 6d 61 6e 64 22 20 63 6f 6c 75 6d 6e 20  command" column 
15060 74 6f 20 73 65 65 0a 20 20 20 20 20 20 2a 2a 20  to see.      ** 
15070 77 68 61 74 20 73 70 65 63 69 61 6c 20 61 63 74  what special act
15080 69 6f 6e 73 20 74 6f 20 74 61 6b 65 20 2a 2f 0a  ions to take */.
15090 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
150a0 20 2a 7a 43 6d 64 20 3d 20 0a 20 20 20 20 20 20   *zCmd = .      
150b0 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29     (const char*)
150c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
150d0 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  xt(argv[SPELLFIX
150e0 5f 43 4f 4c 5f 43 4f 4d 4d 41 4e 44 2b 32 5d 29  _COL_COMMAND+2])
150f0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6d 64  ;.      if( zCmd
15100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
15110 56 54 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  VTab->zErrMsg = 
15120 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15130 22 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  "NOT NULL constr
15140 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 25 73 2e  aint failed: %s.
15150 77 6f 72 64 22 2c 0a 20 20 20 20 20 20 20 20 20  word",.         
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  p->zTableName);.
15190 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
151a0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
151b0 5f 4e 4f 54 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  _NOTNULL;.      
151c0 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  }.      if( strc
151d0 6d 70 28 7a 43 6d 64 2c 22 72 65 73 65 74 22 29  mp(zCmd,"reset")
151e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
151f0 2a 20 52 65 73 65 74 20 74 68 65 20 20 65 64 69  * Reset the  edi
15200 74 20 63 6f 73 74 20 74 61 62 6c 65 20 28 69 66  t cost table (if
15210 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 2e 20   there is one). 
15220 2a 2f 0a 20 20 20 20 20 20 20 20 65 64 69 74 44  */.        editD
15230 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74 65  ist3ConfigDelete
15240 28 70 2d 3e 70 43 6f 6e 66 69 67 33 29 3b 0a 20  (p->pConfig3);. 
15250 20 20 20 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69         p->pConfi
15260 67 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  g3 = 0;.        
15270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15290 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64  if( strncmp(zCmd
152a0 2c 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62 6c  ,"edit_cost_tabl
152b0 65 3d 22 2c 31 36 29 3d 3d 30 20 29 7b 0a 20 20  e=",16)==0 ){.  
152c0 20 20 20 20 20 20 65 64 69 74 44 69 73 74 33 43        editDist3C
152d0 6f 6e 66 69 67 44 65 6c 65 74 65 28 70 2d 3e 70  onfigDelete(p->p
152e0 43 6f 6e 66 69 67 33 29 3b 0a 20 20 20 20 20 20  Config3);.      
152f0 20 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d 20    p->pConfig3 = 
15300 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
15310 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74  e3_free(p->zCost
15320 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  Table);.        
15330 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d 20  p->zCostTable = 
15340 73 70 65 6c 6c 66 69 78 31 44 65 71 75 6f 74 65  spellfix1Dequote
15350 28 7a 43 6d 64 2b 31 36 29 3b 0a 20 20 20 20 20  (zCmd+16);.     
15360 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 73 74 54     if( p->zCostT
15370 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  able==0 ) return
15380 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15390 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 43         if( p->zC
153a0 6f 73 74 54 61 62 6c 65 5b 30 5d 3d 3d 30 20 7c  ostTable[0]==0 |
153b0 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
153c0 70 28 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 2c  p(p->zCostTable,
153d0 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  "null")==0 ){.  
153e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
153f0 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54 61 62  free(p->zCostTab
15400 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  le);.          p
15410 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d 20 30  ->zCostTable = 0
15420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15430 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15440 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
15450 20 20 20 20 70 56 54 61 62 2d 3e 7a 45 72 72 4d      pVTab->zErrM
15460 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
15470 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 76 61  intf("unknown va
15480 6c 75 65 20 66 6f 72 20 25 73 2e 63 6f 6d 6d 61  lue for %s.comma
15490 6e 64 3a 20 5c 22 25 77 5c 22 22 2c 0a 20 20 20  nd: \"%w\"",.   
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d      p->zTableNam
154d0 65 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20  e, zCmd);.      
154e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
154f0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
15500 66 28 20 69 52 61 6e 6b 3c 31 20 29 20 69 52 61  f( iRank<1 ) iRa
15510 6e 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  nk = 1;.    if( 
15520 7a 53 6f 75 6e 64 73 6c 69 6b 65 20 29 7b 0a 20  zSoundslike ){. 
15530 20 20 20 20 20 7a 4b 31 20 3d 20 28 63 68 61 72       zK1 = (char
15540 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28  *)transliterate(
15550 7a 53 6f 75 6e 64 73 6c 69 6b 65 2c 20 6e 53 6f  zSoundslike, nSo
15560 75 6e 64 73 6c 69 6b 65 29 3b 0a 20 20 20 20 7d  undslike);.    }
15570 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 31 20  else{.      zK1 
15580 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c 69  = (char*)transli
15590 74 65 72 61 74 65 28 7a 57 6f 72 64 2c 20 6e 57  terate(zWord, nW
155a0 6f 72 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ord);.    }.    
155b0 69 66 28 20 7a 4b 31 3d 3d 30 20 29 20 72 65 74  if( zK1==0 ) ret
155c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
155d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28  ;.    for(i=0; (
155e0 63 20 3d 20 7a 4b 31 5b 69 5d 29 21 3d 30 3b 20  c = zK1[i])!=0; 
155f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 69 66 28  i++){.       if(
15600 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 5a   c>='A' && c<='Z
15610 27 20 29 20 7a 4b 31 5b 69 5d 20 2b 3d 20 27 61  ' ) zK1[i] += 'a
15620 27 20 2d 20 27 41 27 3b 0a 20 20 20 20 7d 0a 20  ' - 'A';.    }. 
15630 20 20 20 7a 4b 32 20 3d 20 28 63 68 61 72 2a 29     zK2 = (char*)
15640 70 68 6f 6e 65 74 69 63 48 61 73 68 28 28 63 6f  phoneticHash((co
15650 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
15660 72 2a 29 7a 4b 31 2c 20 69 29 3b 0a 20 20 20 20  r*)zK1, i);.    
15670 69 66 28 20 7a 4b 32 3d 3d 30 20 29 7b 0a 20 20  if( zK2==0 ){.  
15680 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15690 28 7a 4b 31 29 3b 0a 20 20 20 20 20 20 72 65 74  (zK1);.      ret
156a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
156b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
156c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
156d0 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c  pe(argv[0])==SQL
156e0 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
156f0 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65    spellfix1DbExe
15700 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20  c(&rc, db,.     
15710 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
15720 49 4e 54 4f 20 5c 22 25 77 5c 22 2e 5c 22 25 77  INTO \"%w\".\"%w
15730 5f 76 6f 63 61 62 5c 22 28 72 61 6e 6b 2c 6c 61  _vocab\"(rank,la
15740 6e 67 69 64 2c 77 6f 72 64 2c 6b 31 2c 6b 32 29  ngid,word,k1,k2)
15750 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
15760 22 56 41 4c 55 45 53 28 25 64 2c 25 64 2c 25 51  "VALUES(%d,%d,%Q
15770 2c 25 51 2c 25 51 29 22 2c 0a 20 20 20 20 20 20  ,%Q,%Q)",.      
15780 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d         p->zDbNam
15790 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65  e, p->zTableName
157a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
157b0 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20 7a 57 6f  Rank, iLang, zWo
157c0 72 64 2c 20 7a 4b 31 2c 20 7a 4b 32 0a 20 20 20  rd, zK1, zK2.   
157d0 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 6f     );.      *pRo
157e0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wid = sqlite3_la
157f0 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
15800 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  db);.    }else{.
15810 20 20 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71        rowid = sq
15820 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
15830 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  4(argv[0]);.    
15840 20 20 6e 65 77 52 6f 77 69 64 20 3d 20 2a 70 52    newRowid = *pR
15850 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
15860 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
15870 31 5d 29 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c  1]);.      spell
15880 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20  fix1DbExec(&rc, 
15890 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
158a0 20 22 55 50 44 41 54 45 20 5c 22 25 77 5c 22 2e   "UPDATE \"%w\".
158b0 5c 22 25 77 5f 76 6f 63 61 62 5c 22 20 53 45 54  \"%w_vocab\" SET
158c0 20 69 64 3d 25 6c 6c 64 2c 20 72 61 6e 6b 3d 25   id=%lld, rank=%
158d0 64 2c 20 6c 61 6e 67 69 64 3d 25 64 2c 22 0a 20  d, langid=%d,". 
158e0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77 6f              " wo
158f0 72 64 3d 25 51 2c 20 6b 31 3d 25 51 2c 20 6b 32  rd=%Q, k1=%Q, k2
15900 3d 25 51 20 57 48 45 52 45 20 69 64 3d 25 6c 6c  =%Q WHERE id=%ll
15910 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
15920 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e   p->zDbName, p->
15930 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 6e 65 77 52  zTableName, newR
15940 6f 77 69 64 2c 20 69 52 61 6e 6b 2c 20 69 4c 61  owid, iRank, iLa
15950 6e 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ng,.            
15960 20 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 4b 32   zWord, zK1, zK2
15970 2c 20 72 6f 77 69 64 0a 20 20 20 20 20 20 29 3b  , rowid.      );
15980 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15990 65 33 5f 66 72 65 65 28 7a 4b 31 29 3b 0a 20 20  e3_free(zK1);.  
159a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
159b0 4b 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  K2);.  }.  retur
159c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
159d0 65 6e 61 6d 65 20 74 68 65 20 73 70 65 6c 6c 66  ename the spellf
159e0 69 78 31 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ix1 table..*/.st
159f0 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69  atic int spellfi
15a00 78 31 52 65 6e 61 6d 65 28 73 71 6c 69 74 65 33  x1Rename(sqlite3
15a10 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 63 6f  _vtab *pVTab, co
15a20 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 29 7b  nst char *zNew){
15a30 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  .  spellfix1_vta
15a40 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69 78  b *p = (spellfix
15a50 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a 20  1_vtab*)pVTab;. 
15a60 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
15a70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
15a80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
15a90 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 20 3d 20 73  ar *zNewName = s
15aa0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
15ab0 25 73 22 2c 20 7a 4e 65 77 29 3b 0a 20 20 69 66  %s", zNew);.  if
15ac0 28 20 7a 4e 65 77 4e 61 6d 65 3d 3d 30 20 29 7b  ( zNewName==0 ){
15ad0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15ae0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
15af0 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28  spellfix1DbExec(
15b00 26 72 63 2c 20 64 62 2c 20 0a 20 20 20 20 20 22  &rc, db, .     "
15b10 41 4c 54 45 52 20 54 41 42 4c 45 20 5c 22 25 77  ALTER TABLE \"%w
15b20 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 20  \".\"%w_vocab\" 
15b30 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25 77 5f 76  RENAME TO \"%w_v
15b40 6f 63 61 62 5c 22 22 2c 0a 20 20 20 20 20 70 2d  ocab\"",.     p-
15b50 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61  >zDbName, p->zTa
15b60 62 6c 65 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d  bleName, zNewNam
15b70 65 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  e.  );.  if( rc=
15b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15b90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15ba0 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  ->zTableName);. 
15bb0 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65     p->zTableName
15bc0 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 7d   = zNewName;.  }
15bd0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15be0 33 5f 66 72 65 65 28 7a 4e 65 77 4e 61 6d 65 29  3_free(zNewName)
15bf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
15c00 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 76  c;.}.../*.** A v
15c10 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
15c20 75 6c 65 20 74 68 61 74 20 70 72 6f 76 69 64 65  ule that provide
15c30 73 20 66 75 7a 7a 79 20 73 65 61 72 63 68 2e 0a  s fuzzy search..
15c40 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
15c50 33 5f 6d 6f 64 75 6c 65 20 73 70 65 6c 6c 66 69  3_module spellfi
15c60 78 31 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30  x1Module = {.  0
15c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15c80 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
15c90 69 6f 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  ion */.  spellfi
15ca0 78 31 43 72 65 61 74 65 2c 20 20 20 20 20 20 20  x1Create,       
15cb0 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 68    /* xCreate - h
15cc0 61 6e 64 6c 65 20 43 52 45 41 54 45 20 56 49 52  andle CREATE VIR
15cd0 54 55 41 4c 20 54 41 42 4c 45 20 2a 2f 0a 20 20  TUAL TABLE */.  
15ce0 73 70 65 6c 6c 66 69 78 31 43 6f 6e 6e 65 63 74  spellfix1Connect
15cf0 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e  ,        /* xCon
15d00 6e 65 63 74 20 2d 20 72 65 63 6f 6e 6e 65 63 74  nect - reconnect
15d10 65 64 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  ed to an existin
15d20 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 70 65  g table */.  spe
15d30 6c 6c 66 69 78 31 42 65 73 74 49 6e 64 65 78 2c  llfix1BestIndex,
15d40 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e        /* xBestIn
15d50 64 65 78 20 2d 20 66 69 67 75 72 65 20 6f 75 74  dex - figure out
15d60 20 68 6f 77 20 74 6f 20 64 6f 20 61 20 71 75 65   how to do a que
15d70 72 79 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  ry */.  spellfix
15d80 31 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20  1Disconnect,    
15d90 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20   /* xDisconnect 
15da0 2d 20 63 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  - close a connec
15db0 74 69 6f 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  tion */.  spellf
15dc0 69 78 31 44 65 73 74 72 6f 79 2c 20 20 20 20 20  ix1Destroy,     
15dd0 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d     /* xDestroy -
15de0 20 68 61 6e 64 6c 65 20 44 52 4f 50 20 54 41 42   handle DROP TAB
15df0 4c 45 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  LE */.  spellfix
15e00 31 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  1Open,          
15e10 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e   /* xOpen - open
15e20 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73   a cursor */.  s
15e30 70 65 6c 6c 66 69 78 31 43 6c 6f 73 65 2c 20 20  pellfix1Close,  
15e40 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
15e50 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
15e60 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  or */.  spellfix
15e70 31 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20  1Filter,        
15e80 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
15e90 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
15ea0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 73 70  straints */.  sp
15eb0 65 6c 6c 66 69 78 31 4e 65 78 74 2c 20 20 20 20  ellfix1Next,    
15ec0 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20         /* xNext 
15ed0 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73  - advance a curs
15ee0 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  or */.  spellfix
15ef0 31 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  1Eof,           
15f00 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b   /* xEof - check
15f10 20 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e   for end of scan
15f20 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43   */.  spellfix1C
15f30 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 2f  olumn,         /
15f40 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
15f50 20 64 61 74 61 20 2a 2f 0a 20 20 73 70 65 6c 6c   data */.  spell
15f60 66 69 78 31 52 6f 77 69 64 2c 20 20 20 20 20 20  fix1Rowid,      
15f70 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20      /* xRowid - 
15f80 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 73  read data */.  s
15f90 70 65 6c 6c 66 69 78 31 55 70 64 61 74 65 2c 20  pellfix1Update, 
15fa0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
15fb0 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  te */.  0,      
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fd0 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20   /* xBegin */.  
15fe0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
15ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
16000 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20  /* xCommit */.  
16030 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
16040 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
16050 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20  lback */.  0,   
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16070 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68      /* xFindMeth
16080 6f 64 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  od */.  spellfix
16090 31 52 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  1Rename,        
160a0 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 7d   /* xRename */.}
160b0 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  ;../*.** Registe
160c0 72 20 74 68 65 20 76 61 72 69 6f 75 73 20 66 75  r the various fu
160d0 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  nctions and the 
160e0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
160f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
16100 6c 6c 66 69 78 31 52 65 67 69 73 74 65 72 28 73  llfix1Register(s
16110 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
16120 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16130 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 72 63  K;.  int i;.  rc
16140 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
16150 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
16160 73 70 65 6c 6c 66 69 78 31 5f 74 72 61 6e 73 6c  spellfix1_transl
16170 69 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  it", 1, SQLITE_U
16180 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 6c            transl
161b0 69 74 65 72 61 74 65 53 71 6c 46 75 6e 63 2c 20  iterateSqlFunc, 
161c0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  0, 0);.  if( rc=
161d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
161e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
161f0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
16200 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 65 64  b, "spellfix1_ed
16210 69 74 64 69 73 74 22 2c 20 32 2c 20 53 51 4c 49  itdist", 2, SQLI
16220 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
16250 69 74 64 69 73 74 53 71 6c 46 75 6e 63 2c 20 30  itdistSqlFunc, 0
16260 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
16270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16280 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16290 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
162a0 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31  n(db, "spellfix1
162b0 5f 70 68 6f 6e 65 68 61 73 68 22 2c 20 31 2c 20  _phonehash", 1, 
162c0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a  SQLITE_UTF8, 0,.
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 20 20 70 68 6f 6e 65 74 69 63 48 61 73 68 53 71    phoneticHashSq
16300 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
16310 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
16320 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
16330 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
16340 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73  _function(db, "s
16350 70 65 6c 6c 66 69 78 31 5f 73 63 72 69 70 74 63  pellfix1_scriptc
16360 6f 64 65 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ode", 1, SQLITE_
16370 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 20 20 20 20 20 20 73 63 72 69 70             scrip
163a0 74 43 6f 64 65 53 71 6c 46 75 6e 63 2c 20 30 2c  tCodeSqlFunc, 0,
163b0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
163c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
163d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
163e0 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64  _create_module(d
163f0 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 22 2c 20  b, "spellfix1", 
16400 26 73 70 65 6c 6c 66 69 78 31 4d 6f 64 75 6c 65  &spellfix1Module
16410 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
16420 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16430 0a 20 20 20 20 72 63 20 3d 20 65 64 69 74 44 69  .    rc = editDi
16440 73 74 33 49 6e 73 74 61 6c 6c 28 64 62 29 3b 0a  st3Install(db);.
16450 20 20 7d 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79    }..  /* Verify
16460 20 73 61 6e 69 74 79 20 6f 66 20 74 68 65 20 74   sanity of the t
16470 72 61 6e 73 6c 69 74 5b 5d 20 74 61 62 6c 65 20  ranslit[] table 
16480 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
16490 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 29  sizeof(translit)
164a0 2f 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74  /sizeof(translit
164b0 5b 30 5d 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  [0])-1; i++){.  
164c0 20 20 61 73 73 65 72 74 28 20 74 72 61 6e 73 6c    assert( transl
164d0 69 74 5b 69 5d 2e 63 46 72 6f 6d 3c 74 72 61 6e  it[i].cFrom<tran
164e0 73 6c 69 74 5b 69 2b 31 5d 2e 63 46 72 6f 6d 20  slit[i+1].cFrom 
164f0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
16500 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
16510 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
16520 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
16530 2a 0a 2a 2a 20 45 78 74 65 6e 73 69 6f 6e 20 6c  *.** Extension l
16540 6f 61 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  oad function..*/
16550 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f  .#ifdef _WIN32._
16560 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
16570 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20  ort).#endif.int 
16580 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78  sqlite3_spellfix
16590 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  _init(.  sqlite3
165a0 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a   *db, .  char **
165b0 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e  pzErrMsg, .  con
165c0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
165d0 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b  outines *pApi.){
165e0 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
165f0 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b  ION_INIT2(pApi);
16600 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16610 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16620 45 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c  E.  return spell
16630 66 69 78 31 52 65 67 69 73 74 65 72 28 64 62 29  fix1Register(db)
16640 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
16650 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a     n SQLITE_OK;.}.