/ Hex Artifact Content
Login

Artifact 3548c433f473c2054e080b6382771636fcaa2c4c:


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 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28  spellfix1DbExec(
fbf0: 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 20  &rc, db,.       
fc00: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
fc10: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 5c 22  IF NOT EXISTS \"
fc20: 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c  %w\".\"%w_vocab\
fc30: 22 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22  "(\n".         "
fc40: 20 20 69 64 20 49 4e 54 45 47 45 52 20 50 52 49    id INTEGER PRI
fc50: 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20  MARY KEY,\n".   
fc60: 20 20 20 20 20 20 22 20 20 72 61 6e 6b 20 49 4e        "  rank IN
fc70: 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22  T,\n".         "
fc80: 20 20 6c 61 6e 67 69 64 20 49 4e 54 2c 5c 6e 22    langid INT,\n"
fc90: 0a 20 20 20 20 20 20 20 20 20 22 20 20 77 6f 72  .         "  wor
fca0: 64 20 54 45 58 54 2c 5c 6e 22 0a 20 20 20 20 20  d TEXT,\n".     
fcb0: 20 20 20 20 22 20 20 6b 31 20 54 45 58 54 2c 5c      "  k1 TEXT,\
fcc0: 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 6b  n".         "  k
fcd0: 32 20 54 45 58 54 5c 6e 22 0a 20 20 20 20 20 20  2 TEXT\n".      
fce0: 20 20 20 22 29 3b 5c 6e 22 2c 0a 20 20 20 20 20     ");\n",.     
fcf0: 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
fd00: 62 6c 65 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  bleName.      );
fd10: 0a 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31  .      spellfix1
fd20: 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a  DbExec(&rc, db,.
fd30: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
fd40: 20 49 4e 44 45 58 20 49 46 20 4e 4f 54 20 45 58   INDEX IF NOT EX
fd50: 49 53 54 53 20 5c 22 25 77 5c 22 2e 5c 22 25 77  ISTS \"%w\".\"%w
fd60: 5f 76 6f 63 61 62 5f 69 6e 64 65 78 5f 6c 61 6e  _vocab_index_lan
fd70: 67 69 64 5f 6b 32 5c 22 20 22 0a 20 20 20 20 20  gid_k2\" ".     
fd80: 20 20 20 20 20 20 20 22 4f 4e 20 5c 22 25 77 5f         "ON \"%w_
fd90: 76 6f 63 61 62 5c 22 28 6c 61 6e 67 69 64 2c 6b  vocab\"(langid,k
fda0: 32 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 7a  2);",.         z
fdb0: 44 62 4e 61 6d 65 2c 20 7a 4d 6f 64 75 6c 65 2c  DbName, zModule,
fdc0: 20 7a 54 61 62 6c 65 4e 61 6d 65 0a 20 20 20 20   zTableName.    
fdd0: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66    );.    }.    f
fde0: 6f 72 28 69 3d 33 3b 20 72 63 3d 3d 53 51 4c 49  or(i=3; rc==SQLI
fdf0: 54 45 5f 4f 4b 20 26 26 20 69 3c 61 72 67 63 3b  TE_OK && i<argc;
fe00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
fe10: 20 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 69 5d   strncmp(argv[i]
fe20: 2c 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62 6c  ,"edit_cost_tabl
fe30: 65 3d 22 2c 31 36 29 3d 3d 30 20 26 26 20 70 4e  e=",16)==0 && pN
fe40: 65 77 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d  ew->zCostTable==
fe50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  0 ){.        pNe
fe60: 77 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d 20  w->zCostTable = 
fe70: 73 70 65 6c 6c 66 69 78 31 44 65 71 75 6f 74 65  spellfix1Dequote
fe80: 28 26 61 72 67 76 5b 69 5d 5b 31 36 5d 29 3b 0a  (&argv[i][16]);.
fe90: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
fea0: 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d 30 20  ->zCostTable==0 
feb0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ) rc = SQLITE_NO
fec0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  MEM;.        con
fed0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
fee0: 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73 71       *pzErr = sq
fef0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 62  lite3_mprintf("b
ff00: 61 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  ad argument to s
ff10: 70 65 6c 6c 66 69 78 31 28 29 3a 20 5c 22 25 73  pellfix1(): \"%s
ff20: 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  \"", argv[i]);. 
ff30: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ff40: 5f 45 52 52 4f 52 3b 20 0a 20 20 20 20 7d 0a 20  _ERROR; .    }. 
ff50: 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26 20   }..  if( rc && 
ff60: 70 4e 65 77 20 29 7b 0a 20 20 20 20 2a 70 70 56  pNew ){.    *ppV
ff70: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 73 70 65  Tab = 0;.    spe
ff80: 6c 6c 66 69 78 31 55 6e 69 6e 69 74 28 30 2c 20  llfix1Uninit(0, 
ff90: 26 70 4e 65 77 2d 3e 62 61 73 65 29 3b 0a 20 20  &pNew->base);.  
ffa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 56 54  }else{.    *ppVT
ffb0: 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 74  ab = (sqlite3_vt
ffc0: 61 62 20 2a 29 70 4e 65 77 3b 0a 20 20 7d 0a 20  ab *)pNew;.  }. 
ffd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ffe0: 2a 0a 2a 2a 20 54 68 65 20 78 43 6f 6e 6e 65 63  *.** The xConnec
fff0: 74 20 61 6e 64 20 78 43 72 65 61 74 65 20 6d 65  t and xCreate me
10000 74 68 6f 64 73 0a 2a 2f 0a 73 74 61 74 69 63 20  thods.*/.static 
10010 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 6f 6e  int spellfix1Con
10020 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  nect(.  sqlite3 
10030 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
10040 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
10050 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
10060 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
10070 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a  _vtab **ppVTab,.
10080 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
10090 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c  {.  return spell
100a0 66 69 78 31 49 6e 69 74 28 30 2c 20 64 62 2c 20  fix1Init(0, db, 
100b0 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76  pAux, argc, argv
100c0 2c 20 70 70 56 54 61 62 2c 20 70 7a 45 72 72 29  , ppVTab, pzErr)
100d0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
100e0 70 65 6c 6c 66 69 78 31 43 72 65 61 74 65 28 0a  pellfix1Create(.
100f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
10100 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
10110 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
10120 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
10130 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
10140 2a 2a 70 70 56 54 61 62 2c 0a 20 20 63 68 61 72  **ppVTab,.  char
10150 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65   **pzErr.){.  re
10160 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 49 6e  turn spellfix1In
10170 69 74 28 31 2c 20 64 62 2c 20 70 41 75 78 2c 20  it(1, db, pAux, 
10180 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56 54  argc, argv, ppVT
10190 61 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f  ab, pzErr);.}../
101a0 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20 6f  *.** Clear all o
101b0 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 72  f the content fr
101c0 6f 6d 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  om a cursor..*/.
101d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c  static void spel
101e0 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f 72  lfix1ResetCursor
101f0 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
10200 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
10210 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
10220 70 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29  pCur->nRow; i++)
10230 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
10240 65 65 28 70 43 75 72 2d 3e 61 5b 69 5d 2e 7a 57  ee(pCur->a[i].zW
10250 6f 72 64 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  ord);.  }.  pCur
10260 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 70 43  ->nRow = 0;.  pC
10270 75 72 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20  ur->iRow = 0;.  
10280 70 43 75 72 2d 3e 6e 53 65 61 72 63 68 20 3d 20  pCur->nSearch = 
10290 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  0;.  if( pCur->p
102a0 46 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20  FullScan ){.    
102b0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
102c0 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e  (pCur->pFullScan
102d0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 46 75  );.    pCur->pFu
102e0 6c 6c 53 63 61 6e 20 3d 20 30 3b 0a 20 20 7d 0a  llScan = 0;.  }.
102f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20  }../*.** Resize 
10300 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 68 6f  the cursor to ho
10310 6c 64 20 75 70 20 74 6f 20 4e 20 72 6f 77 73 20  ld up to N rows 
10320 6f 66 20 63 6f 6e 74 65 6e 74 0a 2a 2f 0a 73 74  of content.*/.st
10330 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66  atic void spellf
10340 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28  ix1ResizeCursor(
10350 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
10360 20 2a 70 43 75 72 2c 20 69 6e 74 20 4e 29 7b 0a   *pCur, int N){.
10370 20 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69    struct spellfi
10380 78 31 5f 72 6f 77 20 2a 61 4e 65 77 3b 0a 20 20  x1_row *aNew;.  
10390 61 73 73 65 72 74 28 20 4e 3e 3d 70 43 75 72 2d  assert( N>=pCur-
103a0 3e 6e 52 6f 77 20 29 3b 0a 20 20 61 4e 65 77 20  >nRow );.  aNew 
103b0 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
103c0 63 28 70 43 75 72 2d 3e 61 2c 20 73 69 7a 65 6f  c(pCur->a, sizeo
103d0 66 28 70 43 75 72 2d 3e 61 5b 30 5d 29 2a 4e 29  f(pCur->a[0])*N)
103e0 3b 0a 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20  ;.  if( aNew==0 
103f0 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 73 70  && N>0 ){.    sp
10400 65 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73  ellfix1ResetCurs
10410 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 73 71  or(pCur);.    sq
10420 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
10430 3e 61 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e  >a);.    pCur->n
10440 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  Alloc = 0;.    p
10450 43 75 72 2d 3e 61 20 3d 20 30 3b 0a 20 20 7d 65  Cur->a = 0;.  }e
10460 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 6e  lse{.    pCur->n
10470 41 6c 6c 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70  Alloc = N;.    p
10480 43 75 72 2d 3e 61 20 3d 20 61 4e 65 77 3b 0a 20  Cur->a = aNew;. 
10490 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   }.}.../*.** Clo
104a0 73 65 20 61 20 66 75 7a 7a 79 2d 73 65 61 72 63  se a fuzzy-searc
104b0 68 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  h cursor..*/.sta
104c0 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
104d0 31 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  1Close(sqlite3_v
104e0 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
104f0 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  {.  spellfix1_cu
10500 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70  rsor *pCur = (sp
10510 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
10520 29 63 75 72 3b 0a 20 20 73 70 65 6c 6c 66 69 78  )cur;.  spellfix
10530 31 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75  1ResetCursor(pCu
10540 72 29 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52  r);.  spellfix1R
10550 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72  esizeCursor(pCur
10560 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
10570 66 72 65 65 28 70 43 75 72 2d 3e 7a 50 61 74 74  free(pCur->zPatt
10580 65 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ern);.  sqlite3_
10590 66 72 65 65 28 70 43 75 72 29 3b 0a 20 20 72 65  free(pCur);.  re
105a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
105b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
105c0 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
105d0 73 65 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  se forms:.**.** 
105e0 20 20 28 41 29 20 20 20 20 77 6f 72 64 20 4d 41    (A)    word MA
105f0 54 43 48 20 24 73 74 72 0a 2a 2a 20 20 20 28 42  TCH $str.**   (B
10600 29 20 20 20 20 6c 61 6e 67 69 64 20 3d 3d 20 24  )    langid == $
10610 6c 61 6e 67 69 64 0a 2a 2a 20 20 20 28 43 29 20  langid.**   (C) 
10620 20 20 20 74 6f 70 20 3d 20 24 74 6f 70 0a 2a 2a     top = $top.**
10630 20 20 20 28 44 29 20 20 20 20 73 63 6f 70 65 20     (D)    scope 
10640 3d 20 24 73 63 6f 70 65 0a 2a 2a 20 20 20 28 45  = $scope.**   (E
10650 29 20 20 20 20 64 69 73 74 61 6e 63 65 20 3c 20  )    distance < 
10660 24 64 69 73 74 61 6e 63 65 0a 2a 2a 20 20 20 28  $distance.**   (
10670 46 29 20 20 20 20 64 69 73 74 61 6e 63 65 20 3c  F)    distance <
10680 3d 20 24 64 69 73 74 61 6e 63 65 0a 2a 2a 20 20  = $distance.**  
10690 20 28 47 29 20 20 20 20 72 6f 77 69 64 20 3d 20   (G)    rowid = 
106a0 24 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 54 68 65  $rowid.**.** The
106b0 20 70 6c 61 6e 20 6e 75 6d 62 65 72 20 69 73 20   plan number is 
106c0 61 20 62 69 74 20 6d 61 73 6b 20 66 6f 72 6d 65  a bit mask forme
106d0 64 20 77 69 74 68 20 74 68 65 73 65 20 62 69 74  d with these bit
106e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 78 30 31 20  s:.**.**   0x01 
106f0 20 20 28 41 29 20 69 73 20 66 6f 75 6e 64 0a 2a    (A) is found.*
10700 2a 20 20 20 30 78 30 32 20 20 20 28 42 29 20 69  *   0x02   (B) i
10710 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 30  s found.**   0x0
10720 34 20 20 20 28 43 29 20 69 73 20 66 6f 75 6e 64  4   (C) is found
10730 0a 2a 2a 20 20 20 30 78 30 38 20 20 20 28 44 29  .**   0x08   (D)
10740 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30   is found.**   0
10750 78 31 30 20 20 20 28 45 29 20 69 73 20 66 6f 75  x10   (E) is fou
10760 6e 64 0a 2a 2a 20 20 20 30 78 32 30 20 20 20 28  nd.**   0x20   (
10770 46 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20  F) is found.**  
10780 20 30 78 34 30 20 20 20 28 47 29 20 69 73 20 66   0x40   (G) is f
10790 6f 75 6e 64 0a 2a 2a 0a 2a 2a 20 66 69 6c 74 65  ound.**.** filte
107a0 72 2e 61 72 67 76 5b 2a 5d 20 76 61 6c 75 65 73  r.argv[*] values
107b0 20 63 6f 6e 74 61 69 6e 73 20 24 73 74 72 2c 20   contains $str, 
107c0 24 6c 61 6e 67 69 64 2c 20 24 74 6f 70 2c 20 24  $langid, $top, $
107d0 73 63 6f 70 65 20 61 6e 64 20 24 72 6f 77 69 64  scope and $rowid
107e0 0a 2a 2a 20 69 66 20 73 70 65 63 69 66 69 65 64  .** if specified
107f0 20 61 6e 64 20 69 6e 20 74 68 61 74 20 6f 72 64   and in that ord
10800 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
10810 74 20 73 70 65 6c 6c 66 69 78 31 42 65 73 74 49  t spellfix1BestI
10820 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61  ndex(sqlite3_vta
10830 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f  b *tab, sqlite3_
10840 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
10850 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 50 6c  Info){.  int iPl
10860 61 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  an = 0;.  int iL
10870 61 6e 67 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20  angTerm = -1;.  
10880 69 6e 74 20 69 54 6f 70 54 65 72 6d 20 3d 20 2d  int iTopTerm = -
10890 31 3b 0a 20 20 69 6e 74 20 69 53 63 6f 70 65 54  1;.  int iScopeT
108a0 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  erm = -1;.  int 
108b0 69 44 69 73 74 54 65 72 6d 20 3d 20 2d 31 3b 0a  iDistTerm = -1;.
108c0 20 20 69 6e 74 20 69 52 6f 77 69 64 54 65 72 6d    int iRowidTerm
108d0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 3b 0a   = -1;.  int i;.
108e0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
108f0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
10900 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72  straint *pConstr
10910 61 69 6e 74 3b 0a 20 20 70 43 6f 6e 73 74 72 61  aint;.  pConstra
10920 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
10930 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66  aConstraint;.  f
10940 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e  or(i=0; i<pIdxIn
10950 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
10960 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e   i++, pConstrain
10970 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43  t++){.    if( pC
10980 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c  onstraint->usabl
10990 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
109a0 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f  ..    /* Terms o
109b0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 77 6f 72  f the form:  wor
109c0 64 20 4d 41 54 43 48 20 24 73 74 72 20 2a 2f 0a  d MATCH $str */.
109d0 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26      if( (iPlan &
109e0 20 31 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20   1)==0 .     && 
109f0 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f  pConstraint->iCo
10a00 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43  lumn==SPELLFIX_C
10a10 4f 4c 5f 57 4f 52 44 0a 20 20 20 20 20 26 26 20  OL_WORD.     && 
10a20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
10a30 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
10a40 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 0a 20  NSTRAINT_MATCH. 
10a50 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61     ){.      iPla
10a60 6e 20 7c 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  n |= 1;.      pI
10a70 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
10a80 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
10a90 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Index = 1;.     
10aa0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
10ab0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
10ac0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  mit = 1;.    }..
10ad0 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20      /* Terms of 
10ae0 74 68 65 20 66 6f 72 6d 3a 20 20 6c 61 6e 67 69  the form:  langi
10af0 64 20 3d 20 24 6c 61 6e 67 69 64 20 20 2a 2f 0a  d = $langid  */.
10b00 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26      if( (iPlan &
10b10 20 32 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70   2)==0.     && p
10b20 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
10b30 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f  umn==SPELLFIX_CO
10b40 4c 5f 4c 41 4e 47 49 44 0a 20 20 20 20 20 26 26  L_LANGID.     &&
10b50 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
10b60 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
10b70 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20  ONSTRAINT_EQ.   
10b80 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20   ){.      iPlan 
10b90 7c 3d 20 32 3b 0a 20 20 20 20 20 20 69 4c 61 6e  |= 2;.      iLan
10ba0 67 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d  gTerm = i;.    }
10bb0 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f  ..    /* Terms o
10bc0 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 74 6f 70  f the form:  top
10bd0 20 3d 20 24 74 6f 70 20 2a 2f 0a 20 20 20 20 69   = $top */.    i
10be0 66 28 20 28 69 50 6c 61 6e 20 26 20 34 29 3d 3d  f( (iPlan & 4)==
10bf0 30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74  0.     && pConst
10c00 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  raint->iColumn==
10c10 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54 4f 50  SPELLFIX_COL_TOP
10c20 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10c30 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  aint->op==SQLITE
10c40 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
10c50 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20  T_EQ.    ){.    
10c60 20 20 69 50 6c 61 6e 20 7c 3d 20 34 3b 0a 20 20    iPlan |= 4;.  
10c70 20 20 20 20 69 54 6f 70 54 65 72 6d 20 3d 20 69      iTopTerm = i
10c80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10c90 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  Terms of the for
10ca0 6d 3a 20 20 73 63 6f 70 65 20 3d 20 24 73 63 6f  m:  scope = $sco
10cb0 70 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69  pe */.    if( (i
10cc0 50 6c 61 6e 20 26 20 38 29 3d 3d 30 0a 20 20 20  Plan & 8)==0.   
10cd0 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
10ce0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c  ->iColumn==SPELL
10cf0 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 0a 20 20  FIX_COL_SCOPE.  
10d00 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e     && pConstrain
10d10 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t->op==SQLITE_IN
10d20 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
10d30 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  Q.    ){.      i
10d40 50 6c 61 6e 20 7c 3d 20 38 3b 0a 20 20 20 20 20  Plan |= 8;.     
10d50 20 69 53 63 6f 70 65 54 65 72 6d 20 3d 20 69 3b   iScopeTerm = i;
10d60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
10d70 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
10d80 3a 20 20 64 69 73 74 61 6e 63 65 20 3c 20 24 64  :  distance < $d
10d90 69 73 74 20 6f 72 20 64 69 73 74 61 6e 63 65 20  ist or distance 
10da0 3c 3d 20 24 64 69 73 74 20 2a 2f 0a 20 20 20 20  <= $dist */.    
10db0 69 66 28 20 28 69 50 6c 61 6e 20 26 20 28 31 36  if( (iPlan & (16
10dc0 7c 33 32 29 29 3d 3d 30 0a 20 20 20 20 20 26 26  |32))==0.     &&
10dd0 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43   pConstraint->iC
10de0 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f  olumn==SPELLFIX_
10df0 43 4f 4c 5f 44 49 53 54 41 4e 43 45 0a 20 20 20  COL_DISTANCE.   
10e00 20 20 26 26 20 28 70 43 6f 6e 73 74 72 61 69 6e    && (pConstrain
10e10 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t->op==SQLITE_IN
10e20 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
10e30 54 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  T.          || 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 45 29 0a 20 20 20 20  STRAINT_LE).    
10e70 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c  ){.      iPlan |
10e80 3d 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  = pConstraint->o
10e90 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
10ea0 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 3f 20  CONSTRAINT_LT ? 
10eb0 31 36 20 3a 20 33 32 3b 0a 20 20 20 20 20 20 69  16 : 32;.      i
10ec0 44 69 73 74 54 65 72 6d 20 3d 20 69 3b 0a 20 20  DistTerm = i;.  
10ed0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d    }..    /* Term
10ee0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
10ef0 64 69 73 74 61 6e 63 65 20 3c 20 24 64 69 73 74  distance < $dist
10f00 20 6f 72 20 64 69 73 74 61 6e 63 65 20 3c 3d 20   or distance <= 
10f10 24 64 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 28  $dist */.    if(
10f20 20 28 69 50 6c 61 6e 20 26 20 36 34 29 3d 3d 30   (iPlan & 64)==0
10f30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10f40 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a  aint->iColumn<0.
10f50 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
10f60 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  int->op==SQLITE_
10f70 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
10f80 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  _EQ.    ){.     
10f90 20 69 50 6c 61 6e 20 7c 3d 20 36 34 3b 0a 20 20   iPlan |= 64;.  
10fa0 20 20 20 20 69 52 6f 77 69 64 54 65 72 6d 20 3d      iRowidTerm =
10fb0 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   i;.    }.  }.  
10fc0 69 66 28 20 69 50 6c 61 6e 26 31 20 29 7b 0a 20  if( iPlan&1 ){. 
10fd0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 32 3b 0a     int idx = 2;.
10fe0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
10ff0 78 4e 75 6d 20 3d 20 69 50 6c 61 6e 3b 0a 20 20  xNum = iPlan;.  
11000 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
11010 6e 4f 72 64 65 72 42 79 3d 3d 31 0a 20 20 20 20  nOrderBy==1.    
11020 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f   && pIdxInfo->aO
11030 72 64 65 72 42 79 5b 30 5d 2e 69 43 6f 6c 75 6d  rderBy[0].iColum
11040 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  n==SPELLFIX_COL_
11050 53 43 4f 52 45 0a 20 20 20 20 20 26 26 20 70 49  SCORE.     && pI
11060 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79  dxInfo->aOrderBy
11070 5b 30 5d 2e 64 65 73 63 3d 3d 30 0a 20 20 20 20  [0].desc==0.    
11080 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  ){.      pIdxInf
11090 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
110a0 65 64 20 3d 20 31 3b 20 20 2f 2a 20 44 65 66 61  ed = 1;  /* Defa
110b0 75 6c 74 20 6f 72 64 65 72 20 62 79 20 69 53 63  ult order by iSc
110c0 6f 72 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ore */.    }.   
110d0 20 69 66 28 20 69 50 6c 61 6e 26 32 20 29 7b 0a   if( iPlan&2 ){.
110e0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
110f0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
11100 5b 69 4c 61 6e 67 54 65 72 6d 5d 2e 61 72 67 76  [iLangTerm].argv
11110 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20  Index = idx++;. 
11120 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61       pIdxInfo->a
11130 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
11140 69 4c 61 6e 67 54 65 72 6d 5d 2e 6f 6d 69 74 20  iLangTerm].omit 
11150 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
11160 66 28 20 69 50 6c 61 6e 26 34 20 29 7b 0a 20 20  f( iPlan&4 ){.  
11170 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
11180 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
11190 54 6f 70 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64  TopTerm].argvInd
111a0 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20  ex = idx++;.    
111b0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
111c0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 54 6f  straintUsage[iTo
111d0 70 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b  pTerm].omit = 1;
111e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
111f0 50 6c 61 6e 26 38 20 29 7b 0a 20 20 20 20 20 20  Plan&8 ){.      
11200 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
11210 72 61 69 6e 74 55 73 61 67 65 5b 69 53 63 6f 70  raintUsage[iScop
11220 65 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78  eTerm].argvIndex
11230 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20   = idx++;.      
11240 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
11250 72 61 69 6e 74 55 73 61 67 65 5b 69 53 63 6f 70  raintUsage[iScop
11260 65 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b  eTerm].omit = 1;
11270 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
11280 50 6c 61 6e 26 28 31 36 7c 33 32 29 20 29 7b 0a  Plan&(16|32) ){.
11290 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
112a0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
112b0 5b 69 44 69 73 74 54 65 72 6d 5d 2e 61 72 67 76  [iDistTerm].argv
112c0 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20  Index = idx++;. 
112d0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61       pIdxInfo->a
112e0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
112f0 69 44 69 73 74 54 65 72 6d 5d 2e 6f 6d 69 74 20  iDistTerm].omit 
11300 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
11310 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
11320 65 64 43 6f 73 74 20 3d 20 31 65 35 3b 0a 20 20  edCost = 1e5;.  
11330 7d 65 6c 73 65 20 69 66 28 20 28 69 50 6c 61 6e  }else if( (iPlan
11340 20 26 20 36 34 29 20 29 7b 0a 20 20 20 20 70 49   & 64) ){.    pI
11350 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
11360 20 36 34 3b 0a 20 20 20 20 70 49 64 78 49 6e 66   64;.    pIdxInf
11370 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11380 61 67 65 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e  age[iRowidTerm].
11390 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20  argvIndex = 1;. 
113a0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
113b0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 52  nstraintUsage[iR
113c0 6f 77 69 64 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d  owidTerm].omit =
113d0 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   1;.    pIdxInfo
113e0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
113f0 3d 20 35 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 5;.  }else{.  
11400 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
11410 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
11420 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
11430 6f 73 74 20 3d 20 31 65 35 30 3b 0a 20 20 7d 0a  ost = 1e50;.  }.
11440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11450 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  OK;.}../*.** Ope
11460 6e 20 61 20 6e 65 77 20 66 75 7a 7a 79 2d 73 65  n a new fuzzy-se
11470 61 72 63 68 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  arch cursor..*/.
11480 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
11490 66 69 78 31 4f 70 65 6e 28 73 71 6c 69 74 65 33  fix1Open(sqlite3
114a0 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71  _vtab *pVTab, sq
114b0 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
114c0 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20  r **ppCursor){. 
114d0 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20   spellfix1_vtab 
114e0 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f  *p = (spellfix1_
114f0 76 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 73  vtab*)pVTab;.  s
11500 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
11510 2a 70 43 75 72 3b 0a 20 20 70 43 75 72 20 3d 20  *pCur;.  pCur = 
11520 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
11530 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b  sizeof(*pCur) );
11540 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29  .  if( pCur==0 )
11550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11560 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
11570 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  Cur, 0, sizeof(*
11580 70 43 75 72 29 29 3b 0a 20 20 70 43 75 72 2d 3e  pCur));.  pCur->
11590 70 56 54 61 62 20 3d 20 70 3b 0a 20 20 2a 70 70  pVTab = p;.  *pp
115a0 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d 3e  Cursor = &pCur->
115b0 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  base;.  return S
115c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
115d0 2a 2a 20 41 64 6a 75 73 74 20 61 20 64 69 73 74  ** Adjust a dist
115e0 61 6e 63 65 20 6d 65 61 73 75 72 65 6d 65 6e 74  ance measurement
115f0 20 62 79 20 74 68 65 20 77 6f 72 64 73 20 72 61   by the words ra
11600 6e 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  nk in order to s
11610 68 6f 77 0a 2a 2a 20 70 72 65 66 65 72 65 6e 63  how.** preferenc
11620 65 20 74 6f 20 63 6f 6d 6d 6f 6e 20 77 6f 72 64  e to common word
11630 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
11640 20 73 70 65 6c 6c 66 69 78 31 53 63 6f 72 65 28   spellfix1Score(
11650 69 6e 74 20 69 44 69 73 74 61 6e 63 65 2c 20 69  int iDistance, i
11660 6e 74 20 69 52 61 6e 6b 29 7b 0a 20 20 69 6e 74  nt iRank){.  int
11670 20 69 4c 6f 67 32 3b 0a 20 20 66 6f 72 28 69 4c   iLog2;.  for(iL
11680 6f 67 32 3d 30 3b 20 69 52 61 6e 6b 3e 30 3b 20  og2=0; iRank>0; 
11690 69 4c 6f 67 32 2b 2b 2c 20 69 52 61 6e 6b 3e 3e  iLog2++, iRank>>
116a0 3d 31 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69  =1){}.  return i
116b0 44 69 73 74 61 6e 63 65 20 2b 20 33 32 20 2d 20  Distance + 32 - 
116c0 69 4c 6f 67 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iLog2;.}../*.** 
116d0 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 70 65 6c  Compare two spel
116e0 6c 66 69 78 31 5f 72 6f 77 20 6f 62 6a 65 63 74  lfix1_row object
116f0 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
11700 72 70 6f 73 65 73 20 69 6e 20 71 73 6f 72 74 28  rposes in qsort(
11710 29 20 73 75 63 68 0a 2a 2a 20 74 68 61 74 20 74  ) such.** that t
11720 68 65 79 20 73 6f 72 74 20 69 6e 20 6f 72 64 65  hey sort in orde
11730 72 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20  r of increasing 
11740 64 69 73 74 61 6e 63 65 2e 0a 2a 2f 0a 73 74 61  distance..*/.sta
11750 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
11760 31 52 6f 77 43 6f 6d 70 61 72 65 28 63 6f 6e 73  1RowCompare(cons
11770 74 20 76 6f 69 64 20 2a 41 2c 20 63 6f 6e 73 74  t void *A, const
11780 20 76 6f 69 64 20 2a 42 29 7b 0a 20 20 63 6f 6e   void *B){.  con
11790 73 74 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66  st struct spellf
117a0 69 78 31 5f 72 6f 77 20 2a 61 20 3d 20 28 63 6f  ix1_row *a = (co
117b0 6e 73 74 20 73 74 72 75 63 74 20 73 70 65 6c 6c  nst struct spell
117c0 66 69 78 31 5f 72 6f 77 2a 29 41 3b 0a 20 20 63  fix1_row*)A;.  c
117d0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70 65 6c  onst struct spel
117e0 6c 66 69 78 31 5f 72 6f 77 20 2a 62 20 3d 20 28  lfix1_row *b = (
117f0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70 65  const struct spe
11800 6c 6c 66 69 78 31 5f 72 6f 77 2a 29 42 3b 0a 20  llfix1_row*)B;. 
11810 20 72 65 74 75 72 6e 20 61 2d 3e 69 53 63 6f 72   return a->iScor
11820 65 20 2d 20 62 2d 3e 69 53 63 6f 72 65 3b 0a 7d  e - b->iScore;.}
11830 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74  ../*.** A struct
11840 75 72 65 20 75 73 65 64 20 74 6f 20 70 61 73 73  ure used to pass
11850 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
11860 6d 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65  m spellfix1Filte
11870 72 46 6f 72 4d 61 74 63 68 28 29 0a 2a 2a 20 69  rForMatch().** i
11880 6e 74 6f 20 73 70 65 6c 6c 66 69 78 31 52 75 6e  nto spellfix1Run
11890 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 74 79 70 65  Query()..*/.type
118a0 64 65 66 20 73 74 72 75 63 74 20 4d 61 74 63 68  def struct Match
118b0 51 75 65 72 79 20 7b 0a 20 20 73 70 65 6c 6c 66  Query {.  spellf
118c0 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
118d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
118e0 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 71  e cursor being q
118f0 75 65 72 69 65 64 20 2a 2f 0a 20 20 73 71 6c 69  ueried */.  sqli
11900 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11920 73 68 61 64 6f 77 20 74 61 62 6c 65 20 71 75 65  shadow table que
11930 72 79 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20  ry statment */. 
11940 20 63 68 61 72 20 7a 48 61 73 68 5b 53 50 45 4c   char zHash[SPEL
11950 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 20  LFIX_MX_HASH];  
11960 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
11970 20 70 68 6f 6e 65 68 61 73 68 20 66 6f 72 20 7a   phonehash for z
11980 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e  Pattern */.  con
11990 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72  st char *zPatter
119a0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
119b0 20 54 72 61 6e 73 6c 69 74 65 72 61 74 65 64 20   Transliterated 
119c0 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a  input string */.
119d0 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20    int nPattern; 
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
11a00 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 45 64  zPattern */.  Ed
11a10 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
11a20 67 20 2a 70 4d 61 74 63 68 53 74 72 33 3b 20 2f  g *pMatchStr3; /
11a30 2a 20 4f 72 69 67 69 6e 61 6c 20 75 6e 69 63 6f  * Original unico
11a40 64 65 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 45  de string */.  E
11a50 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a  ditDist3Config *
11a60 70 43 6f 6e 66 69 67 33 3b 20 20 20 20 20 20 20  pConfig3;       
11a70 2f 2a 20 45 64 69 74 2d 64 69 73 74 61 6e 63 65  /* Edit-distance
11a80 20 63 6f 73 74 20 63 6f 65 66 66 69 63 69 65 6e   cost coefficien
11a90 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 64  ts */.  const Ed
11aa0 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61  itDist3Lang *pLa
11ab0 6e 67 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ng;      /* The 
11ac0 73 65 6c 65 63 74 65 64 20 6c 61 6e 67 75 61 67  selected languag
11ad0 65 20 63 6f 65 66 66 69 63 69 65 6e 74 73 20 2a  e coefficients *
11ae0 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20  /.  int iLang;  
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 6e 67       /* The lang
11b10 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74  uage id */.  int
11b20 20 69 53 63 6f 70 65 3b 20 20 20 20 20 20 20 20   iScope;        
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b40 20 44 65 66 61 75 6c 74 20 73 63 6f 70 65 20 2a   Default scope *
11b50 2f 0a 20 20 69 6e 74 20 69 4d 61 78 44 69 73 74  /.  int iMaxDist
11b60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11b70 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
11b80 61 6c 6c 6f 77 65 64 20 65 64 69 74 20 64 69 73  allowed edit dis
11b90 74 61 6e 63 65 2c 20 6f 72 20 2d 31 20 2a 2f 0a  tance, or -1 */.
11ba0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
11bd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 75 6e 3b 20   */.  int nRun; 
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72   /* Number of pr
11c00 69 6f 72 20 72 75 6e 73 20 66 6f 72 20 74 68 65  ior runs for the
11c10 20 73 61 6d 65 20 7a 50 61 74 74 65 72 6e 20 2a   same zPattern *
11c20 2f 0a 20 20 63 68 61 72 20 61 7a 50 72 69 6f 72  /.  char azPrior
11c30 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e  [SPELLFIX_MX_RUN
11c40 5d 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41  ][SPELLFIX_MX_HA
11c50 53 48 5d 3b 20 20 2f 2a 20 50 72 69 6f 72 20 68  SH];  /* Prior h
11c60 61 73 68 65 73 20 2a 2f 0a 7d 20 4d 61 74 63 68  ashes */.} Match
11c70 51 75 65 72 79 3b 0a 0a 2f 2a 0a 2a 2a 20 52 75  Query;../*.** Ru
11c80 6e 20 61 20 71 75 65 72 79 20 6c 6f 6f 6b 69 6e  n a query lookin
11c90 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 20 6d  g for the best m
11ca0 61 74 63 68 65 73 20 61 67 61 69 6e 73 74 20 7a  atches against z
11cb0 50 61 74 74 65 72 6e 20 75 73 69 6e 67 0a 2a 2a  Pattern using.**
11cc0 20 7a 48 61 73 68 20 61 73 20 74 68 65 20 63 68   zHash as the ch
11cd0 61 72 61 63 74 65 72 20 63 6c 61 73 73 20 73 65  aracter class se
11ce0 65 64 20 68 61 73 68 2e 0a 2a 2f 0a 73 74 61 74  ed hash..*/.stat
11cf0 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66 69 78  ic void spellfix
11d00 31 52 75 6e 51 75 65 72 79 28 4d 61 74 63 68 51  1RunQuery(MatchQ
11d10 75 65 72 79 20 2a 70 2c 20 63 6f 6e 73 74 20 63  uery *p, const c
11d20 68 61 72 20 2a 7a 51 75 65 72 79 2c 20 69 6e 74  har *zQuery, int
11d30 20 6e 51 75 65 72 79 29 7b 0a 20 20 63 6f 6e 73   nQuery){.  cons
11d40 74 20 63 68 61 72 20 2a 7a 4b 31 3b 0a 20 20 63  t char *zK1;.  c
11d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
11d60 3b 0a 20 20 69 6e 74 20 69 44 69 73 74 3b 0a 20  ;.  int iDist;. 
11d70 20 69 6e 74 20 69 52 61 6e 6b 3b 0a 20 20 69 6e   int iRank;.  in
11d80 74 20 69 53 63 6f 72 65 3b 0a 20 20 69 6e 74 20  t iScore;.  int 
11d90 69 57 6f 72 73 74 20 3d 20 30 3b 0a 20 20 69 6e  iWorst = 0;.  in
11da0 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 69 64 78  t idx;.  int idx
11db0 57 6f 72 73 74 20 3d 20 2d 31 3b 0a 20 20 69 6e  Worst = -1;.  in
11dc0 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 63 6f 70  t i;.  int iScop
11dd0 65 20 3d 20 70 2d 3e 69 53 63 6f 70 65 3b 0a 20  e = p->iScope;. 
11de0 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
11df0 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e 70 43 75  r *pCur = p->pCu
11e00 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  r;.  sqlite3_stm
11e10 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 53  t *pStmt = p->pS
11e20 74 6d 74 3b 0a 20 20 63 68 61 72 20 7a 48 61 73  tmt;.  char zHas
11e30 68 31 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48  h1[SPELLFIX_MX_H
11e40 41 53 48 5d 3b 0a 20 20 63 68 61 72 20 7a 48 61  ASH];.  char zHa
11e50 73 68 32 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  sh2[SPELLFIX_MX_
11e60 48 41 53 48 5d 3b 0a 20 20 63 68 61 72 20 2a 7a  HASH];.  char *z
11e70 43 6c 61 73 73 3b 0a 20 20 69 6e 74 20 6e 43 6c  Class;.  int nCl
11e80 61 73 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ass;.  int rc;..
11e90 20 20 69 66 28 20 70 43 75 72 2d 3e 61 3d 3d 30    if( pCur->a==0
11ea0 20 7c 7c 20 70 2d 3e 72 63 20 29 20 72 65 74 75   || p->rc ) retu
11eb0 72 6e 3b 20 20 20 2f 2a 20 50 72 69 6f 72 20 6d  rn;   /* Prior m
11ec0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
11ed0 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 7a 43   failure */.  zC
11ee0 6c 61 73 73 20 3d 20 28 63 68 61 72 2a 29 70 68  lass = (char*)ph
11ef0 6f 6e 65 74 69 63 48 61 73 68 28 28 75 6e 73 69  oneticHash((unsi
11f00 67 6e 65 64 20 63 68 61 72 2a 29 7a 51 75 65 72  gned char*)zQuer
11f10 79 2c 20 6e 51 75 65 72 79 29 3b 0a 20 20 69 66  y, nQuery);.  if
11f20 28 20 7a 43 6c 61 73 73 3d 3d 30 20 29 7b 0a 20  ( zClass==0 ){. 
11f30 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
11f40 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74  E_NOMEM;.    ret
11f50 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 43 6c 61 73  urn;.  }.  nClas
11f60 73 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  s = (int)strlen(
11f70 7a 43 6c 61 73 73 29 3b 0a 20 20 69 66 28 20 6e  zClass);.  if( n
11f80 43 6c 61 73 73 3e 53 50 45 4c 4c 46 49 58 5f 4d  Class>SPELLFIX_M
11f90 58 5f 48 41 53 48 2d 32 20 29 7b 0a 20 20 20 20  X_HASH-2 ){.    
11fa0 6e 43 6c 61 73 73 20 3d 20 53 50 45 4c 4c 46 49  nClass = SPELLFI
11fb0 58 5f 4d 58 5f 48 41 53 48 2d 32 3b 0a 20 20 20  X_MX_HASH-2;.   
11fc0 20 7a 43 6c 61 73 73 5b 6e 43 6c 61 73 73 5d 20   zClass[nClass] 
11fd0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
11fe0 43 6c 61 73 73 3c 3d 69 53 63 6f 70 65 20 29 7b  Class<=iScope ){
11ff0 0a 20 20 20 20 69 66 28 20 6e 43 6c 61 73 73 3e  .    if( nClass>
12000 32 20 29 7b 0a 20 20 20 20 20 20 69 53 63 6f 70  2 ){.      iScop
12010 65 20 3d 20 6e 43 6c 61 73 73 2d 31 3b 0a 20 20  e = nClass-1;.  
12020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
12030 53 63 6f 70 65 20 3d 20 6e 43 6c 61 73 73 3b 0a  Scope = nClass;.
12040 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 63      }.  }.  memc
12050 70 79 28 7a 48 61 73 68 31 2c 20 7a 43 6c 61 73  py(zHash1, zClas
12060 73 2c 20 69 53 63 6f 70 65 29 3b 0a 20 20 73 71  s, iScope);.  sq
12070 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6c 61 73  lite3_free(zClas
12080 73 29 3b 0a 20 20 7a 48 61 73 68 31 5b 69 53 63  s);.  zHash1[iSc
12090 6f 70 65 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 63  ope] = 0;.  memc
120a0 70 79 28 7a 48 61 73 68 32 2c 20 7a 48 61 73 68  py(zHash2, zHash
120b0 31 2c 20 69 53 63 6f 70 65 29 3b 0a 20 20 7a 48  1, iScope);.  zH
120c0 61 73 68 32 5b 69 53 63 6f 70 65 5d 20 3d 20 27  ash2[iScope] = '
120d0 5a 27 3b 0a 20 20 7a 48 61 73 68 32 5b 69 53 63  Z';.  zHash2[iSc
120e0 6f 70 65 2b 31 5d 20 3d 20 30 3b 0a 23 69 66 20  ope+1] = 0;.#if 
120f0 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 3e  SPELLFIX_MX_RUN>
12100 31 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  1.  for(i=0; i<p
12110 2d 3e 6e 52 75 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ->nRun; i++){.  
12120 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e    if( strcmp(p->
12130 61 7a 50 72 69 6f 72 5b 69 5d 2c 20 7a 48 61 73  azPrior[i], zHas
12140 68 31 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  h1)==0 ) return;
12150 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73  .  }.#endif.  as
12160 73 65 72 74 28 20 70 2d 3e 6e 52 75 6e 3c 53 50  sert( p->nRun<SP
12170 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 20 29 3b  ELLFIX_MX_RUN );
12180 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 50  .  memcpy(p->azP
12190 72 69 6f 72 5b 70 2d 3e 6e 52 75 6e 2b 2b 5d 2c  rior[p->nRun++],
121a0 20 7a 48 61 73 68 31 2c 20 69 53 63 6f 70 65 2b   zHash1, iScope+
121b0 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  1);.  if( sqlite
121c0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
121d0 74 2c 20 31 2c 20 7a 48 61 73 68 31 2c 20 2d 31  t, 1, zHash1, -1
121e0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
121f0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  ==SQLITE_NOMEM. 
12200 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 62 69 6e    || sqlite3_bin
12210 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 2c  d_text(pStmt, 2,
12220 20 7a 48 61 73 68 32 2c 20 2d 31 2c 20 53 51 4c   zHash2, -1, SQL
12230 49 54 45 5f 53 54 41 54 49 43 29 3d 3d 53 51 4c  ITE_STATIC)==SQL
12240 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 29 7b 0a 20  ITE_NOMEM.  ){. 
12250 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
12260 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74  E_NOMEM;.    ret
12270 75 72 6e 3b 0a 20 20 7d 0a 23 69 66 20 53 50 45  urn;.  }.#if SPE
12280 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 3e 31 0a 20  LLFIX_MX_RUN>1. 
12290 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72   for(i=0; i<pCur
122a0 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  ->nRow; i++){.  
122b0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 5b 69 5d    if( pCur->a[i]
122c0 2e 69 53 63 6f 72 65 3e 69 57 6f 72 73 74 20 29  .iScore>iWorst )
122d0 7b 0a 20 20 20 20 20 20 69 57 6f 72 73 74 20 3d  {.      iWorst =
122e0 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f   pCur->a[i].iSco
122f0 72 65 3b 0a 20 20 20 20 20 20 69 64 78 57 6f 72  re;.      idxWor
12300 73 74 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  st = i;.    }.  
12310 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c 65  }.#endif.  while
12320 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
12330 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
12340 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61  W ){.    int iMa
12350 74 63 68 6c 65 6e 20 3d 20 2d 31 3b 0a 20 20 20  tchlen = -1;.   
12360 20 69 52 61 6e 6b 20 3d 20 73 71 6c 69 74 65 33   iRank = sqlite3
12370 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
12380 74 2c 20 32 29 3b 0a 20 20 20 20 69 66 28 20 70  t, 2);.    if( p
12390 2d 3e 70 4d 61 74 63 68 53 74 72 33 20 29 7b 0a  ->pMatchStr3 ){.
123a0 20 20 20 20 20 20 69 6e 74 20 6e 57 6f 72 64 20        int nWord 
123b0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
123c0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29  _bytes(pStmt, 1)
123d0 3b 0a 20 20 20 20 20 20 7a 57 6f 72 64 20 3d 20  ;.      zWord = 
123e0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
123f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
12400 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
12410 20 20 69 44 69 73 74 20 3d 20 65 64 69 74 44 69    iDist = editDi
12420 73 74 33 43 6f 72 65 28 70 2d 3e 70 4d 61 74 63  st3Core(p->pMatc
12430 68 53 74 72 33 2c 20 7a 57 6f 72 64 2c 20 6e 57  hStr3, zWord, nW
12440 6f 72 64 2c 20 70 2d 3e 70 4c 61 6e 67 2c 20 26  ord, p->pLang, &
12450 69 4d 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20  iMatchlen);.    
12460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 31  }else{.      zK1
12470 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
12480 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
12490 65 78 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20  ext(pStmt, 3);. 
124a0 20 20 20 20 20 69 66 28 20 7a 4b 31 3d 3d 30 20       if( zK1==0 
124b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
124c0 20 20 69 44 69 73 74 20 3d 20 65 64 69 74 64 69    iDist = editdi
124d0 73 74 31 28 70 2d 3e 7a 50 61 74 74 65 72 6e 2c  st1(p->zPattern,
124e0 20 7a 4b 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a   zK1, 0);.    }.
124f0 20 20 20 20 69 66 28 20 69 44 69 73 74 3c 30 20      if( iDist<0 
12500 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
12510 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12530 7d 0a 20 20 20 20 70 43 75 72 2d 3e 6e 53 65 61  }.    pCur->nSea
12540 72 63 68 2b 2b 3b 0a 20 20 20 20 69 53 63 6f 72  rch++;.    iScor
12550 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 53 63 6f  e = spellfix1Sco
12560 72 65 28 69 44 69 73 74 2c 69 52 61 6e 6b 29 3b  re(iDist,iRank);
12570 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 4d 61 78  .    if( p->iMax
12580 44 69 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  Dist>=0 ){.     
12590 20 69 66 28 20 69 44 69 73 74 3e 70 2d 3e 69 4d   if( iDist>p->iM
125a0 61 78 44 69 73 74 20 29 20 63 6f 6e 74 69 6e 75  axDist ) continu
125b0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  e;.      if( pCu
125c0 72 2d 3e 6e 52 6f 77 3e 3d 70 43 75 72 2d 3e 6e  r->nRow>=pCur->n
125d0 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20  Alloc-1 ){.     
125e0 20 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 69     spellfix1Resi
125f0 7a 65 43 75 72 73 6f 72 28 70 43 75 72 2c 20 70  zeCursor(pCur, p
12600 43 75 72 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  Cur->nAlloc*2 + 
12610 31 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  10);.        if(
12620 20 70 43 75 72 2d 3e 61 3d 3d 30 20 29 20 62 72   pCur->a==0 ) br
12630 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
12640 20 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 6e     idx = pCur->n
12650 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Row;.    }else i
12660 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3c 70 43  f( pCur->nRow<pC
12670 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  ur->nAlloc ){.  
12680 20 20 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e      idx = pCur->
12690 6e 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nRow;.    }else 
126a0 69 66 28 20 69 53 63 6f 72 65 3c 69 57 6f 72 73  if( iScore<iWors
126b0 74 20 29 7b 0a 20 20 20 20 20 20 69 64 78 20 3d  t ){.      idx =
126c0 20 69 64 78 57 6f 72 73 74 3b 0a 20 20 20 20 20   idxWorst;.     
126d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
126e0 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64  ur->a[idx].zWord
126f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12700 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
12710 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b    }.    pCur->a[
12720 69 64 78 5d 2e 7a 57 6f 72 64 20 3d 20 73 71 6c  idx].zWord = sql
12730 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
12740 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
12750 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
12760 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
12770 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64 3d 3d 30  >a[idx].zWord==0
12780 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
12790 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
127a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
127b0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69   }.    pCur->a[i
127c0 64 78 5d 2e 69 52 6f 77 69 64 20 3d 20 73 71 6c  dx].iRowid = sql
127d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
127e0 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  4(pStmt, 0);.   
127f0 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 52   pCur->a[idx].iR
12800 61 6e 6b 20 3d 20 69 52 61 6e 6b 3b 0a 20 20 20  ank = iRank;.   
12810 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 44   pCur->a[idx].iD
12820 69 73 74 61 6e 63 65 20 3d 20 69 44 69 73 74 3b  istance = iDist;
12830 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78  .    pCur->a[idx
12840 5d 2e 69 53 63 6f 72 65 20 3d 20 69 53 63 6f 72  ].iScore = iScor
12850 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69  e;.    pCur->a[i
12860 64 78 5d 2e 69 4d 61 74 63 68 6c 65 6e 20 3d 20  dx].iMatchlen = 
12870 69 4d 61 74 63 68 6c 65 6e 3b 0a 20 20 20 20 6d  iMatchlen;.    m
12880 65 6d 63 70 79 28 70 43 75 72 2d 3e 61 5b 69 64  emcpy(pCur->a[id
12890 78 5d 2e 7a 48 61 73 68 2c 20 7a 48 61 73 68 31  x].zHash, zHash1
128a0 2c 20 69 53 63 6f 70 65 2b 31 29 3b 0a 20 20 20  , iScope+1);.   
128b0 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3c   if( pCur->nRow<
128c0 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29 20 70  pCur->nAlloc ) p
128d0 43 75 72 2d 3e 6e 52 6f 77 2b 2b 3b 0a 20 20 20  Cur->nRow++;.   
128e0 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3d   if( pCur->nRow=
128f0 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  =pCur->nAlloc ){
12900 0a 20 20 20 20 20 20 69 57 6f 72 73 74 20 3d 20  .      iWorst = 
12910 70 43 75 72 2d 3e 61 5b 30 5d 2e 69 53 63 6f 72  pCur->a[0].iScor
12920 65 3b 0a 20 20 20 20 20 20 69 64 78 57 6f 72 73  e;.      idxWors
12930 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  t = 0;.      for
12940 28 69 3d 31 3b 20 69 3c 70 43 75 72 2d 3e 6e 52  (i=1; i<pCur->nR
12950 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; i++){.      
12960 20 20 69 53 63 6f 72 65 20 3d 20 70 43 75 72 2d    iScore = pCur-
12970 3e 61 5b 69 5d 2e 69 53 63 6f 72 65 3b 0a 20 20  >a[i].iScore;.  
12980 20 20 20 20 20 20 69 66 28 20 69 57 6f 72 73 74        if( iWorst
12990 3c 69 53 63 6f 72 65 20 29 7b 0a 20 20 20 20 20  <iScore ){.     
129a0 20 20 20 20 20 69 57 6f 72 73 74 20 3d 20 69 53       iWorst = iS
129b0 63 6f 72 65 3b 0a 20 20 20 20 20 20 20 20 20 20  core;.          
129c0 69 64 78 57 6f 72 73 74 20 3d 20 69 3b 0a 20 20  idxWorst = i;.  
129d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
129e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
129f0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
12a00 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Stmt);.  if( rc 
12a10 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a  ) p->rc = rc;.}.
12a20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
12a30 69 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74  ion of the xFilt
12a40 65 72 20 6d 65 74 68 6f 64 20 77 6f 72 6b 20 69  er method work i
12a50 66 20 74 68 65 20 4d 41 54 43 48 20 74 65 72 6d  f the MATCH term
12a60 20 69 73 20 70 72 65 73 65 6e 74 0a 2a 2a 20 61   is present.** a
12a70 6e 64 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  nd we are doing 
12a80 61 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  a scan..*/.stati
12a90 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46  c int spellfix1F
12aa0 69 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 0a 20  ilterForMatch(. 
12ab0 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
12ac0 72 20 2a 70 43 75 72 2c 0a 20 20 69 6e 74 20 69  r *pCur,.  int i
12ad0 64 78 4e 75 6d 2c 0a 20 20 69 6e 74 20 61 72 67  dxNum,.  int arg
12ae0 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
12af0 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
12b00 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
12b10 61 72 20 2a 7a 4d 61 74 63 68 54 68 69 73 3b 20  ar *zMatchThis; 
12b20 20 20 2f 2a 20 52 48 53 20 6f 66 20 74 68 65 20    /* RHS of the 
12b30 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 2a  MATCH operator *
12b40 2f 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f  /.  EditDist3Fro
12b50 6d 53 74 72 69 6e 67 20 2a 70 4d 61 74 63 68 53  mString *pMatchS
12b60 74 72 33 20 3d 20 30 3b 20 2f 2a 20 7a 4d 61 74  tr3 = 0; /* zMat
12b70 63 68 54 68 69 73 20 61 73 20 61 6e 20 65 64 69  chThis as an edi
12b80 74 64 69 73 74 20 73 74 72 69 6e 67 20 2a 2f 0a  tdist string */.
12b90 20 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e    char *zPattern
12ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12bb0 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 69 74       /* Translit
12bc0 65 72 61 74 69 6f 6e 20 6f 66 20 7a 4d 61 74 63  eration of zMatc
12bd0 68 54 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  hThis */.  int n
12be0 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20  Pattern;        
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c00 20 4c 65 6e 67 74 68 20 6f 66 20 7a 50 61 74 74   Length of zPatt
12c10 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ern */.  int iLi
12c20 6d 69 74 20 3d 20 32 30 3b 20 20 20 20 20 20 20  mit = 20;       
12c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12c40 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ax number of row
12c50 73 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20  s of output */. 
12c60 20 69 6e 74 20 69 53 63 6f 70 65 20 3d 20 33 3b   int iScope = 3;
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c80 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69 73 20      /* Use this 
12c90 6d 61 6e 79 20 63 68 61 72 61 63 74 65 72 73 20  many characters 
12ca0 6f 66 20 7a 43 6c 61 73 73 20 2a 2f 0a 20 20 69  of zClass */.  i
12cb0 6e 74 20 69 4c 61 6e 67 20 3d 20 30 3b 20 20 20  nt iLang = 0;   
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 63 6f    /* Language co
12ce0 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  de */.  char *zS
12cf0 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
12d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
12d10 4c 20 6f 66 20 73 68 61 64 6f 77 20 74 61 62 6c  L of shadow tabl
12d20 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
12d30 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
12d40 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12d50 2f 2a 20 53 68 61 64 6f 77 20 74 61 62 6c 65 20  /* Shadow table 
12d60 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72  query */.  int r
12d70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d90 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
12da0 20 20 69 6e 74 20 69 64 78 20 3d 20 31 3b 20 20    int idx = 1;  
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
12dd0 69 6c 61 62 6c 65 20 66 69 6c 74 65 72 20 70 61  ilable filter pa
12de0 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 73 70 65  rameter */.  spe
12df0 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d  llfix1_vtab *p =
12e00 20 70 43 75 72 2d 3e 70 56 54 61 62 3b 20 20 20   pCur->pVTab;   
12e10 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 74  /* The virtual t
12e20 61 62 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 70  able that owns p
12e30 43 75 72 20 2a 2f 0a 20 20 4d 61 74 63 68 51 75  Cur */.  MatchQu
12e40 65 72 79 20 78 3b 20 20 20 20 20 20 20 20 20 20  ery x;          
12e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12e60 6f 72 20 70 61 73 73 69 6e 67 20 69 6e 66 6f 20  or passing info 
12e70 74 6f 20 52 75 6e 51 75 65 72 79 28 29 20 2a 2f  to RunQuery() */
12e80 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
12e90 63 6f 73 74 20 74 61 62 6c 65 20 69 66 20 77 65  cost table if we
12ea0 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
12eb0 79 20 64 6f 6e 65 20 73 6f 20 2a 2f 0a 20 20 69  y done so */.  i
12ec0 66 28 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65  f( p->zCostTable
12ed0 21 3d 30 20 26 26 20 70 2d 3e 70 43 6f 6e 66 69  !=0 && p->pConfi
12ee0 67 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  g3==0 ){.    p->
12ef0 70 43 6f 6e 66 69 67 33 20 3d 20 73 71 6c 69 74  pConfig3 = sqlit
12f00 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
12f10 66 28 70 2d 3e 70 43 6f 6e 66 69 67 33 5b 30 5d  f(p->pConfig3[0]
12f20 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ) );.    if( p->
12f30 70 43 6f 6e 66 69 67 33 3d 3d 30 20 29 20 72 65  pConfig3==0 ) re
12f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12f50 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  M;.    memset(p-
12f60 3e 70 43 6f 6e 66 69 67 33 2c 20 30 2c 20 73 69  >pConfig3, 0, si
12f70 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e 66 69 67 33  zeof(p->pConfig3
12f80 5b 30 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  [0]));.    rc = 
12f90 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c  editDist3ConfigL
12fa0 6f 61 64 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c  oad(p->pConfig3,
12fb0 20 70 2d 3e 64 62 2c 20 70 2d 3e 7a 43 6f 73 74   p->db, p->zCost
12fc0 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  Table);.    if( 
12fd0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12fe0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c    }.  memset(&x,
12ff0 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
13000 20 20 78 2e 69 53 63 6f 70 65 20 3d 20 33 3b 20    x.iScope = 3; 
13010 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 63 6f 70   /* Default scop
13020 65 20 69 66 20 6e 6f 6e 65 20 73 70 65 63 69 66  e if none specif
13030 69 65 64 20 62 79 20 22 57 48 45 52 45 20 73 63  ied by "WHERE sc
13040 6f 70 65 3d 4e 22 20 2a 2f 0a 20 20 78 2e 69 4d  ope=N" */.  x.iM
13050 61 78 44 69 73 74 20 3d 20 2d 31 3b 20 20 20 2f  axDist = -1;   /
13060 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
13070 64 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20  d edit distance 
13080 2a 2f 0a 0a 20 20 69 66 28 20 69 64 78 4e 75 6d  */..  if( idxNum
13090 26 32 20 29 7b 0a 20 20 20 20 69 4c 61 6e 67 20  &2 ){.    iLang 
130a0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
130b0 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29  int(argv[idx++])
130c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78 4e  ;.  }.  if( idxN
130d0 75 6d 26 34 20 29 7b 0a 20 20 20 20 69 4c 69 6d  um&4 ){.    iLim
130e0 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  it = sqlite3_val
130f0 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78 2b  ue_int(argv[idx+
13100 2b 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 69  +]);.    if( iLi
13110 6d 69 74 3c 31 20 29 20 69 4c 69 6d 69 74 20 3d  mit<1 ) iLimit =
13120 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64   1;.  }.  if( id
13130 78 4e 75 6d 26 38 20 29 7b 0a 20 20 20 20 78 2e  xNum&8 ){.    x.
13140 69 53 63 6f 70 65 20 3d 20 73 71 6c 69 74 65 33  iScope = sqlite3
13150 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
13160 69 64 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28  idx++]);.    if(
13170 20 78 2e 69 53 63 6f 70 65 3c 31 20 29 20 78 2e   x.iScope<1 ) x.
13180 69 53 63 6f 70 65 20 3d 20 31 3b 0a 20 20 20 20  iScope = 1;.    
13190 69 66 28 20 78 2e 69 53 63 6f 70 65 3e 53 50 45  if( x.iScope>SPE
131a0 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 20  LLFIX_MX_HASH-2 
131b0 29 20 78 2e 69 53 63 6f 70 65 20 3d 20 53 50 45  ) x.iScope = SPE
131c0 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 3b  LLFIX_MX_HASH-2;
131d0 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78 4e 75  .  }.  if( idxNu
131e0 6d 26 28 31 36 7c 33 32 29 20 29 7b 0a 20 20 20  m&(16|32) ){.   
131f0 20 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 73 71   x.iMaxDist = sq
13200 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
13210 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20  argv[idx++]);.  
13220 20 20 69 66 28 20 69 64 78 4e 75 6d 26 31 36 20    if( idxNum&16 
13230 29 20 78 2e 69 4d 61 78 44 69 73 74 2d 2d 3b 0a  ) x.iMaxDist--;.
13240 20 20 20 20 69 66 28 20 78 2e 69 4d 61 78 44 69      if( x.iMaxDi
13250 73 74 3c 30 20 29 20 78 2e 69 4d 61 78 44 69 73  st<0 ) x.iMaxDis
13260 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 70 65  t = 0;.  }.  spe
13270 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f  llfix1ResetCurso
13280 72 28 70 43 75 72 29 3b 0a 20 20 73 70 65 6c 6c  r(pCur);.  spell
13290 66 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72  fix1ResizeCursor
132a0 28 70 43 75 72 2c 20 69 4c 69 6d 69 74 29 3b 0a  (pCur, iLimit);.
132b0 20 20 7a 4d 61 74 63 68 54 68 69 73 20 3d 20 73    zMatchThis = s
132c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
132d0 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
132e0 28 20 7a 4d 61 74 63 68 54 68 69 73 3d 3d 30 20  ( zMatchThis==0 
132f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13300 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f  OK;.  if( p->pCo
13310 6e 66 69 67 33 20 29 7b 0a 20 20 20 20 78 2e 70  nfig3 ){.    x.p
13320 4c 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74 33  Lang = editDist3
13330 46 69 6e 64 4c 61 6e 67 28 70 2d 3e 70 43 6f 6e  FindLang(p->pCon
13340 66 69 67 33 2c 20 69 4c 61 6e 67 29 3b 0a 20 20  fig3, iLang);.  
13350 20 20 70 4d 61 74 63 68 53 74 72 33 20 3d 20 65    pMatchStr3 = e
13360 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
13370 6e 67 4e 65 77 28 78 2e 70 4c 61 6e 67 2c 20 28  ngNew(x.pLang, (
13380 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4d 61 74  const char*)zMat
13390 63 68 54 68 69 73 2c 20 2d 31 29 3b 0a 20 20 20  chThis, -1);.   
133a0 20 69 66 28 20 70 4d 61 74 63 68 53 74 72 33 3d   if( pMatchStr3=
133b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 78 2e 72 63  =0 ){.      x.rc
133c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
133d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6c 74  .      goto filt
133e0 65 72 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  er_exit;.    }. 
133f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 70 4c   }else{.    x.pL
13400 61 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  ang = 0;.  }.  z
13410 50 61 74 74 65 72 6e 20 3d 20 28 63 68 61 72 2a  Pattern = (char*
13420 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a  )transliterate(z
13430 4d 61 74 63 68 54 68 69 73 2c 20 73 71 6c 69 74  MatchThis, sqlit
13440 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
13450 72 67 76 5b 30 5d 29 29 3b 0a 20 20 73 71 6c 69  rgv[0]));.  sqli
13460 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 7a  te3_free(pCur->z
13470 50 61 74 74 65 72 6e 29 3b 0a 20 20 70 43 75 72  Pattern);.  pCur
13480 2d 3e 7a 50 61 74 74 65 72 6e 20 3d 20 7a 50 61  ->zPattern = zPa
13490 74 74 65 72 6e 3b 0a 20 20 69 66 28 20 7a 50 61  ttern;.  if( zPa
134a0 74 74 65 72 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ttern==0 ){.    
134b0 78 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  x.rc = SQLITE_NO
134c0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 69  MEM;.    goto fi
134d0 6c 74 65 72 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  lter_exit;.  }. 
134e0 20 6e 50 61 74 74 65 72 6e 20 3d 20 28 69 6e 74   nPattern = (int
134f0 29 73 74 72 6c 65 6e 28 7a 50 61 74 74 65 72 6e  )strlen(zPattern
13500 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72  );.  if( zPatter
13510 6e 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3d 3d 27  n[nPattern-1]=='
13520 2a 27 20 29 20 6e 50 61 74 74 65 72 6e 2d 2d 3b  *' ) nPattern--;
13530 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
13540 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
13550 22 53 45 4c 45 43 54 20 69 64 2c 20 77 6f 72 64  "SELECT id, word
13560 2c 20 72 61 6e 6b 2c 20 6b 31 22 0a 20 20 20 20  , rank, k1".    
13570 20 22 20 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e   "  FROM \"%w\".
13580 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22 0a 20 20  \"%w_vocab\"".  
13590 20 20 20 22 20 57 48 45 52 45 20 6c 61 6e 67 69     " WHERE langi
135a0 64 3d 25 64 20 41 4e 44 20 6b 32 3e 3d 3f 31 20  d=%d AND k2>=?1 
135b0 41 4e 44 20 6b 32 3c 3f 32 22 2c 0a 20 20 20 20  AND k2<?2",.    
135c0 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e   p->zDbName, p->
135d0 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 69 4c 61 6e  zTableName, iLan
135e0 67 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 53 71  g.  );.  if( zSq
135f0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 78 2e 72 63  l==0 ){.    x.rc
13600 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
13610 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a  .    pStmt = 0;.
13620 20 20 20 20 67 6f 74 6f 20 66 69 6c 74 65 72 5f      goto filter_
13630 65 78 69 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  exit;.  }.  rc =
13640 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
13650 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
13660 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
13670 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
13680 7a 53 71 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69  zSql);.  pCur->i
13690 4c 61 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a 20 20  Lang = iLang;.  
136a0 78 2e 70 43 75 72 20 3d 20 70 43 75 72 3b 0a 20  x.pCur = pCur;. 
136b0 20 78 2e 70 53 74 6d 74 20 3d 20 70 53 74 6d 74   x.pStmt = pStmt
136c0 3b 0a 20 20 78 2e 7a 50 61 74 74 65 72 6e 20 3d  ;.  x.zPattern =
136d0 20 7a 50 61 74 74 65 72 6e 3b 0a 20 20 78 2e 6e   zPattern;.  x.n
136e0 50 61 74 74 65 72 6e 20 3d 20 6e 50 61 74 74 65  Pattern = nPatte
136f0 72 6e 3b 0a 20 20 78 2e 70 4d 61 74 63 68 53 74  rn;.  x.pMatchSt
13700 72 33 20 3d 20 70 4d 61 74 63 68 53 74 72 33 3b  r3 = pMatchStr3;
13710 0a 20 20 78 2e 69 4c 61 6e 67 20 3d 20 69 4c 61  .  x.iLang = iLa
13720 6e 67 3b 0a 20 20 78 2e 72 63 20 3d 20 72 63 3b  ng;.  x.rc = rc;
13730 0a 20 20 78 2e 70 43 6f 6e 66 69 67 33 20 3d 20  .  x.pConfig3 = 
13740 70 2d 3e 70 43 6f 6e 66 69 67 33 3b 0a 20 20 69  p->pConfig3;.  i
13750 66 28 20 78 2e 72 63 3d 3d 53 51 4c 49 54 45 5f  f( x.rc==SQLITE_
13760 4f 4b 20 29 7b 0a 20 20 20 20 73 70 65 6c 6c 66  OK ){.    spellf
13770 69 78 31 52 75 6e 51 75 65 72 79 28 26 78 2c 20  ix1RunQuery(&x, 
13780 7a 50 61 74 74 65 72 6e 2c 20 6e 50 61 74 74 65  zPattern, nPatte
13790 72 6e 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rn);.  }..  if( 
137a0 70 43 75 72 2d 3e 61 20 29 7b 0a 20 20 20 20 71  pCur->a ){.    q
137b0 73 6f 72 74 28 70 43 75 72 2d 3e 61 2c 20 70 43  sort(pCur->a, pC
137c0 75 72 2d 3e 6e 52 6f 77 2c 20 73 69 7a 65 6f 66  ur->nRow, sizeof
137d0 28 70 43 75 72 2d 3e 61 5b 30 5d 29 2c 20 73 70  (pCur->a[0]), sp
137e0 65 6c 6c 66 69 78 31 52 6f 77 43 6f 6d 70 61 72  ellfix1RowCompar
137f0 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 54  e);.    pCur->iT
13800 6f 70 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 20  op = iLimit;.   
13810 20 70 43 75 72 2d 3e 69 53 63 6f 70 65 20 3d 20   pCur->iScope = 
13820 69 53 63 6f 70 65 3b 0a 20 20 7d 65 6c 73 65 7b  iScope;.  }else{
13830 0a 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49  .    x.rc = SQLI
13840 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 66  TE_NOMEM;.  }..f
13850 69 6c 74 65 72 5f 65 78 69 74 3a 0a 20 20 73 71  ilter_exit:.  sq
13860 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13870 53 74 6d 74 29 3b 0a 20 20 65 64 69 74 44 69 73  Stmt);.  editDis
13880 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65  t3FromStringDele
13890 74 65 28 70 4d 61 74 63 68 53 74 72 33 29 3b 0a  te(pMatchStr3);.
138a0 20 20 72 65 74 75 72 6e 20 78 2e 72 63 3b 0a 7d    return x.rc;.}
138b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ../*.** This ver
138c0 73 69 6f 6e 20 6f 66 20 78 46 69 6c 74 65 72 20  sion of xFilter 
138d0 68 61 6e 64 6c 65 73 20 61 20 66 75 6c 6c 2d 74  handles a full-t
138e0 61 62 6c 65 20 73 63 61 6e 20 63 61 73 65 0a 2a  able scan case.*
138f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
13900 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 46  llfix1FilterForF
13910 75 6c 6c 53 63 61 6e 28 0a 20 20 73 70 65 6c 6c  ullScan(.  spell
13920 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75  fix1_cursor *pCu
13930 72 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c  r,.  int idxNum,
13940 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
13950 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
13960 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  rgv.){.  int rc 
13970 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
13980 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 73 70 65  har *zSql;.  spe
13990 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 56 54  llfix1_vtab *pVT
139a0 61 62 20 3d 20 70 43 75 72 2d 3e 70 56 54 61 62  ab = pCur->pVTab
139b0 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73  ;.  spellfix1Res
139c0 65 74 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  etCursor(pCur);.
139d0 20 20 61 73 73 65 72 74 28 20 69 64 78 4e 75 6d    assert( idxNum
139e0 3d 3d 30 20 7c 7c 20 69 64 78 4e 75 6d 3d 3d 36  ==0 || idxNum==6
139f0 34 20 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  4 );.  zSql = sq
13a00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
13a10 20 20 20 20 22 53 45 4c 45 43 54 20 77 6f 72 64      "SELECT word
13a20 2c 20 72 61 6e 6b 2c 20 4e 55 4c 4c 2c 20 6c 61  , rank, NULL, la
13a30 6e 67 69 64 2c 20 69 64 20 46 52 4f 4d 20 5c 22  ngid, id FROM \"
13a40 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c  %w\".\"%w_vocab\
13a50 22 25 73 22 2c 0a 20 20 20 20 20 70 56 54 61 62  "%s",.     pVTab
13a60 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 56 54 61 62  ->zDbName, pVTab
13a70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  ->zTableName,.  
13a80 20 20 20 28 28 69 64 78 4e 75 6d 20 26 20 36 34     ((idxNum & 64
13a90 29 20 3f 20 22 20 57 48 45 52 45 20 72 6f 77 69  ) ? " WHERE rowi
13aa0 64 3d 3f 22 20 3a 20 22 22 29 0a 20 20 29 3b 0a  d=?" : "").  );.
13ab0 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
13ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13ad0 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  MEM;.  rc = sqli
13ae0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
13af0 56 54 61 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  VTab->db, zSql, 
13b00 2d 31 2c 20 26 70 43 75 72 2d 3e 70 46 75 6c 6c  -1, &pCur->pFull
13b10 53 63 61 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Scan, 0);.  sqli
13b20 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
13b30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13b40 5f 4f 4b 20 26 26 20 28 69 64 78 4e 75 6d 20 26  _OK && (idxNum &
13b50 20 36 34 29 20 29 7b 0a 20 20 20 20 61 73 73 65   64) ){.    asse
13b60 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b 0a 20  rt( argc==1 );. 
13b70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13b80 62 69 6e 64 5f 76 61 6c 75 65 28 70 43 75 72 2d  bind_value(pCur-
13b90 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 31 2c 20 61  >pFullScan, 1, a
13ba0 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 70  rgv[0]);.  }.  p
13bb0 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 70 43 75 72  Cur->nRow = pCur
13bc0 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66  ->iRow = 0;.  if
13bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13be0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13bf0 74 65 33 5f 73 74 65 70 28 70 43 75 72 2d 3e 70  te3_step(pCur->p
13c00 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20 20 20 69  FullScan);.    i
13c10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  f( rc==SQLITE_RO
13c20 57 20 29 7b 20 70 43 75 72 2d 3e 69 52 6f 77 20  W ){ pCur->iRow 
13c30 3d 20 2d 31 3b 20 72 63 20 3d 20 53 51 4c 49 54  = -1; rc = SQLIT
13c40 45 5f 4f 4b 3b 20 7d 0a 20 20 20 20 69 66 28 20  E_OK; }.    if( 
13c50 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
13c60 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  ){ rc = SQLITE_O
13c70 4b 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  K; }.  }else{.  
13c80 20 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30    pCur->iRow = 0
13c90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
13ca0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  c;.}.../*.** Cal
13cb0 6c 65 64 20 74 6f 20 22 72 65 77 69 6e 64 22 20  led to "rewind" 
13cc0 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f  a cursor back to
13cd0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 73   the beginning s
13ce0 6f 20 74 68 61 74 0a 2a 2a 20 69 74 20 73 74 61  o that.** it sta
13cf0 72 74 73 20 69 74 73 20 6f 75 74 70 75 74 20 6f  rts its output o
13d00 76 65 72 20 61 67 61 69 6e 2e 20 20 41 6c 77 61  ver again.  Alwa
13d10 79 73 20 63 61 6c 6c 65 64 20 61 74 20 6c 65 61  ys called at lea
13d20 73 74 20 6f 6e 63 65 0a 2a 2a 20 70 72 69 6f 72  st once.** prior
13d30 20 74 6f 20 61 6e 79 20 73 70 65 6c 6c 66 69 78   to any spellfix
13d40 31 43 6f 6c 75 6d 6e 2c 20 73 70 65 6c 6c 66 69  1Column, spellfi
13d50 78 31 52 6f 77 69 64 2c 20 6f 72 20 73 70 65 6c  x1Rowid, or spel
13d60 6c 66 69 78 31 45 6f 66 20 63 61 6c 6c 2e 0a 2a  lfix1Eof call..*
13d70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
13d80 6c 6c 66 69 78 31 46 69 6c 74 65 72 28 0a 20 20  llfix1Filter(.  
13d90 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
13da0 73 6f 72 20 2a 63 75 72 2c 20 0a 20 20 69 6e 74  sor *cur, .  int
13db0 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63   idxNum, const c
13dc0 68 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69  har *idxStr,.  i
13dd0 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33  nt argc, sqlite3
13de0 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
13df0 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  .  spellfix1_cur
13e00 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65  sor *pCur = (spe
13e10 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 29  llfix1_cursor *)
13e20 63 75 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  cur;.  int rc;. 
13e30 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20 31 20   if( idxNum & 1 
13e40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 70 65 6c  ){.    rc = spel
13e50 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d 61  lfix1FilterForMa
13e60 74 63 68 28 70 43 75 72 2c 20 69 64 78 4e 75 6d  tch(pCur, idxNum
13e70 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a 20  , argc, argv);. 
13e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
13e90 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72   spellfix1Filter
13ea0 46 6f 72 46 75 6c 6c 53 63 61 6e 28 70 43 75 72  ForFullScan(pCur
13eb0 2c 20 69 64 78 4e 75 6d 2c 20 61 72 67 63 2c 20  , idxNum, argc, 
13ec0 61 72 67 76 29 3b 0a 20 20 7d 0a 20 20 72 65 74  argv);.  }.  ret
13ed0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
13ee0 2a 20 41 64 76 61 6e 63 65 20 61 20 63 75 72 73  * Advance a curs
13ef0 6f 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20 72  or to its next r
13f00 6f 77 20 6f 66 20 6f 75 74 70 75 74 0a 2a 2f 0a  ow of output.*/.
13f10 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
13f20 66 69 78 31 4e 65 78 74 28 73 71 6c 69 74 65 33  fix1Next(sqlite3
13f30 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
13f40 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  r){.  spellfix1_
13f50 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
13f60 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
13f70 20 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20 72 63   *)cur;.  int rc
13f80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13f90 69 66 28 20 70 43 75 72 2d 3e 69 52 6f 77 20 3c  if( pCur->iRow <
13fa0 20 70 43 75 72 2d 3e 6e 52 6f 77 20 29 7b 0a 20   pCur->nRow ){. 
13fb0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46 75     if( pCur->pFu
13fc0 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 20 20  llScan ){.      
13fd0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
13fe0 70 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  p(pCur->pFullSca
13ff0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
14000 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 70  !=SQLITE_ROW ) p
14010 43 75 72 2d 3e 69 52 6f 77 20 3d 20 70 43 75 72  Cur->iRow = pCur
14020 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ->nRow;.      if
14030 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
14040 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
14050 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
14060 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
14070 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 52 6f  .      pCur->iRo
14080 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  w++;.    }.  }. 
14090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
140a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
140b0 20 69 66 20 77 65 20 61 72 65 20 61 74 20 74 68   if we are at th
140c0 65 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 0a 2a 2f  e end-of-file.*/
140d0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
140e0 6c 66 69 78 31 45 6f 66 28 73 71 6c 69 74 65 33  lfix1Eof(sqlite3
140f0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
14100 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  r){.  spellfix1_
14110 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
14120 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
14130 20 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e   *)cur;.  return
14140 20 70 43 75 72 2d 3e 69 52 6f 77 3e 3d 70 43 75   pCur->iRow>=pCu
14150 72 2d 3e 6e 52 6f 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->nRow;.}../*.*
14160 2a 20 52 65 74 75 72 6e 20 63 6f 6c 75 6d 6e 73  * Return columns
14170 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
14180 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
14190 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 6f   int spellfix1Co
141a0 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  lumn(.  sqlite3_
141b0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
141c0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ,.  sqlite3_cont
141d0 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20  ext *ctx,.  int 
141e0 69 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  i.){.  spellfix1
141f0 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
14200 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
14210 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70 43  r*)cur;.  if( pC
14220 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b  ur->pFullScan ){
14230 0a 20 20 20 20 69 66 28 20 69 3c 3d 53 50 45 4c  .    if( i<=SPEL
14240 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20  LFIX_COL_LANGID 
14250 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14260 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
14270 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  x, sqlite3_colum
14280 6e 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70 46  n_value(pCur->pF
14290 75 6c 6c 53 63 61 6e 2c 20 69 29 29 3b 0a 20 20  ullScan, i));.  
142a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
142b0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
142c0 6c 6c 28 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20  ll(ctx);.    }. 
142d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
142e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  _OK;.  }.  switc
142f0 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65  h( i ){.    case
14300 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f   SPELLFIX_COL_WO
14310 52 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RD: {.      sqli
14320 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
14330 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75  ctx, pCur->a[pCu
14340 72 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64 2c 20  r->iRow].zWord, 
14350 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
14360 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
14370 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
14380 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e  SPELLFIX_COL_RAN
14390 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K: {.      sqlit
143a0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
143b0 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d  x, pCur->a[pCur-
143c0 3e 69 52 6f 77 5d 2e 69 52 61 6e 6b 29 3b 0a 20  >iRow].iRank);. 
143d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
143e0 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c  }.    case SPELL
143f0 46 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e 43 45  FIX_COL_DISTANCE
14400 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
14410 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
14420 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e  , pCur->a[pCur->
14430 69 52 6f 77 5d 2e 69 44 69 73 74 61 6e 63 65 29  iRow].iDistance)
14440 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14450 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50     }.    case SP
14460 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49  ELLFIX_COL_LANGI
14470 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
14480 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
14490 78 2c 20 70 43 75 72 2d 3e 69 4c 61 6e 67 29 3b  x, pCur->iLang);
144a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
144b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45    }.    case SPE
144c0 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 3a  LLFIX_COL_SCORE:
144d0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
144e0 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c  _result_int(ctx,
144f0 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69   pCur->a[pCur->i
14500 52 6f 77 5d 2e 69 53 63 6f 72 65 29 3b 0a 20 20  Row].iScore);.  
14510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14520 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
14530 49 58 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45 4e 3a  IX_COL_MATCHLEN:
14540 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61   {.      int iMa
14550 74 63 68 6c 65 6e 20 3d 20 70 43 75 72 2d 3e 61  tchlen = pCur->a
14560 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 4d 61  [pCur->iRow].iMa
14570 74 63 68 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  tchlen;.      if
14580 28 20 69 4d 61 74 63 68 6c 65 6e 3c 30 20 29 7b  ( iMatchlen<0 ){
14590 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61  .        int nPa
145a0 74 74 65 72 6e 20 3d 20 28 69 6e 74 29 73 74 72  ttern = (int)str
145b0 6c 65 6e 28 70 43 75 72 2d 3e 7a 50 61 74 74 65  len(pCur->zPatte
145c0 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61  rn);.        cha
145d0 72 20 2a 7a 57 6f 72 64 20 3d 20 70 43 75 72 2d  r *zWord = pCur-
145e0 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a  >a[pCur->iRow].z
145f0 57 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Word;.        in
14600 74 20 6e 57 6f 72 64 20 3d 20 28 69 6e 74 29 73  t nWord = (int)s
14610 74 72 6c 65 6e 28 7a 57 6f 72 64 29 3b 0a 0a 20  trlen(zWord);.. 
14620 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 74 74         if( nPatt
14630 65 72 6e 3e 30 20 26 26 20 70 43 75 72 2d 3e 7a  ern>0 && pCur->z
14640 50 61 74 74 65 72 6e 5b 6e 50 61 74 74 65 72 6e  Pattern[nPattern
14650 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  -1]=='*' ){.    
14660 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
14670 6e 73 6c 69 74 3b 0a 20 20 20 20 20 20 20 20 20  nslit;.         
14680 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
14690 20 20 20 20 7a 54 72 61 6e 73 6c 69 74 20 3d 20      zTranslit = 
146a0 28 63 68 61 72 20 2a 29 74 72 61 6e 73 6c 69 74  (char *)translit
146b0 65 72 61 74 65 28 28 75 6e 73 69 67 6e 65 64 20  erate((unsigned 
146c0 63 68 61 72 20 2a 29 7a 57 6f 72 64 2c 20 6e 57  char *)zWord, nW
146d0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ord);.          
146e0 69 66 28 20 21 7a 54 72 61 6e 73 6c 69 74 20 29  if( !zTranslit )
146f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14700 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
14710 72 65 73 20 3d 20 65 64 69 74 64 69 73 74 31 28  res = editdist1(
14720 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 2c 20  pCur->zPattern, 
14730 7a 54 72 61 6e 73 6c 69 74 2c 20 26 69 4d 61 74  zTranslit, &iMat
14740 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  chlen);.        
14750 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14760 54 72 61 6e 73 6c 69 74 29 3b 0a 20 20 20 20 20  Translit);.     
14770 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
14780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14790 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
147a0 69 4d 61 74 63 68 6c 65 6e 20 3d 20 74 72 61 6e  iMatchlen = tran
147b0 73 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65 6e 28  slen_to_charlen(
147c0 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20 69 4d  zWord, nWord, iM
147d0 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20  atchlen);.      
147e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
147f0 20 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 75     iMatchlen = u
14800 74 66 38 43 68 61 72 6c 65 6e 28 7a 57 6f 72 64  tf8Charlen(zWord
14810 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20  , nWord);.      
14820 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
14830 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
14840 74 5f 69 6e 74 28 63 74 78 2c 20 69 4d 61 74 63  t_int(ctx, iMatc
14850 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  hlen);.      bre
14860 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14870 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
14880 50 48 4f 4e 45 48 41 53 48 3a 20 7b 0a 20 20 20  PHONEHASH: {.   
14890 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
148a0 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43 75 72  t_text(ctx, pCur
148b0 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e  ->a[pCur->iRow].
148c0 7a 48 61 73 68 2c 20 2d 31 2c 20 53 51 4c 49 54  zHash, -1, SQLIT
148d0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
148e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
148f0 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f    case SPELLFIX_
14900 43 4f 4c 5f 54 4f 50 3a 20 7b 0a 20 20 20 20 20  COL_TOP: {.     
14910 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14920 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 69  int(ctx, pCur->i
14930 54 6f 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Top);.      brea
14940 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14950 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53  e SPELLFIX_COL_S
14960 43 4f 50 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  COPE: {.      sq
14970 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
14980 28 63 74 78 2c 20 70 43 75 72 2d 3e 69 53 63 6f  (ctx, pCur->iSco
14990 70 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pe);.      break
149a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
149b0 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52   SPELLFIX_COL_SR
149c0 43 48 43 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73  CHCNT: {.      s
149d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
149e0 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 6e 53 65  t(ctx, pCur->nSe
149f0 61 72 63 68 29 3b 0a 20 20 20 20 20 20 62 72 65  arch);.      bre
14a00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
14a10 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
14a20 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
14a30 6c 6c 28 63 74 78 29 3b 0a 20 20 20 20 20 20 62  ll(ctx);.      b
14a40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
14a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a60 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
14a70 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   rowid..*/.stati
14a80 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52  c int spellfix1R
14a90 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61  owid(sqlite3_vta
14aa0 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73  b_cursor *cur, s
14ab0 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
14ac0 77 69 64 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  wid){.  spellfix
14ad0 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  1_cursor *pCur =
14ae0 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73   (spellfix1_curs
14af0 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70  or*)cur;.  if( p
14b00 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29  Cur->pFullScan )
14b10 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20  {.    *pRowid = 
14b20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
14b30 6e 74 36 34 28 70 43 75 72 2d 3e 70 46 75 6c 6c  nt64(pCur->pFull
14b40 53 63 61 6e 2c 20 34 29 3b 0a 20 20 7d 65 6c 73  Scan, 4);.  }els
14b50 65 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d  e{.    *pRowid =
14b60 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69   pCur->a[pCur->i
14b70 52 6f 77 5d 2e 69 52 6f 77 69 64 3b 0a 20 20 7d  Row].iRowid;.  }
14b80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14b90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
14ba0 65 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68  e xUpdate() meth
14bb0 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
14bc0 74 20 73 70 65 6c 6c 66 69 78 31 55 70 64 61 74  t spellfix1Updat
14bd0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  e(.  sqlite3_vta
14be0 62 20 2a 70 56 54 61 62 2c 0a 20 20 69 6e 74 20  b *pVTab,.  int 
14bf0 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
14c00 76 61 6c 75 65 20 2a 2a 61 72 67 76 2c 0a 20 20  value **argv,.  
14c10 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
14c20 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63  owid.){.  int rc
14c30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14c40 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 6f  sqlite3_int64 ro
14c50 77 69 64 2c 20 6e 65 77 52 6f 77 69 64 3b 0a 20  wid, newRowid;. 
14c60 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20   spellfix1_vtab 
14c70 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f  *p = (spellfix1_
14c80 76 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 73  vtab*)pVTab;.  s
14c90 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
14ca0 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d  db;..  if( argc=
14cb0 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 64  =1 ){.    /* A d
14cc0 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
14cd0 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 67 69 76  on the rowid giv
14ce0 65 6e 20 62 79 20 61 72 67 76 5b 30 5d 20 2a 2f  en by argv[0] */
14cf0 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 2a 70 52  .    rowid = *pR
14d00 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
14d10 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
14d20 30 5d 29 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69  0]);.    spellfi
14d30 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  x1DbExec(&rc, db
14d40 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c  , "DELETE FROM \
14d50 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62  "%w\".\"%w_vocab
14d60 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  \" ".           
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 22 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22  " WHERE id=%lld"
14d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14da0 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20      p->zDbName, 
14db0 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 72  p->zTableName, r
14dc0 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
14dd0 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
14de0 65 64 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d  ed char *zWord =
14df0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
14e00 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49  ext(argv[SPELLFI
14e10 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a  X_COL_WORD+2]);.
14e20 20 20 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20      int nWord = 
14e30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
14e40 74 65 73 28 61 72 67 76 5b 53 50 45 4c 4c 46 49  tes(argv[SPELLFI
14e50 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a  X_COL_WORD+2]);.
14e60 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20      int iLang = 
14e70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
14e80 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  t(argv[SPELLFIX_
14e90 43 4f 4c 5f 4c 41 4e 47 49 44 2b 32 5d 29 3b 0a  COL_LANGID+2]);.
14ea0 20 20 20 20 69 6e 74 20 69 52 61 6e 6b 20 3d 20      int iRank = 
14eb0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
14ec0 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  t(argv[SPELLFIX_
14ed0 43 4f 4c 5f 52 41 4e 4b 2b 32 5d 29 3b 0a 20 20  COL_RANK+2]);.  
14ee0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
14ef0 20 63 68 61 72 20 2a 7a 53 6f 75 6e 64 73 6c 69   char *zSoundsli
14f00 6b 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ke =.           
14f10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14f20 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  xt(argv[SPELLFIX
14f30 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b  _COL_SOUNDSLIKE+
14f40 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 53 6f  2]);.    int nSo
14f50 75 6e 64 73 6c 69 6b 65 20 3d 20 73 71 6c 69 74  undslike = sqlit
14f60 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
14f70 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  rgv[SPELLFIX_COL
14f80 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d 29 3b  _SOUNDSLIKE+2]);
14f90 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b 31 2c 20  .    char *zK1, 
14fa0 2a 7a 4b 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b  *zK2;.    int i;
14fb0 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 0a 20 20  .    char c;..  
14fc0 20 20 69 66 28 20 7a 57 6f 72 64 3d 3d 30 20 29    if( zWord==0 )
14fd0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72  {.      /* Inser
14fe0 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ts of the form: 
14ff0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62   INSERT INTO tab
15000 6c 65 28 63 6f 6d 6d 61 6e 64 29 20 56 41 4c 55  le(command) VALU
15010 45 53 28 27 78 79 7a 7a 79 27 29 3b 0a 20 20 20  ES('xyzzy');.   
15020 20 20 20 2a 2a 20 63 61 75 73 65 20 7a 57 6f 72     ** cause zWor
15030 64 20 74 6f 20 62 65 20 4e 55 4c 4c 2c 20 73 6f  d to be NULL, so
15040 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20   we look at the 
15050 22 63 6f 6d 6d 61 6e 64 22 20 63 6f 6c 75 6d 6e  "command" column
15060 20 74 6f 20 73 65 65 0a 20 20 20 20 20 20 2a 2a   to see.      **
15070 20 77 68 61 74 20 73 70 65 63 69 61 6c 20 61 63   what special ac
15080 74 69 6f 6e 73 20 74 6f 20 74 61 6b 65 20 2a 2f  tions to take */
15090 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
150a0 72 20 2a 7a 43 6d 64 20 3d 20 0a 20 20 20 20 20  r *zCmd = .     
150b0 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
150c0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
150d0 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49  ext(argv[SPELLFI
150e0 58 5f 43 4f 4c 5f 43 4f 4d 4d 41 4e 44 2b 32 5d  X_COL_COMMAND+2]
150f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6d  );.      if( zCm
15100 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
15110 70 56 54 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVTab->zErrMsg =
15120 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
15130 28 22 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  ("NOT NULL const
15140 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 25 73  raint failed: %s
15150 2e 77 6f 72 64 22 2c 0a 20 20 20 20 20 20 20 20  .word",.        
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b   p->zTableName);
15190 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
151a0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
151b0 54 5f 4e 4f 54 4e 55 4c 4c 3b 0a 20 20 20 20 20  T_NOTNULL;.     
151c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
151d0 63 6d 70 28 7a 43 6d 64 2c 22 72 65 73 65 74 22  cmp(zCmd,"reset"
151e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
151f0 2f 2a 20 52 65 73 65 74 20 74 68 65 20 20 65 64  /* Reset the  ed
15200 69 74 20 63 6f 73 74 20 74 61 62 6c 65 20 28 69  it cost table (i
15210 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 29 2e  f there is one).
15220 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 64 69 74   */.        edit
15230 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74  Dist3ConfigDelet
15240 65 28 70 2d 3e 70 43 6f 6e 66 69 67 33 29 3b 0a  e(p->pConfig3);.
15250 20 20 20 20 20 20 20 20 70 2d 3e 70 43 6f 6e 66          p->pConf
15260 69 67 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ig3 = 0;.       
15270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15280 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
15290 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 43 6d   if( strncmp(zCm
152a0 64 2c 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62  d,"edit_cost_tab
152b0 6c 65 3d 22 2c 31 36 29 3d 3d 30 20 29 7b 0a 20  le=",16)==0 ){. 
152c0 20 20 20 20 20 20 20 65 64 69 74 44 69 73 74 33         editDist3
152d0 43 6f 6e 66 69 67 44 65 6c 65 74 65 28 70 2d 3e  ConfigDelete(p->
152e0 70 43 6f 6e 66 69 67 33 29 3b 0a 20 20 20 20 20  pConfig3);.     
152f0 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d     p->pConfig3 =
15300 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
15310 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73  te3_free(p->zCos
15320 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  tTable);.       
15330 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d   p->zCostTable =
15340 20 73 70 65 6c 6c 66 69 78 31 44 65 71 75 6f 74   spellfix1Dequot
15350 65 28 7a 43 6d 64 2b 31 36 29 3b 0a 20 20 20 20  e(zCmd+16);.    
15360 20 20 20 20 69 66 28 20 70 2d 3e 7a 43 6f 73 74      if( p->zCost
15370 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
15380 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15390 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a          if( p->z
153a0 43 6f 73 74 54 61 62 6c 65 5b 30 5d 3d 3d 30 20  CostTable[0]==0 
153b0 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
153c0 6d 70 28 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65  mp(p->zCostTable
153d0 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"null")==0 ){. 
153e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
153f0 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54 61  _free(p->zCostTa
15400 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ble);.          
15410 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d 20  p->zCostTable = 
15420 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
15430 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15440 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
15450 20 20 20 20 20 70 56 54 61 62 2d 3e 7a 45 72 72       pVTab->zErr
15460 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
15470 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 76  rintf("unknown v
15480 61 6c 75 65 20 66 6f 72 20 25 73 2e 63 6f 6d 6d  alue for %s.comm
15490 61 6e 64 3a 20 5c 22 25 77 5c 22 22 2c 0a 20 20  and: \"%w\"",.  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61       p->zTableNa
154d0 6d 65 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 20  me, zCmd);.     
154e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
154f0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
15500 69 66 28 20 69 52 61 6e 6b 3c 31 20 29 20 69 52  if( iRank<1 ) iR
15510 61 6e 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ank = 1;.    if(
15520 20 7a 53 6f 75 6e 64 73 6c 69 6b 65 20 29 7b 0a   zSoundslike ){.
15530 20 20 20 20 20 20 7a 4b 31 20 3d 20 28 63 68 61        zK1 = (cha
15540 72 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65  r*)transliterate
15550 28 7a 53 6f 75 6e 64 73 6c 69 6b 65 2c 20 6e 53  (zSoundslike, nS
15560 6f 75 6e 64 73 6c 69 6b 65 29 3b 0a 20 20 20 20  oundslike);.    
15570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 31  }else{.      zK1
15580 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c   = (char*)transl
15590 69 74 65 72 61 74 65 28 7a 57 6f 72 64 2c 20 6e  iterate(zWord, n
155a0 57 6f 72 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Word);.    }.   
155b0 20 69 66 28 20 7a 4b 31 3d 3d 30 20 29 20 72 65   if( zK1==0 ) re
155c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
155d0 4d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  M;.    for(i=0; 
155e0 28 63 20 3d 20 7a 4b 31 5b 69 5d 29 21 3d 30 3b  (c = zK1[i])!=0;
155f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 69 66   i++){.       if
15600 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27  ( c>='A' && c<='
15610 5a 27 20 29 20 7a 4b 31 5b 69 5d 20 2b 3d 20 27  Z' ) zK1[i] += '
15620 61 27 20 2d 20 27 41 27 3b 0a 20 20 20 20 7d 0a  a' - 'A';.    }.
15630 20 20 20 20 7a 4b 32 20 3d 20 28 63 68 61 72 2a      zK2 = (char*
15640 29 70 68 6f 6e 65 74 69 63 48 61 73 68 28 28 63  )phoneticHash((c
15650 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
15660 61 72 2a 29 7a 4b 31 2c 20 69 29 3b 0a 20 20 20  ar*)zK1, i);.   
15670 20 69 66 28 20 7a 4b 32 3d 3d 30 20 29 7b 0a 20   if( zK2==0 ){. 
15680 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
15690 65 28 7a 4b 31 29 3b 0a 20 20 20 20 20 20 72 65  e(zK1);.      re
156a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
156b0 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
156c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
156d0 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51  ype(argv[0])==SQ
156e0 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  LITE_NULL ){.   
156f0 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78     spellfix1DbEx
15700 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20  ec(&rc, db,.    
15710 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
15720 20 49 4e 54 4f 20 5c 22 25 77 5c 22 2e 5c 22 25   INTO \"%w\".\"%
15730 77 5f 76 6f 63 61 62 5c 22 28 72 61 6e 6b 2c 6c  w_vocab\"(rank,l
15740 61 6e 67 69 64 2c 77 6f 72 64 2c 6b 31 2c 6b 32  angid,word,k1,k2
15750 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ".            
15760 20 22 56 41 4c 55 45 53 28 25 64 2c 25 64 2c 25   "VALUES(%d,%d,%
15770 51 2c 25 51 2c 25 51 29 22 2c 0a 20 20 20 20 20  Q,%Q,%Q)",.     
15780 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61          p->zDbNa
15790 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
157a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
157b0 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20 7a 57  iRank, iLang, zW
157c0 6f 72 64 2c 20 7a 4b 31 2c 20 7a 4b 32 0a 20 20  ord, zK1, zK2.  
157d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52      );.      *pR
157e0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
157f0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
15800 28 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  (db);.    }else{
15810 0a 20 20 20 20 20 20 72 6f 77 69 64 20 3d 20 73  .      rowid = s
15820 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
15830 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  64(argv[0]);.   
15840 20 20 20 6e 65 77 52 6f 77 69 64 20 3d 20 2a 70     newRowid = *p
15850 52 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 31 5d 29 3b 0a 20 20 20 20 20 20 73 70 65 6c  [1]);.      spel
15880 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c  lfix1DbExec(&rc,
15890 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20   db,.           
158a0 20 20 22 55 50 44 41 54 45 20 5c 22 25 77 5c 22    "UPDATE \"%w\"
158b0 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 20 53 45  .\"%w_vocab\" SE
158c0 54 20 69 64 3d 25 6c 6c 64 2c 20 72 61 6e 6b 3d  T id=%lld, rank=
158d0 25 64 2c 20 6c 61 6e 67 69 64 3d 25 64 2c 22 0a  %d, langid=%d,".
158e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 77               " w
158f0 6f 72 64 3d 25 51 2c 20 6b 31 3d 25 51 2c 20 6b  ord=%Q, k1=%Q, k
15900 32 3d 25 51 20 57 48 45 52 45 20 69 64 3d 25 6c  2=%Q WHERE id=%l
15910 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ld",.           
15920 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d    p->zDbName, p-
15930 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 6e 65 77  >zTableName, new
15940 52 6f 77 69 64 2c 20 69 52 61 6e 6b 2c 20 69 4c  Rowid, iRank, iL
15950 61 6e 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ang,.           
15960 20 20 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 4b    zWord, zK1, zK
15970 32 2c 20 72 6f 77 69 64 0a 20 20 20 20 20 20 29  2, rowid.      )
15980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15990 74 65 33 5f 66 72 65 65 28 7a 4b 31 29 3b 0a 20  te3_free(zK1);. 
159a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
159b0 7a 4b 32 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  zK2);.  }.  retu
159c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
159d0 52 65 6e 61 6d 65 20 74 68 65 20 73 70 65 6c 6c  Rename the spell
159e0 66 69 78 31 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  fix1 table..*/.s
159f0 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
15a00 69 78 31 52 65 6e 61 6d 65 28 73 71 6c 69 74 65  ix1Rename(sqlite
15a10 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 63  3_vtab *pVTab, c
15a20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 29  onst char *zNew)
15a30 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  {.  spellfix1_vt
15a40 61 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69  ab *p = (spellfi
15a50 78 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a  x1_vtab*)pVTab;.
15a60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15a70 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
15a80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
15a90 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 20 3d 20  har *zNewName = 
15aa0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15ab0 22 25 73 22 2c 20 7a 4e 65 77 29 3b 0a 20 20 69  "%s", zNew);.  i
15ac0 66 28 20 7a 4e 65 77 4e 61 6d 65 3d 3d 30 20 29  f( zNewName==0 )
15ad0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15ae0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
15af0 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63   spellfix1DbExec
15b00 28 26 72 63 2c 20 64 62 2c 20 0a 20 20 20 20 20  (&rc, db, .     
15b10 22 41 4c 54 45 52 20 54 41 42 4c 45 20 5c 22 25  "ALTER TABLE \"%
15b20 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22  w\".\"%w_vocab\"
15b30 20 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25 77 5f   RENAME TO \"%w_
15b40 76 6f 63 61 62 5c 22 22 2c 0a 20 20 20 20 20 70  vocab\"",.     p
15b50 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54  ->zDbName, p->zT
15b60 61 62 6c 65 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61  ableName, zNewNa
15b70 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  me.  );.  if( rc
15b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15b90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15ba0 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  p->zTableName);.
15bb0 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d      p->zTableNam
15bc0 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20  e = zNewName;.  
15bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
15be0 65 33 5f 66 72 65 65 28 7a 4e 65 77 4e 61 6d 65  e3_free(zNewName
15bf0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15c00 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20  rc;.}.../*.** A 
15c10 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
15c20 64 75 6c 65 20 74 68 61 74 20 70 72 6f 76 69 64  dule that provid
15c30 65 73 20 66 75 7a 7a 79 20 73 65 61 72 63 68 2e  es fuzzy search.
15c40 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
15c50 65 33 5f 6d 6f 64 75 6c 65 20 73 70 65 6c 6c 66  e3_module spellf
15c60 69 78 31 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20  ix1Module = {.  
15c70 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
15c80 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
15c90 73 69 6f 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  sion */.  spellf
15ca0 69 78 31 43 72 65 61 74 65 2c 20 20 20 20 20 20  ix1Create,      
15cb0 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2d 20     /* xCreate - 
15cc0 68 61 6e 64 6c 65 20 43 52 45 41 54 45 20 56 49  handle CREATE VI
15cd0 52 54 55 41 4c 20 54 41 42 4c 45 20 2a 2f 0a 20  RTUAL TABLE */. 
15ce0 20 73 70 65 6c 6c 66 69 78 31 43 6f 6e 6e 65 63   spellfix1Connec
15cf0 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f  t,        /* xCo
15d00 6e 6e 65 63 74 20 2d 20 72 65 63 6f 6e 6e 65 63  nnect - reconnec
15d10 74 65 64 20 74 6f 20 61 6e 20 65 78 69 73 74 69  ted to an existi
15d20 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 70  ng table */.  sp
15d30 65 6c 6c 66 69 78 31 42 65 73 74 49 6e 64 65 78  ellfix1BestIndex
15d40 2c 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49  ,      /* xBestI
15d50 6e 64 65 78 20 2d 20 66 69 67 75 72 65 20 6f 75  ndex - figure ou
15d60 74 20 68 6f 77 20 74 6f 20 64 6f 20 61 20 71 75  t how to do a qu
15d70 65 72 79 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  ery */.  spellfi
15d80 78 31 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20  x1Disconnect,   
15d90 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
15da0 20 2d 20 63 6c 6f 73 65 20 61 20 63 6f 6e 6e 65   - close a conne
15db0 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c  ction */.  spell
15dc0 66 69 78 31 44 65 73 74 72 6f 79 2c 20 20 20 20  fix1Destroy,    
15dd0 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20      /* xDestroy 
15de0 2d 20 68 61 6e 64 6c 65 20 44 52 4f 50 20 54 41  - handle DROP TA
15df0 42 4c 45 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  BLE */.  spellfi
15e00 78 31 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  x1Open,         
15e10 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65    /* xOpen - ope
15e20 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  n a cursor */.  
15e30 73 70 65 6c 6c 66 69 78 31 43 6c 6f 73 65 2c 20  spellfix1Close, 
15e40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
15e50 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72  se - close a cur
15e60 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  sor */.  spellfi
15e70 78 31 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20  x1Filter,       
15e80 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63    /* xFilter - c
15e90 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f  onfigure scan co
15ea0 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 73  nstraints */.  s
15eb0 70 65 6c 6c 66 69 78 31 4e 65 78 74 2c 20 20 20  pellfix1Next,   
15ec0 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
15ed0 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
15ee0 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  sor */.  spellfi
15ef0 78 31 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  x1Eof,          
15f00 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63    /* xEof - chec
15f10 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61  k for end of sca
15f20 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  n */.  spellfix1
15f30 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20  Column,         
15f40 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
15f50 64 20 64 61 74 61 20 2a 2f 0a 20 20 73 70 65 6c  d data */.  spel
15f60 6c 66 69 78 31 52 6f 77 69 64 2c 20 20 20 20 20  lfix1Rowid,     
15f70 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d       /* xRowid -
15f80 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
15f90 73 70 65 6c 6c 66 69 78 31 55 70 64 61 74 65 2c  spellfix1Update,
15fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64           /* xUpd
15fb0 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ate */.  0,     
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fd0 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20    /* xBegin */. 
15fe0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
15ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
16000 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  nc */.  0,      
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20   /* xCommit */. 
16030 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
16040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
16050 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20  llback */.  0,  
16060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16070 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74       /* xFindMet
16080 68 6f 64 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  hod */.  spellfi
16090 78 31 52 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  x1Rename,       
160a0 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a    /* xRename */.
160b0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  };../*.** Regist
160c0 65 72 20 74 68 65 20 76 61 72 69 6f 75 73 20 66  er the various f
160d0 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  unctions and the
160e0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
160f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
16100 65 6c 6c 66 69 78 31 52 65 67 69 73 74 65 72 28  ellfix1Register(
16110 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
16120 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16130 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 72  OK;.  int i;.  r
16140 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
16150 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
16160 22 73 70 65 6c 6c 66 69 78 31 5f 74 72 61 6e 73  "spellfix1_trans
16170 6c 69 74 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  lit", 1, SQLITE_
16180 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73             trans
161b0 6c 69 74 65 72 61 74 65 53 71 6c 46 75 6e 63 2c  literateSqlFunc,
161c0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
161d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
161e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
161f0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
16200 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 65  db, "spellfix1_e
16210 64 69 74 64 69 73 74 22 2c 20 32 2c 20 53 51 4c  ditdist", 2, SQL
16220 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
16250 64 69 74 64 69 73 74 53 71 6c 46 75 6e 63 2c 20  ditdistSqlFunc, 
16260 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
16270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16280 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16290 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
162a0 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69 78  on(db, "spellfix
162b0 31 5f 70 68 6f 6e 65 68 61 73 68 22 2c 20 31 2c  1_phonehash", 1,
162c0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
162d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162f0 20 20 20 70 68 6f 6e 65 74 69 63 48 61 73 68 53     phoneticHashS
16300 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
16310 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
16320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
16330 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
16340 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
16350 73 70 65 6c 6c 66 69 78 31 5f 73 63 72 69 70 74  spellfix1_script
16360 63 6f 64 65 22 2c 20 31 2c 20 53 51 4c 49 54 45  code", 1, SQLITE
16370 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 20 20 20 20 20 20 20 20 73 63 72 69              scri
163a0 70 74 43 6f 64 65 53 71 6c 46 75 6e 63 2c 20 30  ptCodeSqlFunc, 0
163b0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
163c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
163d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
163e0 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28  3_create_module(
163f0 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 22 2c  db, "spellfix1",
16400 20 26 73 70 65 6c 6c 66 69 78 31 4d 6f 64 75 6c   &spellfix1Modul
16410 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  e, 0);.  }.  if(
16420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16430 7b 0a 20 20 20 20 72 63 20 3d 20 65 64 69 74 44  {.    rc = editD
16440 69 73 74 33 49 6e 73 74 61 6c 6c 28 64 62 29 3b  ist3Install(db);
16450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 65 72 69 66  .  }..  /* Verif
16460 79 20 73 61 6e 69 74 79 20 6f 66 20 74 68 65 20  y sanity of the 
16470 74 72 61 6e 73 6c 69 74 5b 5d 20 74 61 62 6c 65  translit[] table
16480 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
16490 3c 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74  <sizeof(translit
164a0 29 2f 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69  )/sizeof(transli
164b0 74 5b 30 5d 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20  t[0])-1; i++){. 
164c0 20 20 20 61 73 73 65 72 74 28 20 74 72 61 6e 73     assert( trans
164d0 6c 69 74 5b 69 5d 2e 63 46 72 6f 6d 3c 74 72 61  lit[i].cFrom<tra
164e0 6e 73 6c 69 74 5b 69 2b 31 5d 2e 63 46 72 6f 6d  nslit[i+1].cFrom
164f0 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   );.  }..  retur
16500 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
16510 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
16520 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
16530 2f 2a 0a 2a 2a 20 45 78 74 65 6e 73 69 6f 6e 20  /*.** Extension 
16540 6c 6f 61 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  load function..*
16550 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  /.#ifdef _WIN32.
16560 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78  __declspec(dllex
16570 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74  port).#endif.int
16580 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69   sqlite3_spellfi
16590 78 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65  x_init(.  sqlite
165a0 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a  3 *db, .  char *
165b0 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f  *pzErrMsg, .  co
165c0 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
165d0 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29  routines *pApi.)
165e0 7b 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  {.  SQLITE_EXTEN
165f0 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29  SION_INIT2(pApi)
16600 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16610 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
16620 4c 45 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c  LE.  return spel
16630 6c 66 69 78 31 52 65 67 69 73 74 65 72 28 64 62  lfix1Register(db
16640 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
16650 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.