/ Hex Artifact Content
Login

Artifact 5e1d547e9a2aed13897fa91bac924333f62fd2d9:


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 20 69 6e 63  short u16;.# inc
0350: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
0360: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0370: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
0380: 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 43  ALTABLE../*.** C
0390: 68 61 72 61 63 74 65 72 20 63 6c 61 73 73 65 73  haracter classes
03a0: 20 66 6f 72 20 41 53 43 49 49 20 63 68 61 72 61   for ASCII chara
03b0: 63 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  cters:.**.**   0
03c0: 20 20 20 27 27 20 20 20 20 20 20 20 20 53 69 6c     ''        Sil
03d0: 65 6e 74 20 6c 65 74 74 65 72 73 3a 20 20 20 48  ent letters:   H
03e0: 20 57 0a 2a 2a 20 20 20 31 20 20 20 27 41 27 20   W.**   1   'A' 
03f0: 20 20 20 20 20 20 41 6e 79 20 76 6f 77 65 6c 3a        Any vowel:
0400: 20 20 20 41 20 45 20 49 20 4f 20 55 20 28 59 29     A E I O U (Y)
0410: 0a 2a 2a 20 20 20 32 20 20 20 27 42 27 20 20 20  .**   2   'B'   
0420: 20 20 20 20 41 20 62 69 6c 61 62 65 61 6c 20 73      A bilabeal s
0430: 74 6f 70 20 6f 72 20 66 72 69 63 61 74 69 76 65  top or fricative
0440: 3a 20 20 42 20 46 20 50 20 56 20 57 0a 2a 2a 20  :  B F P V W.** 
0450: 20 20 33 20 20 20 27 43 27 20 20 20 20 20 20 20    3   'C'       
0460: 4f 74 68 65 72 20 66 72 69 63 61 74 69 76 65 73  Other fricatives
0470: 20 6f 72 20 62 61 63 6b 20 73 74 6f 70 73 3a 20   or back stops: 
0480: 20 43 20 47 20 4a 20 4b 20 51 20 53 20 58 20 5a   C G J K Q S X Z
0490: 0a 2a 2a 20 20 20 34 20 20 20 27 44 27 20 20 20  .**   4   'D'   
04a0: 20 20 20 20 41 6c 76 65 6f 6c 61 72 20 73 74 6f      Alveolar sto
04b0: 70 73 3a 20 20 44 20 54 0a 2a 2a 20 20 20 35 20  ps:  D T.**   5 
04c0: 20 20 27 48 27 20 20 20 20 20 20 20 4c 65 74 74    'H'       Lett
04d0: 65 72 20 48 20 61 74 20 74 68 65 20 62 65 67 69  er H at the begi
04e0: 6e 6e 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 0a  nning of a word.
04f0: 2a 2a 20 20 20 36 20 20 20 27 4c 27 20 20 20 20  **   6   'L'    
0500: 20 20 20 47 6c 69 64 65 3a 20 20 4c 0a 2a 2a 20     Glide:  L.** 
0510: 20 20 37 20 20 20 27 52 27 20 20 20 20 20 20 20    7   'R'       
0520: 53 65 6d 69 76 6f 77 65 6c 3a 20 20 52 0a 2a 2a  Semivowel:  R.**
0530: 20 20 20 38 20 20 20 27 4d 27 20 20 20 20 20 20     8   'M'      
0540: 20 4e 61 73 61 6c 73 3a 20 20 4d 20 4e 0a 2a 2a   Nasals:  M N.**
0550: 20 20 20 39 20 20 20 27 59 27 20 20 20 20 20 20     9   'Y'      
0560: 20 4c 65 74 74 65 72 20 59 20 61 74 20 74 68 65   Letter Y at the
0570: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
0580: 77 6f 72 64 2e 0a 2a 2a 20 20 20 31 30 20 20 27  word..**   10  '
0590: 39 27 20 20 20 20 20 20 20 44 69 67 69 74 73 3a  9'       Digits:
05a0: 20 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37   0 1 2 3 4 5 6 7
05b0: 20 38 20 39 0a 2a 2a 20 20 20 31 31 20 20 27 20   8 9.**   11  ' 
05c0: 27 20 20 20 20 20 20 20 57 68 69 74 65 20 73 70  '       White sp
05d0: 61 63 65 0a 2a 2a 20 20 20 31 32 20 20 27 3f 27  ace.**   12  '?'
05e0: 20 20 20 20 20 20 20 4f 74 68 65 72 2e 0a 2a 2f         Other..*/
05f0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0600: 53 49 4c 45 4e 54 20 20 20 20 20 20 20 20 20 30  SILENT         0
0610: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0620: 56 4f 57 45 4c 20 20 20 20 20 20 20 20 20 20 31  VOWEL          1
0630: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0640: 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  B              2
0650: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0660: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33  C              3
0670: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0680: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34  D              4
0690: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
06a0: 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35  H              5
06b0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
06c0: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36  L              6
06d0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
06e0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37  R              7
06f0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0700: 4d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38  M              8
0710: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0720: 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39  Y              9
0730: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0740: 44 49 47 49 54 20 20 20 20 20 20 20 20 20 31 30  DIGIT         10
0750: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0760: 53 50 41 43 45 20 20 20 20 20 20 20 20 20 31 31  SPACE         11
0770: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0780: 4f 54 48 45 52 20 20 20 20 20 20 20 20 20 31 32  OTHER         12
0790: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
07a0: 6f 77 69 6e 67 20 74 61 62 6c 65 20 67 69 76 65  owing table give
07b0: 73 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  s the character 
07c0: 63 6c 61 73 73 20 66 6f 72 20 6e 6f 6e 2d 69 6e  class for non-in
07d0: 69 74 69 61 6c 20 41 53 43 49 49 0a 2a 2a 20 63  itial ASCII.** c
07e0: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
07f0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
0800: 6e 65 64 20 63 68 61 72 20 6d 69 64 43 6c 61 73  ned char midClas
0810: 73 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 20 20 2a 2f  s[] = {. /*   */
0820: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0830: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
0840: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a  _OTHER,   /*   *
0850: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0860: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0870: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a  OTHER,    /*   *
0880: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0890: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
08a0: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f  _OTHER,. /*   */
08b0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
08c0: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
08d0: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a  _OTHER,   /*   *
08e0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
08f0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0900: 53 50 41 43 45 2c 20 20 20 20 2f 2a 20 20 20 2a  SPACE,    /*   *
0910: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0920: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
0930: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f  _OTHER,. /*   */
0940: 20 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 20 20   CCLASS_SPACE,  
0950: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
0960: 5f 53 50 41 43 45 2c 20 20 20 2f 2a 20 20 20 2a  _SPACE,   /*   *
0970: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0980: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0990: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a  OTHER,    /*   *
09a0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
09b0: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
09c0: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f  _OTHER,. /*   */
09d0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
09e0: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
09f0: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a  _OTHER,   /*   *
0a00: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0a10: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0a20: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a  OTHER,    /*   *
0a30: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0a40: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
0a50: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f  _OTHER,. /*   */
0a60: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0a70: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
0a80: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a  _OTHER,   /*   *
0a90: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0aa0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0ab0: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a  OTHER,    /*   *
0ac0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0ad0: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
0ae0: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f  _OTHER,. /*   */
0af0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0b00: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
0b10: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a  _OTHER,   /*   *
0b20: 2f 20 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 0a  / CCLASS_SPACE,.
0b30: 20 2f 2a 20 21 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ! */ CCLASS_
0b40: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 22 20 2a  OTHER,    /* " *
0b50: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0b60: 20 20 2f 2a 20 23 20 2a 2f 20 43 43 4c 41 53 53    /* # */ CCLASS
0b70: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 24 20 2a 2f  _OTHER,. /* $ */
0b80: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0b90: 20 20 2f 2a 20 25 20 2a 2f 20 43 43 4c 41 53 53    /* % */ CCLASS
0ba0: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 26 20 2a  _OTHER,   /* & *
0bb0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0bc0: 20 2f 2a 20 27 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ' */ CCLASS_
0bd0: 53 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 28 20 2a  SILENT,   /* ( *
0be0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0bf0: 20 20 2f 2a 20 29 20 2a 2f 20 43 43 4c 41 53 53    /* ) */ CCLASS
0c00: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 2a 20 2a 2f  _OTHER,. /* * */
0c10: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0c20: 20 20 2f 2a 20 2b 20 2a 2f 20 43 43 4c 41 53 53    /* + */ CCLASS
0c30: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 2c 20 2a  _OTHER,   /* , *
0c40: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0c50: 20 2f 2a 20 2d 20 2a 2f 20 43 43 4c 41 53 53 5f   /* - */ CCLASS_
0c60: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 2e 20 2a  OTHER,    /* . *
0c70: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0c80: 20 20 2f 2a 20 2f 20 2a 2f 20 43 43 4c 41 53 53    /* / */ CCLASS
0c90: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 30 20 2a 2f  _OTHER,. /* 0 */
0ca0: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20   CCLASS_DIGIT,  
0cb0: 20 20 2f 2a 20 31 20 2a 2f 20 43 43 4c 41 53 53    /* 1 */ CCLASS
0cc0: 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20 32 20 2a  _DIGIT,   /* 2 *
0cd0: 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a  / CCLASS_DIGIT,.
0ce0: 20 2f 2a 20 33 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 3 */ CCLASS_
0cf0: 44 49 47 49 54 2c 20 20 20 20 2f 2a 20 34 20 2a  DIGIT,    /* 4 *
0d00: 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20  / CCLASS_DIGIT, 
0d10: 20 20 2f 2a 20 35 20 2a 2f 20 43 43 4c 41 53 53    /* 5 */ CCLASS
0d20: 5f 44 49 47 49 54 2c 0a 20 2f 2a 20 36 20 2a 2f  _DIGIT,. /* 6 */
0d30: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20   CCLASS_DIGIT,  
0d40: 20 20 2f 2a 20 37 20 2a 2f 20 43 43 4c 41 53 53    /* 7 */ CCLASS
0d50: 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20 38 20 2a  _DIGIT,   /* 8 *
0d60: 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a  / CCLASS_DIGIT,.
0d70: 20 2f 2a 20 39 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 9 */ CCLASS_
0d80: 44 49 47 49 54 2c 20 20 20 20 2f 2a 20 3a 20 2a  DIGIT,    /* : *
0d90: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0da0: 20 20 2f 2a 20 3b 20 2a 2f 20 43 43 4c 41 53 53    /* ; */ CCLASS
0db0: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 3c 20 2a 2f  _OTHER,. /* < */
0dc0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0dd0: 20 20 2f 2a 20 3d 20 2a 2f 20 43 43 4c 41 53 53    /* = */ CCLASS
0de0: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 3e 20 2a  _OTHER,   /* > *
0df0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0e00: 20 2f 2a 20 3f 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ? */ CCLASS_
0e10: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 40 20 2a  OTHER,    /* @ *
0e20: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0e30: 20 20 2f 2a 20 41 20 2a 2f 20 43 43 4c 41 53 53    /* A */ CCLASS
0e40: 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 42 20 2a 2f  _VOWEL,. /* B */
0e50: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
0e60: 20 20 2f 2a 20 43 20 2a 2f 20 43 43 4c 41 53 53    /* C */ CCLASS
0e70: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 44 20 2a  _C,       /* D *
0e80: 2f 20 43 43 4c 41 53 53 5f 44 2c 0a 20 2f 2a 20  / CCLASS_D,. /* 
0e90: 45 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  E */ CCLASS_VOWE
0ea0: 4c 2c 20 20 20 20 2f 2a 20 46 20 2a 2f 20 43 43  L,    /* F */ CC
0eb0: 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a  LASS_B,       /*
0ec0: 20 47 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a   G */ CCLASS_C,.
0ed0: 20 2f 2a 20 48 20 2a 2f 20 43 43 4c 41 53 53 5f   /* H */ CCLASS_
0ee0: 53 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 49 20 2a  SILENT,   /* I *
0ef0: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
0f00: 20 20 2f 2a 20 4a 20 2a 2f 20 43 43 4c 41 53 53    /* J */ CCLASS
0f10: 5f 43 2c 0a 20 2f 2a 20 4b 20 2a 2f 20 43 43 4c  _C,. /* K */ CCL
0f20: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_C,        /*
0f30: 20 4c 20 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c 20   L */ CCLASS_L, 
0f40: 20 20 20 20 20 20 2f 2a 20 4d 20 2a 2f 20 43 43        /* M */ CC
0f50: 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 4e 20 2a 2f  LASS_M,. /* N */
0f60: 20 43 43 4c 41 53 53 5f 4d 2c 20 20 20 20 20 20   CCLASS_M,      
0f70: 20 20 2f 2a 20 4f 20 2a 2f 20 43 43 4c 41 53 53    /* O */ CCLASS
0f80: 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20 50 20 2a  _VOWEL,   /* P *
0f90: 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20  / CCLASS_B,. /* 
0fa0: 51 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  Q */ CCLASS_C,  
0fb0: 20 20 20 20 20 20 2f 2a 20 52 20 2a 2f 20 43 43        /* R */ CC
0fc0: 4c 41 53 53 5f 52 2c 20 20 20 20 20 20 20 2f 2a  LASS_R,       /*
0fd0: 20 53 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a   S */ CCLASS_C,.
0fe0: 20 2f 2a 20 54 20 2a 2f 20 43 43 4c 41 53 53 5f   /* T */ CCLASS_
0ff0: 44 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 20 2a  D,        /* U *
1000: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
1010: 20 20 2f 2a 20 56 20 2a 2f 20 43 43 4c 41 53 53    /* V */ CCLASS
1020: 5f 42 2c 0a 20 2f 2a 20 57 20 2a 2f 20 43 43 4c  _B,. /* W */ CCL
1030: 41 53 53 5f 42 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_B,        /*
1040: 20 58 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20   X */ CCLASS_C, 
1050: 20 20 20 20 20 20 2f 2a 20 59 20 2a 2f 20 43 43        /* Y */ CC
1060: 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20  LASS_VOWEL,. /* 
1070: 5a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  Z */ CCLASS_C,  
1080: 20 20 20 20 20 20 2f 2a 20 5b 20 2a 2f 20 43 43        /* [ */ CC
1090: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
10a0: 20 5c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   \ */ CCLASS_OTH
10b0: 45 52 2c 0a 20 2f 2a 20 5d 20 2a 2f 20 43 43 4c  ER,. /* ] */ CCL
10c0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
10d0: 20 5e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ^ */ CCLASS_OTH
10e0: 45 52 2c 20 20 20 2f 2a 20 5f 20 2a 2f 20 43 43  ER,   /* _ */ CC
10f0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1100: 60 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ` */ CCLASS_OTHE
1110: 52 2c 20 20 20 20 2f 2a 20 61 20 2a 2f 20 43 43  R,    /* a */ CC
1120: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a  LASS_VOWEL,   /*
1130: 20 62 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a   b */ CCLASS_B,.
1140: 20 2f 2a 20 63 20 2a 2f 20 43 43 4c 41 53 53 5f   /* c */ CCLASS_
1150: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 64 20 2a  C,        /* d *
1160: 2f 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20 20  / CCLASS_D,     
1170: 20 20 2f 2a 20 65 20 2a 2f 20 43 43 4c 41 53 53    /* e */ CCLASS
1180: 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 66 20 2a 2f  _VOWEL,. /* f */
1190: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
11a0: 20 20 2f 2a 20 67 20 2a 2f 20 43 43 4c 41 53 53    /* g */ CCLASS
11b0: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 68 20 2a  _C,       /* h *
11c0: 2f 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c  / CCLASS_SILENT,
11d0: 0a 20 2f 2a 20 69 20 2a 2f 20 43 43 4c 41 53 53  . /* i */ CCLASS
11e0: 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 6a 20  _VOWEL,    /* j 
11f0: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20  */ CCLASS_C,    
1200: 20 20 20 2f 2a 20 6b 20 2a 2f 20 43 43 4c 41 53     /* k */ CCLAS
1210: 53 5f 43 2c 0a 20 2f 2a 20 6c 20 2a 2f 20 43 43  S_C,. /* l */ CC
1220: 4c 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 20 2f  LASS_L,        /
1230: 2a 20 6d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c  * m */ CCLASS_M,
1240: 20 20 20 20 20 20 20 2f 2a 20 6e 20 2a 2f 20 43         /* n */ C
1250: 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 6f 20 2a  CLASS_M,. /* o *
1260: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
1270: 20 20 20 2f 2a 20 70 20 2a 2f 20 43 43 4c 41 53     /* p */ CCLAS
1280: 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 71 20  S_B,       /* q 
1290: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a  */ CCLASS_C,. /*
12a0: 20 72 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c 20   r */ CCLASS_R, 
12b0: 20 20 20 20 20 20 20 2f 2a 20 73 20 2a 2f 20 43         /* s */ C
12c0: 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f  CLASS_C,       /
12d0: 2a 20 74 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c  * t */ CCLASS_D,
12e0: 0a 20 2f 2a 20 75 20 2a 2f 20 43 43 4c 41 53 53  . /* u */ CCLASS
12f0: 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 76 20  _VOWEL,    /* v 
1300: 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20  */ CCLASS_B,    
1310: 20 20 20 2f 2a 20 77 20 2a 2f 20 43 43 4c 41 53     /* w */ CCLAS
1320: 53 5f 42 2c 0a 20 2f 2a 20 78 20 2a 2f 20 43 43  S_B,. /* x */ CC
1330: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f  LASS_C,        /
1340: 2a 20 79 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f  * y */ CCLASS_VO
1350: 57 45 4c 2c 20 20 20 2f 2a 20 7a 20 2a 2f 20 43  WEL,   /* z */ C
1360: 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 7b 20 2a  CLASS_C,. /* { *
1370: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
1380: 20 20 20 2f 2a 20 7c 20 2a 2f 20 43 43 4c 41 53     /* | */ CCLAS
1390: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 7d 20  S_OTHER,   /* } 
13a0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
13b0: 0a 20 2f 2a 20 7e 20 2a 2f 20 43 43 4c 41 53 53  . /* ~ */ CCLASS
13c0: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20  _OTHER,    /*   
13d0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
13e0: 20 20 20 0a 7d 3b 0a 2f 2a 20 0a 2a 2a 20 54 68     .};./* .** Th
13f0: 69 73 20 74 61 62 6c 65 73 20 67 69 76 65 73 20  is tables gives 
1400: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 63 6c  the character cl
1410: 61 73 73 20 66 6f 72 20 41 53 43 49 49 20 63 68  ass for ASCII ch
1420: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 66 6f  aracters that fo
1430: 72 6d 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  rm the.** initia
1440: 6c 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61  l character of a
1450: 20 77 6f 72 64 2e 20 20 54 68 65 20 6f 6e 6c 79   word.  The only
1460: 20 64 69 66 66 65 72 65 6e 63 65 20 66 72 6f 6d   difference from
1470: 20 6d 69 64 43 6c 61 73 73 20 69 73 20 77 69 74   midClass is wit
1480: 68 0a 2a 2a 20 74 68 65 20 6c 65 74 74 65 72 73  h.** the letters
1490: 20 48 2c 20 57 2c 20 61 6e 64 20 59 2e 0a 2a 2f   H, W, and Y..*/
14a0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
14b0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 69 74  signed char init
14c0: 43 6c 61 73 73 5b 5d 20 3d 20 7b 0a 20 2f 2a 20  Class[] = {. /* 
14d0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
14e0: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
14f0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1500: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
1510: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
1520: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1530: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
1540: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
1550: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1560: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1570: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
1580: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1590: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
15a0: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
15b0: 41 53 53 5f 53 50 41 43 45 2c 20 20 20 20 2f 2a  ASS_SPACE,    /*
15c0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
15d0: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
15e0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
15f0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43    */ CCLASS_SPAC
1600: 45 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  E,    /*   */ CC
1610: 4c 41 53 53 5f 53 50 41 43 45 2c 20 20 20 2f 2a  LASS_SPACE,   /*
1620: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
1630: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
1640: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1650: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
1660: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
1670: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1680: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1690: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
16a0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
16b0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
16c0: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
16d0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
16e0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
16f0: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
1700: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1710: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1720: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
1730: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1740: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
1750: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
1760: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1770: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48     */ CCLASS_OTH
1780: 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  ER,   /*   */ CC
1790: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
17a0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
17b0: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
17c0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
17d0: 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41     */ CCLASS_SPA
17e0: 43 45 2c 0a 20 2f 2a 20 21 20 2a 2f 20 43 43 4c  CE,. /* ! */ CCL
17f0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1800: 20 22 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   " */ CCLASS_OTH
1810: 45 52 2c 20 20 20 2f 2a 20 23 20 2a 2f 20 43 43  ER,   /* # */ CC
1820: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1830: 24 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  $ */ CCLASS_OTHE
1840: 52 2c 20 20 20 20 2f 2a 20 25 20 2a 2f 20 43 43  R,    /* % */ CC
1850: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1860: 20 26 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   & */ CCLASS_OTH
1870: 45 52 2c 0a 20 2f 2a 20 27 20 2a 2f 20 43 43 4c  ER,. /* ' */ CCL
1880: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1890: 20 28 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ( */ CCLASS_OTH
18a0: 45 52 2c 20 20 20 2f 2a 20 29 20 2a 2f 20 43 43  ER,   /* ) */ CC
18b0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
18c0: 2a 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  * */ CCLASS_OTHE
18d0: 52 2c 20 20 20 20 2f 2a 20 2b 20 2a 2f 20 43 43  R,    /* + */ CC
18e0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
18f0: 20 2c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   , */ CCLASS_OTH
1900: 45 52 2c 0a 20 2f 2a 20 2d 20 2a 2f 20 43 43 4c  ER,. /* - */ CCL
1910: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1920: 20 2e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   . */ CCLASS_OTH
1930: 45 52 2c 20 20 20 2f 2a 20 2f 20 2a 2f 20 43 43  ER,   /* / */ CC
1940: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1950: 30 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  0 */ CCLASS_DIGI
1960: 54 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 20 43 43  T,    /* 1 */ CC
1970: 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a  LASS_DIGIT,   /*
1980: 20 32 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   2 */ CCLASS_DIG
1990: 49 54 2c 0a 20 2f 2a 20 33 20 2a 2f 20 43 43 4c  IT,. /* 3 */ CCL
19a0: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a  ASS_DIGIT,    /*
19b0: 20 34 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   4 */ CCLASS_DIG
19c0: 49 54 2c 20 20 20 2f 2a 20 35 20 2a 2f 20 43 43  IT,   /* 5 */ CC
19d0: 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20  LASS_DIGIT,. /* 
19e0: 36 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  6 */ CCLASS_DIGI
19f0: 54 2c 20 20 20 20 2f 2a 20 37 20 2a 2f 20 43 43  T,    /* 7 */ CC
1a00: 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a  LASS_DIGIT,   /*
1a10: 20 38 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   8 */ CCLASS_DIG
1a20: 49 54 2c 0a 20 2f 2a 20 39 20 2a 2f 20 43 43 4c  IT,. /* 9 */ CCL
1a30: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a  ASS_DIGIT,    /*
1a40: 20 3a 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   : */ CCLASS_OTH
1a50: 45 52 2c 20 20 20 2f 2a 20 3b 20 2a 2f 20 43 43  ER,   /* ; */ CC
1a60: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1a70: 3c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  < */ CCLASS_OTHE
1a80: 52 2c 20 20 20 20 2f 2a 20 3d 20 2a 2f 20 43 43  R,    /* = */ CC
1a90: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1aa0: 20 3e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   > */ CCLASS_OTH
1ab0: 45 52 2c 0a 20 2f 2a 20 3f 20 2a 2f 20 43 43 4c  ER,. /* ? */ CCL
1ac0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1ad0: 20 40 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   @ */ CCLASS_OTH
1ae0: 45 52 2c 20 20 20 2f 2a 20 41 20 2a 2f 20 43 43  ER,   /* A */ CC
1af0: 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20  LASS_VOWEL,. /* 
1b00: 42 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20  B */ CCLASS_B,  
1b10: 20 20 20 20 20 20 2f 2a 20 43 20 2a 2f 20 43 43        /* C */ CC
1b20: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a  LASS_C,       /*
1b30: 20 44 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a   D */ CCLASS_D,.
1b40: 20 2f 2a 20 45 20 2a 2f 20 43 43 4c 41 53 53 5f   /* E */ CCLASS_
1b50: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 46 20 2a  VOWEL,    /* F *
1b60: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
1b70: 20 20 2f 2a 20 47 20 2a 2f 20 43 43 4c 41 53 53    /* G */ CCLASS
1b80: 5f 43 2c 0a 20 2f 2a 20 48 20 2a 2f 20 43 43 4c  _C,. /* H */ CCL
1b90: 41 53 53 5f 53 49 4c 45 4e 54 2c 20 20 20 2f 2a  ASS_SILENT,   /*
1ba0: 20 49 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   I */ CCLASS_VOW
1bb0: 45 4c 2c 20 20 20 2f 2a 20 4a 20 2a 2f 20 43 43  EL,   /* J */ CC
1bc0: 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 4b 20 2a 2f  LASS_C,. /* K */
1bd0: 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20   CCLASS_C,      
1be0: 20 20 2f 2a 20 4c 20 2a 2f 20 43 43 4c 41 53 53    /* L */ CCLASS
1bf0: 5f 4c 2c 20 20 20 20 20 20 20 2f 2a 20 4d 20 2a  _L,       /* M *
1c00: 2f 20 43 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20  / CCLASS_M,. /* 
1c10: 4e 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 20 20  N */ CCLASS_M,  
1c20: 20 20 20 20 20 20 2f 2a 20 4f 20 2a 2f 20 43 43        /* O */ CC
1c30: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a  LASS_VOWEL,   /*
1c40: 20 50 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a   P */ CCLASS_B,.
1c50: 20 2f 2a 20 51 20 2a 2f 20 43 43 4c 41 53 53 5f   /* Q */ CCLASS_
1c60: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 20 2a  C,        /* R *
1c70: 2f 20 43 43 4c 41 53 53 5f 52 2c 20 20 20 20 20  / CCLASS_R,     
1c80: 20 20 2f 2a 20 53 20 2a 2f 20 43 43 4c 41 53 53    /* S */ CCLASS
1c90: 5f 43 2c 0a 20 2f 2a 20 54 20 2a 2f 20 43 43 4c  _C,. /* T */ CCL
1ca0: 41 53 53 5f 44 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_D,        /*
1cb0: 20 55 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   U */ CCLASS_VOW
1cc0: 45 4c 2c 20 20 20 2f 2a 20 56 20 2a 2f 20 43 43  EL,   /* V */ CC
1cd0: 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20 57 20 2a 2f  LASS_B,. /* W */
1ce0: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
1cf0: 20 20 2f 2a 20 58 20 2a 2f 20 43 43 4c 41 53 53    /* X */ CCLASS
1d00: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 59 20 2a  _C,       /* Y *
1d10: 2f 20 43 43 4c 41 53 53 5f 59 2c 0a 20 2f 2a 20  / CCLASS_Y,. /* 
1d20: 5a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  Z */ CCLASS_C,  
1d30: 20 20 20 20 20 20 2f 2a 20 5b 20 2a 2f 20 43 43        /* [ */ CC
1d40: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1d50: 20 5c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   \ */ CCLASS_OTH
1d60: 45 52 2c 0a 20 2f 2a 20 5d 20 2a 2f 20 43 43 4c  ER,. /* ] */ CCL
1d70: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1d80: 20 5e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ^ */ CCLASS_OTH
1d90: 45 52 2c 20 20 20 2f 2a 20 5f 20 2a 2f 20 43 43  ER,   /* _ */ CC
1da0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1db0: 60 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ` */ CCLASS_OTHE
1dc0: 52 2c 20 20 20 20 2f 2a 20 61 20 2a 2f 20 43 43  R,    /* a */ CC
1dd0: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a  LASS_VOWEL,   /*
1de0: 20 62 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a   b */ CCLASS_B,.
1df0: 20 2f 2a 20 63 20 2a 2f 20 43 43 4c 41 53 53 5f   /* c */ CCLASS_
1e00: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 64 20 2a  C,        /* d *
1e10: 2f 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20 20  / CCLASS_D,     
1e20: 20 20 2f 2a 20 65 20 2a 2f 20 43 43 4c 41 53 53    /* e */ CCLASS
1e30: 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 66 20 2a 2f  _VOWEL,. /* f */
1e40: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
1e50: 20 20 2f 2a 20 67 20 2a 2f 20 43 43 4c 41 53 53    /* g */ CCLASS
1e60: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 68 20 2a  _C,       /* h *
1e70: 2f 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c  / CCLASS_SILENT,
1e80: 0a 20 2f 2a 20 69 20 2a 2f 20 43 43 4c 41 53 53  . /* i */ CCLASS
1e90: 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 6a 20  _VOWEL,    /* j 
1ea0: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20  */ CCLASS_C,    
1eb0: 20 20 20 2f 2a 20 6b 20 2a 2f 20 43 43 4c 41 53     /* k */ CCLAS
1ec0: 53 5f 43 2c 0a 20 2f 2a 20 6c 20 2a 2f 20 43 43  S_C,. /* l */ CC
1ed0: 4c 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 20 2f  LASS_L,        /
1ee0: 2a 20 6d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c  * m */ CCLASS_M,
1ef0: 20 20 20 20 20 20 20 2f 2a 20 6e 20 2a 2f 20 43         /* n */ C
1f00: 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 6f 20 2a  CLASS_M,. /* o *
1f10: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
1f20: 20 20 20 2f 2a 20 70 20 2a 2f 20 43 43 4c 41 53     /* p */ CCLAS
1f30: 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 71 20  S_B,       /* q 
1f40: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a  */ CCLASS_C,. /*
1f50: 20 72 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c 20   r */ CCLASS_R, 
1f60: 20 20 20 20 20 20 20 2f 2a 20 73 20 2a 2f 20 43         /* s */ C
1f70: 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f  CLASS_C,       /
1f80: 2a 20 74 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c  * t */ CCLASS_D,
1f90: 0a 20 2f 2a 20 75 20 2a 2f 20 43 43 4c 41 53 53  . /* u */ CCLASS
1fa0: 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 76 20  _VOWEL,    /* v 
1fb0: 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20  */ CCLASS_B,    
1fc0: 20 20 20 2f 2a 20 77 20 2a 2f 20 43 43 4c 41 53     /* w */ CCLAS
1fd0: 53 5f 42 2c 0a 20 2f 2a 20 78 20 2a 2f 20 43 43  S_B,. /* x */ CC
1fe0: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f  LASS_C,        /
1ff0: 2a 20 79 20 2a 2f 20 43 43 4c 41 53 53 5f 59 2c  * y */ CCLASS_Y,
2000: 20 20 20 20 20 20 20 2f 2a 20 7a 20 2a 2f 20 43         /* z */ C
2010: 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 7b 20 2a  CLASS_C,. /* { *
2020: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
2030: 20 20 20 2f 2a 20 7c 20 2a 2f 20 43 43 4c 41 53     /* | */ CCLAS
2040: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 7d 20  S_OTHER,   /* } 
2050: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
2060: 0a 20 2f 2a 20 7e 20 2a 2f 20 43 43 4c 41 53 53  . /* ~ */ CCLASS
2070: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20  _OTHER,    /*   
2080: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
2090: 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61     .};../*.** Ma
20a0: 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 63  pping from the c
20b0: 68 61 72 61 63 74 65 72 20 63 6c 61 73 73 20 6e  haracter class n
20c0: 75 6d 62 65 72 20 28 30 2d 31 33 29 20 74 6f 20  umber (0-13) to 
20d0: 61 20 73 79 6d 62 6f 6c 20 66 6f 72 20 65 61 63  a symbol for eac
20e0: 68 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 63  h.** character c
20f0: 6c 61 73 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  lass.  Note that
2100: 20 69 6e 69 74 43 6c 61 73 73 5b 5d 20 63 61 6e   initClass[] can
2110: 20 62 65 20 75 73 65 64 20 74 6f 20 6d 61 70 20   be used to map 
2120: 74 68 65 20 63 6c 61 73 73 0a 2a 2a 20 73 79 6d  the class.** sym
2130: 62 6f 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  bol back into th
2140: 65 20 63 6c 61 73 73 20 6e 75 6d 62 65 72 2e 0a  e class number..
2150: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2160: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
2170: 61 73 73 4e 61 6d 65 5b 5d 20 3d 20 22 2e 41 42  assName[] = ".AB
2180: 43 44 48 4c 52 4d 59 39 20 3f 22 3b 0a 0a 2f 2a  CDHLRMY9 ?";../*
2190: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 22  .** Generate a "
21a0: 70 68 6f 6e 65 74 69 63 20 68 61 73 68 22 20 66  phonetic hash" f
21b0: 72 6f 6d 20 61 20 73 74 72 69 6e 67 20 6f 66 20  rom a string of 
21c0: 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73  ASCII characters
21d0: 0a 2a 2a 20 69 6e 20 7a 49 6e 5b 30 2e 2e 6e 49  .** in zIn[0..nI
21e0: 6e 2d 31 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  n-1]..**.**   * 
21f0: 4d 61 70 20 63 68 61 72 61 63 74 65 72 73 20 62  Map characters b
2200: 79 20 63 68 61 72 61 63 74 65 72 20 63 6c 61 73  y character clas
2210: 73 20 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f  s as defined abo
2220: 76 65 2e 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20  ve..**   * Omit 
2230: 64 6f 75 62 6c 65 2d 6c 65 74 74 65 72 73 0a 2a  double-letters.*
2240: 2a 20 20 20 2a 20 4f 6d 69 74 20 76 6f 77 65 6c  *   * Omit vowel
2250: 73 20 62 65 73 69 64 65 20 52 20 61 6e 64 20 4c  s beside R and L
2260: 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 54 20 77  .**   * Omit T w
2270: 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  hen followed by 
2280: 43 48 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 57  CH.**   * Omit W
2290: 20 77 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62   when followed b
22a0: 79 20 52 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20  y R.**   * Omit 
22b0: 44 20 77 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20  D when followed 
22c0: 62 79 20 4a 20 6f 72 20 47 0a 2a 2a 20 20 20 2a  by J or G.**   *
22d0: 20 4f 6d 69 74 20 4b 20 69 6e 20 4b 4e 20 6f 72   Omit K in KN or
22e0: 20 47 20 69 6e 20 47 4e 20 61 74 20 74 68 65 20   G in GN at the 
22f0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 77  beginning of a w
2300: 6f 72 64 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ord.**.** Space 
2310: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
2320: 6c 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  lt is obtained f
2330: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
2340: 6f 63 28 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oc().**.** Retur
2350: 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
2360: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2370: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 75  s.  .*/.static u
2380: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 68  nsigned char *ph
2390: 6f 6e 65 74 69 63 48 61 73 68 28 63 6f 6e 73 74  oneticHash(const
23a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
23b0: 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20  zIn, int nIn){. 
23c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
23d0: 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zOut = sqlite3_m
23e0: 61 6c 6c 6f 63 28 20 6e 49 6e 20 2b 20 31 20 29  alloc( nIn + 1 )
23f0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
2400: 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 63 68 61   nOut = 0;.  cha
2410: 72 20 63 50 72 65 76 20 3d 20 30 78 37 37 3b 0a  r cPrev = 0x77;.
2420: 20 20 63 68 61 72 20 63 50 72 65 76 58 20 3d 20    char cPrevX = 
2430: 30 78 37 37 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  0x77;.  const un
2440: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 43 6c  signed char *aCl
2450: 61 73 73 20 3d 20 69 6e 69 74 43 6c 61 73 73 3b  ass = initClass;
2460: 0a 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20  ..  if( zOut==0 
2470: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
2480: 28 20 6e 49 6e 3e 32 20 29 7b 0a 20 20 20 20 73  ( nIn>2 ){.    s
2490: 77 69 74 63 68 28 20 7a 49 6e 5b 30 5d 20 29 7b  witch( zIn[0] ){
24a0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 67 27 3a  .      case 'g':
24b0: 20 0a 20 20 20 20 20 20 63 61 73 65 20 27 6b 27   .      case 'k'
24c0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
24d0: 7a 49 6e 5b 31 5d 3d 3d 27 6e 27 20 29 7b 20 7a  zIn[1]=='n' ){ z
24e0: 49 6e 2b 2b 3b 20 6e 49 6e 2d 2d 3b 20 7d 0a 20  In++; nIn--; }. 
24f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2510: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e    for(i=0; i<nIn
2520: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69  ; i++){.    unsi
2530: 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 7a 49  gned char c = zI
2540: 6e 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 2b  n[i];.    if( i+
2550: 31 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 69  1<nIn ){.      i
2560: 66 28 20 63 3d 3d 27 77 27 20 26 26 20 7a 49 6e  f( c=='w' && zIn
2570: 5b 69 2b 31 5d 3d 3d 27 72 27 20 29 20 63 6f 6e  [i+1]=='r' ) con
2580: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
2590: 20 63 3d 3d 27 64 27 20 26 26 20 28 7a 49 6e 5b   c=='d' && (zIn[
25a0: 69 2b 31 5d 3d 3d 27 6a 27 20 7c 7c 20 7a 49 6e  i+1]=='j' || zIn
25b0: 5b 69 2b 31 5d 3d 3d 27 67 27 29 20 29 20 63 6f  [i+1]=='g') ) co
25c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
25d0: 28 20 69 2b 32 3c 6e 49 6e 20 29 7b 0a 20 20 20  ( i+2<nIn ){.   
25e0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20       if( c=='t' 
25f0: 26 26 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 63 27  && zIn[i+1]=='c'
2600: 20 26 26 20 7a 49 6e 5b 69 2b 32 5d 3d 3d 27 68   && zIn[i+2]=='h
2610: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
2620: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2630: 63 20 3d 20 61 43 6c 61 73 73 5b 63 26 30 78 37  c = aClass[c&0x7
2640: 66 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 43  f];.    if( c==C
2650: 43 4c 41 53 53 5f 53 50 41 43 45 20 29 20 63 6f  CLASS_SPACE ) co
2660: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2670: 63 3d 3d 43 43 4c 41 53 53 5f 4f 54 48 45 52 20  c==CCLASS_OTHER 
2680: 26 26 20 63 50 72 65 76 21 3d 43 43 4c 41 53 53  && cPrev!=CCLASS
2690: 5f 44 49 47 49 54 20 29 20 63 6f 6e 74 69 6e 75  _DIGIT ) continu
26a0: 65 3b 0a 20 20 20 20 61 43 6c 61 73 73 20 3d 20  e;.    aClass = 
26b0: 6d 69 64 43 6c 61 73 73 3b 0a 20 20 20 20 69 66  midClass;.    if
26c0: 28 20 63 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45  ( c==CCLASS_VOWE
26d0: 4c 20 26 26 20 28 63 50 72 65 76 58 3d 3d 43 43  L && (cPrevX==CC
26e0: 4c 41 53 53 5f 52 20 7c 7c 20 63 50 72 65 76 58  LASS_R || cPrevX
26f0: 3d 3d 43 43 4c 41 53 53 5f 4c 29 20 29 7b 0a 20  ==CCLASS_L) ){. 
2700: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
2710: 2f 2a 20 4e 6f 20 76 6f 77 65 6c 73 20 62 65 73  /* No vowels bes
2720: 69 64 65 20 4c 20 6f 72 20 52 20 2a 2f 20 0a 20  ide L or R */ . 
2730: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 63 3d     }.    if( (c=
2740: 3d 43 43 4c 41 53 53 5f 52 20 7c 7c 20 63 3d 3d  =CCLASS_R || c==
2750: 43 43 4c 41 53 53 5f 4c 29 20 26 26 20 63 50 72  CCLASS_L) && cPr
2760: 65 76 58 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45  evX==CCLASS_VOWE
2770: 4c 20 29 7b 0a 20 20 20 20 20 20 20 6e 4f 75 74  L ){.       nOut
2780: 2d 2d 3b 20 20 20 2f 2a 20 4e 6f 20 76 6f 77 65  --;   /* No vowe
2790: 6c 73 20 62 65 73 69 64 65 20 4c 20 6f 72 20 52  ls beside L or R
27a0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 50   */.    }.    cP
27b0: 72 65 76 20 3d 20 63 3b 0a 20 20 20 20 69 66 28  rev = c;.    if(
27c0: 20 63 3d 3d 43 43 4c 41 53 53 5f 53 49 4c 45 4e   c==CCLASS_SILEN
27d0: 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  T ) continue;.  
27e0: 20 20 63 50 72 65 76 58 20 3d 20 63 3b 0a 20 20    cPrevX = c;.  
27f0: 20 20 63 20 3d 20 63 6c 61 73 73 4e 61 6d 65 5b    c = className[
2800: 63 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  c];.    assert( 
2810: 6e 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nOut>=0 );.    i
2820: 66 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 63 21  f( nOut==0 || c!
2830: 3d 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 29 20  =zOut[nOut-1] ) 
2840: 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 63  zOut[nOut++] = c
2850: 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6e 4f 75  ;.  }.  zOut[nOu
2860: 74 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  t] = 0;.  return
2870: 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zOut;.}../*.** 
2880: 54 68 69 73 20 69 73 20 61 6e 20 53 51 4c 20 66  This is an SQL f
2890: 75 6e 63 74 69 6f 6e 20 77 72 61 70 70 65 72 20  unction wrapper 
28a0: 61 72 6f 75 6e 64 20 70 68 6f 6e 65 74 69 63 48  around phoneticH
28b0: 61 73 68 28 29 2e 20 20 53 65 65 0a 2a 2a 20 74  ash().  See.** t
28c0: 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  he description o
28d0: 66 20 70 68 6f 6e 65 74 69 63 48 61 73 68 28 29  f phoneticHash()
28e0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
28f0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
2900: 73 74 61 74 69 63 20 76 6f 69 64 20 70 68 6f 6e  static void phon
2910: 65 74 69 63 48 61 73 68 53 71 6c 46 75 6e 63 28  eticHashSqlFunc(
2920: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2930: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
2940: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
2950: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
2960: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
2970: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20  ned char *zIn;. 
2980: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2990: 7a 4f 75 74 3b 0a 0a 20 20 7a 49 6e 20 3d 20 73  zOut;..  zIn = s
29a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
29b0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
29c0: 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72  ( zIn==0 ) retur
29d0: 6e 3b 0a 20 20 7a 4f 75 74 20 3d 20 70 68 6f 6e  n;.  zOut = phon
29e0: 65 74 69 63 48 61 73 68 28 7a 49 6e 2c 20 73 71  eticHash(zIn, sq
29f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
2a00: 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 69  s(argv[0]));.  i
2a10: 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  f( zOut==0 ){.  
2a20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2a30: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e  _error_nomem(con
2a40: 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  text);.  }else{.
2a50: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2a60: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
2a70: 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20 2d 31   (char*)zOut, -1
2a80: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
2a90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2aa0: 74 75 72 6e 20 74 68 65 20 63 68 61 72 61 63 74  turn the charact
2ab0: 65 72 20 63 6c 61 73 73 20 6e 75 6d 62 65 72 20  er class number 
2ac0: 66 6f 72 20 61 20 63 68 61 72 61 63 74 65 72 20  for a character 
2ad0: 67 69 76 65 6e 20 69 74 73 0a 2a 2a 20 63 6f 6e  given its.** con
2ae0: 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  text..*/.static 
2af0: 63 68 61 72 20 63 68 61 72 61 63 74 65 72 43 6c  char characterCl
2b00: 61 73 73 28 63 68 61 72 20 63 50 72 65 76 2c 20  ass(char cPrev, 
2b10: 63 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75 72  char c){.  retur
2b20: 6e 20 63 50 72 65 76 3d 3d 30 20 3f 20 69 6e 69  n cPrev==0 ? ini
2b30: 74 43 6c 61 73 73 5b 63 26 30 78 37 66 5d 20 3a  tClass[c&0x7f] :
2b40: 20 6d 69 64 43 6c 61 73 73 5b 63 26 30 78 37 66   midClass[c&0x7f
2b50: 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ];.}../*.** Retu
2b60: 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 69  rn the cost of i
2b70: 6e 73 65 72 74 69 6e 67 20 6f 72 20 64 65 6c 65  nserting or dele
2b80: 74 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63  ting character c
2b90: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
2ba0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 61 63  following charac
2bb0: 74 65 72 20 63 50 72 65 76 2e 20 20 49 66 20 63  ter cPrev.  If c
2bc0: 50 72 65 76 3d 3d 30 2c 20 74 68 61 74 20 6d 65  Prev==0, that me
2bd0: 61 6e 73 20 63 20 69 73 20 74 68 65 20 66 69 72  ans c is the fir
2be0: 73 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20  st.** character 
2bf0: 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a  of the word..*/.
2c00: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72  static int inser
2c10: 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63 68  tOrDeleteCost(ch
2c20: 61 72 20 63 50 72 65 76 2c 20 63 68 61 72 20 63  ar cPrev, char c
2c30: 2c 20 63 68 61 72 20 63 4e 65 78 74 29 7b 0a 20  , char cNext){. 
2c40: 20 63 68 61 72 20 63 6c 61 73 73 43 20 3d 20 63   char classC = c
2c50: 68 61 72 61 63 74 65 72 43 6c 61 73 73 28 63 50  haracterClass(cP
2c60: 72 65 76 2c 20 63 29 3b 0a 20 20 63 68 61 72 20  rev, c);.  char 
2c70: 63 6c 61 73 73 43 70 72 65 76 3b 0a 0a 20 20 69  classCprev;..  i
2c80: 66 28 20 63 6c 61 73 73 43 3d 3d 43 43 4c 41 53  f( classC==CCLAS
2c90: 53 5f 53 49 4c 45 4e 54 20 29 7b 0a 20 20 20 20  S_SILENT ){.    
2ca0: 2f 2a 20 49 6e 73 65 72 74 20 6f 72 20 64 65 6c  /* Insert or del
2cb0: 65 74 65 20 22 73 69 6c 65 6e 74 22 20 63 68 61  ete "silent" cha
2cc0: 72 61 63 74 65 72 73 20 73 75 63 68 20 61 73 20  racters such as 
2cd0: 48 20 6f 72 20 57 20 2a 2f 0a 20 20 20 20 72 65  H or W */.    re
2ce0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
2cf0: 28 20 63 50 72 65 76 3d 3d 63 20 29 7b 0a 20 20  ( cPrev==c ){.  
2d00: 20 20 2f 2a 20 52 65 70 65 61 74 65 64 20 63 68    /* Repeated ch
2d10: 61 72 61 63 74 65 72 73 2c 20 6f 72 20 6d 69 73  aracters, or mis
2d20: 73 20 61 20 72 65 70 65 61 74 20 2a 2f 0a 20 20  s a repeat */.  
2d30: 20 20 72 65 74 75 72 6e 20 31 30 3b 0a 20 20 7d    return 10;.  }
2d40: 0a 20 20 69 66 28 20 63 6c 61 73 73 43 3d 3d 43  .  if( classC==C
2d50: 43 4c 41 53 53 5f 56 4f 57 45 4c 20 26 26 20 28  CLASS_VOWEL && (
2d60: 63 50 72 65 76 3d 3d 27 72 27 20 7c 7c 20 63 4e  cPrev=='r' || cN
2d70: 65 78 74 3d 3d 27 72 27 29 20 29 7b 0a 20 20 20  ext=='r') ){.   
2d80: 20 72 65 74 75 72 6e 20 32 30 3b 20 20 2f 2a 20   return 20;  /* 
2d90: 49 6e 73 65 72 74 20 61 20 76 6f 77 65 6c 20 62  Insert a vowel b
2da0: 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 27  efore or after '
2db0: 72 27 20 2a 2f 0a 20 20 7d 0a 20 20 63 6c 61 73  r' */.  }.  clas
2dc0: 73 43 70 72 65 76 20 3d 20 63 68 61 72 61 63 74  sCprev = charact
2dd0: 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c 20 63  erClass(cPrev, c
2de0: 50 72 65 76 29 3b 0a 20 20 69 66 28 20 63 6c 61  Prev);.  if( cla
2df0: 73 73 43 3d 3d 63 6c 61 73 73 43 70 72 65 76 20  ssC==classCprev 
2e00: 29 7b 0a 20 20 20 20 69 66 28 20 63 6c 61 73 73  ){.    if( class
2e10: 43 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c 20  C==CCLASS_VOWEL 
2e20: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  ){.      /* Remo
2e30: 76 65 20 6f 72 20 61 64 64 20 61 20 6e 65 77 20  ve or add a new 
2e40: 76 6f 77 65 6c 20 74 6f 20 61 20 76 6f 77 65 6c  vowel to a vowel
2e50: 20 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20 20 20   cluster */.    
2e60: 20 20 72 65 74 75 72 6e 20 31 35 3b 0a 20 20 20    return 15;.   
2e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2e80: 20 52 65 6d 6f 76 65 20 6f 72 20 61 64 64 20 61   Remove or add a
2e90: 20 63 6f 6e 73 6f 6e 61 6e 74 20 6e 6f 74 20 69   consonant not i
2ea0: 6e 20 74 68 65 20 73 61 6d 65 20 63 6c 61 73 73  n the same class
2eb0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
2ec0: 20 35 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   50;.    }.  }..
2ed0: 20 20 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 63    /* any other c
2ee0: 68 61 72 61 63 74 65 72 20 69 6e 73 65 72 74 69  haracter inserti
2ef0: 6f 6e 20 6f 72 20 64 65 6c 65 74 69 6f 6e 20 2a  on or deletion *
2f00: 2f 0a 20 20 72 65 74 75 72 6e 20 31 30 30 3b 0a  /.  return 100;.
2f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 76 69 64 65 20  }../*.** Divide 
2f20: 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 20 63 6f  the insertion co
2f30: 73 74 20 62 79 20 74 68 69 73 20 66 61 63 74 6f  st by this facto
2f40: 72 20 77 68 65 6e 20 61 70 70 65 6e 64 69 6e 67  r when appending
2f50: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
2f60: 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a 23  f the word..*/.#
2f70: 64 65 66 69 6e 65 20 46 49 4e 41 4c 5f 49 4e 53  define FINAL_INS
2f80: 5f 43 4f 53 54 5f 44 49 56 20 20 34 0a 0a 2f 2a  _COST_DIV  4../*
2f90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
2fa0: 6f 73 74 20 6f 66 20 73 75 62 73 74 69 74 75 74  ost of substitut
2fb0: 69 6e 67 20 63 54 6f 20 69 6e 20 70 6c 61 63 65  ing cTo in place
2fc0: 20 6f 66 20 63 46 72 6f 6d 20 61 73 73 75 6d 69   of cFrom assumi
2fd0: 6e 67 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f  ng.** the previo
2fe0: 75 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20  us character is 
2ff0: 63 50 72 65 76 2e 20 20 49 66 20 63 50 72 65 76  cPrev.  If cPrev
3000: 3d 3d 30 20 74 68 65 6e 20 63 54 6f 20 69 73 20  ==0 then cTo is 
3010: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 68 61  the first.** cha
3020: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 77 6f  racter of the wo
3030: 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
3040: 74 20 73 75 62 73 74 69 74 75 74 65 43 6f 73 74  t substituteCost
3050: 28 63 68 61 72 20 63 50 72 65 76 2c 20 63 68 61  (char cPrev, cha
3060: 72 20 63 46 72 6f 6d 2c 20 63 68 61 72 20 63 54  r cFrom, char cT
3070: 6f 29 7b 0a 20 20 63 68 61 72 20 63 6c 61 73 73  o){.  char class
3080: 46 72 6f 6d 2c 20 63 6c 61 73 73 54 6f 3b 0a 20  From, classTo;. 
3090: 20 69 66 28 20 63 46 72 6f 6d 3d 3d 63 54 6f 20   if( cFrom==cTo 
30a0: 29 7b 0a 20 20 20 20 2f 2a 20 45 78 61 63 74 20  ){.    /* Exact 
30b0: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 72 65 74  match */.    ret
30c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
30d0: 20 63 46 72 6f 6d 3d 3d 28 63 54 6f 5e 30 78 32   cFrom==(cTo^0x2
30e0: 30 29 20 26 26 20 28 28 63 54 6f 3e 3d 27 41 27  0) && ((cTo>='A'
30f0: 20 26 26 20 63 54 6f 3c 3d 27 5a 27 29 20 7c 7c   && cTo<='Z') ||
3100: 20 28 63 54 6f 3e 3d 27 61 27 20 26 26 20 63 54   (cTo>='a' && cT
3110: 6f 3c 3d 27 7a 27 29 29 20 29 7b 0a 20 20 20 20  o<='z')) ){.    
3120: 2f 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69  /* differ only i
3130: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 72 65  n case */.    re
3140: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6c  turn 0;.  }.  cl
3150: 61 73 73 46 72 6f 6d 20 3d 20 63 68 61 72 61 63  assFrom = charac
3160: 74 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c 20  terClass(cPrev, 
3170: 63 46 72 6f 6d 29 3b 0a 20 20 63 6c 61 73 73 54  cFrom);.  classT
3180: 6f 20 3d 20 63 68 61 72 61 63 74 65 72 43 6c 61  o = characterCla
3190: 73 73 28 63 50 72 65 76 2c 20 63 54 6f 29 3b 0a  ss(cPrev, cTo);.
31a0: 20 20 69 66 28 20 63 6c 61 73 73 46 72 6f 6d 3d    if( classFrom=
31b0: 3d 63 6c 61 73 73 54 6f 20 29 7b 0a 20 20 20 20  =classTo ){.    
31c0: 2f 2a 20 53 61 6d 65 20 63 68 61 72 61 63 74 65  /* Same characte
31d0: 72 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 72  r class */.    r
31e0: 65 74 75 72 6e 20 34 30 3b 0a 20 20 7d 0a 20 20  eturn 40;.  }.  
31f0: 69 66 28 20 63 6c 61 73 73 46 72 6f 6d 3e 3d 43  if( classFrom>=C
3200: 43 4c 41 53 53 5f 42 20 26 26 20 63 6c 61 73 73  CLASS_B && class
3210: 46 72 6f 6d 3c 3d 43 43 4c 41 53 53 5f 59 0a 20  From<=CCLASS_Y. 
3220: 20 20 20 20 20 26 26 20 63 6c 61 73 73 54 6f 3e       && classTo>
3230: 3d 43 43 4c 41 53 53 5f 42 20 26 26 20 63 6c 61  =CCLASS_B && cla
3240: 73 73 54 6f 3c 3d 43 43 4c 41 53 53 5f 59 20 29  ssTo<=CCLASS_Y )
3250: 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  {.    /* Convert
3260: 20 66 72 6f 6d 20 6f 6e 65 20 63 6f 6e 73 6f 6e   from one conson
3270: 61 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72 2c 20  ant to another, 
3280: 62 75 74 20 69 6e 20 61 20 64 69 66 66 65 72 65  but in a differe
3290: 6e 74 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20  nt class */.    
32a0: 72 65 74 75 72 6e 20 37 35 3b 0a 20 20 7d 0a 20  return 75;.  }. 
32b0: 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 73 75   /* Any other su
32c0: 62 73 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 72  bsitution */.  r
32d0: 65 74 75 72 6e 20 31 30 30 3b 0a 7d 0a 0a 2f 2a  eturn 100;.}../*
32e0: 0a 2a 2a 20 47 69 76 65 6e 20 74 77 6f 20 73 74  .** Given two st
32f0: 72 69 6e 67 73 20 7a 41 20 61 6e 64 20 7a 42 20  rings zA and zB 
3300: 77 68 69 63 68 20 61 72 65 20 70 75 72 65 20 41  which are pure A
3310: 53 43 49 49 2c 20 72 65 74 75 72 6e 20 74 68 65  SCII, return the
3320: 20 63 6f 73 74 0a 2a 2a 20 6f 66 20 74 72 61 6e   cost.** of tran
3330: 73 66 6f 72 6d 69 6e 67 20 7a 41 20 69 6e 74 6f  sforming zA into
3340: 20 7a 42 2e 20 20 49 66 20 7a 41 20 65 6e 64 73   zB.  If zA ends
3350: 20 77 69 74 68 20 27 2a 27 20 61 73 73 75 6d 65   with '*' assume
3360: 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 61   that it is.** a
3370: 20 70 72 65 66 69 78 20 6f 66 20 7a 42 20 61 6e   prefix of zB an
3380: 64 20 67 69 76 65 20 6f 6e 6c 79 20 6d 69 6e 69  d give only mini
3390: 6d 61 6c 20 70 65 6e 61 6c 74 79 20 66 6f 72 20  mal penalty for 
33a0: 65 78 74 72 61 20 63 68 61 72 61 63 74 65 72 73  extra characters
33b0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  .** on the end o
33c0: 66 20 7a 42 2e 0a 2a 2a 0a 2a 2a 20 53 6d 61 6c  f zB..**.** Smal
33d0: 6c 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 61 6e  ler numbers mean
33e0: 20 61 20 63 6c 6f 73 65 72 20 6d 61 74 63 68 2e   a closer match.
33f0: 0a 2a 2a 0a 2a 2a 20 4e 65 67 61 74 69 76 65 20  .**.** Negative 
3400: 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20  values indicate 
3410: 61 6e 20 65 72 72 6f 72 3a 0a 2a 2a 20 20 20 20  an error:.**    
3420: 2d 31 20 20 4f 6e 65 20 6f 66 20 74 68 65 20 69  -1  One of the i
3430: 6e 70 75 74 73 20 69 73 20 4e 55 4c 4c 0a 2a 2a  nputs is NULL.**
3440: 20 20 20 20 2d 32 20 20 4e 6f 6e 2d 41 53 43 49      -2  Non-ASCI
3450: 49 20 63 68 61 72 61 63 74 65 72 73 20 6f 6e 20  I characters on 
3460: 69 6e 70 75 74 0a 2a 2a 20 20 20 20 2d 33 20 20  input.**    -3  
3470: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
3480: 74 65 20 6d 65 6d 6f 72 79 20 0a 2a 2a 0a 2a 2a  te memory .**.**
3490: 20 49 66 20 70 6e 4d 61 74 63 68 20 69 73 20 6e   If pnMatch is n
34a0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70  ot NULL, then *p
34b0: 6e 4d 61 74 63 68 20 69 73 20 73 65 74 20 74 6f  nMatch is set to
34c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
34d0: 79 74 65 73 0a 2a 2a 20 6f 66 20 7a 42 20 74 68  ytes.** of zB th
34e0: 61 74 20 6d 61 74 63 68 65 64 20 74 68 65 20 70  at matched the p
34f0: 61 74 74 65 72 6e 20 69 6e 20 7a 41 2e 20 49 66  attern in zA. If
3500: 20 7a 41 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64   zA does not end
3510: 20 77 69 74 68 20 61 20 27 2a 27 2c 0a 2a 2a 20   with a '*',.** 
3520: 74 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65 20  then this value 
3530: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e 75  is always the nu
3540: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
3550: 20 7a 42 20 28 69 2e 65 2e 20 73 74 72 6c 65 6e   zB (i.e. strlen
3560: 28 7a 42 29 29 2e 0a 2a 2a 20 49 66 20 7a 41 20  (zB))..** If zA 
3570: 64 6f 65 73 20 65 6e 64 20 69 6e 20 61 20 27 2a  does end in a '*
3580: 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  ', then it is th
3590: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
35a0: 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 0a  s in the prefix.
35b0: 2a 2a 20 6f 66 20 7a 42 20 74 68 61 74 20 77 61  ** of zB that wa
35c0: 73 20 64 65 65 6d 65 64 20 74 6f 20 6d 61 74 63  s deemed to matc
35d0: 68 20 7a 41 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  h zA..*/.static 
35e0: 69 6e 74 20 65 64 69 74 64 69 73 74 31 28 63 6f  int editdist1(co
35f0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f  nst char *zA, co
3600: 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 69 6e  nst char *zB, in
3610: 74 20 2a 70 6e 4d 61 74 63 68 29 7b 0a 20 20 69  t *pnMatch){.  i
3620: 6e 74 20 6e 41 2c 20 6e 42 3b 20 20 20 20 20 20  nt nA, nB;      
3630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3640: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
3650: 20 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a   zA[] and zB[] *
3660: 2f 0a 20 20 69 6e 74 20 78 41 2c 20 78 42 3b 20  /.  int xA, xB; 
3670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
3680: 6f 70 20 63 6f 75 6e 74 65 72 73 20 66 6f 72 20  op counters for 
3690: 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a 2f  zA[] and zB[] */
36a0: 0a 20 20 63 68 61 72 20 63 41 2c 20 63 42 3b 20  .  char cA, cB; 
36b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
36c0: 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 20 6f  rent character o
36d0: 66 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20  f zA and zB */. 
36e0: 20 63 68 61 72 20 63 41 70 72 65 76 2c 20 63 42   char cAprev, cB
36f0: 70 72 65 76 3b 20 20 20 2f 2a 20 50 72 65 76 69  prev;   /* Previ
3700: 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 6f 66  ous character of
3710: 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20 20   zA and zB */.  
3720: 63 68 61 72 20 63 41 6e 65 78 74 2c 20 63 42 6e  char cAnext, cBn
3730: 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 63  ext;   /* Next c
3740: 68 61 72 61 63 74 65 72 20 69 6e 20 7a 41 20 61  haracter in zA a
3750: 6e 64 20 7a 42 20 2a 2f 0a 20 20 69 6e 74 20 64  nd zB */.  int d
3760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3770: 20 20 2f 2a 20 4e 6f 72 74 68 2d 77 65 73 74 20    /* North-west 
3780: 63 6f 73 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20  cost value */.  
3790: 69 6e 74 20 64 63 20 3d 20 30 3b 20 20 20 20 20  int dc = 0;     
37a0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 74 68 2d         /* North-
37b0: 77 65 73 74 20 63 68 61 72 61 63 74 65 72 20 76  west character v
37c0: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  alue */.  int re
37d0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
37e0: 20 2f 2a 20 46 69 6e 61 6c 20 72 65 73 75 6c 74   /* Final result
37f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 6d 3b 20 20 20   */.  int *m;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3810: 54 68 65 20 63 6f 73 74 20 6d 61 74 72 69 78 20  The cost matrix 
3820: 2a 2f 0a 20 20 63 68 61 72 20 2a 63 78 3b 20 20  */.  char *cx;  
3830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3840: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68 61  orresponding cha
3850: 72 61 63 74 65 72 20 76 61 6c 75 65 73 20 2a 2f  racter values */
3860: 0a 20 20 69 6e 74 20 2a 74 6f 46 72 65 65 20 3d  .  int *toFree =
3870: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c   0;       /* Mal
3880: 6c 6f 63 65 64 20 73 70 61 63 65 20 2a 2f 0a 20  loced space */. 
3890: 20 69 6e 74 20 6d 53 74 61 63 6b 5b 36 30 2b 31   int mStack[60+1
38a0: 35 5d 3b 20 20 20 20 20 2f 2a 20 53 74 61 63 6b  5];     /* Stack
38b0: 20 73 70 61 63 65 20 74 6f 20 75 73 65 20 69 66   space to use if
38c0: 20 6e 6f 74 20 74 6f 6f 20 6d 75 63 68 20 69 73   not too much is
38d0: 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 6e 74   needed */.  int
38e0: 20 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 0a 20 20   nMatch = 0;..  
38f0: 2f 2a 20 45 61 72 6c 79 20 6f 75 74 20 69 66 20  /* Early out if 
3900: 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20  either input is 
3910: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 7a 41  NULL */.  if( zA
3920: 3d 3d 30 20 7c 7c 20 7a 42 3d 3d 30 20 29 20 72  ==0 || zB==0 ) r
3930: 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 2f 2a 20  eturn -1;..  /* 
3940: 53 6b 69 70 20 61 6e 79 20 63 6f 6d 6d 6f 6e 20  Skip any common 
3950: 70 72 65 66 69 78 20 2a 2f 0a 20 20 77 68 69 6c  prefix */.  whil
3960: 65 28 20 7a 41 5b 30 5d 20 26 26 20 7a 41 5b 30  e( zA[0] && zA[0
3970: 5d 3d 3d 7a 42 5b 30 5d 20 29 7b 20 64 63 20 3d  ]==zB[0] ){ dc =
3980: 20 7a 41 5b 30 5d 3b 20 7a 41 2b 2b 3b 20 7a 42   zA[0]; zA++; zB
3990: 2b 2b 3b 20 6e 4d 61 74 63 68 2b 2b 3b 20 7d 0a  ++; nMatch++; }.
39a0: 20 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29 20    if( pnMatch ) 
39b0: 2a 70 6e 4d 61 74 63 68 20 3d 20 6e 4d 61 74 63  *pnMatch = nMatc
39c0: 68 3b 0a 20 20 69 66 28 20 7a 41 5b 30 5d 3d 3d  h;.  if( zA[0]==
39d0: 30 20 26 26 20 7a 42 5b 30 5d 3d 3d 30 20 29 20  0 && zB[0]==0 ) 
39e0: 72 65 74 75 72 6e 20 30 3b 0a 0a 23 69 66 20 30  return 0;..#if 0
39f0: 0a 20 20 70 72 69 6e 74 66 28 22 41 3d 5c 22 25  .  printf("A=\"%
3a00: 73 5c 22 20 42 3d 5c 22 25 73 5c 22 20 64 63 3d  s\" B=\"%s\" dc=
3a10: 25 63 5c 6e 22 2c 20 7a 41 2c 20 7a 42 2c 20 64  %c\n", zA, zB, d
3a20: 63 3f 64 63 3a 27 20 27 29 3b 0a 23 65 6e 64 69  c?dc:' ');.#endi
3a30: 66 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 69  f..  /* Verify i
3a40: 6e 70 75 74 20 73 74 72 69 6e 67 73 20 61 6e 64  nput strings and
3a50: 20 6d 65 61 73 75 72 65 20 74 68 65 69 72 20 6c   measure their l
3a60: 65 6e 67 74 68 73 20 2a 2f 0a 20 20 66 6f 72 28  engths */.  for(
3a70: 6e 41 3d 30 3b 20 7a 41 5b 6e 41 5d 3b 20 6e 41  nA=0; zA[nA]; nA
3a80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 41 5b  ++){.    if( zA[
3a90: 6e 41 5d 26 30 78 38 30 20 29 20 72 65 74 75 72  nA]&0x80 ) retur
3aa0: 6e 20 2d 32 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  n -2;.  }.  for(
3ab0: 6e 42 3d 30 3b 20 7a 42 5b 6e 42 5d 3b 20 6e 42  nB=0; zB[nB]; nB
3ac0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 42 5b  ++){.    if( zB[
3ad0: 6e 42 5d 26 30 78 38 30 20 29 20 72 65 74 75 72  nB]&0x80 ) retur
3ae0: 6e 20 2d 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n -2;.  }..  /* 
3af0: 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  Special processi
3b00: 6e 67 20 69 66 20 65 69 74 68 65 72 20 73 74 72  ng if either str
3b10: 69 6e 67 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ing is empty */.
3b20: 20 20 69 66 28 20 6e 41 3d 3d 30 20 29 7b 0a 20    if( nA==0 ){. 
3b30: 20 20 20 63 42 70 72 65 76 20 3d 20 64 63 3b 0a     cBprev = dc;.
3b40: 20 20 20 20 66 6f 72 28 78 42 3d 72 65 73 3d 30      for(xB=res=0
3b50: 3b 20 28 63 42 20 3d 20 7a 42 5b 78 42 5d 29 21  ; (cB = zB[xB])!
3b60: 3d 30 3b 20 78 42 2b 2b 29 7b 0a 20 20 20 20 20  =0; xB++){.     
3b70: 20 72 65 73 20 2b 3d 20 69 6e 73 65 72 74 4f 72   res += insertOr
3b80: 44 65 6c 65 74 65 43 6f 73 74 28 63 42 70 72 65  DeleteCost(cBpre
3b90: 76 2c 20 63 42 2c 20 7a 42 5b 78 42 2b 31 5d 29  v, cB, zB[xB+1])
3ba0: 2f 46 49 4e 41 4c 5f 49 4e 53 5f 43 4f 53 54 5f  /FINAL_INS_COST_
3bb0: 44 49 56 3b 0a 20 20 20 20 20 20 63 42 70 72 65  DIV;.      cBpre
3bc0: 76 20 3d 20 63 42 3b 0a 20 20 20 20 7d 0a 20 20  v = cB;.    }.  
3bd0: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20    return res;.  
3be0: 7d 0a 20 20 69 66 28 20 6e 42 3d 3d 30 20 29 7b  }.  if( nB==0 ){
3bf0: 0a 20 20 20 20 63 41 70 72 65 76 20 3d 20 64 63  .    cAprev = dc
3c00: 3b 0a 20 20 20 20 66 6f 72 28 78 41 3d 72 65 73  ;.    for(xA=res
3c10: 3d 30 3b 20 28 63 41 20 3d 20 7a 41 5b 78 41 5d  =0; (cA = zA[xA]
3c20: 29 21 3d 30 3b 20 78 41 2b 2b 29 7b 0a 20 20 20  )!=0; xA++){.   
3c30: 20 20 20 72 65 73 20 2b 3d 20 69 6e 73 65 72 74     res += insert
3c40: 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63 41 70  OrDeleteCost(cAp
3c50: 72 65 76 2c 20 63 41 2c 20 7a 41 5b 78 41 2b 31  rev, cA, zA[xA+1
3c60: 5d 29 3b 0a 20 20 20 20 20 20 63 41 70 72 65 76  ]);.      cAprev
3c70: 20 3d 20 63 41 3b 0a 20 20 20 20 7d 0a 20 20 20   = cA;.    }.   
3c80: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d   return res;.  }
3c90: 0a 0a 20 20 2f 2a 20 41 20 69 73 20 61 20 70 72  ..  /* A is a pr
3ca0: 65 66 69 78 20 6f 66 20 42 20 2a 2f 0a 20 20 69  efix of B */.  i
3cb0: 66 28 20 7a 41 5b 30 5d 3d 3d 27 2a 27 20 26 26  f( zA[0]=='*' &&
3cc0: 20 7a 41 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75   zA[1]==0 ) retu
3cd0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rn 0;..  /* Allo
3ce0: 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
3cf0: 69 7a 65 20 74 68 65 20 57 61 67 6e 65 72 20 6d  ize the Wagner m
3d00: 61 74 72 69 78 20 2a 2f 0a 20 20 69 66 28 20 6e  atrix */.  if( n
3d10: 42 3c 28 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b  B<(sizeof(mStack
3d20: 29 2a 34 29 2f 28 73 69 7a 65 6f 66 28 6d 53 74  )*4)/(sizeof(mSt
3d30: 61 63 6b 5b 30 5d 29 2a 35 29 20 29 7b 0a 20 20  ack[0])*5) ){.  
3d40: 20 20 6d 20 3d 20 6d 53 74 61 63 6b 3b 0a 20 20    m = mStack;.  
3d50: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 20 3d 20 74  }else{.    m = t
3d60: 6f 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f  oFree = sqlite3_
3d70: 6d 61 6c 6c 6f 63 28 20 28 6e 42 2b 31 29 2a 35  malloc( (nB+1)*5
3d80: 2a 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 2f 34 20  *sizeof(m[0])/4 
3d90: 29 3b 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  );.    if( m==0 
3da0: 29 20 72 65 74 75 72 6e 20 2d 33 3b 0a 20 20 7d  ) return -3;.  }
3db0: 0a 20 20 63 78 20 3d 20 28 63 68 61 72 2a 29 26  .  cx = (char*)&
3dc0: 6d 5b 6e 42 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 43  m[nB+1];..  /* C
3dd0: 6f 6d 70 75 74 65 20 74 68 65 20 57 61 67 6e 65  ompute the Wagne
3de0: 72 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20  r edit distance 
3df0: 2a 2f 0a 20 20 6d 5b 30 5d 20 3d 20 30 3b 0a 20  */.  m[0] = 0;. 
3e00: 20 63 78 5b 30 5d 20 3d 20 64 63 3b 0a 20 20 63   cx[0] = dc;.  c
3e10: 42 70 72 65 76 20 3d 20 64 63 3b 0a 20 20 66 6f  Bprev = dc;.  fo
3e20: 72 28 78 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20  r(xB=1; xB<=nB; 
3e30: 78 42 2b 2b 29 7b 0a 20 20 20 20 63 42 6e 65 78  xB++){.    cBnex
3e40: 74 20 3d 20 7a 42 5b 78 42 5d 3b 0a 20 20 20 20  t = zB[xB];.    
3e50: 63 42 20 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20  cB = zB[xB-1];. 
3e60: 20 20 20 63 78 5b 78 42 5d 20 3d 20 63 42 3b 0a     cx[xB] = cB;.
3e70: 20 20 20 20 6d 5b 78 42 5d 20 3d 20 6d 5b 78 42      m[xB] = m[xB
3e80: 2d 31 5d 20 2b 20 69 6e 73 65 72 74 4f 72 44 65  -1] + insertOrDe
3e90: 6c 65 74 65 43 6f 73 74 28 63 42 70 72 65 76 2c  leteCost(cBprev,
3ea0: 20 63 42 2c 20 63 42 6e 65 78 74 29 3b 0a 20 20   cB, cBnext);.  
3eb0: 20 20 63 42 70 72 65 76 20 3d 20 63 42 3b 0a 20    cBprev = cB;. 
3ec0: 20 7d 0a 20 20 63 41 70 72 65 76 20 3d 20 64 63   }.  cAprev = dc
3ed0: 3b 0a 20 20 66 6f 72 28 78 41 3d 31 3b 20 78 41  ;.  for(xA=1; xA
3ee0: 3c 3d 6e 41 3b 20 78 41 2b 2b 29 7b 0a 20 20 20  <=nA; xA++){.   
3ef0: 20 69 6e 74 20 6c 61 73 74 41 20 3d 20 28 78 41   int lastA = (xA
3f00: 3d 3d 6e 41 29 3b 0a 20 20 20 20 63 41 20 3d 20  ==nA);.    cA = 
3f10: 7a 41 5b 78 41 2d 31 5d 3b 0a 20 20 20 20 63 41  zA[xA-1];.    cA
3f20: 6e 65 78 74 20 3d 20 7a 41 5b 78 41 5d 3b 0a 20  next = zA[xA];. 
3f30: 20 20 20 69 66 28 20 63 41 3d 3d 27 2a 27 20 26     if( cA=='*' &
3f40: 26 20 6c 61 73 74 41 20 29 20 62 72 65 61 6b 3b  & lastA ) break;
3f50: 0a 20 20 20 20 64 20 3d 20 6d 5b 30 5d 3b 0a 20  .    d = m[0];. 
3f60: 20 20 20 64 63 20 3d 20 63 78 5b 30 5d 3b 0a 20     dc = cx[0];. 
3f70: 20 20 20 6d 5b 30 5d 20 3d 20 64 20 2b 20 69 6e     m[0] = d + in
3f80: 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74  sertOrDeleteCost
3f90: 28 63 41 70 72 65 76 2c 20 63 41 2c 20 63 41 6e  (cAprev, cA, cAn
3fa0: 65 78 74 29 3b 0a 20 20 20 20 63 42 70 72 65 76  ext);.    cBprev
3fb0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 78 42   = 0;.    for(xB
3fc0: 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b 2b  =1; xB<=nB; xB++
3fd0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 74  ){.      int tot
3fe0: 61 6c 43 6f 73 74 2c 20 69 6e 73 43 6f 73 74 2c  alCost, insCost,
3ff0: 20 64 65 6c 43 6f 73 74 2c 20 73 75 62 43 6f 73   delCost, subCos
4000: 74 2c 20 6e 63 78 3b 0a 20 20 20 20 20 20 63 42  t, ncx;.      cB
4010: 20 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20 20   = zB[xB-1];.   
4020: 20 20 20 63 42 6e 65 78 74 20 3d 20 7a 42 5b 78     cBnext = zB[x
4030: 42 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  B];..      /* Co
4040: 73 74 20 74 6f 20 69 6e 73 65 72 74 20 63 42 20  st to insert cB 
4050: 2a 2f 0a 20 20 20 20 20 20 69 6e 73 43 6f 73 74  */.      insCost
4060: 20 3d 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74   = insertOrDelet
4070: 65 43 6f 73 74 28 63 78 5b 78 42 2d 31 5d 2c 20  eCost(cx[xB-1], 
4080: 63 42 2c 20 63 42 6e 65 78 74 29 3b 0a 20 20 20  cB, cBnext);.   
4090: 20 20 20 69 66 28 20 6c 61 73 74 41 20 29 20 69     if( lastA ) i
40a0: 6e 73 43 6f 73 74 20 2f 3d 20 46 49 4e 41 4c 5f  nsCost /= FINAL_
40b0: 49 4e 53 5f 43 4f 53 54 5f 44 49 56 3b 0a 0a 20  INS_COST_DIV;.. 
40c0: 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20       /* Cost to 
40d0: 64 65 6c 65 74 65 20 63 41 20 2a 2f 0a 20 20 20  delete cA */.   
40e0: 20 20 20 64 65 6c 43 6f 73 74 20 3d 20 69 6e 73     delCost = ins
40f0: 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28  ertOrDeleteCost(
4100: 63 78 5b 78 42 5d 2c 20 63 41 2c 20 63 42 6e 65  cx[xB], cA, cBne
4110: 78 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  xt);..      /* C
4120: 6f 73 74 20 74 6f 20 73 75 62 73 74 69 74 75 74  ost to substitut
4130: 65 20 63 41 2d 3e 63 42 20 2a 2f 0a 20 20 20 20  e cA->cB */.    
4140: 20 20 73 75 62 43 6f 73 74 20 3d 20 73 75 62 73    subCost = subs
4150: 74 69 74 75 74 65 43 6f 73 74 28 63 78 5b 78 42  tituteCost(cx[xB
4160: 2d 31 5d 2c 20 63 41 2c 20 63 42 29 3b 0a 0a 20  -1], cA, cB);.. 
4170: 20 20 20 20 20 2f 2a 20 42 65 73 74 20 63 6f 73       /* Best cos
4180: 74 20 2a 2f 0a 20 20 20 20 20 20 74 6f 74 61 6c  t */.      total
4190: 43 6f 73 74 20 3d 20 69 6e 73 43 6f 73 74 20 2b  Cost = insCost +
41a0: 20 6d 5b 78 42 2d 31 5d 3b 0a 20 20 20 20 20 20   m[xB-1];.      
41b0: 6e 63 78 20 3d 20 63 42 3b 0a 20 20 20 20 20 20  ncx = cB;.      
41c0: 69 66 28 20 28 64 65 6c 43 6f 73 74 20 2b 20 6d  if( (delCost + m
41d0: 5b 78 42 5d 29 3c 74 6f 74 61 6c 43 6f 73 74 20  [xB])<totalCost 
41e0: 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c  ){.        total
41f0: 43 6f 73 74 20 3d 20 64 65 6c 43 6f 73 74 20 2b  Cost = delCost +
4200: 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20 20 20   m[xB];.        
4210: 6e 63 78 20 3d 20 63 41 3b 0a 20 20 20 20 20 20  ncx = cA;.      
4220: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 75 62  }.      if( (sub
4230: 43 6f 73 74 20 2b 20 64 29 3c 74 6f 74 61 6c 43  Cost + d)<totalC
4240: 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 74  ost ){.        t
4250: 6f 74 61 6c 43 6f 73 74 20 3d 20 73 75 62 43 6f  otalCost = subCo
4260: 73 74 20 2b 20 64 3b 0a 20 20 20 20 20 20 7d 0a  st + d;.      }.
4270: 0a 23 69 66 20 30 0a 20 20 20 20 20 20 70 72 69  .#if 0.      pri
4280: 6e 74 66 28 22 25 64 2c 25 64 20 64 3d 25 34 64  ntf("%d,%d d=%4d
4290: 20 75 3d 25 34 64 20 72 3d 25 34 64 20 64 63 3d   u=%4d r=%4d dc=
42a0: 25 63 20 63 41 3d 25 63 20 63 42 3d 25 63 22 0a  %c cA=%c cB=%c".
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 69               " i
42c0: 6e 73 3d 25 34 64 20 64 65 6c 3d 25 34 64 20 73  ns=%4d del=%4d s
42d0: 75 62 3d 25 34 64 20 74 3d 25 34 64 20 6e 63 78  ub=%4d t=%4d ncx
42e0: 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
42f0: 20 20 20 20 20 78 41 2c 20 78 42 2c 20 64 2c 20       xA, xB, d, 
4300: 6d 5b 78 42 5d 2c 20 6d 5b 78 42 2d 31 5d 2c 20  m[xB], m[xB-1], 
4310: 64 63 3f 64 63 3a 27 20 27 2c 20 63 41 2c 20 63  dc?dc:' ', cA, c
4320: 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
4330: 69 6e 73 43 6f 73 74 2c 20 64 65 6c 43 6f 73 74  insCost, delCost
4340: 2c 20 73 75 62 43 6f 73 74 2c 20 74 6f 74 61 6c  , subCost, total
4350: 43 6f 73 74 2c 20 6e 63 78 3f 6e 63 78 3a 27 20  Cost, ncx?ncx:' 
4360: 27 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ');.#endif..    
4370: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
4380: 6d 61 74 72 69 78 20 2a 2f 0a 20 20 20 20 20 20  matrix */.      
4390: 64 20 3d 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20  d = m[xB];.     
43a0: 20 64 63 20 3d 20 63 78 5b 78 42 5d 3b 0a 20 20   dc = cx[xB];.  
43b0: 20 20 20 20 6d 5b 78 42 5d 20 3d 20 74 6f 74 61      m[xB] = tota
43c0: 6c 43 6f 73 74 3b 0a 20 20 20 20 20 20 63 78 5b  lCost;.      cx[
43d0: 78 42 5d 20 3d 20 6e 63 78 3b 0a 20 20 20 20 20  xB] = ncx;.     
43e0: 20 63 42 70 72 65 76 20 3d 20 63 42 3b 0a 20 20   cBprev = cB;.  
43f0: 20 20 7d 0a 20 20 20 20 63 41 70 72 65 76 20 3d    }.    cAprev =
4400: 20 63 41 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46   cA;.  }..  /* F
4410: 72 65 65 20 74 68 65 20 77 61 67 6e 65 72 20 6d  ree the wagner m
4420: 61 74 72 69 78 20 61 6e 64 20 72 65 74 75 72 6e  atrix and return
4430: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
4440: 20 69 66 28 20 63 41 3d 3d 27 2a 27 20 29 7b 0a   if( cA=='*' ){.
4450: 20 20 20 20 72 65 73 20 3d 20 6d 5b 31 5d 3b 0a      res = m[1];.
4460: 20 20 20 20 66 6f 72 28 78 42 3d 31 3b 20 78 42      for(xB=1; xB
4470: 3c 3d 6e 42 3b 20 78 42 2b 2b 29 7b 0a 20 20 20  <=nB; xB++){.   
4480: 20 20 20 69 66 28 20 6d 5b 78 42 5d 3c 72 65 73     if( m[xB]<res
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
44a0: 3d 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20 20  = m[xB];.       
44b0: 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29 20 2a   if( pnMatch ) *
44c0: 70 6e 4d 61 74 63 68 20 3d 20 78 42 2b 6e 4d 61  pnMatch = xB+nMa
44d0: 74 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tch;.      }.   
44e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
44f0: 72 65 73 20 3d 20 6d 5b 6e 42 5d 3b 0a 20 20 20  res = m[nB];.   
4500: 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
4510: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
4520: 6e 2c 20 70 6e 4d 61 74 63 68 20 69 73 20 61 6c  n, pnMatch is al
4530: 77 61 79 73 20 4e 55 4c 4c 20 69 66 20 7a 41 20  ways NULL if zA 
4540: 64 6f 65 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  does.    ** not 
4550: 65 6e 64 20 69 6e 20 22 2a 22 20 2a 2f 0a 20 20  end in "*" */.  
4560: 20 20 61 73 73 65 72 74 28 20 70 6e 4d 61 74 63    assert( pnMatc
4570: 68 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71  h==0 );.  }.  sq
4580: 6c 69 74 65 33 5f 66 72 65 65 28 74 6f 46 72 65  lite3_free(toFre
4590: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  e);.  return res
45a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
45b0: 69 6f 6e 3a 20 20 20 20 65 64 69 74 64 69 73 74  ion:    editdist
45c0: 28 41 2c 42 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  (A,B).**.** Retu
45d0: 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  rn the cost of t
45e0: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74 72 69  ransforming stri
45f0: 6e 67 20 41 20 69 6e 74 6f 20 73 74 72 69 6e 67  ng A into string
4600: 20 42 2e 20 20 42 6f 74 68 20 73 74 72 69 6e 67   B.  Both string
4610: 73 0a 2a 2a 20 6d 75 73 74 20 62 65 20 70 75 72  s.** must be pur
4620: 65 20 41 53 43 49 49 20 74 65 78 74 2e 20 20 49  e ASCII text.  I
4630: 66 20 41 20 65 6e 64 73 20 77 69 74 68 20 27 2a  f A ends with '*
4640: 27 20 74 68 65 6e 20 69 74 20 69 73 20 61 73 73  ' then it is ass
4650: 75 6d 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  umed to be.** a 
4660: 70 72 65 66 69 78 20 6f 66 20 42 20 61 6e 64 20  prefix of B and 
4670: 65 78 74 72 61 20 63 68 61 72 61 63 74 65 72 73  extra characters
4680: 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 42   on the end of B
4690: 20 68 61 76 65 20 6d 69 6e 69 6d 61 6c 20 61 64   have minimal ad
46a0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 63 6f 73 74  ditional.** cost
46b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
46c0: 20 65 64 69 74 64 69 73 74 53 71 6c 46 75 6e 63   editdistSqlFunc
46d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
46e0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
46f0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
4700: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
4710: 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  .){.  int res = 
4720: 65 64 69 74 64 69 73 74 31 28 0a 20 20 20 20 20  editdist1(.     
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4740: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
4750: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
4760: 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20  rgv[0]),.       
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f               (co
4780: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
4790: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
47a0: 76 5b 31 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  v[1]),.         
47b0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
47c0: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
47d0: 20 20 69 66 28 20 72 65 73 3d 3d 28 2d 33 29 20    if( res==(-3) 
47e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
47f0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
4800: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
4810: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d    }else if( res=
4820: 3d 28 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 73  =(-2) ){.      s
4830: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
4840: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 6e 6f  ror(context, "no
4850: 6e 2d 41 53 43 49 49 20 69 6e 70 75 74 20 74 6f  n-ASCII input to
4860: 20 65 64 69 74 64 69 73 74 28 29 22 2c 20 2d 31   editdist()", -1
4870: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4880: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4890: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
48a0: 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f  , "NULL input to
48b0: 20 65 64 69 74 64 69 73 74 28 29 22 2c 20 2d 31   editdist()", -1
48c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
48d0: 7b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  { .    sqlite3_r
48e0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
48f0: 74 2c 20 72 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  t, res);.  }.}..
4900: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 69  /* End of the fi
4910: 78 65 64 2d 63 6f 73 74 20 65 64 69 74 20 64 69  xed-cost edit di
4920: 73 74 61 6e 63 65 20 69 6d 70 6c 65 6d 65 6e 74  stance implement
4930: 61 74 69 6f 6e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation.**********
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4980: 2a 2a 2a 2a 0a 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 2a 0a 2a 2a 20 42 65 67 69 6e 3a 20 43 6f 6e  **.** Begin: Con
49e0: 66 69 67 75 72 61 62 6c 65 20 63 6f 73 74 20 75  figurable cost u
49f0: 6e 69 63 6f 64 65 20 65 64 69 74 20 64 69 73 74  nicode edit dist
4a00: 61 6e 63 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2f  ance routines.*/
4a10: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
4a20: 61 72 61 74 69 6f 6e 20 6f 66 20 73 74 72 75 63  aration of struc
4a30: 74 75 72 65 73 20 2a 2f 0a 74 79 70 65 64 65 66  tures */.typedef
4a40: 20 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74   struct EditDist
4a50: 33 43 6f 73 74 20 45 64 69 74 44 69 73 74 33 43  3Cost EditDist3C
4a60: 6f 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ost;.typedef str
4a70: 75 63 74 20 45 64 69 74 44 69 73 74 33 43 6f 6e  uct EditDist3Con
4a80: 66 69 67 20 45 64 69 74 44 69 73 74 33 43 6f 6e  fig EditDist3Con
4a90: 66 69 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72  fig;.typedef str
4aa0: 75 63 74 20 45 64 69 74 44 69 73 74 33 50 6f 69  uct EditDist3Poi
4ab0: 6e 74 20 45 64 69 74 44 69 73 74 33 50 6f 69 6e  nt EditDist3Poin
4ac0: 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  t;.typedef struc
4ad0: 74 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 20  t EditDist3From 
4ae0: 45 64 69 74 44 69 73 74 33 46 72 6f 6d 3b 0a 74  EditDist3From;.t
4af0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64  ypedef struct Ed
4b00: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
4b10: 67 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53  g EditDist3FromS
4b20: 74 72 69 6e 67 3b 0a 74 79 70 65 64 65 66 20 73  tring;.typedef s
4b30: 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54  truct EditDist3T
4b40: 6f 20 45 64 69 74 44 69 73 74 33 54 6f 3b 0a 74  o EditDist3To;.t
4b50: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64  ypedef struct Ed
4b60: 69 74 44 69 73 74 33 54 6f 53 74 72 69 6e 67 20  itDist3ToString 
4b70: 45 64 69 74 44 69 73 74 33 54 6f 53 74 72 69 6e  EditDist3ToStrin
4b80: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
4b90: 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20  t EditDist3Lang 
4ba0: 45 64 69 74 44 69 73 74 33 4c 61 6e 67 3b 0a 0a  EditDist3Lang;..
4bb0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  ./*.** An entry 
4bc0: 69 6e 20 74 68 65 20 65 64 69 74 20 63 6f 73 74  in the edit cost
4bd0: 20 74 61 62 6c 65 0a 2a 2f 0a 73 74 72 75 63 74   table.*/.struct
4be0: 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 7b   EditDist3Cost {
4bf0: 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74  .  EditDist3Cost
4c00: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20   *pNext;     /* 
4c10: 4e 65 78 74 20 63 6f 73 74 20 65 6c 65 6d 65 6e  Next cost elemen
4c20: 74 20 2a 2f 0a 20 20 75 38 20 6e 46 72 6f 6d 3b  t */.  u8 nFrom;
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
4c50: 74 65 73 20 69 6e 20 61 46 72 6f 6d 20 2a 2f 0a  tes in aFrom */.
4c60: 20 20 75 38 20 6e 54 6f 3b 20 20 20 20 20 20 20    u8 nTo;       
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4c80: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
4c90: 6e 20 61 54 6f 20 2a 2f 0a 20 20 75 31 36 20 69  n aTo */.  u16 i
4ca0: 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Cost;           
4cb0: 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
4cc0: 74 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  this transformat
4cd0: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 61 5b  ion */.  char a[
4ce0: 34 5d 20 20 20 20 3b 20 20 20 20 20 20 20 20 20  4]    ;         
4cf0: 20 20 20 2f 2a 20 46 52 4f 4d 20 73 74 72 69 6e     /* FROM strin
4d00: 67 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 54 4f  g followed by TO
4d10: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 2f 2a 20   string */.  /* 
4d20: 41 64 64 69 74 69 6f 6e 61 6c 20 54 4f 20 61 6e  Additional TO an
4d30: 64 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 62 79  d FROM string by
4d40: 74 65 73 20 61 70 70 65 6e 64 65 64 20 61 73 20  tes appended as 
4d50: 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 7d 3b 0a  necessary */.};.
4d60: 0a 2f 2a 0a 2a 2a 20 45 64 69 74 20 63 6f 73 74  ./*.** Edit cost
4d70: 73 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  s for a particul
4d80: 61 72 20 6c 61 6e 67 75 61 67 65 20 49 44 20 0a  ar language ID .
4d90: 2a 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44 69  */.struct EditDi
4da0: 73 74 33 4c 61 6e 67 20 7b 0a 20 20 69 6e 74 20  st3Lang {.  int 
4db0: 69 4c 61 6e 67 3b 20 20 20 20 20 20 20 20 20 20  iLang;          
4dc0: 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 49     /* Language I
4dd0: 44 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 73 43  D */.  int iInsC
4de0: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ost;          /*
4df0: 20 44 65 66 61 75 6c 74 20 69 6e 73 65 72 74 69   Default inserti
4e00: 6f 6e 20 63 6f 73 74 20 2a 2f 0a 20 20 69 6e 74  on cost */.  int
4e10: 20 69 44 65 6c 43 6f 73 74 3b 20 20 20 20 20 20   iDelCost;      
4e20: 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 64      /* Default d
4e30: 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 2a 2f 0a  eletion cost */.
4e40: 20 20 69 6e 74 20 69 53 75 62 43 6f 73 74 3b 20    int iSubCost; 
4e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61           /* Defa
4e60: 75 6c 74 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ult substitution
4e70: 20 63 6f 73 74 20 2a 2f 0a 20 20 45 64 69 74 44   cost */.  EditD
4e80: 69 73 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 3b  ist3Cost *pCost;
4e90: 20 20 2f 2a 20 43 6f 73 74 73 20 2a 2f 0a 7d 3b    /* Costs */.};
4ea0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 65 66  .../*.** The def
4eb0: 61 75 6c 74 20 45 64 69 74 44 69 73 74 33 4c 61  ault EditDist3La
4ec0: 6e 67 20 6f 62 6a 65 63 74 2c 20 77 69 74 68 20  ng object, with 
4ed0: 64 65 66 61 75 6c 74 20 63 6f 73 74 73 2e 0a 2a  default costs..*
4ee0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 45  /.static const E
4ef0: 64 69 74 44 69 73 74 33 4c 61 6e 67 20 65 64 69  ditDist3Lang edi
4f00: 74 44 69 73 74 33 4c 61 6e 67 20 3d 20 7b 20 30  tDist3Lang = { 0
4f10: 2c 20 31 30 30 2c 20 31 30 30 2c 20 31 35 30 2c  , 100, 100, 150,
4f20: 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   0 };../*.** Com
4f30: 70 6c 65 74 65 20 63 6f 6e 66 69 67 75 72 61 74  plete configurat
4f40: 69 6f 6e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64  ion.*/.struct Ed
4f50: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 7b 0a  itDist3Config {.
4f60: 20 20 69 6e 74 20 6e 4c 61 6e 67 3b 20 20 20 20    int nLang;    
4f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4f80: 65 72 20 6f 66 20 6c 61 6e 67 75 61 67 65 20 49  er of language I
4f90: 44 73 2e 20 20 53 69 7a 65 20 6f 66 20 61 5b 5d  Ds.  Size of a[]
4fa0: 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 4c   */.  EditDist3L
4fb0: 61 6e 67 20 2a 61 3b 20 20 20 20 20 20 2f 2a 20  ang *a;      /* 
4fc0: 4f 6e 65 20 66 6f 72 20 65 61 63 68 20 64 69 73  One for each dis
4fd0: 74 69 6e 63 74 20 6c 61 6e 67 75 61 67 65 20 49  tinct language I
4fe0: 44 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  D */.};../*.** E
4ff0: 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
5000: 20 61 62 6f 75 74 20 65 61 63 68 20 63 68 61 72   about each char
5010: 61 63 74 65 72 20 69 6e 20 74 68 65 20 46 52 4f  acter in the FRO
5020: 4d 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 72  M string..*/.str
5030: 75 63 74 20 45 64 69 74 44 69 73 74 33 46 72 6f  uct EditDist3Fro
5040: 6d 20 7b 0a 20 20 69 6e 74 20 6e 53 75 62 73 74  m {.  int nSubst
5050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5060: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 73  * Number of subs
5070: 74 69 74 75 74 69 6f 6e 20 63 6f 73 74 20 65 6e  titution cost en
5080: 74 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tries */.  int n
5090: 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Del;            
50a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
50b0: 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65   deletion cost e
50c0: 6e 74 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ntries */.  int 
50d0: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
50e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
50f0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 69 73 20  f bytes in this 
5100: 63 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 45  character */.  E
5110: 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 61  ditDist3Cost **a
5120: 70 53 75 62 73 74 3b 20 2f 2a 20 41 72 72 61 79  pSubst; /* Array
5130: 20 6f 66 20 73 75 62 73 74 69 74 75 74 69 6f 6e   of substitution
5140: 20 63 6f 73 74 73 20 66 6f 72 20 74 68 69 73 20   costs for this 
5150: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 64 69  element */.  Edi
5160: 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 61 70 44  tDist3Cost **apD
5170: 65 6c 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  el;   /* Array o
5180: 66 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20  f deletion cost 
5190: 65 6e 74 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f  entries */.};../
51a0: 2a 0a 2a 2a 20 41 20 70 72 65 63 6f 6d 70 69 6c  *.** A precompil
51b0: 65 64 20 46 52 4f 4d 20 73 74 72 69 6e 67 2e 0a  ed FROM string..
51c0: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 6d 6d  *.** In the comm
51d0: 6f 6e 20 63 61 73 65 20 77 65 20 65 78 70 65 63  on case we expec
51e0: 74 20 74 68 65 20 46 52 4f 4d 20 73 74 72 69 6e  t the FROM strin
51f0: 67 20 74 6f 20 62 65 20 72 65 75 73 65 64 20 6d  g to be reused m
5200: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a  ultiple times..*
5210: 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
5220: 2c 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  , the common cas
5230: 65 20 77 69 6c 6c 20 62 65 20 74 6f 20 6d 65 61  e will be to mea
5240: 73 75 72 65 20 74 68 65 20 65 64 69 74 20 64 69  sure the edit di
5250: 73 74 61 6e 63 65 0a 2a 2a 20 66 72 6f 6d 20 61  stance.** from a
5260: 20 73 69 6e 67 6c 65 20 6f 72 69 67 69 6e 20 73   single origin s
5270: 74 72 69 6e 67 20 74 6f 20 6d 75 6c 74 69 70 6c  tring to multipl
5280: 65 20 74 61 72 67 65 74 20 73 74 72 69 6e 67 73  e target strings
5290: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69 74  ..*/.struct Edit
52a0: 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20  Dist3FromString 
52b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  {.  char *z;    
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52d0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  The complete tex
52e0: 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 73 74  t of the FROM st
52f0: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ring */.  int n;
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5320: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
5330: 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f  e FROM string */
5340: 0a 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 3b  .  int isPrefix;
5350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5360: 72 75 65 20 69 66 20 65 6e 64 73 20 77 69 74 68  rue if ends with
5370: 20 27 2a 27 20 63 68 61 72 61 63 74 65 72 20 2a   '*' character *
5380: 2f 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f  /.  EditDist3Fro
5390: 6d 20 2a 61 3b 20 20 20 20 20 20 20 20 2f 2a 20  m *a;        /* 
53a0: 45 78 74 72 61 20 69 6e 66 6f 20 61 62 6f 75 74  Extra info about
53b0: 20 65 61 63 68 20 63 68 61 72 20 6f 66 20 74 68   each char of th
53c0: 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f  e FROM string */
53d0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61  .};../*.** Extra
53e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
53f0: 75 74 20 65 61 63 68 20 63 68 61 72 61 63 74 65  ut each characte
5400: 72 20 69 6e 20 74 68 65 20 54 4f 20 73 74 72 69  r in the TO stri
5410: 6e 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64  ng..*/.struct Ed
5420: 69 74 44 69 73 74 33 54 6f 20 7b 0a 20 20 69 6e  itDist3To {.  in
5430: 74 20 6e 49 6e 73 3b 20 20 20 20 20 20 20 20 20  t nIns;         
5440: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5450: 20 6f 66 20 69 6e 73 65 72 74 69 6f 6e 20 63 6f   of insertion co
5460: 73 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20  st entries */.  
5470: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
5480: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5490: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
54a0: 68 69 73 20 63 68 61 72 61 63 74 65 72 20 2a 2f  his character */
54b0: 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74  .  EditDist3Cost
54c0: 20 2a 2a 61 70 49 6e 73 3b 20 20 20 2f 2a 20 41   **apIns;   /* A
54d0: 72 72 61 79 20 6f 66 20 64 65 6c 65 74 69 6f 6e  rray of deletion
54e0: 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f   cost entries */
54f0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 72 65  .};../*.** A pre
5500: 63 6f 6d 70 69 6c 65 64 20 46 52 4f 4d 20 73 74  compiled FROM st
5510: 72 69 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 45  ring.*/.struct E
5520: 64 69 74 44 69 73 74 33 54 6f 53 74 72 69 6e 67  ditDist3ToString
5530: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20   {.  char *z;   
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5550: 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   The complete te
5560: 78 74 20 6f 66 20 74 68 65 20 54 4f 20 73 74 72  xt of the TO str
5570: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ing */.  int n; 
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
55a0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
55b0: 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20   TO string */.  
55c0: 45 64 69 74 44 69 73 74 33 54 6f 20 2a 61 3b 20  EditDist3To *a; 
55d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
55e0: 61 20 69 6e 66 6f 20 61 62 6f 75 74 20 65 61 63  a info about eac
55f0: 68 20 63 68 61 72 20 6f 66 20 74 68 65 20 54 4f  h char of the TO
5600: 20 73 74 72 69 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f   string */.};../
5610: 2a 0a 2a 2a 20 43 6c 65 61 72 20 6f 72 20 64 65  *.** Clear or de
5620: 6c 65 74 65 20 61 6e 20 69 6e 73 74 61 6e 63 65  lete an instance
5630: 20 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 74   of the object t
5640: 68 61 74 20 72 65 63 6f 72 64 73 20 61 6c 6c 20  hat records all 
5650: 65 64 69 74 2d 64 69 73 74 61 6e 63 65 0a 2a 2a  edit-distance.**
5660: 20 77 65 69 67 68 74 73 2e 0a 2a 2f 0a 73 74 61   weights..*/.sta
5670: 74 69 63 20 76 6f 69 64 20 65 64 69 74 44 69 73  tic void editDis
5680: 74 33 43 6f 6e 66 69 67 43 6c 65 61 72 28 45 64  t3ConfigClear(Ed
5690: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70  itDist3Config *p
56a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
56b0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
56c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
56d0: 3e 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  >nLang; i++){.  
56e0: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
56f0: 2a 70 43 6f 73 74 2c 20 2a 70 4e 65 78 74 3b 0a  *pCost, *pNext;.
5700: 20 20 20 20 70 43 6f 73 74 20 3d 20 70 2d 3e 61      pCost = p->a
5710: 5b 69 5d 2e 70 43 6f 73 74 3b 0a 20 20 20 20 77  [i].pCost;.    w
5720: 68 69 6c 65 28 20 70 43 6f 73 74 20 29 7b 0a 20  hile( pCost ){. 
5730: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 43 6f       pNext = pCo
5740: 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
5750: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5760: 6f 73 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 73  ost);.      pCos
5770: 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  t = pNext;.    }
5780: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
5790: 72 65 65 28 70 2d 3e 61 29 3b 0a 20 20 6d 65 6d  ree(p->a);.  mem
57a0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
57b0: 28 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  (*p));.}.static 
57c0: 76 6f 69 64 20 65 64 69 74 44 69 73 74 33 43 6f  void editDist3Co
57d0: 6e 66 69 67 44 65 6c 65 74 65 28 76 6f 69 64 20  nfigDelete(void 
57e0: 2a 70 49 6e 29 7b 0a 20 20 45 64 69 74 44 69 73  *pIn){.  EditDis
57f0: 74 33 43 6f 6e 66 69 67 20 2a 70 20 3d 20 28 45  t3Config *p = (E
5800: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 2a 29  ditDist3Config*)
5810: 70 49 6e 3b 0a 20 20 65 64 69 74 44 69 73 74 33  pIn;.  editDist3
5820: 43 6f 6e 66 69 67 43 6c 65 61 72 28 70 29 3b 0a  ConfigClear(p);.
5830: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5840: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  );.}../*.** Load
5850: 20 61 6c 6c 20 65 64 69 74 2d 64 69 73 74 61 6e   all edit-distan
5860: 63 65 20 77 65 69 67 68 74 73 20 66 72 6f 6d 20  ce weights from 
5870: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
5880: 69 63 20 69 6e 74 20 65 64 69 74 44 69 73 74 33  ic int editDist3
5890: 43 6f 6e 66 69 67 4c 6f 61 64 28 0a 20 20 45 64  ConfigLoad(.  Ed
58a0: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70  itDist3Config *p
58b0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 64  ,      /* The ed
58c0: 69 74 20 64 69 73 74 61 6e 63 65 20 63 6f 6e 66  it distance conf
58d0: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 6c 6f 61  iguration to loa
58e0: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
58f0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
5900: 2a 20 4c 6f 61 64 20 66 72 6f 6d 20 74 68 69 73  * Load from this
5910: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
5920: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
5930: 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e      /* Name o
5940: 66 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  f the table from
5950: 20 77 68 69 63 68 20 74 6f 20 6c 6f 61 64 20 2a   which to load *
5960: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
5970: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
5980: 74 20 72 63 2c 20 72 63 32 3b 0a 20 20 63 68 61  t rc, rc2;.  cha
5990: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69  r *zSql;.  int i
59a0: 4c 61 6e 67 50 72 65 76 20 3d 20 2d 39 39 39 39  LangPrev = -9999
59b0: 3b 0a 20 20 45 64 69 74 44 69 73 74 33 4c 61 6e  ;.  EditDist3Lan
59c0: 67 20 2a 70 4c 61 6e 67 20 3d 20 30 3b 0a 0a 20  g *pLang = 0;.. 
59d0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
59e0: 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
59f0: 69 4c 61 6e 67 2c 20 63 46 72 6f 6d 2c 20 63 54  iLang, cFrom, cT
5a00: 6f 2c 20 69 43 6f 73 74 22 0a 20 20 20 20 20 20  o, iCost".      
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 22 20 46 52 4f 4d 20 5c 22 25 77 5c 22     " FROM \"%w\"
5a30: 20 57 48 45 52 45 20 69 4c 61 6e 67 3e 3d 30 20   WHERE iLang>=0 
5a40: 4f 52 44 45 52 20 42 59 20 69 4c 61 6e 67 22 2c  ORDER BY iLang",
5a50: 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20   zTable);.  if( 
5a60: 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
5a70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5a80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
5a90: 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
5aa0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
5ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
5ac0: 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Sql);.  if( rc )
5ad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 65 64   return rc;.  ed
5ae0: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43 6c 65  itDist3ConfigCle
5af0: 61 72 28 70 29 3b 0a 20 20 77 68 69 6c 65 28 20  ar(p);.  while( 
5b00: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
5b10: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
5b20: 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67  ){.    int iLang
5b30: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
5b40: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
5b50: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5b60: 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20  *zFrom = (const 
5b70: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
5b80: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
5b90: 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 46 72   1);.    int nFr
5ba0: 6f 6d 20 3d 20 7a 46 72 6f 6d 20 3f 20 73 71 6c  om = zFrom ? sql
5bb0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
5bc0: 73 28 70 53 74 6d 74 2c 20 31 29 20 3a 20 30 3b  s(pStmt, 1) : 0;
5bd0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5be0: 2a 7a 54 6f 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zTo = (const ch
5bf0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
5c00: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32  mn_text(pStmt, 2
5c10: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d  );.    int nTo =
5c20: 20 7a 54 6f 20 3f 20 73 71 6c 69 74 65 33 5f 63   zTo ? sqlite3_c
5c30: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
5c40: 74 2c 20 32 29 20 3a 20 30 3b 0a 20 20 20 20 69  t, 2) : 0;.    i
5c50: 6e 74 20 69 43 6f 73 74 20 3d 20 73 71 6c 69 74  nt iCost = sqlit
5c60: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
5c70: 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 61 73  tmt, 3);..    as
5c80: 73 65 72 74 28 20 7a 46 72 6f 6d 21 3d 30 20 7c  sert( zFrom!=0 |
5c90: 7c 20 6e 46 72 6f 6d 3d 3d 30 20 29 3b 0a 20 20  | nFrom==0 );.  
5ca0: 20 20 61 73 73 65 72 74 28 20 7a 54 6f 21 3d 30    assert( zTo!=0
5cb0: 20 7c 7c 20 6e 54 6f 3d 3d 30 20 29 3b 0a 20 20   || nTo==0 );.  
5cc0: 20 20 69 66 28 20 6e 46 72 6f 6d 3e 31 30 30 20    if( nFrom>100 
5cd0: 7c 7c 20 6e 54 6f 3e 31 30 30 20 29 20 63 6f 6e  || nTo>100 ) con
5ce0: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 69  tinue;.    if( i
5cf0: 43 6f 73 74 3c 30 20 29 20 63 6f 6e 74 69 6e 75  Cost<0 ) continu
5d00: 65 3b 0a 20 20 20 20 69 66 28 20 70 4c 61 6e 67  e;.    if( pLang
5d10: 3d 3d 30 20 7c 7c 20 69 4c 61 6e 67 21 3d 69 4c  ==0 || iLang!=iL
5d20: 61 6e 67 50 72 65 76 20 29 7b 0a 20 20 20 20 20  angPrev ){.     
5d30: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a   EditDist3Lang *
5d40: 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77  pNew;.      pNew
5d50: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
5d60: 6f 63 28 70 2d 3e 61 2c 20 28 70 2d 3e 6e 4c 61  oc(p->a, (p->nLa
5d70: 6e 67 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ng+1)*sizeof(p->
5d80: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  a[0]));.      if
5d90: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 20 72 63 20  ( pNew==0 ){ rc 
5da0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20  = SQLITE_NOMEM; 
5db0: 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 70  break; }.      p
5dc0: 2d 3e 61 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ->a = pNew;.    
5dd0: 20 20 70 4c 61 6e 67 20 3d 20 26 70 2d 3e 61 5b    pLang = &p->a[
5de0: 70 2d 3e 6e 4c 61 6e 67 5d 3b 0a 20 20 20 20 20  p->nLang];.     
5df0: 20 70 2d 3e 6e 4c 61 6e 67 2b 2b 3b 0a 20 20 20   p->nLang++;.   
5e00: 20 20 20 70 4c 61 6e 67 2d 3e 69 4c 61 6e 67 20     pLang->iLang 
5e10: 3d 20 69 4c 61 6e 67 3b 0a 20 20 20 20 20 20 70  = iLang;.      p
5e20: 4c 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 20 3d  Lang->iInsCost =
5e30: 20 31 30 30 3b 0a 20 20 20 20 20 20 70 4c 61 6e   100;.      pLan
5e40: 67 2d 3e 69 44 65 6c 43 6f 73 74 20 3d 20 31 30  g->iDelCost = 10
5e50: 30 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e  0;.      pLang->
5e60: 69 53 75 62 43 6f 73 74 20 3d 20 31 35 30 3b 0a  iSubCost = 150;.
5e70: 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 70 43 6f        pLang->pCo
5e80: 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 4c  st = 0;.      iL
5e90: 61 6e 67 50 72 65 76 20 3d 20 69 4c 61 6e 67 3b  angPrev = iLang;
5ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
5eb0: 46 72 6f 6d 3d 3d 31 20 26 26 20 7a 46 72 6f 6d  From==1 && zFrom
5ec0: 5b 30 5d 3d 3d 27 3f 27 20 26 26 20 6e 54 6f 3d  [0]=='?' && nTo=
5ed0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 61 6e  =0 ){.      pLan
5ee0: 67 2d 3e 69 44 65 6c 43 6f 73 74 20 3d 20 69 43  g->iDelCost = iC
5ef0: 6f 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ost;.    }else i
5f00: 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 26 26 20 6e  f( nFrom==0 && n
5f10: 54 6f 3d 3d 31 20 26 26 20 7a 54 6f 5b 30 5d 3d  To==1 && zTo[0]=
5f20: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 70 4c  ='?' ){.      pL
5f30: 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 20 3d 20  ang->iInsCost = 
5f40: 69 43 6f 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  iCost;.    }else
5f50: 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 31 20 26 26   if( nFrom==1 &&
5f60: 20 6e 54 6f 3d 3d 31 20 26 26 20 7a 46 72 6f 6d   nTo==1 && zFrom
5f70: 5b 30 5d 3d 3d 27 3f 27 20 26 26 20 7a 54 6f 5b  [0]=='?' && zTo[
5f80: 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20  0]=='?' ){.     
5f90: 20 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73 74   pLang->iSubCost
5fa0: 20 3d 20 69 43 6f 73 74 3b 0a 20 20 20 20 7d 65   = iCost;.    }e
5fb0: 6c 73 65 7b 0a 20 20 20 20 20 20 45 64 69 74 44  lse{.      EditD
5fc0: 69 73 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 3b  ist3Cost *pCost;
5fd0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 74 72  .      int nExtr
5fe0: 61 20 3d 20 6e 46 72 6f 6d 20 2b 20 6e 54 6f 20  a = nFrom + nTo 
5ff0: 2d 20 34 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  - 4;.      if( n
6000: 45 78 74 72 61 3c 30 20 29 20 6e 45 78 74 72 61  Extra<0 ) nExtra
6010: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 6f 73   = 0;.      pCos
6020: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
6030: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73  oc( sizeof(*pCos
6040: 74 29 20 2b 20 6e 45 78 74 72 61 20 29 3b 0a 20  t) + nExtra );. 
6050: 20 20 20 20 20 69 66 28 20 70 43 6f 73 74 3d 3d       if( pCost==
6060: 30 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45  0 ){ rc = SQLITE
6070: 5f 4e 4f 4d 45 4d 3b 20 62 72 65 61 6b 3b 20 7d  _NOMEM; break; }
6080: 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 46  .      pCost->nF
6090: 72 6f 6d 20 3d 20 6e 46 72 6f 6d 3b 0a 20 20 20  rom = nFrom;.   
60a0: 20 20 20 70 43 6f 73 74 2d 3e 6e 54 6f 20 3d 20     pCost->nTo = 
60b0: 6e 54 6f 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  nTo;.      pCost
60c0: 2d 3e 69 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b  ->iCost = iCost;
60d0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43  .      memcpy(pC
60e0: 6f 73 74 2d 3e 61 2c 20 7a 46 72 6f 6d 2c 20 6e  ost->a, zFrom, n
60f0: 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 6d 65 6d  From);.      mem
6100: 63 70 79 28 70 43 6f 73 74 2d 3e 61 20 2b 20 6e  cpy(pCost->a + n
6110: 46 72 6f 6d 2c 20 7a 54 6f 2c 20 6e 54 6f 29 3b  From, zTo, nTo);
6120: 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 4e  .      pCost->pN
6130: 65 78 74 20 3d 20 70 4c 61 6e 67 2d 3e 70 43 6f  ext = pLang->pCo
6140: 73 74 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d  st;.      pLang-
6150: 3e 70 43 6f 73 74 20 3d 20 70 43 6f 73 74 3b 20  >pCost = pCost; 
6160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 32  .    }.  }.  rc2
6170: 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
6180: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
6190: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
61a0: 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 72 65  ) rc = rc2;.  re
61b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
61c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
61d0: 67 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 6f  gth (in bytes) o
61e0: 66 20 61 20 75 74 66 2d 38 20 63 68 61 72 61 63  f a utf-8 charac
61f0: 74 65 72 2e 20 20 4f 72 20 72 65 74 75 72 6e 20  ter.  Or return 
6200: 61 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 6f 66 20  a maximum.** of 
6210: 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  N..*/.static int
6220: 20 75 74 66 38 4c 65 6e 28 75 6e 73 69 67 6e 65   utf8Len(unsigne
6230: 64 20 63 68 61 72 20 63 2c 20 69 6e 74 20 4e 29  d char c, int N)
6240: 7b 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 31 3b  {.  int len = 1;
6250: 0a 20 20 69 66 28 20 63 3e 30 78 37 66 20 29 7b  .  if( c>0x7f ){
6260: 0a 20 20 20 20 69 66 28 20 28 63 26 30 78 65 30  .    if( (c&0xe0
6270: 29 3d 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20  )==0xc0 ){.     
6280: 20 6c 65 6e 20 3d 20 32 3b 0a 20 20 20 20 7d 65   len = 2;.    }e
6290: 6c 73 65 20 69 66 28 20 28 63 26 30 78 66 30 29  lse if( (c&0xf0)
62a0: 3d 3d 30 78 65 30 20 29 7b 0a 20 20 20 20 20 20  ==0xe0 ){.      
62b0: 6c 65 6e 20 3d 20 33 3b 0a 20 20 20 20 7d 65 6c  len = 3;.    }el
62c0: 73 65 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20  se{.      len = 
62d0: 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  4;.    }.  }.  i
62e0: 66 28 20 6c 65 6e 3e 4e 20 29 20 6c 65 6e 20 3d  f( len>N ) len =
62f0: 20 4e 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e   N;.  return len
6300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6310: 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
6320: 29 20 69 66 20 74 68 65 20 54 6f 20 73 69 64 65  ) if the To side
6330: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f   of the given co
6340: 73 74 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68  st matches.** th
6350: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 0a  e given string..
6360: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
6370: 74 63 68 54 6f 28 45 64 69 74 44 69 73 74 33 43  tchTo(EditDist3C
6380: 6f 73 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ost *p, const ch
6390: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
63a0: 20 69 66 28 20 70 2d 3e 6e 54 6f 3e 6e 20 29 20   if( p->nTo>n ) 
63b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
63c0: 73 74 72 6e 63 6d 70 28 70 2d 3e 61 2b 70 2d 3e  strncmp(p->a+p->
63d0: 6e 46 72 6f 6d 2c 20 7a 2c 20 70 2d 3e 6e 54 6f  nFrom, z, p->nTo
63e0: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
63f0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
6400: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
6410: 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  E (non-zero) if 
6420: 74 68 65 20 46 72 6f 6d 20 73 69 64 65 20 6f 66  the From side of
6430: 20 74 68 65 20 67 69 76 65 6e 20 63 6f 73 74 20   the given cost 
6440: 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 67  matches.** the g
6450: 69 76 65 6e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  iven string..*/.
6460: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68  static int match
6470: 46 72 6f 6d 28 45 64 69 74 44 69 73 74 33 43 6f  From(EditDist3Co
6480: 73 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  st *p, const cha
6490: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
64a0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 6f 6d  assert( p->nFrom
64b0: 3c 3d 6e 20 29 3b 0a 20 20 69 66 28 20 73 74 72  <=n );.  if( str
64c0: 6e 63 6d 70 28 70 2d 3e 61 2c 20 7a 2c 20 70 2d  ncmp(p->a, z, p-
64d0: 3e 6e 46 72 6f 6d 29 21 3d 30 20 29 20 72 65 74  >nFrom)!=0 ) ret
64e0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
64f0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
6500: 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
6510: 6f 29 20 6f 66 20 74 68 65 20 6e 65 78 74 20 46  o) of the next F
6520: 52 4f 4d 20 63 68 61 72 61 63 74 65 72 20 61 6e  ROM character an
6530: 64 20 74 68 65 20 6e 65 78 74 20 54 4f 0a 2a 2a  d the next TO.**
6540: 20 63 68 61 72 61 63 74 65 72 20 61 72 65 20 74   character are t
6550: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
6560: 69 63 20 69 6e 74 20 6d 61 74 63 68 46 72 6f 6d  ic int matchFrom
6570: 54 6f 28 0a 20 20 45 64 69 74 44 69 73 74 33 46  To(.  EditDist3F
6580: 72 6f 6d 53 74 72 69 6e 67 20 2a 70 53 74 72 2c  romString *pStr,
6590: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73    /* Left hand s
65a0: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  tring */.  int n
65b0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
65c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
65d0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 63 68  of comparison ch
65e0: 61 72 61 63 74 65 72 20 6f 6e 20 74 68 65 20 6c  aracter on the l
65f0: 65 66 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  eft */.  const c
6600: 68 61 72 20 2a 7a 32 2c 20 20 20 20 20 20 20 20  har *z2,        
6610: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61       /* Right-ha
6620: 6e 64 6c 20 63 6f 6d 70 61 72 69 73 6f 6e 20 63  ndl comparison c
6630: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
6640: 74 20 6e 32 20 20 20 20 20 20 20 20 20 20 20 20  t n2            
6650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
6660: 65 73 20 72 65 6d 61 69 6e 69 6e 67 20 69 6e 20  es remaining in 
6670: 7a 32 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  z2[] */.){.  int
6680: 20 62 31 20 3d 20 70 53 74 72 2d 3e 61 5b 6e 31   b1 = pStr->a[n1
6690: 5d 2e 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 62  ].nByte;.  if( b
66a0: 31 3e 6e 32 20 29 20 72 65 74 75 72 6e 20 30 3b  1>n2 ) return 0;
66b0: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 53  .  if( memcmp(pS
66c0: 74 72 2d 3e 7a 2b 6e 31 2c 20 7a 32 2c 20 62 31  tr->z+n1, z2, b1
66d0: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
66e0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
66f0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
6700: 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  EditDist3FromStr
6710: 69 6e 67 20 6f 62 6a 65 63 63 74 0a 2a 2f 0a 73  ing objecct.*/.s
6720: 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 44  tatic void editD
6730: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65  ist3FromStringDe
6740: 6c 65 74 65 28 45 64 69 74 44 69 73 74 33 46 72  lete(EditDist3Fr
6750: 6f 6d 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20  omString *p){.  
6760: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 20 29  int i;.  if( p )
6770: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
6780: 3c 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  <p->n; i++){.   
6790: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
67a0: 70 2d 3e 61 5b 69 5d 2e 61 70 44 65 6c 29 3b 0a  p->a[i].apDel);.
67b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
67c0: 65 65 28 70 2d 3e 61 5b 69 5d 2e 61 70 53 75 62  ee(p->a[i].apSub
67d0: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  st);.    }.    s
67e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
67f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
6800: 61 74 65 20 61 20 45 64 69 74 44 69 73 74 33 46  ate a EditDist3F
6810: 72 6f 6d 53 74 72 69 6e 67 20 6f 62 6a 65 63 74  romString object
6820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 64 69 74  ..*/.static Edit
6830: 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20  Dist3FromString 
6840: 2a 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74  *editDist3FromSt
6850: 72 69 6e 67 4e 65 77 28 0a 20 20 63 6f 6e 73 74  ringNew(.  const
6860: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a   EditDist3Lang *
6870: 70 4c 61 6e 67 2c 0a 20 20 63 6f 6e 73 74 20 63  pLang,.  const c
6880: 68 61 72 20 2a 7a 2c 0a 20 20 69 6e 74 20 6e 0a  har *z,.  int n.
6890: 29 7b 0a 20 20 45 64 69 74 44 69 73 74 33 46 72  ){.  EditDist3Fr
68a0: 6f 6d 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a  omString *pStr;.
68b0: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
68c0: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *p;.  int i;..  
68d0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
68e0: 6e 20 30 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29  n 0;.  if( n<0 )
68f0: 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
6900: 28 7a 29 3b 0a 20 20 70 53 74 72 20 3d 20 73 71  (z);.  pStr = sq
6910: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
6920: 7a 65 6f 66 28 2a 70 53 74 72 29 20 2b 20 73 69  zeof(*pStr) + si
6930: 7a 65 6f 66 28 70 53 74 72 2d 3e 61 5b 30 5d 29  zeof(pStr->a[0])
6940: 2a 6e 20 2b 20 6e 20 2b 20 31 20 29 3b 0a 20 20  *n + n + 1 );.  
6950: 69 66 28 20 70 53 74 72 3d 3d 30 20 29 20 72 65  if( pStr==0 ) re
6960: 74 75 72 6e 20 30 3b 0a 20 20 70 53 74 72 2d 3e  turn 0;.  pStr->
6970: 61 20 3d 20 28 45 64 69 74 44 69 73 74 33 46 72  a = (EditDist3Fr
6980: 6f 6d 2a 29 26 70 53 74 72 5b 31 5d 3b 0a 20 20  om*)&pStr[1];.  
6990: 6d 65 6d 73 65 74 28 70 53 74 72 2d 3e 61 2c 20  memset(pStr->a, 
69a0: 30 2c 20 73 69 7a 65 6f 66 28 70 53 74 72 2d 3e  0, sizeof(pStr->
69b0: 61 5b 30 5d 29 2a 6e 29 3b 0a 20 20 70 53 74 72  a[0])*n);.  pStr
69c0: 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 53 74 72 2d  ->n = n;.  pStr-
69d0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 53 74  >z = (char*)&pSt
69e0: 72 2d 3e 61 5b 6e 5d 3b 0a 20 20 6d 65 6d 63 70  r->a[n];.  memcp
69f0: 79 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c 20 6e 2b  y(pStr->z, z, n+
6a00: 31 29 3b 0a 20 20 69 66 28 20 6e 20 26 26 20 7a  1);.  if( n && z
6a10: 5b 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20  [n-1]=='*' ){.  
6a20: 20 20 70 53 74 72 2d 3e 69 73 50 72 65 66 69 78    pStr->isPrefix
6a30: 20 3d 20 31 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20   = 1;.    n--;. 
6a40: 20 20 20 70 53 74 72 2d 3e 6e 2d 2d 3b 0a 20 20     pStr->n--;.  
6a50: 20 20 70 53 74 72 2d 3e 7a 5b 6e 5d 20 3d 20 30    pStr->z[n] = 0
6a60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6a70: 53 74 72 2d 3e 69 73 50 72 65 66 69 78 20 3d 20  Str->isPrefix = 
6a80: 30 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  0;.  }..  for(i=
6a90: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
6aa0: 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 20    EditDist3From 
6ab0: 2a 70 46 72 6f 6d 20 3d 20 26 70 53 74 72 2d 3e  *pFrom = &pStr->
6ac0: 61 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  a[i];.    memset
6ad0: 28 70 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pFrom, 0, sizeo
6ae0: 66 28 2a 70 46 72 6f 6d 29 29 3b 0a 20 20 20 20  f(*pFrom));.    
6af0: 70 46 72 6f 6d 2d 3e 6e 42 79 74 65 20 3d 20 75  pFrom->nByte = u
6b00: 74 66 38 4c 65 6e 28 28 75 6e 73 69 67 6e 65 64  tf8Len((unsigned
6b10: 20 63 68 61 72 29 7a 5b 69 5d 2c 20 6e 2d 69 29   char)z[i], n-i)
6b20: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 61 6e  ;.    for(p=pLan
6b30: 67 2d 3e 70 43 6f 73 74 3b 20 70 3b 20 70 3d 70  g->pCost; p; p=p
6b40: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
6b50: 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a  EditDist3Cost **
6b60: 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28  apNew;.      if(
6b70: 20 69 2b 70 2d 3e 6e 46 72 6f 6d 3e 6e 20 29 20   i+p->nFrom>n ) 
6b80: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6b90: 69 66 28 20 6d 61 74 63 68 46 72 6f 6d 28 70 2c  if( matchFrom(p,
6ba0: 20 7a 2b 69 2c 20 6e 2d 69 29 3d 3d 30 20 29 20   z+i, n-i)==0 ) 
6bb0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6bc0: 69 66 28 20 70 2d 3e 6e 54 6f 3d 3d 30 20 29 7b  if( p->nTo==0 ){
6bd0: 0a 20 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d  .        apNew =
6be0: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
6bf0: 28 70 46 72 6f 6d 2d 3e 61 70 44 65 6c 2c 0a 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 20 73                 s
6c20: 69 7a 65 6f 66 28 2a 61 70 4e 65 77 29 2a 28 70  izeof(*apNew)*(p
6c30: 46 72 6f 6d 2d 3e 6e 44 65 6c 2b 31 29 29 3b 0a  From->nDel+1));.
6c40: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 4e 65          if( apNe
6c50: 77 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  w==0 ) break;.  
6c60: 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 61 70 44        pFrom->apD
6c70: 65 6c 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  el = apNew;.    
6c80: 20 20 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d      apNew[pFrom-
6c90: 3e 6e 44 65 6c 2b 2b 5d 20 3d 20 70 3b 0a 20 20  >nDel++] = p;.  
6ca0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6cb0: 20 20 20 61 70 4e 65 77 20 3d 20 73 71 6c 69 74     apNew = sqlit
6cc0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 46 72 6f 6d  e3_realloc(pFrom
6cd0: 2d 3e 61 70 53 75 62 73 74 2c 0a 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 20 73 69 7a 65 6f             sizeo
6d00: 66 28 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f 6d  f(*apNew)*(pFrom
6d10: 2d 3e 6e 53 75 62 73 74 2b 31 29 29 3b 0a 20 20  ->nSubst+1));.  
6d20: 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d        if( apNew=
6d30: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
6d40: 20 20 20 20 70 46 72 6f 6d 2d 3e 61 70 53 75 62      pFrom->apSub
6d50: 73 74 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  st = apNew;.    
6d60: 20 20 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d      apNew[pFrom-
6d70: 3e 6e 53 75 62 73 74 2b 2b 5d 20 3d 20 70 3b 0a  >nSubst++] = p;.
6d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6d90: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
6da0: 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   editDist3FromSt
6db0: 72 69 6e 67 44 65 6c 65 74 65 28 70 53 74 72 29  ringDelete(pStr)
6dc0: 3b 0a 20 20 20 20 20 20 70 53 74 72 20 3d 20 30  ;.      pStr = 0
6dd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6df0: 6e 20 70 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pStr;.}../*.**
6e00: 20 55 70 64 61 74 65 20 65 6e 74 72 79 20 6d 5b   Update entry m[
6e10: 69 5d 20 73 75 63 68 20 74 68 61 74 20 69 74 20  i] such that it 
6e20: 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  is the minimum o
6e30: 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  f its current va
6e40: 6c 75 65 0a 2a 2a 20 61 6e 64 20 6d 5b 6a 5d 2b  lue.** and m[j]+
6e50: 69 43 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  iCost..**.** If 
6e60: 74 68 65 20 69 43 6f 73 74 20 69 73 20 31 2c 30  the iCost is 1,0
6e70: 30 30 2c 30 30 30 20 6f 72 20 67 72 65 61 74 65  00,000 or greate
6e80: 72 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72  r, then consider
6e90: 20 74 68 65 20 63 6f 73 74 20 74 6f 20 62 65 0a   the cost to be.
6ea0: 2a 2a 20 69 6e 66 69 6e 69 74 65 20 61 6e 64 20  ** infinite and 
6eb0: 73 6b 69 70 20 74 68 65 20 75 70 64 61 74 65 2e  skip the update.
6ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6ed0: 75 70 64 61 74 65 43 6f 73 74 28 0a 20 20 75 6e  updateCost(.  un
6ee0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6d 2c 0a 20  signed int *m,. 
6ef0: 20 69 6e 74 20 69 2c 0a 20 20 69 6e 74 20 6a 2c   int i,.  int j,
6f00: 0a 20 20 69 6e 74 20 69 43 6f 73 74 0a 29 7b 0a  .  int iCost.){.
6f10: 20 20 61 73 73 65 72 74 28 20 69 43 6f 73 74 3e    assert( iCost>
6f20: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 73  =0 );.  if( iCos
6f30: 74 3c 31 30 30 30 30 20 29 7b 0a 20 20 20 20 75  t<10000 ){.    u
6f40: 6e 73 69 67 6e 65 64 20 69 6e 74 20 62 20 3d 20  nsigned int b = 
6f50: 6d 5b 6a 5d 20 2b 20 69 43 6f 73 74 3b 0a 20 20  m[j] + iCost;.  
6f60: 20 20 69 66 28 20 62 3c 6d 5b 69 5d 20 29 20 6d    if( b<m[i] ) m
6f70: 5b 69 5d 20 3d 20 62 3b 0a 20 20 7d 0a 7d 0a 0a  [i] = b;.  }.}..
6f80: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 65  /* Compute the e
6f90: 64 69 74 20 64 69 73 74 61 6e 63 65 20 62 65 74  dit distance bet
6fa0: 77 65 65 6e 20 74 77 6f 20 73 74 72 69 6e 67 73  ween two strings
6fb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
6fc0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
6fd0: 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
6fe0: 6d 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68  mber which is th
6ff0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  e error code..**
7000: 0a 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69  .** If pnMatch i
7010: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
7020: 20 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74   *pnMatch is set
7030: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
7040: 66 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20  f characters.** 
7050: 28 6e 6f 74 20 62 79 74 65 73 29 20 69 6e 20 7a  (not bytes) in z
7060: 32 20 74 68 61 74 20 6d 61 74 63 68 65 64 20 74  2 that matched t
7070: 68 65 20 73 65 61 72 63 68 20 70 61 74 74 65 72  he search patter
7080: 6e 20 69 6e 20 2a 70 46 72 6f 6d 2e 20 49 66 20  n in *pFrom. If 
7090: 70 46 72 6f 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f  pFrom does.** no
70a0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 61  t contain the pa
70b0: 74 74 65 72 6e 20 66 6f 72 20 61 20 70 72 65 66  ttern for a pref
70c0: 69 78 2d 73 65 61 72 63 68 2c 20 74 68 65 6e 20  ix-search, then 
70d0: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
70e0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
70f0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 32  characters in z2
7100: 2e 20 49 66 20 70 46 72 6f 6d 20 64 6f 65 73 20  . If pFrom does 
7110: 63 6f 6e 74 61 69 6e 20 61 20 70 72 65 66 69 78  contain a prefix
7120: 20 73 65 61 72 63 68 20 70 61 74 74 65 72 6e 2c   search pattern,
7130: 20 74 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 74   then.** it is t
7140: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
7150: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 70  racters in the p
7160: 72 65 66 69 78 20 6f 66 20 7a 32 20 74 68 61 74  refix of z2 that
7170: 20 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20 0a   was deemed to .
7180: 2a 2a 20 6d 61 74 63 68 20 70 46 72 6f 6d 2e 0a  ** match pFrom..
7190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64  */.static int ed
71a0: 69 74 44 69 73 74 33 43 6f 72 65 28 0a 20 20 45  itDist3Core(.  E
71b0: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
71c0: 6e 67 20 2a 70 46 72 6f 6d 2c 20 20 2f 2a 20 54  ng *pFrom,  /* T
71d0: 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a  he FROM string *
71e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
71f0: 7a 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  z2,             
7200: 20 2f 2a 20 54 68 65 20 54 4f 20 73 74 72 69 6e   /* The TO strin
7210: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 20  g */.  int n2,  
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
7240: 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a   the TO string *
7250: 2f 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69  /.  const EditDi
7260: 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 20  st3Lang *pLang, 
7270: 20 2f 2a 20 45 64 69 74 20 77 65 69 67 68 74 73   /* Edit weights
7280: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
7290: 72 20 6c 61 6e 67 75 61 67 65 20 49 44 20 2a 2f  r language ID */
72a0: 0a 20 20 69 6e 74 20 2a 70 6e 4d 61 74 63 68 20  .  int *pnMatch 
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72c0: 2f 2a 20 4f 55 54 3a 20 43 68 61 72 61 63 74 65  /* OUT: Characte
72d0: 72 73 20 69 6e 20 6d 61 74 63 68 65 64 20 70 72  rs in matched pr
72e0: 65 66 69 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  efix */.){.  int
72f0: 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 31 2c   k, n;.  int i1,
7300: 20 62 31 3b 0a 20 20 69 6e 74 20 69 32 2c 20 62   b1;.  int i2, b
7310: 32 3b 0a 20 20 45 64 69 74 44 69 73 74 33 46 72  2;.  EditDist3Fr
7320: 6f 6d 53 74 72 69 6e 67 20 66 20 3d 20 2a 70 46  omString f = *pF
7330: 72 6f 6d 3b 0a 20 20 45 64 69 74 44 69 73 74 33  rom;.  EditDist3
7340: 54 6f 20 2a 61 32 3b 0a 20 20 75 6e 73 69 67 6e  To *a2;.  unsign
7350: 65 64 20 69 6e 74 20 2a 6d 3b 0a 20 20 69 6e 74  ed int *m;.  int
7360: 20 73 7a 52 6f 77 3b 0a 20 20 45 64 69 74 44 69   szRow;.  EditDi
7370: 73 74 33 43 6f 73 74 20 2a 70 3b 0a 20 20 69 6e  st3Cost *p;.  in
7380: 74 20 72 65 73 3b 0a 0a 20 20 2f 2a 20 61 6c 6c  t res;..  /* all
7390: 6f 63 61 74 65 20 74 68 65 20 57 61 67 6e 65 72  ocate the Wagner
73a0: 20 6d 61 74 72 69 78 20 61 6e 64 20 74 68 65 20   matrix and the 
73b0: 61 54 6f 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  aTo[] array for 
73c0: 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f  the TO string */
73d0: 0a 20 20 6e 20 3d 20 28 66 2e 6e 2b 31 29 2a 28  .  n = (f.n+1)*(
73e0: 6e 32 2b 31 29 3b 0a 20 20 6e 20 3d 20 28 6e 2b  n2+1);.  n = (n+
73f0: 31 29 26 7e 31 3b 0a 20 20 6d 20 3d 20 73 71 6c  1)&~1;.  m = sql
7400: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2a 73  ite3_malloc( n*s
7410: 69 7a 65 6f 66 28 6d 5b 30 5d 29 20 2b 20 73 69  izeof(m[0]) + si
7420: 7a 65 6f 66 28 61 32 5b 30 5d 29 2a 6e 32 20 29  zeof(a2[0])*n2 )
7430: 3b 0a 20 20 69 66 28 20 6d 3d 3d 30 20 29 20 72  ;.  if( m==0 ) r
7440: 65 74 75 72 6e 20 2d 31 3b 20 20 20 20 20 20 20  eturn -1;       
7450: 20 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 6d       /* Out of m
7460: 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 32 20 3d 20  emory */.  a2 = 
7470: 28 45 64 69 74 44 69 73 74 33 54 6f 2a 29 26 6d  (EditDist3To*)&m
7480: 5b 6e 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 32  [n];.  memset(a2
7490: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 32 5b 30  , 0, sizeof(a2[0
74a0: 5d 29 2a 6e 32 29 3b 0a 0a 20 20 2f 2a 20 46 69  ])*n2);..  /* Fi
74b0: 6c 6c 20 69 6e 20 74 68 65 20 61 31 5b 5d 20 6d  ll in the a1[] m
74c0: 61 74 72 69 78 20 66 6f 72 20 61 6c 6c 20 63 68  atrix for all ch
74d0: 61 72 61 63 74 65 72 73 20 6f 66 20 74 68 65 20  aracters of the 
74e0: 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 66  TO string */.  f
74f0: 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b 20  or(i2=0; i2<n2; 
7500: 69 32 2b 2b 29 7b 0a 20 20 20 20 61 32 5b 69 32  i2++){.    a2[i2
7510: 5d 2e 6e 42 79 74 65 20 3d 20 75 74 66 38 4c 65  ].nByte = utf8Le
7520: 6e 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n((unsigned char
7530: 29 7a 32 5b 69 32 5d 2c 20 6e 32 2d 69 32 29 3b  )z2[i2], n2-i2);
7540: 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 61 6e 67  .    for(p=pLang
7550: 2d 3e 70 43 6f 73 74 3b 20 70 3b 20 70 3d 70 2d  ->pCost; p; p=p-
7560: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 45  >pNext){.      E
7570: 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 61  ditDist3Cost **a
7580: 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28 20  pNew;.      if( 
7590: 70 2d 3e 6e 46 72 6f 6d 3e 30 20 29 20 63 6f 6e  p->nFrom>0 ) con
75a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
75b0: 20 69 32 2b 70 2d 3e 6e 54 6f 3e 6e 32 20 29 20   i2+p->nTo>n2 ) 
75c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
75d0: 69 66 28 20 6d 61 74 63 68 54 6f 28 70 2c 20 7a  if( matchTo(p, z
75e0: 32 2b 69 32 2c 20 6e 32 2d 69 32 29 3d 3d 30 20  2+i2, n2-i2)==0 
75f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7600: 20 20 61 32 5b 69 32 5d 2e 6e 49 6e 73 2b 2b 3b    a2[i2].nIns++;
7610: 0a 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 73  .      apNew = s
7620: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
7630: 32 5b 69 32 5d 2e 61 70 49 6e 73 2c 20 73 69 7a  2[i2].apIns, siz
7640: 65 6f 66 28 2a 61 70 4e 65 77 29 2a 61 32 5b 69  eof(*apNew)*a2[i
7650: 32 5d 2e 6e 49 6e 73 29 3b 0a 20 20 20 20 20 20  2].nIns);.      
7660: 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a  if( apNew==0 ){.
7670: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31          res = -1
7680: 3b 20 20 2f 2a 20 4f 75 74 20 6f 66 20 6d 65 6d  ;  /* Out of mem
7690: 6f 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  ory */.        g
76a0: 6f 74 6f 20 65 64 69 74 44 69 73 74 33 41 62 6f  oto editDist3Abo
76b0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
76c0: 20 20 61 32 5b 69 32 5d 2e 61 70 49 6e 73 20 3d    a2[i2].apIns =
76d0: 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 32   apNew;.      a2
76e0: 5b 69 32 5d 2e 61 70 49 6e 73 5b 61 32 5b 69 32  [i2].apIns[a2[i2
76f0: 5d 2e 6e 49 6e 73 2d 31 5d 20 3d 20 70 3b 0a 20  ].nIns-1] = p;. 
7700: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
7710: 72 65 70 61 72 65 20 74 6f 20 63 6f 6d 70 75 74  repare to comput
7720: 65 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 65 64  e the minimum ed
7730: 69 74 20 64 69 73 74 61 6e 63 65 20 2a 2f 0a 20  it distance */. 
7740: 20 73 7a 52 6f 77 20 3d 20 66 2e 6e 2b 31 3b 0a   szRow = f.n+1;.
7750: 20 20 6d 65 6d 73 65 74 28 6d 2c 20 30 78 30 31    memset(m, 0x01
7760: 2c 20 28 6e 32 2b 31 29 2a 73 7a 52 6f 77 2a 73  , (n2+1)*szRow*s
7770: 69 7a 65 6f 66 28 6d 5b 30 5d 29 29 3b 0a 20 20  izeof(m[0]));.  
7780: 6d 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  m[0] = 0;..  /* 
7790: 46 69 72 73 74 20 66 69 6c 6c 20 69 6e 20 74 68  First fill in th
77a0: 65 20 74 6f 70 2d 72 6f 77 20 6f 66 20 74 68 65  e top-row of the
77b0: 20 6d 61 74 72 69 78 20 77 69 74 68 20 46 52 4f   matrix with FRO
77c0: 4d 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 73  M deletion costs
77d0: 20 2a 2f 0a 20 20 66 6f 72 28 69 31 3d 30 3b 20   */.  for(i1=0; 
77e0: 69 31 3c 66 2e 6e 3b 20 69 31 20 2b 3d 20 62 31  i1<f.n; i1 += b1
77f0: 29 7b 0a 20 20 20 20 62 31 20 3d 20 66 2e 61 5b  ){.    b1 = f.a[
7800: 69 31 5d 2e 6e 42 79 74 65 3b 0a 20 20 20 20 75  i1].nByte;.    u
7810: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 69 31 2b  pdateCost(m, i1+
7820: 62 31 2c 20 69 31 2c 20 70 4c 61 6e 67 2d 3e 69  b1, i1, pLang->i
7830: 44 65 6c 43 6f 73 74 29 3b 0a 20 20 20 20 66 6f  DelCost);.    fo
7840: 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d  r(k=0; k<f.a[i1]
7850: 2e 6e 44 65 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20  .nDel; k++){.   
7860: 20 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61     p = f.a[i1].a
7870: 70 44 65 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 75  pDel[k];.      u
7880: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 69 31 2b  pdateCost(m, i1+
7890: 70 2d 3e 6e 46 72 6f 6d 2c 20 69 31 2c 20 70 2d  p->nFrom, i1, p-
78a0: 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20  >iCost);.    }. 
78b0: 20 7d 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e   }..  /* Fill in
78c0: 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
78d0: 72 6f 77 73 2c 20 74 6f 70 2d 74 6f 2d 62 6f 74  rows, top-to-bot
78e0: 74 6f 6d 2c 20 6c 65 66 74 2d 74 6f 2d 72 69 67  tom, left-to-rig
78f0: 68 74 20 2a 2f 0a 20 20 66 6f 72 28 69 32 3d 30  ht */.  for(i2=0
7900: 3b 20 69 32 3c 6e 32 3b 20 69 32 20 2b 3d 20 62  ; i2<n2; i2 += b
7910: 32 29 7b 0a 20 20 20 20 69 6e 74 20 72 78 3b 20  2){.    int rx; 
7920: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
7930: 20 69 6e 64 65 78 20 66 6f 72 20 63 75 72 72 65   index for curre
7940: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e  nt row */.    in
7950: 74 20 72 78 70 3b 20 20 20 20 20 2f 2a 20 53 74  t rxp;     /* St
7960: 61 72 74 69 6e 67 20 69 6e 64 65 78 20 66 6f 72  arting index for
7970: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
7980: 0a 20 20 20 20 62 32 20 3d 20 61 32 5b 69 32 5d  .    b2 = a2[i2]
7990: 2e 6e 42 79 74 65 3b 0a 20 20 20 20 72 78 20 3d  .nByte;.    rx =
79a0: 20 73 7a 52 6f 77 2a 28 69 32 2b 62 32 29 3b 0a   szRow*(i2+b2);.
79b0: 20 20 20 20 72 78 70 20 3d 20 73 7a 52 6f 77 2a      rxp = szRow*
79c0: 69 32 3b 0a 20 20 20 20 75 70 64 61 74 65 43 6f  i2;.    updateCo
79d0: 73 74 28 6d 2c 20 72 78 2c 20 72 78 70 2c 20 70  st(m, rx, rxp, p
79e0: 4c 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 29 3b  Lang->iInsCost);
79f0: 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
7a00: 61 32 5b 69 32 5d 2e 6e 49 6e 73 3b 20 6b 2b 2b  a2[i2].nIns; k++
7a10: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 61 32 5b  ){.      p = a2[
7a20: 69 32 5d 2e 61 70 49 6e 73 5b 6b 5d 3b 0a 20 20  i2].apIns[k];.  
7a30: 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d      updateCost(m
7a40: 2c 20 73 7a 52 6f 77 2a 28 69 32 2b 70 2d 3e 6e  , szRow*(i2+p->n
7a50: 54 6f 29 2c 20 72 78 70 2c 20 70 2d 3e 69 43 6f  To), rxp, p->iCo
7a60: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  st);.    }.    f
7a70: 6f 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b  or(i1=0; i1<f.n;
7a80: 20 69 31 2b 3d 62 31 29 7b 0a 20 20 20 20 20 20   i1+=b1){.      
7a90: 69 6e 74 20 63 78 3b 20 20 20 20 2f 2a 20 49 6e  int cx;    /* In
7aa0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63  dex of current c
7ab0: 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ell */.      int
7ac0: 20 63 78 70 3b 20 20 20 2f 2a 20 49 6e 64 65 78   cxp;   /* Index
7ad0: 20 6f 66 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61   of cell immedia
7ae0: 74 65 6c 79 20 74 6f 20 74 68 65 20 6c 65 66 74  tely to the left
7af0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 78   */.      int cx
7b00: 64 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  d;   /* Index of
7b10: 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
7b20: 74 20 61 6e 64 20 6f 6e 65 20 72 6f 77 20 61 62  t and one row ab
7b30: 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ove */.      int
7b40: 20 63 78 75 3b 20 20 20 2f 2a 20 49 6e 64 65 78   cxu;   /* Index
7b50: 20 6f 66 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61   of cell immedia
7b60: 74 65 6c 79 20 61 62 6f 76 65 20 2a 2f 0a 20 20  tely above */.  
7b70: 20 20 20 20 62 31 20 3d 20 66 2e 61 5b 69 31 5d      b1 = f.a[i1]
7b80: 2e 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 63 78  .nByte;.      cx
7b90: 70 20 3d 20 72 78 20 2b 20 69 31 3b 0a 20 20 20  p = rx + i1;.   
7ba0: 20 20 20 63 78 20 3d 20 63 78 70 20 2b 20 62 31     cx = cxp + b1
7bb0: 3b 0a 20 20 20 20 20 20 63 78 64 20 3d 20 72 78  ;.      cxd = rx
7bc0: 70 20 2b 20 69 31 3b 0a 20 20 20 20 20 20 63 78  p + i1;.      cx
7bd0: 75 20 3d 20 63 78 64 20 2b 20 62 31 3b 0a 20 20  u = cxd + b1;.  
7be0: 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d      updateCost(m
7bf0: 2c 20 63 78 2c 20 63 78 70 2c 20 70 4c 61 6e 67  , cx, cxp, pLang
7c00: 2d 3e 69 44 65 6c 43 6f 73 74 29 3b 0a 20 20 20  ->iDelCost);.   
7c10: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e     for(k=0; k<f.
7c20: 61 5b 69 31 5d 2e 6e 44 65 6c 3b 20 6b 2b 2b 29  a[i1].nDel; k++)
7c30: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66 2e  {.        p = f.
7c40: 61 5b 69 31 5d 2e 61 70 44 65 6c 5b 6b 5d 3b 0a  a[i1].apDel[k];.
7c50: 20 20 20 20 20 20 20 20 75 70 64 61 74 65 43 6f          updateCo
7c60: 73 74 28 6d 2c 20 63 78 70 2b 70 2d 3e 6e 46 72  st(m, cxp+p->nFr
7c70: 6f 6d 2c 20 63 78 70 2c 20 70 2d 3e 69 43 6f 73  om, cxp, p->iCos
7c80: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
7c90: 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20    updateCost(m, 
7ca0: 63 78 2c 20 63 78 75 2c 20 70 4c 61 6e 67 2d 3e  cx, cxu, pLang->
7cb0: 69 49 6e 73 43 6f 73 74 29 3b 0a 20 20 20 20 20  iInsCost);.     
7cc0: 20 69 66 28 20 6d 61 74 63 68 46 72 6f 6d 54 6f   if( matchFromTo
7cd0: 28 26 66 2c 20 69 31 2c 20 7a 32 2b 69 32 2c 20  (&f, i1, z2+i2, 
7ce0: 6e 32 2d 69 32 29 20 29 7b 0a 20 20 20 20 20 20  n2-i2) ){.      
7cf0: 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20    updateCost(m, 
7d00: 63 78 2c 20 63 78 64 2c 20 30 29 3b 0a 20 20 20  cx, cxd, 0);.   
7d10: 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74     }.      updat
7d20: 65 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 64  eCost(m, cx, cxd
7d30: 2c 20 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73  , pLang->iSubCos
7d40: 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  t);.      for(k=
7d50: 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 53 75  0; k<f.a[i1].nSu
7d60: 62 73 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  bst; k++){.     
7d70: 20 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61     p = f.a[i1].a
7d80: 70 53 75 62 73 74 5b 6b 5d 3b 0a 20 20 20 20 20  pSubst[k];.     
7d90: 20 20 20 69 66 28 20 6d 61 74 63 68 54 6f 28 70     if( matchTo(p
7da0: 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29 20  , z2+i2, n2-i2) 
7db0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 64  ){.          upd
7dc0: 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 64 2b 70  ateCost(m, cxd+p
7dd0: 2d 3e 6e 46 72 6f 6d 2b 73 7a 52 6f 77 2a 70 2d  ->nFrom+szRow*p-
7de0: 3e 6e 54 6f 2c 20 63 78 64 2c 20 70 2d 3e 69 43  >nTo, cxd, p->iC
7df0: 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ost);.        }.
7e00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7e10: 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e 61  }..#if 0  /* Ena
7e20: 62 6c 65 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ble for debuggin
7e30: 67 20 2a 2f 0a 20 20 70 72 69 6e 74 66 28 22 20  g */.  printf(" 
7e40: 20 20 20 20 20 20 20 20 5e 22 29 3b 0a 20 20 66          ^");.  f
7e50: 6f 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b  or(i1=0; i1<f.n;
7e60: 20 69 31 2b 2b 29 20 70 72 69 6e 74 66 28 22 20   i1++) printf(" 
7e70: 25 63 2d 25 32 78 22 2c 20 66 2e 7a 5b 69 31 5d  %c-%2x", f.z[i1]
7e80: 2c 20 66 2e 7a 5b 69 31 5d 26 30 78 66 66 29 3b  , f.z[i1]&0xff);
7e90: 0a 20 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20  .  printf("\n   
7ea0: 5e 3a 22 29 3b 0a 20 20 66 6f 72 28 69 31 3d 30  ^:");.  for(i1=0
7eb0: 3b 20 69 31 3c 73 7a 52 6f 77 3b 20 69 31 2b 2b  ; i1<szRow; i1++
7ec0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 6d  ){.    int v = m
7ed0: 5b 69 31 5d 3b 0a 20 20 20 20 69 66 28 20 76 3e  [i1];.    if( v>
7ee0: 39 39 39 39 20 29 20 70 72 69 6e 74 66 28 22 20  9999 ) printf(" 
7ef0: 2a 2a 2a 2a 22 29 3b 0a 20 20 20 20 65 6c 73 65  ****");.    else
7f00: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
7f10: 22 20 25 34 64 22 2c 20 76 29 3b 0a 20 20 7d 0a  " %4d", v);.  }.
7f20: 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
7f30: 20 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e    for(i2=0; i2<n
7f40: 32 3b 20 69 32 2b 2b 29 7b 0a 20 20 20 20 70 72  2; i2++){.    pr
7f50: 69 6e 74 66 28 22 25 63 2d 25 30 32 78 3a 22 2c  intf("%c-%02x:",
7f60: 20 7a 32 5b 69 32 5d 2c 20 7a 32 5b 69 32 5d 26   z2[i2], z2[i2]&
7f70: 30 78 66 66 29 3b 0a 20 20 20 20 66 6f 72 28 69  0xff);.    for(i
7f80: 31 3d 30 3b 20 69 31 3c 73 7a 52 6f 77 3b 20 69  1=0; i1<szRow; i
7f90: 31 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  1++){.      int 
7fa0: 76 20 3d 20 6d 5b 28 69 32 2b 31 29 2a 73 7a 52  v = m[(i2+1)*szR
7fb0: 6f 77 2b 69 31 5d 3b 0a 20 20 20 20 20 20 69 66  ow+i1];.      if
7fc0: 28 20 76 3e 39 39 39 39 20 29 20 70 72 69 6e 74  ( v>9999 ) print
7fd0: 66 28 22 20 2a 2a 2a 2a 22 29 3b 0a 20 20 20 20  f(" ****");.    
7fe0: 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 70    else         p
7ff0: 72 69 6e 74 66 28 22 20 25 34 64 22 2c 20 76 29  rintf(" %4d", v)
8000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  ;.    }.    prin
8010: 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65  tf("\n");.  }.#e
8020: 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ndif..  /* Free 
8030: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
8040: 6e 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ns and return th
8050: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 72 65  e result */.  re
8060: 73 20 3d 20 28 69 6e 74 29 6d 5b 73 7a 52 6f 77  s = (int)m[szRow
8070: 2a 28 6e 32 2b 31 29 2d 31 5d 3b 0a 20 20 6e 20  *(n2+1)-1];.  n 
8080: 3d 20 6e 32 3b 0a 20 20 69 66 28 20 66 2e 69 73  = n2;.  if( f.is
8090: 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 66 6f  Prefix ){.    fo
80a0: 72 28 69 32 3d 31 3b 20 69 32 3c 3d 6e 32 3b 20  r(i2=1; i2<=n2; 
80b0: 69 32 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  i2++){.      int
80c0: 20 62 20 3d 20 6d 5b 73 7a 52 6f 77 2a 69 32 2d   b = m[szRow*i2-
80d0: 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 62 3c  1];.      if( b<
80e0: 3d 72 65 73 20 29 7b 20 0a 20 20 20 20 20 20 20  =res ){ .       
80f0: 20 72 65 73 20 3d 20 62 3b 0a 20 20 20 20 20 20   res = b;.      
8100: 20 20 6e 20 3d 20 69 32 20 2d 20 31 3b 0a 20 20    n = i2 - 1;.  
8110: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8120: 20 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29 7b    if( pnMatch ){
8130: 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 20  .    int nExtra 
8140: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  = 0;.    for(k=0
8150: 3b 20 6b 3c 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ; k<n; k++){.   
8160: 20 20 20 69 66 28 20 28 7a 32 5b 6b 5d 20 26 20     if( (z2[k] & 
8170: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 45  0xc0)==0x80 ) nE
8180: 78 74 72 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xtra++;.    }.  
8190: 20 20 2a 70 6e 4d 61 74 63 68 20 3d 20 6e 20 2d    *pnMatch = n -
81a0: 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 65 64   nExtra;.  }..ed
81b0: 69 74 44 69 73 74 33 41 62 6f 72 74 3a 0a 20 20  itDist3Abort:.  
81c0: 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b  for(i2=0; i2<n2;
81d0: 20 69 32 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66   i2++) sqlite3_f
81e0: 72 65 65 28 61 32 5b 69 32 5d 2e 61 70 49 6e 73  ree(a2[i2].apIns
81f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
8200: 65 28 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(m);.  return r
8210: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  es;.}../*.** Get
8220: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
8230: 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 6f 62  EditDist3Lang ob
8240: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
8250: 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c  const EditDist3L
8260: 61 6e 67 20 2a 65 64 69 74 44 69 73 74 33 46 69  ang *editDist3Fi
8270: 6e 64 4c 61 6e 67 28 0a 20 20 45 64 69 74 44 69  ndLang(.  EditDi
8280: 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  st3Config *pConf
8290: 69 67 2c 0a 20 20 69 6e 74 20 69 4c 61 6e 67 0a  ig,.  int iLang.
82a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
82b0: 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
82c0: 2d 3e 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20  ->nLang; i++){. 
82d0: 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
82e0: 61 5b 69 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61 6e  a[i].iLang==iLan
82f0: 67 20 29 20 72 65 74 75 72 6e 20 26 70 43 6f 6e  g ) return &pCon
8300: 66 69 67 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  fig->a[i];.  }. 
8310: 20 72 65 74 75 72 6e 20 26 65 64 69 74 44 69 73   return &editDis
8320: 74 33 4c 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  t3Lang;.}../*.**
8330: 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65 64   Function:    ed
8340: 69 74 64 69 73 74 33 28 41 2c 42 2c 69 4c 61 6e  itdist3(A,B,iLan
8350: 67 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  g).**           
8360: 20 20 20 65 64 69 74 64 69 73 74 33 28 74 61 62     editdist3(tab
8370: 6c 65 6e 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52 65  lename).**.** Re
8380: 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  turn the cost of
8390: 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74   transforming st
83a0: 72 69 6e 67 20 41 20 69 6e 74 6f 20 73 74 72 69  ring A into stri
83b0: 6e 67 20 42 20 75 73 69 6e 67 20 65 64 69 74 0a  ng B using edit.
83c0: 2a 2a 20 77 65 69 67 68 74 73 20 66 6f 72 20 69  ** weights for i
83d0: 4c 61 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Lang..**.** The 
83e0: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61 64  second form load
83f0: 73 20 65 64 69 74 20 77 65 69 67 68 74 73 20 69  s edit weights i
8400: 6e 74 6f 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  nto memory from 
8410: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
8420: 69 63 20 76 6f 69 64 20 65 64 69 74 44 69 73 74  ic void editDist
8430: 33 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  3SqlFunc(.  sqli
8440: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
8450: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
8460: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
8470: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 45 64  e **argv.){.  Ed
8480: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70  itDist3Config *p
8490: 43 6f 6e 66 69 67 20 3d 20 28 45 64 69 74 44 69  Config = (EditDi
84a0: 73 74 33 43 6f 6e 66 69 67 2a 29 73 71 6c 69 74  st3Config*)sqlit
84b0: 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e  e3_user_data(con
84c0: 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  text);.  sqlite3
84d0: 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63   *db = sqlite3_c
84e0: 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65  ontext_db_handle
84f0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 6e 74  (context);.  int
8500: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 3d   rc;.  if( argc=
8510: 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =1 ){.    const 
8520: 63 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20 28  char *zTable = (
8530: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
8540: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8550: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 63 20  rgv[0]);.    rc 
8560: 3d 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69  = editDist3Confi
8570: 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 64  gLoad(pConfig, d
8580: 62 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  b, zTable);.    
8590: 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33  if( rc ) sqlite3
85a0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
85b0: 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b  de(context, rc);
85c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
85d0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 20 3d 20 28  nst char *zA = (
85e0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
85f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8600: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 63 6f 6e  rgv[0]);.    con
8610: 73 74 20 63 68 61 72 20 2a 7a 42 20 3d 20 28 63  st char *zB = (c
8620: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
8630: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8640: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 6e 74 20  gv[1]);.    int 
8650: 6e 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  nA = sqlite3_val
8660: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
8670: 29 3b 0a 20 20 20 20 69 6e 74 20 6e 42 20 3d 20  );.    int nB = 
8680: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
8690: 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  tes(argv[1]);.  
86a0: 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 61 72    int iLang = ar
86b0: 67 63 3d 3d 33 20 3f 20 73 71 6c 69 74 65 33 5f  gc==3 ? sqlite3_
86c0: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32  value_int(argv[2
86d0: 5d 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ]) : 0;.    cons
86e0: 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20  t EditDist3Lang 
86f0: 2a 70 4c 61 6e 67 20 3d 20 65 64 69 74 44 69 73  *pLang = editDis
8700: 74 33 46 69 6e 64 4c 61 6e 67 28 70 43 6f 6e 66  t3FindLang(pConf
8710: 69 67 2c 20 69 4c 61 6e 67 29 3b 0a 20 20 20 20  ig, iLang);.    
8720: 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  EditDist3FromStr
8730: 69 6e 67 20 2a 70 46 72 6f 6d 3b 0a 20 20 20 20  ing *pFrom;.    
8740: 69 6e 74 20 64 69 73 74 3b 0a 0a 20 20 20 20 70  int dist;..    p
8750: 46 72 6f 6d 20 3d 20 65 64 69 74 44 69 73 74 33  From = editDist3
8760: 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 70 4c  FromStringNew(pL
8770: 61 6e 67 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20 20  ang, zA, nA);.  
8780: 20 20 69 66 28 20 70 46 72 6f 6d 3d 3d 30 20 29    if( pFrom==0 )
8790: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
87a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
87b0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
87c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
87d0: 0a 20 20 20 20 64 69 73 74 20 3d 20 65 64 69 74  .    dist = edit
87e0: 44 69 73 74 33 43 6f 72 65 28 70 46 72 6f 6d 2c  Dist3Core(pFrom,
87f0: 20 7a 42 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c 20   zB, nB, pLang, 
8800: 30 29 3b 0a 20 20 20 20 65 64 69 74 44 69 73 74  0);.    editDist
8810: 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65 74  3FromStringDelet
8820: 65 28 70 46 72 6f 6d 29 3b 0a 20 20 20 20 69 66  e(pFrom);.    if
8830: 28 20 64 69 73 74 3d 3d 28 2d 31 29 20 29 7b 0a  ( dist==(-1) ){.
8840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8850: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8860: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d  (context);.    }
8870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
8880: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
8890: 6f 6e 74 65 78 74 2c 20 64 69 73 74 29 3b 0a 20  ontext, dist);. 
88a0: 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a     }.  } .}../*.
88b0: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
88c0: 65 64 69 74 44 69 73 74 33 20 66 75 6e 63 74 69  editDist3 functi
88d0: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 0a 2a  on with SQLite.*
88e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69  /.static int edi
88f0: 74 44 69 73 74 33 49 6e 73 74 61 6c 6c 28 73 71  tDist3Install(sq
8900: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
8910: 74 20 72 63 3b 0a 20 20 45 64 69 74 44 69 73 74  t rc;.  EditDist
8920: 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  3Config *pConfig
8930: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
8940: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66  c( sizeof(*pConf
8950: 69 67 29 20 29 3b 0a 20 20 69 66 28 20 70 43 6f  ig) );.  if( pCo
8960: 6e 66 69 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nfig==0 ) return
8970: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8980: 20 6d 65 6d 73 65 74 28 70 43 6f 6e 66 69 67 2c   memset(pConfig,
8990: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e   0, sizeof(*pCon
89a0: 66 69 67 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  fig));.  rc = sq
89b0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
89c0: 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64  ction_v2(db, "ed
89d0: 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20  itdist3",.      
89e0: 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54          2, SQLIT
89f0: 45 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69 67 2c  E_UTF8, pConfig,
8a00: 20 65 64 69 74 44 69 73 74 33 53 71 6c 46 75 6e   editDist3SqlFun
8a10: 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  c, 0, 0, 0);.  i
8a20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8a30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8a40: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8a50: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69  tion_v2(db, "edi
8a60: 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20  tdist3",.       
8a70: 20 20 20 20 20 20 20 20 20 33 2c 20 53 51 4c 49           3, SQLI
8a80: 54 45 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69 67  TE_UTF8, pConfig
8a90: 2c 20 65 64 69 74 44 69 73 74 33 53 71 6c 46 75  , editDist3SqlFu
8aa0: 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  nc, 0, 0, 0);.  
8ab0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
8ac0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
8ad0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
8ae0: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c  _function_v2(db,
8af0: 20 22 65 64 69 74 64 69 73 74 33 22 2c 0a 20 20   "editdist3",.  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
8b10: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 43   SQLITE_UTF8, pC
8b20: 6f 6e 66 69 67 2c 20 65 64 69 74 44 69 73 74 33  onfig, editDist3
8b30: 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 2c 0a 20  SqlFunc, 0, 0,. 
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
8b50: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65  ditDist3ConfigDe
8b60: 6c 65 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lete);.  }else{.
8b70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8b80: 28 70 43 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 20  (pConfig);.  }. 
8b90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
8ba0: 20 45 6e 64 20 63 6f 6e 66 69 67 75 72 61 62 6c   End configurabl
8bb0: 65 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20 65  e cost unicode e
8bc0: 64 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f 75  dit distance rou
8bd0: 74 69 6e 65 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tines.**********
8be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c20: 2a 2a 2a 2a 0a 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 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 72 61  ***.** Begin tra
8c80: 6e 73 6c 69 74 65 72 61 74 65 20 75 6e 69 63 6f  nsliterate unico
8c90: 64 65 2d 74 6f 2d 61 73 63 69 69 20 69 6d 70 6c  de-to-ascii impl
8ca0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2f 0a 0a 23  ementation.*/..#
8cb0: 69 66 20 21 53 51 4c 49 54 45 5f 41 4d 41 4c 47  if !SQLITE_AMALG
8cc0: 41 4d 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68  AMATION./*.** Th
8cd0: 69 73 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  is lookup table 
8ce0: 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20  is used to help 
8cf0: 64 65 63 6f 64 65 20 74 68 65 20 66 69 72 73 74  decode the first
8d00: 20 62 79 74 65 20 6f 66 0a 2a 2a 20 61 20 6d 75   byte of.** a mu
8d10: 6c 74 69 2d 62 79 74 65 20 55 54 46 38 20 63 68  lti-byte UTF8 ch
8d20: 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
8d30: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
8d40: 64 20 63 68 61 72 20 73 71 6c 69 74 65 33 55 74  d char sqlite3Ut
8d50: 66 38 54 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20  f8Trans1[] = {. 
8d60: 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30   0x00, 0x01, 0x0
8d70: 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30  2, 0x03, 0x04, 0
8d80: 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c  x05, 0x06, 0x07,
8d90: 0a 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30  .  0x08, 0x09, 0
8da0: 78 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c  x0a, 0x0b, 0x0c,
8db0: 20 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30   0x0d, 0x0e, 0x0
8dc0: 66 2c 0a 20 20 30 78 31 30 2c 20 30 78 31 31 2c  f,.  0x10, 0x11,
8dd0: 20 30 78 31 32 2c 20 30 78 31 33 2c 20 30 78 31   0x12, 0x13, 0x1
8de0: 34 2c 20 30 78 31 35 2c 20 30 78 31 36 2c 20 30  4, 0x15, 0x16, 0
8df0: 78 31 37 2c 0a 20 20 30 78 31 38 2c 20 30 78 31  x17,.  0x18, 0x1
8e00: 39 2c 20 30 78 31 61 2c 20 30 78 31 62 2c 20 30  9, 0x1a, 0x1b, 0
8e10: 78 31 63 2c 20 30 78 31 64 2c 20 30 78 31 65 2c  x1c, 0x1d, 0x1e,
8e20: 20 30 78 31 66 2c 0a 20 20 30 78 30 30 2c 20 30   0x1f,.  0x00, 0
8e30: 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c  x01, 0x02, 0x03,
8e40: 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30   0x04, 0x05, 0x0
8e50: 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c  6, 0x07,.  0x08,
8e60: 20 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30   0x09, 0x0a, 0x0
8e70: 62 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30  b, 0x0c, 0x0d, 0
8e80: 78 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 30  x0e, 0x0f,.  0x0
8e90: 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30  0, 0x01, 0x02, 0
8ea0: 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c  x03, 0x04, 0x05,
8eb0: 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30   0x06, 0x07,.  0
8ec0: 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c  x00, 0x01, 0x02,
8ed0: 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30   0x03, 0x00, 0x0
8ee0: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d  1, 0x00, 0x00,.}
8ef0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
8f00: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
8f10: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 55 54   of the first UT
8f20: 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 69 6e  F-8 character in
8f30: 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a   the string..*/.
8f40: 73 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 52  static int utf8R
8f50: 65 61 64 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ead(const unsign
8f60: 65 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ed char *z, int 
8f70: 6e 2c 20 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a  n, int *pSize){.
8f80: 20 20 69 6e 74 20 63 2c 20 69 3b 0a 0a 20 20 2f    int c, i;..  /
8f90: 2a 20 41 6c 6c 20 63 61 6c 6c 65 72 73 20 74 6f  * All callers to
8fa0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 28 69   this routine (i
8fb0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
8fc0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 0a 20 20  plementation).  
8fd0: 2a 2a 20 61 6c 77 61 79 73 20 68 61 76 65 20 6e  ** always have n
8fe0: 3e 30 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  >0. */.  if( NEV
8ff0: 45 52 28 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20  ER(n==0) ){.    
9000: 63 20 3d 20 69 20 3d 20 30 3b 0a 20 20 7d 65 6c  c = i = 0;.  }el
9010: 73 65 7b 0a 20 20 20 20 63 20 3d 20 7a 5b 30 5d  se{.    c = z[0]
9020: 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
9030: 20 69 66 28 20 63 3e 3d 30 78 63 30 20 29 7b 0a   if( c>=0xc0 ){.
9040: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
9050: 33 55 74 66 38 54 72 61 6e 73 31 5b 63 2d 30 78  3Utf8Trans1[c-0x
9060: 63 30 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  c0];.      while
9070: 28 20 69 3c 6e 20 26 26 20 28 7a 5b 69 5d 20 26  ( i<n && (z[i] &
9080: 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a   0xc0)==0x80 ){.
9090: 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
90a0: 36 29 20 2b 20 28 30 78 33 66 20 26 20 7a 5b 69  6) + (0x3f & z[i
90b0: 2b 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ++]);.      }.  
90c0: 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65    }.  }.  *pSize
90d0: 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 63   = i;.  return c
90e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
90f0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9100: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
9110: 65 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 69  e utf-8 string i
9120: 6e 20 74 68 65 20 6e 49 6e 20 62 79 74 65 0a 2a  n the nIn byte.*
9130: 2a 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  * buffer pointed
9140: 20 74 6f 20 62 79 20 7a 49 6e 2e 0a 2a 2f 0a 73   to by zIn..*/.s
9150: 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 43 68  tatic int utf8Ch
9160: 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  arlen(const char
9170: 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b   *zIn, int nIn){
9180: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
9190: 6e 43 68 61 72 20 3d 20 30 3b 0a 20 20 66 6f 72  nChar = 0;.  for
91a0: 28 69 3d 30 3b 20 69 3c 6e 49 6e 3b 20 6e 43 68  (i=0; i<nIn; nCh
91b0: 61 72 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73  ar++){.    int s
91c0: 7a 3b 0a 20 20 20 20 75 74 66 38 52 65 61 64 28  z;.    utf8Read(
91d0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
91e0: 63 68 61 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20  char *)&zIn[i], 
91f0: 6e 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20  nIn-i, &sz);.   
9200: 20 69 20 2b 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20   i += sz;.  }.  
9210: 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a  return nChar;.}.
9220: 0a 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f 66 20  ./*.** Table of 
9230: 74 72 61 6e 73 6c 61 74 69 6f 6e 73 20 66 72 6f  translations fro
9240: 6d 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63  m unicode charac
9250: 74 65 72 73 20 69 6e 74 6f 20 41 53 43 49 49 2e  ters into ASCII.
9260: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
9270: 20 73 74 72 75 63 74 20 7b 0a 20 75 6e 73 69 67   struct {. unsig
9280: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 46  ned short int cF
9290: 72 6f 6d 3b 0a 20 75 6e 73 69 67 6e 65 64 20 63  rom;. unsigned c
92a0: 68 61 72 20 63 54 6f 30 2c 20 63 54 6f 31 3b 0a  har cTo0, cTo1;.
92b0: 7d 20 74 72 61 6e 73 6c 69 74 5b 5d 20 3d 20 7b  } translit[] = {
92c0: 0a 20 20 7b 20 30 78 30 30 41 30 2c 20 20 30 78  .  { 0x00A0,  0x
92d0: 32 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  20, 0x00 },  /* 
92e0: c2 a0 20 74 6f 20 20 20 2a 2f 0a 20 20 7b 20 30  .. to   */.  { 0
92f0: 78 30 30 42 35 2c 20 20 30 78 37 35 2c 20 30 78  x00B5,  0x75, 0x
9300: 30 30 20 7d 2c 20 20 2f 2a 20 c2 b5 20 74 6f 20  00 },  /* .. to 
9310: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 30 2c  u */.  { 0x00C0,
9320: 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20    0x41, 0x00 }, 
9330: 20 2f 2a 20 c3 80 20 74 6f 20 41 20 2a 2f 0a 20   /* .. to A */. 
9340: 20 7b 20 30 78 30 30 43 31 2c 20 20 30 78 34 31   { 0x00C1,  0x41
9350: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 81  , 0x00 },  /* ..
9360: 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30   to A */.  { 0x0
9370: 30 43 32 2c 20 20 30 78 34 31 2c 20 30 78 30 30  0C2,  0x41, 0x00
9380: 20 7d 2c 20 20 2f 2a 20 c3 82 20 74 6f 20 41 20   },  /* .. to A 
9390: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 33 2c 20 20  */.  { 0x00C3,  
93a0: 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x41, 0x00 },  /
93b0: 2a 20 c3 83 20 74 6f 20 41 20 2a 2f 0a 20 20 7b  * .. to A */.  {
93c0: 20 30 78 30 30 43 34 2c 20 20 30 78 34 31 2c 20   0x00C4,  0x41, 
93d0: 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 84 20 74  0x65 },  /* .. t
93e0: 6f 20 41 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o Ae */.  { 0x00
93f0: 43 35 2c 20 20 30 78 34 31 2c 20 30 78 36 31 20  C5,  0x41, 0x61 
9400: 7d 2c 20 20 2f 2a 20 c3 85 20 74 6f 20 41 61 20  },  /* .. to Aa 
9410: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 36 2c 20 20  */.  { 0x00C6,  
9420: 30 78 34 31 2c 20 30 78 34 35 20 7d 2c 20 20 2f  0x41, 0x45 },  /
9430: 2a 20 c3 86 20 74 6f 20 41 45 20 2a 2f 0a 20 20  * .. to AE */.  
9440: 7b 20 30 78 30 30 43 37 2c 20 20 30 78 34 33 2c  { 0x00C7,  0x43,
9450: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 87 20   0x00 },  /* .. 
9460: 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to C */.  { 0x00
9470: 43 38 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20  C8,  0x45, 0x00 
9480: 7d 2c 20 20 2f 2a 20 c3 88 20 74 6f 20 45 20 2a  },  /* .. to E *
9490: 2f 0a 20 20 7b 20 30 78 30 30 43 39 2c 20 20 30  /.  { 0x00C9,  0
94a0: 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x45, 0x00 },  /*
94b0: 20 c3 89 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
94c0: 30 78 30 30 43 41 2c 20 20 30 78 34 35 2c 20 30  0x00CA,  0x45, 0
94d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8a 20 74 6f  x00 },  /* .. to
94e0: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 42   E */.  { 0x00CB
94f0: 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c  ,  0x45, 0x00 },
9500: 20 20 2f 2a 20 c3 8b 20 74 6f 20 45 20 2a 2f 0a    /* .. to E */.
9510: 20 20 7b 20 30 78 30 30 43 43 2c 20 20 30 78 34    { 0x00CC,  0x4
9520: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  9, 0x00 },  /* .
9530: 8c 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
9540: 30 30 43 44 2c 20 20 30 78 34 39 2c 20 30 78 30  00CD,  0x49, 0x0
9550: 30 20 7d 2c 20 20 2f 2a 20 c3 8d 20 74 6f 20 49  0 },  /* .. to I
9560: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 45 2c 20   */.  { 0x00CE, 
9570: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
9580: 2f 2a 20 c3 8e 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
9590: 7b 20 30 78 30 30 43 46 2c 20 20 30 78 34 39 2c  { 0x00CF,  0x49,
95a0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8f 20   0x00 },  /* .. 
95b0: 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to I */.  { 0x00
95c0: 44 30 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20  D0,  0x44, 0x00 
95d0: 7d 2c 20 20 2f 2a 20 c3 90 20 74 6f 20 44 20 2a  },  /* .. to D *
95e0: 2f 0a 20 20 7b 20 30 78 30 30 44 31 2c 20 20 30  /.  { 0x00D1,  0
95f0: 78 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4E, 0x00 },  /*
9600: 20 c3 91 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20   .. to N */.  { 
9610: 30 78 30 30 44 32 2c 20 20 30 78 34 46 2c 20 30  0x00D2,  0x4F, 0
9620: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 92 20 74 6f  x00 },  /* .. to
9630: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 33   O */.  { 0x00D3
9640: 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c  ,  0x4F, 0x00 },
9650: 20 20 2f 2a 20 c3 93 20 74 6f 20 4f 20 2a 2f 0a    /* .. to O */.
9660: 20 20 7b 20 30 78 30 30 44 34 2c 20 20 30 78 34    { 0x00D4,  0x4
9670: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  F, 0x00 },  /* .
9680: 94 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
9690: 30 30 44 35 2c 20 20 30 78 34 46 2c 20 30 78 30  00D5,  0x4F, 0x0
96a0: 30 20 7d 2c 20 20 2f 2a 20 c3 95 20 74 6f 20 4f  0 },  /* .. to O
96b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 36 2c 20   */.  { 0x00D6, 
96c0: 20 30 78 34 46 2c 20 30 78 36 35 20 7d 2c 20 20   0x4F, 0x65 },  
96d0: 2f 2a 20 c3 96 20 74 6f 20 4f 65 20 2a 2f 0a 20  /* .. to Oe */. 
96e0: 20 7b 20 30 78 30 30 44 37 2c 20 20 30 78 37 38   { 0x00D7,  0x78
96f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 97  , 0x00 },  /* ..
9700: 20 74 6f 20 78 20 2a 2f 0a 20 20 7b 20 30 78 30   to x */.  { 0x0
9710: 30 44 38 2c 20 20 30 78 34 46 2c 20 30 78 30 30  0D8,  0x4F, 0x00
9720: 20 7d 2c 20 20 2f 2a 20 c3 98 20 74 6f 20 4f 20   },  /* .. to O 
9730: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 39 2c 20 20  */.  { 0x00D9,  
9740: 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x55, 0x00 },  /
9750: 2a 20 c3 99 20 74 6f 20 55 20 2a 2f 0a 20 20 7b  * .. to U */.  {
9760: 20 30 78 30 30 44 41 2c 20 20 30 78 35 35 2c 20   0x00DA,  0x55, 
9770: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9a 20 74  0x00 },  /* .. t
9780: 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44  o U */.  { 0x00D
9790: 42 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d  B,  0x55, 0x00 }
97a0: 2c 20 20 2f 2a 20 c3 9b 20 74 6f 20 55 20 2a 2f  ,  /* .. to U */
97b0: 0a 20 20 7b 20 30 78 30 30 44 43 2c 20 20 30 78  .  { 0x00DC,  0x
97c0: 35 35 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20  55, 0x65 },  /* 
97d0: c3 9c 20 74 6f 20 55 65 20 2a 2f 0a 20 20 7b 20  .. to Ue */.  { 
97e0: 30 78 30 30 44 44 2c 20 20 30 78 35 39 2c 20 30  0x00DD,  0x59, 0
97f0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9d 20 74 6f  x00 },  /* .. to
9800: 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 45   Y */.  { 0x00DE
9810: 2c 20 20 30 78 35 34 2c 20 30 78 36 38 20 7d 2c  ,  0x54, 0x68 },
9820: 20 20 2f 2a 20 c3 9e 20 74 6f 20 54 68 20 2a 2f    /* .. to Th */
9830: 0a 20 20 7b 20 30 78 30 30 44 46 2c 20 20 30 78  .  { 0x00DF,  0x
9840: 37 33 2c 20 30 78 37 33 20 7d 2c 20 20 2f 2a 20  73, 0x73 },  /* 
9850: c3 9f 20 74 6f 20 73 73 20 2a 2f 0a 20 20 7b 20  .. to ss */.  { 
9860: 30 78 30 30 45 30 2c 20 20 30 78 36 31 2c 20 30  0x00E0,  0x61, 0
9870: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a0 20 74 6f  x00 },  /* .. to
9880: 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 31   a */.  { 0x00E1
9890: 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c  ,  0x61, 0x00 },
98a0: 20 20 2f 2a 20 c3 a1 20 74 6f 20 61 20 2a 2f 0a    /* .. to a */.
98b0: 20 20 7b 20 30 78 30 30 45 32 2c 20 20 30 78 36    { 0x00E2,  0x6
98c0: 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  1, 0x00 },  /* .
98d0: a2 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78  . to a */.  { 0x
98e0: 30 30 45 33 2c 20 20 30 78 36 31 2c 20 30 78 30  00E3,  0x61, 0x0
98f0: 30 20 7d 2c 20 20 2f 2a 20 c3 a3 20 74 6f 20 61  0 },  /* .. to a
9900: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 34 2c 20   */.  { 0x00E4, 
9910: 20 30 78 36 31 2c 20 30 78 36 35 20 7d 2c 20 20   0x61, 0x65 },  
9920: 2f 2a 20 c3 a4 20 74 6f 20 61 65 20 2a 2f 0a 20  /* .. to ae */. 
9930: 20 7b 20 30 78 30 30 45 35 2c 20 20 30 78 36 31   { 0x00E5,  0x61
9940: 2c 20 30 78 36 31 20 7d 2c 20 20 2f 2a 20 c3 a5  , 0x61 },  /* ..
9950: 20 74 6f 20 61 61 20 2a 2f 0a 20 20 7b 20 30 78   to aa */.  { 0x
9960: 30 30 45 36 2c 20 20 30 78 36 31 2c 20 30 78 36  00E6,  0x61, 0x6
9970: 35 20 7d 2c 20 20 2f 2a 20 c3 a6 20 74 6f 20 61  5 },  /* .. to a
9980: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 37 2c  e */.  { 0x00E7,
9990: 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20    0x63, 0x00 }, 
99a0: 20 2f 2a 20 c3 a7 20 74 6f 20 63 20 2a 2f 0a 20   /* .. to c */. 
99b0: 20 7b 20 30 78 30 30 45 38 2c 20 20 30 78 36 35   { 0x00E8,  0x65
99c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a8  , 0x00 },  /* ..
99d0: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
99e0: 30 45 39 2c 20 20 30 78 36 35 2c 20 30 78 30 30  0E9,  0x65, 0x00
99f0: 20 7d 2c 20 20 2f 2a 20 c3 a9 20 74 6f 20 65 20   },  /* .. to e 
9a00: 2a 2f 0a 20 20 7b 20 30 78 30 30 45 41 2c 20 20  */.  { 0x00EA,  
9a10: 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x65, 0x00 },  /
9a20: 2a 20 c3 aa 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
9a30: 20 30 78 30 30 45 42 2c 20 20 30 78 36 35 2c 20   0x00EB,  0x65, 
9a40: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ab 20 74  0x00 },  /* .. t
9a50: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45  o e */.  { 0x00E
9a60: 43 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d  C,  0x69, 0x00 }
9a70: 2c 20 20 2f 2a 20 c3 ac 20 74 6f 20 69 20 2a 2f  ,  /* .. to i */
9a80: 0a 20 20 7b 20 30 78 30 30 45 44 2c 20 20 30 78  .  { 0x00ED,  0x
9a90: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
9aa0: c3 ad 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
9ab0: 78 30 30 45 45 2c 20 20 30 78 36 39 2c 20 30 78  x00EE,  0x69, 0x
9ac0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 ae 20 74 6f 20  00 },  /* .. to 
9ad0: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 46 2c  i */.  { 0x00EF,
9ae0: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
9af0: 20 2f 2a 20 c3 af 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
9b00: 20 7b 20 30 78 30 30 46 30 2c 20 20 30 78 36 34   { 0x00F0,  0x64
9b10: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b0  , 0x00 },  /* ..
9b20: 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30   to d */.  { 0x0
9b30: 30 46 31 2c 20 20 30 78 36 45 2c 20 30 78 30 30  0F1,  0x6E, 0x00
9b40: 20 7d 2c 20 20 2f 2a 20 c3 b1 20 74 6f 20 6e 20   },  /* .. to n 
9b50: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 32 2c 20 20  */.  { 0x00F2,  
9b60: 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6F, 0x00 },  /
9b70: 2a 20 c3 b2 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b  * .. to o */.  {
9b80: 20 30 78 30 30 46 33 2c 20 20 30 78 36 46 2c 20   0x00F3,  0x6F, 
9b90: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b3 20 74  0x00 },  /* .. t
9ba0: 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46  o o */.  { 0x00F
9bb0: 34 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d  4,  0x6F, 0x00 }
9bc0: 2c 20 20 2f 2a 20 c3 b4 20 74 6f 20 6f 20 2a 2f  ,  /* .. to o */
9bd0: 0a 20 20 7b 20 30 78 30 30 46 35 2c 20 20 30 78  .  { 0x00F5,  0x
9be0: 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6F, 0x00 },  /* 
9bf0: c3 b5 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30  .. to o */.  { 0
9c00: 78 30 30 46 36 2c 20 20 30 78 36 46 2c 20 30 78  x00F6,  0x6F, 0x
9c10: 36 35 20 7d 2c 20 20 2f 2a 20 c3 b6 20 74 6f 20  65 },  /* .. to 
9c20: 6f 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 37  oe */.  { 0x00F7
9c30: 2c 20 20 30 78 33 41 2c 20 30 78 30 30 20 7d 2c  ,  0x3A, 0x00 },
9c40: 20 20 2f 2a 20 c3 b7 20 74 6f 20 3a 20 2a 2f 0a    /* .. to : */.
9c50: 20 20 7b 20 30 78 30 30 46 38 2c 20 20 30 78 36    { 0x00F8,  0x6
9c60: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  F, 0x00 },  /* .
9c70: b8 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
9c80: 30 30 46 39 2c 20 20 30 78 37 35 2c 20 30 78 30  00F9,  0x75, 0x0
9c90: 30 20 7d 2c 20 20 2f 2a 20 c3 b9 20 74 6f 20 75  0 },  /* .. to u
9ca0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 41 2c 20   */.  { 0x00FA, 
9cb0: 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x75, 0x00 },  
9cc0: 2f 2a 20 c3 ba 20 74 6f 20 75 20 2a 2f 0a 20 20  /* .. to u */.  
9cd0: 7b 20 30 78 30 30 46 42 2c 20 20 30 78 37 35 2c  { 0x00FB,  0x75,
9ce0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bb 20   0x00 },  /* .. 
9cf0: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to u */.  { 0x00
9d00: 46 43 2c 20 20 30 78 37 35 2c 20 30 78 36 35 20  FC,  0x75, 0x65 
9d10: 7d 2c 20 20 2f 2a 20 c3 bc 20 74 6f 20 75 65 20  },  /* .. to ue 
9d20: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 44 2c 20 20  */.  { 0x00FD,  
9d30: 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x79, 0x00 },  /
9d40: 2a 20 c3 bd 20 74 6f 20 79 20 2a 2f 0a 20 20 7b  * .. to y */.  {
9d50: 20 30 78 30 30 46 45 2c 20 20 30 78 37 34 2c 20   0x00FE,  0x74, 
9d60: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c3 be 20 74  0x68 },  /* .. t
9d70: 6f 20 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o th */.  { 0x00
9d80: 46 46 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20  FF,  0x79, 0x00 
9d90: 7d 2c 20 20 2f 2a 20 c3 bf 20 74 6f 20 79 20 2a  },  /* .. to y *
9da0: 2f 0a 20 20 7b 20 30 78 30 31 30 30 2c 20 20 30  /.  { 0x0100,  0
9db0: 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x41, 0x00 },  /*
9dc0: 20 c4 80 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
9dd0: 30 78 30 31 30 31 2c 20 20 30 78 36 31 2c 20 30  0x0101,  0x61, 0
9de0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 81 20 74 6f  x00 },  /* .. to
9df0: 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 32   a */.  { 0x0102
9e00: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
9e10: 20 20 2f 2a 20 c4 82 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
9e20: 20 20 7b 20 30 78 30 31 30 33 2c 20 20 30 78 36    { 0x0103,  0x6
9e30: 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  1, 0x00 },  /* .
9e40: 83 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78  . to a */.  { 0x
9e50: 30 31 30 34 2c 20 20 30 78 34 31 2c 20 30 78 30  0104,  0x41, 0x0
9e60: 30 20 7d 2c 20 20 2f 2a 20 c4 84 20 74 6f 20 41  0 },  /* .. to A
9e70: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 35 2c 20   */.  { 0x0105, 
9e80: 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20   0x61, 0x00 },  
9e90: 2f 2a 20 c4 85 20 74 6f 20 61 20 2a 2f 0a 20 20  /* .. to a */.  
9ea0: 7b 20 30 78 30 31 30 36 2c 20 20 30 78 34 33 2c  { 0x0106,  0x43,
9eb0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 86 20   0x00 },  /* .. 
9ec0: 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to C */.  { 0x01
9ed0: 30 37 2c 20 20 30 78 36 33 2c 20 30 78 30 30 20  07,  0x63, 0x00 
9ee0: 7d 2c 20 20 2f 2a 20 c4 87 20 74 6f 20 63 20 2a  },  /* .. to c *
9ef0: 2f 0a 20 20 7b 20 30 78 30 31 30 38 2c 20 20 30  /.  { 0x0108,  0
9f00: 78 34 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a  x43, 0x68 },  /*
9f10: 20 c4 88 20 74 6f 20 43 68 20 2a 2f 0a 20 20 7b   .. to Ch */.  {
9f20: 20 30 78 30 31 30 39 2c 20 20 30 78 36 33 2c 20   0x0109,  0x63, 
9f30: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 89 20 74  0x68 },  /* .. t
9f40: 6f 20 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o ch */.  { 0x01
9f50: 30 41 2c 20 20 30 78 34 33 2c 20 30 78 30 30 20  0A,  0x43, 0x00 
9f60: 7d 2c 20 20 2f 2a 20 c4 8a 20 74 6f 20 43 20 2a  },  /* .. to C *
9f70: 2f 0a 20 20 7b 20 30 78 30 31 30 42 2c 20 20 30  /.  { 0x010B,  0
9f80: 78 36 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x63, 0x00 },  /*
9f90: 20 c4 8b 20 74 6f 20 63 20 2a 2f 0a 20 20 7b 20   .. to c */.  { 
9fa0: 30 78 30 31 30 43 2c 20 20 30 78 34 33 2c 20 30  0x010C,  0x43, 0
9fb0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8c 20 74 6f  x00 },  /* .. to
9fc0: 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 44   C */.  { 0x010D
9fd0: 2c 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c  ,  0x63, 0x00 },
9fe0: 20 20 2f 2a 20 c4 8d 20 74 6f 20 63 20 2a 2f 0a    /* .. to c */.
9ff0: 20 20 7b 20 30 78 30 31 30 45 2c 20 20 30 78 34    { 0x010E,  0x4
a000: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  4, 0x00 },  /* .
a010: 8e 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78  . to D */.  { 0x
a020: 30 31 30 46 2c 20 20 30 78 36 34 2c 20 30 78 30  010F,  0x64, 0x0
a030: 30 20 7d 2c 20 20 2f 2a 20 c4 8f 20 74 6f 20 64  0 },  /* .. to d
a040: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 30 2c 20   */.  { 0x0110, 
a050: 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x44, 0x00 },  
a060: 2f 2a 20 c4 90 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
a070: 7b 20 30 78 30 31 31 31 2c 20 20 30 78 36 34 2c  { 0x0111,  0x64,
a080: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 91 20   0x00 },  /* .. 
a090: 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to d */.  { 0x01
a0a0: 31 32 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20  12,  0x45, 0x00 
a0b0: 7d 2c 20 20 2f 2a 20 c4 92 20 74 6f 20 45 20 2a  },  /* .. to E *
a0c0: 2f 0a 20 20 7b 20 30 78 30 31 31 33 2c 20 20 30  /.  { 0x0113,  0
a0d0: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
a0e0: 20 c4 93 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
a0f0: 30 78 30 31 31 34 2c 20 20 30 78 34 35 2c 20 30  0x0114,  0x45, 0
a100: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 94 20 74 6f  x00 },  /* .. to
a110: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 35   E */.  { 0x0115
a120: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
a130: 20 20 2f 2a 20 c4 95 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
a140: 20 20 7b 20 30 78 30 31 31 36 2c 20 20 30 78 34    { 0x0116,  0x4
a150: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  5, 0x00 },  /* .
a160: 96 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
a170: 30 31 31 37 2c 20 20 30 78 36 35 2c 20 30 78 30  0117,  0x65, 0x0
a180: 30 20 7d 2c 20 20 2f 2a 20 c4 97 20 74 6f 20 65  0 },  /* .. to e
a190: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 38 2c 20   */.  { 0x0118, 
a1a0: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
a1b0: 2f 2a 20 c4 98 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
a1c0: 7b 20 30 78 30 31 31 39 2c 20 20 30 78 36 35 2c  { 0x0119,  0x65,
a1d0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 99 20   0x00 },  /* .. 
a1e0: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to e */.  { 0x01
a1f0: 31 41 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20  1A,  0x45, 0x00 
a200: 7d 2c 20 20 2f 2a 20 c4 9a 20 74 6f 20 45 20 2a  },  /* .. to E *
a210: 2f 0a 20 20 7b 20 30 78 30 31 31 42 2c 20 20 30  /.  { 0x011B,  0
a220: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
a230: 20 c4 9b 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
a240: 30 78 30 31 31 43 2c 20 20 30 78 34 37 2c 20 30  0x011C,  0x47, 0
a250: 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 9c 20 74 6f  x68 },  /* .. to
a260: 20 47 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31   Gh */.  { 0x011
a270: 44 2c 20 20 30 78 36 37 2c 20 30 78 36 38 20 7d  D,  0x67, 0x68 }
a280: 2c 20 20 2f 2a 20 c4 9d 20 74 6f 20 67 68 20 2a  ,  /* .. to gh *
a290: 2f 0a 20 20 7b 20 30 78 30 31 31 45 2c 20 20 30  /.  { 0x011E,  0
a2a0: 78 34 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x47, 0x00 },  /*
a2b0: 20 c4 9e 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20   .. to G */.  { 
a2c0: 30 78 30 31 31 46 2c 20 20 30 78 36 37 2c 20 30  0x011F,  0x67, 0
a2d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9f 20 74 6f  x00 },  /* .. to
a2e0: 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 30   g */.  { 0x0120
a2f0: 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c  ,  0x47, 0x00 },
a300: 20 20 2f 2a 20 c4 a0 20 74 6f 20 47 20 2a 2f 0a    /* .. to G */.
a310: 20 20 7b 20 30 78 30 31 32 31 2c 20 20 30 78 36    { 0x0121,  0x6
a320: 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  7, 0x00 },  /* .
a330: a1 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78  . to g */.  { 0x
a340: 30 31 32 32 2c 20 20 30 78 34 37 2c 20 30 78 30  0122,  0x47, 0x0
a350: 30 20 7d 2c 20 20 2f 2a 20 c4 a2 20 74 6f 20 47  0 },  /* .. to G
a360: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 33 2c 20   */.  { 0x0123, 
a370: 20 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20 20   0x67, 0x00 },  
a380: 2f 2a 20 c4 a3 20 74 6f 20 67 20 2a 2f 0a 20 20  /* .. to g */.  
a390: 7b 20 30 78 30 31 32 34 2c 20 20 30 78 34 38 2c  { 0x0124,  0x48,
a3a0: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 a4 20   0x68 },  /* .. 
a3b0: 74 6f 20 48 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Hh */.  { 0x0
a3c0: 31 32 35 2c 20 20 30 78 36 38 2c 20 30 78 36 38  125,  0x68, 0x68
a3d0: 20 7d 2c 20 20 2f 2a 20 c4 a5 20 74 6f 20 68 68   },  /* .. to hh
a3e0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 36 2c 20   */.  { 0x0126, 
a3f0: 20 30 78 34 38 2c 20 30 78 30 30 20 7d 2c 20 20   0x48, 0x00 },  
a400: 2f 2a 20 c4 a6 20 74 6f 20 48 20 2a 2f 0a 20 20  /* .. to H */.  
a410: 7b 20 30 78 30 31 32 37 2c 20 20 30 78 36 38 2c  { 0x0127,  0x68,
a420: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a7 20   0x00 },  /* .. 
a430: 74 6f 20 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to h */.  { 0x01
a440: 32 38 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  28,  0x49, 0x00 
a450: 7d 2c 20 20 2f 2a 20 c4 a8 20 74 6f 20 49 20 2a  },  /* .. to I *
a460: 2f 0a 20 20 7b 20 30 78 30 31 32 39 2c 20 20 30  /.  { 0x0129,  0
a470: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
a480: 20 c4 a9 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
a490: 30 78 30 31 32 41 2c 20 20 30 78 34 39 2c 20 30  0x012A,  0x49, 0
a4a0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 aa 20 74 6f  x00 },  /* .. to
a4b0: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 42   I */.  { 0x012B
a4c0: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
a4d0: 20 20 2f 2a 20 c4 ab 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
a4e0: 20 20 7b 20 30 78 30 31 32 43 2c 20 20 30 78 34    { 0x012C,  0x4
a4f0: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  9, 0x00 },  /* .
a500: ac 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
a510: 30 31 32 44 2c 20 20 30 78 36 39 2c 20 30 78 30  012D,  0x69, 0x0
a520: 30 20 7d 2c 20 20 2f 2a 20 c4 ad 20 74 6f 20 69  0 },  /* .. to i
a530: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 45 2c 20   */.  { 0x012E, 
a540: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
a550: 2f 2a 20 c4 ae 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
a560: 7b 20 30 78 30 31 32 46 2c 20 20 30 78 36 39 2c  { 0x012F,  0x69,
a570: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 af 20   0x00 },  /* .. 
a580: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to i */.  { 0x01
a590: 33 30 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  30,  0x49, 0x00 
a5a0: 7d 2c 20 20 2f 2a 20 c4 b0 20 74 6f 20 49 20 2a  },  /* .. to I *
a5b0: 2f 0a 20 20 7b 20 30 78 30 31 33 31 2c 20 20 30  /.  { 0x0131,  0
a5c0: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
a5d0: 20 c4 b1 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
a5e0: 30 78 30 31 33 32 2c 20 20 30 78 34 39 2c 20 30  0x0132,  0x49, 0
a5f0: 78 34 41 20 7d 2c 20 20 2f 2a 20 c4 b2 20 74 6f  x4A },  /* .. to
a600: 20 49 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33   IJ */.  { 0x013
a610: 33 2c 20 20 30 78 36 39 2c 20 30 78 36 41 20 7d  3,  0x69, 0x6A }
a620: 2c 20 20 2f 2a 20 c4 b3 20 74 6f 20 69 6a 20 2a  ,  /* .. to ij *
a630: 2f 0a 20 20 7b 20 30 78 30 31 33 34 2c 20 20 30  /.  { 0x0134,  0
a640: 78 34 41 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a  x4A, 0x68 },  /*
a650: 20 c4 b4 20 74 6f 20 4a 68 20 2a 2f 0a 20 20 7b   .. to Jh */.  {
a660: 20 30 78 30 31 33 35 2c 20 20 30 78 36 41 2c 20   0x0135,  0x6A, 
a670: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 b5 20 74  0x68 },  /* .. t
a680: 6f 20 6a 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o jh */.  { 0x01
a690: 33 36 2c 20 20 30 78 34 42 2c 20 30 78 30 30 20  36,  0x4B, 0x00 
a6a0: 7d 2c 20 20 2f 2a 20 c4 b6 20 74 6f 20 4b 20 2a  },  /* .. to K *
a6b0: 2f 0a 20 20 7b 20 30 78 30 31 33 37 2c 20 20 30  /.  { 0x0137,  0
a6c0: 78 36 42 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6B, 0x00 },  /*
a6d0: 20 c4 b7 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20   .. to k */.  { 
a6e0: 30 78 30 31 33 38 2c 20 20 30 78 36 42 2c 20 30  0x0138,  0x6B, 0
a6f0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b8 20 74 6f  x00 },  /* .. to
a700: 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 39   k */.  { 0x0139
a710: 2c 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d 2c  ,  0x4C, 0x00 },
a720: 20 20 2f 2a 20 c4 b9 20 74 6f 20 4c 20 2a 2f 0a    /* .. to L */.
a730: 20 20 7b 20 30 78 30 31 33 41 2c 20 20 30 78 36    { 0x013A,  0x6
a740: 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  C, 0x00 },  /* .
a750: ba 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78  . to l */.  { 0x
a760: 30 31 33 42 2c 20 20 30 78 34 43 2c 20 30 78 30  013B,  0x4C, 0x0
a770: 30 20 7d 2c 20 20 2f 2a 20 c4 bb 20 74 6f 20 4c  0 },  /* .. to L
a780: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 43 2c 20   */.  { 0x013C, 
a790: 20 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20 20   0x6C, 0x00 },  
a7a0: 2f 2a 20 c4 bc 20 74 6f 20 6c 20 2a 2f 0a 20 20  /* .. to l */.  
a7b0: 7b 20 30 78 30 31 33 44 2c 20 20 30 78 34 43 2c  { 0x013D,  0x4C,
a7c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 bd 20   0x00 },  /* .. 
a7d0: 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to L */.  { 0x01
a7e0: 33 45 2c 20 20 30 78 36 43 2c 20 30 78 30 30 20  3E,  0x6C, 0x00 
a7f0: 7d 2c 20 20 2f 2a 20 c4 be 20 74 6f 20 6c 20 2a  },  /* .. to l *
a800: 2f 0a 20 20 7b 20 30 78 30 31 33 46 2c 20 20 30  /.  { 0x013F,  0
a810: 78 34 43 2c 20 30 78 32 45 20 7d 2c 20 20 2f 2a  x4C, 0x2E },  /*
a820: 20 c4 bf 20 74 6f 20 4c 2e 20 2a 2f 0a 20 20 7b   .. to L. */.  {
a830: 20 30 78 30 31 34 30 2c 20 20 30 78 36 43 2c 20   0x0140,  0x6C, 
a840: 30 78 32 45 20 7d 2c 20 20 2f 2a 20 c5 80 20 74  0x2E },  /* .. t
a850: 6f 20 6c 2e 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o l. */.  { 0x01
a860: 34 31 2c 20 20 30 78 34 43 2c 20 30 78 30 30 20  41,  0x4C, 0x00 
a870: 7d 2c 20 20 2f 2a 20 c5 81 20 74 6f 20 4c 20 2a  },  /* .. to L *
a880: 2f 0a 20 20 7b 20 30 78 30 31 34 32 2c 20 20 30  /.  { 0x0142,  0
a890: 78 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6C, 0x00 },  /*
a8a0: 20 c5 82 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20   .. to l */.  { 
a8b0: 30 78 30 31 34 33 2c 20 20 30 78 34 45 2c 20 30  0x0143,  0x4E, 0
a8c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 83 20 74 6f  x00 },  /* .. to
a8d0: 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 34   N */.  { 0x0144
a8e0: 2c 20 20 30 78 36 45 2c 20 30 78 30 30 20 7d 2c  ,  0x6E, 0x00 },
a8f0: 20 20 2f 2a 20 c5 84 20 74 6f 20 6e 20 2a 2f 0a    /* .. to n */.
a900: 20 20 7b 20 30 78 30 31 34 35 2c 20 20 30 78 34    { 0x0145,  0x4
a910: 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  E, 0x00 },  /* .
a920: 85 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78  . to N */.  { 0x
a930: 30 31 34 36 2c 20 20 30 78 36 45 2c 20 30 78 30  0146,  0x6E, 0x0
a940: 30 20 7d 2c 20 20 2f 2a 20 c5 86 20 74 6f 20 6e  0 },  /* .. to n
a950: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 37 2c 20   */.  { 0x0147, 
a960: 20 30 78 34 45 2c 20 30 78 30 30 20 7d 2c 20 20   0x4E, 0x00 },  
a970: 2f 2a 20 c5 87 20 74 6f 20 4e 20 2a 2f 0a 20 20  /* .. to N */.  
a980: 7b 20 30 78 30 31 34 38 2c 20 20 30 78 36 45 2c  { 0x0148,  0x6E,
a990: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 88 20   0x00 },  /* .. 
a9a0: 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to n */.  { 0x01
a9b0: 34 39 2c 20 20 30 78 32 37 2c 20 30 78 36 45 20  49,  0x27, 0x6E 
a9c0: 7d 2c 20 20 2f 2a 20 c5 89 20 74 6f 20 27 6e 20  },  /* .. to 'n 
a9d0: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 41 2c 20 20  */.  { 0x014A,  
a9e0: 30 78 34 45 2c 20 30 78 34 37 20 7d 2c 20 20 2f  0x4E, 0x47 },  /
a9f0: 2a 20 c5 8a 20 74 6f 20 4e 47 20 2a 2f 0a 20 20  * .. to NG */.  
aa00: 7b 20 30 78 30 31 34 42 2c 20 20 30 78 36 45 2c  { 0x014B,  0x6E,
aa10: 20 30 78 36 37 20 7d 2c 20 20 2f 2a 20 c5 8b 20   0x67 },  /* .. 
aa20: 74 6f 20 6e 67 20 2a 2f 0a 20 20 7b 20 30 78 30  to ng */.  { 0x0
aa30: 31 34 43 2c 20 20 30 78 34 46 2c 20 30 78 30 30  14C,  0x4F, 0x00
aa40: 20 7d 2c 20 20 2f 2a 20 c5 8c 20 74 6f 20 4f 20   },  /* .. to O 
aa50: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 44 2c 20 20  */.  { 0x014D,  
aa60: 30 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6F, 0x00 },  /
aa70: 2a 20 c5 8d 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b  * .. to o */.  {
aa80: 20 30 78 30 31 34 45 2c 20 20 30 78 34 46 2c 20   0x014E,  0x4F, 
aa90: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8e 20 74  0x00 },  /* .. t
aaa0: 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34  o O */.  { 0x014
aab0: 46 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d  F,  0x6F, 0x00 }
aac0: 2c 20 20 2f 2a 20 c5 8f 20 74 6f 20 6f 20 2a 2f  ,  /* .. to o */
aad0: 0a 20 20 7b 20 30 78 30 31 35 30 2c 20 20 30 78  .  { 0x0150,  0x
aae0: 34 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4F, 0x00 },  /* 
aaf0: c5 90 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30  .. to O */.  { 0
ab00: 78 30 31 35 31 2c 20 20 30 78 36 46 2c 20 30 78  x0151,  0x6F, 0x
ab10: 30 30 20 7d 2c 20 20 2f 2a 20 c5 91 20 74 6f 20  00 },  /* .. to 
ab20: 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 32 2c  o */.  { 0x0152,
ab30: 20 20 30 78 34 46 2c 20 30 78 34 35 20 7d 2c 20    0x4F, 0x45 }, 
ab40: 20 2f 2a 20 c5 92 20 74 6f 20 4f 45 20 2a 2f 0a   /* .. to OE */.
ab50: 20 20 7b 20 30 78 30 31 35 33 2c 20 20 30 78 36    { 0x0153,  0x6
ab60: 46 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c5  F, 0x65 },  /* .
ab70: 93 20 74 6f 20 6f 65 20 2a 2f 0a 20 20 7b 20 30  . to oe */.  { 0
ab80: 78 30 31 35 34 2c 20 20 30 78 35 32 2c 20 30 78  x0154,  0x52, 0x
ab90: 30 30 20 7d 2c 20 20 2f 2a 20 c5 94 20 74 6f 20  00 },  /* .. to 
aba0: 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 35 2c  R */.  { 0x0155,
abb0: 20 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20    0x72, 0x00 }, 
abc0: 20 2f 2a 20 c5 95 20 74 6f 20 72 20 2a 2f 0a 20   /* .. to r */. 
abd0: 20 7b 20 30 78 30 31 35 36 2c 20 20 30 78 35 32   { 0x0156,  0x52
abe0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 96  , 0x00 },  /* ..
abf0: 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30   to R */.  { 0x0
ac00: 31 35 37 2c 20 20 30 78 37 32 2c 20 30 78 30 30  157,  0x72, 0x00
ac10: 20 7d 2c 20 20 2f 2a 20 c5 97 20 74 6f 20 72 20   },  /* .. to r 
ac20: 2a 2f 0a 20 20 7b 20 30 78 30 31 35 38 2c 20 20  */.  { 0x0158,  
ac30: 30 78 35 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x52, 0x00 },  /
ac40: 2a 20 c5 98 20 74 6f 20 52 20 2a 2f 0a 20 20 7b  * .. to R */.  {
ac50: 20 30 78 30 31 35 39 2c 20 20 30 78 37 32 2c 20   0x0159,  0x72, 
ac60: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 99 20 74  0x00 },  /* .. t
ac70: 6f 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35  o r */.  { 0x015
ac80: 41 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d  A,  0x53, 0x00 }
ac90: 2c 20 20 2f 2a 20 c5 9a 20 74 6f 20 53 20 2a 2f  ,  /* .. to S */
aca0: 0a 20 20 7b 20 30 78 30 31 35 42 2c 20 20 30 78  .  { 0x015B,  0x
acb0: 37 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  73, 0x00 },  /* 
acc0: c5 9b 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30  .. to s */.  { 0
acd0: 78 30 31 35 43 2c 20 20 30 78 35 33 2c 20 30 78  x015C,  0x53, 0x
ace0: 36 38 20 7d 2c 20 20 2f 2a 20 c5 9c 20 74 6f 20  68 },  /* .. to 
acf0: 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 44  Sh */.  { 0x015D
ad00: 2c 20 20 30 78 37 33 2c 20 30 78 36 38 20 7d 2c  ,  0x73, 0x68 },
ad10: 20 20 2f 2a 20 c5 9d 20 74 6f 20 73 68 20 2a 2f    /* .. to sh */
ad20: 0a 20 20 7b 20 30 78 30 31 35 45 2c 20 20 30 78  .  { 0x015E,  0x
ad30: 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  53, 0x00 },  /* 
ad40: c5 9e 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30  .. to S */.  { 0
ad50: 78 30 31 35 46 2c 20 20 30 78 37 33 2c 20 30 78  x015F,  0x73, 0x
ad60: 30 30 20 7d 2c 20 20 2f 2a 20 c5 9f 20 74 6f 20  00 },  /* .. to 
ad70: 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 30 2c  s */.  { 0x0160,
ad80: 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20    0x53, 0x00 }, 
ad90: 20 2f 2a 20 c5 a0 20 74 6f 20 53 20 2a 2f 0a 20   /* .. to S */. 
ada0: 20 7b 20 30 78 30 31 36 31 2c 20 20 30 78 37 33   { 0x0161,  0x73
adb0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a1  , 0x00 },  /* ..
adc0: 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30   to s */.  { 0x0
add0: 31 36 32 2c 20 20 30 78 35 34 2c 20 30 78 30 30  162,  0x54, 0x00
ade0: 20 7d 2c 20 20 2f 2a 20 c5 a2 20 74 6f 20 54 20   },  /* .. to T 
adf0: 2a 2f 0a 20 20 7b 20 30 78 30 31 36 33 2c 20 20  */.  { 0x0163,  
ae00: 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x74, 0x00 },  /
ae10: 2a 20 c5 a3 20 74 6f 20 74 20 2a 2f 0a 20 20 7b  * .. to t */.  {
ae20: 20 30 78 30 31 36 34 2c 20 20 30 78 35 34 2c 20   0x0164,  0x54, 
ae30: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a4 20 74  0x00 },  /* .. t
ae40: 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36  o T */.  { 0x016
ae50: 35 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d  5,  0x74, 0x00 }
ae60: 2c 20 20 2f 2a 20 c5 a5 20 74 6f 20 74 20 2a 2f  ,  /* .. to t */
ae70: 0a 20 20 7b 20 30 78 30 31 36 36 2c 20 20 30 78  .  { 0x0166,  0x
ae80: 35 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  54, 0x00 },  /* 
ae90: c5 a6 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30  .. to T */.  { 0
aea0: 78 30 31 36 37 2c 20 20 30 78 37 34 2c 20 30 78  x0167,  0x74, 0x
aeb0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 a7 20 74 6f 20  00 },  /* .. to 
aec0: 74 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 38 2c  t */.  { 0x0168,
aed0: 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20    0x55, 0x00 }, 
aee0: 20 2f 2a 20 c5 a8 20 74 6f 20 55 20 2a 2f 0a 20   /* .. to U */. 
aef0: 20 7b 20 30 78 30 31 36 39 2c 20 20 30 78 37 35   { 0x0169,  0x75
af00: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a9  , 0x00 },  /* ..
af10: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
af20: 31 36 41 2c 20 20 30 78 35 35 2c 20 30 78 30 30  16A,  0x55, 0x00
af30: 20 7d 2c 20 20 2f 2a 20 c5 aa 20 74 6f 20 55 20   },  /* .. to U 
af40: 2a 2f 0a 20 20 7b 20 30 78 30 31 36 42 2c 20 20  */.  { 0x016B,  
af50: 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x75, 0x00 },  /
af60: 2a 20 c5 ab 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
af70: 20 30 78 30 31 36 43 2c 20 20 30 78 35 35 2c 20   0x016C,  0x55, 
af80: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ac 20 74  0x00 },  /* .. t
af90: 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36  o U */.  { 0x016
afa0: 44 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d  D,  0x75, 0x00 }
afb0: 2c 20 20 2f 2a 20 c5 ad 20 74 6f 20 75 20 2a 2f  ,  /* .. to u */
afc0: 0a 20 20 7b 20 30 78 30 31 36 45 2c 20 20 30 78  .  { 0x016E,  0x
afd0: 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  55, 0x00 },  /* 
afe0: c5 ae 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30  .. to U */.  { 0
aff0: 78 30 31 36 46 2c 20 20 30 78 37 35 2c 20 30 78  x016F,  0x75, 0x
b000: 30 30 20 7d 2c 20 20 2f 2a 20 c5 af 20 74 6f 20  00 },  /* .. to 
b010: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 30 2c  u */.  { 0x0170,
b020: 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20    0x55, 0x00 }, 
b030: 20 2f 2a 20 c5 b0 20 74 6f 20 55 20 2a 2f 0a 20   /* .. to U */. 
b040: 20 7b 20 30 78 30 31 37 31 2c 20 20 30 78 37 35   { 0x0171,  0x75
b050: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b1  , 0x00 },  /* ..
b060: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
b070: 31 37 32 2c 20 20 30 78 35 35 2c 20 30 78 30 30  172,  0x55, 0x00
b080: 20 7d 2c 20 20 2f 2a 20 c5 b2 20 74 6f 20 55 20   },  /* .. to U 
b090: 2a 2f 0a 20 20 7b 20 30 78 30 31 37 33 2c 20 20  */.  { 0x0173,  
b0a0: 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x75, 0x00 },  /
b0b0: 2a 20 c5 b3 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
b0c0: 20 30 78 30 31 37 34 2c 20 20 30 78 35 37 2c 20   0x0174,  0x57, 
b0d0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b4 20 74  0x00 },  /* .. t
b0e0: 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37  o W */.  { 0x017
b0f0: 35 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20 7d  5,  0x77, 0x00 }
b100: 2c 20 20 2f 2a 20 c5 b5 20 74 6f 20 77 20 2a 2f  ,  /* .. to w */
b110: 0a 20 20 7b 20 30 78 30 31 37 36 2c 20 20 30 78  .  { 0x0176,  0x
b120: 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  59, 0x00 },  /* 
b130: c5 b6 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30  .. to Y */.  { 0
b140: 78 30 31 37 37 2c 20 20 30 78 37 39 2c 20 30 78  x0177,  0x79, 0x
b150: 30 30 20 7d 2c 20 20 2f 2a 20 c5 b7 20 74 6f 20  00 },  /* .. to 
b160: 79 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 38 2c  y */.  { 0x0178,
b170: 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20    0x59, 0x00 }, 
b180: 20 2f 2a 20 c5 b8 20 74 6f 20 59 20 2a 2f 0a 20   /* .. to Y */. 
b190: 20 7b 20 30 78 30 31 37 39 2c 20 20 30 78 35 41   { 0x0179,  0x5A
b1a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b9  , 0x00 },  /* ..
b1b0: 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30   to Z */.  { 0x0
b1c0: 31 37 41 2c 20 20 30 78 37 41 2c 20 30 78 30 30  17A,  0x7A, 0x00
b1d0: 20 7d 2c 20 20 2f 2a 20 c5 ba 20 74 6f 20 7a 20   },  /* .. to z 
b1e0: 2a 2f 0a 20 20 7b 20 30 78 30 31 37 42 2c 20 20  */.  { 0x017B,  
b1f0: 30 78 35 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x5A, 0x00 },  /
b200: 2a 20 c5 bb 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b  * .. to Z */.  {
b210: 20 30 78 30 31 37 43 2c 20 20 30 78 37 41 2c 20   0x017C,  0x7A, 
b220: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bc 20 74  0x00 },  /* .. t
b230: 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37  o z */.  { 0x017
b240: 44 2c 20 20 30 78 35 41 2c 20 30 78 30 30 20 7d  D,  0x5A, 0x00 }
b250: 2c 20 20 2f 2a 20 c5 bd 20 74 6f 20 5a 20 2a 2f  ,  /* .. to Z */
b260: 0a 20 20 7b 20 30 78 30 31 37 45 2c 20 20 30 78  .  { 0x017E,  0x
b270: 37 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  7A, 0x00 },  /* 
b280: c5 be 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30  .. to z */.  { 0
b290: 78 30 31 37 46 2c 20 20 30 78 37 33 2c 20 30 78  x017F,  0x73, 0x
b2a0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 bf 20 74 6f 20  00 },  /* .. to 
b2b0: 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 39 32 2c  s */.  { 0x0192,
b2c0: 20 20 30 78 36 36 2c 20 30 78 30 30 20 7d 2c 20    0x66, 0x00 }, 
b2d0: 20 2f 2a 20 c6 92 20 74 6f 20 66 20 2a 2f 0a 20   /* .. to f */. 
b2e0: 20 7b 20 30 78 30 32 31 38 2c 20 20 30 78 35 33   { 0x0218,  0x53
b2f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 98  , 0x00 },  /* ..
b300: 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30   to S */.  { 0x0
b310: 32 31 39 2c 20 20 30 78 37 33 2c 20 30 78 30 30  219,  0x73, 0x00
b320: 20 7d 2c 20 20 2f 2a 20 c8 99 20 74 6f 20 73 20   },  /* .. to s 
b330: 2a 2f 0a 20 20 7b 20 30 78 30 32 31 41 2c 20 20  */.  { 0x021A,  
b340: 30 78 35 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x54, 0x00 },  /
b350: 2a 20 c8 9a 20 74 6f 20 54 20 2a 2f 0a 20 20 7b  * .. to T */.  {
b360: 20 30 78 30 32 31 42 2c 20 20 30 78 37 34 2c 20   0x021B,  0x74, 
b370: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9b 20 74  0x00 },  /* .. t
b380: 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38  o t */.  { 0x038
b390: 36 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d  6,  0x41, 0x00 }
b3a0: 2c 20 20 2f 2a 20 ce 86 20 74 6f 20 41 20 2a 2f  ,  /* .. to A */
b3b0: 0a 20 20 7b 20 30 78 30 33 38 38 2c 20 20 30 78  .  { 0x0388,  0x
b3c0: 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  45, 0x00 },  /* 
b3d0: ce 88 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
b3e0: 78 30 33 38 39 2c 20 20 30 78 34 39 2c 20 30 78  x0389,  0x49, 0x
b3f0: 30 30 20 7d 2c 20 20 2f 2a 20 ce 89 20 74 6f 20  00 },  /* .. to 
b400: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 41 2c  I */.  { 0x038A,
b410: 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20    0x49, 0x00 }, 
b420: 20 2f 2a 20 ce 8a 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
b430: 20 7b 20 30 78 30 33 38 43 2c 20 20 30 78 34 66   { 0x038C,  0x4f
b440: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 8c  , 0x00 },  /* ..
b450: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
b460: 33 38 45 2c 20 20 30 78 35 39 2c 20 30 78 30 30  38E,  0x59, 0x00
b470: 20 7d 2c 20 20 2f 2a 20 ce 8e 20 74 6f 20 59 20   },  /* .. to Y 
b480: 2a 2f 0a 20 20 7b 20 30 78 30 33 38 46 2c 20 20  */.  { 0x038F,  
b490: 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4f, 0x00 },  /
b4a0: 2a 20 ce 8f 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b  * .. to O */.  {
b4b0: 20 30 78 30 33 39 30 2c 20 20 30 78 36 39 2c 20   0x0390,  0x69, 
b4c0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 90 20 74  0x00 },  /* .. t
b4d0: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39  o i */.  { 0x039
b4e0: 31 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d  1,  0x41, 0x00 }
b4f0: 2c 20 20 2f 2a 20 ce 91 20 74 6f 20 41 20 2a 2f  ,  /* .. to A */
b500: 0a 20 20 7b 20 30 78 30 33 39 32 2c 20 20 30 78  .  { 0x0392,  0x
b510: 34 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  42, 0x00 },  /* 
b520: ce 92 20 74 6f 20 42 20 2a 2f 0a 20 20 7b 20 30  .. to B */.  { 0
b530: 78 30 33 39 33 2c 20 20 30 78 34 37 2c 20 30 78  x0393,  0x47, 0x
b540: 30 30 20 7d 2c 20 20 2f 2a 20 ce 93 20 74 6f 20  00 },  /* .. to 
b550: 47 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 34 2c  G */.  { 0x0394,
b560: 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20    0x44, 0x00 }, 
b570: 20 2f 2a 20 ce 94 20 74 6f 20 44 20 2a 2f 0a 20   /* .. to D */. 
b580: 20 7b 20 30 78 30 33 39 35 2c 20 20 30 78 34 35   { 0x0395,  0x45
b590: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 95  , 0x00 },  /* ..
b5a0: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
b5b0: 33 39 36 2c 20 20 30 78 35 61 2c 20 30 78 30 30  396,  0x5a, 0x00
b5c0: 20 7d 2c 20 20 2f 2a 20 ce 96 20 74 6f 20 5a 20   },  /* .. to Z 
b5d0: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 37 2c 20 20  */.  { 0x0397,  
b5e0: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
b5f0: 2a 20 ce 97 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
b600: 20 30 78 30 33 39 38 2c 20 20 30 78 35 34 2c 20   0x0398,  0x54, 
b610: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 ce 98 20 74  0x68 },  /* .. t
b620: 6f 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33  o Th */.  { 0x03
b630: 39 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20  99,  0x49, 0x00 
b640: 7d 2c 20 20 2f 2a 20 ce 99 20 74 6f 20 49 20 2a  },  /* .. to I *
b650: 2f 0a 20 20 7b 20 30 78 30 33 39 41 2c 20 20 30  /.  { 0x039A,  0
b660: 78 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4b, 0x00 },  /*
b670: 20 ce 9a 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20   .. to K */.  { 
b680: 30 78 30 33 39 42 2c 20 20 30 78 34 63 2c 20 30  0x039B,  0x4c, 0
b690: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9b 20 74 6f  x00 },  /* .. to
b6a0: 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 43   L */.  { 0x039C
b6b0: 2c 20 20 30 78 34 64 2c 20 30 78 30 30 20 7d 2c  ,  0x4d, 0x00 },
b6c0: 20 20 2f 2a 20 ce 9c 20 74 6f 20 4d 20 2a 2f 0a    /* .. to M */.
b6d0: 20 20 7b 20 30 78 30 33 39 44 2c 20 20 30 78 34    { 0x039D,  0x4
b6e0: 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  e, 0x00 },  /* .
b6f0: 9d 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78  . to N */.  { 0x
b700: 30 33 39 45 2c 20 20 30 78 35 38 2c 20 30 78 30  039E,  0x58, 0x0
b710: 30 20 7d 2c 20 20 2f 2a 20 ce 9e 20 74 6f 20 58  0 },  /* .. to X
b720: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 46 2c 20   */.  { 0x039F, 
b730: 20 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20   0x4f, 0x00 },  
b740: 2f 2a 20 ce 9f 20 74 6f 20 4f 20 2a 2f 0a 20 20  /* .. to O */.  
b750: 7b 20 30 78 30 33 41 30 2c 20 20 30 78 35 30 2c  { 0x03A0,  0x50,
b760: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a0 20   0x00 },  /* .. 
b770: 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to P */.  { 0x03
b780: 41 31 2c 20 20 30 78 35 32 2c 20 30 78 30 30 20  A1,  0x52, 0x00 
b790: 7d 2c 20 20 2f 2a 20 ce a1 20 74 6f 20 52 20 2a  },  /* .. to R *
b7a0: 2f 0a 20 20 7b 20 30 78 30 33 41 33 2c 20 20 30  /.  { 0x03A3,  0
b7b0: 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x53, 0x00 },  /*
b7c0: 20 ce a3 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20   .. to S */.  { 
b7d0: 30 78 30 33 41 34 2c 20 20 30 78 35 34 2c 20 30  0x03A4,  0x54, 0
b7e0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a4 20 74 6f  x00 },  /* .. to
b7f0: 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 35   T */.  { 0x03A5
b800: 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c  ,  0x59, 0x00 },
b810: 20 20 2f 2a 20 ce a5 20 74 6f 20 59 20 2a 2f 0a    /* .. to Y */.
b820: 20 20 7b 20 30 78 30 33 41 36 2c 20 20 30 78 34    { 0x03A6,  0x4
b830: 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  6, 0x00 },  /* .
b840: a6 20 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78  . to F */.  { 0x
b850: 30 33 41 37 2c 20 20 30 78 34 33 2c 20 30 78 36  03A7,  0x43, 0x6
b860: 38 20 7d 2c 20 20 2f 2a 20 ce a7 20 74 6f 20 43  8 },  /* .. to C
b870: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 38 2c  h */.  { 0x03A8,
b880: 20 20 30 78 35 30 2c 20 30 78 37 33 20 7d 2c 20    0x50, 0x73 }, 
b890: 20 2f 2a 20 ce a8 20 74 6f 20 50 73 20 2a 2f 0a   /* .. to Ps */.
b8a0: 20 20 7b 20 30 78 30 33 41 39 2c 20 20 30 78 34    { 0x03A9,  0x4
b8b0: 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  f, 0x00 },  /* .
b8c0: a9 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
b8d0: 30 33 41 41 2c 20 20 30 78 34 39 2c 20 30 78 30  03AA,  0x49, 0x0
b8e0: 30 20 7d 2c 20 20 2f 2a 20 ce aa 20 74 6f 20 49  0 },  /* .. to I
b8f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 42 2c 20   */.  { 0x03AB, 
b900: 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x59, 0x00 },  
b910: 2f 2a 20 ce ab 20 74 6f 20 59 20 2a 2f 0a 20 20  /* .. to Y */.  
b920: 7b 20 30 78 30 33 41 43 2c 20 20 30 78 36 31 2c  { 0x03AC,  0x61,
b930: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ac 20   0x00 },  /* .. 
b940: 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to a */.  { 0x03
b950: 41 44 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20  AD,  0x65, 0x00 
b960: 7d 2c 20 20 2f 2a 20 ce ad 20 74 6f 20 65 20 2a  },  /* .. to e *
b970: 2f 0a 20 20 7b 20 30 78 30 33 41 45 2c 20 20 30  /.  { 0x03AE,  0
b980: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
b990: 20 ce ae 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
b9a0: 30 78 30 33 41 46 2c 20 20 30 78 36 39 2c 20 30  0x03AF,  0x69, 0
b9b0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce af 20 74 6f  x00 },  /* .. to
b9c0: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 31   i */.  { 0x03B1
b9d0: 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c  ,  0x61, 0x00 },
b9e0: 20 20 2f 2a 20 ce b1 20 74 6f 20 61 20 2a 2f 0a    /* .. to a */.
b9f0: 20 20 7b 20 30 78 30 33 42 32 2c 20 20 30 78 36    { 0x03B2,  0x6
ba00: 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  2, 0x00 },  /* .
ba10: b2 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78  . to b */.  { 0x
ba20: 30 33 42 33 2c 20 20 30 78 36 37 2c 20 30 78 30  03B3,  0x67, 0x0
ba30: 30 20 7d 2c 20 20 2f 2a 20 ce b3 20 74 6f 20 67  0 },  /* .. to g
ba40: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 34 2c 20   */.  { 0x03B4, 
ba50: 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x64, 0x00 },  
ba60: 2f 2a 20 ce b4 20 74 6f 20 64 20 2a 2f 0a 20 20  /* .. to d */.  
ba70: 7b 20 30 78 30 33 42 35 2c 20 20 30 78 36 35 2c  { 0x03B5,  0x65,
ba80: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b5 20   0x00 },  /* .. 
ba90: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to e */.  { 0x03
baa0: 42 36 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20  B6,  0x7a, 0x00 
bab0: 7d 2c 20 20 2f 2a 20 ce b6 20 74 6f 20 7a 20 2a  },  /* .. to z *
bac0: 2f 0a 20 20 7b 20 30 78 30 33 42 37 2c 20 20 30  /.  { 0x03B7,  0
bad0: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
bae0: 20 ce b7 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
baf0: 30 78 30 33 42 38 2c 20 20 30 78 37 34 2c 20 30  0x03B8,  0x74, 0
bb00: 78 36 38 20 7d 2c 20 20 2f 2a 20 ce b8 20 74 6f  x68 },  /* .. to
bb10: 20 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42   th */.  { 0x03B
bb20: 39 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d  9,  0x69, 0x00 }
bb30: 2c 20 20 2f 2a 20 ce b9 20 74 6f 20 69 20 2a 2f  ,  /* .. to i */
bb40: 0a 20 20 7b 20 30 78 30 33 42 41 2c 20 20 30 78  .  { 0x03BA,  0x
bb50: 36 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6b, 0x00 },  /* 
bb60: ce ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30  .. to k */.  { 0
bb70: 78 30 33 42 42 2c 20 20 30 78 36 63 2c 20 30 78  x03BB,  0x6c, 0x
bb80: 30 30 20 7d 2c 20 20 2f 2a 20 ce bb 20 74 6f 20  00 },  /* .. to 
bb90: 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 43 2c  l */.  { 0x03BC,
bba0: 20 20 30 78 36 64 2c 20 30 78 30 30 20 7d 2c 20    0x6d, 0x00 }, 
bbb0: 20 2f 2a 20 ce bc 20 74 6f 20 6d 20 2a 2f 0a 20   /* .. to m */. 
bbc0: 20 7b 20 30 78 30 33 42 44 2c 20 20 30 78 36 65   { 0x03BD,  0x6e
bbd0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bd  , 0x00 },  /* ..
bbe0: 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30   to n */.  { 0x0
bbf0: 33 42 45 2c 20 20 30 78 37 38 2c 20 30 78 30 30  3BE,  0x78, 0x00
bc00: 20 7d 2c 20 20 2f 2a 20 ce be 20 74 6f 20 78 20   },  /* .. to x 
bc10: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 46 2c 20 20  */.  { 0x03BF,  
bc20: 30 78 36 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6f, 0x00 },  /
bc30: 2a 20 ce bf 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b  * .. to o */.  {
bc40: 20 30 78 30 33 43 30 2c 20 20 30 78 37 30 2c 20   0x03C0,  0x70, 
bc50: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 80 20 74  0x00 },  /* .. t
bc60: 6f 20 70 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43  o p */.  { 0x03C
bc70: 31 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20 7d  1,  0x72, 0x00 }
bc80: 2c 20 20 2f 2a 20 cf 81 20 74 6f 20 72 20 2a 2f  ,  /* .. to r */
bc90: 0a 20 20 7b 20 30 78 30 33 43 33 2c 20 20 30 78  .  { 0x03C3,  0x
bca0: 37 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  73, 0x00 },  /* 
bcb0: cf 83 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30  .. to s */.  { 0
bcc0: 78 30 33 43 34 2c 20 20 30 78 37 34 2c 20 30 78  x03C4,  0x74, 0x
bcd0: 30 30 20 7d 2c 20 20 2f 2a 20 cf 84 20 74 6f 20  00 },  /* .. to 
bce0: 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 35 2c  t */.  { 0x03C5,
bcf0: 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20    0x79, 0x00 }, 
bd00: 20 2f 2a 20 cf 85 20 74 6f 20 79 20 2a 2f 0a 20   /* .. to y */. 
bd10: 20 7b 20 30 78 30 33 43 36 2c 20 20 30 78 36 36   { 0x03C6,  0x66
bd20: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 86  , 0x00 },  /* ..
bd30: 20 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 30   to f */.  { 0x0
bd40: 33 43 37 2c 20 20 30 78 36 33 2c 20 30 78 36 38  3C7,  0x63, 0x68
bd50: 20 7d 2c 20 20 2f 2a 20 cf 87 20 74 6f 20 63 68   },  /* .. to ch
bd60: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 38 2c 20   */.  { 0x03C8, 
bd70: 20 30 78 37 30 2c 20 30 78 37 33 20 7d 2c 20 20   0x70, 0x73 },  
bd80: 2f 2a 20 cf 88 20 74 6f 20 70 73 20 2a 2f 0a 20  /* .. to ps */. 
bd90: 20 7b 20 30 78 30 33 43 39 2c 20 20 30 78 36 66   { 0x03C9,  0x6f
bda0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 89  , 0x00 },  /* ..
bdb0: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
bdc0: 33 43 41 2c 20 20 30 78 36 39 2c 20 30 78 30 30  3CA,  0x69, 0x00
bdd0: 20 7d 2c 20 20 2f 2a 20 cf 8a 20 74 6f 20 69 20   },  /* .. to i 
bde0: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 42 2c 20 20  */.  { 0x03CB,  
bdf0: 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x79, 0x00 },  /
be00: 2a 20 cf 8b 20 74 6f 20 79 20 2a 2f 0a 20 20 7b  * .. to y */.  {
be10: 20 30 78 30 33 43 43 2c 20 20 30 78 36 66 2c 20   0x03CC,  0x6f, 
be20: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8c 20 74  0x00 },  /* .. t
be30: 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43  o o */.  { 0x03C
be40: 44 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d  D,  0x79, 0x00 }
be50: 2c 20 20 2f 2a 20 cf 8d 20 74 6f 20 79 20 2a 2f  ,  /* .. to y */
be60: 0a 20 20 7b 20 30 78 30 33 43 45 2c 20 20 30 78  .  { 0x03CE,  0x
be70: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
be80: cf 8e 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
be90: 78 30 34 30 30 2c 20 20 30 78 34 35 2c 20 30 78  x0400,  0x45, 0x
bea0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 80 20 74 6f 20  00 },  /* .. to 
beb0: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 31 2c  E */.  { 0x0401,
bec0: 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20    0x45, 0x00 }, 
bed0: 20 2f 2a 20 d0 81 20 74 6f 20 45 20 2a 2f 0a 20   /* .. to E */. 
bee0: 20 7b 20 30 78 30 34 30 32 2c 20 20 30 78 34 34   { 0x0402,  0x44
bef0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 82  , 0x00 },  /* ..
bf00: 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30   to D */.  { 0x0
bf10: 34 30 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30  403,  0x47, 0x00
bf20: 20 7d 2c 20 20 2f 2a 20 d0 83 20 74 6f 20 47 20   },  /* .. to G 
bf30: 2a 2f 0a 20 20 7b 20 30 78 30 34 30 34 2c 20 20  */.  { 0x0404,  
bf40: 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x45, 0x00 },  /
bf50: 2a 20 d0 84 20 74 6f 20 45 20 2a 2f 0a 20 20 7b  * .. to E */.  {
bf60: 20 30 78 30 34 30 35 2c 20 20 30 78 35 61 2c 20   0x0405,  0x5a, 
bf70: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 85 20 74  0x00 },  /* .. t
bf80: 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30  o Z */.  { 0x040
bf90: 36 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  6,  0x49, 0x00 }
bfa0: 2c 20 20 2f 2a 20 d0 86 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
bfb0: 0a 20 20 7b 20 30 78 30 34 30 37 2c 20 20 30 78  .  { 0x0407,  0x
bfc0: 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  49, 0x00 },  /* 
bfd0: d0 87 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
bfe0: 78 30 34 30 38 2c 20 20 30 78 34 61 2c 20 30 78  x0408,  0x4a, 0x
bff0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 88 20 74 6f 20  00 },  /* .. to 
c000: 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 39 2c  J */.  { 0x0409,
c010: 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20    0x49, 0x00 }, 
c020: 20 2f 2a 20 d0 89 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
c030: 20 7b 20 30 78 30 34 30 41 2c 20 20 30 78 34 65   { 0x040A,  0x4e
c040: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8a  , 0x00 },  /* ..
c050: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
c060: 34 30 42 2c 20 20 30 78 34 34 2c 20 30 78 30 30  40B,  0x44, 0x00
c070: 20 7d 2c 20 20 2f 2a 20 d0 8b 20 74 6f 20 44 20   },  /* .. to D 
c080: 2a 2f 0a 20 20 7b 20 30 78 30 34 30 43 2c 20 20  */.  { 0x040C,  
c090: 30 78 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4b, 0x00 },  /
c0a0: 2a 20 d0 8c 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b  * .. to K */.  {
c0b0: 20 30 78 30 34 30 44 2c 20 20 30 78 34 39 2c 20   0x040D,  0x49, 
c0c0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8d 20 74  0x00 },  /* .. t
c0d0: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30  o I */.  { 0x040
c0e0: 45 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d  E,  0x55, 0x00 }
c0f0: 2c 20 20 2f 2a 20 d0 8e 20 74 6f 20 55 20 2a 2f  ,  /* .. to U */
c100: 0a 20 20 7b 20 30 78 30 34 30 46 2c 20 20 30 78  .  { 0x040F,  0x
c110: 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  44, 0x00 },  /* 
c120: d0 8f 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30  .. to D */.  { 0
c130: 78 30 34 31 30 2c 20 20 30 78 34 31 2c 20 30 78  x0410,  0x41, 0x
c140: 30 30 20 7d 2c 20 20 2f 2a 20 d0 90 20 74 6f 20  00 },  /* .. to 
c150: 41 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 31 2c  A */.  { 0x0411,
c160: 20 20 30 78 34 32 2c 20 30 78 30 30 20 7d 2c 20    0x42, 0x00 }, 
c170: 20 2f 2a 20 d0 91 20 74 6f 20 42 20 2a 2f 0a 20   /* .. to B */. 
c180: 20 7b 20 30 78 30 34 31 32 2c 20 20 30 78 35 36   { 0x0412,  0x56
c190: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 92  , 0x00 },  /* ..
c1a0: 20 74 6f 20 56 20 2a 2f 0a 20 20 7b 20 30 78 30   to V */.  { 0x0
c1b0: 34 31 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30  413,  0x47, 0x00
c1c0: 20 7d 2c 20 20 2f 2a 20 d0 93 20 74 6f 20 47 20   },  /* .. to G 
c1d0: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 34 2c 20 20  */.  { 0x0414,  
c1e0: 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x44, 0x00 },  /
c1f0: 2a 20 d0 94 20 74 6f 20 44 20 2a 2f 0a 20 20 7b  * .. to D */.  {
c200: 20 30 78 30 34 31 35 2c 20 20 30 78 34 35 2c 20   0x0415,  0x45, 
c210: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 95 20 74  0x00 },  /* .. t
c220: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o E */.  { 0x041
c230: 36 2c 20 20 30 78 35 61 2c 20 30 78 36 38 20 7d  6,  0x5a, 0x68 }
c240: 2c 20 20 2f 2a 20 d0 96 20 74 6f 20 5a 68 20 2a  ,  /* .. to Zh *
c250: 2f 0a 20 20 7b 20 30 78 30 34 31 37 2c 20 20 30  /.  { 0x0417,  0
c260: 78 35 61 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x5a, 0x00 },  /*
c270: 20 d0 97 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20   .. to Z */.  { 
c280: 30 78 30 34 31 38 2c 20 20 30 78 34 39 2c 20 30  0x0418,  0x49, 0
c290: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 98 20 74 6f  x00 },  /* .. to
c2a0: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 39   I */.  { 0x0419
c2b0: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
c2c0: 20 20 2f 2a 20 d0 99 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
c2d0: 20 20 7b 20 30 78 30 34 31 41 2c 20 20 30 78 34    { 0x041A,  0x4
c2e0: 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  b, 0x00 },  /* .
c2f0: 9a 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30 78  . to K */.  { 0x
c300: 30 34 31 42 2c 20 20 30 78 34 63 2c 20 30 78 30  041B,  0x4c, 0x0
c310: 30 20 7d 2c 20 20 2f 2a 20 d0 9b 20 74 6f 20 4c  0 },  /* .. to L
c320: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 43 2c 20   */.  { 0x041C, 
c330: 20 30 78 34 64 2c 20 30 78 30 30 20 7d 2c 20 20   0x4d, 0x00 },  
c340: 2f 2a 20 d0 9c 20 74 6f 20 4d 20 2a 2f 0a 20 20  /* .. to M */.  
c350: 7b 20 30 78 30 34 31 44 2c 20 20 30 78 34 65 2c  { 0x041D,  0x4e,
c360: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9d 20   0x00 },  /* .. 
c370: 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to N */.  { 0x04
c380: 31 45 2c 20 20 30 78 34 66 2c 20 30 78 30 30 20  1E,  0x4f, 0x00 
c390: 7d 2c 20 20 2f 2a 20 d0 9e 20 74 6f 20 4f 20 2a  },  /* .. to O *
c3a0: 2f 0a 20 20 7b 20 30 78 30 34 31 46 2c 20 20 30  /.  { 0x041F,  0
c3b0: 78 35 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x50, 0x00 },  /*
c3c0: 20 d0 9f 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20   .. to P */.  { 
c3d0: 30 78 30 34 32 30 2c 20 20 30 78 35 32 2c 20 30  0x0420,  0x52, 0
c3e0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a0 20 74 6f  x00 },  /* .. to
c3f0: 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 31   R */.  { 0x0421
c400: 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c  ,  0x53, 0x00 },
c410: 20 20 2f 2a 20 d0 a1 20 74 6f 20 53 20 2a 2f 0a    /* .. to S */.
c420: 20 20 7b 20 30 78 30 34 32 32 2c 20 20 30 78 35    { 0x0422,  0x5
c430: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  4, 0x00 },  /* .
c440: a2 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78  . to T */.  { 0x
c450: 30 34 32 33 2c 20 20 30 78 35 35 2c 20 30 78 30  0423,  0x55, 0x0
c460: 30 20 7d 2c 20 20 2f 2a 20 d0 a3 20 74 6f 20 55  0 },  /* .. to U
c470: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 34 2c 20   */.  { 0x0424, 
c480: 20 30 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20   0x46, 0x00 },  
c490: 2f 2a 20 d0 a4 20 74 6f 20 46 20 2a 2f 0a 20 20  /* .. to F */.  
c4a0: 7b 20 30 78 30 34 32 35 2c 20 20 30 78 34 62 2c  { 0x0425,  0x4b,
c4b0: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a5 20   0x68 },  /* .. 
c4c0: 74 6f 20 4b 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Kh */.  { 0x0
c4d0: 34 32 36 2c 20 20 30 78 35 34 2c 20 30 78 36 33  426,  0x54, 0x63
c4e0: 20 7d 2c 20 20 2f 2a 20 d0 a6 20 74 6f 20 54 63   },  /* .. to Tc
c4f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 37 2c 20   */.  { 0x0427, 
c500: 20 30 78 34 33 2c 20 30 78 36 38 20 7d 2c 20 20   0x43, 0x68 },  
c510: 2f 2a 20 d0 a7 20 74 6f 20 43 68 20 2a 2f 0a 20  /* .. to Ch */. 
c520: 20 7b 20 30 78 30 34 32 38 2c 20 20 30 78 35 33   { 0x0428,  0x53
c530: 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a8  , 0x68 },  /* ..
c540: 20 74 6f 20 53 68 20 2a 2f 0a 20 20 7b 20 30 78   to Sh */.  { 0x
c550: 30 34 32 39 2c 20 20 30 78 35 33 2c 20 30 78 36  0429,  0x53, 0x6
c560: 38 20 7d 2c 20 20 2f 2a 20 d0 a9 20 74 6f 20 53  8 },  /* .. to S
c570: 68 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32  hch */.  { 0x042
c580: 41 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d  A,  0x61, 0x00 }
c590: 2c 20 20 2f 2a 20 20 74 6f 20 41 20 2a 2f 0a 20  ,  /*  to A */. 
c5a0: 20 7b 20 30 78 30 34 32 42 2c 20 20 30 78 35 39   { 0x042B,  0x59
c5b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ab  , 0x00 },  /* ..
c5c0: 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30   to Y */.  { 0x0
c5d0: 34 32 43 2c 20 20 30 78 35 39 2c 20 30 78 30 30  42C,  0x59, 0x00
c5e0: 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 59 20 2a 2f   },  /*  to Y */
c5f0: 0a 20 20 7b 20 30 78 30 34 32 44 2c 20 20 30 78  .  { 0x042D,  0x
c600: 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  45, 0x00 },  /* 
c610: d0 ad 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
c620: 78 30 34 32 45 2c 20 20 30 78 34 39 2c 20 30 78  x042E,  0x49, 0x
c630: 37 35 20 7d 2c 20 20 2f 2a 20 d0 ae 20 74 6f 20  75 },  /* .. to 
c640: 49 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 46  Iu */.  { 0x042F
c650: 2c 20 20 30 78 34 39 2c 20 30 78 36 31 20 7d 2c  ,  0x49, 0x61 },
c660: 20 20 2f 2a 20 d0 af 20 74 6f 20 49 61 20 2a 2f    /* .. to Ia */
c670: 0a 20 20 7b 20 30 78 30 34 33 30 2c 20 20 30 78  .  { 0x0430,  0x
c680: 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  61, 0x00 },  /* 
c690: d0 b0 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30  .. to a */.  { 0
c6a0: 78 30 34 33 31 2c 20 20 30 78 36 32 2c 20 30 78  x0431,  0x62, 0x
c6b0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 b1 20 74 6f 20  00 },  /* .. to 
c6c0: 62 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 32 2c  b */.  { 0x0432,
c6d0: 20 20 30 78 37 36 2c 20 30 78 30 30 20 7d 2c 20    0x76, 0x00 }, 
c6e0: 20 2f 2a 20 d0 b2 20 74 6f 20 76 20 2a 2f 0a 20   /* .. to v */. 
c6f0: 20 7b 20 30 78 30 34 33 33 2c 20 20 30 78 36 37   { 0x0433,  0x67
c700: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b3  , 0x00 },  /* ..
c710: 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30   to g */.  { 0x0
c720: 34 33 34 2c 20 20 30 78 36 34 2c 20 30 78 30 30  434,  0x64, 0x00
c730: 20 7d 2c 20 20 2f 2a 20 d0 b4 20 74 6f 20 64 20   },  /* .. to d 
c740: 2a 2f 0a 20 20 7b 20 30 78 30 34 33 35 2c 20 20  */.  { 0x0435,  
c750: 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x65, 0x00 },  /
c760: 2a 20 d0 b5 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
c770: 20 30 78 30 34 33 36 2c 20 20 30 78 37 61 2c 20   0x0436,  0x7a, 
c780: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 b6 20 74  0x68 },  /* .. t
c790: 6f 20 7a 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34  o zh */.  { 0x04
c7a0: 33 37 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20  37,  0x7a, 0x00 
c7b0: 7d 2c 20 20 2f 2a 20 d0 b7 20 74 6f 20 7a 20 2a  },  /* .. to z *
c7c0: 2f 0a 20 20 7b 20 30 78 30 34 33 38 2c 20 20 30  /.  { 0x0438,  0
c7d0: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
c7e0: 20 d0 b8 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
c7f0: 30 78 30 34 33 39 2c 20 20 30 78 36 39 2c 20 30  0x0439,  0x69, 0
c800: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b9 20 74 6f  x00 },  /* .. to
c810: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 41   i */.  { 0x043A
c820: 2c 20 20 30 78 36 62 2c 20 30 78 30 30 20 7d 2c  ,  0x6b, 0x00 },
c830: 20 20 2f 2a 20 d0 ba 20 74 6f 20 6b 20 2a 2f 0a    /* .. to k */.
c840: 20 20 7b 20 30 78 30 34 33 42 2c 20 20 30 78 36    { 0x043B,  0x6
c850: 63 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  c, 0x00 },  /* .
c860: bb 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78  . to l */.  { 0x
c870: 30 34 33 43 2c 20 20 30 78 36 64 2c 20 30 78 30  043C,  0x6d, 0x0
c880: 30 20 7d 2c 20 20 2f 2a 20 d0 bc 20 74 6f 20 6d  0 },  /* .. to m
c890: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 44 2c 20   */.  { 0x043D, 
c8a0: 20 30 78 36 65 2c 20 30 78 30 30 20 7d 2c 20 20   0x6e, 0x00 },  
c8b0: 2f 2a 20 d0 bd 20 74 6f 20 6e 20 2a 2f 0a 20 20  /* .. to n */.  
c8c0: 7b 20 30 78 30 34 33 45 2c 20 20 30 78 36 66 2c  { 0x043E,  0x6f,
c8d0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 be 20   0x00 },  /* .. 
c8e0: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to o */.  { 0x04
c8f0: 33 46 2c 20 20 30 78 37 30 2c 20 30 78 30 30 20  3F,  0x70, 0x00 
c900: 7d 2c 20 20 2f 2a 20 d0 bf 20 74 6f 20 70 20 2a  },  /* .. to p *
c910: 2f 0a 20 20 7b 20 30 78 30 34 34 30 2c 20 20 30  /.  { 0x0440,  0
c920: 78 37 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x72, 0x00 },  /*
c930: 20 d1 80 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20   .. to r */.  { 
c940: 30 78 30 34 34 31 2c 20 20 30 78 37 33 2c 20 30  0x0441,  0x73, 0
c950: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 81 20 74 6f  x00 },  /* .. to
c960: 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 32   s */.  { 0x0442
c970: 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c  ,  0x74, 0x00 },
c980: 20 20 2f 2a 20 d1 82 20 74 6f 20 74 20 2a 2f 0a    /* .. to t */.
c990: 20 20 7b 20 30 78 30 34 34 33 2c 20 20 30 78 37    { 0x0443,  0x7
c9a0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  5, 0x00 },  /* .
c9b0: 83 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78  . to u */.  { 0x
c9c0: 30 34 34 34 2c 20 20 30 78 36 36 2c 20 30 78 30  0444,  0x66, 0x0
c9d0: 30 20 7d 2c 20 20 2f 2a 20 d1 84 20 74 6f 20 66  0 },  /* .. to f
c9e0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 35 2c 20   */.  { 0x0445, 
c9f0: 20 30 78 36 62 2c 20 30 78 36 38 20 7d 2c 20 20   0x6b, 0x68 },  
ca00: 2f 2a 20 d1 85 20 74 6f 20 6b 68 20 2a 2f 0a 20  /* .. to kh */. 
ca10: 20 7b 20 30 78 30 34 34 36 2c 20 20 30 78 37 34   { 0x0446,  0x74
ca20: 2c 20 30 78 36 33 20 7d 2c 20 20 2f 2a 20 d1 86  , 0x63 },  /* ..
ca30: 20 74 6f 20 74 63 20 2a 2f 0a 20 20 7b 20 30 78   to tc */.  { 0x
ca40: 30 34 34 37 2c 20 20 30 78 36 33 2c 20 30 78 36  0447,  0x63, 0x6
ca50: 38 20 7d 2c 20 20 2f 2a 20 d1 87 20 74 6f 20 63  8 },  /* .. to c
ca60: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 38 2c  h */.  { 0x0448,
ca70: 20 20 30 78 37 33 2c 20 30 78 36 38 20 7d 2c 20    0x73, 0x68 }, 
ca80: 20 2f 2a 20 d1 88 20 74 6f 20 73 68 20 2a 2f 0a   /* .. to sh */.
ca90: 20 20 7b 20 30 78 30 34 34 39 2c 20 20 30 78 37    { 0x0449,  0x7
caa0: 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d1  3, 0x68 },  /* .
cab0: 89 20 74 6f 20 73 68 63 68 20 2a 2f 0a 20 20 7b  . to shch */.  {
cac0: 20 30 78 30 34 34 41 2c 20 20 30 78 36 31 2c 20   0x044A,  0x61, 
cad0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20  0x00 },  /*  to 
cae0: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 42 2c  a */.  { 0x044B,
caf0: 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20    0x79, 0x00 }, 
cb00: 20 2f 2a 20 d1 8b 20 74 6f 20 79 20 2a 2f 0a 20   /* .. to y */. 
cb10: 20 7b 20 30 78 30 34 34 43 2c 20 20 30 78 37 39   { 0x044C,  0x79
cb20: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74  , 0x00 },  /*  t
cb30: 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34  o y */.  { 0x044
cb40: 44 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d  D,  0x65, 0x00 }
cb50: 2c 20 20 2f 2a 20 d1 8d 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
cb60: 0a 20 20 7b 20 30 78 30 34 34 45 2c 20 20 30 78  .  { 0x044E,  0x
cb70: 36 39 2c 20 30 78 37 35 20 7d 2c 20 20 2f 2a 20  69, 0x75 },  /* 
cb80: d1 8e 20 74 6f 20 69 75 20 2a 2f 0a 20 20 7b 20  .. to iu */.  { 
cb90: 30 78 30 34 34 46 2c 20 20 30 78 36 39 2c 20 30  0x044F,  0x69, 0
cba0: 78 36 31 20 7d 2c 20 20 2f 2a 20 d1 8f 20 74 6f  x61 },  /* .. to
cbb0: 20 69 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35   ia */.  { 0x045
cbc0: 30 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d  0,  0x65, 0x00 }
cbd0: 2c 20 20 2f 2a 20 d1 90 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
cbe0: 0a 20 20 7b 20 30 78 30 34 35 31 2c 20 20 30 78  .  { 0x0451,  0x
cbf0: 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  65, 0x00 },  /* 
cc00: d1 91 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
cc10: 78 30 34 35 32 2c 20 20 30 78 36 34 2c 20 30 78  x0452,  0x64, 0x
cc20: 30 30 20 7d 2c 20 20 2f 2a 20 d1 92 20 74 6f 20  00 },  /* .. to 
cc30: 64 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 33 2c  d */.  { 0x0453,
cc40: 20 20 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20    0x67, 0x00 }, 
cc50: 20 2f 2a 20 d1 93 20 74 6f 20 67 20 2a 2f 0a 20   /* .. to g */. 
cc60: 20 7b 20 30 78 30 34 35 34 2c 20 20 30 78 36 35   { 0x0454,  0x65
cc70: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 94  , 0x00 },  /* ..
cc80: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
cc90: 34 35 35 2c 20 20 30 78 37 61 2c 20 30 78 30 30  455,  0x7a, 0x00
cca0: 20 7d 2c 20 20 2f 2a 20 d1 95 20 74 6f 20 7a 20   },  /* .. to z 
ccb0: 2a 2f 0a 20 20 7b 20 30 78 30 34 35 36 2c 20 20  */.  { 0x0456,  
ccc0: 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x69, 0x00 },  /
ccd0: 2a 20 d1 96 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
cce0: 20 30 78 30 34 35 37 2c 20 20 30 78 36 39 2c 20   0x0457,  0x69, 
ccf0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 97 20 74  0x00 },  /* .. t
cd00: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35  o i */.  { 0x045
cd10: 38 2c 20 20 30 78 36 61 2c 20 30 78 30 30 20 7d  8,  0x6a, 0x00 }
cd20: 2c 20 20 2f 2a 20 d1 98 20 74 6f 20 6a 20 2a 2f  ,  /* .. to j */
cd30: 0a 20 20 7b 20 30 78 30 34 35 39 2c 20 20 30 78  .  { 0x0459,  0x
cd40: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
cd50: d1 99 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
cd60: 78 30 34 35 41 2c 20 20 30 78 36 65 2c 20 30 78  x045A,  0x6e, 0x
cd70: 30 30 20 7d 2c 20 20 2f 2a 20 d1 9a 20 74 6f 20  00 },  /* .. to 
cd80: 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 42 2c  n */.  { 0x045B,
cd90: 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20    0x64, 0x00 }, 
cda0: 20 2f 2a 20 d1 9b 20 74 6f 20 64 20 2a 2f 0a 20   /* .. to d */. 
cdb0: 20 7b 20 30 78 30 34 35 43 2c 20 20 30 78 36 62   { 0x045C,  0x6b
cdc0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9c  , 0x00 },  /* ..
cdd0: 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30   to k */.  { 0x0
cde0: 34 35 44 2c 20 20 30 78 36 39 2c 20 30 78 30 30  45D,  0x69, 0x00
cdf0: 20 7d 2c 20 20 2f 2a 20 d1 9d 20 74 6f 20 69 20   },  /* .. to i 
ce00: 2a 2f 0a 20 20 7b 20 30 78 30 34 35 45 2c 20 20  */.  { 0x045E,  
ce10: 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x75, 0x00 },  /
ce20: 2a 20 d1 9e 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
ce30: 20 30 78 30 34 35 46 2c 20 20 30 78 36 34 2c 20   0x045F,  0x64, 
ce40: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9f 20 74  0x00 },  /* .. t
ce50: 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30  o d */.  { 0x1E0
ce60: 32 2c 20 20 30 78 34 32 2c 20 30 78 30 30 20 7d  2,  0x42, 0x00 }
ce70: 2c 20 20 2f 2a 20 e1 b8 82 20 74 6f 20 42 20 2a  ,  /* ... to B *
ce80: 2f 0a 20 20 7b 20 30 78 31 45 30 33 2c 20 20 30  /.  { 0x1E03,  0
ce90: 78 36 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x62, 0x00 },  /*
cea0: 20 e1 b8 83 20 74 6f 20 62 20 2a 2f 0a 20 20 7b   ... to b */.  {
ceb0: 20 30 78 31 45 30 41 2c 20 20 30 78 34 34 2c 20   0x1E0A,  0x44, 
cec0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 8a 20  0x00 },  /* ... 
ced0: 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to D */.  { 0x1E
cee0: 30 42 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20  0B,  0x64, 0x00 
cef0: 7d 2c 20 20 2f 2a 20 e1 b8 8b 20 74 6f 20 64 20  },  /* ... to d 
cf00: 2a 2f 0a 20 20 7b 20 30 78 31 45 31 45 2c 20 20  */.  { 0x1E1E,  
cf10: 30 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x46, 0x00 },  /
cf20: 2a 20 e1 b8 9e 20 74 6f 20 46 20 2a 2f 0a 20 20  * ... to F */.  
cf30: 7b 20 30 78 31 45 31 46 2c 20 20 30 78 36 36 2c  { 0x1E1F,  0x66,
cf40: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 9f   0x00 },  /* ...
cf50: 20 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 31   to f */.  { 0x1
cf60: 45 34 30 2c 20 20 30 78 34 44 2c 20 30 78 30 30  E40,  0x4D, 0x00
cf70: 20 7d 2c 20 20 2f 2a 20 e1 b9 80 20 74 6f 20 4d   },  /* ... to M
cf80: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 34 31 2c 20   */.  { 0x1E41, 
cf90: 20 30 78 36 44 2c 20 30 78 30 30 20 7d 2c 20 20   0x6D, 0x00 },  
cfa0: 2f 2a 20 e1 b9 81 20 74 6f 20 6d 20 2a 2f 0a 20  /* ... to m */. 
cfb0: 20 7b 20 30 78 31 45 35 36 2c 20 20 30 78 35 30   { 0x1E56,  0x50
cfc0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9  , 0x00 },  /* ..
cfd0: 96 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78  . to P */.  { 0x
cfe0: 31 45 35 37 2c 20 20 30 78 37 30 2c 20 30 78 30  1E57,  0x70, 0x0
cff0: 30 20 7d 2c 20 20 2f 2a 20 e1 b9 97 20 74 6f 20  0 },  /* ... to 
d000: 70 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 30 2c  p */.  { 0x1E60,
d010: 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20    0x53, 0x00 }, 
d020: 20 2f 2a 20 e1 b9 a0 20 74 6f 20 53 20 2a 2f 0a   /* ... to S */.
d030: 20 20 7b 20 30 78 31 45 36 31 2c 20 20 30 78 37    { 0x1E61,  0x7
d040: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  3, 0x00 },  /* .
d050: b9 a1 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30  .. to s */.  { 0
d060: 78 31 45 36 41 2c 20 20 30 78 35 34 2c 20 30 78  x1E6A,  0x54, 0x
d070: 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 aa 20 74 6f  00 },  /* ... to
d080: 20 54 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 42   T */.  { 0x1E6B
d090: 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c  ,  0x74, 0x00 },
d0a0: 20 20 2f 2a 20 e1 b9 ab 20 74 6f 20 74 20 2a 2f    /* ... to t */
d0b0: 0a 20 20 7b 20 30 78 31 45 38 30 2c 20 20 30 78  .  { 0x1E80,  0x
d0c0: 35 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  57, 0x00 },  /* 
d0d0: e1 ba 80 20 74 6f 20 57 20 2a 2f 0a 20 20 7b 20  ... to W */.  { 
d0e0: 30 78 31 45 38 31 2c 20 20 30 78 37 37 2c 20 30  0x1E81,  0x77, 0
d0f0: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 81 20 74  x00 },  /* ... t
d100: 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38  o w */.  { 0x1E8
d110: 32 2c 20 20 30 78 35 37 2c 20 30 78 30 30 20 7d  2,  0x57, 0x00 }
d120: 2c 20 20 2f 2a 20 e1 ba 82 20 74 6f 20 57 20 2a  ,  /* ... to W *
d130: 2f 0a 20 20 7b 20 30 78 31 45 38 33 2c 20 20 30  /.  { 0x1E83,  0
d140: 78 37 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x77, 0x00 },  /*
d150: 20 e1 ba 83 20 74 6f 20 77 20 2a 2f 0a 20 20 7b   ... to w */.  {
d160: 20 30 78 31 45 38 34 2c 20 20 30 78 35 37 2c 20   0x1E84,  0x57, 
d170: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 84 20  0x00 },  /* ... 
d180: 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to W */.  { 0x1E
d190: 38 35 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20  85,  0x77, 0x00 
d1a0: 7d 2c 20 20 2f 2a 20 e1 ba 85 20 74 6f 20 77 20  },  /* ... to w 
d1b0: 2a 2f 0a 20 20 7b 20 30 78 31 45 46 32 2c 20 20  */.  { 0x1EF2,  
d1c0: 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x59, 0x00 },  /
d1d0: 2a 20 e1 bb b2 20 74 6f 20 59 20 2a 2f 0a 20 20  * ... to Y */.  
d1e0: 7b 20 30 78 31 45 46 33 2c 20 20 30 78 37 39 2c  { 0x1EF3,  0x79,
d1f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 bb b3   0x00 },  /* ...
d200: 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 46   to y */.  { 0xF
d210: 42 30 30 2c 20 20 30 78 36 36 2c 20 30 78 36 36  B00,  0x66, 0x66
d220: 20 7d 2c 20 20 2f 2a 20 ef ac 80 20 74 6f 20 66   },  /* ... to f
d230: 66 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 31 2c  f */.  { 0xFB01,
d240: 20 20 30 78 36 36 2c 20 30 78 36 39 20 7d 2c 20    0x66, 0x69 }, 
d250: 20 2f 2a 20 ef ac 81 20 74 6f 20 66 69 20 2a 2f   /* ... to fi */
d260: 0a 20 20 7b 20 30 78 46 42 30 32 2c 20 20 30 78  .  { 0xFB02,  0x
d270: 36 36 2c 20 30 78 36 43 20 7d 2c 20 20 2f 2a 20  66, 0x6C },  /* 
d280: ef ac 82 20 74 6f 20 66 6c 20 2a 2f 0a 20 20 7b  ... to fl */.  {
d290: 20 30 78 46 42 30 35 2c 20 20 30 78 37 33 2c 20   0xFB05,  0x73, 
d2a0: 30 78 37 34 20 7d 2c 20 20 2f 2a 20 ef ac 85 20  0x74 },  /* ... 
d2b0: 74 6f 20 73 74 20 2a 2f 0a 20 20 7b 20 30 78 46  to st */.  { 0xF
d2c0: 42 30 36 2c 20 20 30 78 37 33 2c 20 30 78 37 34  B06,  0x73, 0x74
d2d0: 20 7d 2c 20 20 2f 2a 20 ef ac 86 20 74 6f 20 73   },  /* ... to s
d2e0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  t */.};../*.** C
d2f0: 6f 6e 76 65 72 74 20 74 68 65 20 69 6e 70 75 74  onvert the input
d300: 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 55 54 46   string from UTF
d310: 2d 38 20 69 6e 74 6f 20 70 75 72 65 20 41 53 43  -8 into pure ASC
d320: 49 49 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67  II by converting
d330: 0a 2a 2a 20 61 6c 6c 20 6e 6f 6e 2d 41 53 43 49  .** all non-ASCI
d340: 49 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20  I characters to 
d350: 73 6f 6d 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  some combination
d360: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
d370: 6e 20 74 68 65 0a 2a 2a 20 41 53 43 49 49 20 73  n the.** ASCII s
d380: 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ubset..**.** The
d390: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
d3a0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 6d   might contain m
d3b0: 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 20 74  ore characters t
d3c0: 68 61 6e 20 74 68 65 20 69 6e 70 75 74 2e 0a 2a  han the input..*
d3d0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
d3e0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
d3f0: 73 74 72 69 6e 67 20 63 6f 6d 65 73 20 66 72 6f  string comes fro
d400: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
d410: 28 29 20 61 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64  () and.** should
d420: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
d430: 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
d440: 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ic unsigned char
d450: 20 2a 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28   *transliterate(
d460: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
d470: 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49  har *zIn, int nI
d480: 6e 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  n){.  unsigned c
d490: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
d4a0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 49 6e 2a  te3_malloc( nIn*
d4b0: 34 20 2b 20 31 20 29 3b 0a 20 20 69 6e 74 20 63  4 + 1 );.  int c
d4c0: 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69 66  , sz, nOut;.  if
d4d0: 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75  ( zOut==0 ) retu
d4e0: 72 6e 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20 30  rn 0;.  nOut = 0
d4f0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30  ;.  while( nIn>0
d500: 20 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66 38   ){.    c = utf8
d510: 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20 26  Read(zIn, nIn, &
d520: 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20  sz);.    zIn += 
d530: 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20 73  sz;.    nIn -= s
d540: 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c 3d 31 32  z;.    if( c<=12
d550: 37 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b  7 ){.      zOut[
d560: 6e 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  nOut++] = c;.   
d570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
d580: 74 20 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b  t xTop, xBtm, x;
d590: 0a 20 20 20 20 20 20 78 54 6f 70 20 3d 20 73 69  .      xTop = si
d5a0: 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f 73  zeof(translit)/s
d5b0: 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30  izeof(translit[0
d5c0: 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 78 42  ]) - 1;.      xB
d5d0: 74 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  tm = 0;.      wh
d5e0: 69 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20  ile( xTop>=xBtm 
d5f0: 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28  ){.        x = (
d600: 78 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a  xTop + xBtm)/2;.
d610: 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61 6e          if( tran
d620: 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63  slit[x].cFrom==c
d630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f   ){.          zO
d640: 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61  ut[nOut++] = tra
d650: 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 30 3b 0a 20  nslit[x].cTo0;. 
d660: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61           if( tra
d670: 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 20 29 7b  nslit[x].cTo1 ){
d680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75  .            zOu
d690: 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61 6e  t[nOut++] = tran
d6a0: 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 3b 0a 20 20  slit[x].cTo1;.  
d6b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d6c0: 20 61 6e 20 65 78 74 72 61 20 22 63 68 22 20 61   an extra "ch" a
d6d0: 66 74 65 72 20 74 68 65 20 22 73 68 22 20 66 6f  fter the "sh" fo
d6e0: 72 20 d0 a9 20 61 6e 64 20 d1 89 20 2a 2f 0a 20  r .. and .. */. 
d6f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
d700: 3d 3d 30 78 30 34 32 39 20 7c 7c 20 63 3d 3d 20  ==0x0429 || c== 
d710: 30 78 30 34 34 39 20 29 7b 0a 20 20 20 20 20 20  0x0449 ){.      
d720: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f 75          zOut[nOu
d730: 74 2b 2b 5d 20 3d 20 27 63 27 3b 0a 20 20 20 20  t++] = 'c';.    
d740: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e            zOut[n
d750: 4f 75 74 2b 2b 5d 20 3d 20 27 68 27 3b 0a 20 20  Out++] = 'h';.  
d760: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d780: 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
d790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d7a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 72 61 6e    }else if( tran
d7b0: 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3e 63 20  slit[x].cFrom>c 
d7c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 54 6f  ){.          xTo
d7d0: 70 20 3d 20 78 2d 31 3b 0a 20 20 20 20 20 20 20  p = x-1;.       
d7e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d7f0: 20 20 78 42 74 6d 20 3d 20 78 2b 31 3b 0a 20 20    xBtm = x+1;.  
d800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d810: 20 20 20 20 20 20 69 66 28 20 63 20 29 20 7a 4f        if( c ) zO
d820: 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 27 3f 27  ut[nOut++] = '?'
d830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4f  ;.    }.  }.  zO
d840: 75 74 5b 6e 4f 75 74 5d 20 3d 20 30 3b 0a 20 20  ut[nOut] = 0;.  
d850: 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a  return zOut;.}..
d860: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d870: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
d880: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 68 6f  cters in the sho
d890: 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rtest prefix of 
d8a0: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74 72  the input.** str
d8b0: 69 6e 67 20 74 68 61 74 20 74 72 61 6e 73 6c 69  ing that transli
d8c0: 74 65 72 61 74 65 73 20 74 6f 20 61 6e 20 41 53  terates to an AS
d8d0: 43 49 49 20 73 74 72 69 6e 67 20 6e 54 72 61 6e  CII string nTran
d8e0: 73 20 62 79 74 65 73 20 6f 72 20 6c 6f 6e 67 65  s bytes or longe
d8f0: 72 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  r..** Or, if the
d900: 20 74 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e   transliteration
d910: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74   of the input st
d920: 72 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61  ring is less tha
d930: 6e 20 6e 54 72 61 6e 73 0a 2a 2a 20 62 79 74 65  n nTrans.** byte
d940: 73 20 69 6e 20 73 69 7a 65 2c 20 72 65 74 75 72  s in size, retur
d950: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
d960: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
d970: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a  e input string..
d980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
d990: 61 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65  anslen_to_charle
d9a0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  n(const char *zI
d9b0: 6e 2c 20 69 6e 74 20 6e 49 6e 2c 20 69 6e 74 20  n, int nIn, int 
d9c0: 6e 54 72 61 6e 73 29 7b 0a 20 20 69 6e 74 20 69  nTrans){.  int i
d9d0: 2c 20 63 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20  , c, sz, nOut;. 
d9e0: 20 69 6e 74 20 6e 43 68 61 72 3b 0a 0a 20 20 69   int nChar;..  i
d9f0: 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 66   = nOut = 0;.  f
da00: 6f 72 28 6e 43 68 61 72 3d 30 3b 20 69 3c 6e 49  or(nChar=0; i<nI
da10: 6e 20 26 26 20 6e 4f 75 74 3c 6e 54 72 61 6e 73  n && nOut<nTrans
da20: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
da30: 63 20 3d 20 75 74 66 38 52 65 61 64 28 28 63 6f  c = utf8Read((co
da40: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
da50: 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49 6e  r *)&zIn[i], nIn
da60: 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 20  -i, &sz);.    i 
da70: 2b 3d 20 73 7a 3b 0a 0a 20 20 20 20 6e 4f 75 74  += sz;..    nOut
da80: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63 3e 3d 31  ++;.    if( c>=1
da90: 32 38 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  28 ){.      int 
daa0: 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a 20  xTop, xBtm, x;. 
dab0: 20 20 20 20 20 78 54 6f 70 20 3d 20 73 69 7a 65       xTop = size
dac0: 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a  of(translit)/siz
dad0: 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29  eof(translit[0])
dae0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 78 42 74 6d   - 1;.      xBtm
daf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 0;.      whil
db00: 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20 29 7b  e( xTop>=xBtm ){
db10: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 78 54  .        x = (xT
db20: 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a 20 20  op + xBtm)/2;.  
db30: 20 20 20 20 20 20 69 66 28 20 74 72 61 6e 73 6c        if( transl
db40: 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20 29  it[x].cFrom==c )
db50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
db60: 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31  translit[x].cTo1
db70: 20 29 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20   ) nOut++;.     
db80: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 78 30 34       if( c==0x04
db90: 32 39 20 7c 7c 20 63 3d 3d 20 30 78 30 34 34 39  29 || c== 0x0449
dba0: 20 29 20 6e 4f 75 74 20 2b 3d 20 32 3b 0a 20 20   ) nOut += 2;.  
dbb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dbc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
dbd0: 20 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 46 72   translit[x].cFr
dbe0: 6f 6d 3e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  om>c ){.        
dbf0: 20 20 78 54 6f 70 20 3d 20 78 2d 31 3b 0a 20 20    xTop = x-1;.  
dc00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dc10: 20 20 20 20 20 20 20 78 42 74 6d 20 3d 20 78 2b         xBtm = x+
dc20: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
dc30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
dc40: 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a    return nChar;.
dc50: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70 65  }.../*.**    spe
dc60: 6c 6c 66 69 78 31 5f 74 72 61 6e 73 6c 69 74 28  llfix1_translit(
dc70: 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  X).**.** Convert
dc80: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
dc90: 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 41 53 43 49  ontains non-ASCI
dca0: 49 20 52 6f 6d 61 6e 20 63 68 61 72 61 63 74 65  I Roman characte
dcb0: 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 70 75 72 65  rs into .** pure
dcc0: 20 41 53 43 49 49 2e 0a 2a 2f 0a 73 74 61 74 69   ASCII..*/.stati
dcd0: 63 20 76 6f 69 64 20 74 72 61 6e 73 6c 69 74 65  c void translite
dce0: 72 61 74 65 53 71 6c 46 75 6e 63 28 0a 20 20 73  rateSqlFunc(.  s
dcf0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
dd00: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
dd10: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
dd20: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
dd30: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
dd40: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 73 71 6c 69  char *zIn = sqli
dd50: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
dd60: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  rgv[0]);.  int n
dd70: 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
dd80: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
dd90: 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  );.  unsigned ch
dda0: 61 72 20 2a 7a 4f 75 74 20 3d 20 74 72 61 6e 73  ar *zOut = trans
ddb0: 6c 69 74 65 72 61 74 65 28 7a 49 6e 2c 20 6e 49  literate(zIn, nI
ddc0: 6e 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d  n);.  if( zOut==
ddd0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
dde0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
ddf0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
de00: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
de10: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
de20: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a  ontext, (char*)z
de30: 4f 75 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  Out, -1, sqlite3
de40: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _free);.  }.}../
de50: 2a 0a 2a 2a 20 20 20 20 73 70 65 6c 6c 66 69 78  *.**    spellfix
de60: 31 5f 73 63 72 69 70 74 63 6f 64 65 28 58 29 0a  1_scriptcode(X).
de70: 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 74  **.** Try to det
de80: 65 72 6d 69 6e 65 20 74 68 65 20 64 6f 6d 69 6e  ermine the domin
de90: 61 6e 74 20 73 63 72 69 70 74 20 75 73 65 64 20  ant script used 
dea0: 62 79 20 74 68 65 20 77 6f 72 64 20 58 20 61 6e  by the word X an
deb0: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20  d return.** its 
dec0: 49 53 4f 20 31 35 39 32 34 20 6e 75 6d 65 72 69  ISO 15924 numeri
ded0: 63 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  c code..**.** Th
dee0: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
def0: 65 6e 74 61 74 69 6f 6e 20 6f 6e 6c 79 20 75 6e  entation only un
df00: 64 65 72 73 74 61 6e 64 73 20 74 68 65 20 66 6f  derstands the fo
df10: 6c 6c 6f 77 69 6e 67 20 73 63 72 69 70 74 73 3a  llowing scripts:
df20: 0a 2a 2a 0a 2a 2a 20 20 20 20 32 31 35 20 20 28  .**.**    215  (
df30: 4c 61 74 69 6e 29 0a 2a 2a 20 20 20 20 32 32 30  Latin).**    220
df40: 20 20 28 43 79 72 69 6c 6c 69 63 29 0a 2a 2a 20    (Cyrillic).** 
df50: 20 20 20 32 30 30 20 20 28 47 72 65 65 6b 29 0a     200  (Greek).
df60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
df70: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 39  ne will return 9
df80: 39 38 20 69 66 20 74 68 65 20 69 6e 70 75 74 20  98 if the input 
df90: 58 20 63 6f 6e 74 61 69 6e 73 20 63 68 61 72 61  X contains chara
dfa0: 63 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 77  cters from.** tw
dfb0: 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  o or more of the
dfc0: 20 61 62 6f 76 65 20 73 63 72 69 70 74 73 20 6f   above scripts o
dfd0: 72 20 39 39 39 20 69 66 20 58 20 63 6f 6e 74 61  r 999 if X conta
dfe0: 69 6e 73 20 6e 6f 20 63 68 61 72 61 63 74 65 72  ins no character
dff0: 73 0a 2a 2a 20 66 72 6f 6d 20 61 6e 79 20 6f 66  s.** from any of
e000: 20 74 68 65 20 61 62 6f 76 65 20 73 63 72 69 70   the above scrip
e010: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
e020: 69 64 20 73 63 72 69 70 74 43 6f 64 65 53 71 6c  id scriptCodeSql
e030: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
e040: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
e050: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
e060: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
e070: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
e080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
e090: 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
e0a0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
e0b0: 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 73 71  ;.  int nIn = sq
e0c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
e0d0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  s(argv[0]);.  in
e0e0: 74 20 63 2c 20 73 7a 3b 0a 20 20 69 6e 74 20 73  t c, sz;.  int s
e0f0: 63 72 69 70 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  criptMask = 0;. 
e100: 20 69 6e 74 20 72 65 73 3b 0a 23 20 64 65 66 69   int res;.# defi
e110: 6e 65 20 53 43 52 49 50 54 5f 4c 41 54 49 4e 20  ne SCRIPT_LATIN 
e120: 20 20 20 20 20 20 30 78 30 30 30 31 0a 23 20 64        0x0001.# d
e130: 65 66 69 6e 65 20 53 43 52 49 50 54 5f 43 59 52  efine SCRIPT_CYR
e140: 49 4c 4c 49 43 20 20 20 20 30 78 30 30 30 32 0a  ILLIC    0x0002.
e150: 23 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f  # define SCRIPT_
e160: 47 52 45 45 4b 20 20 20 20 20 20 20 30 78 30 30  GREEK       0x00
e170: 30 34 0a 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e  04..  while( nIn
e180: 3e 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 75 74  >0 ){.    c = ut
e190: 66 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c  f8Read(zIn, nIn,
e1a0: 20 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b   &sz);.    zIn +
e1b0: 3d 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d  = sz;.    nIn -=
e1c0: 20 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c 30   sz;.    if( c<0
e1d0: 78 30 32 61 66 20 29 7b 0a 20 20 20 20 20 20 73  x02af ){.      s
e1e0: 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52  criptMask |= SCR
e1f0: 49 50 54 5f 4c 41 54 49 4e 3b 0a 20 20 20 20 7d  IPT_LATIN;.    }
e200: 65 6c 73 65 20 69 66 28 20 63 3e 3d 30 78 30 34  else if( c>=0x04
e210: 30 30 20 26 26 20 63 3c 3d 30 78 30 34 66 66 20  00 && c<=0x04ff 
e220: 29 7b 0a 20 20 20 20 20 20 73 63 72 69 70 74 4d  ){.      scriptM
e230: 61 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 43 59  ask |= SCRIPT_CY
e240: 52 49 4c 4c 49 43 3b 0a 20 20 20 20 7d 65 6c 73  RILLIC;.    }els
e250: 65 20 69 66 28 20 63 3e 3d 30 78 30 33 38 36 20  e if( c>=0x0386 
e260: 26 26 20 63 3c 3d 30 78 30 33 63 65 20 29 7b 0a  && c<=0x03ce ){.
e270: 20 20 20 20 20 20 73 63 72 69 70 74 4d 61 73 6b        scriptMask
e280: 20 7c 3d 20 53 43 52 49 50 54 5f 47 52 45 45 4b   |= SCRIPT_GREEK
e290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77  ;.    }.  }.  sw
e2a0: 69 74 63 68 28 20 73 63 72 69 70 74 4d 61 73 6b  itch( scriptMask
e2b0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 20   ){.    case 0: 
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
e2d0: 65 73 20 3d 20 39 39 39 3b 20 62 72 65 61 6b 3b  es = 999; break;
e2e0: 0a 20 20 20 20 63 61 73 65 20 53 43 52 49 50 54  .    case SCRIPT
e2f0: 5f 4c 41 54 49 4e 3a 20 20 20 20 20 72 65 73 20  _LATIN:     res 
e300: 3d 20 32 31 35 3b 20 62 72 65 61 6b 3b 0a 20 20  = 215; break;.  
e310: 20 20 63 61 73 65 20 53 43 52 49 50 54 5f 43 59    case SCRIPT_CY
e320: 52 49 4c 4c 49 43 3a 20 20 72 65 73 20 3d 20 32  RILLIC:  res = 2
e330: 32 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  20; break;.    c
e340: 61 73 65 20 53 43 52 49 50 54 5f 47 52 45 45 4b  ase SCRIPT_GREEK
e350: 3a 20 20 20 20 20 72 65 73 20 3d 20 32 30 30 3b  :     res = 200;
e360: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
e370: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  ult:            
e380: 20 20 20 72 65 73 20 3d 20 39 39 38 3b 20 62 72     res = 998; br
e390: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  eak;.  }.  sqlit
e3a0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
e3b0: 6e 74 65 78 74 2c 20 72 65 73 29 3b 0a 7d 0a 0a  ntext, res);.}..
e3c0: 2f 2a 20 45 6e 64 20 74 72 61 6e 73 6c 69 74 65  /* End translite
e3d0: 72 61 74 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rate.***********
e3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e420: 2a 2a 2a 0a 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 2a 0a 2a 2a 20 42 65 67 69 6e 20 73 70 65 6c  **.** Begin spel
e480: 6c 66 69 78 31 20 76 69 72 74 75 61 6c 20 74 61  lfix1 virtual ta
e490: 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 20 4d 61 78 69  ble..*/../* Maxi
e4a0: 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 20  mum length of a 
e4b0: 70 68 6f 6e 65 68 61 73 68 20 75 73 65 64 20 66  phonehash used f
e4c0: 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68 65 20  or querying the 
e4d0: 73 68 61 64 6f 77 20 74 61 62 6c 65 20 2a 2f 0a  shadow table */.
e4e0: 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
e4f0: 5f 4d 58 5f 48 41 53 48 20 20 38 0a 0a 2f 2a 20  _MX_HASH  8../* 
e500: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
e510: 66 20 68 61 73 68 20 73 74 72 69 6e 67 73 20 74  f hash strings t
e520: 6f 20 65 78 61 6d 69 6e 65 20 70 65 72 20 71 75  o examine per qu
e530: 65 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ery */.#define S
e540: 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 20 20  PELLFIX_MX_RUN  
e550: 20 31 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75   1..typedef stru
e560: 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  ct spellfix1_vta
e570: 62 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62  b spellfix1_vtab
e580: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
e590: 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
e5a0: 72 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73  r spellfix1_curs
e5b0: 6f 72 3b 0a 0a 2f 2a 20 46 75 7a 7a 79 2d 73 65  or;../* Fuzzy-se
e5c0: 61 72 63 68 20 76 69 72 74 75 61 6c 20 74 61 62  arch virtual tab
e5d0: 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72  le object */.str
e5e0: 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  uct spellfix1_vt
e5f0: 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ab {.  sqlite3_v
e600: 74 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20  tab base;       
e610: 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20    /* Base class 
e620: 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20  - must be first 
e630: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
e640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e650: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
e660: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72  ection */.  char
e670: 20 2a 7a 44 62 4e 61 6d 65 3b 20 20 20 20 20 20   *zDbName;      
e680: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e690: 66 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  f database holdi
e6a0: 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
e6b0: 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e  .  char *zTableN
e6c0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ame;          /*
e6d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 72   Name of the vir
e6e0: 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tual table */.  
e6f0: 63 68 61 72 20 2a 7a 43 6f 73 74 54 61 62 6c 65  char *zCostTable
e700: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
e710: 62 6c 65 20 68 6f 6c 64 69 6e 67 20 65 64 69 74  ble holding edit
e720: 2d 64 69 73 74 61 6e 63 65 20 63 6f 73 74 20 6e  -distance cost n
e730: 75 6d 62 65 72 73 20 2a 2f 0a 20 20 45 64 69 74  umbers */.  Edit
e740: 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f  Dist3Config *pCo
e750: 6e 66 69 67 33 3b 20 2f 2a 20 50 61 72 73 65 64  nfig3; /* Parsed
e760: 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 63   edit distance c
e770: 6f 73 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46  osts */.};../* F
e780: 75 7a 7a 79 2d 73 65 61 72 63 68 20 63 75 72 73  uzzy-search curs
e790: 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72  or object */.str
e7a0: 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  uct spellfix1_cu
e7b0: 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  rsor {.  sqlite3
e7c0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73  _vtab_cursor bas
e7d0: 65 3b 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c  e;    /* Base cl
e7e0: 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69  ass - must be fi
e7f0: 72 73 74 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  rst */.  spellfi
e800: 78 31 5f 76 74 61 62 20 2a 70 56 54 61 62 3b 20  x1_vtab *pVTab; 
e810: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
e820: 6c 65 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  le to which this
e830: 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
e840: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 74  */.  char *zPatt
e850: 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ern;            
e860: 20 20 2f 2a 20 72 68 73 20 6f 66 20 4d 41 54 43    /* rhs of MATC
e870: 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  H clause */.  in
e880: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
e890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e8a0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20  mber of rows of 
e8b0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
e8c0: 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20   nAlloc;        
e8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e8e0: 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  ber of allocated
e8f0: 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
e900: 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
e910: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
e920: 6e 74 20 72 6f 77 20 6f 66 20 63 6f 6e 74 65 6e  nt row of conten
e930: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  t */.  int iLang
e940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e950: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
e960: 74 68 65 20 6c 61 6e 67 69 64 3d 20 63 6f 6e 73  the langid= cons
e970: 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  traint */.  int 
e980: 69 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  iTop;           
e990: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
e9a0: 65 20 6f 66 20 74 68 65 20 74 6f 70 3d 20 63 6f  e of the top= co
e9b0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e  nstraint */.  in
e9c0: 74 20 69 53 63 6f 70 65 3b 20 20 20 20 20 20 20  t iScope;       
e9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
e9e0: 6c 75 65 20 6f 66 20 74 68 65 20 73 63 6f 70 65  lue of the scope
e9f0: 3d 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  = constraint */.
ea00: 20 20 69 6e 74 20 6e 53 65 61 72 63 68 3b 20 20    int nSearch;  
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ea20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 6f 63 61  * Number of voca
ea30: 62 75 6c 61 72 79 20 69 74 65 6d 73 20 63 68 65  bulary items che
ea40: 63 6b 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cked */.  sqlite
ea50: 33 5f 73 74 6d 74 20 2a 70 46 75 6c 6c 53 63 61  3_stmt *pFullSca
ea60: 6e 3b 20 20 20 20 20 2f 2a 20 53 68 61 64 6f 77  n;     /* Shadow
ea70: 20 71 75 65 72 79 20 66 6f 72 20 61 20 66 75 6c   query for a ful
ea80: 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
ea90: 20 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69    struct spellfi
eaa0: 78 31 5f 72 6f 77 20 7b 20 20 20 20 20 20 20 2f  x1_row {       /
eab0: 2a 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  * For each row o
eac0: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20  f content */.   
ead0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
eae0: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f  Rowid;         /
eaf0: 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73  * Rowid for this
eb00: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 63 68 61 72   row */.    char
eb10: 20 2a 7a 57 6f 72 64 3b 20 20 20 20 20 20 20 20   *zWord;        
eb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
eb30: 74 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a  t for this row *
eb40: 2f 0a 20 20 20 20 69 6e 74 20 69 52 61 6e 6b 3b  /.    int iRank;
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 20 2f 2a 20 52 61 6e 6b 20 66 6f 72 20      /* Rank for 
eb70: 74 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  this row */.    
eb80: 69 6e 74 20 69 44 69 73 74 61 6e 63 65 3b 20 20  int iDistance;  
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eba0: 20 44 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 70   Distance from p
ebb0: 61 74 74 65 72 6e 20 66 6f 72 20 74 68 69 73 20  attern for this 
ebc0: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  row */.    int i
ebd0: 53 63 6f 72 65 3b 20 20 20 20 20 20 20 20 20 20  Score;          
ebe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 6f 72           /* Scor
ebf0: 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 2a 2f  e for sorting */
ec00: 0a 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c  .    int iMatchl
ec10: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
ec20: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6d     /* Value of m
ec30: 61 74 63 68 6c 65 6e 20 63 6f 6c 75 6d 6e 20 28  atchlen column (
ec40: 6f 72 20 2d 31 29 20 2a 2f 0a 20 20 20 20 63 68  or -1) */.    ch
ec50: 61 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46 49  ar zHash[SPELLFI
ec60: 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 2f 2a 20 74  X_MX_HASH]; /* t
ec70: 68 65 20 70 68 6f 6e 65 68 61 73 68 20 75 73 65  he phonehash use
ec80: 64 20 66 6f 72 20 74 68 69 73 20 6d 61 74 63 68  d for this match
ec90: 20 2a 2f 0a 20 20 7d 20 2a 61 3b 20 0a 7d 3b 0a   */.  } *a; .};.
eca0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
ecb0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 53 51 4c   one or more SQL
ecc0: 20 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f 6d   statements from
ecd0: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
ece0: 6e 67 20 67 69 76 65 6e 0a 2a 2a 20 61 6e 64 20  ng given.** and 
ecf0: 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
ed00: 6f 73 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ose statements. 
ed10: 54 68 65 20 73 75 63 63 65 73 73 20 63 6f 64 65  The success code
ed20: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
ed30: 6e 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a 2a 2a 20  nto *pRc..**.** 
ed40: 49 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74 69  If *pRc is initi
ed50: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  ally non-zero th
ed60: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
ed70: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
ed80: 74 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c  tatic void spell
ed90: 66 69 78 31 44 62 45 78 65 63 28 0a 20 20 69 6e  fix1DbExec(.  in
eda0: 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
edb0: 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20       /* Success 
edc0: 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
edd0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
ede0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20   /* Database in 
edf0: 77 68 69 63 68 20 74 6f 20 72 75 6e 20 53 51 4c  which to run SQL
ee00: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ee10: 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 2f 2a 20   *zFormat,   /* 
ee20: 46 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f  Format string fo
ee30: 72 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e 20 20  r SQL */.  ...  
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
ee60: 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  o the format str
ee70: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c  ing */.){.  va_l
ee80: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
ee90: 7a 53 71 6c 3b 0a 20 20 69 66 28 20 2a 70 52 63  zSql;.  if( *pRc
eea0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f   ) return;.  va_
eeb0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
eec0: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
eed0: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
eee0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
eef0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
ef00: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  zSql==0 ){.    *
ef10: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
ef20: 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
ef30: 20 2a 70 52 63 20 3d 20 73 71 6c 69 74 65 33 5f   *pRc = sqlite3_
ef40: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30  exec(db, zSql, 0
ef50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
ef60: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
ef70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 44  .  }.}../*.** xD
ef80: 69 73 63 6f 6e 6e 65 63 74 2f 78 44 65 73 74 72  isconnect/xDestr
ef90: 6f 79 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68  oy method for th
efa0: 65 20 66 75 7a 7a 79 2d 73 65 61 72 63 68 20 6d  e fuzzy-search m
efb0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
efc0: 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 55 6e   int spellfix1Un
efd0: 69 6e 69 74 28 69 6e 74 20 69 73 44 65 73 74 72  init(int isDestr
efe0: 6f 79 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  oy, sqlite3_vtab
eff0: 20 2a 70 56 54 61 62 29 7b 0a 20 20 73 70 65 6c   *pVTab){.  spel
f000: 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20  lfix1_vtab *p = 
f010: 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a  (spellfix1_vtab*
f020: 29 70 56 54 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVTab;.  int rc
f030: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f040: 69 66 28 20 69 73 44 65 73 74 72 6f 79 20 29 7b  if( isDestroy ){
f050: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
f060: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 70   = p->db;.    sp
f070: 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72  ellfix1DbExec(&r
f080: 63 2c 20 64 62 2c 20 22 44 52 4f 50 20 54 41 42  c, db, "DROP TAB
f090: 4c 45 20 49 46 20 45 58 49 53 54 53 20 5c 22 25  LE IF EXISTS \"%
f0a0: 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22  w\".\"%w_vocab\"
f0b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f0c0: 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c       p->zDbName,
f0d0: 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b   p->zTableName);
f0e0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
f0f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f100: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
f110: 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20  zTableName);.   
f120: 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   editDist3Config
f130: 44 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69  Delete(p->pConfi
f140: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
f150: 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54 61  _free(p->zCostTa
f160: 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ble);.    sqlite
f170: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20  3_free(p);.  }. 
f180: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
f190: 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69  atic int spellfi
f1a0: 78 31 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c  x1Disconnect(sql
f1b0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
f1c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c  ){.  return spel
f1d0: 6c 66 69 78 31 55 6e 69 6e 69 74 28 30 2c 20 70  lfix1Uninit(0, p
f1e0: 56 54 61 62 29 3b 0a 7d 0a 73 74 61 74 69 63 20  VTab);.}.static 
f1f0: 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 44 65 73  int spellfix1Des
f200: 74 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61  troy(sqlite3_vta
f210: 62 20 2a 70 56 54 61 62 29 7b 0a 20 20 72 65 74  b *pVTab){.  ret
f220: 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 55 6e 69  urn spellfix1Uni
f230: 6e 69 74 28 31 2c 20 70 56 54 61 62 29 3b 0a 7d  nit(1, pVTab);.}
f240: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63  ../*.** Make a c
f250: 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 2e  opy of a string.
f260: 20 20 52 65 6d 6f 76 65 20 6c 65 61 64 69 6e 67    Remove leading
f270: 20 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68   and trailing wh
f280: 69 74 65 73 70 61 63 65 0a 2a 2a 20 61 6e 64 20  itespace.** and 
f290: 64 65 71 75 6f 74 65 20 69 74 2e 0a 2a 2f 0a 73  dequote it..*/.s
f2a0: 74 61 74 69 63 20 63 68 61 72 20 2a 73 70 65 6c  tatic char *spel
f2b0: 6c 66 69 78 31 44 65 71 75 6f 74 65 28 63 6f 6e  lfix1Dequote(con
f2c0: 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20  st char *zIn){. 
f2d0: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 69   char *zOut;.  i
f2e0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
f2f0: 63 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70  c;.  while( issp
f300: 61 63 65 28 7a 49 6e 5b 30 5d 29 20 29 20 7a 49  ace(zIn[0]) ) zI
f310: 6e 2b 2b 3b 0a 20 20 7a 4f 75 74 20 3d 20 73 71  n++;.  zOut = sq
f320: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
f330: 73 22 2c 20 7a 49 6e 29 3b 0a 20 20 69 66 28 20  s", zIn);.  if( 
f340: 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  zOut==0 ) return
f350: 20 30 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29 73   0;.  i = (int)s
f360: 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 23 69 66  trlen(zOut);.#if
f370: 20 30 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65   0  /* The parse
f380: 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 6c 65 61  r will never lea
f390: 76 65 20 73 70 61 63 65 73 20 61 74 20 74 68 65  ve spaces at the
f3a0: 20 65 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28   end */.  while(
f3b0: 20 69 3e 30 20 26 26 20 69 73 73 70 61 63 65 28   i>0 && isspace(
f3c0: 7a 4f 75 74 5b 69 2d 31 5d 29 20 29 7b 20 69 2d  zOut[i-1]) ){ i-
f3d0: 2d 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 4f  -; }.#endif.  zO
f3e0: 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 63 20 3d  ut[i] = 0;.  c =
f3f0: 20 7a 4f 75 74 5b 30 5d 3b 0a 20 20 69 66 28 20   zOut[0];.  if( 
f400: 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22  c=='\'' || c=='"
f410: 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  ' ){.    for(i=1
f420: 2c 20 6a 3d 30 3b 20 41 4c 57 41 59 53 28 7a 4f  , j=0; ALWAYS(zO
f430: 75 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ut[i]); i++){.  
f440: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
f450: 7a 4f 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69  zOut[i];.      i
f460: 66 28 20 7a 4f 75 74 5b 69 5d 3d 3d 63 20 29 7b  f( zOut[i]==c ){
f470: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f 75  .        if( zOu
f480: 74 5b 69 2b 31 5d 3d 3d 63 20 29 7b 0a 20 20 20  t[i+1]==c ){.   
f490: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
f4a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f4b0: 20 20 20 20 20 7a 4f 75 74 5b 6a 2d 31 5d 20 3d       zOut[j-1] =
f4c0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
f4d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
f4e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f4f0: 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a  .  return zOut;.
f500: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6e 6e 65  }.../*.** xConne
f510: 63 74 2f 78 43 72 65 61 74 65 20 6d 65 74 68 6f  ct/xCreate metho
f520: 64 20 66 6f 72 20 74 68 65 20 73 70 65 6c 6c 66  d for the spellf
f530: 69 78 31 20 6d 6f 64 75 6c 65 2e 20 41 72 67 75  ix1 module. Argu
f540: 6d 65 6e 74 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  ments are:.**.**
f550: 20 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20     argv[0]   -> 
f560: 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28 22 73  module name  ("s
f570: 70 65 6c 6c 66 69 78 31 22 29 0a 2a 2a 20 20 20  pellfix1").**   
f580: 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74  argv[1]   -> dat
f590: 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  abase name.**   
f5a0: 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62  argv[2]   -> tab
f5b0: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67  le name.**   arg
f5c0: 76 5b 33 5d 2e 2e 20 2d 3e 20 6f 70 74 69 6f 6e  v[3].. -> option
f5d0: 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 28 69 2e  al arguments (i.
f5e0: 65 2e 20 22 65 64 69 74 5f 63 6f 73 74 5f 74 61  e. "edit_cost_ta
f5f0: 62 6c 65 22 20 70 61 72 61 6d 65 74 65 72 29 0a  ble" parameter).
f600: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
f610: 65 6c 6c 66 69 78 31 49 6e 69 74 28 0a 20 20 69  ellfix1Init(.  i
f620: 6e 74 20 69 73 43 72 65 61 74 65 2c 0a 20 20 73  nt isCreate,.  s
f630: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
f640: 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
f650: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
f660: 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
f670: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
f680: 70 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVTab,.  char **
f690: 70 7a 45 72 72 0a 29 7b 0a 20 20 73 70 65 6c 6c  pzErr.){.  spell
f6a0: 66 69 78 31 5f 76 74 61 62 20 2a 70 4e 65 77 20  fix1_vtab *pNew 
f6b0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
f6c0: 72 20 2a 7a 4d 6f 64 75 6c 65 20 3d 20 61 72 67  r *zModule = arg
f6d0: 76 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  v[0];.  const ch
f6e0: 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 61 72  ar *zDbName = ar
f6f0: 67 76 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  gv[1];.  const c
f700: 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 20  har *zTableName 
f710: 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74  = argv[2];.  int
f720: 20 6e 44 62 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nDbName;.  int 
f730: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f740: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 44 62 4e    int i;..  nDbN
f750: 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
f760: 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 70 4e  n(zDbName);.  pN
f770: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
f780: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
f790: 77 29 20 2b 20 6e 44 62 4e 61 6d 65 20 2b 20 31  w) + nDbName + 1
f7a0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
f7b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
f7c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
f7d0: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  se{.    memset(p
f7e0: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
f7f0: 70 4e 65 77 29 29 3b 0a 20 20 20 20 70 4e 65 77  pNew));.    pNew
f800: 2d 3e 7a 44 62 4e 61 6d 65 20 3d 20 28 63 68 61  ->zDbName = (cha
f810: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20  r*)&pNew[1];.   
f820: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 44   memcpy(pNew->zD
f830: 62 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 2c 20  bName, zDbName, 
f840: 6e 44 62 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  nDbName+1);.    
f850: 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65  pNew->zTableName
f860: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f870: 74 66 28 22 25 73 22 2c 20 7a 54 61 62 6c 65 4e  tf("%s", zTableN
f880: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
f890: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 66 28  db = db;.    if(
f8a0: 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e 61 6d   pNew->zTableNam
f8b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
f8c0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
f8d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f8e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
f8f0: 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20  eclare_vtab(db, 
f900: 0a 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45  .           "CRE
f910: 41 54 45 20 54 41 42 4c 45 20 78 28 77 6f 72 64  ATE TABLE x(word
f920: 2c 72 61 6e 6b 2c 64 69 73 74 61 6e 63 65 2c 6c  ,rank,distance,l
f930: 61 6e 67 69 64 2c 20 22 0a 20 20 20 20 20 20 20  angid, ".       
f940: 20 20 20 20 22 73 63 6f 72 65 2c 20 6d 61 74 63      "score, matc
f950: 68 6c 65 6e 2c 20 70 68 6f 6e 65 68 61 73 68 20  hlen, phonehash 
f960: 48 49 44 44 45 4e 2c 20 22 0a 20 20 20 20 20 20  HIDDEN, ".      
f970: 20 20 20 20 20 22 74 6f 70 20 48 49 44 44 45 4e       "top HIDDEN
f980: 2c 20 73 63 6f 70 65 20 48 49 44 44 45 4e 2c 20  , scope HIDDEN, 
f990: 73 72 63 68 63 6e 74 20 48 49 44 44 45 4e 2c 20  srchcnt HIDDEN, 
f9a0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 73 6f  ".           "so
f9b0: 75 6e 64 73 6c 69 6b 65 20 48 49 44 44 45 4e 2c  undslike HIDDEN,
f9c0: 20 63 6f 6d 6d 61 6e 64 20 48 49 44 44 45 4e 29   command HIDDEN)
f9d0: 22 0a 20 20 20 20 20 20 29 3b 0a 23 64 65 66 69  ".      );.#defi
f9e0: 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  ne SPELLFIX_COL_
f9f0: 57 4f 52 44 20 20 20 20 20 20 20 20 20 20 20 20  WORD            
fa00: 30 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46  0.#define SPELLF
fa10: 49 58 5f 43 4f 4c 5f 52 41 4e 4b 20 20 20 20 20  IX_COL_RANK     
fa20: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
fa30: 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49   SPELLFIX_COL_DI
fa40: 53 54 41 4e 43 45 20 20 20 20 20 20 20 20 32 0a  STANCE        2.
fa50: 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
fa60: 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20 20 20 20 20  _COL_LANGID     
fa70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 53       3.#define S
fa80: 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52  PELLFIX_COL_SCOR
fa90: 45 20 20 20 20 20 20 20 20 20 20 20 34 0a 23 64  E           4.#d
faa0: 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43  efine SPELLFIX_C
fab0: 4f 4c 5f 4d 41 54 43 48 4c 45 4e 20 20 20 20 20  OL_MATCHLEN     
fac0: 20 20 20 35 0a 23 64 65 66 69 6e 65 20 53 50 45     5.#define SPE
fad0: 4c 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e 45 48  LLFIX_COL_PHONEH
fae0: 41 53 48 20 20 20 20 20 20 20 36 0a 23 64 65 66  ASH       6.#def
faf0: 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
fb00: 5f 54 4f 50 20 20 20 20 20 20 20 20 20 20 20 20  _TOP            
fb10: 20 37 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c   7.#define SPELL
fb20: 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 20 20 20  FIX_COL_SCOPE   
fb30: 20 20 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e          8.#defin
fb40: 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53  e SPELLFIX_COL_S
fb50: 52 43 48 43 4e 54 20 20 20 20 20 20 20 20 20 39  RCHCNT         9
fb60: 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
fb70: 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45  X_COL_SOUNDSLIKE
fb80: 20 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20       10.#define 
fb90: 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43 4f 4d  SPELLFIX_COL_COM
fba0: 4d 41 4e 44 20 20 20 20 20 20 20 20 31 31 0a 20  MAND        11. 
fbb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
fbc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73  =SQLITE_OK && is
fbd0: 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20  Create ){.      
fbe0: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 72  sqlite3_uint64 r
fbf0: 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78  ;.      spellfix
fc00: 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  1DbExec(&rc, db,
fc10: 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
fc20: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
fc30: 58 49 53 54 53 20 5c 22 25 77 5c 22 2e 5c 22 25  XISTS \"%w\".\"%
fc40: 77 5f 76 6f 63 61 62 5c 22 28 5c 6e 22 0a 20 20  w_vocab\"(\n".  
fc50: 20 20 20 20 20 20 20 22 20 20 69 64 20 49 4e 54         "  id INT
fc60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
fc70: 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20  ,\n".         " 
fc80: 20 72 61 6e 6b 20 49 4e 54 2c 5c 6e 22 0a 20 20   rank INT,\n".  
fc90: 20 20 20 20 20 20 20 22 20 20 6c 61 6e 67 69 64         "  langid
fca0: 20 49 4e 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20   INT,\n".       
fcb0: 20 20 22 20 20 77 6f 72 64 20 54 45 58 54 2c 5c    "  word TEXT,\
fcc0: 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 6b  n".         "  k
fcd0: 31 20 54 45 58 54 2c 5c 6e 22 0a 20 20 20 20 20  1 TEXT,\n".     
fce0: 20 20 20 20 22 20 20 6b 32 20 54 45 58 54 5c 6e      "  k2 TEXT\n
fcf0: 22 0a 20 20 20 20 20 20 20 20 20 22 29 3b 5c 6e  ".         ");\n
fd00: 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 44 62 4e  ",.         zDbN
fd10: 61 6d 65 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 0a  ame, zTableName.
fd20: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
fd30: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
fd40: 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
fd50: 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78  ;.      spellfix
fd60: 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  1DbExec(&rc, db,
fd70: 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
fd80: 45 20 49 4e 44 45 58 20 49 46 20 4e 4f 54 20 45  E INDEX IF NOT E
fd90: 58 49 53 54 53 20 5c 22 25 77 5c 22 2e 5c 22 25  XISTS \"%w\".\"%
fda0: 77 5f 69 6e 64 65 78 5f 25 6c 6c 78 5c 22 20 22  w_index_%llx\" "
fdb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 4e  .            "ON
fdc0: 20 5c 22 25 77 5f 76 6f 63 61 62 5c 22 28 6c 61   \"%w_vocab\"(la
fdd0: 6e 67 69 64 2c 6b 32 29 3b 22 2c 0a 20 20 20 20  ngid,k2);",.    
fde0: 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 4d       zDbName, zM
fdf0: 6f 64 75 6c 65 2c 20 72 2c 20 7a 54 61 62 6c 65  odule, r, zTable
fe00: 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
fe10: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 33 3b    }.    for(i=3;
fe20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
fe30: 26 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  & i<argc; i++){.
fe40: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
fe50: 70 28 61 72 67 76 5b 69 5d 2c 22 65 64 69 74 5f  p(argv[i],"edit_
fe60: 63 6f 73 74 5f 74 61 62 6c 65 3d 22 2c 31 36 29  cost_table=",16)
fe70: 3d 3d 30 20 26 26 20 70 4e 65 77 2d 3e 7a 43 6f  ==0 && pNew->zCo
fe80: 73 74 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20  stTable==0 ){.  
fe90: 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 43 6f 73        pNew->zCos
fea0: 74 54 61 62 6c 65 20 3d 20 73 70 65 6c 6c 66 69  tTable = spellfi
feb0: 78 31 44 65 71 75 6f 74 65 28 26 61 72 67 76 5b  x1Dequote(&argv[
fec0: 69 5d 5b 31 36 5d 29 3b 0a 20 20 20 20 20 20 20  i][16]);.       
fed0: 20 69 66 28 20 70 4e 65 77 2d 3e 7a 43 6f 73 74   if( pNew->zCost
fee0: 54 61 62 6c 65 3d 3d 30 20 29 20 72 63 20 3d 20  Table==0 ) rc = 
fef0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ff00: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
ff10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
ff20: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
ff30: 70 72 69 6e 74 66 28 22 62 61 64 20 61 72 67 75  printf("bad argu
ff40: 6d 65 6e 74 20 74 6f 20 73 70 65 6c 6c 66 69 78  ment to spellfix
ff50: 31 28 29 3a 20 5c 22 25 73 5c 22 22 2c 20 61 72  1(): \"%s\"", ar
ff60: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 72 63  gv[i]);.      rc
ff70: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
ff80: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69   .    }.  }..  i
ff90: 66 28 20 72 63 20 26 26 20 70 4e 65 77 20 29 7b  f( rc && pNew ){
ffa0: 0a 20 20 20 20 2a 70 70 56 54 61 62 20 3d 20 30  .    *ppVTab = 0
ffb0: 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78 31 55  ;.    spellfix1U
ffc0: 6e 69 6e 69 74 28 30 2c 20 26 70 4e 65 77 2d 3e  ninit(0, &pNew->
ffd0: 62 61 73 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  base);.  }else{.
ffe0: 20 20 20 20 2a 70 70 56 54 61 62 20 3d 20 28 73      *ppVTab = (s
fff0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70 4e  qlite3_vtab *)pN
10000 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
10010 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
10020 65 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78  e xConnect and x
10030 43 72 65 61 74 65 20 6d 65 74 68 6f 64 73 0a 2a  Create methods.*
10040 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
10050 6c 6c 66 69 78 31 43 6f 6e 6e 65 63 74 28 0a 20  llfix1Connect(. 
10060 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
10070 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e  void *pAux,.  in
10080 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68  t argc, const ch
10090 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a  ar *const*argv,.
100a0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
100b0 2a 70 70 56 54 61 62 2c 0a 20 20 63 68 61 72 20  *ppVTab,.  char 
100c0 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74  **pzErr.){.  ret
100d0 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 49 6e 69  urn spellfix1Ini
100e0 74 28 30 2c 20 64 62 2c 20 70 41 75 78 2c 20 61  t(0, db, pAux, a
100f0 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 54 61  rgc, argv, ppVTa
10100 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 73 74 61  b, pzErr);.}.sta
10110 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
10120 31 43 72 65 61 74 65 28 0a 20 20 73 71 6c 69 74  1Create(.  sqlit
10130 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a  e3 *db,.  void *
10140 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  pAux,.  int argc
10150 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  , const char *co
10160 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69  nst*argv,.  sqli
10170 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 54 61  te3_vtab **ppVTa
10180 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  b,.  char **pzEr
10190 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 70  r.){.  return sp
101a0 65 6c 6c 66 69 78 31 49 6e 69 74 28 31 2c 20 64  ellfix1Init(1, d
101b0 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61  b, pAux, argc, a
101c0 72 67 76 2c 20 70 70 56 54 61 62 2c 20 70 7a 45  rgv, ppVTab, pzE
101d0 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  rr);.}../*.** Cl
101e0 65 61 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ear all of the c
101f0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 61 20 63 75  ontent from a cu
10200 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
10210 76 6f 69 64 20 73 70 65 6c 6c 66 69 78 31 52 65  void spellfix1Re
10220 73 65 74 43 75 72 73 6f 72 28 73 70 65 6c 6c 66  setCursor(spellf
10230 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
10240 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
10250 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 6e  r(i=0; i<pCur->n
10260 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Row; i++){.    s
10270 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
10280 2d 3e 61 5b 69 5d 2e 7a 57 6f 72 64 29 3b 0a 20  ->a[i].zWord);. 
10290 20 7d 0a 20 20 70 43 75 72 2d 3e 6e 52 6f 77 20   }.  pCur->nRow 
102a0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 52 6f  = 0;.  pCur->iRo
102b0 77 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 6e  w = 0;.  pCur->n
102c0 53 65 61 72 63 68 20 3d 20 30 3b 0a 20 20 69 66  Search = 0;.  if
102d0 28 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  ( pCur->pFullSca
102e0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
102f0 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72 2d 3e  _finalize(pCur->
10300 70 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20 20 20  pFullScan);.    
10310 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20  pCur->pFullScan 
10320 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
10330 2a 20 52 65 73 69 7a 65 20 74 68 65 20 63 75 72  * Resize the cur
10340 73 6f 72 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  sor to hold up t
10350 6f 20 4e 20 72 6f 77 73 20 6f 66 20 63 6f 6e 74  o N rows of cont
10360 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ent.*/.static vo
10370 69 64 20 73 70 65 6c 6c 66 69 78 31 52 65 73 69  id spellfix1Resi
10380 7a 65 43 75 72 73 6f 72 28 73 70 65 6c 6c 66 69  zeCursor(spellfi
10390 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 2c  x1_cursor *pCur,
103a0 20 69 6e 74 20 4e 29 7b 0a 20 20 73 74 72 75 63   int N){.  struc
103b0 74 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20  t spellfix1_row 
103c0 2a 61 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28  *aNew;.  assert(
103d0 20 4e 3e 3d 70 43 75 72 2d 3e 6e 52 6f 77 20 29   N>=pCur->nRow )
103e0 3b 0a 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  aNew = sqlit
103f0 65 33 5f 72 65 61 6c 6c 6f 63 28 70 43 75 72 2d  e3_realloc(pCur-
10400 3e 61 2c 20 73 69 7a 65 6f 66 28 70 43 75 72 2d  >a, sizeof(pCur-
10410 3e 61 5b 30 5d 29 2a 4e 29 3b 0a 20 20 69 66 28  >a[0])*N);.  if(
10420 20 61 4e 65 77 3d 3d 30 20 26 26 20 4e 3e 30 20   aNew==0 && N>0 
10430 29 7b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78 31  ){.    spellfix1
10440 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75 72  ResetCursor(pCur
10450 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10460 72 65 65 28 70 43 75 72 2d 3e 61 29 3b 0a 20 20  ree(pCur->a);.  
10470 20 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 3d    pCur->nAlloc =
10480 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 20   0;.    pCur->a 
10490 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
104a0 20 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 3d    pCur->nAlloc =
104b0 20 4e 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 20   N;.    pCur->a 
104c0 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 0a  = aNew;.  }.}...
104d0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 75  /*.** Close a fu
104e0 7a 7a 79 2d 73 65 61 72 63 68 20 63 75 72 73 6f  zzy-search curso
104f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
10500 20 73 70 65 6c 6c 66 69 78 31 43 6c 6f 73 65 28   spellfix1Close(
10510 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
10520 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 70 65  sor *cur){.  spe
10530 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70  llfix1_cursor *p
10540 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31  Cur = (spellfix1
10550 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  _cursor *)cur;. 
10560 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43   spellfix1ResetC
10570 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 73  ursor(pCur);.  s
10580 70 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75  pellfix1ResizeCu
10590 72 73 6f 72 28 70 43 75 72 2c 20 30 29 3b 0a 20  rsor(pCur, 0);. 
105a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
105b0 75 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ur->zPattern);. 
105c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
105d0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ur);.  return SQ
105e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
105f0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 65 72  * Search for ter
10600 6d 73 20 6f 66 20 74 68 65 73 65 20 66 6f 72 6d  ms of these form
10610 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 41 29 20 20  s:.**.**   (A)  
10620 20 20 77 6f 72 64 20 4d 41 54 43 48 20 24 73 74    word MATCH $st
10630 72 0a 2a 2a 20 20 20 28 42 29 20 20 20 20 6c 61  r.**   (B)    la
10640 6e 67 69 64 20 3d 3d 20 24 6c 61 6e 67 69 64 0a  ngid == $langid.
10650 2a 2a 20 20 20 28 43 29 20 20 20 20 74 6f 70 20  **   (C)    top 
10660 3d 20 24 74 6f 70 0a 2a 2a 20 20 20 28 44 29 20  = $top.**   (D) 
10670 20 20 20 73 63 6f 70 65 20 3d 20 24 73 63 6f 70     scope = $scop
10680 65 0a 2a 2a 20 20 20 28 45 29 20 20 20 20 64 69  e.**   (E)    di
10690 73 74 61 6e 63 65 20 3c 20 24 64 69 73 74 61 6e  stance < $distan
106a0 63 65 0a 2a 2a 20 20 20 28 46 29 20 20 20 20 64  ce.**   (F)    d
106b0 69 73 74 61 6e 63 65 20 3c 3d 20 24 64 69 73 74  istance <= $dist
106c0 61 6e 63 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ance.**.** The p
106d0 6c 61 6e 20 6e 75 6d 62 65 72 20 69 73 20 61 20  lan number is a 
106e0 62 69 74 20 6d 61 73 6b 20 66 6f 72 6d 65 64 20  bit mask formed 
106f0 77 69 74 68 20 74 68 65 73 65 20 62 69 74 73 3a  with these bits:
10700 0a 2a 2a 0a 2a 2a 20 20 20 30 78 30 31 20 20 20  .**.**   0x01   
10710 28 41 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20  (A) is found.** 
10720 20 20 30 78 30 32 20 20 20 28 42 29 20 69 73 20    0x02   (B) is 
10730 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 30 34 20  found.**   0x04 
10740 20 20 28 43 29 20 69 73 20 66 6f 75 6e 64 0a 2a    (C) is found.*
10750 2a 20 20 20 30 78 30 38 20 20 20 28 44 29 20 69  *   0x08   (D) i
10760 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 31  s found.**   0x1
10770 30 20 20 20 28 45 29 20 69 73 20 66 6f 75 6e 64  0   (E) is found
10780 0a 2a 2a 20 20 20 30 78 32 30 20 20 20 28 46 29  .**   0x20   (F)
10790 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 0a 2a 2a 20   is found.**.** 
107a0 66 69 6c 74 65 72 2e 61 72 67 76 5b 2a 5d 20 76  filter.argv[*] v
107b0 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 73 20 24  alues contains $
107c0 73 74 72 2c 20 24 6c 61 6e 67 69 64 2c 20 24 74  str, $langid, $t
107d0 6f 70 2c 20 61 6e 64 20 24 73 63 6f 70 65 2c 0a  op, and $scope,.
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 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
108d0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
108e0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
108f0 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  *pConstraint;.  
10900 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  pConstraint = pI
10910 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
10920 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
10930 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
10940 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43  straint; i++, pC
10950 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20  onstraint++){.  
10960 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
10970 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63  t->usable==0 ) c
10980 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
10990 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   Terms of the fo
109a0 72 6d 3a 20 20 77 6f 72 64 20 4d 41 54 43 48 20  rm:  word MATCH 
109b0 24 73 74 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  $str */.    if( 
109c0 28 69 50 6c 61 6e 20 26 20 31 29 3d 3d 30 20 0a  (iPlan & 1)==0 .
109d0 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
109e0 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50  int->iColumn==SP
109f0 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 0a  ELLFIX_COL_WORD.
10a00 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
10a10 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  int->op==SQLITE_
10a20 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10a30 5f 4d 41 54 43 48 0a 20 20 20 20 29 7b 0a 20 20  _MATCH.    ){.  
10a40 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 31 3b 0a      iPlan |= 1;.
10a50 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
10a60 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
10a70 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  [i].argvIndex = 
10a80 31 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  1;.      pIdxInf
10a90 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
10aa0 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b  age[i].omit = 1;
10ab0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
10ac0 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
10ad0 3a 20 20 6c 61 6e 67 69 64 20 3d 20 24 6c 61 6e  :  langid = $lan
10ae0 67 69 64 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  gid  */.    if( 
10af0 28 69 50 6c 61 6e 20 26 20 32 29 3d 3d 30 0a 20  (iPlan & 2)==0. 
10b00 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69      && pConstrai
10b10 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45  nt->iColumn==SPE
10b20 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44  LLFIX_COL_LANGID
10b30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10b40 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  aint->op==SQLITE
10b50 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10b60 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20  T_EQ.    ){.    
10b70 20 20 69 50 6c 61 6e 20 7c 3d 20 32 3b 0a 20 20    iPlan |= 2;.  
10b80 20 20 20 20 69 4c 61 6e 67 54 65 72 6d 20 3d 20      iLangTerm = 
10b90 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  i;.    }..    /*
10ba0 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   Terms of the fo
10bb0 72 6d 3a 20 20 74 6f 70 20 3d 20 24 74 6f 70 20  rm:  top = $top 
10bc0 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61  */.    if( (iPla
10bd0 6e 20 26 20 34 29 3d 3d 30 0a 20 20 20 20 20 26  n & 4)==0.     &
10be0 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  & pConstraint->i
10bf0 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58  Column==SPELLFIX
10c00 5f 43 4f 4c 5f 54 4f 50 0a 20 20 20 20 20 26 26  _COL_TOP.     &&
10c10 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
10c20 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
10c30 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20  ONSTRAINT_EQ.   
10c40 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20   ){.      iPlan 
10c50 7c 3d 20 34 3b 0a 20 20 20 20 20 20 69 54 6f 70  |= 4;.      iTop
10c60 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  Term = i;.    }.
10c70 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
10c80 20 74 68 65 20 66 6f 72 6d 3a 20 20 73 63 6f 70   the form:  scop
10c90 65 20 3d 20 24 73 63 6f 70 65 20 2a 2f 0a 20 20  e = $scope */.  
10ca0 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20 38    if( (iPlan & 8
10cb0 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43 6f  )==0.     && pCo
10cc0 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
10cd0 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  n==SPELLFIX_COL_
10ce0 53 43 4f 50 45 0a 20 20 20 20 20 26 26 20 70 43  SCOPE.     && pC
10cf0 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53  onstraint->op==S
10d00 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
10d10 54 52 41 49 4e 54 5f 45 51 0a 20 20 20 20 29 7b  TRAINT_EQ.    ){
10d20 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20  .      iPlan |= 
10d30 38 3b 0a 20 20 20 20 20 20 69 53 63 6f 70 65 54  8;.      iScopeT
10d40 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a  erm = i;.    }..
10d50 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20      /* Terms of 
10d60 74 68 65 20 66 6f 72 6d 3a 20 20 64 69 73 74 61  the form:  dista
10d70 6e 63 65 20 3c 20 24 64 69 73 74 20 6f 72 20 64  nce < $dist or d
10d80 69 73 74 61 6e 63 65 20 3c 3d 20 24 64 69 73 74  istance <= $dist
10d90 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c   */.    if( (iPl
10da0 61 6e 20 26 20 28 31 36 7c 33 32 29 29 3d 3d 30  an & (16|32))==0
10db0 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10dc0 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53  aint->iColumn==S
10dd0 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49 53 54  PELLFIX_COL_DIST
10de0 41 4e 43 45 0a 20 20 20 20 20 26 26 20 28 70 43  ANCE.     && (pC
10df0 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53  onstraint->op==S
10e00 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
10e10 54 52 41 49 4e 54 5f 4c 54 0a 20 20 20 20 20 20  TRAINT_LT.      
10e20 20 20 20 20 7c 7c 20 70 43 6f 6e 73 74 72 61 69      || pConstrai
10e30 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  nt->op==SQLITE_I
10e40 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
10e50 4c 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  LE).    ){.     
10e60 20 69 50 6c 61 6e 20 7c 3d 20 70 43 6f 6e 73 74   iPlan |= pConst
10e70 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54  raint->op==SQLIT
10e80 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10e90 4e 54 5f 4c 54 20 3f 20 31 36 20 3a 20 33 32 3b  NT_LT ? 16 : 32;
10ea0 0a 20 20 20 20 20 20 69 44 69 73 74 54 65 72 6d  .      iDistTerm
10eb0 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
10ec0 20 20 69 66 28 20 69 50 6c 61 6e 26 31 20 29 7b    if( iPlan&1 ){
10ed0 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 32  .    int idx = 2
10ee0 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
10ef0 69 64 78 4e 75 6d 20 3d 20 69 50 6c 61 6e 3b 0a  idxNum = iPlan;.
10f00 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f      if( pIdxInfo
10f10 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d 31 0a 20 20  ->nOrderBy==1.  
10f20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e     && pIdxInfo->
10f30 61 4f 72 64 65 72 42 79 5b 30 5d 2e 69 43 6f 6c  aOrderBy[0].iCol
10f40 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f  umn==SPELLFIX_CO
10f50 4c 5f 53 43 4f 52 45 0a 20 20 20 20 20 26 26 20  L_SCORE.     && 
10f60 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
10f70 42 79 5b 30 5d 2e 64 65 73 63 3d 3d 30 0a 20 20  By[0].desc==0.  
10f80 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49    ){.      pIdxI
10f90 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
10fa0 75 6d 65 64 20 3d 20 31 3b 20 20 2f 2a 20 44 65  umed = 1;  /* De
10fb0 66 61 75 6c 74 20 6f 72 64 65 72 20 62 79 20 69  fault order by i
10fc0 53 63 6f 72 65 20 2a 2f 0a 20 20 20 20 7d 0a 20  Score */.    }. 
10fd0 20 20 20 69 66 28 20 69 50 6c 61 6e 26 32 20 29     if( iPlan&2 )
10fe0 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  {.      pIdxInfo
10ff0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
11000 67 65 5b 69 4c 61 6e 67 54 65 72 6d 5d 2e 61 72  ge[iLangTerm].ar
11010 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b  gvIndex = idx++;
11020 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
11030 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
11040 65 5b 69 4c 61 6e 67 54 65 72 6d 5d 2e 6f 6d 69  e[iLangTerm].omi
11050 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
11060 20 69 66 28 20 69 50 6c 61 6e 26 34 20 29 7b 0a   if( iPlan&4 ){.
11070 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
11080 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
11090 5b 69 54 6f 70 54 65 72 6d 5d 2e 61 72 67 76 49  [iTopTerm].argvI
110a0 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20  ndex = idx++;.  
110b0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
110c0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
110d0 54 6f 70 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20  TopTerm].omit = 
110e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
110f0 20 69 50 6c 61 6e 26 38 20 29 7b 0a 20 20 20 20   iPlan&8 ){.    
11100 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
11110 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 53 63  straintUsage[iSc
11120 6f 70 65 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64  opeTerm].argvInd
11130 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20  ex = idx++;.    
11140 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
11150 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 53 63  straintUsage[iSc
11160 6f 70 65 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20  opeTerm].omit = 
11170 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
11180 20 69 50 6c 61 6e 26 28 31 36 7c 33 32 29 20 29   iPlan&(16|32) )
11190 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  {.      pIdxInfo
111a0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
111b0 67 65 5b 69 44 69 73 74 54 65 72 6d 5d 2e 61 72  ge[iDistTerm].ar
111c0 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b  gvIndex = idx++;
111d0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
111e0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
111f0 65 5b 69 44 69 73 74 54 65 72 6d 5d 2e 6f 6d 69  e[iDistTerm].omi
11200 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
11210 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
11220 61 74 65 64 43 6f 73 74 20 3d 20 31 65 35 3b 0a  atedCost = 1e5;.
11230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
11240 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
11250 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  0;.    pIdxInfo-
11260 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
11270 20 31 65 35 30 3b 0a 20 20 7d 0a 20 20 72 65 74   1e50;.  }.  ret
11280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11290 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
112a0 65 77 20 66 75 7a 7a 79 2d 73 65 61 72 63 68 20  ew fuzzy-search 
112b0 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  cursor..*/.stati
112c0 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 4f  c int spellfix1O
112d0 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62  pen(sqlite3_vtab
112e0 20 2a 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33   *pVTab, sqlite3
112f0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
11300 70 43 75 72 73 6f 72 29 7b 0a 20 20 73 70 65 6c  pCursor){.  spel
11310 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20  lfix1_vtab *p = 
11320 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a  (spellfix1_vtab*
11330 29 70 56 54 61 62 3b 0a 20 20 73 70 65 6c 6c 66  )pVTab;.  spellf
11340 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
11350 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74  ;.  pCur = sqlit
11360 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
11370 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66  f(*pCur) );.  if
11380 28 20 70 43 75 72 3d 3d 30 20 29 20 72 65 74 75  ( pCur==0 ) retu
11390 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
113a0 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2c 20  .  memset(pCur, 
113b0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29  0, sizeof(*pCur)
113c0 29 3b 0a 20 20 70 43 75 72 2d 3e 70 56 54 61 62  );.  pCur->pVTab
113d0 20 3d 20 70 3b 0a 20 20 2a 70 70 43 75 72 73 6f   = p;.  *ppCurso
113e0 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65 3b  r = &pCur->base;
113f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11400 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
11410 6a 75 73 74 20 61 20 64 69 73 74 61 6e 63 65 20  just a distance 
11420 6d 65 61 73 75 72 65 6d 65 6e 74 20 62 79 20 74  measurement by t
11430 68 65 20 77 6f 72 64 73 20 72 61 6e 6b 20 69 6e  he words rank in
11440 20 6f 72 64 65 72 20 74 6f 20 73 68 6f 77 0a 2a   order to show.*
11450 2a 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20  * preference to 
11460 63 6f 6d 6d 6f 6e 20 77 6f 72 64 73 2e 0a 2a 2f  common words..*/
11470 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
11480 6c 66 69 78 31 53 63 6f 72 65 28 69 6e 74 20 69  lfix1Score(int i
11490 44 69 73 74 61 6e 63 65 2c 20 69 6e 74 20 69 52  Distance, int iR
114a0 61 6e 6b 29 7b 0a 20 20 69 6e 74 20 69 4c 6f 67  ank){.  int iLog
114b0 32 3b 0a 20 20 66 6f 72 28 69 4c 6f 67 32 3d 30  2;.  for(iLog2=0
114c0 3b 20 69 52 61 6e 6b 3e 30 3b 20 69 4c 6f 67 32  ; iRank>0; iLog2
114d0 2b 2b 2c 20 69 52 61 6e 6b 3e 3e 3d 31 29 7b 7d  ++, iRank>>=1){}
114e0 0a 20 20 72 65 74 75 72 6e 20 69 44 69 73 74 61  .  return iDista
114f0 6e 63 65 20 2b 20 33 32 20 2d 20 69 4c 6f 67 32  nce + 32 - iLog2
11500 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
11510 72 65 20 74 77 6f 20 73 70 65 6c 6c 66 69 78 31  re two spellfix1
11520 5f 72 6f 77 20 6f 62 6a 65 63 74 73 20 66 6f 72  _row objects for
11530 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
11540 73 20 69 6e 20 71 73 6f 72 74 28 29 20 73 75 63  s in qsort() suc
11550 68 0a 2a 2a 20 74 68 61 74 20 74 68 65 79 20 73  h.** that they s
11560 6f 72 74 20 69 6e 20 6f 72 64 65 72 20 6f 66 20  ort in order of 
11570 69 6e 63 72 65 61 73 69 6e 67 20 64 69 73 74 61  increasing dista
11580 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nce..*/.static i
11590 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 43  nt spellfix1RowC
115a0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69  ompare(const voi
115b0 64 20 2a 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *A, const void
115c0 20 2a 42 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74   *B){.  const st
115d0 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 72  ruct spellfix1_r
115e0 6f 77 20 2a 61 20 3d 20 28 63 6f 6e 73 74 20 73  ow *a = (const s
115f0 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f  truct spellfix1_
11600 72 6f 77 2a 29 41 3b 0a 20 20 63 6f 6e 73 74 20  row*)A;.  const 
11610 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31  struct spellfix1
11620 5f 72 6f 77 20 2a 62 20 3d 20 28 63 6f 6e 73 74  _row *b = (const
11630 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78   struct spellfix
11640 31 5f 72 6f 77 2a 29 42 3b 0a 20 20 72 65 74 75  1_row*)B;.  retu
11650 72 6e 20 61 2d 3e 69 53 63 6f 72 65 20 2d 20 62  rn a->iScore - b
11660 2d 3e 69 53 63 6f 72 65 3b 0a 7d 0a 0a 2f 2a 0a  ->iScore;.}../*.
11670 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 75  ** A structure u
11680 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  sed to pass info
11690 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 73 70 65  rmation from spe
116a0 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d  llfix1FilterForM
116b0 61 74 63 68 28 29 0a 2a 2a 20 69 6e 74 6f 20 73  atch().** into s
116c0 70 65 6c 6c 66 69 78 31 52 75 6e 51 75 65 72 79  pellfix1RunQuery
116d0 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ()..*/.typedef s
116e0 74 72 75 63 74 20 4d 61 74 63 68 51 75 65 72 79  truct MatchQuery
116f0 20 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63   {.  spellfix1_c
11700 75 72 73 6f 72 20 2a 70 43 75 72 3b 20 20 20 20  ursor *pCur;    
11710 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
11720 73 6f 72 20 62 65 69 6e 67 20 71 75 65 72 69 65  sor being querie
11730 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  d */.  sqlite3_s
11740 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
11750 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 64 6f          /* shado
11760 77 20 74 61 62 6c 65 20 71 75 65 72 79 20 73 74  w table query st
11770 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72  atment */.  char
11780 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46 49 58 5f   zHash[SPELLFIX_
11790 4d 58 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20  MX_HASH];    /* 
117a0 54 68 65 20 63 75 72 72 65 6e 74 20 70 68 6f 6e  The current phon
117b0 65 68 61 73 68 20 66 6f 72 20 7a 50 61 74 74 65  ehash for zPatte
117c0 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  rn */.  const ch
117d0 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20  ar *zPattern;   
117e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e           /* Tran
117f0 73 6c 69 74 65 72 61 74 65 64 20 69 6e 70 75 74  sliterated input
11800 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74   string */.  int
11810 20 6e 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20   nPattern;      
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11830 20 4c 65 6e 67 74 68 20 6f 66 20 7a 50 61 74 74   Length of zPatt
11840 65 72 6e 20 2a 2f 0a 20 20 45 64 69 74 44 69 73  ern */.  EditDis
11850 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 4d  t3FromString *pM
11860 61 74 63 68 53 74 72 33 3b 20 2f 2a 20 4f 72 69  atchStr3; /* Ori
11870 67 69 6e 61 6c 20 75 6e 69 63 6f 64 65 20 73 74  ginal unicode st
11880 72 69 6e 67 20 2a 2f 0a 20 20 45 64 69 74 44 69  ring */.  EditDi
11890 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  st3Config *pConf
118a0 69 67 33 3b 20 20 20 20 20 20 20 2f 2a 20 45 64  ig3;       /* Ed
118b0 69 74 2d 64 69 73 74 61 6e 63 65 20 63 6f 73 74  it-distance cost
118c0 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20 2a 2f   coefficients */
118d0 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73  .  const EditDis
118e0 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 3b 20 20  t3Lang *pLang;  
118f0 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63      /* The selec
11900 74 65 64 20 6c 61 6e 67 75 61 67 65 20 63 6f 65  ted language coe
11910 66 66 69 63 69 65 6e 74 73 20 2a 2f 0a 20 20 69  fficients */.  i
11920 6e 74 20 69 4c 61 6e 67 3b 20 20 20 20 20 20 20  nt iLang;       
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 2f 2a 20 54 68 65 20 6c 61 6e 67 75 61 67 65 20  /* The language 
11950 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63 6f  id */.  int iSco
11960 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
11970 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61           /* Defa
11980 75 6c 74 20 73 63 6f 70 65 20 2a 2f 0a 20 20 69  ult scope */.  i
11990 6e 74 20 69 4d 61 78 44 69 73 74 3b 20 20 20 20  nt iMaxDist;    
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
119c0 65 64 20 65 64 69 74 20 64 69 73 74 61 6e 63 65  ed edit distance
119d0 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20 69 6e 74  , or -1 */.  int
119e0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11a00 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
11a10 20 69 6e 74 20 6e 52 75 6e 3b 20 20 20 20 20 20   int nRun;      
11a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11a30 75 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 72  umber of prior r
11a40 75 6e 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  uns for the same
11a50 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63   zPattern */.  c
11a60 68 61 72 20 61 7a 50 72 69 6f 72 5b 53 50 45 4c  har azPrior[SPEL
11a70 4c 46 49 58 5f 4d 58 5f 52 55 4e 5d 5b 53 50 45  LFIX_MX_RUN][SPE
11a80 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20  LLFIX_MX_HASH]; 
11a90 20 2f 2a 20 50 72 69 6f 72 20 68 61 73 68 65 73   /* Prior hashes
11aa0 20 2a 2f 0a 7d 20 4d 61 74 63 68 51 75 65 72 79   */.} MatchQuery
11ab0 3b 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 71  ;../*.** Run a q
11ac0 75 65 72 79 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  uery looking for
11ad0 20 74 68 65 20 62 65 73 74 20 6d 61 74 63 68 65   the best matche
11ae0 73 20 61 67 61 69 6e 73 74 20 7a 50 61 74 74 65  s against zPatte
11af0 72 6e 20 75 73 69 6e 67 0a 2a 2a 20 7a 48 61 73  rn using.** zHas
11b00 68 20 61 73 20 74 68 65 20 63 68 61 72 61 63 74  h as the charact
11b10 65 72 20 63 6c 61 73 73 20 73 65 65 64 20 68 61  er class seed ha
11b20 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sh..*/.static vo
11b30 69 64 20 73 70 65 6c 6c 66 69 78 31 52 75 6e 51  id spellfix1RunQ
11b40 75 65 72 79 28 4d 61 74 63 68 51 75 65 72 79 20  uery(MatchQuery 
11b50 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
11b60 7a 51 75 65 72 79 2c 20 69 6e 74 20 6e 51 75 65  zQuery, int nQue
11b70 72 79 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ry){.  const cha
11b80 72 20 2a 7a 4b 31 3b 0a 20 20 63 6f 6e 73 74 20  r *zK1;.  const 
11b90 63 68 61 72 20 2a 7a 57 6f 72 64 3b 0a 20 20 69  char *zWord;.  i
11ba0 6e 74 20 69 44 69 73 74 3b 0a 20 20 69 6e 74 20  nt iDist;.  int 
11bb0 69 52 61 6e 6b 3b 0a 20 20 69 6e 74 20 69 53 63  iRank;.  int iSc
11bc0 6f 72 65 3b 0a 20 20 69 6e 74 20 69 57 6f 72 73  ore;.  int iWors
11bd0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 64 78  t = 0;.  int idx
11be0 3b 0a 20 20 69 6e 74 20 69 64 78 57 6f 72 73 74  ;.  int idxWorst
11bf0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 3b 0a   = -1;.  int i;.
11c00 20 20 69 6e 74 20 69 53 63 6f 70 65 20 3d 20 70    int iScope = p
11c10 2d 3e 69 53 63 6f 70 65 3b 0a 20 20 73 70 65 6c  ->iScope;.  spel
11c20 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
11c30 75 72 20 3d 20 70 2d 3e 70 43 75 72 3b 0a 20 20  ur = p->pCur;.  
11c40 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
11c50 74 6d 74 20 3d 20 70 2d 3e 70 53 74 6d 74 3b 0a  tmt = p->pStmt;.
11c60 20 20 63 68 61 72 20 7a 48 61 73 68 31 5b 53 50    char zHash1[SP
11c70 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b  ELLFIX_MX_HASH];
11c80 0a 20 20 63 68 61 72 20 7a 48 61 73 68 32 5b 53  .  char zHash2[S
11c90 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d  PELLFIX_MX_HASH]
11ca0 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6c 61 73 73  ;.  char *zClass
11cb0 3b 0a 20 20 69 6e 74 20 6e 43 6c 61 73 73 3b 0a  ;.  int nClass;.
11cc0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
11cd0 20 70 43 75 72 2d 3e 61 3d 3d 30 20 7c 7c 20 70   pCur->a==0 || p
11ce0 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 20 20  ->rc ) return;  
11cf0 20 2f 2a 20 50 72 69 6f 72 20 6d 65 6d 6f 72 79   /* Prior memory
11d00 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
11d10 75 72 65 20 2a 2f 0a 20 20 7a 43 6c 61 73 73 20  ure */.  zClass 
11d20 3d 20 28 63 68 61 72 2a 29 70 68 6f 6e 65 74 69  = (char*)phoneti
11d30 63 48 61 73 68 28 28 75 6e 73 69 67 6e 65 64 20  cHash((unsigned 
11d40 63 68 61 72 2a 29 7a 51 75 65 72 79 2c 20 6e 51  char*)zQuery, nQ
11d50 75 65 72 79 29 3b 0a 20 20 69 66 28 20 7a 43 6c  uery);.  if( zCl
11d60 61 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ass==0 ){.    p-
11d70 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
11d80 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
11d90 20 20 7d 0a 20 20 6e 43 6c 61 73 73 20 3d 20 28    }.  nClass = (
11da0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43 6c 61 73  int)strlen(zClas
11db0 73 29 3b 0a 20 20 69 66 28 20 6e 43 6c 61 73 73  s);.  if( nClass
11dc0 3e 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53  >SPELLFIX_MX_HAS
11dd0 48 2d 32 20 29 7b 0a 20 20 20 20 6e 43 6c 61 73  H-2 ){.    nClas
11de0 73 20 3d 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  s = SPELLFIX_MX_
11df0 48 41 53 48 2d 32 3b 0a 20 20 20 20 7a 43 6c 61  HASH-2;.    zCla
11e00 73 73 5b 6e 43 6c 61 73 73 5d 20 3d 20 30 3b 0a  ss[nClass] = 0;.
11e10 20 20 7d 0a 20 20 69 66 28 20 6e 43 6c 61 73 73    }.  if( nClass
11e20 3c 3d 69 53 63 6f 70 65 20 29 7b 0a 20 20 20 20  <=iScope ){.    
11e30 69 66 28 20 6e 43 6c 61 73 73 3e 32 20 29 7b 0a  if( nClass>2 ){.
11e40 20 20 20 20 20 20 69 53 63 6f 70 65 20 3d 20 6e        iScope = n
11e50 43 6c 61 73 73 2d 31 3b 0a 20 20 20 20 7d 65 6c  Class-1;.    }el
11e60 73 65 7b 0a 20 20 20 20 20 20 69 53 63 6f 70 65  se{.      iScope
11e70 20 3d 20 6e 43 6c 61 73 73 3b 0a 20 20 20 20 7d   = nClass;.    }
11e80 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 48  .  }.  memcpy(zH
11e90 61 73 68 31 2c 20 7a 43 6c 61 73 73 2c 20 69 53  ash1, zClass, iS
11ea0 63 6f 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  cope);.  sqlite3
11eb0 5f 66 72 65 65 28 7a 43 6c 61 73 73 29 3b 0a 20  _free(zClass);. 
11ec0 20 7a 48 61 73 68 31 5b 69 53 63 6f 70 65 5d 20   zHash1[iScope] 
11ed0 3d 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 48  = 0;.  memcpy(zH
11ee0 61 73 68 32 2c 20 7a 48 61 73 68 31 2c 20 69 53  ash2, zHash1, iS
11ef0 63 6f 70 65 29 3b 0a 20 20 7a 48 61 73 68 32 5b  cope);.  zHash2[
11f00 69 53 63 6f 70 65 5d 20 3d 20 27 5a 27 3b 0a 20  iScope] = 'Z';. 
11f10 20 7a 48 61 73 68 32 5b 69 53 63 6f 70 65 2b 31   zHash2[iScope+1
11f20 5d 20 3d 20 30 3b 0a 23 69 66 20 53 50 45 4c 4c  ] = 0;.#if SPELL
11f30 46 49 58 5f 4d 58 5f 52 55 4e 3e 31 0a 20 20 66  FIX_MX_RUN>1.  f
11f40 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 75  or(i=0; i<p->nRu
11f50 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
11f60 20 73 74 72 63 6d 70 28 70 2d 3e 61 7a 50 72 69   strcmp(p->azPri
11f70 6f 72 5b 69 5d 2c 20 7a 48 61 73 68 31 29 3d 3d  or[i], zHash1)==
11f80 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
11f90 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
11fa0 20 70 2d 3e 6e 52 75 6e 3c 53 50 45 4c 4c 46 49   p->nRun<SPELLFI
11fb0 58 5f 4d 58 5f 52 55 4e 20 29 3b 0a 20 20 6d 65  X_MX_RUN );.  me
11fc0 6d 63 70 79 28 70 2d 3e 61 7a 50 72 69 6f 72 5b  mcpy(p->azPrior[
11fd0 70 2d 3e 6e 52 75 6e 2b 2b 5d 2c 20 7a 48 61 73  p->nRun++], zHas
11fe0 68 31 2c 20 69 53 63 6f 70 65 2b 31 29 3b 0a 20  h1, iScope+1);. 
11ff0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 62 69 6e   if( sqlite3_bin
12000 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
12010 20 7a 48 61 73 68 31 2c 20 2d 31 2c 20 53 51 4c   zHash1, -1, SQL
12020 49 54 45 5f 53 54 41 54 49 43 29 3d 3d 53 51 4c  ITE_STATIC)==SQL
12030 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 7c 7c 20  ITE_NOMEM.   || 
12040 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
12050 74 28 70 53 74 6d 74 2c 20 32 2c 20 7a 48 61 73  t(pStmt, 2, zHas
12060 68 32 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  h2, -1, SQLITE_S
12070 54 41 54 49 43 29 3d 3d 53 51 4c 49 54 45 5f 4e  TATIC)==SQLITE_N
12080 4f 4d 45 4d 0a 20 20 29 7b 0a 20 20 20 20 70 2d  OMEM.  ){.    p-
12090 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
120a0 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  EM;.    return;.
120b0 20 20 7d 0a 23 69 66 20 53 50 45 4c 4c 46 49 58    }.#if SPELLFIX
120c0 5f 4d 58 5f 52 55 4e 3e 31 0a 20 20 66 6f 72 28  _MX_RUN>1.  for(
120d0 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f  i=0; i<pCur->nRo
120e0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  w; i++){.    if(
120f0 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f   pCur->a[i].iSco
12100 72 65 3e 69 57 6f 72 73 74 20 29 7b 0a 20 20 20  re>iWorst ){.   
12110 20 20 20 69 57 6f 72 73 74 20 3d 20 70 43 75 72     iWorst = pCur
12120 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72 65 3b 0a 20  ->a[i].iScore;. 
12130 20 20 20 20 20 69 64 78 57 6f 72 73 74 20 3d 20       idxWorst = 
12140 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  i;.    }.  }.#en
12150 64 69 66 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  dif.  while( sql
12160 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
12170 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
12180 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c 65      int iMatchle
12190 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 69 52 61 6e  n = -1;.    iRan
121a0 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  k = sqlite3_colu
121b0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29  mn_int(pStmt, 2)
121c0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4d 61  ;.    if( p->pMa
121d0 74 63 68 53 74 72 33 20 29 7b 0a 20 20 20 20 20  tchStr3 ){.     
121e0 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 73 71 6c   int nWord = sql
121f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
12200 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  s(pStmt, 1);.   
12210 20 20 20 7a 57 6f 72 64 20 3d 20 28 63 6f 6e 73     zWord = (cons
12220 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
12230 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
12240 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 44 69  t, 1);.      iDi
12250 73 74 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f  st = editDist3Co
12260 72 65 28 70 2d 3e 70 4d 61 74 63 68 53 74 72 33  re(p->pMatchStr3
12270 2c 20 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20  , zWord, nWord, 
12280 70 2d 3e 70 4c 61 6e 67 2c 20 26 69 4d 61 74 63  p->pLang, &iMatc
12290 68 6c 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  hlen);.    }else
122a0 7b 0a 20 20 20 20 20 20 7a 4b 31 20 3d 20 28 63  {.      zK1 = (c
122b0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
122c0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
122d0 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20 20 20 20  Stmt, 3);.      
122e0 69 66 28 20 7a 4b 31 3d 3d 30 20 29 20 63 6f 6e  if( zK1==0 ) con
122f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 44 69  tinue;.      iDi
12300 73 74 20 3d 20 65 64 69 74 64 69 73 74 31 28 70  st = editdist1(p
12310 2d 3e 7a 50 61 74 74 65 72 6e 2c 20 7a 4b 31 2c  ->zPattern, zK1,
12320 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
12330 66 28 20 69 44 69 73 74 3c 30 20 29 7b 0a 20 20  f( iDist<0 ){.  
12340 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
12350 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
12360 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
12370 20 70 43 75 72 2d 3e 6e 53 65 61 72 63 68 2b 2b   pCur->nSearch++
12380 3b 0a 20 20 20 20 69 53 63 6f 72 65 20 3d 20 73  ;.    iScore = s
12390 70 65 6c 6c 66 69 78 31 53 63 6f 72 65 28 69 44  pellfix1Score(iD
123a0 69 73 74 2c 69 52 61 6e 6b 29 3b 0a 20 20 20 20  ist,iRank);.    
123b0 69 66 28 20 70 2d 3e 69 4d 61 78 44 69 73 74 3e  if( p->iMaxDist>
123c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
123d0 69 44 69 73 74 3e 70 2d 3e 69 4d 61 78 44 69 73  iDist>p->iMaxDis
123e0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
123f0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 52      if( pCur->nR
12400 6f 77 3e 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63  ow>=pCur->nAlloc
12410 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70  -1 ){.        sp
12420 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75 72  ellfix1ResizeCur
12430 73 6f 72 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  sor(pCur, pCur->
12440 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 29 3b 0a  nAlloc*2 + 10);.
12450 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
12460 2d 3e 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ->a==0 ) break;.
12470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 64        }.      id
12480 78 20 3d 20 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a  x = pCur->nRow;.
12490 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
124a0 75 72 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d 3e 6e  ur->nRow<pCur->n
124b0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
124c0 64 78 20 3d 20 70 43 75 72 2d 3e 6e 52 6f 77 3b  dx = pCur->nRow;
124d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
124e0 53 63 6f 72 65 3c 69 57 6f 72 73 74 20 29 7b 0a  Score<iWorst ){.
124f0 20 20 20 20 20 20 69 64 78 20 3d 20 69 64 78 57        idx = idxW
12500 6f 72 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  orst;.      sqli
12510 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61  te3_free(pCur->a
12520 5b 69 64 78 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20  [idx].zWord);.  
12530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
12540 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
12550 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e     pCur->a[idx].
12560 7a 57 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 5f  zWord = sqlite3_
12570 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71  mprintf("%s", sq
12580 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
12590 74 28 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20  t(pStmt, 1));.  
125a0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 5b 69 64    if( pCur->a[id
125b0 78 5d 2e 7a 57 6f 72 64 3d 3d 30 20 29 7b 0a 20  x].zWord==0 ){. 
125c0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
125d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
125e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
125f0 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69    pCur->a[idx].i
12600 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
12610 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
12620 6d 74 2c 20 30 29 3b 0a 20 20 20 20 70 43 75 72  mt, 0);.    pCur
12630 2d 3e 61 5b 69 64 78 5d 2e 69 52 61 6e 6b 20 3d  ->a[idx].iRank =
12640 20 69 52 61 6e 6b 3b 0a 20 20 20 20 70 43 75 72   iRank;.    pCur
12650 2d 3e 61 5b 69 64 78 5d 2e 69 44 69 73 74 61 6e  ->a[idx].iDistan
12660 63 65 20 3d 20 69 44 69 73 74 3b 0a 20 20 20 20  ce = iDist;.    
12670 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 53 63  pCur->a[idx].iSc
12680 6f 72 65 20 3d 20 69 53 63 6f 72 65 3b 0a 20 20  ore = iScore;.  
12690 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69    pCur->a[idx].i
126a0 4d 61 74 63 68 6c 65 6e 20 3d 20 69 4d 61 74 63  Matchlen = iMatc
126b0 68 6c 65 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79  hlen;.    memcpy
126c0 28 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 48  (pCur->a[idx].zH
126d0 61 73 68 2c 20 7a 48 61 73 68 31 2c 20 69 53 63  ash, zHash1, iSc
126e0 6f 70 65 2b 31 29 3b 0a 20 20 20 20 69 66 28 20  ope+1);.    if( 
126f0 70 43 75 72 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d  pCur->nRow<pCur-
12700 3e 6e 41 6c 6c 6f 63 20 29 20 70 43 75 72 2d 3e  >nAlloc ) pCur->
12710 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nRow++;.    if( 
12720 70 43 75 72 2d 3e 6e 52 6f 77 3d 3d 70 43 75 72  pCur->nRow==pCur
12730 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
12740 20 20 69 57 6f 72 73 74 20 3d 20 70 43 75 72 2d    iWorst = pCur-
12750 3e 61 5b 30 5d 2e 69 53 63 6f 72 65 3b 0a 20 20  >a[0].iScore;.  
12760 20 20 20 20 69 64 78 57 6f 72 73 74 20 3d 20 30      idxWorst = 0
12770 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
12780 20 69 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20 69   i<pCur->nRow; i
12790 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 53 63  ++){.        iSc
127a0 6f 72 65 20 3d 20 70 43 75 72 2d 3e 61 5b 69 5d  ore = pCur->a[i]
127b0 2e 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 20  .iScore;.       
127c0 20 69 66 28 20 69 57 6f 72 73 74 3c 69 53 63 6f   if( iWorst<iSco
127d0 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  re ){.          
127e0 69 57 6f 72 73 74 20 3d 20 69 53 63 6f 72 65 3b  iWorst = iScore;
127f0 0a 20 20 20 20 20 20 20 20 20 20 69 64 78 57 6f  .          idxWo
12800 72 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  rst = i;.       
12810 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12820 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
12830 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
12840 3b 0a 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e  ;.  if( rc ) p->
12850 72 63 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc = rc;.}../*.*
12860 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
12870 66 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65  f the xFilter me
12880 74 68 6f 64 20 77 6f 72 6b 20 69 66 20 74 68 65  thod work if the
12890 20 4d 41 54 43 48 20 74 65 72 6d 20 69 73 20 70   MATCH term is p
128a0 72 65 73 65 6e 74 0a 2a 2a 20 61 6e 64 20 77 65  resent.** and we
128b0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 73 63 61   are doing a sca
128c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
128d0 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72   spellfix1Filter
128e0 46 6f 72 4d 61 74 63 68 28 0a 20 20 73 70 65 6c  ForMatch(.  spel
128f0 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
12900 75 72 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  ur,.  int idxNum
12910 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
12920 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
12930 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
12940 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
12950 4d 61 74 63 68 54 68 69 73 3b 20 20 20 2f 2a 20  MatchThis;   /* 
12960 52 48 53 20 6f 66 20 74 68 65 20 4d 41 54 43 48  RHS of the MATCH
12970 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
12980 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
12990 6e 67 20 2a 70 4d 61 74 63 68 53 74 72 33 20 3d  ng *pMatchStr3 =
129a0 20 30 3b 20 2f 2a 20 7a 4d 61 74 63 68 54 68 69   0; /* zMatchThi
129b0 73 20 61 73 20 61 6e 20 65 64 69 74 64 69 73 74  s as an editdist
129c0 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
129d0 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20  r *zPattern;    
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129f0 2f 2a 20 54 72 61 6e 73 6c 69 74 65 72 61 74 69  /* Transliterati
12a00 6f 6e 20 6f 66 20 7a 4d 61 74 63 68 54 68 69 73  on of zMatchThis
12a10 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65   */.  int nPatte
12a20 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rn;             
12a30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
12a40 74 68 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a  th of zPattern *
12a50 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  /.  int iLimit =
12a60 20 32 30 3b 20 20 20 20 20 20 20 20 20 20 20 20   20;            
12a70 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75         /* Max nu
12a80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20  mber of rows of 
12a90 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
12aa0 69 53 63 6f 70 65 20 3d 20 33 3b 20 20 20 20 20  iScope = 3;     
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ac0 2a 20 55 73 65 20 74 68 69 73 20 6d 61 6e 79 20  * Use this many 
12ad0 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 7a 43  characters of zC
12ae0 6c 61 73 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  lass */.  int iL
12af0 61 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ang = 0;        
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12b10 4c 61 6e 67 75 61 67 65 20 63 6f 64 65 20 2a 2f  Language code */
12b20 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20  .  char *zSql;  
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b40 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 6f 66 20        /* SQL of 
12b50 73 68 61 64 6f 77 20 74 61 62 6c 65 20 71 75 65  shadow table que
12b60 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ry */.  sqlite3_
12b70 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
12b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
12b90 61 64 6f 77 20 74 61 62 6c 65 20 71 75 65 72 79  adow table query
12ba0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
12bd0 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  lt code */.  int
12be0 20 69 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20   idx = 1;       
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
12c10 65 20 66 69 6c 74 65 72 20 70 61 72 61 6d 65 74  e filter paramet
12c20 65 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  er */.  spellfix
12c30 31 5f 76 74 61 62 20 2a 70 20 3d 20 70 43 75 72  1_vtab *p = pCur
12c40 2d 3e 70 56 54 61 62 3b 20 20 20 2f 2a 20 54 68  ->pVTab;   /* Th
12c50 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
12c60 74 68 61 74 20 6f 77 6e 73 20 70 43 75 72 20 2a  that owns pCur *
12c70 2f 0a 20 20 4d 61 74 63 68 51 75 65 72 79 20 78  /.  MatchQuery x
12c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c90 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 70 61         /* For pa
12ca0 73 73 69 6e 67 20 69 6e 66 6f 20 74 6f 20 52 75  ssing info to Ru
12cb0 6e 51 75 65 72 79 28 29 20 2a 2f 0a 0a 20 20 2f  nQuery() */..  /
12cc0 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 73 74 20  * Load the cost 
12cd0 74 61 62 6c 65 20 69 66 20 77 65 20 68 61 76 65  table if we have
12ce0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 64 6f 6e   not already don
12cf0 65 20 73 6f 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e so */.  if( p-
12d00 3e 7a 43 6f 73 74 54 61 62 6c 65 21 3d 30 20 26  >zCostTable!=0 &
12d10 26 20 70 2d 3e 70 43 6f 6e 66 69 67 33 3d 3d 30  & p->pConfig3==0
12d20 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66   ){.    p->pConf
12d30 69 67 33 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ig3 = sqlite3_ma
12d40 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 2d 3e  lloc( sizeof(p->
12d50 70 43 6f 6e 66 69 67 33 5b 30 5d 29 20 29 3b 0a  pConfig3[0]) );.
12d60 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
12d70 69 67 33 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ig3==0 ) return 
12d80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12d90 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 43 6f 6e    memset(p->pCon
12da0 66 69 67 33 2c 20 30 2c 20 73 69 7a 65 6f 66 28  fig3, 0, sizeof(
12db0 70 2d 3e 70 43 6f 6e 66 69 67 33 5b 30 5d 29 29  p->pConfig3[0]))
12dc0 3b 0a 20 20 20 20 72 63 20 3d 20 65 64 69 74 44  ;.    rc = editD
12dd0 69 73 74 33 43 6f 6e 66 69 67 4c 6f 61 64 28 70  ist3ConfigLoad(p
12de0 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 70 2d 3e 64  ->pConfig3, p->d
12df0 62 2c 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65  b, p->zCostTable
12e00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
12e10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12e20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73   memset(&x, 0, s
12e30 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 78 2e 69  izeof(x));.  x.i
12e40 53 63 6f 70 65 20 3d 20 33 3b 20 20 2f 2a 20 44  Scope = 3;  /* D
12e50 65 66 61 75 6c 74 20 73 63 6f 70 65 20 69 66 20  efault scope if 
12e60 6e 6f 6e 65 20 73 70 65 63 69 66 69 65 64 20 62  none specified b
12e70 79 20 22 57 48 45 52 45 20 73 63 6f 70 65 3d 4e  y "WHERE scope=N
12e80 22 20 2a 2f 0a 20 20 78 2e 69 4d 61 78 44 69 73  " */.  x.iMaxDis
12e90 74 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 4d 61 78  t = -1;   /* Max
12ea0 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69  imum allowed edi
12eb0 74 20 64 69 73 74 61 6e 63 65 20 2a 2f 0a 0a 20  t distance */.. 
12ec0 20 69 66 28 20 69 64 78 4e 75 6d 26 32 20 29 7b   if( idxNum&2 ){
12ed0 0a 20 20 20 20 69 4c 61 6e 67 20 3d 20 73 71 6c  .    iLang = sql
12ee0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
12ef0 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 7d  rgv[idx++]);.  }
12f00 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 26 34 20  .  if( idxNum&4 
12f10 29 7b 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  ){.    iLimit = 
12f20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
12f30 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a  t(argv[idx++]);.
12f40 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 31      if( iLimit<1
12f50 20 29 20 69 4c 69 6d 69 74 20 3d 20 31 3b 0a 20   ) iLimit = 1;. 
12f60 20 7d 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 26   }.  if( idxNum&
12f70 38 20 29 7b 0a 20 20 20 20 78 2e 69 53 63 6f 70  8 ){.    x.iScop
12f80 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
12f90 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b  e_int(argv[idx++
12fa0 5d 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 69 53  ]);.    if( x.iS
12fb0 63 6f 70 65 3c 31 20 29 20 78 2e 69 53 63 6f 70  cope<1 ) x.iScop
12fc0 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 78  e = 1;.    if( x
12fd0 2e 69 53 63 6f 70 65 3e 53 50 45 4c 4c 46 49 58  .iScope>SPELLFIX
12fe0 5f 4d 58 5f 48 41 53 48 2d 32 20 29 20 78 2e 69  _MX_HASH-2 ) x.i
12ff0 53 63 6f 70 65 20 3d 20 53 50 45 4c 4c 46 49 58  Scope = SPELLFIX
13000 5f 4d 58 5f 48 41 53 48 2d 32 3b 0a 20 20 7d 0a  _MX_HASH-2;.  }.
13010 20 20 69 66 28 20 69 64 78 4e 75 6d 26 28 31 36    if( idxNum&(16
13020 7c 33 32 29 20 29 7b 0a 20 20 20 20 78 2e 69 4d  |32) ){.    x.iM
13030 61 78 44 69 73 74 20 3d 20 73 71 6c 69 74 65 33  axDist = sqlite3
13040 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
13050 69 64 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28  idx++]);.    if(
13060 20 69 64 78 4e 75 6d 26 31 36 20 29 20 78 2e 69   idxNum&16 ) x.i
13070 4d 61 78 44 69 73 74 2d 2d 3b 0a 20 20 20 20 69  MaxDist--;.    i
13080 66 28 20 78 2e 69 4d 61 78 44 69 73 74 3c 30 20  f( x.iMaxDist<0 
13090 29 20 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 30  ) x.iMaxDist = 0
130a0 3b 0a 20 20 7d 0a 20 20 73 70 65 6c 6c 66 69 78  ;.  }.  spellfix
130b0 31 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75  1ResetCursor(pCu
130c0 72 29 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52  r);.  spellfix1R
130d0 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72  esizeCursor(pCur
130e0 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 7a 4d 61  , iLimit);.  zMa
130f0 74 63 68 54 68 69 73 20 3d 20 73 71 6c 69 74 65  tchThis = sqlite
13100 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
13110 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 4d 61  v[0]);.  if( zMa
13120 74 63 68 54 68 69 73 3d 3d 30 20 29 20 72 65 74  tchThis==0 ) ret
13130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13140 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 33   if( p->pConfig3
13150 20 29 7b 0a 20 20 20 20 78 2e 70 4c 61 6e 67 20   ){.    x.pLang 
13160 3d 20 65 64 69 74 44 69 73 74 33 46 69 6e 64 4c  = editDist3FindL
13170 61 6e 67 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c  ang(p->pConfig3,
13180 20 69 4c 61 6e 67 29 3b 0a 20 20 20 20 70 4d 61   iLang);.    pMa
13190 74 63 68 53 74 72 33 20 3d 20 65 64 69 74 44 69  tchStr3 = editDi
131a0 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77  st3FromStringNew
131b0 28 78 2e 70 4c 61 6e 67 2c 20 28 63 6f 6e 73 74  (x.pLang, (const
131c0 20 63 68 61 72 2a 29 7a 4d 61 74 63 68 54 68 69   char*)zMatchThi
131d0 73 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  s, -1);.    if( 
131e0 70 4d 61 74 63 68 53 74 72 33 3d 3d 30 20 29 7b  pMatchStr3==0 ){
131f0 0a 20 20 20 20 20 20 78 2e 72 63 20 3d 20 53 51  .      x.rc = SQ
13200 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13210 20 20 67 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78    goto filter_ex
13220 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  it;.    }.  }els
13230 65 7b 0a 20 20 20 20 78 2e 70 4c 61 6e 67 20 3d  e{.    x.pLang =
13240 20 30 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 74 65   0;.  }.  zPatte
13250 72 6e 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e  rn = (char*)tran
13260 73 6c 69 74 65 72 61 74 65 28 7a 4d 61 74 63 68  sliterate(zMatch
13270 54 68 69 73 2c 20 73 71 6c 69 74 65 33 5f 76 61  This, sqlite3_va
13280 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
13290 5d 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ]));.  sqlite3_f
132a0 72 65 65 28 70 43 75 72 2d 3e 7a 50 61 74 74 65  ree(pCur->zPatte
132b0 72 6e 29 3b 0a 20 20 70 43 75 72 2d 3e 7a 50 61  rn);.  pCur->zPa
132c0 74 74 65 72 6e 20 3d 20 7a 50 61 74 74 65 72 6e  ttern = zPattern
132d0 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e  ;.  if( zPattern
132e0 3d 3d 30 20 29 7b 0a 20 20 20 20 78 2e 72 63 20  ==0 ){.    x.rc 
132f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
13300 20 20 20 20 67 6f 74 6f 20 66 69 6c 74 65 72 5f      goto filter_
13310 65 78 69 74 3b 0a 20 20 7d 0a 20 20 6e 50 61 74  exit;.  }.  nPat
13320 74 65 72 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  tern = (int)strl
13330 65 6e 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  en(zPattern);.  
13340 69 66 28 20 7a 50 61 74 74 65 72 6e 5b 6e 50 61  if( zPattern[nPa
13350 74 74 65 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 20  ttern-1]=='*' ) 
13360 6e 50 61 74 74 65 72 6e 2d 2d 3b 0a 20 20 7a 53  nPattern--;.  zS
13370 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
13380 69 6e 74 66 28 0a 20 20 20 20 20 22 53 45 4c 45  intf(.     "SELE
13390 43 54 20 69 64 2c 20 77 6f 72 64 2c 20 72 61 6e  CT id, word, ran
133a0 6b 2c 20 6b 31 22 0a 20 20 20 20 20 22 20 20 46  k, k1".     "  F
133b0 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f  ROM \"%w\".\"%w_
133c0 76 6f 63 61 62 5c 22 22 0a 20 20 20 20 20 22 20  vocab\"".     " 
133d0 57 48 45 52 45 20 6c 61 6e 67 69 64 3d 25 64 20  WHERE langid=%d 
133e0 41 4e 44 20 6b 32 3e 3d 3f 31 20 41 4e 44 20 6b  AND k2>=?1 AND k
133f0 32 3c 3f 32 22 2c 0a 20 20 20 20 20 70 2d 3e 7a  2<?2",.     p->z
13400 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c  DbName, p->zTabl
13410 65 4e 61 6d 65 2c 20 69 4c 61 6e 67 0a 20 20 29  eName, iLang.  )
13420 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
13430 29 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20 53 51  ){.    x.rc = SQ
13440 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13450 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 67  pStmt = 0;.    g
13460 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78 69 74 3b  oto filter_exit;
13470 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
13480 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
13490 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
134a0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71  &pStmt, 0);.  sq
134b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
134c0 3b 0a 20 20 70 43 75 72 2d 3e 69 4c 61 6e 67 20  ;.  pCur->iLang 
134d0 3d 20 69 4c 61 6e 67 3b 0a 20 20 78 2e 70 43 75  = iLang;.  x.pCu
134e0 72 20 3d 20 70 43 75 72 3b 0a 20 20 78 2e 70 53  r = pCur;.  x.pS
134f0 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 78  tmt = pStmt;.  x
13500 2e 7a 50 61 74 74 65 72 6e 20 3d 20 7a 50 61 74  .zPattern = zPat
13510 74 65 72 6e 3b 0a 20 20 78 2e 6e 50 61 74 74 65  tern;.  x.nPatte
13520 72 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20  rn = nPattern;. 
13530 20 78 2e 70 4d 61 74 63 68 53 74 72 33 20 3d 20   x.pMatchStr3 = 
13540 70 4d 61 74 63 68 53 74 72 33 3b 0a 20 20 78 2e  pMatchStr3;.  x.
13550 69 4c 61 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a 20  iLang = iLang;. 
13560 20 78 2e 72 63 20 3d 20 72 63 3b 0a 20 20 78 2e   x.rc = rc;.  x.
13570 70 43 6f 6e 66 69 67 33 20 3d 20 70 2d 3e 70 43  pConfig3 = p->pC
13580 6f 6e 66 69 67 33 3b 0a 20 20 69 66 28 20 78 2e  onfig3;.  if( x.
13590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
135a0 0a 20 20 20 20 73 70 65 6c 6c 66 69 78 31 52 75  .    spellfix1Ru
135b0 6e 51 75 65 72 79 28 26 78 2c 20 7a 50 61 74 74  nQuery(&x, zPatt
135c0 65 72 6e 2c 20 6e 50 61 74 74 65 72 6e 29 3b 0a  ern, nPattern);.
135d0 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
135e0 3e 61 20 29 7b 0a 20 20 20 20 71 73 6f 72 74 28  >a ){.    qsort(
135f0 70 43 75 72 2d 3e 61 2c 20 70 43 75 72 2d 3e 6e  pCur->a, pCur->n
13600 52 6f 77 2c 20 73 69 7a 65 6f 66 28 70 43 75 72  Row, sizeof(pCur
13610 2d 3e 61 5b 30 5d 29 2c 20 73 70 65 6c 6c 66 69  ->a[0]), spellfi
13620 78 31 52 6f 77 43 6f 6d 70 61 72 65 29 3b 0a 20  x1RowCompare);. 
13630 20 20 20 70 43 75 72 2d 3e 69 54 6f 70 20 3d 20     pCur->iTop = 
13640 69 4c 69 6d 69 74 3b 0a 20 20 20 20 70 43 75 72  iLimit;.    pCur
13650 2d 3e 69 53 63 6f 70 65 20 3d 20 69 53 63 6f 70  ->iScope = iScop
13660 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
13670 78 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  x.rc = SQLITE_NO
13680 4d 45 4d 3b 0a 20 20 7d 0a 0a 66 69 6c 74 65 72  MEM;.  }..filter
13690 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
136a0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
136b0 3b 0a 20 20 65 64 69 74 44 69 73 74 33 46 72 6f  ;.  editDist3Fro
136c0 6d 53 74 72 69 6e 67 44 65 6c 65 74 65 28 70 4d  mStringDelete(pM
136d0 61 74 63 68 53 74 72 33 29 3b 0a 20 20 72 65 74  atchStr3);.  ret
136e0 75 72 6e 20 78 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  urn x.rc;.}../*.
136f0 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
13700 6f 66 20 78 46 69 6c 74 65 72 20 68 61 6e 64 6c  of xFilter handl
13710 65 73 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20  es a full-table 
13720 73 63 61 6e 20 63 61 73 65 0a 2a 2f 0a 73 74 61  scan case.*/.sta
13730 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
13740 31 46 69 6c 74 65 72 46 6f 72 46 75 6c 6c 53 63  1FilterForFullSc
13750 61 6e 28 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  an(.  spellfix1_
13760 63 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20  cursor *pCur,.  
13770 69 6e 74 20 69 64 78 4e 75 6d 2c 0a 20 20 69 6e  int idxNum,.  in
13780 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
13790 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
137a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
137b0 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 70 65 6c  ar *zSql;.  spel
137c0 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 56 54 61  lfix1_vtab *pVTa
137d0 62 20 3d 20 70 43 75 72 2d 3e 70 56 54 61 62 3b  b = pCur->pVTab;
137e0 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65  .  spellfix1Rese
137f0 74 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  tCursor(pCur);. 
13800 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
13810 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 22 53  mprintf(.     "S
13820 45 4c 45 43 54 20 77 6f 72 64 2c 20 72 61 6e 6b  ELECT word, rank
13830 2c 20 4e 55 4c 4c 2c 20 6c 61 6e 67 69 64 2c 20  , NULL, langid, 
13840 69 64 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c  id FROM \"%w\".\
13850 22 25 77 5f 76 6f 63 61 62 5c 22 22 2c 0a 20 20  "%w_vocab\"",.  
13860 20 20 20 70 56 54 61 62 2d 3e 7a 44 62 4e 61 6d     pVTab->zDbNam
13870 65 2c 20 70 56 54 61 62 2d 3e 7a 54 61 62 6c 65  e, pVTab->zTable
13880 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 53 71  Name);.  if( zSq
13890 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
138a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
138b0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
138c0 72 65 5f 76 32 28 70 56 54 61 62 2d 3e 64 62 2c  re_v2(pVTab->db,
138d0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72   zSql, -1, &pCur
138e0 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 30 29 3b  ->pFullScan, 0);
138f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13900 7a 53 71 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 6e  zSql);.  pCur->n
13910 52 6f 77 20 3d 20 70 43 75 72 2d 3e 69 52 6f 77  Row = pCur->iRow
13920 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
13930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
13950 65 70 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63  ep(pCur->pFullSc
13960 61 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  an);.    if( rc=
13970 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 20 70  =SQLITE_ROW ){ p
13980 43 75 72 2d 3e 69 52 6f 77 20 3d 20 2d 31 3b 20  Cur->iRow = -1; 
13990 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
139a0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
139b0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 20 72 63 20  LITE_DONE ){ rc 
139c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20  = SQLITE_OK; }. 
139d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
139e0 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  ->iRow = 0;.  }.
139f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13a00 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 74 6f  ./*.** Called to
13a10 20 22 72 65 77 69 6e 64 22 20 61 20 63 75 72 73   "rewind" a curs
13a20 6f 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62  or back to the b
13a30 65 67 69 6e 6e 69 6e 67 20 73 6f 20 74 68 61 74  eginning so that
13a40 0a 2a 2a 20 69 74 20 73 74 61 72 74 73 20 69 74  .** it starts it
13a50 73 20 6f 75 74 70 75 74 20 6f 76 65 72 20 61 67  s output over ag
13a60 61 69 6e 2e 20 20 41 6c 77 61 79 73 20 63 61 6c  ain.  Always cal
13a70 6c 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  led at least onc
13a80 65 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 6e  e.** prior to an
13a90 79 20 73 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d  y spellfix1Colum
13aa0 6e 2c 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 69  n, spellfix1Rowi
13ab0 64 2c 20 6f 72 20 73 70 65 6c 6c 66 69 78 31 45  d, or spellfix1E
13ac0 6f 66 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  of call..*/.stat
13ad0 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
13ae0 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65  Filter(.  sqlite
13af0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
13b00 75 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75  ur, .  int idxNu
13b10 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
13b20 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
13b30 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
13b40 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 70 65   **argv.){.  spe
13b50 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70  llfix1_cursor *p
13b60 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31  Cur = (spellfix1
13b70 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20  _cursor *)cur;. 
13b80 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
13b90 64 78 4e 75 6d 20 26 20 31 20 29 7b 0a 20 20 20  dxNum & 1 ){.   
13ba0 20 72 63 20 3d 20 73 70 65 6c 6c 66 69 78 31 46   rc = spellfix1F
13bb0 69 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 70 43  ilterForMatch(pC
13bc0 75 72 2c 20 69 64 78 4e 75 6d 2c 20 61 72 67 63  ur, idxNum, argc
13bd0 2c 20 61 72 67 76 29 3b 0a 20 20 7d 65 6c 73 65  , argv);.  }else
13be0 7b 0a 20 20 20 20 72 63 20 3d 20 73 70 65 6c 6c  {.    rc = spell
13bf0 66 69 78 31 46 69 6c 74 65 72 46 6f 72 46 75 6c  fix1FilterForFul
13c00 6c 53 63 61 6e 28 70 43 75 72 2c 20 69 64 78 4e  lScan(pCur, idxN
13c10 75 6d 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b  um, argc, argv);
13c20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13c30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  ;.}.../*.** Adva
13c40 6e 63 65 20 61 20 63 75 72 73 6f 72 20 74 6f 20  nce a cursor to 
13c50 69 74 73 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  its next row of 
13c60 6f 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63  output.*/.static
13c70 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 4e 65   int spellfix1Ne
13c80 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  xt(sqlite3_vtab_
13c90 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
13ca0 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
13cb0 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66   *pCur = (spellf
13cc0 69 78 31 5f 63 75 72 73 6f 72 20 2a 29 63 75 72  ix1_cursor *)cur
13cd0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
13ce0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 43  ITE_OK;.  if( pC
13cf0 75 72 2d 3e 69 52 6f 77 20 3c 20 70 43 75 72 2d  ur->iRow < pCur-
13d00 3e 6e 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28  >nRow ){.    if(
13d10 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e   pCur->pFullScan
13d20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
13d30 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75 72  qlite3_step(pCur
13d40 2d 3e 70 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20  ->pFullScan);.  
13d50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13d60 54 45 5f 52 4f 57 20 29 20 70 43 75 72 2d 3e 69  TE_ROW ) pCur->i
13d70 52 6f 77 20 3d 20 70 43 75 72 2d 3e 6e 52 6f 77  Row = pCur->nRow
13d80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13d90 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 72 63  SQLITE_ROW || rc
13da0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
13db0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13dd0 20 70 43 75 72 2d 3e 69 52 6f 77 2b 2b 3b 0a 20   pCur->iRow++;. 
13de0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
13df0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
13e00 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 77 65  eturn TRUE if we
13e10 20 61 72 65 20 61 74 20 74 68 65 20 65 6e 64 2d   are at the end-
13e20 6f 66 2d 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69  of-file.*/.stati
13e30 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 45  c int spellfix1E
13e40 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  of(sqlite3_vtab_
13e50 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
13e60 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
13e70 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66   *pCur = (spellf
13e80 69 78 31 5f 63 75 72 73 6f 72 20 2a 29 63 75 72  ix1_cursor *)cur
13e90 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
13ea0 3e 69 52 6f 77 3e 3d 70 43 75 72 2d 3e 6e 52 6f  >iRow>=pCur->nRo
13eb0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  w;.}../*.** Retu
13ec0 72 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  rn columns from 
13ed0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
13ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13ef0 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 28 0a  pellfix1Column(.
13f00 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
13f10 75 72 73 6f 72 20 2a 63 75 72 2c 0a 20 20 73 71  ursor *cur,.  sq
13f20 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
13f30 74 78 2c 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20  tx,.  int i.){. 
13f40 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
13f50 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c  r *pCur = (spell
13f60 66 69 78 31 5f 63 75 72 73 6f 72 2a 29 63 75 72  fix1_cursor*)cur
13f70 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46  ;.  if( pCur->pF
13f80 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 69  ullScan ){.    i
13f90 66 28 20 69 3c 3d 53 50 45 4c 4c 46 49 58 5f 43  f( i<=SPELLFIX_C
13fa0 4f 4c 5f 4c 41 4e 47 49 44 20 29 7b 0a 20 20 20  OL_LANGID ){.   
13fb0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
13fc0 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c  t_value(ctx, sql
13fd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75  ite3_column_valu
13fe0 65 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  e(pCur->pFullSca
13ff0 6e 2c 20 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73  n, i));.    }els
14000 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
14010 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 74 78  _result_null(ctx
14020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
14030 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14040 20 7d 0a 20 20 73 77 69 74 63 68 28 20 69 20 29   }.  switch( i )
14050 7b 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c  {.    case SPELL
14060 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 3a 20 7b 0a  FIX_COL_WORD: {.
14070 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
14080 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70  sult_text(ctx, p
14090 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f  Cur->a[pCur->iRo
140a0 77 5d 2e 7a 57 6f 72 64 2c 20 2d 31 2c 20 53 51  w].zWord, -1, SQ
140b0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
140c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
140d0 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
140e0 49 58 5f 43 4f 4c 5f 52 41 4e 4b 3a 20 7b 0a 20  IX_COL_RANK: {. 
140f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
14100 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75  ult_int(ctx, pCu
14110 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d  r->a[pCur->iRow]
14120 2e 69 52 61 6e 6b 29 3b 0a 20 20 20 20 20 20 62  .iRank);.      b
14130 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14140 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  case SPELLFIX_CO
14150 4c 5f 44 49 53 54 41 4e 43 45 3a 20 7b 0a 20 20  L_DISTANCE: {.  
14160 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
14170 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72  lt_int(ctx, pCur
14180 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e  ->a[pCur->iRow].
14190 69 44 69 73 74 61 6e 63 65 29 3b 0a 20 20 20 20  iDistance);.    
141a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
141b0 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58     case SPELLFIX
141c0 5f 43 4f 4c 5f 4c 41 4e 47 49 44 3a 20 7b 0a 20  _COL_LANGID: {. 
141d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
141e0 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75  ult_int(ctx, pCu
141f0 72 2d 3e 69 4c 61 6e 67 29 3b 0a 20 20 20 20 20  r->iLang);.     
14200 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14210 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f    case SPELLFIX_
14220 43 4f 4c 5f 53 43 4f 52 45 3a 20 7b 0a 20 20 20  COL_SCORE: {.   
14230 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
14240 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d  t_int(ctx, pCur-
14250 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69  >a[pCur->iRow].i
14260 53 63 6f 72 65 29 3b 0a 20 20 20 20 20 20 62 72  Score);.      br
14270 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14280 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ase SPELLFIX_COL
14290 5f 4d 41 54 43 48 4c 45 4e 3a 20 7b 0a 20 20 20  _MATCHLEN: {.   
142a0 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c 65 6e     int iMatchlen
142b0 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d   = pCur->a[pCur-
142c0 3e 69 52 6f 77 5d 2e 69 4d 61 74 63 68 6c 65 6e  >iRow].iMatchlen
142d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4d 61 74  ;.      if( iMat
142e0 63 68 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  chlen<0 ){.     
142f0 20 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 20     int nPattern 
14300 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 43  = (int)strlen(pC
14310 75 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20  ur->zPattern);. 
14320 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 6f         char *zWo
14330 72 64 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75  rd = pCur->a[pCu
14340 72 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64 3b 0a  r->iRow].zWord;.
14350 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57 6f 72          int nWor
14360 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  d = (int)strlen(
14370 7a 57 6f 72 64 29 3b 0a 0a 20 20 20 20 20 20 20  zWord);..       
14380 20 69 66 28 20 6e 50 61 74 74 65 72 6e 3e 30 20   if( nPattern>0 
14390 26 26 20 70 43 75 72 2d 3e 7a 50 61 74 74 65 72  && pCur->zPatter
143a0 6e 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3d 3d 27  n[nPattern-1]=='
143b0 2a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  *' ){.          
143c0 63 68 61 72 20 2a 7a 54 72 61 6e 73 6c 69 74 3b  char *zTranslit;
143d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
143e0 65 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  es;.          zT
143f0 72 61 6e 73 6c 69 74 20 3d 20 28 63 68 61 72 20  ranslit = (char 
14400 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28  *)transliterate(
14410 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
14420 29 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a  )zWord, nWord);.
14430 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a            if( !z
14440 54 72 61 6e 73 6c 69 74 20 29 20 72 65 74 75 72  Translit ) retur
14450 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
14460 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
14470 65 64 69 74 64 69 73 74 31 28 70 43 75 72 2d 3e  editdist1(pCur->
14480 7a 50 61 74 74 65 72 6e 2c 20 7a 54 72 61 6e 73  zPattern, zTrans
14490 6c 69 74 2c 20 26 69 4d 61 74 63 68 6c 65 6e 29  lit, &iMatchlen)
144a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
144b0 74 65 33 5f 66 72 65 65 28 7a 54 72 61 6e 73 6c  te3_free(zTransl
144c0 69 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  it);.          i
144d0 66 28 20 72 65 73 3c 30 20 29 20 72 65 74 75 72  f( res<0 ) retur
144e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
144f0 20 20 20 20 20 20 20 20 20 20 69 4d 61 74 63 68            iMatch
14500 6c 65 6e 20 3d 20 74 72 61 6e 73 6c 65 6e 5f 74  len = translen_t
14510 6f 5f 63 68 61 72 6c 65 6e 28 7a 57 6f 72 64 2c  o_charlen(zWord,
14520 20 6e 57 6f 72 64 2c 20 69 4d 61 74 63 68 6c 65   nWord, iMatchle
14530 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  n);.        }els
14540 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4d 61  e{.          iMa
14550 74 63 68 6c 65 6e 20 3d 20 75 74 66 38 43 68 61  tchlen = utf8Cha
14560 72 6c 65 6e 28 7a 57 6f 72 64 2c 20 6e 57 6f 72  rlen(zWord, nWor
14570 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
14580 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c      }..      sql
14590 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
145a0 63 74 78 2c 20 69 4d 61 74 63 68 6c 65 6e 29 3b  ctx, iMatchlen);
145b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
145c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45    }.    case SPE
145d0 4c 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e 45 48  LLFIX_COL_PHONEH
145e0 41 53 48 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ASH: {.      sql
145f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
14600 28 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43  (ctx, pCur->a[pC
14610 75 72 2d 3e 69 52 6f 77 5d 2e 7a 48 61 73 68 2c  ur->iRow].zHash,
14620 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
14630 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
14640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14650 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54 4f   SPELLFIX_COL_TO
14660 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  P: {.      sqlit
14670 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
14680 78 2c 20 70 43 75 72 2d 3e 69 54 6f 70 29 3b 0a  x, pCur->iTop);.
14690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
146a0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c   }.    case SPEL
146b0 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 3a 20  LFIX_COL_SCOPE: 
146c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
146d0 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20  result_int(ctx, 
146e0 70 43 75 72 2d 3e 69 53 63 6f 70 65 29 3b 0a 20  pCur->iScope);. 
146f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14700 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c  }.    case SPELL
14710 46 49 58 5f 43 4f 4c 5f 53 52 43 48 43 4e 54 3a  FIX_COL_SRCHCNT:
14720 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
14730 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c  _result_int(ctx,
14740 20 70 43 75 72 2d 3e 6e 53 65 61 72 63 68 29 3b   pCur->nSearch);
14750 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14760 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
14770 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
14780 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 74 78  _result_null(ctx
14790 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
147a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
147b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
147c0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64  ./*.** The rowid
147d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
147e0 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64 28 73  spellfix1Rowid(s
147f0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
14800 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f  or *cur, sqlite_
14810 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a  int64 *pRowid){.
14820 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73    spellfix1_curs
14830 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c  or *pCur = (spel
14840 6c 66 69 78 31 5f 63 75 72 73 6f 72 2a 29 63 75  lfix1_cursor*)cu
14850 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
14860 46 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20  FullScan ){.    
14870 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  *pRowid = sqlite
14880 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
14890 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20  Cur->pFullScan, 
148a0 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  4);.  }else{.   
148b0 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72 2d   *pRowid = pCur-
148c0 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69  >a[pCur->iRow].i
148d0 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 72 65 74  Rowid;.  }.  ret
148e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
148f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64  ../*.** The xUpd
14900 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2f  ate() method..*/
14910 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
14920 6c 66 69 78 31 55 70 64 61 74 65 28 0a 20 20 73  lfix1Update(.  s
14930 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
14940 61 62 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  ab,.  int argc,.
14950 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
14960 2a 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65  **argv,.  sqlite
14970 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 0a 29  _int64 *pRowid.)
14980 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14990 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
149a0 33 5f 69 6e 74 36 34 20 72 6f 77 69 64 2c 20 6e  3_int64 rowid, n
149b0 65 77 52 6f 77 69 64 3b 0a 20 20 73 70 65 6c 6c  ewRowid;.  spell
149c0 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28  fix1_vtab *p = (
149d0 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29  spellfix1_vtab*)
149e0 70 56 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  pVTab;.  sqlite3
149f0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
14a00 20 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a   if( argc==1 ){.
14a10 20 20 20 20 2f 2a 20 41 20 64 65 6c 65 74 65 20      /* A delete 
14a20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
14a30 20 72 6f 77 69 64 20 67 69 76 65 6e 20 62 79 20   rowid given by 
14a40 61 72 67 76 5b 30 5d 20 2a 2f 0a 20 20 20 20 72  argv[0] */.    r
14a50 6f 77 69 64 20 3d 20 2a 70 52 6f 77 69 64 20 3d  owid = *pRowid =
14a60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
14a70 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
14a80 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78     spellfix1DbEx
14a90 65 63 28 26 72 63 2c 20 64 62 2c 20 22 44 45 4c  ec(&rc, db, "DEL
14aa0 45 54 45 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e  ETE FROM \"%w\".
14ab0 5c 22 25 77 5f 76 6f 63 61 62 5c 22 20 22 0a 20  \"%w_vocab\" ". 
14ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ad0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
14ae0 45 20 69 64 3d 25 6c 6c 64 22 2c 0a 20 20 20 20  E id=%lld",.    
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
14b00 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61  >zDbName, p->zTa
14b10 62 6c 65 4e 61 6d 65 2c 20 72 6f 77 69 64 29 3b  bleName, rowid);
14b20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
14b30 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14b40 72 20 2a 7a 57 6f 72 64 20 3d 20 73 71 6c 69 74  r *zWord = sqlit
14b50 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
14b60 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  gv[SPELLFIX_COL_
14b70 57 4f 52 44 2b 32 5d 29 3b 0a 20 20 20 20 69 6e  WORD+2]);.    in
14b80 74 20 6e 57 6f 72 64 20 3d 20 73 71 6c 69 74 65  t nWord = sqlite
14b90 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
14ba0 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  gv[SPELLFIX_COL_
14bb0 57 4f 52 44 2b 32 5d 29 3b 0a 20 20 20 20 69 6e  WORD+2]);.    in
14bc0 74 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74 65  t iLang = sqlite
14bd0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
14be0 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41  [SPELLFIX_COL_LA
14bf0 4e 47 49 44 2b 32 5d 29 3b 0a 20 20 20 20 69 6e  NGID+2]);.    in
14c00 74 20 69 52 61 6e 6b 20 3d 20 73 71 6c 69 74 65  t iRank = sqlite
14c10 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
14c20 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41  [SPELLFIX_COL_RA
14c30 4e 4b 2b 32 5d 29 3b 0a 20 20 20 20 63 6f 6e 73  NK+2]);.    cons
14c40 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14c50 2a 7a 53 6f 75 6e 64 73 6c 69 6b 65 20 3d 0a 20  *zSoundslike =. 
14c60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14c70 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
14c80 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53  v[SPELLFIX_COL_S
14c90 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d 29 3b 0a 20  OUNDSLIKE+2]);. 
14ca0 20 20 20 69 6e 74 20 6e 53 6f 75 6e 64 73 6c 69     int nSoundsli
14cb0 6b 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ke = sqlite3_val
14cc0 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 53 50  ue_bytes(argv[SP
14cd0 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44  ELLFIX_COL_SOUND
14ce0 53 4c 49 4b 45 2b 32 5d 29 3b 0a 20 20 20 20 63  SLIKE+2]);.    c
14cf0 68 61 72 20 2a 7a 4b 31 2c 20 2a 7a 4b 32 3b 0a  har *zK1, *zK2;.
14d00 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63      int i;.    c
14d10 68 61 72 20 63 3b 0a 0a 20 20 20 20 69 66 28 20  har c;..    if( 
14d20 7a 57 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20  zWord==0 ){.    
14d30 20 20 2f 2a 20 49 6e 73 65 72 74 73 20 6f 66 20    /* Inserts of 
14d40 74 68 65 20 66 6f 72 6d 3a 20 20 49 4e 53 45 52  the form:  INSER
14d50 54 20 49 4e 54 4f 20 74 61 62 6c 65 28 63 6f 6d  T INTO table(com
14d60 6d 61 6e 64 29 20 56 41 4c 55 45 53 28 27 78 79  mand) VALUES('xy
14d70 7a 7a 79 27 29 3b 0a 20 20 20 20 20 20 2a 2a 20  zzy');.      ** 
14d80 63 61 75 73 65 20 7a 57 6f 72 64 20 74 6f 20 62  cause zWord to b
14d90 65 20 4e 55 4c 4c 2c 20 73 6f 20 77 65 20 6c 6f  e NULL, so we lo
14da0 6f 6b 20 61 74 20 74 68 65 20 22 63 6f 6d 6d 61  ok at the "comma
14db0 6e 64 22 20 63 6f 6c 75 6d 6e 20 74 6f 20 73 65  nd" column to se
14dc0 65 0a 20 20 20 20 20 20 2a 2a 20 77 68 61 74 20  e.      ** what 
14dd0 73 70 65 63 69 61 6c 20 61 63 74 69 6f 6e 73 20  special actions 
14de0 74 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 20 20 20  to take */.     
14df0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
14e00 64 20 3d 20 0a 20 20 20 20 20 20 20 20 20 28 63  d = .         (c
14e10 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
14e20 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
14e30 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  gv[SPELLFIX_COL_
14e40 43 4f 4d 4d 41 4e 44 2b 32 5d 29 3b 0a 20 20 20  COMMAND+2]);.   
14e50 20 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29     if( zCmd==0 )
14e60 7b 0a 20 20 20 20 20 20 20 20 70 56 54 61 62 2d  {.        pVTab-
14e70 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
14e80 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2e 77  e3_mprintf("%s.w
14e90 6f 72 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 4e  ord may not be N
14ea0 55 4c 4c 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ULL",.          
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14ed0 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  ->zTableName);. 
14ee0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
14ef0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
14f00 4e 4f 54 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  NOTNULL;.      }
14f10 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
14f20 70 28 7a 43 6d 64 2c 22 72 65 73 65 74 22 29 3d  p(zCmd,"reset")=
14f30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
14f40 20 52 65 73 65 74 20 74 68 65 20 20 65 64 69 74   Reset the  edit
14f50 20 63 6f 73 74 20 74 61 62 6c 65 20 28 69 66 20   cost table (if 
14f60 74 68 65 72 65 20 69 73 20 6f 6e 65 29 2e 20 2a  there is one). *
14f70 2f 0a 20 20 20 20 20 20 20 20 65 64 69 74 44 69  /.        editDi
14f80 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74 65 28  st3ConfigDelete(
14f90 70 2d 3e 70 43 6f 6e 66 69 67 33 29 3b 0a 20 20  p->pConfig3);.  
14fa0 20 20 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67        p->pConfig
14fb0 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  3 = 0;.        r
14fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14fe0 66 28 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c  f( strncmp(zCmd,
14ff0 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62 6c 65  "edit_cost_table
15000 3d 22 2c 31 36 29 3d 3d 30 20 29 7b 0a 20 20 20  =",16)==0 ){.   
15010 20 20 20 20 20 65 64 69 74 44 69 73 74 33 43 6f       editDist3Co
15020 6e 66 69 67 44 65 6c 65 74 65 28 70 2d 3e 70 43  nfigDelete(p->pC
15030 6f 6e 66 69 67 33 29 3b 0a 20 20 20 20 20 20 20  onfig3);.       
15040 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d 20 30   p->pConfig3 = 0
15050 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15060 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54  3_free(p->zCostT
15070 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 70  able);.        p
15080 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d 20 73  ->zCostTable = s
15090 70 65 6c 6c 66 69 78 31 44 65 71 75 6f 74 65 28  pellfix1Dequote(
150a0 7a 43 6d 64 2b 31 36 29 3b 0a 20 20 20 20 20 20  zCmd+16);.      
150b0 20 20 69 66 28 20 70 2d 3e 7a 43 6f 73 74 54 61    if( p->zCostTa
150c0 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ble==0 ) return 
150d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
150e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f        if( p->zCo
150f0 73 74 54 61 62 6c 65 5b 30 5d 3d 3d 30 20 7c 7c  stTable[0]==0 ||
15100 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
15110 28 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 2c 22  (p->zCostTable,"
15120 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  null")==0 ){.   
15130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
15140 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54 61 62 6c  ree(p->zCostTabl
15150 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  e);.          p-
15160 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d 20 30 3b  >zCostTable = 0;
15170 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15190 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
151a0 20 20 20 70 56 54 61 62 2d 3e 7a 45 72 72 4d 73     pVTab->zErrMs
151b0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
151c0 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 76 61 6c  ntf("unknown val
151d0 75 65 20 66 6f 72 20 25 73 2e 63 6f 6d 6d 61 6e  ue for %s.comman
151e0 64 3a 20 5c 22 25 77 5c 22 22 2c 0a 20 20 20 20  d: \"%w\"",.    
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15210 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65     p->zTableName
15220 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 72  , zCmd);.      r
15230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
15240 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
15250 28 20 69 52 61 6e 6b 3c 31 20 29 20 69 52 61 6e  ( iRank<1 ) iRan
15260 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a  k = 1;.    if( z
15270 53 6f 75 6e 64 73 6c 69 6b 65 20 29 7b 0a 20 20  Soundslike ){.  
15280 20 20 20 20 7a 4b 31 20 3d 20 28 63 68 61 72 2a      zK1 = (char*
15290 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a  )transliterate(z
152a0 53 6f 75 6e 64 73 6c 69 6b 65 2c 20 6e 53 6f 75  Soundslike, nSou
152b0 6e 64 73 6c 69 6b 65 29 3b 0a 20 20 20 20 7d 65  ndslike);.    }e
152c0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 31 20 3d  lse{.      zK1 =
152d0 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c 69 74   (char*)translit
152e0 65 72 61 74 65 28 7a 57 6f 72 64 2c 20 6e 57 6f  erate(zWord, nWo
152f0 72 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rd);.    }.    i
15300 66 28 20 7a 4b 31 3d 3d 30 20 29 20 72 65 74 75  f( zK1==0 ) retu
15310 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
15320 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63  .    for(i=0; (c
15330 20 3d 20 7a 4b 31 5b 69 5d 29 21 3d 30 3b 20 69   = zK1[i])!=0; i
15340 2b 2b 29 7b 0a 20 20 20 20 20 20 20 69 66 28 20  ++){.       if( 
15350 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 5a 27  c>='A' && c<='Z'
15360 20 29 20 7a 4b 31 5b 69 5d 20 2b 3d 20 27 61 27   ) zK1[i] += 'a'
15370 20 2d 20 27 41 27 3b 0a 20 20 20 20 7d 0a 20 20   - 'A';.    }.  
15380 20 20 7a 4b 32 20 3d 20 28 63 68 61 72 2a 29 70    zK2 = (char*)p
15390 68 6f 6e 65 74 69 63 48 61 73 68 28 28 63 6f 6e  honeticHash((con
153a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
153b0 2a 29 7a 4b 31 2c 20 69 29 3b 0a 20 20 20 20 69  *)zK1, i);.    i
153c0 66 28 20 7a 4b 32 3d 3d 30 20 29 7b 0a 20 20 20  f( zK2==0 ){.   
153d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
153e0 7a 4b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  zK1);.      retu
153f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
15400 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
15410 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
15420 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49  e(argv[0])==SQLI
15430 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  TE_NULL ){.     
15440 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63   spellfix1DbExec
15450 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20  (&rc, db,.      
15460 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
15470 4e 54 4f 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f  NTO \"%w\".\"%w_
15480 76 6f 63 61 62 5c 22 28 72 61 6e 6b 2c 6c 61 6e  vocab\"(rank,lan
15490 67 69 64 2c 77 6f 72 64 2c 6b 31 2c 6b 32 29 20  gid,word,k1,k2) 
154a0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
154b0 56 41 4c 55 45 53 28 25 64 2c 25 64 2c 25 51 2c  VALUES(%d,%d,%Q,
154c0 25 51 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20  %Q,%Q)",.       
154d0 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65        p->zDbName
154e0 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c  , p->zTableName,
154f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69 52  .             iR
15500 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20 7a 57 6f 72  ank, iLang, zWor
15510 64 2c 20 7a 4b 31 2c 20 7a 4b 32 0a 20 20 20 20  d, zK1, zK2.    
15520 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 6f 77    );.      *pRow
15530 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73  id = sqlite3_las
15540 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64  t_insert_rowid(d
15550 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  b);.    }else{. 
15560 20 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c       rowid = sql
15570 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
15580 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20  (argv[0]);.     
15590 20 6e 65 77 52 6f 77 69 64 20 3d 20 2a 70 52 6f   newRowid = *pRo
155a0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  wid = sqlite3_va
155b0 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31  lue_int64(argv[1
155c0 5d 29 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c 66  ]);.      spellf
155d0 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64  ix1DbExec(&rc, d
155e0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
155f0 22 55 50 44 41 54 45 20 5c 22 25 77 5c 22 2e 5c  "UPDATE \"%w\".\
15600 22 25 77 5f 76 6f 63 61 62 5c 22 20 53 45 54 20  "%w_vocab\" SET 
15610 69 64 3d 25 6c 6c 64 2c 20 72 61 6e 6b 3d 25 64  id=%lld, rank=%d
15620 2c 20 6c 61 6e 67 69 64 3d 25 64 2c 22 0a 20 20  , langid=%d,".  
15630 20 20 20 20 20 20 20 20 20 20 20 22 20 77 6f 72             " wor
15640 64 3d 25 51 2c 20 6b 31 3d 25 51 2c 20 6b 32 3d  d=%Q, k1=%Q, k2=
15650 25 51 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64  %Q WHERE id=%lld
15660 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15670 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a  p->zDbName, p->z
15680 54 61 62 6c 65 4e 61 6d 65 2c 20 6e 65 77 52 6f  TableName, newRo
15690 77 69 64 2c 20 69 52 61 6e 6b 2c 20 69 4c 61 6e  wid, iRank, iLan
156a0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
156b0 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 4b 32 2c  zWord, zK1, zK2,
156c0 20 72 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a   rowid.      );.
156d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
156e0 33 5f 66 72 65 65 28 7a 4b 31 29 3b 0a 20 20 20  3_free(zK1);.   
156f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b   sqlite3_free(zK
15700 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  2);.  }.  return
15710 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
15720 6e 61 6d 65 20 74 68 65 20 73 70 65 6c 6c 66 69  name the spellfi
15730 78 31 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  x1 table..*/.sta
15740 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
15750 31 52 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  1Rename(sqlite3_
15760 76 74 61 62 20 2a 70 56 54 61 62 2c 20 63 6f 6e  vtab *pVTab, con
15770 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 29 7b 0a  st char *zNew){.
15780 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62    spellfix1_vtab
15790 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31   *p = (spellfix1
157a0 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20  _vtab*)pVTab;.  
157b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
157c0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
157d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
157e0 72 20 2a 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71  r *zNewName = sq
157f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
15800 73 22 2c 20 7a 4e 65 77 29 3b 0a 20 20 69 66 28  s", zNew);.  if(
15810 20 7a 4e 65 77 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zNewName==0 ){.
15820 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15830 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
15840 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26  pellfix1DbExec(&
15850 72 63 2c 20 64 62 2c 20 0a 20 20 20 20 20 22 41  rc, db, .     "A
15860 4c 54 45 52 20 54 41 42 4c 45 20 5c 22 25 77 5c  LTER TABLE \"%w\
15870 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 20 52  ".\"%w_vocab\" R
15880 45 4e 41 4d 45 20 54 4f 20 5c 22 25 77 5f 76 6f  ENAME TO \"%w_vo
15890 63 61 62 5c 22 22 2c 0a 20 20 20 20 20 70 2d 3e  cab\"",.     p->
158a0 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62  zDbName, p->zTab
158b0 6c 65 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65  leName, zNewName
158c0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
158d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
158e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
158f0 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20  >zTableName);.  
15900 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 20    p->zTableName 
15910 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 7d 65  = zNewName;.  }e
15920 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15930 5f 66 72 65 65 28 7a 4e 65 77 4e 61 6d 65 29 3b  _free(zNewName);
15940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15950 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 69  ;.}.../*.** A vi
15960 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75  rtual table modu
15970 6c 65 20 74 68 61 74 20 70 72 6f 76 69 64 65 73  le that provides
15980 20 66 75 7a 7a 79 20 73 65 61 72 63 68 2e 0a 2a   fuzzy search..*
15990 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
159a0 5f 6d 6f 64 75 6c 65 20 73 70 65 6c 6c 66 69 78  _module spellfix
159b0 31 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c  1Module = {.  0,
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
159e0 6f 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  on */.  spellfix
159f0 31 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20  1Create,        
15a00 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20 68 61   /* xCreate - ha
15a10 6e 64 6c 65 20 43 52 45 41 54 45 20 56 49 52 54  ndle CREATE VIRT
15a20 55 41 4c 20 54 41 42 4c 45 20 2a 2f 0a 20 20 73  UAL TABLE */.  s
15a30 70 65 6c 6c 66 69 78 31 43 6f 6e 6e 65 63 74 2c  pellfix1Connect,
15a40 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
15a50 65 63 74 20 2d 20 72 65 63 6f 6e 6e 65 63 74 65  ect - reconnecte
15a60 64 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67  d to an existing
15a70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 70 65 6c   table */.  spel
15a80 6c 66 69 78 31 42 65 73 74 49 6e 64 65 78 2c 20  lfix1BestIndex, 
15a90 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64       /* xBestInd
15aa0 65 78 20 2d 20 66 69 67 75 72 65 20 6f 75 74 20  ex - figure out 
15ab0 68 6f 77 20 74 6f 20 64 6f 20 61 20 71 75 65 72  how to do a quer
15ac0 79 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  y */.  spellfix1
15ad0 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20  Disconnect,     
15ae0 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2d  /* xDisconnect -
15af0 20 63 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   close a connect
15b00 69 6f 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  ion */.  spellfi
15b10 78 31 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20  x1Destroy,      
15b20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2d 20    /* xDestroy - 
15b30 68 61 6e 64 6c 65 20 44 52 4f 50 20 54 41 42 4c  handle DROP TABL
15b40 45 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  E */.  spellfix1
15b50 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
15b60 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20  /* xOpen - open 
15b70 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 70  a cursor */.  sp
15b80 65 6c 6c 66 69 78 31 43 6c 6f 73 65 2c 20 20 20  ellfix1Close,   
15b90 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
15ba0 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f   - close a curso
15bb0 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  r */.  spellfix1
15bc0 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
15bd0 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e  /* xFilter - con
15be0 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73  figure scan cons
15bf0 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 73 70 65  traints */.  spe
15c00 6c 6c 66 69 78 31 4e 65 78 74 2c 20 20 20 20 20  llfix1Next,     
15c10 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d        /* xNext -
15c20 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   advance a curso
15c30 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  r */.  spellfix1
15c40 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Eof,            
15c50 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20  /* xEof - check 
15c60 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20  for end of scan 
15c70 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 6f  */.  spellfix1Co
15c80 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a  lumn,         /*
15c90 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20   xColumn - read 
15ca0 64 61 74 61 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  data */.  spellf
15cb0 69 78 31 52 6f 77 69 64 2c 20 20 20 20 20 20 20  ix1Rowid,       
15cc0 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72     /* xRowid - r
15cd0 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 73 70  ead data */.  sp
15ce0 65 6c 6c 66 69 78 31 55 70 64 61 74 65 2c 20 20  ellfix1Update,  
15cf0 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74         /* xUpdat
15d00 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30  /* xBegin */.  0
15d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15d40 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
15d50 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15d70 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30  * xCommit */.  0
15d80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15d90 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
15da0 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20  back */.  0,    
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f     /* xFindMetho
15dd0 64 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  d */.  spellfix1
15de0 52 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  Rename,         
15df0 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 7d 3b  /* xRename */.};
15e00 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
15e10 20 74 68 65 20 76 61 72 69 6f 75 73 20 66 75 6e   the various fun
15e20 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 76  ctions and the v
15e30 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
15e40 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
15e50 6c 66 69 78 31 52 65 67 69 73 74 65 72 28 73 71  lfix1Register(sq
15e60 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
15e70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15e80 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 72 63 20  ;.  int i;.  rc 
15e90 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
15ea0 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73  _function(db, "s
15eb0 70 65 6c 6c 66 69 78 31 5f 74 72 61 6e 73 6c 69  pellfix1_transli
15ec0 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  t", 1, SQLITE_UT
15ed0 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 6c 69           transli
15f00 74 65 72 61 74 65 53 71 6c 46 75 6e 63 2c 20 30  terateSqlFunc, 0
15f10 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
15f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15f30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
15f40 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
15f50 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 65 64 69  , "spellfix1_edi
15f60 74 64 69 73 74 22 2c 20 32 2c 20 53 51 4c 49 54  tdist", 2, SQLIT
15f70 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
15fa0 74 64 69 73 74 53 71 6c 46 75 6e 63 2c 20 30 2c  tdistSqlFunc, 0,
15fb0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
15fc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15fe0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
15ff0 28 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f  (db, "spellfix1_
16000 70 68 6f 6e 65 68 61 73 68 22 2c 20 31 2c 20 53  phonehash", 1, S
16010 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 70 68 6f 6e 65 74 69 63 48 61 73 68 53 71 6c   phoneticHashSql
16050 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
16060 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16070 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
16080 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
16090 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 70  function(db, "sp
160a0 65 6c 6c 66 69 78 31 5f 73 63 72 69 70 74 63 6f  ellfix1_scriptco
160b0 64 65 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  de", 1, SQLITE_U
160c0 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160e0 20 20 20 20 20 20 20 20 20 20 73 63 72 69 70 74            script
160f0 43 6f 64 65 53 71 6c 46 75 6e 63 2c 20 30 2c 20  CodeSqlFunc, 0, 
16100 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
16110 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16120 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
16130 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62  create_module(db
16140 2c 20 22 73 70 65 6c 6c 66 69 78 31 22 2c 20 26  , "spellfix1", &
16150 73 70 65 6c 6c 66 69 78 31 4d 6f 64 75 6c 65 2c  spellfix1Module,
16160 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
16170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16180 20 20 20 20 72 63 20 3d 20 65 64 69 74 44 69 73      rc = editDis
16190 74 33 49 6e 73 74 61 6c 6c 28 64 62 29 3b 0a 20  t3Install(db);. 
161a0 20 7d 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20   }..  /* Verify 
161b0 73 61 6e 69 74 79 20 6f 66 20 74 68 65 20 74 72  sanity of the tr
161c0 61 6e 73 6c 69 74 5b 5d 20 74 61 62 6c 65 20 2a  anslit[] table *
161d0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  /.  for(i=0; i<s
161e0 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f  izeof(translit)/
161f0 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b  sizeof(translit[
16200 30 5d 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  0])-1; i++){.   
16210 20 61 73 73 65 72 74 28 20 74 72 61 6e 73 6c 69   assert( transli
16220 74 5b 69 5d 2e 63 46 72 6f 6d 3c 74 72 61 6e 73  t[i].cFrom<trans
16230 6c 69 74 5b 69 2b 31 5d 2e 63 46 72 6f 6d 20 29  lit[i+1].cFrom )
16240 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
16250 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
16260 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
16270 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
16280 0a 2a 2a 20 45 78 74 65 6e 73 69 6f 6e 20 6c 6f  .** Extension lo
16290 61 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ad function..*/.
162a0 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f  #ifdef _WIN32.__
162b0 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f  declspec(dllexpo
162c0 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73  rt).#endif.int s
162d0 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f  qlite3_spellfix_
162e0 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33 20  init(.  sqlite3 
162f0 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70  *db, .  char **p
16300 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73  zErrMsg, .  cons
16310 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
16320 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a  utines *pApi.){.
16330 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 49    SQLITE_EXTENSI
16340 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b 0a  ON_INIT2(pApi);.
16350 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16360 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
16370 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c 66  .  return spellf
16380 69 78 31 52 65 67 69 73 74 65 72 28 64 62 29 3b  ix1Register(db);
16390 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
163a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a         SQLITE_OK;.}.