/ Hex Artifact Content
Login

Artifact adfc569fafef7a1eb8f21528e5277686b358c3ce:


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 20 20 20 28 47 29 20 20 20  ance.**   (G)   
106d0 20 72 6f 77 69 64 20 3d 20 24 72 6f 77 69 64 0a   rowid = $rowid.
106e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6c 61 6e 20 6e  **.** The plan n
106f0 75 6d 62 65 72 20 69 73 20 61 20 62 69 74 20 6d  umber is a bit m
10700 61 73 6b 20 66 6f 72 6d 65 64 20 77 69 74 68 20  ask formed with 
10710 74 68 65 73 65 20 62 69 74 73 3a 0a 2a 2a 0a 2a  these bits:.**.*
10720 2a 20 20 20 30 78 30 31 20 20 20 28 41 29 20 69  *   0x01   (A) i
10730 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 30  s found.**   0x0
10740 32 20 20 20 28 42 29 20 69 73 20 66 6f 75 6e 64  2   (B) is found
10750 0a 2a 2a 20 20 20 30 78 30 34 20 20 20 28 43 29  .**   0x04   (C)
10760 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30   is found.**   0
10770 78 30 38 20 20 20 28 44 29 20 69 73 20 66 6f 75  x08   (D) is fou
10780 6e 64 0a 2a 2a 20 20 20 30 78 31 30 20 20 20 28  nd.**   0x10   (
10790 45 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20  E) is found.**  
107a0 20 30 78 32 30 20 20 20 28 46 29 20 69 73 20 66   0x20   (F) is f
107b0 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 34 30 20 20  ound.**   0x40  
107c0 20 28 47 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a   (G) is found.**
107d0 0a 2a 2a 20 66 69 6c 74 65 72 2e 61 72 67 76 5b  .** filter.argv[
107e0 2a 5d 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  *] values contai
107f0 6e 73 20 24 73 74 72 2c 20 24 6c 61 6e 67 69 64  ns $str, $langid
10800 2c 20 24 74 6f 70 2c 20 24 73 63 6f 70 65 20 61  , $top, $scope a
10810 6e 64 20 24 72 6f 77 69 64 0a 2a 2a 20 69 66 20  nd $rowid.** if 
10820 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 69 6e  specified and in
10830 20 74 68 61 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a   that order..*/.
10840 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
10850 66 69 78 31 42 65 73 74 49 6e 64 65 78 28 73 71  fix1BestIndex(sq
10860 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c  lite3_vtab *tab,
10870 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
10880 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a  nfo *pIdxInfo){.
10890 20 20 69 6e 74 20 69 50 6c 61 6e 20 3d 20 30 3b    int iPlan = 0;
108a0 0a 20 20 69 6e 74 20 69 4c 61 6e 67 54 65 72 6d  .  int iLangTerm
108b0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 54 6f   = -1;.  int iTo
108c0 70 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e  pTerm = -1;.  in
108d0 74 20 69 53 63 6f 70 65 54 65 72 6d 20 3d 20 2d  t iScopeTerm = -
108e0 31 3b 0a 20 20 69 6e 74 20 69 44 69 73 74 54 65  1;.  int iDistTe
108f0 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  rm = -1;.  int i
10900 52 6f 77 69 64 54 65 72 6d 20 3d 20 2d 31 3b 0a  RowidTerm = -1;.
10910 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
10920 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
10930 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
10940 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20   *pConstraint;. 
10950 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   pConstraint = p
10960 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
10970 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
10980 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
10990 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
109a0 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20  Constraint++){. 
109b0 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69     if( pConstrai
109c0 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20  nt->usable==0 ) 
109d0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
109e0 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66  * Terms of the f
109f0 6f 72 6d 3a 20 20 77 6f 72 64 20 4d 41 54 43 48  orm:  word MATCH
10a00 20 24 73 74 72 20 2a 2f 0a 20 20 20 20 69 66 28   $str */.    if(
10a10 20 28 69 50 6c 61 6e 20 26 20 31 29 3d 3d 30 20   (iPlan & 1)==0 
10a20 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10a30 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53  aint->iColumn==S
10a40 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44  PELLFIX_COL_WORD
10a50 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10a60 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  aint->op==SQLITE
10a70 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10a80 54 5f 4d 41 54 43 48 0a 20 20 20 20 29 7b 0a 20  T_MATCH.    ){. 
10a90 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 31 3b       iPlan |= 1;
10aa0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
10ab0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
10ac0 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  e[i].argvIndex =
10ad0 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e   1;.      pIdxIn
10ae0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
10af0 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20 31  sage[i].omit = 1
10b00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10b10 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  Terms of the for
10b20 6d 3a 20 20 6c 61 6e 67 69 64 20 3d 20 24 6c 61  m:  langid = $la
10b30 6e 67 69 64 20 20 2a 2f 0a 20 20 20 20 69 66 28  ngid  */.    if(
10b40 20 28 69 50 6c 61 6e 20 26 20 32 29 3d 3d 30 0a   (iPlan & 2)==0.
10b50 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
10b60 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50  int->iColumn==SP
10b70 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49  ELLFIX_COL_LANGI
10b80 44 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74  D.     && pConst
10b90 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54  raint->op==SQLIT
10ba0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10bb0 4e 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20  NT_EQ.    ){.   
10bc0 20 20 20 69 50 6c 61 6e 20 7c 3d 20 32 3b 0a 20     iPlan |= 2;. 
10bd0 20 20 20 20 20 69 4c 61 6e 67 54 65 72 6d 20 3d       iLangTerm =
10be0 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   i;.    }..    /
10bf0 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66  * Terms of the f
10c00 6f 72 6d 3a 20 20 74 6f 70 20 3d 20 24 74 6f 70  orm:  top = $top
10c10 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c   */.    if( (iPl
10c20 61 6e 20 26 20 34 29 3d 3d 30 0a 20 20 20 20 20  an & 4)==0.     
10c30 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
10c40 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49  iColumn==SPELLFI
10c50 58 5f 43 4f 4c 5f 54 4f 50 0a 20 20 20 20 20 26  X_COL_TOP.     &
10c60 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  & pConstraint->o
10c70 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
10c80 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20  CONSTRAINT_EQ.  
10c90 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e    ){.      iPlan
10ca0 20 7c 3d 20 34 3b 0a 20 20 20 20 20 20 69 54 6f   |= 4;.      iTo
10cb0 70 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d  pTerm = i;.    }
10cc0 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f  ..    /* Terms o
10cd0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 73 63 6f  f the form:  sco
10ce0 70 65 20 3d 20 24 73 63 6f 70 65 20 2a 2f 0a 20  pe = $scope */. 
10cf0 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
10d00 38 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43  8)==0.     && pC
10d10 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
10d20 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  mn==SPELLFIX_COL
10d30 5f 53 43 4f 50 45 0a 20 20 20 20 20 26 26 20 70  _SCOPE.     && p
10d40 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
10d50 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
10d60 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20 20 29  STRAINT_EQ.    )
10d70 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d  {.      iPlan |=
10d80 20 38 3b 0a 20 20 20 20 20 20 69 53 63 6f 70 65   8;.      iScope
10d90 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  Term = i;.    }.
10da0 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
10db0 20 74 68 65 20 66 6f 72 6d 3a 20 20 64 69 73 74   the form:  dist
10dc0 61 6e 63 65 20 3c 20 24 64 69 73 74 20 6f 72 20  ance < $dist or 
10dd0 64 69 73 74 61 6e 63 65 20 3c 3d 20 24 64 69 73  distance <= $dis
10de0 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50  t */.    if( (iP
10df0 6c 61 6e 20 26 20 28 31 36 7c 33 32 29 29 3d 3d  lan & (16|32))==
10e00 30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74  0.     && pConst
10e10 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  raint->iColumn==
10e20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49 53  SPELLFIX_COL_DIS
10e30 54 41 4e 43 45 0a 20 20 20 20 20 26 26 20 28 70  TANCE.     && (p
10e40 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
10e50 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
10e60 53 54 52 41 49 4e 54 5f 4c 54 0a 20 20 20 20 20  STRAINT_LT.     
10e70 20 20 20 20 20 7c 7c 20 70 43 6f 6e 73 74 72 61       || pConstra
10e80 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  int->op==SQLITE_
10e90 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10ea0 5f 4c 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  _LE).    ){.    
10eb0 20 20 69 50 6c 61 6e 20 7c 3d 20 70 43 6f 6e 73    iPlan |= pCons
10ec0 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49  traint->op==SQLI
10ed0 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
10ee0 49 4e 54 5f 4c 54 20 3f 20 31 36 20 3a 20 33 32  INT_LT ? 16 : 32
10ef0 3b 0a 20 20 20 20 20 20 69 44 69 73 74 54 65 72  ;.      iDistTer
10f00 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20  m = i;.    }..  
10f10 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68    /* Terms of th
10f20 65 20 66 6f 72 6d 3a 20 20 64 69 73 74 61 6e 63  e form:  distanc
10f30 65 20 3c 20 24 64 69 73 74 20 6f 72 20 64 69 73  e < $dist or dis
10f40 74 61 6e 63 65 20 3c 3d 20 24 64 69 73 74 20 2a  tance <= $dist *
10f50 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e  /.    if( (iPlan
10f60 20 26 20 36 34 29 3d 3d 30 0a 20 20 20 20 20 26   & 64)==0.     &
10f70 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  & pConstraint->i
10f80 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 26 26  Column<0.     &&
10f90 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
10fa0 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
10fb0 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20  ONSTRAINT_EQ.   
10fc0 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20   ){.      iPlan 
10fd0 7c 3d 20 36 34 3b 0a 20 20 20 20 20 20 69 52 6f  |= 64;.      iRo
10fe0 77 69 64 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20  widTerm = i;.   
10ff0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 50 6c   }.  }.  if( iPl
11000 61 6e 26 31 20 29 7b 0a 20 20 20 20 69 6e 74 20  an&1 ){.    int 
11010 69 64 78 20 3d 20 32 3b 0a 20 20 20 20 70 49 64  idx = 2;.    pId
11020 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
11030 69 50 6c 61 6e 3b 0a 20 20 20 20 69 66 28 20 70  iPlan;.    if( p
11040 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
11050 79 3d 3d 31 0a 20 20 20 20 20 26 26 20 70 49 64  y==1.     && pId
11060 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b  xInfo->aOrderBy[
11070 30 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c  0].iColumn==SPEL
11080 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 0a 20  LFIX_COL_SCORE. 
11090 20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d      && pIdxInfo-
110a0 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e 64 65 73  >aOrderBy[0].des
110b0 63 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  c==0.    ){.    
110c0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
110d0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 31 3b  rByConsumed = 1;
110e0 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 6f 72 64    /* Default ord
110f0 65 72 20 62 79 20 69 53 63 6f 72 65 20 2a 2f 0a  er by iScore */.
11100 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50      }.    if( iP
11110 6c 61 6e 26 32 20 29 7b 0a 20 20 20 20 20 20 70  lan&2 ){.      p
11120 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
11130 61 69 6e 74 55 73 61 67 65 5b 69 4c 61 6e 67 54  aintUsage[iLangT
11140 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  erm].argvIndex =
11150 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49   idx++;.      pI
11160 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
11170 69 6e 74 55 73 61 67 65 5b 69 4c 61 6e 67 54 65  intUsage[iLangTe
11180 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  rm].omit = 1;.  
11190 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c 61    }.    if( iPla
111a0 6e 26 34 20 29 7b 0a 20 20 20 20 20 20 70 49 64  n&4 ){.      pId
111b0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
111c0 6e 74 55 73 61 67 65 5b 69 54 6f 70 54 65 72 6d  ntUsage[iTopTerm
111d0 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64  ].argvIndex = id
111e0 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49  x++;.      pIdxI
111f0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
11200 55 73 61 67 65 5b 69 54 6f 70 54 65 72 6d 5d 2e  Usage[iTopTerm].
11210 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  omit = 1;.    }.
11220 20 20 20 20 69 66 28 20 69 50 6c 61 6e 26 38 20      if( iPlan&8 
11230 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  ){.      pIdxInf
11240 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11250 61 67 65 5b 69 53 63 6f 70 65 54 65 72 6d 5d 2e  age[iScopeTerm].
11260 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b  argvIndex = idx+
11270 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  +;.      pIdxInf
11280 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11290 61 67 65 5b 69 53 63 6f 70 65 54 65 72 6d 5d 2e  age[iScopeTerm].
112a0 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  omit = 1;.    }.
112b0 20 20 20 20 69 66 28 20 69 50 6c 61 6e 26 28 31      if( iPlan&(1
112c0 36 7c 33 32 29 20 29 7b 0a 20 20 20 20 20 20 70  6|32) ){.      p
112d0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
112e0 61 69 6e 74 55 73 61 67 65 5b 69 44 69 73 74 54  aintUsage[iDistT
112f0 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  erm].argvIndex =
11300 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49   idx++;.      pI
11310 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
11320 69 6e 74 55 73 61 67 65 5b 69 44 69 73 74 54 65  intUsage[iDistTe
11330 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  rm].omit = 1;.  
11340 20 20 7d 0a 20 20 20 20 70 49 64 78 49 6e 66 6f    }.    pIdxInfo
11350 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
11360 3d 20 31 65 35 3b 0a 20 20 7d 65 6c 73 65 20 69  = 1e5;.  }else i
11370 66 28 20 28 69 50 6c 61 6e 20 26 20 36 34 29 20  f( (iPlan & 64) 
11380 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  ){.    pIdxInfo-
11390 3e 69 64 78 4e 75 6d 20 3d 20 36 34 3b 0a 20 20  >idxNum = 64;.  
113a0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
113b0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 52 6f  straintUsage[iRo
113c0 77 69 64 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64  widTerm].argvInd
113d0 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78  ex = 1;.    pIdx
113e0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
113f0 74 55 73 61 67 65 5b 69 52 6f 77 69 64 54 65 72  tUsage[iRowidTer
11400 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20  m].omit = 1;.   
11410 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
11420 61 74 65 64 43 6f 73 74 20 3d 20 35 3b 0a 20 20  atedCost = 5;.  
11430 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 49  }else{.    pIdxI
11440 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
11450 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
11460 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31  stimatedCost = 1
11470 65 35 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  e50;.  }.  retur
11480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11490 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
114a0 20 66 75 7a 7a 79 2d 73 65 61 72 63 68 20 63 75   fuzzy-search cu
114b0 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
114c0 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 4f 70 65  int spellfix1Ope
114d0 6e 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  n(sqlite3_vtab *
114e0 70 56 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76  pVTab, sqlite3_v
114f0 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
11500 75 72 73 6f 72 29 7b 0a 20 20 73 70 65 6c 6c 66  ursor){.  spellf
11510 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28 73  ix1_vtab *p = (s
11520 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29 70  pellfix1_vtab*)p
11530 56 54 61 62 3b 0a 20 20 73 70 65 6c 6c 66 69 78  VTab;.  spellfix
11540 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  1_cursor *pCur;.
11550 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33    pCur = sqlite3
11560 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
11570 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  *pCur) );.  if( 
11580 70 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pCur==0 ) return
11590 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
115a0 20 6d 65 6d 73 65 74 28 70 43 75 72 2c 20 30 2c   memset(pCur, 0,
115b0 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b   sizeof(*pCur));
115c0 0a 20 20 70 43 75 72 2d 3e 70 56 54 61 62 20 3d  .  pCur->pVTab =
115d0 20 70 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20   p;.  *ppCursor 
115e0 3d 20 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a 20  = &pCur->base;. 
115f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11600 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  K;.}../*.** Adju
11610 73 74 20 61 20 64 69 73 74 61 6e 63 65 20 6d 65  st a distance me
11620 61 73 75 72 65 6d 65 6e 74 20 62 79 20 74 68 65  asurement by the
11630 20 77 6f 72 64 73 20 72 61 6e 6b 20 69 6e 20 6f   words rank in o
11640 72 64 65 72 20 74 6f 20 73 68 6f 77 0a 2a 2a 20  rder to show.** 
11650 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f  preference to co
11660 6d 6d 6f 6e 20 77 6f 72 64 73 2e 0a 2a 2f 0a 73  mmon words..*/.s
11670 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
11680 69 78 31 53 63 6f 72 65 28 69 6e 74 20 69 44 69  ix1Score(int iDi
11690 73 74 61 6e 63 65 2c 20 69 6e 74 20 69 52 61 6e  stance, int iRan
116a0 6b 29 7b 0a 20 20 69 6e 74 20 69 4c 6f 67 32 3b  k){.  int iLog2;
116b0 0a 20 20 66 6f 72 28 69 4c 6f 67 32 3d 30 3b 20  .  for(iLog2=0; 
116c0 69 52 61 6e 6b 3e 30 3b 20 69 4c 6f 67 32 2b 2b  iRank>0; iLog2++
116d0 2c 20 69 52 61 6e 6b 3e 3e 3d 31 29 7b 7d 0a 20  , iRank>>=1){}. 
116e0 20 72 65 74 75 72 6e 20 69 44 69 73 74 61 6e 63   return iDistanc
116f0 65 20 2b 20 33 32 20 2d 20 69 4c 6f 67 32 3b 0a  e + 32 - iLog2;.
11700 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
11710 20 74 77 6f 20 73 70 65 6c 6c 66 69 78 31 5f 72   two spellfix1_r
11720 6f 77 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 73  ow objects for s
11730 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  orting purposes 
11740 69 6e 20 71 73 6f 72 74 28 29 20 73 75 63 68 0a  in qsort() such.
11750 2a 2a 20 74 68 61 74 20 74 68 65 79 20 73 6f 72  ** that they sor
11760 74 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 69 6e  t in order of in
11770 63 72 65 61 73 69 6e 67 20 64 69 73 74 61 6e 63  creasing distanc
11780 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11790 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 43 6f 6d   spellfix1RowCom
117a0 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
117b0 2a 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *A, const void *
117c0 42 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  B){.  const stru
117d0 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77  ct spellfix1_row
117e0 20 2a 61 20 3d 20 28 63 6f 6e 73 74 20 73 74 72   *a = (const str
117f0 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f  uct spellfix1_ro
11800 77 2a 29 41 3b 0a 20 20 63 6f 6e 73 74 20 73 74  w*)A;.  const st
11810 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 72  ruct spellfix1_r
11820 6f 77 20 2a 62 20 3d 20 28 63 6f 6e 73 74 20 73  ow *b = (const s
11830 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f  truct spellfix1_
11840 72 6f 77 2a 29 42 3b 0a 20 20 72 65 74 75 72 6e  row*)B;.  return
11850 20 61 2d 3e 69 53 63 6f 72 65 20 2d 20 62 2d 3e   a->iScore - b->
11860 69 53 63 6f 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iScore;.}../*.**
11870 20 41 20 73 74 72 75 63 74 75 72 65 20 75 73 65   A structure use
11880 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f 72 6d  d to pass inform
11890 61 74 69 6f 6e 20 66 72 6f 6d 20 73 70 65 6c 6c  ation from spell
118a0 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d 61 74  fix1FilterForMat
118b0 63 68 28 29 0a 2a 2a 20 69 6e 74 6f 20 73 70 65  ch().** into spe
118c0 6c 6c 66 69 78 31 52 75 6e 51 75 65 72 79 28 29  llfix1RunQuery()
118d0 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
118e0 75 63 74 20 4d 61 74 63 68 51 75 65 72 79 20 7b  uct MatchQuery {
118f0 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  .  spellfix1_cur
11900 73 6f 72 20 2a 70 43 75 72 3b 20 20 20 20 20 20  sor *pCur;      
11910 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
11920 72 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20  r being queried 
11930 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
11940 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  t *pStmt;       
11950 20 20 20 20 20 20 2f 2a 20 73 68 61 64 6f 77 20        /* shadow 
11960 74 61 62 6c 65 20 71 75 65 72 79 20 73 74 61 74  table query stat
11970 6d 65 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ment */.  char z
11980 48 61 73 68 5b 53 50 45 4c 4c 46 49 58 5f 4d 58  Hash[SPELLFIX_MX
11990 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 54 68  _HASH];    /* Th
119a0 65 20 63 75 72 72 65 6e 74 20 70 68 6f 6e 65 68  e current phoneh
119b0 61 73 68 20 66 6f 72 20 7a 50 61 74 74 65 72 6e  ash for zPattern
119c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
119d0 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 20   *zPattern;     
119e0 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c         /* Transl
119f0 69 74 65 72 61 74 65 64 20 69 6e 70 75 74 20 73  iterated input s
11a00 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  tring */.  int n
11a10 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20  Pattern;        
11a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11a30 65 6e 67 74 68 20 6f 66 20 7a 50 61 74 74 65 72  ength of zPatter
11a40 6e 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33  n */.  EditDist3
11a50 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 4d 61 74  FromString *pMat
11a60 63 68 53 74 72 33 3b 20 2f 2a 20 4f 72 69 67 69  chStr3; /* Origi
11a70 6e 61 6c 20 75 6e 69 63 6f 64 65 20 73 74 72 69  nal unicode stri
11a80 6e 67 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74  ng */.  EditDist
11a90 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  3Config *pConfig
11aa0 33 3b 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74  3;       /* Edit
11ab0 2d 64 69 73 74 61 6e 63 65 20 63 6f 73 74 20 63  -distance cost c
11ac0 6f 65 66 66 69 63 69 65 6e 74 73 20 2a 2f 0a 20  oefficients */. 
11ad0 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33   const EditDist3
11ae0 4c 61 6e 67 20 2a 70 4c 61 6e 67 3b 20 20 20 20  Lang *pLang;    
11af0 20 20 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 65    /* The selecte
11b00 64 20 6c 61 6e 67 75 61 67 65 20 63 6f 65 66 66  d language coeff
11b10 69 63 69 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  icients */.  int
11b20 20 69 4c 61 6e 67 3b 20 20 20 20 20 20 20 20 20   iLang;         
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b40 20 54 68 65 20 6c 61 6e 67 75 61 67 65 20 69 64   The language id
11b50 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63 6f 70 65   */.  int iScope
11b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11b70 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
11b80 74 20 73 63 6f 70 65 20 2a 2f 0a 20 20 69 6e 74  t scope */.  int
11b90 20 69 4d 61 78 44 69 73 74 3b 20 20 20 20 20 20   iMaxDist;      
11ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11bb0 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
11bc0 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 2c 20   edit distance, 
11bd0 6f 72 20 2d 31 20 2a 2f 0a 20 20 69 6e 74 20 72  or -1 */.  int r
11be0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11c00 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69  rror code */.  i
11c10 6e 74 20 6e 52 75 6e 3b 20 20 20 20 20 20 20 20  nt nRun;        
11c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11c30 62 65 72 20 6f 66 20 70 72 69 6f 72 20 72 75 6e  ber of prior run
11c40 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 7a  s for the same z
11c50 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63 68 61  Pattern */.  cha
11c60 72 20 61 7a 50 72 69 6f 72 5b 53 50 45 4c 4c 46  r azPrior[SPELLF
11c70 49 58 5f 4d 58 5f 52 55 4e 5d 5b 53 50 45 4c 4c  IX_MX_RUN][SPELL
11c80 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 20 2f  FIX_MX_HASH];  /
11c90 2a 20 50 72 69 6f 72 20 68 61 73 68 65 73 20 2a  * Prior hashes *
11ca0 2f 0a 7d 20 4d 61 74 63 68 51 75 65 72 79 3b 0a  /.} MatchQuery;.
11cb0 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 71 75 65  ./*.** Run a que
11cc0 72 79 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74  ry looking for t
11cd0 68 65 20 62 65 73 74 20 6d 61 74 63 68 65 73 20  he best matches 
11ce0 61 67 61 69 6e 73 74 20 7a 50 61 74 74 65 72 6e  against zPattern
11cf0 20 75 73 69 6e 67 0a 2a 2a 20 7a 48 61 73 68 20   using.** zHash 
11d00 61 73 20 74 68 65 20 63 68 61 72 61 63 74 65 72  as the character
11d10 20 63 6c 61 73 73 20 73 65 65 64 20 68 61 73 68   class seed hash
11d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11d30 20 73 70 65 6c 6c 66 69 78 31 52 75 6e 51 75 65   spellfix1RunQue
11d40 72 79 28 4d 61 74 63 68 51 75 65 72 79 20 2a 70  ry(MatchQuery *p
11d50 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51  , const char *zQ
11d60 75 65 72 79 2c 20 69 6e 74 20 6e 51 75 65 72 79  uery, int nQuery
11d70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
11d80 2a 7a 4b 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68  *zK1;.  const ch
11d90 61 72 20 2a 7a 57 6f 72 64 3b 0a 20 20 69 6e 74  ar *zWord;.  int
11da0 20 69 44 69 73 74 3b 0a 20 20 69 6e 74 20 69 52   iDist;.  int iR
11db0 61 6e 6b 3b 0a 20 20 69 6e 74 20 69 53 63 6f 72  ank;.  int iScor
11dc0 65 3b 0a 20 20 69 6e 74 20 69 57 6f 72 73 74 20  e;.  int iWorst 
11dd0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  = 0;.  int idx;.
11de0 20 20 69 6e 74 20 69 64 78 57 6f 72 73 74 20 3d    int idxWorst =
11df0 20 2d 31 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   -1;.  int i;.  
11e00 69 6e 74 20 69 53 63 6f 70 65 20 3d 20 70 2d 3e  int iScope = p->
11e10 69 53 63 6f 70 65 3b 0a 20 20 73 70 65 6c 6c 66  iScope;.  spellf
11e20 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
11e30 20 3d 20 70 2d 3e 70 43 75 72 3b 0a 20 20 73 71   = p->pCur;.  sq
11e40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
11e50 74 20 3d 20 70 2d 3e 70 53 74 6d 74 3b 0a 20 20  t = p->pStmt;.  
11e60 63 68 61 72 20 7a 48 61 73 68 31 5b 53 50 45 4c  char zHash1[SPEL
11e70 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 0a 20  LFIX_MX_HASH];. 
11e80 20 63 68 61 72 20 7a 48 61 73 68 32 5b 53 50 45   char zHash2[SPE
11e90 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 0a  LLFIX_MX_HASH];.
11ea0 20 20 63 68 61 72 20 2a 7a 43 6c 61 73 73 3b 0a    char *zClass;.
11eb0 20 20 69 6e 74 20 6e 43 6c 61 73 73 3b 0a 20 20    int nClass;.  
11ec0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
11ed0 43 75 72 2d 3e 61 3d 3d 30 20 7c 7c 20 70 2d 3e  Cur->a==0 || p->
11ee0 72 63 20 29 20 72 65 74 75 72 6e 3b 20 20 20 2f  rc ) return;   /
11ef0 2a 20 50 72 69 6f 72 20 6d 65 6d 6f 72 79 20 61  * Prior memory a
11f00 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
11f10 65 20 2a 2f 0a 20 20 7a 43 6c 61 73 73 20 3d 20  e */.  zClass = 
11f20 28 63 68 61 72 2a 29 70 68 6f 6e 65 74 69 63 48  (char*)phoneticH
11f30 61 73 68 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ash((unsigned ch
11f40 61 72 2a 29 7a 51 75 65 72 79 2c 20 6e 51 75 65  ar*)zQuery, nQue
11f50 72 79 29 3b 0a 20 20 69 66 28 20 7a 43 6c 61 73  ry);.  if( zClas
11f60 73 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72  s==0 ){.    p->r
11f70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
11f80 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
11f90 7d 0a 20 20 6e 43 6c 61 73 73 20 3d 20 28 69 6e  }.  nClass = (in
11fa0 74 29 73 74 72 6c 65 6e 28 7a 43 6c 61 73 73 29  t)strlen(zClass)
11fb0 3b 0a 20 20 69 66 28 20 6e 43 6c 61 73 73 3e 53  ;.  if( nClass>S
11fc0 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d  PELLFIX_MX_HASH-
11fd0 32 20 29 7b 0a 20 20 20 20 6e 43 6c 61 73 73 20  2 ){.    nClass 
11fe0 3d 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41  = SPELLFIX_MX_HA
11ff0 53 48 2d 32 3b 0a 20 20 20 20 7a 43 6c 61 73 73  SH-2;.    zClass
12000 5b 6e 43 6c 61 73 73 5d 20 3d 20 30 3b 0a 20 20  [nClass] = 0;.  
12010 7d 0a 20 20 69 66 28 20 6e 43 6c 61 73 73 3c 3d  }.  if( nClass<=
12020 69 53 63 6f 70 65 20 29 7b 0a 20 20 20 20 69 66  iScope ){.    if
12030 28 20 6e 43 6c 61 73 73 3e 32 20 29 7b 0a 20 20  ( nClass>2 ){.  
12040 20 20 20 20 69 53 63 6f 70 65 20 3d 20 6e 43 6c      iScope = nCl
12050 61 73 73 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65  ass-1;.    }else
12060 7b 0a 20 20 20 20 20 20 69 53 63 6f 70 65 20 3d  {.      iScope =
12070 20 6e 43 6c 61 73 73 3b 0a 20 20 20 20 7d 0a 20   nClass;.    }. 
12080 20 7d 0a 20 20 6d 65 6d 63 70 79 28 7a 48 61 73   }.  memcpy(zHas
12090 68 31 2c 20 7a 43 6c 61 73 73 2c 20 69 53 63 6f  h1, zClass, iSco
120a0 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  pe);.  sqlite3_f
120b0 72 65 65 28 7a 43 6c 61 73 73 29 3b 0a 20 20 7a  ree(zClass);.  z
120c0 48 61 73 68 31 5b 69 53 63 6f 70 65 5d 20 3d 20  Hash1[iScope] = 
120d0 30 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 48 61 73  0;.  memcpy(zHas
120e0 68 32 2c 20 7a 48 61 73 68 31 2c 20 69 53 63 6f  h2, zHash1, iSco
120f0 70 65 29 3b 0a 20 20 7a 48 61 73 68 32 5b 69 53  pe);.  zHash2[iS
12100 63 6f 70 65 5d 20 3d 20 27 5a 27 3b 0a 20 20 7a  cope] = 'Z';.  z
12110 48 61 73 68 32 5b 69 53 63 6f 70 65 2b 31 5d 20  Hash2[iScope+1] 
12120 3d 20 30 3b 0a 23 69 66 20 53 50 45 4c 4c 46 49  = 0;.#if SPELLFI
12130 58 5f 4d 58 5f 52 55 4e 3e 31 0a 20 20 66 6f 72  X_MX_RUN>1.  for
12140 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 75 6e 3b  (i=0; i<p->nRun;
12150 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
12160 74 72 63 6d 70 28 70 2d 3e 61 7a 50 72 69 6f 72  trcmp(p->azPrior
12170 5b 69 5d 2c 20 7a 48 61 73 68 31 29 3d 3d 30 20  [i], zHash1)==0 
12180 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65  ) return;.  }.#e
12190 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
121a0 2d 3e 6e 52 75 6e 3c 53 50 45 4c 4c 46 49 58 5f  ->nRun<SPELLFIX_
121b0 4d 58 5f 52 55 4e 20 29 3b 0a 20 20 6d 65 6d 63  MX_RUN );.  memc
121c0 70 79 28 70 2d 3e 61 7a 50 72 69 6f 72 5b 70 2d  py(p->azPrior[p-
121d0 3e 6e 52 75 6e 2b 2b 5d 2c 20 7a 48 61 73 68 31  >nRun++], zHash1
121e0 2c 20 69 53 63 6f 70 65 2b 31 29 3b 0a 20 20 69  , iScope+1);.  i
121f0 66 28 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  f( sqlite3_bind_
12200 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a  text(pStmt, 1, z
12210 48 61 73 68 31 2c 20 2d 31 2c 20 53 51 4c 49 54  Hash1, -1, SQLIT
12220 45 5f 53 54 41 54 49 43 29 3d 3d 53 51 4c 49 54  E_STATIC)==SQLIT
12230 45 5f 4e 4f 4d 45 4d 0a 20 20 20 7c 7c 20 73 71  E_NOMEM.   || sq
12240 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
12250 70 53 74 6d 74 2c 20 32 2c 20 7a 48 61 73 68 32  pStmt, 2, zHash2
12260 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
12270 54 49 43 29 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  TIC)==SQLITE_NOM
12280 45 4d 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  EM.  ){.    p->r
12290 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
122a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
122b0 7d 0a 23 69 66 20 53 50 45 4c 4c 46 49 58 5f 4d  }.#if SPELLFIX_M
122c0 58 5f 52 55 4e 3e 31 0a 20 20 66 6f 72 28 69 3d  X_RUN>1.  for(i=
122d0 30 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b  0; i<pCur->nRow;
122e0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
122f0 43 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72 65  Cur->a[i].iScore
12300 3e 69 57 6f 72 73 74 20 29 7b 0a 20 20 20 20 20  >iWorst ){.     
12310 20 69 57 6f 72 73 74 20 3d 20 70 43 75 72 2d 3e   iWorst = pCur->
12320 61 5b 69 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20  a[i].iScore;.   
12330 20 20 20 69 64 78 57 6f 72 73 74 20 3d 20 69 3b     idxWorst = i;
12340 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
12350 66 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  f.  while( sqlit
12360 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
12370 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
12380 20 20 69 6e 74 20 69 4d 61 74 63 68 6c 65 6e 20    int iMatchlen 
12390 3d 20 2d 31 3b 0a 20 20 20 20 69 52 61 6e 6b 20  = -1;.    iRank 
123a0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
123b0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  _int(pStmt, 2);.
123c0 20 20 20 20 69 66 28 20 70 2d 3e 70 4d 61 74 63      if( p->pMatc
123d0 68 53 74 72 33 20 29 7b 0a 20 20 20 20 20 20 69  hStr3 ){.      i
123e0 6e 74 20 6e 57 6f 72 64 20 3d 20 73 71 6c 69 74  nt nWord = sqlit
123f0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
12400 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20  pStmt, 1);.     
12410 20 7a 57 6f 72 64 20 3d 20 28 63 6f 6e 73 74 20   zWord = (const 
12420 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
12430 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
12440 20 31 29 3b 0a 20 20 20 20 20 20 69 44 69 73 74   1);.      iDist
12450 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f 72 65   = editDist3Core
12460 28 70 2d 3e 70 4d 61 74 63 68 53 74 72 33 2c 20  (p->pMatchStr3, 
12470 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20 70 2d  zWord, nWord, p-
12480 3e 70 4c 61 6e 67 2c 20 26 69 4d 61 74 63 68 6c  >pLang, &iMatchl
12490 65 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  en);.    }else{.
124a0 20 20 20 20 20 20 7a 4b 31 20 3d 20 28 63 6f 6e        zK1 = (con
124b0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
124c0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
124d0 6d 74 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66  mt, 3);.      if
124e0 28 20 7a 4b 31 3d 3d 30 20 29 20 63 6f 6e 74 69  ( zK1==0 ) conti
124f0 6e 75 65 3b 0a 20 20 20 20 20 20 69 44 69 73 74  nue;.      iDist
12500 20 3d 20 65 64 69 74 64 69 73 74 31 28 70 2d 3e   = editdist1(p->
12510 7a 50 61 74 74 65 72 6e 2c 20 7a 4b 31 2c 20 30  zPattern, zK1, 0
12520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
12530 20 69 44 69 73 74 3c 30 20 29 7b 0a 20 20 20 20   iDist<0 ){.    
12540 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
12550 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 62 72  _NOMEM;.      br
12560 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
12570 43 75 72 2d 3e 6e 53 65 61 72 63 68 2b 2b 3b 0a  Cur->nSearch++;.
12580 20 20 20 20 69 53 63 6f 72 65 20 3d 20 73 70 65      iScore = spe
12590 6c 6c 66 69 78 31 53 63 6f 72 65 28 69 44 69 73  llfix1Score(iDis
125a0 74 2c 69 52 61 6e 6b 29 3b 0a 20 20 20 20 69 66  t,iRank);.    if
125b0 28 20 70 2d 3e 69 4d 61 78 44 69 73 74 3e 3d 30  ( p->iMaxDist>=0
125c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 44   ){.      if( iD
125d0 69 73 74 3e 70 2d 3e 69 4d 61 78 44 69 73 74 20  ist>p->iMaxDist 
125e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
125f0 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77    if( pCur->nRow
12600 3e 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 2d 31  >=pCur->nAlloc-1
12610 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 65 6c   ){.        spel
12620 6c 66 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f  lfix1ResizeCurso
12630 72 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 6e 41  r(pCur, pCur->nA
12640 6c 6c 6f 63 2a 32 20 2b 20 31 30 29 3b 0a 20 20  lloc*2 + 10);.  
12650 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
12660 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  a==0 ) break;.  
12670 20 20 20 20 7d 0a 20 20 20 20 20 20 69 64 78 20      }.      idx 
12680 3d 20 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 20 20  = pCur->nRow;.  
12690 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
126a0 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c  ->nRow<pCur->nAl
126b0 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 64 78  loc ){.      idx
126c0 20 3d 20 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 20   = pCur->nRow;. 
126d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53 63     }else if( iSc
126e0 6f 72 65 3c 69 57 6f 72 73 74 20 29 7b 0a 20 20  ore<iWorst ){.  
126f0 20 20 20 20 69 64 78 20 3d 20 69 64 78 57 6f 72      idx = idxWor
12700 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
12710 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 5b 69  3_free(pCur->a[i
12720 64 78 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20 20 20  dx].zWord);.    
12730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
12740 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
12750 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57   pCur->a[idx].zW
12760 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ord = sqlite3_mp
12770 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69  rintf("%s", sqli
12780 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
12790 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20  pStmt, 1));.    
127a0 69 66 28 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d  if( pCur->a[idx]
127b0 2e 7a 57 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20  .zWord==0 ){.   
127c0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
127d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 62  E_NOMEM;.      b
127e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
127f0 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 52 6f  pCur->a[idx].iRo
12800 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  wid = sqlite3_co
12810 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
12820 2c 20 30 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  , 0);.    pCur->
12830 61 5b 69 64 78 5d 2e 69 52 61 6e 6b 20 3d 20 69  a[idx].iRank = i
12840 52 61 6e 6b 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Rank;.    pCur->
12850 61 5b 69 64 78 5d 2e 69 44 69 73 74 61 6e 63 65  a[idx].iDistance
12860 20 3d 20 69 44 69 73 74 3b 0a 20 20 20 20 70 43   = iDist;.    pC
12870 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 53 63 6f 72  ur->a[idx].iScor
12880 65 20 3d 20 69 53 63 6f 72 65 3b 0a 20 20 20 20  e = iScore;.    
12890 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 4d 61  pCur->a[idx].iMa
128a0 74 63 68 6c 65 6e 20 3d 20 69 4d 61 74 63 68 6c  tchlen = iMatchl
128b0 65 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  en;.    memcpy(p
128c0 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 48 61 73  Cur->a[idx].zHas
128d0 68 2c 20 7a 48 61 73 68 31 2c 20 69 53 63 6f 70  h, zHash1, iScop
128e0 65 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 43  e+1);.    if( pC
128f0 75 72 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d 3e 6e  ur->nRow<pCur->n
12900 41 6c 6c 6f 63 20 29 20 70 43 75 72 2d 3e 6e 52  Alloc ) pCur->nR
12910 6f 77 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 43  ow++;.    if( pC
12920 75 72 2d 3e 6e 52 6f 77 3d 3d 70 43 75 72 2d 3e  ur->nRow==pCur->
12930 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
12940 69 57 6f 72 73 74 20 3d 20 70 43 75 72 2d 3e 61  iWorst = pCur->a
12950 5b 30 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20 20  [0].iScore;.    
12960 20 20 69 64 78 57 6f 72 73 74 20 3d 20 30 3b 0a    idxWorst = 0;.
12970 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
12980 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b  <pCur->nRow; i++
12990 29 7b 0a 20 20 20 20 20 20 20 20 69 53 63 6f 72  ){.        iScor
129a0 65 20 3d 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69  e = pCur->a[i].i
129b0 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 20 20 69  Score;.        i
129c0 66 28 20 69 57 6f 72 73 74 3c 69 53 63 6f 72 65  f( iWorst<iScore
129d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 57   ){.          iW
129e0 6f 72 73 74 20 3d 20 69 53 63 6f 72 65 3b 0a 20  orst = iScore;. 
129f0 20 20 20 20 20 20 20 20 20 69 64 78 57 6f 72 73           idxWors
12a00 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d  t = i;.        }
12a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12a20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
12a30 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
12a40 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e 72 63    if( rc ) p->rc
12a50 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = rc;.}../*.** 
12a60 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
12a70 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68  the xFilter meth
12a80 6f 64 20 77 6f 72 6b 20 69 66 20 74 68 65 20 4d  od work if the M
12a90 41 54 43 48 20 74 65 72 6d 20 69 73 20 70 72 65  ATCH term is pre
12aa0 73 65 6e 74 0a 2a 2a 20 61 6e 64 20 77 65 20 61  sent.** and we a
12ab0 72 65 20 64 6f 69 6e 67 20 61 20 73 63 61 6e 2e  re doing a scan.
12ac0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
12ad0 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f  pellfix1FilterFo
12ae0 72 4d 61 74 63 68 28 0a 20 20 73 70 65 6c 6c 66  rMatch(.  spellf
12af0 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
12b00 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 0a  ,.  int idxNum,.
12b10 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
12b20 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
12b30 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  gv.){.  const un
12b40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4d 61  signed char *zMa
12b50 74 63 68 54 68 69 73 3b 20 20 20 2f 2a 20 52 48  tchThis;   /* RH
12b60 53 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  S of the MATCH o
12b70 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 64 69  perator */.  Edi
12b80 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
12b90 20 2a 70 4d 61 74 63 68 53 74 72 33 20 3d 20 30   *pMatchStr3 = 0
12ba0 3b 20 2f 2a 20 7a 4d 61 74 63 68 54 68 69 73 20  ; /* zMatchThis 
12bb0 61 73 20 61 6e 20 65 64 69 74 64 69 73 74 20 73  as an editdist s
12bc0 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
12bd0 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20  *zPattern;      
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12bf0 20 54 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e   Transliteration
12c00 20 6f 66 20 7a 4d 61 74 63 68 54 68 69 73 20 2a   of zMatchThis *
12c10 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e  /.  int nPattern
12c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c30 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
12c40 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a   of zPattern */.
12c50 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 32    int iLimit = 2
12c60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12c70 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62       /* Max numb
12c80 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75  er of rows of ou
12c90 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  tput */.  int iS
12ca0 63 6f 70 65 20 3d 20 33 3b 20 20 20 20 20 20 20  cope = 3;       
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12cc0 55 73 65 20 74 68 69 73 20 6d 61 6e 79 20 63 68  Use this many ch
12cd0 61 72 61 63 74 65 72 73 20 6f 66 20 7a 43 6c 61  aracters of zCla
12ce0 73 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  ss */.  int iLan
12cf0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
12d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
12d10 6e 67 75 61 67 65 20 63 6f 64 65 20 2a 2f 0a 20  nguage code */. 
12d20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 2f 2a 20 53 51 4c 20 6f 66 20 73 68      /* SQL of sh
12d50 61 64 6f 77 20 74 61 62 6c 65 20 71 75 65 72 79  adow table query
12d60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
12d70 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
12d80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 64           /* Shad
12d90 6f 77 20 74 61 62 6c 65 20 71 75 65 72 79 20 2a  ow table query *
12da0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
12dd0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
12de0 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e00 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
12e10 66 69 6c 74 65 72 20 70 61 72 61 6d 65 74 65 72  filter parameter
12e20 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f   */.  spellfix1_
12e30 76 74 61 62 20 2a 70 20 3d 20 70 43 75 72 2d 3e  vtab *p = pCur->
12e40 70 56 54 61 62 3b 20 20 20 2f 2a 20 54 68 65 20  pVTab;   /* The 
12e50 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
12e60 61 74 20 6f 77 6e 73 20 70 43 75 72 20 2a 2f 0a  at owns pCur */.
12e70 20 20 4d 61 74 63 68 51 75 65 72 79 20 78 3b 20    MatchQuery x; 
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 20 20 20 2f 2a 20 46 6f 72 20 70 61 73 73       /* For pass
12ea0 69 6e 67 20 69 6e 66 6f 20 74 6f 20 52 75 6e 51  ing info to RunQ
12eb0 75 65 72 79 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  uery() */..  /* 
12ec0 4c 6f 61 64 20 74 68 65 20 63 6f 73 74 20 74 61  Load the cost ta
12ed0 62 6c 65 20 69 66 20 77 65 20 68 61 76 65 20 6e  ble if we have n
12ee0 6f 74 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20  ot already done 
12ef0 73 6f 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 7a  so */.  if( p->z
12f00 43 6f 73 74 54 61 62 6c 65 21 3d 30 20 26 26 20  CostTable!=0 && 
12f10 70 2d 3e 70 43 6f 6e 66 69 67 33 3d 3d 30 20 29  p->pConfig3==0 )
12f20 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67  {.    p->pConfig
12f30 33 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  3 = sqlite3_mall
12f40 6f 63 28 20 73 69 7a 65 6f 66 28 70 2d 3e 70 43  oc( sizeof(p->pC
12f50 6f 6e 66 69 67 33 5b 30 5d 29 20 29 3b 0a 20 20  onfig3[0]) );.  
12f60 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
12f70 33 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  3==0 ) return SQ
12f80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12f90 6d 65 6d 73 65 74 28 70 2d 3e 70 43 6f 6e 66 69  memset(p->pConfi
12fa0 67 33 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  g3, 0, sizeof(p-
12fb0 3e 70 43 6f 6e 66 69 67 33 5b 30 5d 29 29 3b 0a  >pConfig3[0]));.
12fc0 20 20 20 20 72 63 20 3d 20 65 64 69 74 44 69 73      rc = editDis
12fd0 74 33 43 6f 6e 66 69 67 4c 6f 61 64 28 70 2d 3e  t3ConfigLoad(p->
12fe0 70 43 6f 6e 66 69 67 33 2c 20 70 2d 3e 64 62 2c  pConfig3, p->db,
12ff0 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b   p->zCostTable);
13000 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
13010 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6d  turn rc;.  }.  m
13020 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
13030 65 6f 66 28 78 29 29 3b 0a 20 20 78 2e 69 53 63  eof(x));.  x.iSc
13040 6f 70 65 20 3d 20 33 3b 20 20 2f 2a 20 44 65 66  ope = 3;  /* Def
13050 61 75 6c 74 20 73 63 6f 70 65 20 69 66 20 6e 6f  ault scope if no
13060 6e 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ne specified by 
13070 22 57 48 45 52 45 20 73 63 6f 70 65 3d 4e 22 20  "WHERE scope=N" 
13080 2a 2f 0a 20 20 78 2e 69 4d 61 78 44 69 73 74 20  */.  x.iMaxDist 
13090 3d 20 2d 31 3b 20 20 20 2f 2a 20 4d 61 78 69 6d  = -1;   /* Maxim
130a0 75 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69 74 20  um allowed edit 
130b0 64 69 73 74 61 6e 63 65 20 2a 2f 0a 0a 20 20 69  distance */..  i
130c0 66 28 20 69 64 78 4e 75 6d 26 32 20 29 7b 0a 20  f( idxNum&2 ){. 
130d0 20 20 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74     iLang = sqlit
130e0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
130f0 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 7d 0a 20  v[idx++]);.  }. 
13100 20 69 66 28 20 69 64 78 4e 75 6d 26 34 20 29 7b   if( idxNum&4 ){
13110 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71  .    iLimit = sq
13120 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
13130 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20  argv[idx++]);.  
13140 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 31 20 29    if( iLimit<1 )
13150 20 69 4c 69 6d 69 74 20 3d 20 31 3b 0a 20 20 7d   iLimit = 1;.  }
13160 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 26 38 20  .  if( idxNum&8 
13170 29 7b 0a 20 20 20 20 78 2e 69 53 63 6f 70 65 20  ){.    x.iScope 
13180 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13190 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29  int(argv[idx++])
131a0 3b 0a 20 20 20 20 69 66 28 20 78 2e 69 53 63 6f  ;.    if( x.iSco
131b0 70 65 3c 31 20 29 20 78 2e 69 53 63 6f 70 65 20  pe<1 ) x.iScope 
131c0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 78 2e 69  = 1;.    if( x.i
131d0 53 63 6f 70 65 3e 53 50 45 4c 4c 46 49 58 5f 4d  Scope>SPELLFIX_M
131e0 58 5f 48 41 53 48 2d 32 20 29 20 78 2e 69 53 63  X_HASH-2 ) x.iSc
131f0 6f 70 65 20 3d 20 53 50 45 4c 4c 46 49 58 5f 4d  ope = SPELLFIX_M
13200 58 5f 48 41 53 48 2d 32 3b 0a 20 20 7d 0a 20 20  X_HASH-2;.  }.  
13210 69 66 28 20 69 64 78 4e 75 6d 26 28 31 36 7c 33  if( idxNum&(16|3
13220 32 29 20 29 7b 0a 20 20 20 20 78 2e 69 4d 61 78  2) ){.    x.iMax
13230 44 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  Dist = sqlite3_v
13240 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64  alue_int(argv[id
13250 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  x++]);.    if( i
13260 64 78 4e 75 6d 26 31 36 20 29 20 78 2e 69 4d 61  dxNum&16 ) x.iMa
13270 78 44 69 73 74 2d 2d 3b 0a 20 20 20 20 69 66 28  xDist--;.    if(
13280 20 78 2e 69 4d 61 78 44 69 73 74 3c 30 20 29 20   x.iMaxDist<0 ) 
13290 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 30 3b 0a  x.iMaxDist = 0;.
132a0 20 20 7d 0a 20 20 73 70 65 6c 6c 66 69 78 31 52    }.  spellfix1R
132b0 65 73 65 74 43 75 72 73 6f 72 28 70 43 75 72 29  esetCursor(pCur)
132c0 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73  ;.  spellfix1Res
132d0 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72 2c 20  izeCursor(pCur, 
132e0 69 4c 69 6d 69 74 29 3b 0a 20 20 7a 4d 61 74 63  iLimit);.  zMatc
132f0 68 54 68 69 73 20 3d 20 73 71 6c 69 74 65 33 5f  hThis = sqlite3_
13300 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
13310 30 5d 29 3b 0a 20 20 69 66 28 20 7a 4d 61 74 63  0]);.  if( zMatc
13320 68 54 68 69 73 3d 3d 30 20 29 20 72 65 74 75 72  hThis==0 ) retur
13330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
13340 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 29  f( p->pConfig3 )
13350 7b 0a 20 20 20 20 78 2e 70 4c 61 6e 67 20 3d 20  {.    x.pLang = 
13360 65 64 69 74 44 69 73 74 33 46 69 6e 64 4c 61 6e  editDist3FindLan
13370 67 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 69  g(p->pConfig3, i
13380 4c 61 6e 67 29 3b 0a 20 20 20 20 70 4d 61 74 63  Lang);.    pMatc
13390 68 53 74 72 33 20 3d 20 65 64 69 74 44 69 73 74  hStr3 = editDist
133a0 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 78  3FromStringNew(x
133b0 2e 70 4c 61 6e 67 2c 20 28 63 6f 6e 73 74 20 63  .pLang, (const c
133c0 68 61 72 2a 29 7a 4d 61 74 63 68 54 68 69 73 2c  har*)zMatchThis,
133d0 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4d   -1);.    if( pM
133e0 61 74 63 68 53 74 72 33 3d 3d 30 20 29 7b 0a 20  atchStr3==0 ){. 
133f0 20 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49       x.rc = SQLI
13400 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
13410 67 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78 69 74  goto filter_exit
13420 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
13430 0a 20 20 20 20 78 2e 70 4c 61 6e 67 20 3d 20 30  .    x.pLang = 0
13440 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 74 65 72 6e  ;.  }.  zPattern
13450 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c   = (char*)transl
13460 69 74 65 72 61 74 65 28 7a 4d 61 74 63 68 54 68  iterate(zMatchTh
13470 69 73 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  is, sqlite3_valu
13480 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
13490 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
134a0 65 28 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e  e(pCur->zPattern
134b0 29 3b 0a 20 20 70 43 75 72 2d 3e 7a 50 61 74 74  );.  pCur->zPatt
134c0 65 72 6e 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a  ern = zPattern;.
134d0 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d    if( zPattern==
134e0 30 20 29 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20  0 ){.    x.rc = 
134f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13500 20 20 67 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78    goto filter_ex
13510 69 74 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 74 65  it;.  }.  nPatte
13520 72 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  rn = (int)strlen
13530 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 69 66  (zPattern);.  if
13540 28 20 7a 50 61 74 74 65 72 6e 5b 6e 50 61 74 74  ( zPattern[nPatt
13550 65 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 20 6e 50  ern-1]=='*' ) nP
13560 61 74 74 65 72 6e 2d 2d 3b 0a 20 20 7a 53 71 6c  attern--;.  zSql
13570 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
13580 74 66 28 0a 20 20 20 20 20 22 53 45 4c 45 43 54  tf(.     "SELECT
13590 20 69 64 2c 20 77 6f 72 64 2c 20 72 61 6e 6b 2c   id, word, rank,
135a0 20 6b 31 22 0a 20 20 20 20 20 22 20 20 46 52 4f   k1".     "  FRO
135b0 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f  M \"%w\".\"%w_vo
135c0 63 61 62 5c 22 22 0a 20 20 20 20 20 22 20 57 48  cab\"".     " WH
135d0 45 52 45 20 6c 61 6e 67 69 64 3d 25 64 20 41 4e  ERE langid=%d AN
135e0 44 20 6b 32 3e 3d 3f 31 20 41 4e 44 20 6b 32 3c  D k2>=?1 AND k2<
135f0 3f 32 22 2c 0a 20 20 20 20 20 70 2d 3e 7a 44 62  ?2",.     p->zDb
13600 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e  Name, p->zTableN
13610 61 6d 65 2c 20 69 4c 61 6e 67 0a 20 20 29 3b 0a  ame, iLang.  );.
13620 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
13630 0a 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49  .    x.rc = SQLI
13640 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 53  TE_NOMEM;.    pS
13650 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  tmt = 0;.    got
13660 6f 20 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20  o filter_exit;. 
13670 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
13680 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
13690 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
136a0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
136b0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
136c0 20 20 70 43 75 72 2d 3e 69 4c 61 6e 67 20 3d 20    pCur->iLang = 
136d0 69 4c 61 6e 67 3b 0a 20 20 78 2e 70 43 75 72 20  iLang;.  x.pCur 
136e0 3d 20 70 43 75 72 3b 0a 20 20 78 2e 70 53 74 6d  = pCur;.  x.pStm
136f0 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 78 2e 7a  t = pStmt;.  x.z
13700 50 61 74 74 65 72 6e 20 3d 20 7a 50 61 74 74 65  Pattern = zPatte
13710 72 6e 3b 0a 20 20 78 2e 6e 50 61 74 74 65 72 6e  rn;.  x.nPattern
13720 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 78   = nPattern;.  x
13730 2e 70 4d 61 74 63 68 53 74 72 33 20 3d 20 70 4d  .pMatchStr3 = pM
13740 61 74 63 68 53 74 72 33 3b 0a 20 20 78 2e 69 4c  atchStr3;.  x.iL
13750 61 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a 20 20 78  ang = iLang;.  x
13760 2e 72 63 20 3d 20 72 63 3b 0a 20 20 78 2e 70 43  .rc = rc;.  x.pC
13770 6f 6e 66 69 67 33 20 3d 20 70 2d 3e 70 43 6f 6e  onfig3 = p->pCon
13780 66 69 67 33 3b 0a 20 20 69 66 28 20 78 2e 72 63  fig3;.  if( x.rc
13790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
137a0 20 20 20 73 70 65 6c 6c 66 69 78 31 52 75 6e 51     spellfix1RunQ
137b0 75 65 72 79 28 26 78 2c 20 7a 50 61 74 74 65 72  uery(&x, zPatter
137c0 6e 2c 20 6e 50 61 74 74 65 72 6e 29 3b 0a 20 20  n, nPattern);.  
137d0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 61  }..  if( pCur->a
137e0 20 29 7b 0a 20 20 20 20 71 73 6f 72 74 28 70 43   ){.    qsort(pC
137f0 75 72 2d 3e 61 2c 20 70 43 75 72 2d 3e 6e 52 6f  ur->a, pCur->nRo
13800 77 2c 20 73 69 7a 65 6f 66 28 70 43 75 72 2d 3e  w, sizeof(pCur->
13810 61 5b 30 5d 29 2c 20 73 70 65 6c 6c 66 69 78 31  a[0]), spellfix1
13820 52 6f 77 43 6f 6d 70 61 72 65 29 3b 0a 20 20 20  RowCompare);.   
13830 20 70 43 75 72 2d 3e 69 54 6f 70 20 3d 20 69 4c   pCur->iTop = iL
13840 69 6d 69 74 3b 0a 20 20 20 20 70 43 75 72 2d 3e  imit;.    pCur->
13850 69 53 63 6f 70 65 20 3d 20 69 53 63 6f 70 65 3b  iScope = iScope;
13860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e  .  }else{.    x.
13870 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13880 4d 3b 0a 20 20 7d 0a 0a 66 69 6c 74 65 72 5f 65  M;.  }..filter_e
13890 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  xit:.  sqlite3_f
138a0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
138b0 20 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53    editDist3FromS
138c0 74 72 69 6e 67 44 65 6c 65 74 65 28 70 4d 61 74  tringDelete(pMat
138d0 63 68 53 74 72 33 29 3b 0a 20 20 72 65 74 75 72  chStr3);.  retur
138e0 6e 20 78 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n x.rc;.}../*.**
138f0 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
13900 20 78 46 69 6c 74 65 72 20 68 61 6e 64 6c 65 73   xFilter handles
13910 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   a full-table sc
13920 61 6e 20 63 61 73 65 0a 2a 2f 0a 73 74 61 74 69  an case.*/.stati
13930 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46  c int spellfix1F
13940 69 6c 74 65 72 46 6f 72 46 75 6c 6c 53 63 61 6e  ilterForFullScan
13950 28 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  (.  spellfix1_cu
13960 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 69 6e  rsor *pCur,.  in
13970 74 20 69 64 78 4e 75 6d 2c 0a 20 20 69 6e 74 20  t idxNum,.  int 
13980 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
13990 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
139a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
139b0 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 53  E_OK;.  char *zS
139c0 71 6c 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  ql;.  spellfix1_
139d0 76 74 61 62 20 2a 70 56 54 61 62 20 3d 20 70 43  vtab *pVTab = pC
139e0 75 72 2d 3e 70 56 54 61 62 3b 0a 20 20 73 70 65  ur->pVTab;.  spe
139f0 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f  llfix1ResetCurso
13a00 72 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72  r(pCur);.  asser
13a10 74 28 20 69 64 78 4e 75 6d 3d 3d 30 20 7c 7c 20  t( idxNum==0 || 
13a20 69 64 78 4e 75 6d 3d 3d 36 34 20 29 3b 0a 20 20  idxNum==64 );.  
13a30 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
13a40 70 72 69 6e 74 66 28 0a 20 20 20 20 20 22 53 45  printf(.     "SE
13a50 4c 45 43 54 20 77 6f 72 64 2c 20 72 61 6e 6b 2c  LECT word, rank,
13a60 20 4e 55 4c 4c 2c 20 6c 61 6e 67 69 64 2c 20 69   NULL, langid, i
13a70 64 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22  d FROM \"%w\".\"
13a80 25 77 5f 76 6f 63 61 62 5c 22 25 73 22 2c 0a 20  %w_vocab\"%s",. 
13a90 20 20 20 20 70 56 54 61 62 2d 3e 7a 44 62 4e 61      pVTab->zDbNa
13aa0 6d 65 2c 20 70 56 54 61 62 2d 3e 7a 54 61 62 6c  me, pVTab->zTabl
13ab0 65 4e 61 6d 65 2c 0a 20 20 20 20 20 28 28 69 64  eName,.     ((id
13ac0 78 4e 75 6d 20 26 20 36 34 29 20 3f 20 22 20 57  xNum & 64) ? " W
13ad0 48 45 52 45 20 72 6f 77 69 64 3d 3f 22 20 3a 20  HERE rowid=?" : 
13ae0 22 22 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a  "").  );.  if( z
13af0 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
13b00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13b10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
13b20 70 61 72 65 5f 76 32 28 70 56 54 61 62 2d 3e 64  pare_v2(pVTab->d
13b30 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
13b40 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 30  ur->pFullScan, 0
13b50 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13b60 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72  e(zSql);.  if( r
13b70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13b80 28 69 64 78 4e 75 6d 20 26 20 36 34 29 20 29 7b  (idxNum & 64) ){
13b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 72 67  .    assert( arg
13ba0 63 3d 3d 31 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==1 );.    rc =
13bb0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
13bc0 6c 75 65 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53  lue(pCur->pFullS
13bd0 63 61 6e 2c 20 31 2c 20 61 72 67 76 5b 30 5d 29  can, 1, argv[0])
13be0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 6e 52  ;.  }.  pCur->nR
13bf0 6f 77 20 3d 20 70 43 75 72 2d 3e 69 52 6f 77 20  ow = pCur->iRow 
13c00 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
13c10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13c20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
13c30 70 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  p(pCur->pFullSca
13c40 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  n);.    if( rc==
13c50 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 20 70 43  SQLITE_ROW ){ pC
13c60 75 72 2d 3e 69 52 6f 77 20 3d 20 2d 31 3b 20 72  ur->iRow = -1; r
13c70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d  c = SQLITE_OK; }
13c80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13c90 49 54 45 5f 44 4f 4e 45 20 29 7b 20 72 63 20 3d  ITE_DONE ){ rc =
13ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20   SQLITE_OK; }.  
13cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
13cc0 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  >iRow = 0;.  }. 
13cd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
13ce0 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 74 6f 20  /*.** Called to 
13cf0 22 72 65 77 69 6e 64 22 20 61 20 63 75 72 73 6f  "rewind" a curso
13d00 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  r back to the be
13d10 67 69 6e 6e 69 6e 67 20 73 6f 20 74 68 61 74 0a  ginning so that.
13d20 2a 2a 20 69 74 20 73 74 61 72 74 73 20 69 74 73  ** it starts its
13d30 20 6f 75 74 70 75 74 20 6f 76 65 72 20 61 67 61   output over aga
13d40 69 6e 2e 20 20 41 6c 77 61 79 73 20 63 61 6c 6c  in.  Always call
13d50 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  ed at least once
13d60 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 6e 79  .** prior to any
13d70 20 73 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e   spellfix1Column
13d80 2c 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64  , spellfix1Rowid
13d90 2c 20 6f 72 20 73 70 65 6c 6c 66 69 78 31 45 6f  , or spellfix1Eo
13da0 66 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  f call..*/.stati
13db0 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46  c int spellfix1F
13dc0 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
13dd0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
13de0 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
13df0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
13e00 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
13e10 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
13e20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 70 65 6c  **argv.){.  spel
13e30 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
13e40 75 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f  ur = (spellfix1_
13e50 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  cursor *)cur;.  
13e60 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64  int rc;.  if( id
13e70 78 4e 75 6d 20 26 20 31 20 29 7b 0a 20 20 20 20  xNum & 1 ){.    
13e80 72 63 20 3d 20 73 70 65 6c 6c 66 69 78 31 46 69  rc = spellfix1Fi
13e90 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 70 43 75  lterForMatch(pCu
13ea0 72 2c 20 69 64 78 4e 75 6d 2c 20 61 72 67 63 2c  r, idxNum, argc,
13eb0 20 61 72 67 76 29 3b 0a 20 20 7d 65 6c 73 65 7b   argv);.  }else{
13ec0 0a 20 20 20 20 72 63 20 3d 20 73 70 65 6c 6c 66  .    rc = spellf
13ed0 69 78 31 46 69 6c 74 65 72 46 6f 72 46 75 6c 6c  ix1FilterForFull
13ee0 53 63 61 6e 28 70 43 75 72 2c 20 69 64 78 4e 75  Scan(pCur, idxNu
13ef0 6d 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a  m, argc, argv);.
13f00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13f10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  .}.../*.** Advan
13f20 63 65 20 61 20 63 75 72 73 6f 72 20 74 6f 20 69  ce a cursor to i
13f30 74 73 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 6f  ts next row of o
13f40 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  utput.*/.static 
13f50 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 4e 65 78  int spellfix1Nex
13f60 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  t(sqlite3_vtab_c
13f70 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73  ursor *cur){.  s
13f80 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
13f90 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69  *pCur = (spellfi
13fa0 78 31 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b  x1_cursor *)cur;
13fb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13fc0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 43 75  TE_OK;.  if( pCu
13fd0 72 2d 3e 69 52 6f 77 20 3c 20 70 43 75 72 2d 3e  r->iRow < pCur->
13fe0 6e 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28 20  nRow ){.    if( 
13ff0 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20  pCur->pFullScan 
14000 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
14010 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d  lite3_step(pCur-
14020 3e 70 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20 20  >pFullScan);.   
14030 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14040 45 5f 52 4f 57 20 29 20 70 43 75 72 2d 3e 69 52  E_ROW ) pCur->iR
14050 6f 77 20 3d 20 70 43 75 72 2d 3e 6e 52 6f 77 3b  ow = pCur->nRow;
14060 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
14070 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 72 63 3d  QLITE_ROW || rc=
14080 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
14090 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
140a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
140b0 70 43 75 72 2d 3e 69 52 6f 77 2b 2b 3b 0a 20 20  pCur->iRow++;.  
140c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
140d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
140e0 74 75 72 6e 20 54 52 55 45 20 69 66 20 77 65 20  turn TRUE if we 
140f0 61 72 65 20 61 74 20 74 68 65 20 65 6e 64 2d 6f  are at the end-o
14100 66 2d 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63  f-file.*/.static
14110 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 45 6f   int spellfix1Eo
14120 66 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  f(sqlite3_vtab_c
14130 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73  ursor *cur){.  s
14140 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
14150 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69  *pCur = (spellfi
14160 78 31 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b  x1_cursor *)cur;
14170 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
14180 69 52 6f 77 3e 3d 70 43 75 72 2d 3e 6e 52 6f 77  iRow>=pCur->nRow
14190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
141a0 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
141b0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a  he current row..
141c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
141d0 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 28 0a 20  ellfix1Column(. 
141e0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
141f0 72 73 6f 72 20 2a 63 75 72 2c 0a 20 20 73 71 6c  rsor *cur,.  sql
14200 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
14210 78 2c 0a 20 20 69 6e 74 20 69 0a 29 7b 0a 20 20  x,.  int i.){.  
14220 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
14230 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66   *pCur = (spellf
14240 69 78 31 5f 63 75 72 73 6f 72 2a 29 63 75 72 3b  ix1_cursor*)cur;
14250 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46 75  .  if( pCur->pFu
14260 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 69 66  llScan ){.    if
14270 28 20 69 3c 3d 53 50 45 4c 4c 46 49 58 5f 43 4f  ( i<=SPELLFIX_CO
14280 4c 5f 4c 41 4e 47 49 44 20 29 7b 0a 20 20 20 20  L_LANGID ){.    
14290 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
142a0 5f 76 61 6c 75 65 28 63 74 78 2c 20 73 71 6c 69  _value(ctx, sqli
142b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61 6c 75 65  te3_column_value
142c0 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e  (pCur->pFullScan
142d0 2c 20 69 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , i));.    }else
142e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
142f0 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 74 78 29  result_null(ctx)
14300 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14310 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14320 7d 0a 20 20 73 77 69 74 63 68 28 20 69 20 29 7b  }.  switch( i ){
14330 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
14340 49 58 5f 43 4f 4c 5f 57 4f 52 44 3a 20 7b 0a 20  IX_COL_WORD: {. 
14350 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
14360 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43  ult_text(ctx, pC
14370 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77  ur->a[pCur->iRow
14380 5d 2e 7a 57 6f 72 64 2c 20 2d 31 2c 20 53 51 4c  ].zWord, -1, SQL
14390 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
143a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
143b0 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49      case SPELLFI
143c0 58 5f 43 4f 4c 5f 52 41 4e 4b 3a 20 7b 0a 20 20  X_COL_RANK: {.  
143d0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
143e0 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72  lt_int(ctx, pCur
143f0 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e  ->a[pCur->iRow].
14400 69 52 61 6e 6b 29 3b 0a 20 20 20 20 20 20 62 72  iRank);.      br
14410 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14420 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ase SPELLFIX_COL
14430 5f 44 49 53 54 41 4e 43 45 3a 20 7b 0a 20 20 20  _DISTANCE: {.   
14440 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
14450 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d  t_int(ctx, pCur-
14460 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69  >a[pCur->iRow].i
14470 44 69 73 74 61 6e 63 65 29 3b 0a 20 20 20 20 20  Distance);.     
14480 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14490 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f    case SPELLFIX_
144a0 43 4f 4c 5f 4c 41 4e 47 49 44 3a 20 7b 0a 20 20  COL_LANGID: {.  
144b0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
144c0 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72  lt_int(ctx, pCur
144d0 2d 3e 69 4c 61 6e 67 29 3b 0a 20 20 20 20 20 20  ->iLang);.      
144e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
144f0 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43   case SPELLFIX_C
14500 4f 4c 5f 53 43 4f 52 45 3a 20 7b 0a 20 20 20 20  OL_SCORE: {.    
14510 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14520 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e  _int(ctx, pCur->
14530 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 53  a[pCur->iRow].iS
14540 63 6f 72 65 29 3b 0a 20 20 20 20 20 20 62 72 65  core);.      bre
14550 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14560 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
14570 4d 41 54 43 48 4c 45 4e 3a 20 7b 0a 20 20 20 20  MATCHLEN: {.    
14580 20 20 69 6e 74 20 69 4d 61 74 63 68 6c 65 6e 20    int iMatchlen 
14590 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e  = pCur->a[pCur->
145a0 69 52 6f 77 5d 2e 69 4d 61 74 63 68 6c 65 6e 3b  iRow].iMatchlen;
145b0 0a 20 20 20 20 20 20 69 66 28 20 69 4d 61 74 63  .      if( iMatc
145c0 68 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  hlen<0 ){.      
145d0 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 20 3d    int nPattern =
145e0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 43 75   (int)strlen(pCu
145f0 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  r->zPattern);.  
14600 20 20 20 20 20 20 63 68 61 72 20 2a 7a 57 6f 72        char *zWor
14610 64 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75 72  d = pCur->a[pCur
14620 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64 3b 0a 20  ->iRow].zWord;. 
14630 20 20 20 20 20 20 20 69 6e 74 20 6e 57 6f 72 64         int nWord
14640 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
14650 57 6f 72 64 29 3b 0a 0a 20 20 20 20 20 20 20 20  Word);..        
14660 69 66 28 20 6e 50 61 74 74 65 72 6e 3e 30 20 26  if( nPattern>0 &
14670 26 20 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e  & pCur->zPattern
14680 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3d 3d 27 2a  [nPattern-1]=='*
14690 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ' ){.          c
146a0 68 61 72 20 2a 7a 54 72 61 6e 73 6c 69 74 3b 0a  har *zTranslit;.
146b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65            int re
146c0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 72  s;.          zTr
146d0 61 6e 73 6c 69 74 20 3d 20 28 63 68 61 72 20 2a  anslit = (char *
146e0 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 28  )transliterate((
146f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14700 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20  zWord, nWord);. 
14710 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 54           if( !zT
14720 72 61 6e 73 6c 69 74 20 29 20 72 65 74 75 72 6e  ranslit ) return
14730 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14740 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 65           res = e
14750 64 69 74 64 69 73 74 31 28 70 43 75 72 2d 3e 7a  ditdist1(pCur->z
14760 50 61 74 74 65 72 6e 2c 20 7a 54 72 61 6e 73 6c  Pattern, zTransl
14770 69 74 2c 20 26 69 4d 61 74 63 68 6c 65 6e 29 3b  it, &iMatchlen);
14780 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14790 65 33 5f 66 72 65 65 28 7a 54 72 61 6e 73 6c 69  e3_free(zTransli
147a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
147b0 28 20 72 65 73 3c 30 20 29 20 72 65 74 75 72 6e  ( res<0 ) return
147c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
147d0 20 20 20 20 20 20 20 20 20 69 4d 61 74 63 68 6c           iMatchl
147e0 65 6e 20 3d 20 74 72 61 6e 73 6c 65 6e 5f 74 6f  en = translen_to
147f0 5f 63 68 61 72 6c 65 6e 28 7a 57 6f 72 64 2c 20  _charlen(zWord, 
14800 6e 57 6f 72 64 2c 20 69 4d 61 74 63 68 6c 65 6e  nWord, iMatchlen
14810 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
14820 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4d 61 74  {.          iMat
14830 63 68 6c 65 6e 20 3d 20 75 74 66 38 43 68 61 72  chlen = utf8Char
14840 6c 65 6e 28 7a 57 6f 72 64 2c 20 6e 57 6f 72 64  len(zWord, nWord
14850 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14860 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
14870 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
14880 74 78 2c 20 69 4d 61 74 63 68 6c 65 6e 29 3b 0a  tx, iMatchlen);.
14890 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
148a0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c   }.    case SPEL
148b0 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e 45 48 41  LFIX_COL_PHONEHA
148c0 53 48 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SH: {.      sqli
148d0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
148e0 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75  ctx, pCur->a[pCu
148f0 72 2d 3e 69 52 6f 77 5d 2e 7a 48 61 73 68 2c 20  r->iRow].zHash, 
14900 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
14910 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
14920 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14930 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54 4f 50  SPELLFIX_COL_TOP
14940 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
14950 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
14960 2c 20 70 43 75 72 2d 3e 69 54 6f 70 29 3b 0a 20  , pCur->iTop);. 
14970 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14980 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c  }.    case SPELL
14990 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 3a 20 7b  FIX_COL_SCOPE: {
149a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
149b0 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70  esult_int(ctx, p
149c0 43 75 72 2d 3e 69 53 63 6f 70 65 29 3b 0a 20 20  Cur->iScope);.  
149d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
149e0 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
149f0 49 58 5f 43 4f 4c 5f 53 52 43 48 43 4e 54 3a 20  IX_COL_SRCHCNT: 
14a00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14a10 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20  result_int(ctx, 
14a20 70 43 75 72 2d 3e 6e 53 65 61 72 63 68 29 3b 0a  pCur->nSearch);.
14a30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14a40 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
14a50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14a60 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 74 78 29  result_null(ctx)
14a70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14a80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
14a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14aa0 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64 2e  /*.** The rowid.
14ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
14ac0 70 65 6c 6c 66 69 78 31 52 6f 77 69 64 28 73 71  pellfix1Rowid(sq
14ad0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
14ae0 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f 69  r *cur, sqlite_i
14af0 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20  nt64 *pRowid){. 
14b00 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
14b10 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c 6c  r *pCur = (spell
14b20 66 69 78 31 5f 63 75 72 73 6f 72 2a 29 63 75 72  fix1_cursor*)cur
14b30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46  ;.  if( pCur->pF
14b40 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 2a  ullScan ){.    *
14b50 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  pRowid = sqlite3
14b60 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 43  _column_int64(pC
14b70 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 34  ur->pFullScan, 4
14b80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14b90 2a 70 52 6f 77 69 64 20 3d 20 70 43 75 72 2d 3e  *pRowid = pCur->
14ba0 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 52  a[pCur->iRow].iR
14bb0 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  owid;.  }.  retu
14bc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14bd0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 55 70 64 61  ./*.** The xUpda
14be0 74 65 28 29 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  te() method..*/.
14bf0 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
14c00 66 69 78 31 55 70 64 61 74 65 28 0a 20 20 73 71  fix1Update(.  sq
14c10 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61  lite3_vtab *pVTa
14c20 62 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  b,.  int argc,. 
14c30 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
14c40 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 5f  *argv,.  sqlite_
14c50 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 0a 29 7b  int64 *pRowid.){
14c60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14c70 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
14c80 5f 69 6e 74 36 34 20 72 6f 77 69 64 2c 20 6e 65  _int64 rowid, ne
14c90 77 52 6f 77 69 64 3b 0a 20 20 73 70 65 6c 6c 66  wRowid;.  spellf
14ca0 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28 73  ix1_vtab *p = (s
14cb0 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29 70  pellfix1_vtab*)p
14cc0 56 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  VTab;.  sqlite3 
14cd0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
14ce0 69 66 28 20 61 72 67 63 3d 3d 31 20 29 7b 0a 20  if( argc==1 ){. 
14cf0 20 20 20 2f 2a 20 41 20 64 65 6c 65 74 65 20 6f     /* A delete o
14d00 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20  peration on the 
14d10 72 6f 77 69 64 20 67 69 76 65 6e 20 62 79 20 61  rowid given by a
14d20 72 67 76 5b 30 5d 20 2a 2f 0a 20 20 20 20 72 6f  rgv[0] */.    ro
14d30 77 69 64 20 3d 20 2a 70 52 6f 77 69 64 20 3d 20  wid = *pRowid = 
14d40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
14d50 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  t64(argv[0]);.  
14d60 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65    spellfix1DbExe
14d70 63 28 26 72 63 2c 20 64 62 2c 20 22 44 45 4c 45  c(&rc, db, "DELE
14d80 54 45 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c  TE FROM \"%w\".\
14d90 22 25 77 5f 76 6f 63 61 62 5c 22 20 22 0a 20 20  "%w_vocab\" ".  
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
14dc0 20 69 64 3d 25 6c 6c 64 22 2c 0a 20 20 20 20 20   id=%lld",.     
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
14de0 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62  zDbName, p->zTab
14df0 6c 65 4e 61 6d 65 2c 20 72 6f 77 69 64 29 3b 0a  leName, rowid);.
14e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
14e10 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14e20 20 2a 7a 57 6f 72 64 20 3d 20 73 71 6c 69 74 65   *zWord = sqlite
14e30 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
14e40 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57  v[SPELLFIX_COL_W
14e50 4f 52 44 2b 32 5d 29 3b 0a 20 20 20 20 69 6e 74  ORD+2]);.    int
14e60 20 6e 57 6f 72 64 20 3d 20 73 71 6c 69 74 65 33   nWord = sqlite3
14e70 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
14e80 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57  v[SPELLFIX_COL_W
14e90 4f 52 44 2b 32 5d 29 3b 0a 20 20 20 20 69 6e 74  ORD+2]);.    int
14ea0 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74 65 33   iLang = sqlite3
14eb0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
14ec0 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e  SPELLFIX_COL_LAN
14ed0 47 49 44 2b 32 5d 29 3b 0a 20 20 20 20 69 6e 74  GID+2]);.    int
14ee0 20 69 52 61 6e 6b 20 3d 20 73 71 6c 69 74 65 33   iRank = sqlite3
14ef0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
14f00 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e  SPELLFIX_COL_RAN
14f10 4b 2b 32 5d 29 3b 0a 20 20 20 20 63 6f 6e 73 74  K+2]);.    const
14f20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14f30 7a 53 6f 75 6e 64 73 6c 69 6b 65 20 3d 0a 20 20  zSoundslike =.  
14f40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14f50 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
14f60 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 4f  [SPELLFIX_COL_SO
14f70 55 4e 44 53 4c 49 4b 45 2b 32 5d 29 3b 0a 20 20  UNDSLIKE+2]);.  
14f80 20 20 69 6e 74 20 6e 53 6f 75 6e 64 73 6c 69 6b    int nSoundslik
14f90 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
14fa0 65 5f 62 79 74 65 73 28 61 72 67 76 5b 53 50 45  e_bytes(argv[SPE
14fb0 4c 4c 46 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53  LLFIX_COL_SOUNDS
14fc0 4c 49 4b 45 2b 32 5d 29 3b 0a 20 20 20 20 63 68  LIKE+2]);.    ch
14fd0 61 72 20 2a 7a 4b 31 2c 20 2a 7a 4b 32 3b 0a 20  ar *zK1, *zK2;. 
14fe0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 68     int i;.    ch
14ff0 61 72 20 63 3b 0a 0a 20 20 20 20 69 66 28 20 7a  ar c;..    if( z
15000 57 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Word==0 ){.     
15010 20 2f 2a 20 49 6e 73 65 72 74 73 20 6f 66 20 74   /* Inserts of t
15020 68 65 20 66 6f 72 6d 3a 20 20 49 4e 53 45 52 54  he form:  INSERT
15030 20 49 4e 54 4f 20 74 61 62 6c 65 28 63 6f 6d 6d   INTO table(comm
15040 61 6e 64 29 20 56 41 4c 55 45 53 28 27 78 79 7a  and) VALUES('xyz
15050 7a 79 27 29 3b 0a 20 20 20 20 20 20 2a 2a 20 63  zy');.      ** c
15060 61 75 73 65 20 7a 57 6f 72 64 20 74 6f 20 62 65  ause zWord to be
15070 20 4e 55 4c 4c 2c 20 73 6f 20 77 65 20 6c 6f 6f   NULL, so we loo
15080 6b 20 61 74 20 74 68 65 20 22 63 6f 6d 6d 61 6e  k at the "comman
15090 64 22 20 63 6f 6c 75 6d 6e 20 74 6f 20 73 65 65  d" column to see
150a0 0a 20 20 20 20 20 20 2a 2a 20 77 68 61 74 20 73  .      ** what s
150b0 70 65 63 69 61 6c 20 61 63 74 69 6f 6e 73 20 74  pecial actions t
150c0 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 20 20 20 20  o take */.      
150d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64  const char *zCmd
150e0 20 3d 20 0a 20 20 20 20 20 20 20 20 20 28 63 6f   = .         (co
150f0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
15100 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
15110 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43  v[SPELLFIX_COL_C
15120 4f 4d 4d 41 4e 44 2b 32 5d 29 3b 0a 20 20 20 20  OMMAND+2]);.    
15130 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 7b    if( zCmd==0 ){
15140 0a 20 20 20 20 20 20 20 20 70 56 54 61 62 2d 3e  .        pVTab->
15150 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
15160 33 5f 6d 70 72 69 6e 74 66 28 22 4e 4f 54 20 4e  3_mprintf("NOT N
15170 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  ULL constraint f
15180 61 69 6c 65 64 3a 20 25 73 2e 77 6f 72 64 22 2c  ailed: %s.word",
15190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 61            p->zTa
151c0 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  bleName);.      
151d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
151e0 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
151f0 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
15200 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
15210 64 2c 22 72 65 73 65 74 22 29 3d 3d 30 20 29 7b  d,"reset")==0 ){
15220 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65  .        /* Rese
15230 74 20 74 68 65 20 20 65 64 69 74 20 63 6f 73 74  t the  edit cost
15240 20 74 61 62 6c 65 20 28 69 66 20 74 68 65 72 65   table (if there
15250 20 69 73 20 6f 6e 65 29 2e 20 2a 2f 0a 20 20 20   is one). */.   
15260 20 20 20 20 20 65 64 69 74 44 69 73 74 33 43 6f       editDist3Co
15270 6e 66 69 67 44 65 6c 65 74 65 28 70 2d 3e 70 43  nfigDelete(p->pC
15280 6f 6e 66 69 67 33 29 3b 0a 20 20 20 20 20 20 20  onfig3);.       
15290 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d 20 30   p->pConfig3 = 0
152a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
152b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
152c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74    }.      if( st
152d0 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 65 64 69 74  rncmp(zCmd,"edit
152e0 5f 63 6f 73 74 5f 74 61 62 6c 65 3d 22 2c 31 36  _cost_table=",16
152f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15300 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44  editDist3ConfigD
15310 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69 67  elete(p->pConfig
15320 33 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  3);.        p->p
15330 43 6f 6e 66 69 67 33 20 3d 20 30 3b 0a 20 20 20  Config3 = 0;.   
15340 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15350 65 28 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29  e(p->zCostTable)
15360 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 43 6f  ;.        p->zCo
15370 73 74 54 61 62 6c 65 20 3d 20 73 70 65 6c 6c 66  stTable = spellf
15380 69 78 31 44 65 71 75 6f 74 65 28 7a 43 6d 64 2b  ix1Dequote(zCmd+
15390 31 36 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  16);.        if(
153a0 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d   p->zCostTable==
153b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
153c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
153d0 20 69 66 28 20 70 2d 3e 7a 43 6f 73 74 54 61 62   if( p->zCostTab
153e0 6c 65 5b 30 5d 3d 3d 30 20 7c 7c 20 73 71 6c 69  le[0]==0 || sqli
153f0 74 65 33 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a  te3_stricmp(p->z
15400 43 6f 73 74 54 61 62 6c 65 2c 22 6e 75 6c 6c 22  CostTable,"null"
15410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15420 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15430 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20  ->zCostTable);. 
15440 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 43 6f 73           p->zCos
15450 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  tTable = 0;.    
15460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
15470 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 56        }.      pV
15490 54 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73  Tab->zErrMsg = s
154a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
154b0 75 6e 6b 6e 6f 77 6e 20 76 61 6c 75 65 20 66 6f  unknown value fo
154c0 72 20 25 73 2e 63 6f 6d 6d 61 6e 64 3a 20 5c 22  r %s.command: \"
154d0 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %w\"",.         
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
15500 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 43 6d  >zTableName, zCm
15510 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
15520 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
15530 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 52 61     }.    if( iRa
15540 6e 6b 3c 31 20 29 20 69 52 61 6e 6b 20 3d 20 31  nk<1 ) iRank = 1
15550 3b 0a 20 20 20 20 69 66 28 20 7a 53 6f 75 6e 64  ;.    if( zSound
15560 73 6c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 7a  slike ){.      z
15570 4b 31 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e  K1 = (char*)tran
15580 73 6c 69 74 65 72 61 74 65 28 7a 53 6f 75 6e 64  sliterate(zSound
15590 73 6c 69 6b 65 2c 20 6e 53 6f 75 6e 64 73 6c 69  slike, nSoundsli
155a0 6b 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ke);.    }else{.
155b0 20 20 20 20 20 20 7a 4b 31 20 3d 20 28 63 68 61        zK1 = (cha
155c0 72 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65  r*)transliterate
155d0 28 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a  (zWord, nWord);.
155e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4b      }.    if( zK
155f0 31 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  1==0 ) return SQ
15600 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
15610 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 4b  for(i=0; (c = zK
15620 31 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  1[i])!=0; i++){.
15630 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 27 41         if( c>='A
15640 27 20 26 26 20 63 3c 3d 27 5a 27 20 29 20 7a 4b  ' && c<='Z' ) zK
15650 31 5b 69 5d 20 2b 3d 20 27 61 27 20 2d 20 27 41  1[i] += 'a' - 'A
15660 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4b 32  ';.    }.    zK2
15670 20 3d 20 28 63 68 61 72 2a 29 70 68 6f 6e 65 74   = (char*)phonet
15680 69 63 48 61 73 68 28 28 63 6f 6e 73 74 20 75 6e  icHash((const un
15690 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 4b 31  signed char*)zK1
156a0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 4b  , i);.    if( zK
156b0 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  2==0 ){.      sq
156c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b 31 29 3b  lite3_free(zK1);
156d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
156e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
156f0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
15700 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
15710 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[0])==SQLITE_NU
15720 4c 4c 20 29 7b 0a 20 20 20 20 20 20 73 70 65 6c  LL ){.      spel
15730 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c  lfix1DbExec(&rc,
15740 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20   db,.           
15750 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c    "INSERT INTO \
15760 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62  "%w\".\"%w_vocab
15770 5c 22 28 72 61 6e 6b 2c 6c 61 6e 67 69 64 2c 77  \"(rank,langid,w
15780 6f 72 64 2c 6b 31 2c 6b 32 29 20 22 0a 20 20 20  ord,k1,k2) ".   
15790 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55 45            "VALUE
157a0 53 28 25 64 2c 25 64 2c 25 51 2c 25 51 2c 25 51  S(%d,%d,%Q,%Q,%Q
157b0 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
157c0 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e   p->zDbName, p->
157d0 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20  zTableName,.    
157e0 20 20 20 20 20 20 20 20 20 69 52 61 6e 6b 2c 20           iRank, 
157f0 69 4c 61 6e 67 2c 20 7a 57 6f 72 64 2c 20 7a 4b  iLang, zWord, zK
15800 31 2c 20 7a 4b 32 0a 20 20 20 20 20 20 29 3b 0a  1, zK2.      );.
15810 20 20 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20        *pRowid = 
15820 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
15830 65 72 74 5f 72 6f 77 69 64 28 64 62 29 3b 0a 20  ert_rowid(db);. 
15840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15850 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  rowid = sqlite3_
15860 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
15870 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6e 65 77 52  [0]);.      newR
15880 6f 77 69 64 20 3d 20 2a 70 52 6f 77 69 64 20 3d  owid = *pRowid =
15890 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
158a0 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a 20  nt64(argv[1]);. 
158b0 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62       spellfix1Db
158c0 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20  Exec(&rc, db,.  
158d0 20 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41             "UPDA
158e0 54 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76  TE \"%w\".\"%w_v
158f0 6f 63 61 62 5c 22 20 53 45 54 20 69 64 3d 25 6c  ocab\" SET id=%l
15900 6c 64 2c 20 72 61 6e 6b 3d 25 64 2c 20 6c 61 6e  ld, rank=%d, lan
15910 67 69 64 3d 25 64 2c 22 0a 20 20 20 20 20 20 20  gid=%d,".       
15920 20 20 20 20 20 20 22 20 77 6f 72 64 3d 25 51 2c        " word=%Q,
15930 20 6b 31 3d 25 51 2c 20 6b 32 3d 25 51 20 57 48   k1=%Q, k2=%Q WH
15940 45 52 45 20 69 64 3d 25 6c 6c 64 22 2c 0a 20 20  ERE id=%lld",.  
15950 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44             p->zD
15960 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65  bName, p->zTable
15970 4e 61 6d 65 2c 20 6e 65 77 52 6f 77 69 64 2c 20  Name, newRowid, 
15980 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 0a 20 20  iRank, iLang,.  
15990 20 20 20 20 20 20 20 20 20 20 20 7a 57 6f 72 64             zWord
159a0 2c 20 7a 4b 31 2c 20 7a 4b 32 2c 20 72 6f 77 69  , zK1, zK2, rowi
159b0 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  d.      );.    }
159c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
159d0 65 28 7a 4b 31 29 3b 0a 20 20 20 20 73 71 6c 69  e(zK1);.    sqli
159e0 74 65 33 5f 66 72 65 65 28 7a 4b 32 29 3b 0a 20  te3_free(zK2);. 
159f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15a00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 61 6d 65 20  }../*.** Rename 
15a10 74 68 65 20 73 70 65 6c 6c 66 69 78 31 20 74 61  the spellfix1 ta
15a20 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
15a30 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 65 6e 61  nt spellfix1Rena
15a40 6d 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  me(sqlite3_vtab 
15a50 2a 70 56 54 61 62 2c 20 63 6f 6e 73 74 20 63 68  *pVTab, const ch
15a60 61 72 20 2a 7a 4e 65 77 29 7b 0a 20 20 73 70 65  ar *zNew){.  spe
15a70 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d  llfix1_vtab *p =
15a80 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62   (spellfix1_vtab
15a90 2a 29 70 56 54 61 62 3b 0a 20 20 73 71 6c 69 74  *)pVTab;.  sqlit
15aa0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
15ab0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15ac0 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
15ad0 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  ewName = sqlite3
15ae0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
15af0 4e 65 77 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77  New);.  if( zNew
15b00 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Name==0 ){.    r
15b10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15b20 45 4d 3b 0a 20 20 7d 0a 20 20 73 70 65 6c 6c 66  EM;.  }.  spellf
15b30 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64  ix1DbExec(&rc, d
15b40 62 2c 20 0a 20 20 20 20 20 22 41 4c 54 45 52 20  b, .     "ALTER 
15b50 54 41 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25  TABLE \"%w\".\"%
15b60 77 5f 76 6f 63 61 62 5c 22 20 52 45 4e 41 4d 45  w_vocab\" RENAME
15b70 20 54 4f 20 5c 22 25 77 5f 76 6f 63 61 62 5c 22   TO \"%w_vocab\"
15b80 22 2c 0a 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61  ",.     p->zDbNa
15b90 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
15ba0 65 2c 20 7a 4e 65 77 4e 61 6d 65 0a 20 20 29 3b  e, zNewName.  );
15bb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15bc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
15bd0 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 61 62  te3_free(p->zTab
15be0 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  leName);.    p->
15bf0 7a 54 61 62 6c 65 4e 61 6d 65 20 3d 20 7a 4e 65  zTableName = zNe
15c00 77 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  wName;.  }else{.
15c10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15c20 28 7a 4e 65 77 4e 61 6d 65 29 3b 0a 20 20 7d 0a  (zNewName);.  }.
15c30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15c40 0a 2f 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c  ./*.** A virtual
15c50 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68   table module th
15c60 61 74 20 70 72 6f 76 69 64 65 73 20 66 75 7a 7a  at provides fuzz
15c70 79 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61  y search..*/.sta
15c80 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
15c90 6c 65 20 73 70 65 6c 6c 66 69 78 31 4d 6f 64 75  le spellfix1Modu
15ca0 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
15cd0 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 72 65 61  .  spellfix1Crea
15ce0 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  te,         /* x
15cf0 43 72 65 61 74 65 20 2d 20 68 61 6e 64 6c 65 20  Create - handle 
15d00 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
15d10 41 42 4c 45 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  ABLE */.  spellf
15d20 69 78 31 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  ix1Connect,     
15d30 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d     /* xConnect -
15d40 20 72 65 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20   reconnected to 
15d50 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
15d60 65 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  e */.  spellfix1
15d70 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
15d80 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20  /* xBestIndex - 
15d90 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74  figure out how t
15da0 6f 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a  o do a query */.
15db0 20 20 73 70 65 6c 6c 66 69 78 31 44 69 73 63 6f    spellfix1Disco
15dc0 6e 6e 65 63 74 2c 20 20 20 20 20 2f 2a 20 78 44  nnect,     /* xD
15dd0 69 73 63 6f 6e 6e 65 63 74 20 2d 20 63 6c 6f 73  isconnect - clos
15de0 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  e a connection *
15df0 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 44 65 73  /.  spellfix1Des
15e00 74 72 6f 79 2c 20 20 20 20 20 20 20 20 2f 2a 20  troy,        /* 
15e10 78 44 65 73 74 72 6f 79 20 2d 20 68 61 6e 64 6c  xDestroy - handl
15e20 65 20 44 52 4f 50 20 54 41 42 4c 45 20 2a 2f 0a  e DROP TABLE */.
15e30 20 20 73 70 65 6c 6c 66 69 78 31 4f 70 65 6e 2c    spellfix1Open,
15e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
15e50 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72  pen - open a cur
15e60 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  sor */.  spellfi
15e70 78 31 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  x1Close,        
15e80 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
15e90 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
15ea0 20 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65    spellfix1Filte
15eb0 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46  r,         /* xF
15ec0 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
15ed0 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
15ee0 74 73 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  ts */.  spellfix
15ef0 31 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  1Next,          
15f00 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
15f10 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
15f20 20 20 73 70 65 6c 6c 66 69 78 31 45 6f 66 2c 20    spellfix1Eof, 
15f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45             /* xE
15f40 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65  of - check for e
15f50 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20  nd of scan */.  
15f60 73 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c  spellfix1Column,
15f70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
15f80 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
15f90 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 6f  */.  spellfix1Ro
15fa0 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  wid,          /*
15fb0 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
15fc0 61 74 61 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  ata */.  spellfi
15fd0 78 31 55 70 64 61 74 65 2c 20 20 20 20 20 20 20  x1Update,       
15fe0 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a    /* xUpdate */.
15ff0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
16000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
16010 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  egin */.  0,    
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
16040 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
16050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
16060 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  mmit */.  0,    
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
16090 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
160b0 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a   xFindMethod */.
160c0 20 20 73 70 65 6c 6c 66 69 78 31 52 65 6e 61 6d    spellfix1Renam
160d0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52  e,         /* xR
160e0 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ename */.};../*.
160f0 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
16100 76 61 72 69 6f 75 73 20 66 75 6e 63 74 69 6f 6e  various function
16110 73 20 61 6e 64 20 74 68 65 20 76 69 72 74 75 61  s and the virtua
16120 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
16130 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
16140 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
16150 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
16160 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
16170 6e 74 20 69 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nt i;.  rc = sql
16180 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
16190 74 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66  tion(db, "spellf
161a0 69 78 31 5f 74 72 61 6e 73 6c 69 74 22 2c 20 31  ix1_translit", 1
161b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
161c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 74 72 61 6e 73 6c 69 74 65 72 61 74      transliterat
161f0 65 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  eSqlFunc, 0, 0);
16200 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
16220 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
16230 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 70  function(db, "sp
16240 65 6c 6c 66 69 78 31 5f 65 64 69 74 64 69 73 74  ellfix1_editdist
16250 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
16260 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 20 20 20 20 20 65 64 69 74 64 69 73 74          editdist
16290 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
162a0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
162b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
162c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
162d0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
162e0 22 73 70 65 6c 6c 66 69 78 31 5f 70 68 6f 6e 65  "spellfix1_phone
162f0 68 61 73 68 22 2c 20 31 2c 20 53 51 4c 49 54 45  hash", 1, SQLITE
16300 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 20 20 20 20 20 20 20 20 20 20 20 70 68 6f 6e              phon
16330 65 74 69 63 48 61 73 68 53 71 6c 46 75 6e 63 2c  eticHashSqlFunc,
16340 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
16350 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16360 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16370 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
16380 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69  ion(db, "spellfi
16390 78 31 5f 73 63 72 69 70 74 63 6f 64 65 22 2c 20  x1_scriptcode", 
163a0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
163b0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163d0 20 20 20 20 20 73 63 72 69 70 74 43 6f 64 65 53       scriptCodeS
163e0 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
163f0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
16400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
16410 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
16420 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73 70  e_module(db, "sp
16430 65 6c 6c 66 69 78 31 22 2c 20 26 73 70 65 6c 6c  ellfix1", &spell
16440 66 69 78 31 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a  fix1Module, 0);.
16450 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16470 63 20 3d 20 65 64 69 74 44 69 73 74 33 49 6e 73  c = editDist3Ins
16480 74 61 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  tall(db);.  }.. 
16490 20 2f 2a 20 56 65 72 69 66 79 20 73 61 6e 69 74   /* Verify sanit
164a0 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73 6c 69  y of the transli
164b0 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
164c0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
164d0 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65 6f  (translit)/sizeo
164e0 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 2d 31  f(translit[0])-1
164f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
16500 72 74 28 20 74 72 61 6e 73 6c 69 74 5b 69 5d 2e  rt( translit[i].
16510 63 46 72 6f 6d 3c 74 72 61 6e 73 6c 69 74 5b 69  cFrom<translit[i
16520 2b 31 5d 2e 63 46 72 6f 6d 20 29 3b 0a 20 20 7d  +1].cFrom );.  }
16530 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
16540 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
16550 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
16560 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  ABLE */../*.** E
16570 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20 66 75  xtension load fu
16580 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65  nction..*/.#ifde
16590 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73  f _WIN32.__decls
165a0 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23  pec(dllexport).#
165b0 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65  endif.int sqlite
165c0 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28  3_spellfix_init(
165d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
165e0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
165f0 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c  sg, .  const sql
16600 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
16610 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c  s *pApi.){.  SQL
16620 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
16630 49 54 32 28 70 41 70 69 29 3b 0a 23 69 66 6e 64  IT2(pApi);.#ifnd
16640 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
16650 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 72 65  IRTUALTABLE.  re
16660 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 52 65  turn spellfix1Re
16670 67 69 73 74 65 72 28 64 62 29 3b 0a 23 65 6e 64  gister(db);.#end
16680 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
16690 54 45 5f 4f 4b 3b 0a 7d 0a                       TE_OK;.}.