/ Hex Artifact Content
Login

Artifact f88ecb2c0294453ce8b7704b211f5350c41b085b38c8e056852e3a08b0f5e484:


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 66 20 21 64 65 66 69 6e 65 64 28  N.# if !defined(
02a0: 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
02b0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
02c0: 29 0a 23 20 20 64 65 66 69 6e 65 20 4e 44 45 42  ).#  define NDEB
02d0: 55 47 20 31 0a 23 20 65 6e 64 69 66 0a 23 20 69  UG 1.# endif.# i
02e0: 66 20 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47  f defined(NDEBUG
02f0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
0300: 49 54 45 5f 44 45 42 55 47 29 0a 23 20 20 75 6e  ITE_DEBUG).#  un
0310: 64 65 66 20 4e 44 45 42 55 47 0a 23 20 65 6e 64  def NDEBUG.# end
0320: 69 66 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74  if.# include <st
0330: 72 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  ring.h>.# includ
0340: 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 20 69 6e  e <stdio.h>.# in
0350: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
0360: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65  .# include <asse
0370: 72 74 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 41  rt.h>.# define A
0380: 4c 57 41 59 53 28 58 29 20 20 31 0a 23 20 64 65  LWAYS(X)  1.# de
0390: 66 69 6e 65 20 4e 45 56 45 52 28 58 29 20 20 20  fine NEVER(X)   
03a0: 30 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69  0.  typedef unsi
03b0: 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 20 20  gned char u8;.  
03c0: 74 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64  typedef unsigned
03d0: 20 73 68 6f 72 74 20 75 31 36 3b 0a 23 65 6e 64   short u16;.#end
03e0: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79  if.#include <cty
03f0: 70 65 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53  pe.h>..#ifndef S
0400: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
0410: 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 43  ALTABLE../*.** C
0420: 68 61 72 61 63 74 65 72 20 63 6c 61 73 73 65 73  haracter classes
0430: 20 66 6f 72 20 41 53 43 49 49 20 63 68 61 72 61   for ASCII chara
0440: 63 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  cters:.**.**   0
0450: 20 20 20 27 27 20 20 20 20 20 20 20 20 53 69 6c     ''        Sil
0460: 65 6e 74 20 6c 65 74 74 65 72 73 3a 20 20 20 48  ent letters:   H
0470: 20 57 0a 2a 2a 20 20 20 31 20 20 20 27 41 27 20   W.**   1   'A' 
0480: 20 20 20 20 20 20 41 6e 79 20 76 6f 77 65 6c 3a        Any vowel:
0490: 20 20 20 41 20 45 20 49 20 4f 20 55 20 28 59 29     A E I O U (Y)
04a0: 0a 2a 2a 20 20 20 32 20 20 20 27 42 27 20 20 20  .**   2   'B'   
04b0: 20 20 20 20 41 20 62 69 6c 61 62 65 61 6c 20 73      A bilabeal s
04c0: 74 6f 70 20 6f 72 20 66 72 69 63 61 74 69 76 65  top or fricative
04d0: 3a 20 20 42 20 46 20 50 20 56 20 57 0a 2a 2a 20  :  B F P V W.** 
04e0: 20 20 33 20 20 20 27 43 27 20 20 20 20 20 20 20    3   'C'       
04f0: 4f 74 68 65 72 20 66 72 69 63 61 74 69 76 65 73  Other fricatives
0500: 20 6f 72 20 62 61 63 6b 20 73 74 6f 70 73 3a 20   or back stops: 
0510: 20 43 20 47 20 4a 20 4b 20 51 20 53 20 58 20 5a   C G J K Q S X Z
0520: 0a 2a 2a 20 20 20 34 20 20 20 27 44 27 20 20 20  .**   4   'D'   
0530: 20 20 20 20 41 6c 76 65 6f 6c 61 72 20 73 74 6f      Alveolar sto
0540: 70 73 3a 20 20 44 20 54 0a 2a 2a 20 20 20 35 20  ps:  D T.**   5 
0550: 20 20 27 48 27 20 20 20 20 20 20 20 4c 65 74 74    'H'       Lett
0560: 65 72 20 48 20 61 74 20 74 68 65 20 62 65 67 69  er H at the begi
0570: 6e 6e 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 0a  nning of a word.
0580: 2a 2a 20 20 20 36 20 20 20 27 4c 27 20 20 20 20  **   6   'L'    
0590: 20 20 20 47 6c 69 64 65 3a 20 20 4c 0a 2a 2a 20     Glide:  L.** 
05a0: 20 20 37 20 20 20 27 52 27 20 20 20 20 20 20 20    7   'R'       
05b0: 53 65 6d 69 76 6f 77 65 6c 3a 20 20 52 0a 2a 2a  Semivowel:  R.**
05c0: 20 20 20 38 20 20 20 27 4d 27 20 20 20 20 20 20     8   'M'      
05d0: 20 4e 61 73 61 6c 73 3a 20 20 4d 20 4e 0a 2a 2a   Nasals:  M N.**
05e0: 20 20 20 39 20 20 20 27 59 27 20 20 20 20 20 20     9   'Y'      
05f0: 20 4c 65 74 74 65 72 20 59 20 61 74 20 74 68 65   Letter Y at the
0600: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
0610: 77 6f 72 64 2e 0a 2a 2a 20 20 20 31 30 20 20 27  word..**   10  '
0620: 39 27 20 20 20 20 20 20 20 44 69 67 69 74 73 3a  9'       Digits:
0630: 20 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37   0 1 2 3 4 5 6 7
0640: 20 38 20 39 0a 2a 2a 20 20 20 31 31 20 20 27 20   8 9.**   11  ' 
0650: 27 20 20 20 20 20 20 20 57 68 69 74 65 20 73 70  '       White sp
0660: 61 63 65 0a 2a 2a 20 20 20 31 32 20 20 27 3f 27  ace.**   12  '?'
0670: 20 20 20 20 20 20 20 4f 74 68 65 72 2e 0a 2a 2f         Other..*/
0680: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0690: 53 49 4c 45 4e 54 20 20 20 20 20 20 20 20 20 30  SILENT         0
06a0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
06b0: 56 4f 57 45 4c 20 20 20 20 20 20 20 20 20 20 31  VOWEL          1
06c0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
06d0: 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32  B              2
06e0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
06f0: 43 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33  C              3
0700: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0710: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34  D              4
0720: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0730: 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35  H              5
0740: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0750: 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36  L              6
0760: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0770: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37  R              7
0780: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0790: 4d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38  M              8
07a0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
07b0: 59 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39  Y              9
07c0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
07d0: 44 49 47 49 54 20 20 20 20 20 20 20 20 20 31 30  DIGIT         10
07e0: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
07f0: 53 50 41 43 45 20 20 20 20 20 20 20 20 20 31 31  SPACE         11
0800: 0a 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f  .#define CCLASS_
0810: 4f 54 48 45 52 20 20 20 20 20 20 20 20 20 31 32  OTHER         12
0820: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
0830: 6f 77 69 6e 67 20 74 61 62 6c 65 20 67 69 76 65  owing table give
0840: 73 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  s the character 
0850: 63 6c 61 73 73 20 66 6f 72 20 6e 6f 6e 2d 69 6e  class for non-in
0860: 69 74 69 61 6c 20 41 53 43 49 49 0a 2a 2a 20 63  itial ASCII.** c
0870: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
0880: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
0890: 6e 65 64 20 63 68 61 72 20 6d 69 64 43 6c 61 73  ned char midClas
08a0: 73 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 20 20 2a 2f  s[] = {. /*   */
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: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a  OTHER,    /*   *
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 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0950: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
0960: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a  _OTHER,   /*   *
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: 53 50 41 43 45 2c 20 20 20 20 2f 2a 20 20 20 2a  SPACE,    /*   *
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 53 50 41 43 45 2c 20 20   CCLASS_SPACE,  
09e0: 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
09f0: 5f 53 50 41 43 45 2c 20 20 20 2f 2a 20 20 20 2a  _SPACE,   /*   *
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 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0b30: 20 2f 2a 20 20 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 20 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 20 20 2a 2f 20 43 43 4c 41 53 53    /*   */ CCLASS
0b70: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 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 20 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 20 20 2a  _OTHER,   /*   *
0bb0: 2f 20 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 0a  / CCLASS_SPACE,.
0bc0: 20 2f 2a 20 21 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ! */ CCLASS_
0bd0: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 22 20 2a  OTHER,    /* " *
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 23 20 2a 2f 20 43 43 4c 41 53 53    /* # */ CCLASS
0c00: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 24 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 25 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 26 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 27 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ' */ CCLASS_
0c60: 53 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 28 20 2a  SILENT,   /* ( *
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 29 20 2a 2f 20 43 43 4c 41 53 53    /* ) */ CCLASS
0c90: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 2a 20 2a 2f  _OTHER,. /* * */
0ca0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0cb0: 20 20 2f 2a 20 2b 20 2a 2f 20 43 43 4c 41 53 53    /* + */ CCLASS
0cc0: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 2c 20 2a  _OTHER,   /* , *
0cd0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0ce0: 20 2f 2a 20 2d 20 2a 2f 20 43 43 4c 41 53 53 5f   /* - */ CCLASS_
0cf0: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 2e 20 2a  OTHER,    /* . *
0d00: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0d10: 20 20 2f 2a 20 2f 20 2a 2f 20 43 43 4c 41 53 53    /* / */ CCLASS
0d20: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 30 20 2a 2f  _OTHER,. /* 0 */
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 31 20 2a 2f 20 43 43 4c 41 53 53    /* 1 */ CCLASS
0d50: 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20 32 20 2a  _DIGIT,   /* 2 *
0d60: 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a  / CCLASS_DIGIT,.
0d70: 20 2f 2a 20 33 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 3 */ CCLASS_
0d80: 44 49 47 49 54 2c 20 20 20 20 2f 2a 20 34 20 2a  DIGIT,    /* 4 *
0d90: 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20  / CCLASS_DIGIT, 
0da0: 20 20 2f 2a 20 35 20 2a 2f 20 43 43 4c 41 53 53    /* 5 */ CCLASS
0db0: 5f 44 49 47 49 54 2c 0a 20 2f 2a 20 36 20 2a 2f  _DIGIT,. /* 6 */
0dc0: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20   CCLASS_DIGIT,  
0dd0: 20 20 2f 2a 20 37 20 2a 2f 20 43 43 4c 41 53 53    /* 7 */ CCLASS
0de0: 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20 38 20 2a  _DIGIT,   /* 8 *
0df0: 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a  / CCLASS_DIGIT,.
0e00: 20 2f 2a 20 39 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 9 */ CCLASS_
0e10: 44 49 47 49 54 2c 20 20 20 20 2f 2a 20 3a 20 2a  DIGIT,    /* : *
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 3b 20 2a 2f 20 43 43 4c 41 53 53    /* ; */ CCLASS
0e40: 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 3c 20 2a 2f  _OTHER,. /* < */
0e50: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0e60: 20 20 2f 2a 20 3d 20 2a 2f 20 43 43 4c 41 53 53    /* = */ CCLASS
0e70: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 3e 20 2a  _OTHER,   /* > *
0e80: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
0e90: 20 2f 2a 20 3f 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ? */ CCLASS_
0ea0: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 40 20 2a  OTHER,    /* @ *
0eb0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
0ec0: 20 20 2f 2a 20 41 20 2a 2f 20 43 43 4c 41 53 53    /* A */ CCLASS
0ed0: 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 42 20 2a 2f  _VOWEL,. /* B */
0ee0: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
0ef0: 20 20 2f 2a 20 43 20 2a 2f 20 43 43 4c 41 53 53    /* C */ CCLASS
0f00: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 44 20 2a  _C,       /* D *
0f10: 2f 20 43 43 4c 41 53 53 5f 44 2c 0a 20 2f 2a 20  / CCLASS_D,. /* 
0f20: 45 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  E */ CCLASS_VOWE
0f30: 4c 2c 20 20 20 20 2f 2a 20 46 20 2a 2f 20 43 43  L,    /* F */ CC
0f40: 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a  LASS_B,       /*
0f50: 20 47 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a   G */ CCLASS_C,.
0f60: 20 2f 2a 20 48 20 2a 2f 20 43 43 4c 41 53 53 5f   /* H */ CCLASS_
0f70: 53 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 49 20 2a  SILENT,   /* I *
0f80: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
0f90: 20 20 2f 2a 20 4a 20 2a 2f 20 43 43 4c 41 53 53    /* J */ CCLASS
0fa0: 5f 43 2c 0a 20 2f 2a 20 4b 20 2a 2f 20 43 43 4c  _C,. /* K */ CCL
0fb0: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_C,        /*
0fc0: 20 4c 20 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c 20   L */ CCLASS_L, 
0fd0: 20 20 20 20 20 20 2f 2a 20 4d 20 2a 2f 20 43 43        /* M */ CC
0fe0: 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 4e 20 2a 2f  LASS_M,. /* N */
0ff0: 20 43 43 4c 41 53 53 5f 4d 2c 20 20 20 20 20 20   CCLASS_M,      
1000: 20 20 2f 2a 20 4f 20 2a 2f 20 43 43 4c 41 53 53    /* O */ CCLASS
1010: 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20 50 20 2a  _VOWEL,   /* P *
1020: 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20  / CCLASS_B,. /* 
1030: 51 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  Q */ CCLASS_C,  
1040: 20 20 20 20 20 20 2f 2a 20 52 20 2a 2f 20 43 43        /* R */ CC
1050: 4c 41 53 53 5f 52 2c 20 20 20 20 20 20 20 2f 2a  LASS_R,       /*
1060: 20 53 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a   S */ CCLASS_C,.
1070: 20 2f 2a 20 54 20 2a 2f 20 43 43 4c 41 53 53 5f   /* T */ CCLASS_
1080: 44 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 20 2a  D,        /* U *
1090: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
10a0: 20 20 2f 2a 20 56 20 2a 2f 20 43 43 4c 41 53 53    /* V */ CCLASS
10b0: 5f 42 2c 0a 20 2f 2a 20 57 20 2a 2f 20 43 43 4c  _B,. /* W */ CCL
10c0: 41 53 53 5f 42 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_B,        /*
10d0: 20 58 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20   X */ CCLASS_C, 
10e0: 20 20 20 20 20 20 2f 2a 20 59 20 2a 2f 20 43 43        /* Y */ CC
10f0: 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20  LASS_VOWEL,. /* 
1100: 5a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  Z */ CCLASS_C,  
1110: 20 20 20 20 20 20 2f 2a 20 5b 20 2a 2f 20 43 43        /* [ */ CC
1120: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1130: 20 5c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   \ */ CCLASS_OTH
1140: 45 52 2c 0a 20 2f 2a 20 5d 20 2a 2f 20 43 43 4c  ER,. /* ] */ CCL
1150: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1160: 20 5e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ^ */ CCLASS_OTH
1170: 45 52 2c 20 20 20 2f 2a 20 5f 20 2a 2f 20 43 43  ER,   /* _ */ CC
1180: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1190: 60 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ` */ CCLASS_OTHE
11a0: 52 2c 20 20 20 20 2f 2a 20 61 20 2a 2f 20 43 43  R,    /* a */ CC
11b0: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a  LASS_VOWEL,   /*
11c0: 20 62 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a   b */ CCLASS_B,.
11d0: 20 2f 2a 20 63 20 2a 2f 20 43 43 4c 41 53 53 5f   /* c */ CCLASS_
11e0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 64 20 2a  C,        /* d *
11f0: 2f 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20 20  / CCLASS_D,     
1200: 20 20 2f 2a 20 65 20 2a 2f 20 43 43 4c 41 53 53    /* e */ CCLASS
1210: 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 66 20 2a 2f  _VOWEL,. /* f */
1220: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
1230: 20 20 2f 2a 20 67 20 2a 2f 20 43 43 4c 41 53 53    /* g */ CCLASS
1240: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 68 20 2a  _C,       /* h *
1250: 2f 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c  / CCLASS_SILENT,
1260: 0a 20 2f 2a 20 69 20 2a 2f 20 43 43 4c 41 53 53  . /* i */ CCLASS
1270: 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 6a 20  _VOWEL,    /* j 
1280: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20  */ CCLASS_C,    
1290: 20 20 20 2f 2a 20 6b 20 2a 2f 20 43 43 4c 41 53     /* k */ CCLAS
12a0: 53 5f 43 2c 0a 20 2f 2a 20 6c 20 2a 2f 20 43 43  S_C,. /* l */ CC
12b0: 4c 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 20 2f  LASS_L,        /
12c0: 2a 20 6d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c  * m */ CCLASS_M,
12d0: 20 20 20 20 20 20 20 2f 2a 20 6e 20 2a 2f 20 43         /* n */ C
12e0: 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 6f 20 2a  CLASS_M,. /* o *
12f0: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
1300: 20 20 20 2f 2a 20 70 20 2a 2f 20 43 43 4c 41 53     /* p */ CCLAS
1310: 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 71 20  S_B,       /* q 
1320: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a  */ CCLASS_C,. /*
1330: 20 72 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c 20   r */ CCLASS_R, 
1340: 20 20 20 20 20 20 20 2f 2a 20 73 20 2a 2f 20 43         /* s */ C
1350: 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f  CLASS_C,       /
1360: 2a 20 74 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c  * t */ CCLASS_D,
1370: 0a 20 2f 2a 20 75 20 2a 2f 20 43 43 4c 41 53 53  . /* u */ CCLASS
1380: 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 76 20  _VOWEL,    /* v 
1390: 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20  */ CCLASS_B,    
13a0: 20 20 20 2f 2a 20 77 20 2a 2f 20 43 43 4c 41 53     /* w */ CCLAS
13b0: 53 5f 42 2c 0a 20 2f 2a 20 78 20 2a 2f 20 43 43  S_B,. /* x */ CC
13c0: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f  LASS_C,        /
13d0: 2a 20 79 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f  * y */ CCLASS_VO
13e0: 57 45 4c 2c 20 20 20 2f 2a 20 7a 20 2a 2f 20 43  WEL,   /* z */ C
13f0: 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 7b 20 2a  CLASS_C,. /* { *
1400: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
1410: 20 20 20 2f 2a 20 7c 20 2a 2f 20 43 43 4c 41 53     /* | */ CCLAS
1420: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 7d 20  S_OTHER,   /* } 
1430: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
1440: 0a 20 2f 2a 20 7e 20 2a 2f 20 43 43 4c 41 53 53  . /* ~ */ CCLASS
1450: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20  _OTHER,    /*   
1460: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
1470: 20 20 20 0a 7d 3b 0a 2f 2a 20 0a 2a 2a 20 54 68     .};./* .** Th
1480: 69 73 20 74 61 62 6c 65 73 20 67 69 76 65 73 20  is tables gives 
1490: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 63 6c  the character cl
14a0: 61 73 73 20 66 6f 72 20 41 53 43 49 49 20 63 68  ass for ASCII ch
14b0: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 66 6f  aracters that fo
14c0: 72 6d 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  rm the.** initia
14d0: 6c 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61  l character of a
14e0: 20 77 6f 72 64 2e 20 20 54 68 65 20 6f 6e 6c 79   word.  The only
14f0: 20 64 69 66 66 65 72 65 6e 63 65 20 66 72 6f 6d   difference from
1500: 20 6d 69 64 43 6c 61 73 73 20 69 73 20 77 69 74   midClass is wit
1510: 68 0a 2a 2a 20 74 68 65 20 6c 65 74 74 65 72 73  h.** the letters
1520: 20 48 2c 20 57 2c 20 61 6e 64 20 59 2e 0a 2a 2f   H, W, and Y..*/
1530: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
1540: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 69 74  signed char init
1550: 43 6c 61 73 73 5b 5d 20 3d 20 7b 0a 20 2f 2a 20  Class[] = {. /* 
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 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
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 4f 54 48 45    */ CCLASS_OTHE
1600: 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  R,    /*   */ CC
1610: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
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 53 50 41 43 45 2c 20 20 20 20 2f 2a  ASS_SPACE,    /*
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 53 50 41 43    */ CCLASS_SPAC
1690: 45 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43  E,    /*   */ CC
16a0: 4c 41 53 53 5f 53 50 41 43 45 2c 20 20 20 2f 2a  LASS_SPACE,   /*
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 4f 54 48     */ CCLASS_OTH
17e0: 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ER,. /*   */ CCL
17f0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1800: 20 20 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 20 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: 20 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 20 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 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41     */ CCLASS_SPA
1870: 43 45 2c 0a 20 2f 2a 20 21 20 2a 2f 20 43 43 4c  CE,. /* ! */ CCL
1880: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1890: 20 22 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 23 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: 24 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 25 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 26 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 27 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 28 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 29 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: 2a 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  * */ CCLASS_OTHE
1960: 52 2c 20 20 20 20 2f 2a 20 2b 20 2a 2f 20 43 43  R,    /* + */ CC
1970: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1980: 20 2c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   , */ CCLASS_OTH
1990: 45 52 2c 0a 20 2f 2a 20 2d 20 2a 2f 20 43 43 4c  ER,. /* - */ CCL
19a0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
19b0: 20 2e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   . */ CCLASS_OTH
19c0: 45 52 2c 20 20 20 2f 2a 20 2f 20 2a 2f 20 43 43  ER,   /* / */ CC
19d0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
19e0: 30 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  0 */ CCLASS_DIGI
19f0: 54 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 20 43 43  T,    /* 1 */ CC
1a00: 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a  LASS_DIGIT,   /*
1a10: 20 32 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   2 */ CCLASS_DIG
1a20: 49 54 2c 0a 20 2f 2a 20 33 20 2a 2f 20 43 43 4c  IT,. /* 3 */ CCL
1a30: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a  ASS_DIGIT,    /*
1a40: 20 34 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   4 */ CCLASS_DIG
1a50: 49 54 2c 20 20 20 2f 2a 20 35 20 2a 2f 20 43 43  IT,   /* 5 */ CC
1a60: 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20  LASS_DIGIT,. /* 
1a70: 36 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  6 */ CCLASS_DIGI
1a80: 54 2c 20 20 20 20 2f 2a 20 37 20 2a 2f 20 43 43  T,    /* 7 */ CC
1a90: 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a  LASS_DIGIT,   /*
1aa0: 20 38 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47   8 */ CCLASS_DIG
1ab0: 49 54 2c 0a 20 2f 2a 20 39 20 2a 2f 20 43 43 4c  IT,. /* 9 */ CCL
1ac0: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a  ASS_DIGIT,    /*
1ad0: 20 3a 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 3b 20 2a 2f 20 43 43  ER,   /* ; */ CC
1af0: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1b00: 3c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  < */ CCLASS_OTHE
1b10: 52 2c 20 20 20 20 2f 2a 20 3d 20 2a 2f 20 43 43  R,    /* = */ CC
1b20: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1b30: 20 3e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   > */ CCLASS_OTH
1b40: 45 52 2c 0a 20 2f 2a 20 3f 20 2a 2f 20 43 43 4c  ER,. /* ? */ CCL
1b50: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1b60: 20 40 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   @ */ CCLASS_OTH
1b70: 45 52 2c 20 20 20 2f 2a 20 41 20 2a 2f 20 43 43  ER,   /* A */ CC
1b80: 4c 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20  LASS_VOWEL,. /* 
1b90: 42 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20  B */ CCLASS_B,  
1ba0: 20 20 20 20 20 20 2f 2a 20 43 20 2a 2f 20 43 43        /* C */ CC
1bb0: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a  LASS_C,       /*
1bc0: 20 44 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a   D */ CCLASS_D,.
1bd0: 20 2f 2a 20 45 20 2a 2f 20 43 43 4c 41 53 53 5f   /* E */ CCLASS_
1be0: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 46 20 2a  VOWEL,    /* F *
1bf0: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
1c00: 20 20 2f 2a 20 47 20 2a 2f 20 43 43 4c 41 53 53    /* G */ CCLASS
1c10: 5f 43 2c 0a 20 2f 2a 20 48 20 2a 2f 20 43 43 4c  _C,. /* H */ CCL
1c20: 41 53 53 5f 53 49 4c 45 4e 54 2c 20 20 20 2f 2a  ASS_SILENT,   /*
1c30: 20 49 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   I */ CCLASS_VOW
1c40: 45 4c 2c 20 20 20 2f 2a 20 4a 20 2a 2f 20 43 43  EL,   /* J */ CC
1c50: 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 4b 20 2a 2f  LASS_C,. /* K */
1c60: 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20   CCLASS_C,      
1c70: 20 20 2f 2a 20 4c 20 2a 2f 20 43 43 4c 41 53 53    /* L */ CCLASS
1c80: 5f 4c 2c 20 20 20 20 20 20 20 2f 2a 20 4d 20 2a  _L,       /* M *
1c90: 2f 20 43 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20  / CCLASS_M,. /* 
1ca0: 4e 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 20 20  N */ CCLASS_M,  
1cb0: 20 20 20 20 20 20 2f 2a 20 4f 20 2a 2f 20 43 43        /* O */ CC
1cc0: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a  LASS_VOWEL,   /*
1cd0: 20 50 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a   P */ CCLASS_B,.
1ce0: 20 2f 2a 20 51 20 2a 2f 20 43 43 4c 41 53 53 5f   /* Q */ CCLASS_
1cf0: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 20 2a  C,        /* R *
1d00: 2f 20 43 43 4c 41 53 53 5f 52 2c 20 20 20 20 20  / CCLASS_R,     
1d10: 20 20 2f 2a 20 53 20 2a 2f 20 43 43 4c 41 53 53    /* S */ CCLASS
1d20: 5f 43 2c 0a 20 2f 2a 20 54 20 2a 2f 20 43 43 4c  _C,. /* T */ CCL
1d30: 41 53 53 5f 44 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_D,        /*
1d40: 20 55 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   U */ CCLASS_VOW
1d50: 45 4c 2c 20 20 20 2f 2a 20 56 20 2a 2f 20 43 43  EL,   /* V */ CC
1d60: 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20 57 20 2a 2f  LASS_B,. /* W */
1d70: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
1d80: 20 20 2f 2a 20 58 20 2a 2f 20 43 43 4c 41 53 53    /* X */ CCLASS
1d90: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 59 20 2a  _C,       /* Y *
1da0: 2f 20 43 43 4c 41 53 53 5f 59 2c 0a 20 2f 2a 20  / CCLASS_Y,. /* 
1db0: 5a 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  Z */ CCLASS_C,  
1dc0: 20 20 20 20 20 20 2f 2a 20 5b 20 2a 2f 20 43 43        /* [ */ CC
1dd0: 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a  LASS_OTHER,   /*
1de0: 20 5c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   \ */ CCLASS_OTH
1df0: 45 52 2c 0a 20 2f 2a 20 5d 20 2a 2f 20 43 43 4c  ER,. /* ] */ CCL
1e00: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a  ASS_OTHER,    /*
1e10: 20 5e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48   ^ */ CCLASS_OTH
1e20: 45 52 2c 20 20 20 2f 2a 20 5f 20 2a 2f 20 43 43  ER,   /* _ */ CC
1e30: 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20  LASS_OTHER,. /* 
1e40: 60 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ` */ CCLASS_OTHE
1e50: 52 2c 20 20 20 20 2f 2a 20 61 20 2a 2f 20 43 43  R,    /* a */ CC
1e60: 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a  LASS_VOWEL,   /*
1e70: 20 62 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a   b */ CCLASS_B,.
1e80: 20 2f 2a 20 63 20 2a 2f 20 43 43 4c 41 53 53 5f   /* c */ CCLASS_
1e90: 43 2c 20 20 20 20 20 20 20 20 2f 2a 20 64 20 2a  C,        /* d *
1ea0: 2f 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20 20  / CCLASS_D,     
1eb0: 20 20 2f 2a 20 65 20 2a 2f 20 43 43 4c 41 53 53    /* e */ CCLASS
1ec0: 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 66 20 2a 2f  _VOWEL,. /* f */
1ed0: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
1ee0: 20 20 2f 2a 20 67 20 2a 2f 20 43 43 4c 41 53 53    /* g */ CCLASS
1ef0: 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20 68 20 2a  _C,       /* h *
1f00: 2f 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c  / CCLASS_SILENT,
1f10: 0a 20 2f 2a 20 69 20 2a 2f 20 43 43 4c 41 53 53  . /* i */ CCLASS
1f20: 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 6a 20  _VOWEL,    /* j 
1f30: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20  */ CCLASS_C,    
1f40: 20 20 20 2f 2a 20 6b 20 2a 2f 20 43 43 4c 41 53     /* k */ CCLAS
1f50: 53 5f 43 2c 0a 20 2f 2a 20 6c 20 2a 2f 20 43 43  S_C,. /* l */ CC
1f60: 4c 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 20 2f  LASS_L,        /
1f70: 2a 20 6d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c  * m */ CCLASS_M,
1f80: 20 20 20 20 20 20 20 2f 2a 20 6e 20 2a 2f 20 43         /* n */ C
1f90: 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 6f 20 2a  CLASS_M,. /* o *
1fa0: 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20  / CCLASS_VOWEL, 
1fb0: 20 20 20 2f 2a 20 70 20 2a 2f 20 43 43 4c 41 53     /* p */ CCLAS
1fc0: 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 71 20  S_B,       /* q 
1fd0: 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a  */ CCLASS_C,. /*
1fe0: 20 72 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c 20   r */ CCLASS_R, 
1ff0: 20 20 20 20 20 20 20 2f 2a 20 73 20 2a 2f 20 43         /* s */ C
2000: 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f  CLASS_C,       /
2010: 2a 20 74 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c  * t */ CCLASS_D,
2020: 0a 20 2f 2a 20 75 20 2a 2f 20 43 43 4c 41 53 53  . /* u */ CCLASS
2030: 5f 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 76 20  _VOWEL,    /* v 
2040: 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20  */ CCLASS_B,    
2050: 20 20 20 2f 2a 20 77 20 2a 2f 20 43 43 4c 41 53     /* w */ CCLAS
2060: 53 5f 42 2c 0a 20 2f 2a 20 78 20 2a 2f 20 43 43  S_B,. /* x */ CC
2070: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f  LASS_C,        /
2080: 2a 20 79 20 2a 2f 20 43 43 4c 41 53 53 5f 59 2c  * y */ CCLASS_Y,
2090: 20 20 20 20 20 20 20 2f 2a 20 7a 20 2a 2f 20 43         /* z */ C
20a0: 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 7b 20 2a  CLASS_C,. /* { *
20b0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
20c0: 20 20 20 2f 2a 20 7c 20 2a 2f 20 43 43 4c 41 53     /* | */ CCLAS
20d0: 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 7d 20  S_OTHER,   /* } 
20e0: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
20f0: 0a 20 2f 2a 20 7e 20 2a 2f 20 43 43 4c 41 53 53  . /* ~ */ CCLASS
2100: 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20  _OTHER,    /*   
2110: 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c  */ CCLASS_OTHER,
2120: 20 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61     .};../*.** Ma
2130: 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 63  pping from the c
2140: 68 61 72 61 63 74 65 72 20 63 6c 61 73 73 20 6e  haracter class n
2150: 75 6d 62 65 72 20 28 30 2d 31 33 29 20 74 6f 20  umber (0-13) to 
2160: 61 20 73 79 6d 62 6f 6c 20 66 6f 72 20 65 61 63  a symbol for eac
2170: 68 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 63  h.** character c
2180: 6c 61 73 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  lass.  Note that
2190: 20 69 6e 69 74 43 6c 61 73 73 5b 5d 20 63 61 6e   initClass[] can
21a0: 20 62 65 20 75 73 65 64 20 74 6f 20 6d 61 70 20   be used to map 
21b0: 74 68 65 20 63 6c 61 73 73 0a 2a 2a 20 73 79 6d  the class.** sym
21c0: 62 6f 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  bol back into th
21d0: 65 20 63 6c 61 73 73 20 6e 75 6d 62 65 72 2e 0a  e class number..
21e0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
21f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c  unsigned char cl
2200: 61 73 73 4e 61 6d 65 5b 5d 20 3d 20 22 2e 41 42  assName[] = ".AB
2210: 43 44 48 4c 52 4d 59 39 20 3f 22 3b 0a 0a 2f 2a  CDHLRMY9 ?";../*
2220: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 22  .** Generate a "
2230: 70 68 6f 6e 65 74 69 63 20 68 61 73 68 22 20 66  phonetic hash" f
2240: 72 6f 6d 20 61 20 73 74 72 69 6e 67 20 6f 66 20  rom a string of 
2250: 41 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73  ASCII characters
2260: 0a 2a 2a 20 69 6e 20 7a 49 6e 5b 30 2e 2e 6e 49  .** in zIn[0..nI
2270: 6e 2d 31 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  n-1]..**.**   * 
2280: 4d 61 70 20 63 68 61 72 61 63 74 65 72 73 20 62  Map characters b
2290: 79 20 63 68 61 72 61 63 74 65 72 20 63 6c 61 73  y character clas
22a0: 73 20 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f  s as defined abo
22b0: 76 65 2e 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20  ve..**   * Omit 
22c0: 64 6f 75 62 6c 65 2d 6c 65 74 74 65 72 73 0a 2a  double-letters.*
22d0: 2a 20 20 20 2a 20 4f 6d 69 74 20 76 6f 77 65 6c  *   * Omit vowel
22e0: 73 20 62 65 73 69 64 65 20 52 20 61 6e 64 20 4c  s beside R and L
22f0: 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 54 20 77  .**   * Omit T w
2300: 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  hen followed by 
2310: 43 48 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 57  CH.**   * Omit W
2320: 20 77 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62   when followed b
2330: 79 20 52 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20  y R.**   * Omit 
2340: 44 20 77 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20  D when followed 
2350: 62 79 20 4a 20 6f 72 20 47 0a 2a 2a 20 20 20 2a  by J or G.**   *
2360: 20 4f 6d 69 74 20 4b 20 69 6e 20 4b 4e 20 6f 72   Omit K in KN or
2370: 20 47 20 69 6e 20 47 4e 20 61 74 20 74 68 65 20   G in GN at the 
2380: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 77  beginning of a w
2390: 6f 72 64 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ord.**.** Space 
23a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
23b0: 6c 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  lt is obtained f
23c0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
23d0: 6f 63 28 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  oc().**.** Retur
23e0: 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
23f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2400: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 75  s.  .*/.static u
2410: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 68  nsigned char *ph
2420: 6f 6e 65 74 69 63 48 61 73 68 28 63 6f 6e 73 74  oneticHash(const
2430: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2440: 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20  zIn, int nIn){. 
2450: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2460: 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zOut = sqlite3_m
2470: 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 20 2b 20 31  alloc64( nIn + 1
2480: 20 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   );.  int i;.  i
2490: 6e 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 63  nt nOut = 0;.  c
24a0: 68 61 72 20 63 50 72 65 76 20 3d 20 30 78 37 37  har cPrev = 0x77
24b0: 3b 0a 20 20 63 68 61 72 20 63 50 72 65 76 58 20  ;.  char cPrevX 
24c0: 3d 20 30 78 37 37 3b 0a 20 20 63 6f 6e 73 74 20  = 0x77;.  const 
24d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
24e0: 43 6c 61 73 73 20 3d 20 69 6e 69 74 43 6c 61 73  Class = initClas
24f0: 73 3b 0a 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d  s;..  if( zOut==
2500: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2510: 69 66 28 20 6e 49 6e 3e 32 20 29 7b 0a 20 20 20  if( nIn>2 ){.   
2520: 20 73 77 69 74 63 68 28 20 7a 49 6e 5b 30 5d 20   switch( zIn[0] 
2530: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 67  ){.      case 'g
2540: 27 3a 20 0a 20 20 20 20 20 20 63 61 73 65 20 27  ': .      case '
2550: 6b 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  k': {.        if
2560: 28 20 7a 49 6e 5b 31 5d 3d 3d 27 6e 27 20 29 7b  ( zIn[1]=='n' ){
2570: 20 7a 49 6e 2b 2b 3b 20 6e 49 6e 2d 2d 3b 20 7d   zIn++; nIn--; }
2580: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25a0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
25b0: 49 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 6e  In; i++){.    un
25c0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20  signed char c = 
25d0: 7a 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  zIn[i];.    if( 
25e0: 69 2b 31 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 20  i+1<nIn ){.     
25f0: 20 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 7a   if( c=='w' && z
2600: 49 6e 5b 69 2b 31 5d 3d 3d 27 72 27 20 29 20 63  In[i+1]=='r' ) c
2610: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
2620: 66 28 20 63 3d 3d 27 64 27 20 26 26 20 28 7a 49  f( c=='d' && (zI
2630: 6e 5b 69 2b 31 5d 3d 3d 27 6a 27 20 7c 7c 20 7a  n[i+1]=='j' || z
2640: 49 6e 5b 69 2b 31 5d 3d 3d 27 67 27 29 20 29 20  In[i+1]=='g') ) 
2650: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2660: 69 66 28 20 69 2b 32 3c 6e 49 6e 20 29 7b 0a 20  if( i+2<nIn ){. 
2670: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 74         if( c=='t
2680: 27 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27  ' && zIn[i+1]=='
2690: 63 27 20 26 26 20 7a 49 6e 5b 69 2b 32 5d 3d 3d  c' && zIn[i+2]==
26a0: 27 68 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  'h' ) continue;.
26b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26c0: 20 20 63 20 3d 20 61 43 6c 61 73 73 5b 63 26 30    c = aClass[c&0
26d0: 78 37 66 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d  x7f];.    if( c=
26e0: 3d 43 43 4c 41 53 53 5f 53 50 41 43 45 20 29 20  =CCLASS_SPACE ) 
26f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2700: 28 20 63 3d 3d 43 43 4c 41 53 53 5f 4f 54 48 45  ( c==CCLASS_OTHE
2710: 52 20 26 26 20 63 50 72 65 76 21 3d 43 43 4c 41  R && cPrev!=CCLA
2720: 53 53 5f 44 49 47 49 54 20 29 20 63 6f 6e 74 69  SS_DIGIT ) conti
2730: 6e 75 65 3b 0a 20 20 20 20 61 43 6c 61 73 73 20  nue;.    aClass 
2740: 3d 20 6d 69 64 43 6c 61 73 73 3b 0a 20 20 20 20  = midClass;.    
2750: 69 66 28 20 63 3d 3d 43 43 4c 41 53 53 5f 56 4f  if( c==CCLASS_VO
2760: 57 45 4c 20 26 26 20 28 63 50 72 65 76 58 3d 3d  WEL && (cPrevX==
2770: 43 43 4c 41 53 53 5f 52 20 7c 7c 20 63 50 72 65  CCLASS_R || cPre
2780: 76 58 3d 3d 43 43 4c 41 53 53 5f 4c 29 20 29 7b  vX==CCLASS_L) ){
2790: 0a 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  .       continue
27a0: 3b 20 2f 2a 20 4e 6f 20 76 6f 77 65 6c 73 20 62  ; /* No vowels b
27b0: 65 73 69 64 65 20 4c 20 6f 72 20 52 20 2a 2f 20  eside L or R */ 
27c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
27d0: 63 3d 3d 43 43 4c 41 53 53 5f 52 20 7c 7c 20 63  c==CCLASS_R || c
27e0: 3d 3d 43 43 4c 41 53 53 5f 4c 29 20 26 26 20 63  ==CCLASS_L) && c
27f0: 50 72 65 76 58 3d 3d 43 43 4c 41 53 53 5f 56 4f  PrevX==CCLASS_VO
2800: 57 45 4c 20 29 7b 0a 20 20 20 20 20 20 20 6e 4f  WEL ){.       nO
2810: 75 74 2d 2d 3b 20 20 20 2f 2a 20 4e 6f 20 76 6f  ut--;   /* No vo
2820: 77 65 6c 73 20 62 65 73 69 64 65 20 4c 20 6f 72  wels beside L or
2830: 20 52 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   R */.    }.    
2840: 63 50 72 65 76 20 3d 20 63 3b 0a 20 20 20 20 69  cPrev = c;.    i
2850: 66 28 20 63 3d 3d 43 43 4c 41 53 53 5f 53 49 4c  f( c==CCLASS_SIL
2860: 45 4e 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ENT ) continue;.
2870: 20 20 20 20 63 50 72 65 76 58 20 3d 20 63 3b 0a      cPrevX = c;.
2880: 20 20 20 20 63 20 3d 20 63 6c 61 73 73 4e 61 6d      c = classNam
2890: 65 5b 63 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e[c];.    assert
28a0: 28 20 6e 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 20  ( nOut>=0 );.   
28b0: 20 69 66 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20   if( nOut==0 || 
28c0: 63 21 3d 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20  c!=zOut[nOut-1] 
28d0: 29 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d  ) zOut[nOut++] =
28e0: 20 63 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6e   c;.  }.  zOut[n
28f0: 4f 75 74 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  Out] = 0;.  retu
2900: 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zOut;.}../*.*
2910: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 53 51 4c  * This is an SQL
2920: 20 66 75 6e 63 74 69 6f 6e 20 77 72 61 70 70 65   function wrappe
2930: 72 20 61 72 6f 75 6e 64 20 70 68 6f 6e 65 74 69  r around phoneti
2940: 63 48 61 73 68 28 29 2e 20 20 53 65 65 0a 2a 2a  cHash().  See.**
2950: 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e   the description
2960: 20 6f 66 20 70 68 6f 6e 65 74 69 63 48 61 73 68   of phoneticHash
2970: 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
2980: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
2990: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 68  /.static void ph
29a0: 6f 6e 65 74 69 63 48 61 73 68 53 71 6c 46 75 6e  oneticHashSqlFun
29b0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
29c0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
29d0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
29e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
29f0: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  v.){.  const uns
2a00: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b  igned char *zIn;
2a10: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2a20: 20 2a 7a 4f 75 74 3b 0a 0a 20 20 7a 49 6e 20 3d   *zOut;..  zIn =
2a30: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2a40: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
2a50: 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74  if( zIn==0 ) ret
2a60: 75 72 6e 3b 0a 20 20 7a 4f 75 74 20 3d 20 70 68  urn;.  zOut = ph
2a70: 6f 6e 65 74 69 63 48 61 73 68 28 7a 49 6e 2c 20  oneticHash(zIn, 
2a80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
2a90: 74 65 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20  tes(argv[0]));. 
2aa0: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a   if( zOut==0 ){.
2ab0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2ac0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
2ad0: 6f 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65  ontext);.  }else
2ae0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
2af0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
2b00: 74 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20  t, (char*)zOut, 
2b10: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
2b20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2b30: 52 65 74 75 72 6e 20 74 68 65 20 63 68 61 72 61  Return the chara
2b40: 63 74 65 72 20 63 6c 61 73 73 20 6e 75 6d 62 65  cter class numbe
2b50: 72 20 66 6f 72 20 61 20 63 68 61 72 61 63 74 65  r for a characte
2b60: 72 20 67 69 76 65 6e 20 69 74 73 0a 2a 2a 20 63  r given its.** c
2b70: 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69  ontext..*/.stati
2b80: 63 20 63 68 61 72 20 63 68 61 72 61 63 74 65 72  c char character
2b90: 43 6c 61 73 73 28 63 68 61 72 20 63 50 72 65 76  Class(char cPrev
2ba0: 2c 20 63 68 61 72 20 63 29 7b 0a 20 20 72 65 74  , char c){.  ret
2bb0: 75 72 6e 20 63 50 72 65 76 3d 3d 30 20 3f 20 69  urn cPrev==0 ? i
2bc0: 6e 69 74 43 6c 61 73 73 5b 63 26 30 78 37 66 5d  nitClass[c&0x7f]
2bd0: 20 3a 20 6d 69 64 43 6c 61 73 73 5b 63 26 30 78   : midClass[c&0x
2be0: 37 66 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  7f];.}../*.** Re
2bf0: 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66  turn the cost of
2c00: 20 69 6e 73 65 72 74 69 6e 67 20 6f 72 20 64 65   inserting or de
2c10: 6c 65 74 69 6e 67 20 63 68 61 72 61 63 74 65 72  leting character
2c20: 20 63 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a   c immediately.*
2c30: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  * following char
2c40: 61 63 74 65 72 20 63 50 72 65 76 2e 20 20 49 66  acter cPrev.  If
2c50: 20 63 50 72 65 76 3d 3d 30 2c 20 74 68 61 74 20   cPrev==0, that 
2c60: 6d 65 61 6e 73 20 63 20 69 73 20 74 68 65 20 66  means c is the f
2c70: 69 72 73 74 0a 2a 2a 20 63 68 61 72 61 63 74 65  irst.** characte
2c80: 72 20 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a  r of the word..*
2c90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
2ca0: 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28  ertOrDeleteCost(
2cb0: 63 68 61 72 20 63 50 72 65 76 2c 20 63 68 61 72  char cPrev, char
2cc0: 20 63 2c 20 63 68 61 72 20 63 4e 65 78 74 29 7b   c, char cNext){
2cd0: 0a 20 20 63 68 61 72 20 63 6c 61 73 73 43 20 3d  .  char classC =
2ce0: 20 63 68 61 72 61 63 74 65 72 43 6c 61 73 73 28   characterClass(
2cf0: 63 50 72 65 76 2c 20 63 29 3b 0a 20 20 63 68 61  cPrev, c);.  cha
2d00: 72 20 63 6c 61 73 73 43 70 72 65 76 3b 0a 0a 20  r classCprev;.. 
2d10: 20 69 66 28 20 63 6c 61 73 73 43 3d 3d 43 43 4c   if( classC==CCL
2d20: 41 53 53 5f 53 49 4c 45 4e 54 20 29 7b 0a 20 20  ASS_SILENT ){.  
2d30: 20 20 2f 2a 20 49 6e 73 65 72 74 20 6f 72 20 64    /* Insert or d
2d40: 65 6c 65 74 65 20 22 73 69 6c 65 6e 74 22 20 63  elete "silent" c
2d50: 68 61 72 61 63 74 65 72 73 20 73 75 63 68 20 61  haracters such a
2d60: 73 20 48 20 6f 72 20 57 20 2a 2f 0a 20 20 20 20  s H or W */.    
2d70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2d80: 69 66 28 20 63 50 72 65 76 3d 3d 63 20 29 7b 0a  if( cPrev==c ){.
2d90: 20 20 20 20 2f 2a 20 52 65 70 65 61 74 65 64 20      /* Repeated 
2da0: 63 68 61 72 61 63 74 65 72 73 2c 20 6f 72 20 6d  characters, or m
2db0: 69 73 73 20 61 20 72 65 70 65 61 74 20 2a 2f 0a  iss a repeat */.
2dc0: 20 20 20 20 72 65 74 75 72 6e 20 31 30 3b 0a 20      return 10;. 
2dd0: 20 7d 0a 20 20 69 66 28 20 63 6c 61 73 73 43 3d   }.  if( classC=
2de0: 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c 20 26 26  =CCLASS_VOWEL &&
2df0: 20 28 63 50 72 65 76 3d 3d 27 72 27 20 7c 7c 20   (cPrev=='r' || 
2e00: 63 4e 65 78 74 3d 3d 27 72 27 29 20 29 7b 0a 20  cNext=='r') ){. 
2e10: 20 20 20 72 65 74 75 72 6e 20 32 30 3b 20 20 2f     return 20;  /
2e20: 2a 20 49 6e 73 65 72 74 20 61 20 76 6f 77 65 6c  * Insert a vowel
2e30: 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
2e40: 20 27 72 27 20 2a 2f 0a 20 20 7d 0a 20 20 63 6c   'r' */.  }.  cl
2e50: 61 73 73 43 70 72 65 76 20 3d 20 63 68 61 72 61  assCprev = chara
2e60: 63 74 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c  cterClass(cPrev,
2e70: 20 63 50 72 65 76 29 3b 0a 20 20 69 66 28 20 63   cPrev);.  if( c
2e80: 6c 61 73 73 43 3d 3d 63 6c 61 73 73 43 70 72 65  lassC==classCpre
2e90: 76 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6c 61  v ){.    if( cla
2ea0: 73 73 43 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45  ssC==CCLASS_VOWE
2eb0: 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  L ){.      /* Re
2ec0: 6d 6f 76 65 20 6f 72 20 61 64 64 20 61 20 6e 65  move or add a ne
2ed0: 77 20 76 6f 77 65 6c 20 74 6f 20 61 20 76 6f 77  w vowel to a vow
2ee0: 65 6c 20 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20  el cluster */.  
2ef0: 20 20 20 20 72 65 74 75 72 6e 20 31 35 3b 0a 20      return 15;. 
2f00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f10: 2f 2a 20 52 65 6d 6f 76 65 20 6f 72 20 61 64 64  /* Remove or add
2f20: 20 61 20 63 6f 6e 73 6f 6e 61 6e 74 20 6e 6f 74   a consonant not
2f30: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6c 61   in the same cla
2f40: 73 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ss */.      retu
2f50: 72 6e 20 35 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn 50;.    }.  }
2f60: 0a 0a 20 20 2f 2a 20 61 6e 79 20 6f 74 68 65 72  ..  /* any other
2f70: 20 63 68 61 72 61 63 74 65 72 20 69 6e 73 65 72   character inser
2f80: 74 69 6f 6e 20 6f 72 20 64 65 6c 65 74 69 6f 6e  tion or deletion
2f90: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 30 30   */.  return 100
2fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 76 69 64  ;.}../*.** Divid
2fb0: 65 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 20  e the insertion 
2fc0: 63 6f 73 74 20 62 79 20 74 68 69 73 20 66 61 63  cost by this fac
2fd0: 74 6f 72 20 77 68 65 6e 20 61 70 70 65 6e 64 69  tor when appendi
2fe0: 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ng to the.** end
2ff0: 20 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f   of the word..*/
3000: 0a 23 64 65 66 69 6e 65 20 46 49 4e 41 4c 5f 49  .#define FINAL_I
3010: 4e 53 5f 43 4f 53 54 5f 44 49 56 20 20 34 0a 0a  NS_COST_DIV  4..
3020: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
3030: 20 63 6f 73 74 20 6f 66 20 73 75 62 73 74 69 74   cost of substit
3040: 75 74 69 6e 67 20 63 54 6f 20 69 6e 20 70 6c 61  uting cTo in pla
3050: 63 65 20 6f 66 20 63 46 72 6f 6d 20 61 73 73 75  ce of cFrom assu
3060: 6d 69 6e 67 0a 2a 2a 20 74 68 65 20 70 72 65 76  ming.** the prev
3070: 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 69  ious character i
3080: 73 20 63 50 72 65 76 2e 20 20 49 66 20 63 50 72  s cPrev.  If cPr
3090: 65 76 3d 3d 30 20 74 68 65 6e 20 63 54 6f 20 69  ev==0 then cTo i
30a0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  s the first.** c
30b0: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
30c0: 77 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  word..*/.static 
30d0: 69 6e 74 20 73 75 62 73 74 69 74 75 74 65 43 6f  int substituteCo
30e0: 73 74 28 63 68 61 72 20 63 50 72 65 76 2c 20 63  st(char cPrev, c
30f0: 68 61 72 20 63 46 72 6f 6d 2c 20 63 68 61 72 20  har cFrom, char 
3100: 63 54 6f 29 7b 0a 20 20 63 68 61 72 20 63 6c 61  cTo){.  char cla
3110: 73 73 46 72 6f 6d 2c 20 63 6c 61 73 73 54 6f 3b  ssFrom, classTo;
3120: 0a 20 20 69 66 28 20 63 46 72 6f 6d 3d 3d 63 54  .  if( cFrom==cT
3130: 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 61 63  o ){.    /* Exac
3140: 74 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 72  t match */.    r
3150: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
3160: 66 28 20 63 46 72 6f 6d 3d 3d 28 63 54 6f 5e 30  f( cFrom==(cTo^0
3170: 78 32 30 29 20 26 26 20 28 28 63 54 6f 3e 3d 27  x20) && ((cTo>='
3180: 41 27 20 26 26 20 63 54 6f 3c 3d 27 5a 27 29 20  A' && cTo<='Z') 
3190: 7c 7c 20 28 63 54 6f 3e 3d 27 61 27 20 26 26 20  || (cTo>='a' && 
31a0: 63 54 6f 3c 3d 27 7a 27 29 29 20 29 7b 0a 20 20  cTo<='z')) ){.  
31b0: 20 20 2f 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79    /* differ only
31c0: 20 69 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20   in case */.    
31d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
31e0: 63 6c 61 73 73 46 72 6f 6d 20 3d 20 63 68 61 72  classFrom = char
31f0: 61 63 74 65 72 43 6c 61 73 73 28 63 50 72 65 76  acterClass(cPrev
3200: 2c 20 63 46 72 6f 6d 29 3b 0a 20 20 63 6c 61 73  , cFrom);.  clas
3210: 73 54 6f 20 3d 20 63 68 61 72 61 63 74 65 72 43  sTo = characterC
3220: 6c 61 73 73 28 63 50 72 65 76 2c 20 63 54 6f 29  lass(cPrev, cTo)
3230: 3b 0a 20 20 69 66 28 20 63 6c 61 73 73 46 72 6f  ;.  if( classFro
3240: 6d 3d 3d 63 6c 61 73 73 54 6f 20 29 7b 0a 20 20  m==classTo ){.  
3250: 20 20 2f 2a 20 53 61 6d 65 20 63 68 61 72 61 63    /* Same charac
3260: 74 65 72 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20  ter class */.   
3270: 20 72 65 74 75 72 6e 20 34 30 3b 0a 20 20 7d 0a   return 40;.  }.
3280: 20 20 69 66 28 20 63 6c 61 73 73 46 72 6f 6d 3e    if( classFrom>
3290: 3d 43 43 4c 41 53 53 5f 42 20 26 26 20 63 6c 61  =CCLASS_B && cla
32a0: 73 73 46 72 6f 6d 3c 3d 43 43 4c 41 53 53 5f 59  ssFrom<=CCLASS_Y
32b0: 0a 20 20 20 20 20 20 26 26 20 63 6c 61 73 73 54  .      && classT
32c0: 6f 3e 3d 43 43 4c 41 53 53 5f 42 20 26 26 20 63  o>=CCLASS_B && c
32d0: 6c 61 73 73 54 6f 3c 3d 43 43 4c 41 53 53 5f 59  lassTo<=CCLASS_Y
32e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65   ){.    /* Conve
32f0: 72 74 20 66 72 6f 6d 20 6f 6e 65 20 63 6f 6e 73  rt from one cons
3300: 6f 6e 61 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72  onant to another
3310: 2c 20 62 75 74 20 69 6e 20 61 20 64 69 66 66 65  , but in a diffe
3320: 72 65 6e 74 20 63 6c 61 73 73 20 2a 2f 0a 20 20  rent class */.  
3330: 20 20 72 65 74 75 72 6e 20 37 35 3b 0a 20 20 7d    return 75;.  }
3340: 0a 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20  .  /* Any other 
3350: 73 75 62 73 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  subsitution */. 
3360: 20 72 65 74 75 72 6e 20 31 30 30 3b 0a 7d 0a 0a   return 100;.}..
3370: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 77 6f 20  /*.** Given two 
3380: 73 74 72 69 6e 67 73 20 7a 41 20 61 6e 64 20 7a  strings zA and z
3390: 42 20 77 68 69 63 68 20 61 72 65 20 70 75 72 65  B which are pure
33a0: 20 41 53 43 49 49 2c 20 72 65 74 75 72 6e 20 74   ASCII, return t
33b0: 68 65 20 63 6f 73 74 0a 2a 2a 20 6f 66 20 74 72  he cost.** of tr
33c0: 61 6e 73 66 6f 72 6d 69 6e 67 20 7a 41 20 69 6e  ansforming zA in
33d0: 74 6f 20 7a 42 2e 20 20 49 66 20 7a 41 20 65 6e  to zB.  If zA en
33e0: 64 73 20 77 69 74 68 20 27 2a 27 20 61 73 73 75  ds with '*' assu
33f0: 6d 65 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  me that it is.**
3400: 20 61 20 70 72 65 66 69 78 20 6f 66 20 7a 42 20   a prefix of zB 
3410: 61 6e 64 20 67 69 76 65 20 6f 6e 6c 79 20 6d 69  and give only mi
3420: 6e 69 6d 61 6c 20 70 65 6e 61 6c 74 79 20 66 6f  nimal penalty fo
3430: 72 20 65 78 74 72 61 20 63 68 61 72 61 63 74 65  r extra characte
3440: 72 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 6e 64  rs.** on the end
3450: 20 6f 66 20 7a 42 2e 0a 2a 2a 0a 2a 2a 20 53 6d   of zB..**.** Sm
3460: 61 6c 6c 65 72 20 6e 75 6d 62 65 72 73 20 6d 65  aller numbers me
3470: 61 6e 20 61 20 63 6c 6f 73 65 72 20 6d 61 74 63  an a closer matc
3480: 68 2e 0a 2a 2a 0a 2a 2a 20 4e 65 67 61 74 69 76  h..**.** Negativ
3490: 65 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74  e values indicat
34a0: 65 20 61 6e 20 65 72 72 6f 72 3a 0a 2a 2a 20 20  e an error:.**  
34b0: 20 20 2d 31 20 20 4f 6e 65 20 6f 66 20 74 68 65    -1  One of the
34c0: 20 69 6e 70 75 74 73 20 69 73 20 4e 55 4c 4c 0a   inputs is NULL.
34d0: 2a 2a 20 20 20 20 2d 32 20 20 4e 6f 6e 2d 41 53  **    -2  Non-AS
34e0: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 6f  CII characters o
34f0: 6e 20 69 6e 70 75 74 0a 2a 2a 20 20 20 20 2d 33  n input.**    -3
3500: 20 20 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f    Unable to allo
3510: 63 61 74 65 20 6d 65 6d 6f 72 79 20 0a 2a 2a 0a  cate memory .**.
3520: 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69 73  ** If pnMatch is
3530: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
3540: 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74 20  *pnMatch is set 
3550: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
3560: 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 7a 42 20   bytes.** of zB 
3570: 74 68 61 74 20 6d 61 74 63 68 65 64 20 74 68 65  that matched the
3580: 20 70 61 74 74 65 72 6e 20 69 6e 20 7a 41 2e 20   pattern in zA. 
3590: 49 66 20 7a 41 20 64 6f 65 73 20 6e 6f 74 20 65  If zA does not e
35a0: 6e 64 20 77 69 74 68 20 61 20 27 2a 27 2c 0a 2a  nd with a '*',.*
35b0: 2a 20 74 68 65 6e 20 74 68 69 73 20 76 61 6c 75  * then this valu
35c0: 65 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  e is always the 
35d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
35e0: 69 6e 20 7a 42 20 28 69 2e 65 2e 20 73 74 72 6c  in zB (i.e. strl
35f0: 65 6e 28 7a 42 29 29 2e 0a 2a 2a 20 49 66 20 7a  en(zB))..** If z
3600: 41 20 64 6f 65 73 20 65 6e 64 20 69 6e 20 61 20  A does end in a 
3610: 27 2a 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20  '*', then it is 
3620: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
3630: 74 65 73 20 69 6e 20 74 68 65 20 70 72 65 66 69  tes in the prefi
3640: 78 0a 2a 2a 20 6f 66 20 7a 42 20 74 68 61 74 20  x.** of zB that 
3650: 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20 6d 61  was deemed to ma
3660: 74 63 68 20 7a 41 2e 0a 2a 2f 0a 73 74 61 74 69  tch zA..*/.stati
3670: 63 20 69 6e 74 20 65 64 69 74 64 69 73 74 31 28  c int editdist1(
3680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
3690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20  const char *zB, 
36a0: 69 6e 74 20 2a 70 6e 4d 61 74 63 68 29 7b 0a 20  int *pnMatch){. 
36b0: 20 69 6e 74 20 6e 41 2c 20 6e 42 3b 20 20 20 20   int nA, nB;    
36c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36d0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
36e0: 69 6e 20 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d  in zA[] and zB[]
36f0: 20 2a 2f 0a 20 20 69 6e 74 20 78 41 2c 20 78 42   */.  int xA, xB
3700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3710: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 66 6f  Loop counters fo
3720: 72 20 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20  r zA[] and zB[] 
3730: 2a 2f 0a 20 20 63 68 61 72 20 63 41 20 3d 20 30  */.  char cA = 0
3740: 2c 20 63 42 3b 20 20 20 20 20 20 20 2f 2a 20 43  , cB;       /* C
3750: 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72  urrent character
3760: 20 6f 66 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f   of zA and zB */
3770: 0a 20 20 63 68 61 72 20 63 41 70 72 65 76 2c 20  .  char cAprev, 
3780: 63 42 70 72 65 76 3b 20 20 20 2f 2a 20 50 72 65  cBprev;   /* Pre
3790: 76 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 20  vious character 
37a0: 6f 66 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a  of zA and zB */.
37b0: 20 20 63 68 61 72 20 63 41 6e 65 78 74 2c 20 63    char cAnext, c
37c0: 42 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  Bnext;   /* Next
37d0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 41   character in zA
37e0: 20 61 6e 64 20 7a 42 20 2a 2f 0a 20 20 69 6e 74   and zB */.  int
37f0: 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
3800: 20 20 20 20 2f 2a 20 4e 6f 72 74 68 2d 77 65 73      /* North-wes
3810: 74 20 63 6f 73 74 20 76 61 6c 75 65 20 2a 2f 0a  t cost value */.
3820: 20 20 69 6e 74 20 64 63 20 3d 20 30 3b 20 20 20    int dc = 0;   
3830: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 74           /* Nort
3840: 68 2d 77 65 73 74 20 63 68 61 72 61 63 74 65 72  h-west character
3850: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
3860: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
3870: 20 20 20 2f 2a 20 46 69 6e 61 6c 20 72 65 73 75     /* Final resu
3880: 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 6d 3b 20  lt */.  int *m; 
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38a0: 2a 20 54 68 65 20 63 6f 73 74 20 6d 61 74 72 69  * The cost matri
38b0: 78 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 78 3b  x */.  char *cx;
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38d0: 20 43 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   Corresponding c
38e0: 68 61 72 61 63 74 65 72 20 76 61 6c 75 65 73 20  haracter values 
38f0: 2a 2f 0a 20 20 69 6e 74 20 2a 74 6f 46 72 65 65  */.  int *toFree
3900: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d   = 0;       /* M
3910: 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 2a 2f  alloced space */
3920: 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20  .  int nMatch = 
3930: 30 3b 0a 20 20 69 6e 74 20 6d 53 74 61 63 6b 5b  0;.  int mStack[
3940: 36 30 2b 31 35 5d 3b 20 20 20 20 20 2f 2a 20 53  60+15];     /* S
3950: 74 61 63 6b 20 73 70 61 63 65 20 74 6f 20 75 73  tack space to us
3960: 65 20 69 66 20 6e 6f 74 20 74 6f 6f 20 6d 75 63  e if not too muc
3970: 68 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a  h is needed */..
3980: 20 20 2f 2a 20 45 61 72 6c 79 20 6f 75 74 20 69    /* Early out i
3990: 66 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69  f either input i
39a0: 73 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20  s NULL */.  if( 
39b0: 7a 41 3d 3d 30 20 7c 7c 20 7a 42 3d 3d 30 20 29  zA==0 || zB==0 )
39c0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 2f   return -1;..  /
39d0: 2a 20 53 6b 69 70 20 61 6e 79 20 63 6f 6d 6d 6f  * Skip any commo
39e0: 6e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 77 68  n prefix */.  wh
39f0: 69 6c 65 28 20 7a 41 5b 30 5d 20 26 26 20 7a 41  ile( zA[0] && zA
3a00: 5b 30 5d 3d 3d 7a 42 5b 30 5d 20 29 7b 20 64 63  [0]==zB[0] ){ dc
3a10: 20 3d 20 7a 41 5b 30 5d 3b 20 7a 41 2b 2b 3b 20   = zA[0]; zA++; 
3a20: 7a 42 2b 2b 3b 20 6e 4d 61 74 63 68 2b 2b 3b 20  zB++; nMatch++; 
3a30: 7d 0a 20 20 69 66 28 20 70 6e 4d 61 74 63 68 20  }.  if( pnMatch 
3a40: 29 20 2a 70 6e 4d 61 74 63 68 20 3d 20 6e 4d 61  ) *pnMatch = nMa
3a50: 74 63 68 3b 0a 20 20 69 66 28 20 7a 41 5b 30 5d  tch;.  if( zA[0]
3a60: 3d 3d 30 20 26 26 20 7a 42 5b 30 5d 3d 3d 30 20  ==0 && zB[0]==0 
3a70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 23 69 66  ) return 0;..#if
3a80: 20 30 0a 20 20 70 72 69 6e 74 66 28 22 41 3d 5c   0.  printf("A=\
3a90: 22 25 73 5c 22 20 42 3d 5c 22 25 73 5c 22 20 64  "%s\" B=\"%s\" d
3aa0: 63 3d 25 63 5c 6e 22 2c 20 7a 41 2c 20 7a 42 2c  c=%c\n", zA, zB,
3ab0: 20 64 63 3f 64 63 3a 27 20 27 29 3b 0a 23 65 6e   dc?dc:' ');.#en
3ac0: 64 69 66 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  dif..  /* Verify
3ad0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 73 20 61   input strings a
3ae0: 6e 64 20 6d 65 61 73 75 72 65 20 74 68 65 69 72  nd measure their
3af0: 20 6c 65 6e 67 74 68 73 20 2a 2f 0a 20 20 66 6f   lengths */.  fo
3b00: 72 28 6e 41 3d 30 3b 20 7a 41 5b 6e 41 5d 3b 20  r(nA=0; zA[nA]; 
3b10: 6e 41 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a  nA++){.    if( z
3b20: 41 5b 6e 41 5d 26 30 78 38 30 20 29 20 72 65 74  A[nA]&0x80 ) ret
3b30: 75 72 6e 20 2d 32 3b 0a 20 20 7d 0a 20 20 66 6f  urn -2;.  }.  fo
3b40: 72 28 6e 42 3d 30 3b 20 7a 42 5b 6e 42 5d 3b 20  r(nB=0; zB[nB]; 
3b50: 6e 42 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a  nB++){.    if( z
3b60: 42 5b 6e 42 5d 26 30 78 38 30 20 29 20 72 65 74  B[nB]&0x80 ) ret
3b70: 75 72 6e 20 2d 32 3b 0a 20 20 7d 0a 0a 20 20 2f  urn -2;.  }..  /
3b80: 2a 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73  * Special proces
3b90: 73 69 6e 67 20 69 66 20 65 69 74 68 65 72 20 73  sing if either s
3ba0: 74 72 69 6e 67 20 69 73 20 65 6d 70 74 79 20 2a  tring is empty *
3bb0: 2f 0a 20 20 69 66 28 20 6e 41 3d 3d 30 20 29 7b  /.  if( nA==0 ){
3bc0: 0a 20 20 20 20 63 42 70 72 65 76 20 3d 20 28 63  .    cBprev = (c
3bd0: 68 61 72 29 64 63 3b 0a 20 20 20 20 66 6f 72 28  har)dc;.    for(
3be0: 78 42 3d 72 65 73 3d 30 3b 20 28 63 42 20 3d 20  xB=res=0; (cB = 
3bf0: 7a 42 5b 78 42 5d 29 21 3d 30 3b 20 78 42 2b 2b  zB[xB])!=0; xB++
3c00: 29 7b 0a 20 20 20 20 20 20 72 65 73 20 2b 3d 20  ){.      res += 
3c10: 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f  insertOrDeleteCo
3c20: 73 74 28 63 42 70 72 65 76 2c 20 63 42 2c 20 7a  st(cBprev, cB, z
3c30: 42 5b 78 42 2b 31 5d 29 2f 46 49 4e 41 4c 5f 49  B[xB+1])/FINAL_I
3c40: 4e 53 5f 43 4f 53 54 5f 44 49 56 3b 0a 20 20 20  NS_COST_DIV;.   
3c50: 20 20 20 63 42 70 72 65 76 20 3d 20 63 42 3b 0a     cBprev = cB;.
3c60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
3c70: 20 72 65 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20   res;.  }.  if( 
3c80: 6e 42 3d 3d 30 20 29 7b 0a 20 20 20 20 63 41 70  nB==0 ){.    cAp
3c90: 72 65 76 20 3d 20 28 63 68 61 72 29 64 63 3b 0a  rev = (char)dc;.
3ca0: 20 20 20 20 66 6f 72 28 78 41 3d 72 65 73 3d 30      for(xA=res=0
3cb0: 3b 20 28 63 41 20 3d 20 7a 41 5b 78 41 5d 29 21  ; (cA = zA[xA])!
3cc0: 3d 30 3b 20 78 41 2b 2b 29 7b 0a 20 20 20 20 20  =0; xA++){.     
3cd0: 20 72 65 73 20 2b 3d 20 69 6e 73 65 72 74 4f 72   res += insertOr
3ce0: 44 65 6c 65 74 65 43 6f 73 74 28 63 41 70 72 65  DeleteCost(cApre
3cf0: 76 2c 20 63 41 2c 20 7a 41 5b 78 41 2b 31 5d 29  v, cA, zA[xA+1])
3d00: 3b 0a 20 20 20 20 20 20 63 41 70 72 65 76 20 3d  ;.      cAprev =
3d10: 20 63 41 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   cA;.    }.    r
3d20: 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d 0a 0a  eturn res;.  }..
3d30: 20 20 2f 2a 20 41 20 69 73 20 61 20 70 72 65 66    /* A is a pref
3d40: 69 78 20 6f 66 20 42 20 2a 2f 0a 20 20 69 66 28  ix of B */.  if(
3d50: 20 7a 41 5b 30 5d 3d 3d 27 2a 27 20 26 26 20 7a   zA[0]=='*' && z
3d60: 41 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  A[1]==0 ) return
3d70: 20 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   0;..  /* Alloca
3d80: 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
3d90: 65 20 74 68 65 20 57 61 67 6e 65 72 20 6d 61 74  e the Wagner mat
3da0: 72 69 78 20 2a 2f 0a 20 20 69 66 28 20 6e 42 3c  rix */.  if( nB<
3db0: 28 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b 29 2a  (sizeof(mStack)*
3dc0: 34 29 2f 28 73 69 7a 65 6f 66 28 6d 53 74 61 63  4)/(sizeof(mStac
3dd0: 6b 5b 30 5d 29 2a 35 29 20 29 7b 0a 20 20 20 20  k[0])*5) ){.    
3de0: 6d 20 3d 20 6d 53 74 61 63 6b 3b 0a 20 20 7d 65  m = mStack;.  }e
3df0: 6c 73 65 7b 0a 20 20 20 20 6d 20 3d 20 74 6f 46  lse{.    m = toF
3e00: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ree = sqlite3_ma
3e10: 6c 6c 6f 63 36 34 28 20 28 6e 42 2b 31 29 2a 35  lloc64( (nB+1)*5
3e20: 2a 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 2f 34 20  *sizeof(m[0])/4 
3e30: 29 3b 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  );.    if( m==0 
3e40: 29 20 72 65 74 75 72 6e 20 2d 33 3b 0a 20 20 7d  ) return -3;.  }
3e50: 0a 20 20 63 78 20 3d 20 28 63 68 61 72 2a 29 26  .  cx = (char*)&
3e60: 6d 5b 6e 42 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 43  m[nB+1];..  /* C
3e70: 6f 6d 70 75 74 65 20 74 68 65 20 57 61 67 6e 65  ompute the Wagne
3e80: 72 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20  r edit distance 
3e90: 2a 2f 0a 20 20 6d 5b 30 5d 20 3d 20 30 3b 0a 20  */.  m[0] = 0;. 
3ea0: 20 63 78 5b 30 5d 20 3d 20 28 63 68 61 72 29 64   cx[0] = (char)d
3eb0: 63 3b 0a 20 20 63 42 70 72 65 76 20 3d 20 28 63  c;.  cBprev = (c
3ec0: 68 61 72 29 64 63 3b 0a 20 20 66 6f 72 28 78 42  har)dc;.  for(xB
3ed0: 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b 2b  =1; xB<=nB; xB++
3ee0: 29 7b 0a 20 20 20 20 63 42 6e 65 78 74 20 3d 20  ){.    cBnext = 
3ef0: 7a 42 5b 78 42 5d 3b 0a 20 20 20 20 63 42 20 3d  zB[xB];.    cB =
3f00: 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20 20 20 63   zB[xB-1];.    c
3f10: 78 5b 78 42 5d 20 3d 20 63 42 3b 0a 20 20 20 20  x[xB] = cB;.    
3f20: 6d 5b 78 42 5d 20 3d 20 6d 5b 78 42 2d 31 5d 20  m[xB] = m[xB-1] 
3f30: 2b 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65  + insertOrDelete
3f40: 43 6f 73 74 28 63 42 70 72 65 76 2c 20 63 42 2c  Cost(cBprev, cB,
3f50: 20 63 42 6e 65 78 74 29 3b 0a 20 20 20 20 63 42   cBnext);.    cB
3f60: 70 72 65 76 20 3d 20 63 42 3b 0a 20 20 7d 0a 20  prev = cB;.  }. 
3f70: 20 63 41 70 72 65 76 20 3d 20 28 63 68 61 72 29   cAprev = (char)
3f80: 64 63 3b 0a 20 20 66 6f 72 28 78 41 3d 31 3b 20  dc;.  for(xA=1; 
3f90: 78 41 3c 3d 6e 41 3b 20 78 41 2b 2b 29 7b 0a 20  xA<=nA; xA++){. 
3fa0: 20 20 20 69 6e 74 20 6c 61 73 74 41 20 3d 20 28     int lastA = (
3fb0: 78 41 3d 3d 6e 41 29 3b 0a 20 20 20 20 63 41 20  xA==nA);.    cA 
3fc0: 3d 20 7a 41 5b 78 41 2d 31 5d 3b 0a 20 20 20 20  = zA[xA-1];.    
3fd0: 63 41 6e 65 78 74 20 3d 20 7a 41 5b 78 41 5d 3b  cAnext = zA[xA];
3fe0: 0a 20 20 20 20 69 66 28 20 63 41 3d 3d 27 2a 27  .    if( cA=='*'
3ff0: 20 26 26 20 6c 61 73 74 41 20 29 20 62 72 65 61   && lastA ) brea
4000: 6b 3b 0a 20 20 20 20 64 20 3d 20 6d 5b 30 5d 3b  k;.    d = m[0];
4010: 0a 20 20 20 20 64 63 20 3d 20 63 78 5b 30 5d 3b  .    dc = cx[0];
4020: 0a 20 20 20 20 6d 5b 30 5d 20 3d 20 64 20 2b 20  .    m[0] = d + 
4030: 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f  insertOrDeleteCo
4040: 73 74 28 63 41 70 72 65 76 2c 20 63 41 2c 20 63  st(cAprev, cA, c
4050: 41 6e 65 78 74 29 3b 0a 20 20 20 20 63 42 70 72  Anext);.    cBpr
4060: 65 76 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ev = 0;.    for(
4070: 78 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42  xB=1; xB<=nB; xB
4080: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ++){.      int t
4090: 6f 74 61 6c 43 6f 73 74 2c 20 69 6e 73 43 6f 73  otalCost, insCos
40a0: 74 2c 20 64 65 6c 43 6f 73 74 2c 20 73 75 62 43  t, delCost, subC
40b0: 6f 73 74 2c 20 6e 63 78 3b 0a 20 20 20 20 20 20  ost, ncx;.      
40c0: 63 42 20 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20  cB = zB[xB-1];. 
40d0: 20 20 20 20 20 63 42 6e 65 78 74 20 3d 20 7a 42       cBnext = zB
40e0: 5b 78 42 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [xB];..      /* 
40f0: 43 6f 73 74 20 74 6f 20 69 6e 73 65 72 74 20 63  Cost to insert c
4100: 42 20 2a 2f 0a 20 20 20 20 20 20 69 6e 73 43 6f  B */.      insCo
4110: 73 74 20 3d 20 69 6e 73 65 72 74 4f 72 44 65 6c  st = insertOrDel
4120: 65 74 65 43 6f 73 74 28 63 78 5b 78 42 2d 31 5d  eteCost(cx[xB-1]
4130: 2c 20 63 42 2c 20 63 42 6e 65 78 74 29 3b 0a 20  , cB, cBnext);. 
4140: 20 20 20 20 20 69 66 28 20 6c 61 73 74 41 20 29       if( lastA )
4150: 20 69 6e 73 43 6f 73 74 20 2f 3d 20 46 49 4e 41   insCost /= FINA
4160: 4c 5f 49 4e 53 5f 43 4f 53 54 5f 44 49 56 3b 0a  L_INS_COST_DIV;.
4170: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74  .      /* Cost t
4180: 6f 20 64 65 6c 65 74 65 20 63 41 20 2a 2f 0a 20  o delete cA */. 
4190: 20 20 20 20 20 64 65 6c 43 6f 73 74 20 3d 20 69       delCost = i
41a0: 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73  nsertOrDeleteCos
41b0: 74 28 63 78 5b 78 42 5d 2c 20 63 41 2c 20 63 42  t(cx[xB], cA, cB
41c0: 6e 65 78 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  next);..      /*
41d0: 20 43 6f 73 74 20 74 6f 20 73 75 62 73 74 69 74   Cost to substit
41e0: 75 74 65 20 63 41 2d 3e 63 42 20 2a 2f 0a 20 20  ute cA->cB */.  
41f0: 20 20 20 20 73 75 62 43 6f 73 74 20 3d 20 73 75      subCost = su
4200: 62 73 74 69 74 75 74 65 43 6f 73 74 28 63 78 5b  bstituteCost(cx[
4210: 78 42 2d 31 5d 2c 20 63 41 2c 20 63 42 29 3b 0a  xB-1], cA, cB);.
4220: 0a 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 63  .      /* Best c
4230: 6f 73 74 20 2a 2f 0a 20 20 20 20 20 20 74 6f 74  ost */.      tot
4240: 61 6c 43 6f 73 74 20 3d 20 69 6e 73 43 6f 73 74  alCost = insCost
4250: 20 2b 20 6d 5b 78 42 2d 31 5d 3b 0a 20 20 20 20   + m[xB-1];.    
4260: 20 20 6e 63 78 20 3d 20 63 42 3b 0a 20 20 20 20    ncx = cB;.    
4270: 20 20 69 66 28 20 28 64 65 6c 43 6f 73 74 20 2b    if( (delCost +
4280: 20 6d 5b 78 42 5d 29 3c 74 6f 74 61 6c 43 6f 73   m[xB])<totalCos
4290: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 74  t ){.        tot
42a0: 61 6c 43 6f 73 74 20 3d 20 64 65 6c 43 6f 73 74  alCost = delCost
42b0: 20 2b 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20   + m[xB];.      
42c0: 20 20 6e 63 78 20 3d 20 63 41 3b 0a 20 20 20 20    ncx = cA;.    
42d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73    }.      if( (s
42e0: 75 62 43 6f 73 74 20 2b 20 64 29 3c 74 6f 74 61  ubCost + d)<tota
42f0: 6c 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lCost ){.       
4300: 20 74 6f 74 61 6c 43 6f 73 74 20 3d 20 73 75 62   totalCost = sub
4310: 43 6f 73 74 20 2b 20 64 3b 0a 20 20 20 20 20 20  Cost + d;.      
4320: 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 20 20 70  }..#if 0.      p
4330: 72 69 6e 74 66 28 22 25 64 2c 25 64 20 64 3d 25  rintf("%d,%d d=%
4340: 34 64 20 75 3d 25 34 64 20 72 3d 25 34 64 20 64  4d u=%4d r=%4d d
4350: 63 3d 25 63 20 63 41 3d 25 63 20 63 42 3d 25 63  c=%c cA=%c cB=%c
4360: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
4370: 20 69 6e 73 3d 25 34 64 20 64 65 6c 3d 25 34 64   ins=%4d del=%4d
4380: 20 73 75 62 3d 25 34 64 20 74 3d 25 34 64 20 6e   sub=%4d t=%4d n
4390: 63 78 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20  cx=%c\n",.      
43a0: 20 20 20 20 20 20 20 78 41 2c 20 78 42 2c 20 64         xA, xB, d
43b0: 2c 20 6d 5b 78 42 5d 2c 20 6d 5b 78 42 2d 31 5d  , m[xB], m[xB-1]
43c0: 2c 20 64 63 3f 64 63 3a 27 20 27 2c 20 63 41 2c  , dc?dc:' ', cA,
43d0: 20 63 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20   cB,.           
43e0: 20 20 69 6e 73 43 6f 73 74 2c 20 64 65 6c 43 6f    insCost, delCo
43f0: 73 74 2c 20 73 75 62 43 6f 73 74 2c 20 74 6f 74  st, subCost, tot
4400: 61 6c 43 6f 73 74 2c 20 6e 63 78 3f 6e 63 78 3a  alCost, ncx?ncx:
4410: 27 20 27 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ' ');.#endif..  
4420: 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
4430: 65 20 6d 61 74 72 69 78 20 2a 2f 0a 20 20 20 20  e matrix */.    
4440: 20 20 64 20 3d 20 6d 5b 78 42 5d 3b 0a 20 20 20    d = m[xB];.   
4450: 20 20 20 64 63 20 3d 20 63 78 5b 78 42 5d 3b 0a     dc = cx[xB];.
4460: 20 20 20 20 20 20 6d 5b 78 42 5d 20 3d 20 74 6f        m[xB] = to
4470: 74 61 6c 43 6f 73 74 3b 0a 20 20 20 20 20 20 63  talCost;.      c
4480: 78 5b 78 42 5d 20 3d 20 28 63 68 61 72 29 6e 63  x[xB] = (char)nc
4490: 78 3b 0a 20 20 20 20 20 20 63 42 70 72 65 76 20  x;.      cBprev 
44a0: 3d 20 63 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = cB;.    }.    
44b0: 63 41 70 72 65 76 20 3d 20 63 41 3b 0a 20 20 7d  cAprev = cA;.  }
44c0: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20  ..  /* Free the 
44d0: 77 61 67 6e 65 72 20 6d 61 74 72 69 78 20 61 6e  wagner matrix an
44e0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73  d return the res
44f0: 75 6c 74 20 2a 2f 0a 20 20 69 66 28 20 63 41 3d  ult */.  if( cA=
4500: 3d 27 2a 27 20 29 7b 0a 20 20 20 20 72 65 73 20  ='*' ){.    res 
4510: 3d 20 6d 5b 31 5d 3b 0a 20 20 20 20 66 6f 72 28  = m[1];.    for(
4520: 78 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42  xB=1; xB<=nB; xB
4530: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d  ++){.      if( m
4540: 5b 78 42 5d 3c 72 65 73 20 29 7b 0a 20 20 20 20  [xB]<res ){.    
4550: 20 20 20 20 72 65 73 20 3d 20 6d 5b 78 42 5d 3b      res = m[xB];
4560: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 4d  .        if( pnM
4570: 61 74 63 68 20 29 20 2a 70 6e 4d 61 74 63 68 20  atch ) *pnMatch 
4580: 3d 20 78 42 2b 6e 4d 61 74 63 68 3b 0a 20 20 20  = xB+nMatch;.   
4590: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
45a0: 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 6d 5b  se{.    res = m[
45b0: 6e 42 5d 3b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  nB];.    /* In t
45c0: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
45d0: 6d 65 6e 74 61 74 69 6f 6e 2c 20 70 6e 4d 61 74  mentation, pnMat
45e0: 63 68 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c  ch is always NUL
45f0: 4c 20 69 66 20 7a 41 20 64 6f 65 73 0a 20 20 20  L if zA does.   
4600: 20 2a 2a 20 6e 6f 74 20 65 6e 64 20 69 6e 20 22   ** not end in "
4610: 2a 22 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  *" */.    assert
4620: 28 20 70 6e 4d 61 74 63 68 3d 3d 30 20 29 3b 0a  ( pnMatch==0 );.
4630: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
4640: 65 65 28 74 6f 46 72 65 65 29 3b 0a 20 20 72 65  ee(toFree);.  re
4650: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
4660: 2a 2a 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20  ** Function:    
4670: 65 64 69 74 64 69 73 74 28 41 2c 42 29 0a 2a 2a  editdist(A,B).**
4680: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
4690: 6f 73 74 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ost of transform
46a0: 69 6e 67 20 73 74 72 69 6e 67 20 41 20 69 6e 74  ing string A int
46b0: 6f 20 73 74 72 69 6e 67 20 42 2e 20 20 42 6f 74  o string B.  Bot
46c0: 68 20 73 74 72 69 6e 67 73 0a 2a 2a 20 6d 75 73  h strings.** mus
46d0: 74 20 62 65 20 70 75 72 65 20 41 53 43 49 49 20  t be pure ASCII 
46e0: 74 65 78 74 2e 20 20 49 66 20 41 20 65 6e 64 73  text.  If A ends
46f0: 20 77 69 74 68 20 27 2a 27 20 74 68 65 6e 20 69   with '*' then i
4700: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
4710: 62 65 0a 2a 2a 20 61 20 70 72 65 66 69 78 20 6f  be.** a prefix o
4720: 66 20 42 20 61 6e 64 20 65 78 74 72 61 20 63 68  f B and extra ch
4730: 61 72 61 63 74 65 72 73 20 6f 6e 20 74 68 65 20  aracters on the 
4740: 65 6e 64 20 6f 66 20 42 20 68 61 76 65 20 6d 69  end of B have mi
4750: 6e 69 6d 61 6c 20 61 64 64 69 74 69 6f 6e 61 6c  nimal additional
4760: 0a 2a 2a 20 63 6f 73 74 2e 0a 2a 2f 0a 73 74 61  .** cost..*/.sta
4770: 74 69 63 20 76 6f 69 64 20 65 64 69 74 64 69 73  tic void editdis
4780: 74 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  tSqlFunc(.  sqli
4790: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
47a0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
47b0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
47c0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
47d0: 74 20 72 65 73 20 3d 20 65 64 69 74 64 69 73 74  t res = editdist
47e0: 31 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1(.             
47f0: 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
4800: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
4810: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
4820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4830: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
4840: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
4850: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 0a 20  text(argv[1]),. 
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 30 29 3b 0a 20 20 69 66 28 20 72 65 73     0);.  if( res
4880: 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  <0 ){.    if( re
4890: 73 3d 3d 28 2d 33 29 20 29 7b 0a 20 20 20 20 20  s==(-3) ){.     
48a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
48b0: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
48c0: 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ext);.    }else 
48d0: 69 66 28 20 72 65 73 3d 3d 28 2d 32 29 20 29 7b  if( res==(-2) ){
48e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
48f0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
4900: 65 78 74 2c 20 22 6e 6f 6e 2d 41 53 43 49 49 20  ext, "non-ASCII 
4910: 69 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69 73  input to editdis
4920: 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  t()", -1);.    }
4930: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
4940: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
4950: 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20  (context, "NULL 
4960: 69 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69 73  input to editdis
4970: 74 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  t()", -1);.    }
4980: 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 73  .  }else{ .    s
4990: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
49a0: 74 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b  t(context, res);
49b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f  .  }.}../* End o
49c0: 66 20 74 68 65 20 66 69 78 65 64 2d 63 6f 73 74  f the fixed-cost
49d0: 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 69   edit distance i
49e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a  mplementation.**
49f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
4a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
4a90: 67 69 6e 3a 20 43 6f 6e 66 69 67 75 72 61 62 6c  gin: Configurabl
4aa0: 65 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20 65  e cost unicode e
4ab0: 64 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f 75  dit distance rou
4ac0: 74 69 6e 65 73 0a 2a 2f 0a 2f 2a 20 46 6f 72 77  tines.*/./* Forw
4ad0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
4ae0: 6f 66 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  of structures */
4af0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
4b00: 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 45 64  EditDist3Cost Ed
4b10: 69 74 44 69 73 74 33 43 6f 73 74 3b 0a 74 79 70  itDist3Cost;.typ
4b20: 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74  edef struct Edit
4b30: 44 69 73 74 33 43 6f 6e 66 69 67 20 45 64 69 74  Dist3Config Edit
4b40: 44 69 73 74 33 43 6f 6e 66 69 67 3b 0a 74 79 70  Dist3Config;.typ
4b50: 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74  edef struct Edit
4b60: 44 69 73 74 33 50 6f 69 6e 74 20 45 64 69 74 44  Dist3Point EditD
4b70: 69 73 74 33 50 6f 69 6e 74 3b 0a 74 79 70 65 64  ist3Point;.typed
4b80: 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69  ef struct EditDi
4b90: 73 74 33 46 72 6f 6d 20 45 64 69 74 44 69 73 74  st3From EditDist
4ba0: 33 46 72 6f 6d 3b 0a 74 79 70 65 64 65 66 20 73  3From;.typedef s
4bb0: 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33 46  truct EditDist3F
4bc0: 72 6f 6d 53 74 72 69 6e 67 20 45 64 69 74 44 69  romString EditDi
4bd0: 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 3b 0a 74  st3FromString;.t
4be0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64  ypedef struct Ed
4bf0: 69 74 44 69 73 74 33 54 6f 20 45 64 69 74 44 69  itDist3To EditDi
4c00: 73 74 33 54 6f 3b 0a 74 79 70 65 64 65 66 20 73  st3To;.typedef s
4c10: 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54  truct EditDist3T
4c20: 6f 53 74 72 69 6e 67 20 45 64 69 74 44 69 73 74  oString EditDist
4c30: 33 54 6f 53 74 72 69 6e 67 3b 0a 74 79 70 65 64  3ToString;.typed
4c40: 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69  ef struct EditDi
4c50: 73 74 33 4c 61 6e 67 20 45 64 69 74 44 69 73 74  st3Lang EditDist
4c60: 33 4c 61 6e 67 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41  3Lang;.../*.** A
4c70: 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 65  n entry in the e
4c80: 64 69 74 20 63 6f 73 74 20 74 61 62 6c 65 0a 2a  dit cost table.*
4c90: 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44 69 73  /.struct EditDis
4ca0: 74 33 43 6f 73 74 20 7b 0a 20 20 45 64 69 74 44  t3Cost {.  EditD
4cb0: 69 73 74 33 43 6f 73 74 20 2a 70 4e 65 78 74 3b  ist3Cost *pNext;
4cc0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f 73       /* Next cos
4cd0: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  t element */.  u
4ce0: 38 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  8 nFrom;        
4cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4d00: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
4d10: 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 6e 54 6f  From */.  u8 nTo
4d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4d30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4d40: 20 62 79 74 65 73 20 69 6e 20 61 54 6f 20 2a 2f   bytes in aTo */
4d50: 0a 20 20 75 31 36 20 69 43 6f 73 74 3b 20 20 20  .  u16 iCost;   
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d70: 43 6f 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  Cost of this tra
4d80: 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  nsformation */. 
4d90: 20 63 68 61 72 20 61 5b 34 5d 20 20 20 20 3b 20   char a[4]    ; 
4da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
4db0: 4f 4d 20 73 74 72 69 6e 67 20 66 6f 6c 6c 6f 77  OM string follow
4dc0: 65 64 20 62 79 20 54 4f 20 73 74 72 69 6e 67 20  ed by TO string 
4dd0: 2a 2f 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e  */.  /* Addition
4de0: 61 6c 20 54 4f 20 61 6e 64 20 46 52 4f 4d 20 73  al TO and FROM s
4df0: 74 72 69 6e 67 20 62 79 74 65 73 20 61 70 70 65  tring bytes appe
4e00: 6e 64 65 64 20 61 73 20 6e 65 63 65 73 73 61 72  nded as necessar
4e10: 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45  y */.};../*.** E
4e20: 64 69 74 20 63 6f 73 74 73 20 66 6f 72 20 61 20  dit costs for a 
4e30: 70 61 72 74 69 63 75 6c 61 72 20 6c 61 6e 67 75  particular langu
4e40: 61 67 65 20 49 44 20 0a 2a 2f 0a 73 74 72 75 63  age ID .*/.struc
4e50: 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20  t EditDist3Lang 
4e60: 7b 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20  {.  int iLang;  
4e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
4e80: 6e 67 75 61 67 65 20 49 44 20 2a 2f 0a 20 20 69  nguage ID */.  i
4e90: 6e 74 20 69 49 6e 73 43 6f 73 74 3b 20 20 20 20  nt iInsCost;    
4ea0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
4eb0: 20 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73 74 20   insertion cost 
4ec0: 2a 2f 0a 20 20 69 6e 74 20 69 44 65 6c 43 6f 73  */.  int iDelCos
4ed0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  t;          /* D
4ee0: 65 66 61 75 6c 74 20 64 65 6c 65 74 69 6f 6e 20  efault deletion 
4ef0: 63 6f 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  cost */.  int iS
4f00: 75 62 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20  ubCost;         
4f10: 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 75 62 73   /* Default subs
4f20: 74 69 74 75 74 69 6f 6e 20 63 6f 73 74 20 2a 2f  titution cost */
4f30: 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74  .  EditDist3Cost
4f40: 20 2a 70 43 6f 73 74 3b 20 20 2f 2a 20 43 6f 73   *pCost;  /* Cos
4f50: 74 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a  ts */.};.../*.**
4f60: 20 54 68 65 20 64 65 66 61 75 6c 74 20 45 64 69   The default Edi
4f70: 74 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a 65 63  tDist3Lang objec
4f80: 74 2c 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  t, with default 
4f90: 63 6f 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  costs..*/.static
4fa0: 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33   const EditDist3
4fb0: 4c 61 6e 67 20 65 64 69 74 44 69 73 74 33 4c 61  Lang editDist3La
4fc0: 6e 67 20 3d 20 7b 20 30 2c 20 31 30 30 2c 20 31  ng = { 0, 100, 1
4fd0: 30 30 2c 20 31 35 30 2c 20 30 20 7d 3b 0a 0a 2f  00, 150, 0 };../
4fe0: 2a 0a 2a 2a 20 43 6f 6d 70 6c 65 74 65 20 63 6f  *.** Complete co
4ff0: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2f 0a 73  nfiguration.*/.s
5000: 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33 43  truct EditDist3C
5010: 6f 6e 66 69 67 20 7b 0a 20 20 69 6e 74 20 6e 4c  onfig {.  int nL
5020: 61 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ang;            
5030: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 61   /* Number of la
5040: 6e 67 75 61 67 65 20 49 44 73 2e 20 20 53 69 7a  nguage IDs.  Siz
5050: 65 20 6f 66 20 61 5b 5d 20 2a 2f 0a 20 20 45 64  e of a[] */.  Ed
5060: 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 61 3b 20  itDist3Lang *a; 
5070: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 66 6f 72 20       /* One for 
5080: 65 61 63 68 20 64 69 73 74 69 6e 63 74 20 6c 61  each distinct la
5090: 6e 67 75 61 67 65 20 49 44 20 2a 2f 0a 7d 3b 0a  nguage ID */.};.
50a0: 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 20 69 6e 66  ./*.** Extra inf
50b0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65  ormation about e
50c0: 61 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e  ach character in
50d0: 20 74 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67   the FROM string
50e0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69 74  ..*/.struct Edit
50f0: 44 69 73 74 33 46 72 6f 6d 20 7b 0a 20 20 69 6e  Dist3From {.  in
5100: 74 20 6e 53 75 62 73 74 3b 20 20 20 20 20 20 20  t nSubst;       
5110: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5120: 20 6f 66 20 73 75 62 73 74 69 74 75 74 69 6f 6e   of substitution
5130: 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f   cost entries */
5140: 0a 20 20 69 6e 74 20 6e 44 65 6c 3b 20 20 20 20  .  int nDel;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5160: 75 6d 62 65 72 20 6f 66 20 64 65 6c 65 74 69 6f  umber of deletio
5170: 6e 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a  n cost entries *
5180: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
51a0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
51b0: 69 6e 20 74 68 69 73 20 63 68 61 72 61 63 74 65  in this characte
51c0: 72 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33  r */.  EditDist3
51d0: 43 6f 73 74 20 2a 2a 61 70 53 75 62 73 74 3b 20  Cost **apSubst; 
51e0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 73  /* Array of subs
51f0: 74 69 74 75 74 69 6f 6e 20 63 6f 73 74 73 20 66  titution costs f
5200: 6f 72 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20  or this element 
5210: 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  */.  EditDist3Co
5220: 73 74 20 2a 2a 61 70 44 65 6c 3b 20 20 20 2f 2a  st **apDel;   /*
5230: 20 41 72 72 61 79 20 6f 66 20 64 65 6c 65 74 69   Array of deleti
5240: 6f 6e 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20  on cost entries 
5250: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70  */.};../*.** A p
5260: 72 65 63 6f 6d 70 69 6c 65 64 20 46 52 4f 4d 20  recompiled FROM 
5270: 73 74 72 69 6e 67 2e 0a 2a 0a 2a 2a 20 49 6e 20  string..*.** In 
5280: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
5290: 77 65 20 65 78 70 65 63 74 20 74 68 65 20 46 52  we expect the FR
52a0: 4f 4d 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  OM string to be 
52b0: 72 65 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20  reused multiple 
52c0: 74 69 6d 65 73 2e 0a 2a 2a 20 49 6e 20 6f 74 68  times..** In oth
52d0: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 6f  er words, the co
52e0: 6d 6d 6f 6e 20 63 61 73 65 20 77 69 6c 6c 20 62  mmon case will b
52f0: 65 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  e to measure the
5300: 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 0a 2a   edit distance.*
5310: 2a 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  * from a single 
5320: 6f 72 69 67 69 6e 20 73 74 72 69 6e 67 20 74 6f  origin string to
5330: 20 6d 75 6c 74 69 70 6c 65 20 74 61 72 67 65 74   multiple target
5340: 20 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 72   strings..*/.str
5350: 75 63 74 20 45 64 69 74 44 69 73 74 33 46 72 6f  uct EditDist3Fro
5360: 6d 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61 72  mString {.  char
5370: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
5380: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5390: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
53a0: 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f 0a   FROM string */.
53b0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
53c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
53d0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
53e0: 72 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 73  rs in the FROM s
53f0: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  tring */.  int i
5400: 73 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  sPrefix;        
5410: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
5420: 6e 64 73 20 77 69 74 68 20 27 2a 27 20 63 68 61  nds with '*' cha
5430: 72 61 63 74 65 72 20 2a 2f 0a 20 20 45 64 69 74  racter */.  Edit
5440: 44 69 73 74 33 46 72 6f 6d 20 2a 61 3b 20 20 20  Dist3From *a;   
5450: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e       /* Extra in
5460: 66 6f 20 61 62 6f 75 74 20 65 61 63 68 20 63 68  fo about each ch
5470: 61 72 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 73  ar of the FROM s
5480: 74 72 69 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  tring */.};../*.
5490: 2a 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61  ** Extra informa
54a0: 74 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20  tion about each 
54b0: 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65  character in the
54c0: 20 54 4f 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73   TO string..*/.s
54d0: 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54  truct EditDist3T
54e0: 6f 20 7b 0a 20 20 69 6e 74 20 6e 49 6e 73 3b 20  o {.  int nIns; 
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5500: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 73 65  * Number of inse
5510: 72 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74 72 69  rtion cost entri
5520: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  es */.  int nByt
5530: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5540: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
5550: 74 65 73 20 69 6e 20 74 68 69 73 20 63 68 61 72  tes in this char
5560: 61 63 74 65 72 20 2a 2f 0a 20 20 45 64 69 74 44  acter */.  EditD
5570: 69 73 74 33 43 6f 73 74 20 2a 2a 61 70 49 6e 73  ist3Cost **apIns
5580: 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  ;   /* Array of 
5590: 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65 6e  deletion cost en
55a0: 74 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  tries */.};../*.
55b0: 2a 2a 20 41 20 70 72 65 63 6f 6d 70 69 6c 65 64  ** A precompiled
55c0: 20 46 52 4f 4d 20 73 74 72 69 6e 67 0a 2a 2f 0a   FROM string.*/.
55d0: 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33  struct EditDist3
55e0: 54 6f 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61  ToString {.  cha
55f0: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
5600: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
5610: 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
5620: 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20  e TO string */. 
5630: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
5640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5650: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
5660: 73 20 69 6e 20 74 68 65 20 54 4f 20 73 74 72 69  s in the TO stri
5670: 6e 67 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74  ng */.  EditDist
5680: 33 54 6f 20 2a 61 3b 20 20 20 20 20 20 20 20 20  3To *a;         
5690: 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 20 61   /* Extra info a
56a0: 62 6f 75 74 20 65 61 63 68 20 63 68 61 72 20 6f  bout each char o
56b0: 66 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20  f the TO string 
56c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  */.};../*.** Cle
56d0: 61 72 20 6f 72 20 64 65 6c 65 74 65 20 61 6e 20  ar or delete an 
56e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
56f0: 6f 62 6a 65 63 74 20 74 68 61 74 20 72 65 63 6f  object that reco
5700: 72 64 73 20 61 6c 6c 20 65 64 69 74 2d 64 69 73  rds all edit-dis
5710: 74 61 6e 63 65 0a 2a 2a 20 77 65 69 67 68 74 73  tance.** weights
5720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5730: 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   editDist3Config
5740: 43 6c 65 61 72 28 45 64 69 74 44 69 73 74 33 43  Clear(EditDist3C
5750: 6f 6e 66 69 67 20 2a 70 29 7b 0a 20 20 69 6e 74  onfig *p){.  int
5760: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
5770: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
5780: 3d 30 3b 20 69 3c 70 2d 3e 6e 4c 61 6e 67 3b 20  =0; i<p->nLang; 
5790: 69 2b 2b 29 7b 0a 20 20 20 20 45 64 69 74 44 69  i++){.    EditDi
57a0: 73 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20  st3Cost *pCost, 
57b0: 2a 70 4e 65 78 74 3b 0a 20 20 20 20 70 43 6f 73  *pNext;.    pCos
57c0: 74 20 3d 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 73  t = p->a[i].pCos
57d0: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  t;.    while( pC
57e0: 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ost ){.      pNe
57f0: 78 74 20 3d 20 70 43 6f 73 74 2d 3e 70 4e 65 78  xt = pCost->pNex
5800: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
5810: 5f 66 72 65 65 28 70 43 6f 73 74 29 3b 0a 20 20  _free(pCost);.  
5820: 20 20 20 20 70 43 6f 73 74 20 3d 20 70 4e 65 78      pCost = pNex
5830: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
5840: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
5850: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  );.  memset(p, 0
5860: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d  , sizeof(*p));.}
5870: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69  .static void edi
5880: 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65  tDist3ConfigDele
5890: 74 65 28 76 6f 69 64 20 2a 70 49 6e 29 7b 0a 20  te(void *pIn){. 
58a0: 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   EditDist3Config
58b0: 20 2a 70 20 3d 20 28 45 64 69 74 44 69 73 74 33   *p = (EditDist3
58c0: 43 6f 6e 66 69 67 2a 29 70 49 6e 3b 0a 20 20 65  Config*)pIn;.  e
58d0: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43 6c  ditDist3ConfigCl
58e0: 65 61 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ear(p);.  sqlite
58f0: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  3_free(p);.}../*
5900: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 46 52 4f   Compare the FRO
5910: 4d 20 76 61 6c 75 65 73 20 6f 66 20 74 77 6f 20  M values of two 
5920: 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 6f 62  EditDist3Cost ob
5930: 6a 65 63 74 73 2c 20 66 6f 72 20 73 6f 72 74 69  jects, for sorti
5940: 6e 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65  ng..** Return ne
5950: 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
5960: 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
5970: 20 41 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c   A is less than,
5980: 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
5990: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 42 2e   greater than B.
59a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
59b0: 64 69 74 44 69 73 74 33 43 6f 73 74 43 6f 6d 70  ditDist3CostComp
59c0: 61 72 65 28 45 64 69 74 44 69 73 74 33 43 6f 73  are(EditDist3Cos
59d0: 74 20 2a 70 41 2c 20 45 64 69 74 44 69 73 74 33  t *pA, EditDist3
59e0: 43 6f 73 74 20 2a 70 42 29 7b 0a 20 20 69 6e 74  Cost *pB){.  int
59f0: 20 6e 20 3d 20 70 41 2d 3e 6e 46 72 6f 6d 3b 0a   n = pA->nFrom;.
5a00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
5a10: 6e 3e 70 42 2d 3e 6e 46 72 6f 6d 20 29 20 6e 20  n>pB->nFrom ) n 
5a20: 3d 20 70 42 2d 3e 6e 46 72 6f 6d 3b 0a 20 20 72  = pB->nFrom;.  r
5a30: 63 20 3d 20 73 74 72 6e 63 6d 70 28 70 41 2d 3e  c = strncmp(pA->
5a40: 61 2c 20 70 42 2d 3e 61 2c 20 6e 29 3b 0a 20 20  a, pB->a, n);.  
5a50: 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
5a60: 20 70 41 2d 3e 6e 46 72 6f 6d 20 2d 20 70 42 2d   pA->nFrom - pB-
5a70: 3e 6e 46 72 6f 6d 3b 0a 20 20 72 65 74 75 72 6e  >nFrom;.  return
5a80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
5a90: 72 67 65 20 74 6f 67 65 74 68 65 72 20 74 77 6f  rge together two
5aa0: 20 73 6f 72 74 65 64 20 6c 69 73 74 73 20 6f 66   sorted lists of
5ab0: 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 6f   EditDist3Cost o
5ac0: 62 6a 65 63 74 73 2c 20 69 6e 20 6f 72 64 65 72  bjects, in order
5ad0: 0a 2a 2a 20 6f 66 20 69 6e 63 72 65 61 73 69 6e  .** of increasin
5ae0: 67 20 46 52 4f 4d 2e 0a 2a 2f 0a 73 74 61 74 69  g FROM..*/.stati
5af0: 63 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20  c EditDist3Cost 
5b00: 2a 65 64 69 74 44 69 73 74 33 43 6f 73 74 4d 65  *editDist3CostMe
5b10: 72 67 65 28 0a 20 20 45 64 69 74 44 69 73 74 33  rge(.  EditDist3
5b20: 43 6f 73 74 20 2a 70 41 2c 0a 20 20 45 64 69 74  Cost *pA,.  Edit
5b30: 44 69 73 74 33 43 6f 73 74 20 2a 70 42 0a 29 7b  Dist3Cost *pB.){
5b40: 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74  .  EditDist3Cost
5b50: 20 2a 70 48 65 61 64 20 3d 20 30 3b 0a 20 20 45   *pHead = 0;.  E
5b60: 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 70  ditDist3Cost **p
5b70: 70 54 61 69 6c 20 3d 20 26 70 48 65 61 64 3b 0a  pTail = &pHead;.
5b80: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
5b90: 2a 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  *p;.  while( pA 
5ba0: 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
5bb0: 20 65 64 69 74 44 69 73 74 33 43 6f 73 74 43 6f   editDist3CostCo
5bc0: 6d 70 61 72 65 28 70 41 2c 70 42 29 3c 3d 30 20  mpare(pA,pB)<=0 
5bd0: 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 41 3b  ){.      p = pA;
5be0: 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e  .      pA = pA->
5bf0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
5c00: 7b 0a 20 20 20 20 20 20 70 20 3d 20 70 42 3b 0a  {.      p = pB;.
5c10: 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
5c20: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
5c30: 2a 70 70 54 61 69 6c 20 3d 20 70 3b 0a 20 20 20  *ppTail = p;.   
5c40: 20 70 70 54 61 69 6c 20 3d 20 20 26 70 2d 3e 70   ppTail =  &p->p
5c50: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
5c60: 70 41 20 29 7b 0a 20 20 20 20 2a 70 70 54 61 69  pA ){.    *ppTai
5c70: 6c 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 7b  l = pA;.  }else{
5c80: 0a 20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70  .    *ppTail = p
5c90: 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  B;.  }.  return 
5ca0: 70 48 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pHead;.}../*.** 
5cb0: 53 6f 72 74 20 61 20 6c 69 73 74 20 6f 66 20 45  Sort a list of E
5cc0: 64 69 74 44 69 73 74 33 43 6f 73 74 20 6f 62 6a  ditDist3Cost obj
5cd0: 65 63 74 73 20 69 6e 74 6f 20 6f 72 64 65 72 20  ects into order 
5ce0: 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 46 52  of increasing FR
5cf0: 4f 4d 0a 2a 2f 0a 73 74 61 74 69 63 20 45 64 69  OM.*/.static Edi
5d00: 74 44 69 73 74 33 43 6f 73 74 20 2a 65 64 69 74  tDist3Cost *edit
5d10: 44 69 73 74 33 43 6f 73 74 53 6f 72 74 28 45 64  Dist3CostSort(Ed
5d20: 69 74 44 69 73 74 33 43 6f 73 74 20 2a 70 4c 69  itDist3Cost *pLi
5d30: 73 74 29 7b 0a 20 20 45 64 69 74 44 69 73 74 33  st){.  EditDist3
5d40: 43 6f 73 74 20 2a 61 70 5b 36 30 5d 2c 20 2a 70  Cost *ap[60], *p
5d50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5d60: 20 6d 78 20 3d 20 30 3b 0a 20 20 61 70 5b 30 5d   mx = 0;.  ap[0]
5d70: 20 3d 20 30 3b 0a 20 20 61 70 5b 31 5d 20 3d 20   = 0;.  ap[1] = 
5d80: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  0;.  while( pLis
5d90: 74 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 4c 69  t ){.    p = pLi
5da0: 73 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  st;.    pList = 
5db0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 2d  p->pNext;.    p-
5dc0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
5dd0: 66 6f 72 28 69 3d 30 3b 20 61 70 5b 69 5d 3b 20  for(i=0; ap[i]; 
5de0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20  i++){.      p = 
5df0: 65 64 69 74 44 69 73 74 33 43 6f 73 74 4d 65 72  editDist3CostMer
5e00: 67 65 28 61 70 5b 69 5d 2c 70 29 3b 0a 20 20 20  ge(ap[i],p);.   
5e10: 20 20 20 61 70 5b 69 5d 20 3d 20 30 3b 0a 20 20     ap[i] = 0;.  
5e20: 20 20 7d 0a 20 20 20 20 61 70 5b 69 5d 20 3d 20    }.    ap[i] = 
5e30: 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 6d 78 20  p;.    if( i>mx 
5e40: 29 7b 0a 20 20 20 20 20 20 6d 78 20 3d 20 69 3b  ){.      mx = i;
5e50: 0a 20 20 20 20 20 20 61 70 5b 69 2b 31 5d 20 3d  .      ap[i+1] =
5e60: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
5e70: 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  p = 0;.  for(i=0
5e80: 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20  ; i<=mx; i++){. 
5e90: 20 20 20 69 66 28 20 61 70 5b 69 5d 20 29 20 70     if( ap[i] ) p
5ea0: 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f 73 74   = editDist3Cost
5eb0: 4d 65 72 67 65 28 70 2c 61 70 5b 69 5d 29 3b 0a  Merge(p,ap[i]);.
5ec0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
5ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 6c  }../*.** Load al
5ee0: 6c 20 65 64 69 74 2d 64 69 73 74 61 6e 63 65 20  l edit-distance 
5ef0: 77 65 69 67 68 74 73 20 66 72 6f 6d 20 61 20 74  weights from a t
5f00: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
5f10: 69 6e 74 20 65 64 69 74 44 69 73 74 33 43 6f 6e  int editDist3Con
5f20: 66 69 67 4c 6f 61 64 28 0a 20 20 45 64 69 74 44  figLoad(.  EditD
5f30: 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 2c 20 20  ist3Config *p,  
5f40: 20 20 20 20 2f 2a 20 54 68 65 20 65 64 69 74 20      /* The edit 
5f50: 64 69 73 74 61 6e 63 65 20 63 6f 6e 66 69 67 75  distance configu
5f60: 72 61 74 69 6f 6e 20 74 6f 20 6c 6f 61 64 20 2a  ration to load *
5f70: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5f90: 6f 61 64 20 66 72 6f 6d 20 74 68 69 73 20 64 61  oad from this da
5fa0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
5fb0: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 20 20  t char *zTable  
5fc0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5fd0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  he table from wh
5fe0: 69 63 68 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a 29  ich to load */.)
5ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
6000: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
6010: 63 2c 20 72 63 32 3b 0a 20 20 63 68 61 72 20 2a  c, rc2;.  char *
6020: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69 4c 61 6e  zSql;.  int iLan
6030: 67 50 72 65 76 20 3d 20 2d 39 39 39 39 3b 0a 20  gPrev = -9999;. 
6040: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a   EditDist3Lang *
6050: 70 4c 61 6e 67 20 3d 20 30 3b 0a 0a 20 20 7a 53  pLang = 0;..  zS
6060: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
6070: 69 6e 74 66 28 22 53 45 4c 45 43 54 20 69 4c 61  intf("SELECT iLa
6080: 6e 67 2c 20 63 46 72 6f 6d 2c 20 63 54 6f 2c 20  ng, cFrom, cTo, 
6090: 69 43 6f 73 74 22 0a 20 20 20 20 20 20 20 20 20  iCost".         
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 22 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20 57 48  " FROM \"%w\" WH
60c0: 45 52 45 20 69 4c 61 6e 67 3e 3d 30 20 4f 52 44  ERE iLang>=0 ORD
60d0: 45 52 20 42 59 20 69 4c 61 6e 67 22 2c 20 7a 54  ER BY iLang", zT
60e0: 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 7a 53 71  able);.  if( zSq
60f0: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
6100: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
6110: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
6120: 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  re(db, zSql, -1,
6130: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73   &pStmt, 0);.  s
6140: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
6150: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6160: 74 75 72 6e 20 72 63 3b 0a 20 20 65 64 69 74 44  turn rc;.  editD
6170: 69 73 74 33 43 6f 6e 66 69 67 43 6c 65 61 72 28  ist3ConfigClear(
6180: 70 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  p);.  while( sql
6190: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
61a0: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
61b0: 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20      int iLang = 
61c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
61d0: 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
61e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
61f0: 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  rom = (const cha
6200: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
6210: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
6220: 3b 0a 20 20 20 20 69 6e 74 20 6e 46 72 6f 6d 20  ;.    int nFrom 
6230: 3d 20 7a 46 72 6f 6d 20 3f 20 73 71 6c 69 74 65  = zFrom ? sqlite
6240: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
6250: 53 74 6d 74 2c 20 31 29 20 3a 20 30 3b 0a 20 20  Stmt, 1) : 0;.  
6260: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
6270: 6f 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  o = (const char*
6280: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
6290: 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  text(pStmt, 2);.
62a0: 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 7a 54      int nTo = zT
62b0: 6f 20 3f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  o ? sqlite3_colu
62c0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
62d0: 32 29 20 3a 20 30 3b 0a 20 20 20 20 69 6e 74 20  2) : 0;.    int 
62e0: 69 43 6f 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  iCost = sqlite3_
62f0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
6300: 2c 20 33 29 3b 0a 0a 20 20 20 20 61 73 73 65 72  , 3);..    asser
6310: 74 28 20 7a 46 72 6f 6d 21 3d 30 20 7c 7c 20 6e  t( zFrom!=0 || n
6320: 46 72 6f 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 61  From==0 );.    a
6330: 73 73 65 72 74 28 20 7a 54 6f 21 3d 30 20 7c 7c  ssert( zTo!=0 ||
6340: 20 6e 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 69   nTo==0 );.    i
6350: 66 28 20 6e 46 72 6f 6d 3e 31 30 30 20 7c 7c 20  f( nFrom>100 || 
6360: 6e 54 6f 3e 31 30 30 20 29 20 63 6f 6e 74 69 6e  nTo>100 ) contin
6370: 75 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 73  ue;.    if( iCos
6380: 74 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  t<0 ) continue;.
6390: 20 20 20 20 69 66 28 20 69 43 6f 73 74 3e 3d 31      if( iCost>=1
63a0: 30 30 30 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  0000 ) continue;
63b0: 20 20 2f 2a 20 43 6f 73 74 73 20 61 62 6f 76 65    /* Costs above
63c0: 20 31 30 4b 20 61 72 65 20 63 6f 6e 73 69 64 65   10K are conside
63d0: 72 65 64 20 69 6e 66 69 6e 69 74 65 20 2a 2f 0a  red infinite */.
63e0: 20 20 20 20 69 66 28 20 70 4c 61 6e 67 3d 3d 30      if( pLang==0
63f0: 20 7c 7c 20 69 4c 61 6e 67 21 3d 69 4c 61 6e 67   || iLang!=iLang
6400: 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 45 64  Prev ){.      Ed
6410: 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70 4e 65  itDist3Lang *pNe
6420: 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  w;.      pNew = 
6430: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
6440: 34 28 70 2d 3e 61 2c 20 28 70 2d 3e 6e 4c 61 6e  4(p->a, (p->nLan
6450: 67 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  g+1)*sizeof(p->a
6460: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
6470: 20 70 4e 65 77 3d 3d 30 20 29 7b 20 72 63 20 3d   pNew==0 ){ rc =
6480: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20 62   SQLITE_NOMEM; b
6490: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 70 2d  reak; }.      p-
64a0: 3e 61 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  >a = pNew;.     
64b0: 20 70 4c 61 6e 67 20 3d 20 26 70 2d 3e 61 5b 70   pLang = &p->a[p
64c0: 2d 3e 6e 4c 61 6e 67 5d 3b 0a 20 20 20 20 20 20  ->nLang];.      
64d0: 70 2d 3e 6e 4c 61 6e 67 2b 2b 3b 0a 20 20 20 20  p->nLang++;.    
64e0: 20 20 70 4c 61 6e 67 2d 3e 69 4c 61 6e 67 20 3d    pLang->iLang =
64f0: 20 69 4c 61 6e 67 3b 0a 20 20 20 20 20 20 70 4c   iLang;.      pL
6500: 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 20 3d 20  ang->iInsCost = 
6510: 31 30 30 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67  100;.      pLang
6520: 2d 3e 69 44 65 6c 43 6f 73 74 20 3d 20 31 30 30  ->iDelCost = 100
6530: 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  ;.      pLang->i
6540: 53 75 62 43 6f 73 74 20 3d 20 31 35 30 3b 0a 20  SubCost = 150;. 
6550: 20 20 20 20 20 70 4c 61 6e 67 2d 3e 70 43 6f 73       pLang->pCos
6560: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 4c 61  t = 0;.      iLa
6570: 6e 67 50 72 65 76 20 3d 20 69 4c 61 6e 67 3b 0a  ngPrev = iLang;.
6580: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
6590: 72 6f 6d 3d 3d 31 20 26 26 20 7a 46 72 6f 6d 5b  rom==1 && zFrom[
65a0: 30 5d 3d 3d 27 3f 27 20 26 26 20 6e 54 6f 3d 3d  0]=='?' && nTo==
65b0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67  0 ){.      pLang
65c0: 2d 3e 69 44 65 6c 43 6f 73 74 20 3d 20 69 43 6f  ->iDelCost = iCo
65d0: 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  st;.    }else if
65e0: 28 20 6e 46 72 6f 6d 3d 3d 30 20 26 26 20 6e 54  ( nFrom==0 && nT
65f0: 6f 3d 3d 31 20 26 26 20 7a 54 6f 5b 30 5d 3d 3d  o==1 && zTo[0]==
6600: 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 70 4c 61  '?' ){.      pLa
6610: 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 20 3d 20 69  ng->iInsCost = i
6620: 43 6f 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Cost;.    }else 
6630: 69 66 28 20 6e 46 72 6f 6d 3d 3d 31 20 26 26 20  if( nFrom==1 && 
6640: 6e 54 6f 3d 3d 31 20 26 26 20 7a 46 72 6f 6d 5b  nTo==1 && zFrom[
6650: 30 5d 3d 3d 27 3f 27 20 26 26 20 7a 54 6f 5b 30  0]=='?' && zTo[0
6660: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='?' ){.      
6670: 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73 74 20  pLang->iSubCost 
6680: 3d 20 69 43 6f 73 74 3b 0a 20 20 20 20 7d 65 6c  = iCost;.    }el
6690: 73 65 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69  se{.      EditDi
66a0: 73 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 3b 0a  st3Cost *pCost;.
66b0: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61        int nExtra
66c0: 20 3d 20 6e 46 72 6f 6d 20 2b 20 6e 54 6f 20 2d   = nFrom + nTo -
66d0: 20 34 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   4;.      if( nE
66e0: 78 74 72 61 3c 30 20 29 20 6e 45 78 74 72 61 20  xtra<0 ) nExtra 
66f0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  = 0;.      pCost
6700: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
6710: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f  c64( sizeof(*pCo
6720: 73 74 29 20 2b 20 6e 45 78 74 72 61 20 29 3b 0a  st) + nExtra );.
6730: 20 20 20 20 20 20 69 66 28 20 70 43 6f 73 74 3d        if( pCost=
6740: 3d 30 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54  =0 ){ rc = SQLIT
6750: 45 5f 4e 4f 4d 45 4d 3b 20 62 72 65 61 6b 3b 20  E_NOMEM; break; 
6760: 7d 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e  }.      pCost->n
6770: 46 72 6f 6d 20 3d 20 28 75 38 29 6e 46 72 6f 6d  From = (u8)nFrom
6780: 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e  ;.      pCost->n
6790: 54 6f 20 3d 20 28 75 38 29 6e 54 6f 3b 0a 20 20  To = (u8)nTo;.  
67a0: 20 20 20 20 70 43 6f 73 74 2d 3e 69 43 6f 73 74      pCost->iCost
67b0: 20 3d 20 28 75 31 36 29 69 43 6f 73 74 3b 0a 20   = (u16)iCost;. 
67c0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 73       memcpy(pCos
67d0: 74 2d 3e 61 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72  t->a, zFrom, nFr
67e0: 6f 6d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  om);.      memcp
67f0: 79 28 70 43 6f 73 74 2d 3e 61 20 2b 20 6e 46 72  y(pCost->a + nFr
6800: 6f 6d 2c 20 7a 54 6f 2c 20 6e 54 6f 29 3b 0a 20  om, zTo, nTo);. 
6810: 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 4e 65 78       pCost->pNex
6820: 74 20 3d 20 70 4c 61 6e 67 2d 3e 70 43 6f 73 74  t = pLang->pCost
6830: 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 70  ;.      pLang->p
6840: 43 6f 73 74 20 3d 20 70 43 6f 73 74 3b 20 0a 20  Cost = pCost; . 
6850: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 32 20 3d     }.  }.  rc2 =
6860: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
6870: 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
6880: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
6890: 72 63 20 3d 20 72 63 32 3b 0a 20 20 69 66 28 20  rc = rc2;.  if( 
68a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
68b0: 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 3b 0a  .    int iLang;.
68c0: 20 20 20 20 66 6f 72 28 69 4c 61 6e 67 3d 30 3b      for(iLang=0;
68d0: 20 69 4c 61 6e 67 3c 70 2d 3e 6e 4c 61 6e 67 3b   iLang<p->nLang;
68e0: 20 69 4c 61 6e 67 2b 2b 29 7b 0a 20 20 20 20 20   iLang++){.     
68f0: 20 70 2d 3e 61 5b 69 4c 61 6e 67 5d 2e 70 43 6f   p->a[iLang].pCo
6900: 73 74 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f  st = editDist3Co
6910: 73 74 53 6f 72 74 28 70 2d 3e 61 5b 69 4c 61 6e  stSort(p->a[iLan
6920: 67 5d 2e 70 43 6f 73 74 29 3b 0a 20 20 20 20 7d  g].pCost);.    }
6930: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6940: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6950: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 28 69 6e  n the length (in
6960: 20 62 79 74 65 73 29 20 6f 66 20 61 20 75 74 66   bytes) of a utf
6970: 2d 38 20 63 68 61 72 61 63 74 65 72 2e 20 20 4f  -8 character.  O
6980: 72 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d  r return a maxim
6990: 75 6d 0a 2a 2a 20 6f 66 20 4e 2e 0a 2a 2f 0a 73  um.** of N..*/.s
69a0: 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 4c 65  tatic int utf8Le
69b0: 6e 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  n(unsigned char 
69c0: 63 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  c, int N){.  int
69d0: 20 6c 65 6e 20 3d 20 31 3b 0a 20 20 69 66 28 20   len = 1;.  if( 
69e0: 63 3e 30 78 37 66 20 29 7b 0a 20 20 20 20 69 66  c>0x7f ){.    if
69f0: 28 20 28 63 26 30 78 65 30 29 3d 3d 30 78 63 30  ( (c&0xe0)==0xc0
6a00: 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20   ){.      len = 
6a10: 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
6a20: 20 28 63 26 30 78 66 30 29 3d 3d 30 78 65 30 20   (c&0xf0)==0xe0 
6a30: 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 33  ){.      len = 3
6a40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6a50: 20 20 20 6c 65 6e 20 3d 20 34 3b 0a 20 20 20 20     len = 4;.    
6a60: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 3e  }.  }.  if( len>
6a70: 4e 20 29 20 6c 65 6e 20 3d 20 4e 3b 0a 20 20 72  N ) len = N;.  r
6a80: 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a  eturn len;.}../*
6a90: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
6aa0: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68  (non-zero) if th
6ab0: 65 20 54 6f 20 73 69 64 65 20 6f 66 20 74 68 65  e To side of the
6ac0: 20 67 69 76 65 6e 20 63 6f 73 74 20 6d 61 74 63   given cost matc
6ad0: 68 65 73 0a 2a 2a 20 74 68 65 20 67 69 76 65 6e  hes.** the given
6ae0: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
6af0: 69 63 20 69 6e 74 20 6d 61 74 63 68 54 6f 28 45  ic int matchTo(E
6b00: 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 70 2c  ditDist3Cost *p,
6b10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
6b20: 69 6e 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74  int n){.  assert
6b30: 28 20 6e 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ( n>0 );.  if( p
6b40: 2d 3e 61 5b 70 2d 3e 6e 46 72 6f 6d 5d 21 3d 7a  ->a[p->nFrom]!=z
6b50: 5b 30 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  [0] ) return 0;.
6b60: 20 20 69 66 28 20 70 2d 3e 6e 54 6f 3e 6e 20 29    if( p->nTo>n )
6b70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
6b80: 20 73 74 72 6e 63 6d 70 28 70 2d 3e 61 2b 70 2d   strncmp(p->a+p-
6b90: 3e 6e 46 72 6f 6d 2c 20 7a 2c 20 70 2d 3e 6e 54  >nFrom, z, p->nT
6ba0: 6f 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  o)!=0 ) return 0
6bb0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
6bc0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
6bd0: 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  UE (non-zero) if
6be0: 20 74 68 65 20 46 72 6f 6d 20 73 69 64 65 20 6f   the From side o
6bf0: 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 73 74  f the given cost
6c00: 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20   matches.** the 
6c10: 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 0a 2a 2f  given string..*/
6c20: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63  .static int matc
6c30: 68 46 72 6f 6d 28 45 64 69 74 44 69 73 74 33 43  hFrom(EditDist3C
6c40: 6f 73 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ost *p, const ch
6c50: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
6c60: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 6f   assert( p->nFro
6c70: 6d 3c 3d 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m<=n );.  if( p-
6c80: 3e 6e 46 72 6f 6d 20 29 7b 0a 20 20 20 20 69 66  >nFrom ){.    if
6c90: 28 20 70 2d 3e 61 5b 30 5d 21 3d 7a 5b 30 5d 20  ( p->a[0]!=z[0] 
6ca0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
6cb0: 69 66 28 20 73 74 72 6e 63 6d 70 28 70 2d 3e 61  if( strncmp(p->a
6cc0: 2c 20 7a 2c 20 70 2d 3e 6e 46 72 6f 6d 29 21 3d  , z, p->nFrom)!=
6cd0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6ce0: 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
6cf0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
6d00: 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 6f 66  UE (non-zero) of
6d10: 20 74 68 65 20 6e 65 78 74 20 46 52 4f 4d 20 63   the next FROM c
6d20: 68 61 72 61 63 74 65 72 20 61 6e 64 20 74 68 65  haracter and the
6d30: 20 6e 65 78 74 20 54 4f 0a 2a 2a 20 63 68 61 72   next TO.** char
6d40: 61 63 74 65 72 20 61 72 65 20 74 68 65 20 73 61  acter are the sa
6d50: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
6d60: 74 20 6d 61 74 63 68 46 72 6f 6d 54 6f 28 0a 20  t matchFromTo(. 
6d70: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
6d80: 72 69 6e 67 20 2a 70 53 74 72 2c 20 20 2f 2a 20  ring *pStr,  /* 
6d90: 4c 65 66 74 20 68 61 6e 64 20 73 74 72 69 6e 67  Left hand string
6da0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 20 20   */.  int n1,   
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
6dd0: 6d 70 61 72 69 73 6f 6e 20 63 68 61 72 61 63 74  mparison charact
6de0: 65 72 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  er on the left *
6df0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6e00: 7a 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  z2,             
6e10: 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 6c 20 63  /* Right-handl c
6e20: 6f 6d 70 61 72 69 73 6f 6e 20 63 68 61 72 61 63  omparison charac
6e30: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 20  ter */.  int n2 
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e50: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65       /* Bytes re
6e60: 6d 61 69 6e 69 6e 67 20 69 6e 20 7a 32 5b 5d 20  maining in z2[] 
6e70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 31 20 3d  */.){.  int b1 =
6e80: 20 70 53 74 72 2d 3e 61 5b 6e 31 5d 2e 6e 42 79   pStr->a[n1].nBy
6e90: 74 65 3b 0a 20 20 69 66 28 20 62 31 3e 6e 32 20  te;.  if( b1>n2 
6ea0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73  ) return 0;.  as
6eb0: 73 65 72 74 28 20 62 31 3e 30 20 29 3b 0a 20 20  sert( b1>0 );.  
6ec0: 69 66 28 20 70 53 74 72 2d 3e 7a 5b 6e 31 5d 21  if( pStr->z[n1]!
6ed0: 3d 7a 32 5b 30 5d 20 29 20 72 65 74 75 72 6e 20  =z2[0] ) return 
6ee0: 30 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  0;.  if( strncmp
6ef0: 28 70 53 74 72 2d 3e 7a 2b 6e 31 2c 20 7a 32 2c  (pStr->z+n1, z2,
6f00: 20 62 31 29 21 3d 30 20 29 20 72 65 74 75 72 6e   b1)!=0 ) return
6f10: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
6f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
6f30: 61 6e 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  an EditDist3From
6f40: 53 74 72 69 6e 67 20 6f 62 6a 65 63 63 74 0a 2a  String objecct.*
6f50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 64  /.static void ed
6f60: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
6f70: 67 44 65 6c 65 74 65 28 45 64 69 74 44 69 73 74  gDelete(EditDist
6f80: 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 29 7b  3FromString *p){
6f90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
6fa0: 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  p ){.    for(i=0
6fb0: 3b 20 69 3c 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  ; i<p->n; i++){.
6fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6fd0: 65 65 28 70 2d 3e 61 5b 69 5d 2e 61 70 44 65 6c  ee(p->a[i].apDel
6fe0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6ff0: 5f 66 72 65 65 28 70 2d 3e 61 5b 69 5d 2e 61 70  _free(p->a[i].ap
7000: 53 75 62 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Subst);.    }.  
7010: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7020: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7030: 43 72 65 61 74 65 20 61 20 45 64 69 74 44 69 73  Create a EditDis
7040: 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 6f 62 6a  t3FromString obj
7050: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ect..*/.static E
7060: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
7070: 6e 67 20 2a 65 64 69 74 44 69 73 74 33 46 72 6f  ng *editDist3Fro
7080: 6d 53 74 72 69 6e 67 4e 65 77 28 0a 20 20 63 6f  mStringNew(.  co
7090: 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e  nst EditDist3Lan
70a0: 67 20 2a 70 4c 61 6e 67 2c 0a 20 20 63 6f 6e 73  g *pLang,.  cons
70b0: 74 20 63 68 61 72 20 2a 7a 2c 0a 20 20 69 6e 74  t char *z,.  int
70c0: 20 6e 0a 29 7b 0a 20 20 45 64 69 74 44 69 73 74   n.){.  EditDist
70d0: 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 53 74  3FromString *pSt
70e0: 72 3b 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  r;.  EditDist3Co
70f0: 73 74 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  st *p;.  int i;.
7100: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
7110: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6e 3c  turn 0;.  if( n<
7120: 30 20 29 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  0 ) n = (int)str
7130: 6c 65 6e 28 7a 29 3b 0a 20 20 70 53 74 72 20 3d  len(z);.  pStr =
7140: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
7150: 34 28 20 73 69 7a 65 6f 66 28 2a 70 53 74 72 29  4( sizeof(*pStr)
7160: 20 2b 20 73 69 7a 65 6f 66 28 70 53 74 72 2d 3e   + sizeof(pStr->
7170: 61 5b 30 5d 29 2a 6e 20 2b 20 6e 20 2b 20 31 20  a[0])*n + n + 1 
7180: 29 3b 0a 20 20 69 66 28 20 70 53 74 72 3d 3d 30  );.  if( pStr==0
7190: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
71a0: 53 74 72 2d 3e 61 20 3d 20 28 45 64 69 74 44 69  Str->a = (EditDi
71b0: 73 74 33 46 72 6f 6d 2a 29 26 70 53 74 72 5b 31  st3From*)&pStr[1
71c0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53 74 72  ];.  memset(pStr
71d0: 2d 3e 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ->a, 0, sizeof(p
71e0: 53 74 72 2d 3e 61 5b 30 5d 29 2a 6e 29 3b 0a 20  Str->a[0])*n);. 
71f0: 20 70 53 74 72 2d 3e 6e 20 3d 20 6e 3b 0a 20 20   pStr->n = n;.  
7200: 70 53 74 72 2d 3e 7a 20 3d 20 28 63 68 61 72 2a  pStr->z = (char*
7210: 29 26 70 53 74 72 2d 3e 61 5b 6e 5d 3b 0a 20 20  )&pStr->a[n];.  
7220: 6d 65 6d 63 70 79 28 70 53 74 72 2d 3e 7a 2c 20  memcpy(pStr->z, 
7230: 7a 2c 20 6e 2b 31 29 3b 0a 20 20 69 66 28 20 6e  z, n+1);.  if( n
7240: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2a 27 20   && z[n-1]=='*' 
7250: 29 7b 0a 20 20 20 20 70 53 74 72 2d 3e 69 73 50  ){.    pStr->isP
7260: 72 65 66 69 78 20 3d 20 31 3b 0a 20 20 20 20 6e  refix = 1;.    n
7270: 2d 2d 3b 0a 20 20 20 20 70 53 74 72 2d 3e 6e 2d  --;.    pStr->n-
7280: 2d 3b 0a 20 20 20 20 70 53 74 72 2d 3e 7a 5b 6e  -;.    pStr->z[n
7290: 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ] = 0;.  }else{.
72a0: 20 20 20 20 70 53 74 72 2d 3e 69 73 50 72 65 66      pStr->isPref
72b0: 69 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 66  ix = 0;.  }..  f
72c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
72d0: 29 7b 0a 20 20 20 20 45 64 69 74 44 69 73 74 33  ){.    EditDist3
72e0: 46 72 6f 6d 20 2a 70 46 72 6f 6d 20 3d 20 26 70  From *pFrom = &p
72f0: 53 74 72 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 6d  Str->a[i];.    m
7300: 65 6d 73 65 74 28 70 46 72 6f 6d 2c 20 30 2c 20  emset(pFrom, 0, 
7310: 73 69 7a 65 6f 66 28 2a 70 46 72 6f 6d 29 29 3b  sizeof(*pFrom));
7320: 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 6e 42 79 74  .    pFrom->nByt
7330: 65 20 3d 20 75 74 66 38 4c 65 6e 28 28 75 6e 73  e = utf8Len((uns
7340: 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 2c  igned char)z[i],
7350: 20 6e 2d 69 29 3b 0a 20 20 20 20 66 6f 72 28 70   n-i);.    for(p
7360: 3d 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 3b 20 70  =pLang->pCost; p
7370: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
7380: 20 20 20 20 20 45 64 69 74 44 69 73 74 33 43 6f       EditDist3Co
7390: 73 74 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20  st **apNew;.    
73a0: 20 20 69 66 28 20 69 2b 70 2d 3e 6e 46 72 6f 6d    if( i+p->nFrom
73b0: 3e 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  >n ) continue;. 
73c0: 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 46 72       if( matchFr
73d0: 6f 6d 28 70 2c 20 7a 2b 69 2c 20 6e 2d 69 29 3d  om(p, z+i, n-i)=
73e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
73f0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 3d       if( p->nTo=
7400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
7410: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
7420: 61 6c 6c 6f 63 36 34 28 70 46 72 6f 6d 2d 3e 61  alloc64(pFrom->a
7430: 70 44 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  pDel,.          
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 61 70        sizeof(*ap
7460: 4e 65 77 29 2a 28 70 46 72 6f 6d 2d 3e 6e 44 65  New)*(pFrom->nDe
7470: 6c 2b 31 29 29 3b 0a 20 20 20 20 20 20 20 20 69  l+1));.        i
7480: 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 20 62 72  f( apNew==0 ) br
7490: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 46 72  eak;.        pFr
74a0: 6f 6d 2d 3e 61 70 44 65 6c 20 3d 20 61 70 4e 65  om->apDel = apNe
74b0: 77 3b 0a 20 20 20 20 20 20 20 20 61 70 4e 65 77  w;.        apNew
74c0: 5b 70 46 72 6f 6d 2d 3e 6e 44 65 6c 2b 2b 5d 20  [pFrom->nDel++] 
74d0: 3d 20 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = p;.      }else
74e0: 7b 0a 20 20 20 20 20 20 20 20 61 70 4e 65 77 20  {.        apNew 
74f0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
7500: 63 36 34 28 70 46 72 6f 6d 2d 3e 61 70 53 75 62  c64(pFrom->apSub
7510: 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7530: 20 20 20 20 73 69 7a 65 6f 66 28 2a 61 70 4e 65      sizeof(*apNe
7540: 77 29 2a 28 70 46 72 6f 6d 2d 3e 6e 53 75 62 73  w)*(pFrom->nSubs
7550: 74 2b 31 29 29 3b 0a 20 20 20 20 20 20 20 20 69  t+1));.        i
7560: 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 20 62 72  f( apNew==0 ) br
7570: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 46 72  eak;.        pFr
7580: 6f 6d 2d 3e 61 70 53 75 62 73 74 20 3d 20 61 70  om->apSubst = ap
7590: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 61 70 4e  New;.        apN
75a0: 65 77 5b 70 46 72 6f 6d 2d 3e 6e 53 75 62 73 74  ew[pFrom->nSubst
75b0: 2b 2b 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 7d  ++] = p;.      }
75c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
75d0: 20 29 7b 0a 20 20 20 20 20 20 65 64 69 74 44 69   ){.      editDi
75e0: 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c  st3FromStringDel
75f0: 65 74 65 28 70 53 74 72 29 3b 0a 20 20 20 20 20  ete(pStr);.     
7600: 20 70 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20   pStr = 0;.     
7610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7620: 7d 0a 20 20 72 65 74 75 72 6e 20 70 53 74 72 3b  }.  return pStr;
7630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
7640: 20 65 6e 74 72 79 20 6d 5b 69 5d 20 73 75 63 68   entry m[i] such
7650: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
7660: 6d 69 6e 69 6d 75 6d 20 6f 66 20 69 74 73 20 63  minimum of its c
7670: 75 72 72 65 6e 74 20 76 61 6c 75 65 0a 2a 2a 20  urrent value.** 
7680: 61 6e 64 20 6d 5b 6a 5d 2b 69 43 6f 73 74 2e 0a  and m[j]+iCost..
7690: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
76a0: 70 64 61 74 65 43 6f 73 74 28 0a 20 20 75 6e 73  pdateCost(.  uns
76b0: 69 67 6e 65 64 20 69 6e 74 20 2a 6d 2c 0a 20 20  igned int *m,.  
76c0: 69 6e 74 20 69 2c 0a 20 20 69 6e 74 20 6a 2c 0a  int i,.  int j,.
76d0: 20 20 69 6e 74 20 69 43 6f 73 74 0a 29 7b 0a 20    int iCost.){. 
76e0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 62 3b   unsigned int b;
76f0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 73 74  .  assert( iCost
7700: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
7710: 20 69 43 6f 73 74 3c 31 30 30 30 30 20 29 3b 0a   iCost<10000 );.
7720: 20 20 62 20 3d 20 6d 5b 6a 5d 20 2b 20 69 43 6f    b = m[j] + iCo
7730: 73 74 3b 0a 20 20 69 66 28 20 62 3c 6d 5b 69 5d  st;.  if( b<m[i]
7740: 20 29 20 6d 5b 69 5d 20 3d 20 62 3b 0a 7d 0a 0a   ) m[i] = b;.}..
7750: 2f 2a 0a 2a 2a 20 48 6f 77 20 6d 75 63 68 20 73  /*.** How much s
7760: 74 61 63 6b 20 73 70 61 63 65 20 28 69 6e 74 20  tack space (int 
7770: 62 79 74 65 73 29 20 74 6f 20 75 73 65 20 66 6f  bytes) to use fo
7780: 72 20 57 61 67 6e 65 72 20 6d 61 74 72 69 78 20  r Wagner matrix 
7790: 69 6e 20 0a 2a 2a 20 65 64 69 74 44 69 73 74 33  in .** editDist3
77a0: 43 6f 72 65 28 29 2e 20 20 49 66 20 6d 6f 72 65  Core().  If more
77b0: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 69 73   space than this
77c0: 20 69 73 20 72 65 71 75 69 72 65 64 2c 20 74 68   is required, th
77d0: 65 20 65 6e 74 69 72 65 0a 2a 2a 20 6d 61 74 72  e entire.** matr
77e0: 69 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ix is taken from
77f0: 20 74 68 65 20 68 65 61 70 2e 20 20 54 6f 20 72   the heap.  To r
7800: 65 64 75 63 65 20 74 68 65 20 6c 6f 61 64 20 6f  educe the load o
7810: 6e 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  n the memory.** 
7820: 61 6c 6c 6f 63 61 74 6f 72 2c 20 6d 61 6b 65 20  allocator, make 
7830: 74 68 69 73 20 76 61 6c 75 65 20 61 73 20 6c 61  this value as la
7840: 72 67 65 20 61 73 20 70 72 61 63 74 69 63 61 6c  rge as practical
7850: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 61 72 63 68   for the.** arch
7860: 69 74 65 63 74 75 72 65 20 69 6e 20 75 73 65 2e  itecture in use.
7870: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
7880: 54 45 5f 53 50 45 4c 4c 46 49 58 5f 53 54 41 43  TE_SPELLFIX_STAC
7890: 4b 41 4c 4c 4f 43 5f 53 5a 0a 23 20 64 65 66 69  KALLOC_SZ.# defi
78a0: 6e 65 20 53 51 4c 49 54 45 5f 53 50 45 4c 4c 46  ne SQLITE_SPELLF
78b0: 49 58 5f 53 54 41 43 4b 41 4c 4c 4f 43 5f 53 5a  IX_STACKALLOC_SZ
78c0: 20 20 28 31 30 32 34 29 0a 23 65 6e 64 69 66 0a    (1024).#endif.
78d0: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
78e0: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 62 65  edit distance be
78f0: 74 77 65 65 6e 20 74 77 6f 20 73 74 72 69 6e 67  tween two string
7900: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
7910: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
7920: 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
7930: 75 6d 62 65 72 20 77 68 69 63 68 20 69 73 20 74  umber which is t
7940: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  he error code..*
7950: 2a 0a 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20  *.** If pnMatch 
7960: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
7970: 6e 20 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65  n *pnMatch is se
7980: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
7990: 6f 66 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  of characters.**
79a0: 20 28 6e 6f 74 20 62 79 74 65 73 29 20 69 6e 20   (not bytes) in 
79b0: 7a 32 20 74 68 61 74 20 6d 61 74 63 68 65 64 20  z2 that matched 
79c0: 74 68 65 20 73 65 61 72 63 68 20 70 61 74 74 65  the search patte
79d0: 72 6e 20 69 6e 20 2a 70 46 72 6f 6d 2e 20 49 66  rn in *pFrom. If
79e0: 20 70 46 72 6f 6d 20 64 6f 65 73 0a 2a 2a 20 6e   pFrom does.** n
79f0: 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70  ot contain the p
7a00: 61 74 74 65 72 6e 20 66 6f 72 20 61 20 70 72 65  attern for a pre
7a10: 66 69 78 2d 73 65 61 72 63 68 2c 20 74 68 65 6e  fix-search, then
7a20: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
7a30: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
7a40: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a   characters in z
7a50: 32 2e 20 49 66 20 70 46 72 6f 6d 20 64 6f 65 73  2. If pFrom does
7a60: 20 63 6f 6e 74 61 69 6e 20 61 20 70 72 65 66 69   contain a prefi
7a70: 78 20 73 65 61 72 63 68 20 70 61 74 74 65 72 6e  x search pattern
7a80: 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  , then.** it is 
7a90: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
7aa0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
7ab0: 70 72 65 66 69 78 20 6f 66 20 7a 32 20 74 68 61  prefix of z2 tha
7ac0: 74 20 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20  t was deemed to 
7ad0: 0a 2a 2a 20 6d 61 74 63 68 20 70 46 72 6f 6d 2e  .** match pFrom.
7ae0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
7af0: 64 69 74 44 69 73 74 33 43 6f 72 65 28 0a 20 20  ditDist3Core(.  
7b00: 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  EditDist3FromStr
7b10: 69 6e 67 20 2a 70 46 72 6f 6d 2c 20 20 2f 2a 20  ing *pFrom,  /* 
7b20: 54 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20  The FROM string 
7b30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7b40: 2a 7a 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  *z2,            
7b50: 20 20 2f 2a 20 54 68 65 20 54 4f 20 73 74 72 69    /* The TO stri
7b60: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20  ng */.  int n2, 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
7b90: 66 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20  f the TO string 
7ba0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44  */.  const EditD
7bb0: 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c  ist3Lang *pLang,
7bc0: 20 20 2f 2a 20 45 64 69 74 20 77 65 69 67 68 74    /* Edit weight
7bd0: 73 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  s for a particul
7be0: 61 72 20 6c 61 6e 67 75 61 67 65 20 49 44 20 2a  ar language ID *
7bf0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4d 61 74 63 68  /.  int *pnMatch
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 20 2f 2a 20 4f 55 54 3a 20 43 68 61 72 61 63 74   /* OUT: Charact
7c20: 65 72 73 20 69 6e 20 6d 61 74 63 68 65 64 20 70  ers in matched p
7c30: 72 65 66 69 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e  refix */.){.  in
7c40: 74 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 31  t k, n;.  int i1
7c50: 2c 20 62 31 3b 0a 20 20 69 6e 74 20 69 32 2c 20  , b1;.  int i2, 
7c60: 62 32 3b 0a 20 20 45 64 69 74 44 69 73 74 33 46  b2;.  EditDist3F
7c70: 72 6f 6d 53 74 72 69 6e 67 20 66 20 3d 20 2a 70  romString f = *p
7c80: 46 72 6f 6d 3b 0a 20 20 45 64 69 74 44 69 73 74  From;.  EditDist
7c90: 33 54 6f 20 2a 61 32 3b 0a 20 20 75 6e 73 69 67  3To *a2;.  unsig
7ca0: 6e 65 64 20 69 6e 74 20 2a 6d 3b 0a 20 20 75 6e  ned int *m;.  un
7cb0: 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 54 6f 46  signed int *pToF
7cc0: 72 65 65 3b 0a 20 20 69 6e 74 20 73 7a 52 6f 77  ree;.  int szRow
7cd0: 3b 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73  ;.  EditDist3Cos
7ce0: 74 20 2a 70 3b 0a 20 20 69 6e 74 20 72 65 73 3b  t *p;.  int res;
7cf0: 0a 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  .  sqlite3_uint6
7d00: 34 20 6e 42 79 74 65 3b 0a 20 20 75 6e 73 69 67  4 nByte;.  unsig
7d10: 6e 65 64 20 69 6e 74 20 73 74 61 63 6b 53 70 61  ned int stackSpa
7d20: 63 65 5b 53 51 4c 49 54 45 5f 53 50 45 4c 4c 46  ce[SQLITE_SPELLF
7d30: 49 58 5f 53 54 41 43 4b 41 4c 4c 4f 43 5f 53 5a  IX_STACKALLOC_SZ
7d40: 2f 73 69 7a 65 6f 66 28 75 6e 73 69 67 6e 65 64  /sizeof(unsigned
7d50: 20 69 6e 74 29 5d 3b 0a 0a 20 20 2f 2a 20 61 6c   int)];..  /* al
7d60: 6c 6f 63 61 74 65 20 74 68 65 20 57 61 67 6e 65  locate the Wagne
7d70: 72 20 6d 61 74 72 69 78 20 61 6e 64 20 74 68 65  r matrix and the
7d80: 20 61 54 6f 5b 5d 20 61 72 72 61 79 20 66 6f 72   aTo[] array for
7d90: 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a   the TO string *
7da0: 2f 0a 20 20 6e 20 3d 20 28 66 2e 6e 2b 31 29 2a  /.  n = (f.n+1)*
7db0: 28 6e 32 2b 31 29 3b 0a 20 20 6e 20 3d 20 28 6e  (n2+1);.  n = (n
7dc0: 2b 31 29 26 7e 31 3b 0a 20 20 6e 42 79 74 65 20  +1)&~1;.  nByte 
7dd0: 3d 20 6e 2a 73 69 7a 65 6f 66 28 6d 5b 30 5d 29  = n*sizeof(m[0])
7de0: 20 2b 20 73 69 7a 65 6f 66 28 61 32 5b 30 5d 29   + sizeof(a2[0])
7df0: 2a 6e 32 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  *n2;.  if( nByte
7e00: 3c 3d 73 69 7a 65 6f 66 28 73 74 61 63 6b 53 70  <=sizeof(stackSp
7e10: 61 63 65 29 20 29 7b 0a 20 20 20 20 6d 20 3d 20  ace) ){.    m = 
7e20: 73 74 61 63 6b 53 70 61 63 65 3b 0a 20 20 20 20  stackSpace;.    
7e30: 70 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  pToFree = 0;.  }
7e40: 65 6c 73 65 7b 0a 20 20 20 20 6d 20 3d 20 70 54  else{.    m = pT
7e50: 6f 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f  oFree = sqlite3_
7e60: 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 20  malloc64( nByte 
7e70: 29 3b 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20  );.    if( m==0 
7e80: 29 20 72 65 74 75 72 6e 20 2d 31 3b 20 20 20 20  ) return -1;    
7e90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 20 6f          /* Out o
7ea0: 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 7d 0a  f memory */.  }.
7eb0: 20 20 61 32 20 3d 20 28 45 64 69 74 44 69 73 74    a2 = (EditDist
7ec0: 33 54 6f 2a 29 26 6d 5b 6e 5d 3b 0a 20 20 6d 65  3To*)&m[n];.  me
7ed0: 6d 73 65 74 28 61 32 2c 20 30 2c 20 73 69 7a 65  mset(a2, 0, size
7ee0: 6f 66 28 61 32 5b 30 5d 29 2a 6e 32 29 3b 0a 0a  of(a2[0])*n2);..
7ef0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
7f00: 20 61 31 5b 5d 20 6d 61 74 72 69 78 20 66 6f 72   a1[] matrix for
7f10: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
7f20: 6f 66 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67  of the TO string
7f30: 20 2a 2f 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20   */.  for(i2=0; 
7f40: 69 32 3c 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20 20  i2<n2; i2++){.  
7f50: 20 20 61 32 5b 69 32 5d 2e 6e 42 79 74 65 20 3d    a2[i2].nByte =
7f60: 20 75 74 66 38 4c 65 6e 28 28 75 6e 73 69 67 6e   utf8Len((unsign
7f70: 65 64 20 63 68 61 72 29 7a 32 5b 69 32 5d 2c 20  ed char)z2[i2], 
7f80: 6e 32 2d 69 32 29 3b 0a 20 20 20 20 66 6f 72 28  n2-i2);.    for(
7f90: 70 3d 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 3b 20  p=pLang->pCost; 
7fa0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
7fb0: 20 20 20 20 20 20 45 64 69 74 44 69 73 74 33 43        EditDist3C
7fc0: 6f 73 74 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20  ost **apNew;.   
7fd0: 20 20 20 69 66 28 20 70 2d 3e 6e 46 72 6f 6d 3e     if( p->nFrom>
7fe0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
7ff0: 20 69 66 28 20 69 32 2b 70 2d 3e 6e 54 6f 3e 6e   if( i2+p->nTo>n
8000: 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  2 ) continue;.  
8010: 20 20 20 20 69 66 28 20 70 2d 3e 61 5b 30 5d 3e      if( p->a[0]>
8020: 7a 32 5b 69 32 5d 20 29 20 62 72 65 61 6b 3b 0a  z2[i2] ) break;.
8030: 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 54        if( matchT
8040: 6f 28 70 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d 69  o(p, z2+i2, n2-i
8050: 32 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  2)==0 ) continue
8060: 3b 0a 20 20 20 20 20 20 61 32 5b 69 32 5d 2e 6e  ;.      a2[i2].n
8070: 49 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 61 70 4e  Ins++;.      apN
8080: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
8090: 6c 6c 6f 63 36 34 28 61 32 5b 69 32 5d 2e 61 70  lloc64(a2[i2].ap
80a0: 49 6e 73 2c 20 73 69 7a 65 6f 66 28 2a 61 70 4e  Ins, sizeof(*apN
80b0: 65 77 29 2a 61 32 5b 69 32 5d 2e 6e 49 6e 73 29  ew)*a2[i2].nIns)
80c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  ;.      if( apNe
80d0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
80e0: 72 65 73 20 3d 20 2d 31 3b 20 20 2f 2a 20 4f 75  res = -1;  /* Ou
80f0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
8100: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 64 69 74         goto edit
8110: 44 69 73 74 33 41 62 6f 72 74 3b 0a 20 20 20 20  Dist3Abort;.    
8120: 20 20 7d 0a 20 20 20 20 20 20 61 32 5b 69 32 5d    }.      a2[i2]
8130: 2e 61 70 49 6e 73 20 3d 20 61 70 4e 65 77 3b 0a  .apIns = apNew;.
8140: 20 20 20 20 20 20 61 32 5b 69 32 5d 2e 61 70 49        a2[i2].apI
8150: 6e 73 5b 61 32 5b 69 32 5d 2e 6e 49 6e 73 2d 31  ns[a2[i2].nIns-1
8160: 5d 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = p;.    }.  }
8170: 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74  ..  /* Prepare t
8180: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 69  o compute the mi
8190: 6e 69 6d 75 6d 20 65 64 69 74 20 64 69 73 74 61  nimum edit dista
81a0: 6e 63 65 20 2a 2f 0a 20 20 73 7a 52 6f 77 20 3d  nce */.  szRow =
81b0: 20 66 2e 6e 2b 31 3b 0a 20 20 6d 65 6d 73 65 74   f.n+1;.  memset
81c0: 28 6d 2c 20 30 78 30 31 2c 20 28 6e 32 2b 31 29  (m, 0x01, (n2+1)
81d0: 2a 73 7a 52 6f 77 2a 73 69 7a 65 6f 66 28 6d 5b  *szRow*sizeof(m[
81e0: 30 5d 29 29 3b 0a 20 20 6d 5b 30 5d 20 3d 20 30  0]));.  m[0] = 0
81f0: 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 66 69  ;..  /* First fi
8200: 6c 6c 20 69 6e 20 74 68 65 20 74 6f 70 2d 72 6f  ll in the top-ro
8210: 77 20 6f 66 20 74 68 65 20 6d 61 74 72 69 78 20  w of the matrix 
8220: 77 69 74 68 20 46 52 4f 4d 20 64 65 6c 65 74 69  with FROM deleti
8230: 6f 6e 20 63 6f 73 74 73 20 2a 2f 0a 20 20 66 6f  on costs */.  fo
8240: 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20  r(i1=0; i1<f.n; 
8250: 69 31 20 2b 3d 20 62 31 29 7b 0a 20 20 20 20 62  i1 += b1){.    b
8260: 31 20 3d 20 66 2e 61 5b 69 31 5d 2e 6e 42 79 74  1 = f.a[i1].nByt
8270: 65 3b 0a 20 20 20 20 75 70 64 61 74 65 43 6f 73  e;.    updateCos
8280: 74 28 6d 2c 20 69 31 2b 62 31 2c 20 69 31 2c 20  t(m, i1+b1, i1, 
8290: 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f 73 74 29  pLang->iDelCost)
82a0: 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ;.    for(k=0; k
82b0: 3c 66 2e 61 5b 69 31 5d 2e 6e 44 65 6c 3b 20 6b  <f.a[i1].nDel; k
82c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 66  ++){.      p = f
82d0: 2e 61 5b 69 31 5d 2e 61 70 44 65 6c 5b 6b 5d 3b  .a[i1].apDel[k];
82e0: 0a 20 20 20 20 20 20 75 70 64 61 74 65 43 6f 73  .      updateCos
82f0: 74 28 6d 2c 20 69 31 2b 70 2d 3e 6e 46 72 6f 6d  t(m, i1+p->nFrom
8300: 2c 20 69 31 2c 20 70 2d 3e 69 43 6f 73 74 29 3b  , i1, p->iCost);
8310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8320: 20 46 69 6c 6c 20 69 6e 20 61 6c 6c 20 73 75 62   Fill in all sub
8330: 73 65 71 75 65 6e 74 20 72 6f 77 73 2c 20 74 6f  sequent rows, to
8340: 70 2d 74 6f 2d 62 6f 74 74 6f 6d 2c 20 6c 65 66  p-to-bottom, lef
8350: 74 2d 74 6f 2d 72 69 67 68 74 20 2a 2f 0a 20 20  t-to-right */.  
8360: 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b  for(i2=0; i2<n2;
8370: 20 69 32 20 2b 3d 20 62 32 29 7b 0a 20 20 20 20   i2 += b2){.    
8380: 69 6e 74 20 72 78 3b 20 20 20 20 20 20 2f 2a 20  int rx;      /* 
8390: 53 74 61 72 74 69 6e 67 20 69 6e 64 65 78 20 66  Starting index f
83a0: 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a  or current row *
83b0: 2f 0a 20 20 20 20 69 6e 74 20 72 78 70 3b 20 20  /.    int rxp;  
83c0: 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 69     /* Starting i
83d0: 6e 64 65 78 20 66 6f 72 20 70 72 65 76 69 6f 75  ndex for previou
83e0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 62 32 20  s row */.    b2 
83f0: 3d 20 61 32 5b 69 32 5d 2e 6e 42 79 74 65 3b 0a  = a2[i2].nByte;.
8400: 20 20 20 20 72 78 20 3d 20 73 7a 52 6f 77 2a 28      rx = szRow*(
8410: 69 32 2b 62 32 29 3b 0a 20 20 20 20 72 78 70 20  i2+b2);.    rxp 
8420: 3d 20 73 7a 52 6f 77 2a 69 32 3b 0a 20 20 20 20  = szRow*i2;.    
8430: 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 72 78  updateCost(m, rx
8440: 2c 20 72 78 70 2c 20 70 4c 61 6e 67 2d 3e 69 49  , rxp, pLang->iI
8450: 6e 73 43 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72  nsCost);.    for
8460: 28 6b 3d 30 3b 20 6b 3c 61 32 5b 69 32 5d 2e 6e  (k=0; k<a2[i2].n
8470: 49 6e 73 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Ins; k++){.     
8480: 20 70 20 3d 20 61 32 5b 69 32 5d 2e 61 70 49 6e   p = a2[i2].apIn
8490: 73 5b 6b 5d 3b 0a 20 20 20 20 20 20 75 70 64 61  s[k];.      upda
84a0: 74 65 43 6f 73 74 28 6d 2c 20 73 7a 52 6f 77 2a  teCost(m, szRow*
84b0: 28 69 32 2b 70 2d 3e 6e 54 6f 29 2c 20 72 78 70  (i2+p->nTo), rxp
84c0: 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20  , p->iCost);.   
84d0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 31 3d 30 3b   }.    for(i1=0;
84e0: 20 69 31 3c 66 2e 6e 3b 20 69 31 2b 3d 62 31 29   i1<f.n; i1+=b1)
84f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 78 3b 20  {.      int cx; 
8500: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
8510: 75 72 72 65 6e 74 20 63 65 6c 6c 20 2a 2f 0a 20  urrent cell */. 
8520: 20 20 20 20 20 69 6e 74 20 63 78 70 3b 20 20 20       int cxp;   
8530: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
8540: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
8550: 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
8560: 20 20 69 6e 74 20 63 78 64 3b 20 20 20 2f 2a 20    int cxd;   /* 
8570: 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f  Index of cell to
8580: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 6f 6e   the left and on
8590: 65 20 72 6f 77 20 61 62 6f 76 65 20 2a 2f 0a 20  e row above */. 
85a0: 20 20 20 20 20 69 6e 74 20 63 78 75 3b 20 20 20       int cxu;   
85b0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
85c0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 62 6f   immediately abo
85d0: 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 31 20 3d  ve */.      b1 =
85e0: 20 66 2e 61 5b 69 31 5d 2e 6e 42 79 74 65 3b 0a   f.a[i1].nByte;.
85f0: 20 20 20 20 20 20 63 78 70 20 3d 20 72 78 20 2b        cxp = rx +
8600: 20 69 31 3b 0a 20 20 20 20 20 20 63 78 20 3d 20   i1;.      cx = 
8610: 63 78 70 20 2b 20 62 31 3b 0a 20 20 20 20 20 20  cxp + b1;.      
8620: 63 78 64 20 3d 20 72 78 70 20 2b 20 69 31 3b 0a  cxd = rxp + i1;.
8630: 20 20 20 20 20 20 63 78 75 20 3d 20 63 78 64 20        cxu = cxd 
8640: 2b 20 62 31 3b 0a 20 20 20 20 20 20 75 70 64 61  + b1;.      upda
8650: 74 65 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78  teCost(m, cx, cx
8660: 70 2c 20 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f  p, pLang->iDelCo
8670: 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  st);.      for(k
8680: 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 44  =0; k<f.a[i1].nD
8690: 65 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  el; k++){.      
86a0: 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70    p = f.a[i1].ap
86b0: 44 65 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Del[k];.        
86c0: 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78  updateCost(m, cx
86d0: 70 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 63 78 70 2c  p+p->nFrom, cxp,
86e0: 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20   p->iCost);.    
86f0: 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65    }.      update
8700: 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 75 2c  Cost(m, cx, cxu,
8710: 20 70 4c 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74   pLang->iInsCost
8720: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74  );.      if( mat
8730: 63 68 46 72 6f 6d 54 6f 28 26 66 2c 20 69 31 2c  chFromTo(&f, i1,
8740: 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29 20 29   z2+i2, n2-i2) )
8750: 7b 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  {.        update
8760: 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 64 2c  Cost(m, cx, cxd,
8770: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
8780: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
8790: 20 63 78 2c 20 63 78 64 2c 20 70 4c 61 6e 67 2d   cx, cxd, pLang-
87a0: 3e 69 53 75 62 43 6f 73 74 29 3b 0a 20 20 20 20  >iSubCost);.    
87b0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61    for(k=0; k<f.a
87c0: 5b 69 31 5d 2e 6e 53 75 62 73 74 3b 20 6b 2b 2b  [i1].nSubst; k++
87d0: 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66  ){.        p = f
87e0: 2e 61 5b 69 31 5d 2e 61 70 53 75 62 73 74 5b 6b  .a[i1].apSubst[k
87f0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ];.        if( m
8800: 61 74 63 68 54 6f 28 70 2c 20 7a 32 2b 69 32 2c  atchTo(p, z2+i2,
8810: 20 6e 32 2d 69 32 29 20 29 7b 0a 20 20 20 20 20   n2-i2) ){.     
8820: 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28       updateCost(
8830: 6d 2c 20 63 78 64 2b 70 2d 3e 6e 46 72 6f 6d 2b  m, cxd+p->nFrom+
8840: 73 7a 52 6f 77 2a 70 2d 3e 6e 54 6f 2c 20 63 78  szRow*p->nTo, cx
8850: 64 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20  d, p->iCost);.  
8860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8870: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 30      }.  }..#if 0
8880: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 66 6f 72 20    /* Enable for 
8890: 64 65 62 75 67 67 69 6e 67 20 2a 2f 0a 20 20 70  debugging */.  p
88a0: 72 69 6e 74 66 28 22 20 20 20 20 20 20 20 20 20  rintf("         
88b0: 5e 22 29 3b 0a 20 20 66 6f 72 28 69 31 3d 30 3b  ^");.  for(i1=0;
88c0: 20 69 31 3c 66 2e 6e 3b 20 69 31 2b 2b 29 20 70   i1<f.n; i1++) p
88d0: 72 69 6e 74 66 28 22 20 25 63 2d 25 32 78 22 2c  rintf(" %c-%2x",
88e0: 20 66 2e 7a 5b 69 31 5d 2c 20 66 2e 7a 5b 69 31   f.z[i1], f.z[i1
88f0: 5d 26 30 78 66 66 29 3b 0a 20 20 70 72 69 6e 74  ]&0xff);.  print
8900: 66 28 22 5c 6e 20 20 20 5e 3a 22 29 3b 0a 20 20  f("\n   ^:");.  
8910: 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 73 7a 52  for(i1=0; i1<szR
8920: 6f 77 3b 20 69 31 2b 2b 29 7b 0a 20 20 20 20 69  ow; i1++){.    i
8930: 6e 74 20 76 20 3d 20 6d 5b 69 31 5d 3b 0a 20 20  nt v = m[i1];.  
8940: 20 20 69 66 28 20 76 3e 39 39 39 39 20 29 20 70    if( v>9999 ) p
8950: 72 69 6e 74 66 28 22 20 2a 2a 2a 2a 22 29 3b 0a  rintf(" ****");.
8960: 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
8970: 20 70 72 69 6e 74 66 28 22 20 25 34 64 22 2c 20   printf(" %4d", 
8980: 76 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66  v);.  }.  printf
8990: 28 22 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 32  ("\n");.  for(i2
89a0: 3d 30 3b 20 69 32 3c 6e 32 3b 20 69 32 2b 2b 29  =0; i2<n2; i2++)
89b0: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 63  {.    printf("%c
89c0: 2d 25 30 32 78 3a 22 2c 20 7a 32 5b 69 32 5d 2c  -%02x:", z2[i2],
89d0: 20 7a 32 5b 69 32 5d 26 30 78 66 66 29 3b 0a 20   z2[i2]&0xff);. 
89e0: 20 20 20 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c     for(i1=0; i1<
89f0: 73 7a 52 6f 77 3b 20 69 31 2b 2b 29 7b 0a 20 20  szRow; i1++){.  
8a00: 20 20 20 20 69 6e 74 20 76 20 3d 20 6d 5b 28 69      int v = m[(i
8a10: 32 2b 31 29 2a 73 7a 52 6f 77 2b 69 31 5d 3b 0a  2+1)*szRow+i1];.
8a20: 20 20 20 20 20 20 69 66 28 20 76 3e 39 39 39 39        if( v>9999
8a30: 20 29 20 70 72 69 6e 74 66 28 22 20 2a 2a 2a 2a   ) printf(" ****
8a40: 22 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20  ");.      else  
8a50: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20         printf(" 
8a60: 25 34 64 22 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  %4d", v);.    }.
8a70: 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
8a80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
8a90: 2f 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 61  /* Free memory a
8aa0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 6e 64 20 72  llocations and r
8ab0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
8ac0: 20 2a 2f 0a 20 20 72 65 73 20 3d 20 28 69 6e 74   */.  res = (int
8ad0: 29 6d 5b 73 7a 52 6f 77 2a 28 6e 32 2b 31 29 2d  )m[szRow*(n2+1)-
8ae0: 31 5d 3b 0a 20 20 6e 20 3d 20 6e 32 3b 0a 20 20  1];.  n = n2;.  
8af0: 69 66 28 20 66 2e 69 73 50 72 65 66 69 78 20 29  if( f.isPrefix )
8b00: 7b 0a 20 20 20 20 66 6f 72 28 69 32 3d 31 3b 20  {.    for(i2=1; 
8b10: 69 32 3c 3d 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20  i2<=n2; i2++){. 
8b20: 20 20 20 20 20 69 6e 74 20 62 20 3d 20 6d 5b 73       int b = m[s
8b30: 7a 52 6f 77 2a 69 32 2d 31 5d 3b 0a 20 20 20 20  zRow*i2-1];.    
8b40: 20 20 69 66 28 20 62 3c 3d 72 65 73 20 29 7b 20    if( b<=res ){ 
8b50: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 62  .        res = b
8b60: 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 69 32  ;.        n = i2
8b70: 20 2d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   - 1;.      }.  
8b80: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e    }.  }.  if( pn
8b90: 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 69 6e 74  Match ){.    int
8ba0: 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20   nExtra = 0;.   
8bb0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b   for(k=0; k<n; k
8bc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
8bd0: 7a 32 5b 6b 5d 20 26 20 30 78 63 30 29 3d 3d 30  z2[k] & 0xc0)==0
8be0: 78 38 30 20 29 20 6e 45 78 74 72 61 2b 2b 3b 0a  x80 ) nExtra++;.
8bf0: 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4d 61 74      }.    *pnMat
8c00: 63 68 20 3d 20 6e 20 2d 20 6e 45 78 74 72 61 3b  ch = n - nExtra;
8c10: 0a 20 20 7d 0a 0a 65 64 69 74 44 69 73 74 33 41  .  }..editDist3A
8c20: 62 6f 72 74 3a 0a 20 20 66 6f 72 28 69 32 3d 30  bort:.  for(i2=0
8c30: 3b 20 69 32 3c 6e 32 3b 20 69 32 2b 2b 29 20 73  ; i2<n2; i2++) s
8c40: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 32 5b 69  qlite3_free(a2[i
8c50: 32 5d 2e 61 70 49 6e 73 29 3b 0a 20 20 73 71 6c  2].apIns);.  sql
8c60: 69 74 65 33 5f 66 72 65 65 28 70 54 6f 46 72 65  ite3_free(pToFre
8c70: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  e);.  return res
8c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
8c90: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 45 64  n appropriate Ed
8ca0: 69 74 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a 65  itDist3Lang obje
8cb0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ct..*/.static co
8cc0: 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e  nst EditDist3Lan
8cd0: 67 20 2a 65 64 69 74 44 69 73 74 33 46 69 6e 64  g *editDist3Find
8ce0: 4c 61 6e 67 28 0a 20 20 45 64 69 74 44 69 73 74  Lang(.  EditDist
8cf0: 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  3Config *pConfig
8d00: 2c 0a 20 20 69 6e 74 20 69 4c 61 6e 67 0a 29 7b  ,.  int iLang.){
8d10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
8d20: 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e  i=0; i<pConfig->
8d30: 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nLang; i++){.   
8d40: 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 5b   if( pConfig->a[
8d50: 69 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61 6e 67 20  i].iLang==iLang 
8d60: 29 20 72 65 74 75 72 6e 20 26 70 43 6f 6e 66 69  ) return &pConfi
8d70: 67 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  g->a[i];.  }.  r
8d80: 65 74 75 72 6e 20 26 65 64 69 74 44 69 73 74 33  eturn &editDist3
8d90: 4c 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  Lang;.}../*.** F
8da0: 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65 64 69 74  unction:    edit
8db0: 64 69 73 74 33 28 41 2c 42 2c 69 4c 61 6e 67 29  dist3(A,B,iLang)
8dc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
8dd0: 20 65 64 69 74 64 69 73 74 33 28 74 61 62 6c 65   editdist3(table
8de0: 6e 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  name).**.** Retu
8df0: 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  rn the cost of t
8e00: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74 72 69  ransforming stri
8e10: 6e 67 20 41 20 69 6e 74 6f 20 73 74 72 69 6e 67  ng A into string
8e20: 20 42 20 75 73 69 6e 67 20 65 64 69 74 0a 2a 2a   B using edit.**
8e30: 20 77 65 69 67 68 74 73 20 66 6f 72 20 69 4c 61   weights for iLa
8e40: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ng..**.** The se
8e50: 63 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61 64 73 20  cond form loads 
8e60: 65 64 69 74 20 77 65 69 67 68 74 73 20 69 6e 74  edit weights int
8e70: 6f 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 61 20  o memory from a 
8e80: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
8e90: 20 76 6f 69 64 20 65 64 69 74 44 69 73 74 33 53   void editDist3S
8ea0: 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  qlFunc(.  sqlite
8eb0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
8ec0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
8ed0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8ee0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 45 64 69 74  **argv.){.  Edit
8ef0: 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f  Dist3Config *pCo
8f00: 6e 66 69 67 20 3d 20 28 45 64 69 74 44 69 73 74  nfig = (EditDist
8f10: 33 43 6f 6e 66 69 67 2a 29 73 71 6c 69 74 65 33  3Config*)sqlite3
8f20: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
8f30: 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  xt);.  sqlite3 *
8f40: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
8f50: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
8f60: 6f 6e 74 65 78 74 29 3b 0a 20 20 69 6e 74 20 72  ontext);.  int r
8f70: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31  c;.  if( argc==1
8f80: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
8f90: 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20 28 63 6f  ar *zTable = (co
8fa0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
8fb0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8fc0: 76 5b 30 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  v[0]);.    rc = 
8fd0: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c  editDist3ConfigL
8fe0: 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 64 62 2c  oad(pConfig, db,
8ff0: 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
9000: 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 5f 72  ( rc ) sqlite3_r
9010: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
9020: 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20  (context, rc);. 
9030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
9040: 74 20 63 68 61 72 20 2a 7a 41 20 3d 20 28 63 6f  t char *zA = (co
9050: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9060: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9070: 76 5b 30 5d 29 3b 0a 20 20 20 20 63 6f 6e 73 74  v[0]);.    const
9080: 20 63 68 61 72 20 2a 7a 42 20 3d 20 28 63 6f 6e   char *zB = (con
9090: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
90a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
90b0: 5b 31 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 41  [1]);.    int nA
90c0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
90d0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
90e0: 0a 20 20 20 20 69 6e 74 20 6e 42 20 3d 20 73 71  .    int nB = sq
90f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
9100: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  s(argv[1]);.    
9110: 69 6e 74 20 69 4c 61 6e 67 20 3d 20 61 72 67 63  int iLang = argc
9120: 3d 3d 33 20 3f 20 73 71 6c 69 74 65 33 5f 76 61  ==3 ? sqlite3_va
9130: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29  lue_int(argv[2])
9140: 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   : 0;.    const 
9150: 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70  EditDist3Lang *p
9160: 4c 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74 33  Lang = editDist3
9170: 46 69 6e 64 4c 61 6e 67 28 70 43 6f 6e 66 69 67  FindLang(pConfig
9180: 2c 20 69 4c 61 6e 67 29 3b 0a 20 20 20 20 45 64  , iLang);.    Ed
9190: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
91a0: 67 20 2a 70 46 72 6f 6d 3b 0a 20 20 20 20 69 6e  g *pFrom;.    in
91b0: 74 20 64 69 73 74 3b 0a 0a 20 20 20 20 70 46 72  t dist;..    pFr
91c0: 6f 6d 20 3d 20 65 64 69 74 44 69 73 74 33 46 72  om = editDist3Fr
91d0: 6f 6d 53 74 72 69 6e 67 4e 65 77 28 70 4c 61 6e  omStringNew(pLan
91e0: 67 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20 20 20 20  g, zA, nA);.    
91f0: 69 66 28 20 70 46 72 6f 6d 3d 3d 30 20 29 7b 0a  if( pFrom==0 ){.
9200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
9210: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
9220: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
9230: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
9240: 20 20 20 64 69 73 74 20 3d 20 65 64 69 74 44 69     dist = editDi
9250: 73 74 33 43 6f 72 65 28 70 46 72 6f 6d 2c 20 7a  st3Core(pFrom, z
9260: 42 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c 20 30 29  B, nB, pLang, 0)
9270: 3b 0a 20 20 20 20 65 64 69 74 44 69 73 74 33 46  ;.    editDist3F
9280: 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65 74 65 28  romStringDelete(
9290: 70 46 72 6f 6d 29 3b 0a 20 20 20 20 69 66 28 20  pFrom);.    if( 
92a0: 64 69 73 74 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  dist==(-1) ){.  
92b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
92c0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
92d0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
92e0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
92f0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
9300: 74 65 78 74 2c 20 64 69 73 74 29 3b 0a 20 20 20  text, dist);.   
9310: 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a   }.  } .}../*.**
9320: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 65 64   Register the ed
9330: 69 74 44 69 73 74 33 20 66 75 6e 63 74 69 6f 6e  itDist3 function
9340: 20 77 69 74 68 20 53 51 4c 69 74 65 0a 2a 2f 0a   with SQLite.*/.
9350: 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74 44  static int editD
9360: 69 73 74 33 49 6e 73 74 61 6c 6c 28 73 71 6c 69  ist3Install(sqli
9370: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
9380: 72 63 3b 0a 20 20 45 64 69 74 44 69 73 74 33 43  rc;.  EditDist3C
9390: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
93a0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
93b0: 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66  4( sizeof(*pConf
93c0: 69 67 29 20 29 3b 0a 20 20 69 66 28 20 70 43 6f  ig) );.  if( pCo
93d0: 6e 66 69 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nfig==0 ) return
93e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
93f0: 20 6d 65 6d 73 65 74 28 70 43 6f 6e 66 69 67 2c   memset(pConfig,
9400: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e   0, sizeof(*pCon
9410: 66 69 67 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  fig));.  rc = sq
9420: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
9430: 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64  ction_v2(db, "ed
9440: 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20  itdist3",.      
9450: 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54          2, SQLIT
9460: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44 45  E_UTF8|SQLITE_DE
9470: 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 70 43 6f  TERMINISTIC, pCo
9480: 6e 66 69 67 2c 0a 20 20 20 20 20 20 20 20 20 20  nfig,.          
9490: 20 20 20 20 65 64 69 74 44 69 73 74 33 53 71 6c      editDist3Sql
94a0: 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Func, 0, 0, 0);.
94b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
94c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
94d0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
94e0: 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22  unction_v2(db, "
94f0: 65 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20  editdist3",.    
9500: 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 53              3, S
9510: 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54  QLITE_UTF8|SQLIT
9520: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
9530: 20 70 43 6f 6e 66 69 67 2c 0a 20 20 20 20 20 20   pConfig,.      
9540: 20 20 20 20 20 20 20 20 20 20 65 64 69 74 44 69            editDi
9550: 73 74 33 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  st3SqlFunc, 0, 0
9560: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
9570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9580: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9590: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
95a0: 6e 5f 76 32 28 64 62 2c 20 22 65 64 69 74 64 69  n_v2(db, "editdi
95b0: 73 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20 20  st3",.          
95c0: 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f        1, SQLITE_
95d0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45  UTF8|SQLITE_DETE
95e0: 52 4d 49 4e 49 53 54 49 43 2c 20 70 43 6f 6e 66  RMINISTIC, pConf
95f0: 69 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ig,.            
9600: 20 20 20 20 65 64 69 74 44 69 73 74 33 53 71 6c      editDist3Sql
9610: 46 75 6e 63 2c 20 30 2c 20 30 2c 20 65 64 69 74  Func, 0, 0, edit
9620: 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74  Dist3ConfigDelet
9630: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
9640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
9650: 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 20 20 72 65  onfig);.  }.  re
9660: 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e  turn rc;.}./* En
9670: 64 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 20 63  d configurable c
9680: 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64 69 74  ost unicode edit
9690: 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74 69 6e   distance routin
96a0: 65 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  es.*************
96b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96f0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
9700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9740: 0a 2a 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 6c  .** Begin transl
9750: 69 74 65 72 61 74 65 20 75 6e 69 63 6f 64 65 2d  iterate unicode-
9760: 74 6f 2d 61 73 63 69 69 20 69 6d 70 6c 65 6d 65  to-ascii impleme
9770: 6e 74 61 74 69 6f 6e 0a 2a 2f 0a 0a 23 69 66 20  ntation.*/..#if 
9780: 21 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41  !SQLITE_AMALGAMA
9790: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TION./*.** This 
97a0: 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69 73 20  lookup table is 
97b0: 75 73 65 64 20 74 6f 20 68 65 6c 70 20 64 65 63  used to help dec
97c0: 6f 64 65 20 74 68 65 20 66 69 72 73 74 20 62 79  ode the first by
97d0: 74 65 20 6f 66 0a 2a 2a 20 61 20 6d 75 6c 74 69  te of.** a multi
97e0: 2d 62 79 74 65 20 55 54 46 38 20 63 68 61 72 61  -byte UTF8 chara
97f0: 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
9800: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
9810: 68 61 72 20 73 71 6c 69 74 65 33 55 74 66 38 54  har sqlite3Utf8T
9820: 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20 30 78  rans1[] = {.  0x
9830: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20  00, 0x01, 0x02, 
9840: 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35  0x03, 0x04, 0x05
9850: 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20  , 0x06, 0x07,.  
9860: 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61  0x08, 0x09, 0x0a
9870: 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78  , 0x0b, 0x0c, 0x
9880: 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a  0d, 0x0e, 0x0f,.
9890: 20 20 30 78 31 30 2c 20 30 78 31 31 2c 20 30 78    0x10, 0x11, 0x
98a0: 31 32 2c 20 30 78 31 33 2c 20 30 78 31 34 2c 20  12, 0x13, 0x14, 
98b0: 30 78 31 35 2c 20 30 78 31 36 2c 20 30 78 31 37  0x15, 0x16, 0x17
98c0: 2c 0a 20 20 30 78 31 38 2c 20 30 78 31 39 2c 20  ,.  0x18, 0x19, 
98d0: 30 78 31 61 2c 20 30 78 31 62 2c 20 30 78 31 63  0x1a, 0x1b, 0x1c
98e0: 2c 20 30 78 31 64 2c 20 30 78 31 65 2c 20 30 78  , 0x1d, 0x1e, 0x
98f0: 31 66 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31  1f,.  0x00, 0x01
9900: 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78  , 0x02, 0x03, 0x
9910: 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20  04, 0x05, 0x06, 
9920: 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78  0x07,.  0x08, 0x
9930: 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20  09, 0x0a, 0x0b, 
9940: 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65  0x0c, 0x0d, 0x0e
9950: 2c 20 30 78 30 66 2c 0a 20 20 30 78 30 30 2c 20  , 0x0f,.  0x00, 
9960: 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33  0x01, 0x02, 0x03
9970: 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78  , 0x04, 0x05, 0x
9980: 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 30  06, 0x07,.  0x00
9990: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
99a0: 30 33 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20  03, 0x00, 0x01, 
99b0: 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d 3b 0a 23  0x00, 0x00,.};.#
99c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
99d0: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
99e0: 20 74 68 65 20 66 69 72 73 74 20 55 54 46 2d 38   the first UTF-8
99f0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
9a00: 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
9a10: 74 69 63 20 69 6e 74 20 75 74 66 38 52 65 61 64  tic int utf8Read
9a20: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
9a30: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
9a40: 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  int *pSize){.  i
9a50: 6e 74 20 63 2c 20 69 3b 0a 0a 20 20 2f 2a 20 41  nt c, i;..  /* A
9a60: 6c 6c 20 63 61 6c 6c 65 72 73 20 74 6f 20 74 68  ll callers to th
9a70: 69 73 20 72 6f 75 74 69 6e 65 20 28 69 6e 20 74  is routine (in t
9a80: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
9a90: 6d 65 6e 74 61 74 69 6f 6e 29 0a 20 20 2a 2a 20  mentation).  ** 
9aa0: 61 6c 77 61 79 73 20 68 61 76 65 20 6e 3e 30 2e  always have n>0.
9ab0: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
9ac0: 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 63 20 3d  n==0) ){.    c =
9ad0: 20 69 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b   i = 0;.  }else{
9ae0: 0a 20 20 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20  .    c = z[0];. 
9af0: 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 69 66     i = 1;.    if
9b00: 28 20 63 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ( c>=0xc0 ){.   
9b10: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74     c = sqlite3Ut
9b20: 66 38 54 72 61 6e 73 31 5b 63 2d 30 78 63 30 5d  f8Trans1[c-0xc0]
9b30: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  ;.      while( i
9b40: 3c 6e 20 26 26 20 28 7a 5b 69 5d 20 26 20 30 78  <n && (z[i] & 0x
9b50: 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20  c0)==0x80 ){.   
9b60: 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36 29 20       c = (c<<6) 
9b70: 2b 20 28 30 78 33 66 20 26 20 7a 5b 69 2b 2b 5d  + (0x3f & z[i++]
9b80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9b90: 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
9ba0: 69 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  i;.  return c;.}
9bb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9bc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
9bd0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 75  racters in the u
9be0: 74 66 2d 38 20 73 74 72 69 6e 67 20 69 6e 20 74  tf-8 string in t
9bf0: 68 65 20 6e 49 6e 20 62 79 74 65 0a 2a 2a 20 62  he nIn byte.** b
9c00: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
9c10: 20 62 79 20 7a 49 6e 2e 0a 2a 2f 0a 73 74 61 74   by zIn..*/.stat
9c20: 69 63 20 69 6e 74 20 75 74 66 38 43 68 61 72 6c  ic int utf8Charl
9c30: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
9c40: 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20  In, int nIn){.  
9c50: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 68  int i;.  int nCh
9c60: 61 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ar = 0;.  for(i=
9c70: 30 3b 20 69 3c 6e 49 6e 3b 20 6e 43 68 61 72 2b  0; i<nIn; nChar+
9c80: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a  +){.    int sz;.
9c90: 20 20 20 20 75 74 66 38 52 65 61 64 28 28 63 6f      utf8Read((co
9ca0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
9cb0: 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49 6e  r *)&zIn[i], nIn
9cc0: 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 20  -i, &sz);.    i 
9cd0: 2b 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 72 65 74  += sz;.  }.  ret
9ce0: 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 74 79  urn nChar;.}..ty
9cf0: 70 65 64 65 66 20 73 74 72 75 63 74 20 54 72 61  pedef struct Tra
9d00: 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 54 72 61  nsliteration Tra
9d10: 6e 73 6c 69 74 65 72 61 74 69 6f 6e 3b 0a 73 74  nsliteration;.st
9d20: 72 75 63 74 20 54 72 61 6e 73 6c 69 74 65 72 61  ruct Translitera
9d30: 74 69 6f 6e 20 7b 0a 20 75 6e 73 69 67 6e 65 64  tion {. unsigned
9d40: 20 73 68 6f 72 74 20 69 6e 74 20 63 46 72 6f 6d   short int cFrom
9d50: 3b 0a 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;. unsigned char
9d60: 20 63 54 6f 30 2c 20 63 54 6f 31 2c 20 63 54 6f   cTo0, cTo1, cTo
9d70: 32 2c 20 63 54 6f 33 3b 0a 23 69 66 64 65 66 20  2, cTo3;.#ifdef 
9d80: 53 51 4c 49 54 45 5f 53 50 45 4c 4c 46 49 58 5f  SQLITE_SPELLFIX_
9d90: 35 42 59 54 45 5f 4d 41 50 50 49 4e 47 53 0a 20  5BYTE_MAPPINGS. 
9da0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 54  unsigned char cT
9db0: 6f 34 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f  o4;.#endif.};../
9dc0: 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f 66 20 74 72  *.** Table of tr
9dd0: 61 6e 73 6c 61 74 69 6f 6e 73 20 66 72 6f 6d 20  anslations from 
9de0: 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
9df0: 72 73 20 69 6e 74 6f 20 41 53 43 49 49 2e 0a 2a  rs into ASCII..*
9e00: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54  /.static const T
9e10: 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 74  ransliteration t
9e20: 72 61 6e 73 6c 69 74 5b 5d 20 3d 20 7b 0a 20 20  ranslit[] = {.  
9e30: 7b 20 30 78 30 30 41 30 2c 20 20 30 78 32 30 2c  { 0x00A0,  0x20,
9e40: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
9e50: 30 20 7d 2c 20 20 2f 2a 20 c2 a0 20 74 6f 20 20  0 },  /* .. to  
9e60: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 42 35 2c 20   */.  { 0x00B5, 
9e70: 20 30 78 37 35 2c 20 30 78 30 30 2c 20 30 78 30   0x75, 0x00, 0x0
9e80: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c2  0, 0x00 },  /* .
9e90: b5 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78  . to u */.  { 0x
9ea0: 30 30 43 30 2c 20 20 30 78 34 31 2c 20 30 78 30  00C0,  0x41, 0x0
9eb0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
9ec0: 20 20 2f 2a 20 c3 80 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
9ed0: 20 20 7b 20 30 78 30 30 43 31 2c 20 20 30 78 34    { 0x00C1,  0x4
9ee0: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  1, 0x00, 0x00, 0
9ef0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 81 20 74 6f  x00 },  /* .. to
9f00: 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 32   A */.  { 0x00C2
9f10: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 2c 20 30  ,  0x41, 0x00, 0
9f20: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
9f30: 20 c3 82 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
9f40: 30 78 30 30 43 33 2c 20 20 30 78 34 31 2c 20 30  0x00C3,  0x41, 0
9f50: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
9f60: 7d 2c 20 20 2f 2a 20 c3 83 20 74 6f 20 41 20 2a  },  /* .. to A *
9f70: 2f 0a 20 20 7b 20 30 78 30 30 43 34 2c 20 20 30  /.  { 0x00C4,  0
9f80: 78 34 31 2c 20 30 78 36 35 2c 20 30 78 30 30 2c  x41, 0x65, 0x00,
9f90: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 84 20   0x00 },  /* .. 
9fa0: 74 6f 20 41 65 20 2a 2f 0a 20 20 7b 20 30 78 30  to Ae */.  { 0x0
9fb0: 30 43 35 2c 20 20 30 78 34 31 2c 20 30 78 36 31  0C5,  0x41, 0x61
9fc0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
9fd0: 20 2f 2a 20 c3 85 20 74 6f 20 41 61 20 2a 2f 0a   /* .. to Aa */.
9fe0: 20 20 7b 20 30 78 30 30 43 36 2c 20 20 30 78 34    { 0x00C6,  0x4
9ff0: 31 2c 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30  1, 0x45, 0x00, 0
a000: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 86 20 74 6f  x00 },  /* .. to
a010: 20 41 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43   AE */.  { 0x00C
a020: 37 2c 20 20 30 78 34 33 2c 20 30 78 30 30 2c 20  7,  0x43, 0x00, 
a030: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
a040: 2a 20 c3 87 20 74 6f 20 43 20 2a 2f 0a 20 20 7b  * .. to C */.  {
a050: 20 30 78 30 30 43 38 2c 20 20 30 78 34 35 2c 20   0x00C8,  0x45, 
a060: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
a070: 20 7d 2c 20 20 2f 2a 20 c3 88 20 74 6f 20 45 20   },  /* .. to E 
a080: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 39 2c 20 20  */.  { 0x00C9,  
a090: 30 78 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30  0x45, 0x00, 0x00
a0a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 89  , 0x00 },  /* ..
a0b0: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
a0c0: 30 43 41 2c 20 20 30 78 34 35 2c 20 30 78 30 30  0CA,  0x45, 0x00
a0d0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a0e0: 20 2f 2a 20 c3 8a 20 74 6f 20 45 20 2a 2f 0a 20   /* .. to E */. 
a0f0: 20 7b 20 30 78 30 30 43 42 2c 20 20 30 78 34 35   { 0x00CB,  0x45
a100: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a110: 30 30 20 7d 2c 20 20 2f 2a 20 c3 8b 20 74 6f 20  00 },  /* .. to 
a120: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 43 2c  E */.  { 0x00CC,
a130: 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78    0x49, 0x00, 0x
a140: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a150: c3 8c 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
a160: 78 30 30 43 44 2c 20 20 30 78 34 39 2c 20 30 78  x00CD,  0x49, 0x
a170: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
a180: 2c 20 20 2f 2a 20 c3 8d 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
a190: 0a 20 20 7b 20 30 78 30 30 43 45 2c 20 20 30 78  .  { 0x00CE,  0x
a1a0: 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  49, 0x00, 0x00, 
a1b0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8e 20 74  0x00 },  /* .. t
a1c0: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43  o I */.  { 0x00C
a1d0: 46 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20  F,  0x49, 0x00, 
a1e0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
a1f0: 2a 20 c3 8f 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
a200: 20 30 78 30 30 44 30 2c 20 20 30 78 34 34 2c 20   0x00D0,  0x44, 
a210: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
a220: 20 7d 2c 20 20 2f 2a 20 c3 90 20 74 6f 20 44 20   },  /* .. to D 
a230: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 31 2c 20 20  */.  { 0x00D1,  
a240: 30 78 34 45 2c 20 30 78 30 30 2c 20 30 78 30 30  0x4E, 0x00, 0x00
a250: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 91  , 0x00 },  /* ..
a260: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
a270: 30 44 32 2c 20 20 30 78 34 46 2c 20 30 78 30 30  0D2,  0x4F, 0x00
a280: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a290: 20 2f 2a 20 c3 92 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
a2a0: 20 7b 20 30 78 30 30 44 33 2c 20 20 30 78 34 46   { 0x00D3,  0x4F
a2b0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a2c0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 93 20 74 6f 20  00 },  /* .. to 
a2d0: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 34 2c  O */.  { 0x00D4,
a2e0: 20 20 30 78 34 46 2c 20 30 78 30 30 2c 20 30 78    0x4F, 0x00, 0x
a2f0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a300: c3 94 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30  .. to O */.  { 0
a310: 78 30 30 44 35 2c 20 20 30 78 34 46 2c 20 30 78  x00D5,  0x4F, 0x
a320: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
a330: 2c 20 20 2f 2a 20 c3 95 20 74 6f 20 4f 20 2a 2f  ,  /* .. to O */
a340: 0a 20 20 7b 20 30 78 30 30 44 36 2c 20 20 30 78  .  { 0x00D6,  0x
a350: 34 46 2c 20 30 78 36 35 2c 20 30 78 30 30 2c 20  4F, 0x65, 0x00, 
a360: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 96 20 74  0x00 },  /* .. t
a370: 6f 20 4f 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o Oe */.  { 0x00
a380: 44 37 2c 20 20 30 78 37 38 2c 20 30 78 30 30 2c  D7,  0x78, 0x00,
a390: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
a3a0: 2f 2a 20 c3 97 20 74 6f 20 78 20 2a 2f 0a 20 20  /* .. to x */.  
a3b0: 7b 20 30 78 30 30 44 38 2c 20 20 30 78 34 46 2c  { 0x00D8,  0x4F,
a3c0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
a3d0: 30 20 7d 2c 20 20 2f 2a 20 c3 98 20 74 6f 20 4f  0 },  /* .. to O
a3e0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 39 2c 20   */.  { 0x00D9, 
a3f0: 20 30 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30   0x55, 0x00, 0x0
a400: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
a410: 99 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
a420: 30 30 44 41 2c 20 20 30 78 35 35 2c 20 30 78 30  00DA,  0x55, 0x0
a430: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
a440: 20 20 2f 2a 20 c3 9a 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
a450: 20 20 7b 20 30 78 30 30 44 42 2c 20 20 30 78 35    { 0x00DB,  0x5
a460: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
a470: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9b 20 74 6f  x00 },  /* .. to
a480: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 43   U */.  { 0x00DC
a490: 2c 20 20 30 78 35 35 2c 20 30 78 36 35 2c 20 30  ,  0x55, 0x65, 0
a4a0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
a4b0: 20 c3 9c 20 74 6f 20 55 65 20 2a 2f 0a 20 20 7b   .. to Ue */.  {
a4c0: 20 30 78 30 30 44 44 2c 20 20 30 78 35 39 2c 20   0x00DD,  0x59, 
a4d0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
a4e0: 20 7d 2c 20 20 2f 2a 20 c3 9d 20 74 6f 20 59 20   },  /* .. to Y 
a4f0: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 45 2c 20 20  */.  { 0x00DE,  
a500: 30 78 35 34 2c 20 30 78 36 38 2c 20 30 78 30 30  0x54, 0x68, 0x00
a510: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9e  , 0x00 },  /* ..
a520: 20 74 6f 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78   to Th */.  { 0x
a530: 30 30 44 46 2c 20 20 30 78 37 33 2c 20 30 78 37  00DF,  0x73, 0x7
a540: 33 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  3, 0x00, 0x00 },
a550: 20 20 2f 2a 20 c3 9f 20 74 6f 20 73 73 20 2a 2f    /* .. to ss */
a560: 0a 20 20 7b 20 30 78 30 30 45 30 2c 20 20 30 78  .  { 0x00E0,  0x
a570: 36 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  61, 0x00, 0x00, 
a580: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a0 20 74  0x00 },  /* .. t
a590: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45  o a */.  { 0x00E
a5a0: 31 2c 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20  1,  0x61, 0x00, 
a5b0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
a5c0: 2a 20 c3 a1 20 74 6f 20 61 20 2a 2f 0a 20 20 7b  * .. to a */.  {
a5d0: 20 30 78 30 30 45 32 2c 20 20 30 78 36 31 2c 20   0x00E2,  0x61, 
a5e0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
a5f0: 20 7d 2c 20 20 2f 2a 20 c3 a2 20 74 6f 20 61 20   },  /* .. to a 
a600: 2a 2f 0a 20 20 7b 20 30 78 30 30 45 33 2c 20 20  */.  { 0x00E3,  
a610: 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78 30 30  0x61, 0x00, 0x00
a620: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a3  , 0x00 },  /* ..
a630: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
a640: 30 45 34 2c 20 20 30 78 36 31 2c 20 30 78 36 35  0E4,  0x61, 0x65
a650: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a660: 20 2f 2a 20 c3 a4 20 74 6f 20 61 65 20 2a 2f 0a   /* .. to ae */.
a670: 20 20 7b 20 30 78 30 30 45 35 2c 20 20 30 78 36    { 0x00E5,  0x6
a680: 31 2c 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30  1, 0x61, 0x00, 0
a690: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a5 20 74 6f  x00 },  /* .. to
a6a0: 20 61 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45   aa */.  { 0x00E
a6b0: 36 2c 20 20 30 78 36 31 2c 20 30 78 36 35 2c 20  6,  0x61, 0x65, 
a6c0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
a6d0: 2a 20 c3 a6 20 74 6f 20 61 65 20 2a 2f 0a 20 20  * .. to ae */.  
a6e0: 7b 20 30 78 30 30 45 37 2c 20 20 30 78 36 33 2c  { 0x00E7,  0x63,
a6f0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
a700: 30 20 7d 2c 20 20 2f 2a 20 c3 a7 20 74 6f 20 63  0 },  /* .. to c
a710: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 38 2c 20   */.  { 0x00E8, 
a720: 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30   0x65, 0x00, 0x0
a730: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
a740: a8 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
a750: 30 30 45 39 2c 20 20 30 78 36 35 2c 20 30 78 30  00E9,  0x65, 0x0
a760: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
a770: 20 20 2f 2a 20 c3 a9 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
a780: 20 20 7b 20 30 78 30 30 45 41 2c 20 20 30 78 36    { 0x00EA,  0x6
a790: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
a7a0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 aa 20 74 6f  x00 },  /* .. to
a7b0: 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 42   e */.  { 0x00EB
a7c0: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30  ,  0x65, 0x00, 0
a7d0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
a7e0: 20 c3 ab 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
a7f0: 30 78 30 30 45 43 2c 20 20 30 78 36 39 2c 20 30  0x00EC,  0x69, 0
a800: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
a810: 7d 2c 20 20 2f 2a 20 c3 ac 20 74 6f 20 69 20 2a  },  /* .. to i *
a820: 2f 0a 20 20 7b 20 30 78 30 30 45 44 2c 20 20 30  /.  { 0x00ED,  0
a830: 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x69, 0x00, 0x00,
a840: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ad 20   0x00 },  /* .. 
a850: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to i */.  { 0x00
a860: 45 45 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c  EE,  0x69, 0x00,
a870: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
a880: 2f 2a 20 c3 ae 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
a890: 7b 20 30 78 30 30 45 46 2c 20 20 30 78 36 39 2c  { 0x00EF,  0x69,
a8a0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
a8b0: 30 20 7d 2c 20 20 2f 2a 20 c3 af 20 74 6f 20 69  0 },  /* .. to i
a8c0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 30 2c 20   */.  { 0x00F0, 
a8d0: 20 30 78 36 34 2c 20 30 78 30 30 2c 20 30 78 30   0x64, 0x00, 0x0
a8e0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
a8f0: b0 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78  . to d */.  { 0x
a900: 30 30 46 31 2c 20 20 30 78 36 45 2c 20 30 78 30  00F1,  0x6E, 0x0
a910: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
a920: 20 20 2f 2a 20 c3 b1 20 74 6f 20 6e 20 2a 2f 0a    /* .. to n */.
a930: 20 20 7b 20 30 78 30 30 46 32 2c 20 20 30 78 36    { 0x00F2,  0x6
a940: 46 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  F, 0x00, 0x00, 0
a950: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b2 20 74 6f  x00 },  /* .. to
a960: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 33   o */.  { 0x00F3
a970: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 2c 20 30  ,  0x6F, 0x00, 0
a980: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
a990: 20 c3 b3 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
a9a0: 30 78 30 30 46 34 2c 20 20 30 78 36 46 2c 20 30  0x00F4,  0x6F, 0
a9b0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
a9c0: 7d 2c 20 20 2f 2a 20 c3 b4 20 74 6f 20 6f 20 2a  },  /* .. to o *
a9d0: 2f 0a 20 20 7b 20 30 78 30 30 46 35 2c 20 20 30  /.  { 0x00F5,  0
a9e0: 78 36 46 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x6F, 0x00, 0x00,
a9f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b5 20   0x00 },  /* .. 
aa00: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to o */.  { 0x00
aa10: 46 36 2c 20 20 30 78 36 46 2c 20 30 78 36 35 2c  F6,  0x6F, 0x65,
aa20: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
aa30: 2f 2a 20 c3 b6 20 74 6f 20 6f 65 20 2a 2f 0a 20  /* .. to oe */. 
aa40: 20 7b 20 30 78 30 30 46 37 2c 20 20 30 78 33 41   { 0x00F7,  0x3A
aa50: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
aa60: 30 30 20 7d 2c 20 20 2f 2a 20 c3 b7 20 74 6f 20  00 },  /* .. to 
aa70: 3a 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 38 2c  : */.  { 0x00F8,
aa80: 20 20 30 78 36 46 2c 20 30 78 30 30 2c 20 30 78    0x6F, 0x00, 0x
aa90: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
aaa0: c3 b8 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30  .. to o */.  { 0
aab0: 78 30 30 46 39 2c 20 20 30 78 37 35 2c 20 30 78  x00F9,  0x75, 0x
aac0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
aad0: 2c 20 20 2f 2a 20 c3 b9 20 74 6f 20 75 20 2a 2f  ,  /* .. to u */
aae0: 0a 20 20 7b 20 30 78 30 30 46 41 2c 20 20 30 78  .  { 0x00FA,  0x
aaf0: 37 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  75, 0x00, 0x00, 
ab00: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ba 20 74  0x00 },  /* .. t
ab10: 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46  o u */.  { 0x00F
ab20: 42 2c 20 20 30 78 37 35 2c 20 30 78 30 30 2c 20  B,  0x75, 0x00, 
ab30: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
ab40: 2a 20 c3 bb 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
ab50: 20 30 78 30 30 46 43 2c 20 20 30 78 37 35 2c 20   0x00FC,  0x75, 
ab60: 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30  0x65, 0x00, 0x00
ab70: 20 7d 2c 20 20 2f 2a 20 c3 bc 20 74 6f 20 75 65   },  /* .. to ue
ab80: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 44 2c 20   */.  { 0x00FD, 
ab90: 20 30 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30   0x79, 0x00, 0x0
aba0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
abb0: bd 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78  . to y */.  { 0x
abc0: 30 30 46 45 2c 20 20 30 78 37 34 2c 20 30 78 36  00FE,  0x74, 0x6
abd0: 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  8, 0x00, 0x00 },
abe0: 20 20 2f 2a 20 c3 be 20 74 6f 20 74 68 20 2a 2f    /* .. to th */
abf0: 0a 20 20 7b 20 30 78 30 30 46 46 2c 20 20 30 78  .  { 0x00FF,  0x
ac00: 37 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  79, 0x00, 0x00, 
ac10: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bf 20 74  0x00 },  /* .. t
ac20: 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o y */.  { 0x010
ac30: 30 2c 20 20 30 78 34 31 2c 20 30 78 30 30 2c 20  0,  0x41, 0x00, 
ac40: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
ac50: 2a 20 c4 80 20 74 6f 20 41 20 2a 2f 0a 20 20 7b  * .. to A */.  {
ac60: 20 30 78 30 31 30 31 2c 20 20 30 78 36 31 2c 20   0x0101,  0x61, 
ac70: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
ac80: 20 7d 2c 20 20 2f 2a 20 c4 81 20 74 6f 20 61 20   },  /* .. to a 
ac90: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 32 2c 20 20  */.  { 0x0102,  
aca0: 30 78 34 31 2c 20 30 78 30 30 2c 20 30 78 30 30  0x41, 0x00, 0x00
acb0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 82  , 0x00 },  /* ..
acc0: 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30   to A */.  { 0x0
acd0: 31 30 33 2c 20 20 30 78 36 31 2c 20 30 78 30 30  103,  0x61, 0x00
ace0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
acf0: 20 2f 2a 20 c4 83 20 74 6f 20 61 20 2a 2f 0a 20   /* .. to a */. 
ad00: 20 7b 20 30 78 30 31 30 34 2c 20 20 30 78 34 31   { 0x0104,  0x41
ad10: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
ad20: 30 30 20 7d 2c 20 20 2f 2a 20 c4 84 20 74 6f 20  00 },  /* .. to 
ad30: 41 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 35 2c  A */.  { 0x0105,
ad40: 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78    0x61, 0x00, 0x
ad50: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
ad60: c4 85 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30  .. to a */.  { 0
ad70: 78 30 31 30 36 2c 20 20 30 78 34 33 2c 20 30 78  x0106,  0x43, 0x
ad80: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
ad90: 2c 20 20 2f 2a 20 c4 86 20 74 6f 20 43 20 2a 2f  ,  /* .. to C */
ada0: 0a 20 20 7b 20 30 78 30 31 30 37 2c 20 20 30 78  .  { 0x0107,  0x
adb0: 36 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  63, 0x00, 0x00, 
adc0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 87 20 74  0x00 },  /* .. t
add0: 6f 20 63 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o c */.  { 0x010
ade0: 38 2c 20 20 30 78 34 33 2c 20 30 78 36 38 2c 20  8,  0x43, 0x68, 
adf0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
ae00: 2a 20 c4 88 20 74 6f 20 43 68 20 2a 2f 0a 20 20  * .. to Ch */.  
ae10: 7b 20 30 78 30 31 30 39 2c 20 20 30 78 36 33 2c  { 0x0109,  0x63,
ae20: 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30   0x68, 0x00, 0x0
ae30: 30 20 7d 2c 20 20 2f 2a 20 c4 89 20 74 6f 20 63  0 },  /* .. to c
ae40: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 41 2c  h */.  { 0x010A,
ae50: 20 20 30 78 34 33 2c 20 30 78 30 30 2c 20 30 78    0x43, 0x00, 0x
ae60: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
ae70: c4 8a 20 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30  .. to C */.  { 0
ae80: 78 30 31 30 42 2c 20 20 30 78 36 33 2c 20 30 78  x010B,  0x63, 0x
ae90: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
aea0: 2c 20 20 2f 2a 20 c4 8b 20 74 6f 20 63 20 2a 2f  ,  /* .. to c */
aeb0: 0a 20 20 7b 20 30 78 30 31 30 43 2c 20 20 30 78  .  { 0x010C,  0x
aec0: 34 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  43, 0x00, 0x00, 
aed0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8c 20 74  0x00 },  /* .. t
aee0: 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o C */.  { 0x010
aef0: 44 2c 20 20 30 78 36 33 2c 20 30 78 30 30 2c 20  D,  0x63, 0x00, 
af00: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
af10: 2a 20 c4 8d 20 74 6f 20 63 20 2a 2f 0a 20 20 7b  * .. to c */.  {
af20: 20 30 78 30 31 30 45 2c 20 20 30 78 34 34 2c 20   0x010E,  0x44, 
af30: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
af40: 20 7d 2c 20 20 2f 2a 20 c4 8e 20 74 6f 20 44 20   },  /* .. to D 
af50: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 46 2c 20 20  */.  { 0x010F,  
af60: 30 78 36 34 2c 20 30 78 30 30 2c 20 30 78 30 30  0x64, 0x00, 0x00
af70: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8f  , 0x00 },  /* ..
af80: 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30   to d */.  { 0x0
af90: 31 31 30 2c 20 20 30 78 34 34 2c 20 30 78 30 30  110,  0x44, 0x00
afa0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
afb0: 20 2f 2a 20 c4 90 20 74 6f 20 44 20 2a 2f 0a 20   /* .. to D */. 
afc0: 20 7b 20 30 78 30 31 31 31 2c 20 20 30 78 36 34   { 0x0111,  0x64
afd0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
afe0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 91 20 74 6f 20  00 },  /* .. to 
aff0: 64 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 32 2c  d */.  { 0x0112,
b000: 20 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30 78    0x45, 0x00, 0x
b010: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b020: c4 92 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
b030: 78 30 31 31 33 2c 20 20 30 78 36 35 2c 20 30 78  x0113,  0x65, 0x
b040: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
b050: 2c 20 20 2f 2a 20 c4 93 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
b060: 0a 20 20 7b 20 30 78 30 31 31 34 2c 20 20 30 78  .  { 0x0114,  0x
b070: 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  45, 0x00, 0x00, 
b080: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 94 20 74  0x00 },  /* .. t
b090: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o E */.  { 0x011
b0a0: 35 2c 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20  5,  0x65, 0x00, 
b0b0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b0c0: 2a 20 c4 95 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
b0d0: 20 30 78 30 31 31 36 2c 20 20 30 78 34 35 2c 20   0x0116,  0x45, 
b0e0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
b0f0: 20 7d 2c 20 20 2f 2a 20 c4 96 20 74 6f 20 45 20   },  /* .. to E 
b100: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 37 2c 20 20  */.  { 0x0117,  
b110: 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30  0x65, 0x00, 0x00
b120: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 97  , 0x00 },  /* ..
b130: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
b140: 31 31 38 2c 20 20 30 78 34 35 2c 20 30 78 30 30  118,  0x45, 0x00
b150: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
b160: 20 2f 2a 20 c4 98 20 74 6f 20 45 20 2a 2f 0a 20   /* .. to E */. 
b170: 20 7b 20 30 78 30 31 31 39 2c 20 20 30 78 36 35   { 0x0119,  0x65
b180: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
b190: 30 30 20 7d 2c 20 20 2f 2a 20 c4 99 20 74 6f 20  00 },  /* .. to 
b1a0: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 41 2c  e */.  { 0x011A,
b1b0: 20 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30 78    0x45, 0x00, 0x
b1c0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b1d0: c4 9a 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
b1e0: 78 30 31 31 42 2c 20 20 30 78 36 35 2c 20 30 78  x011B,  0x65, 0x
b1f0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
b200: 2c 20 20 2f 2a 20 c4 9b 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
b210: 0a 20 20 7b 20 30 78 30 31 31 43 2c 20 20 30 78  .  { 0x011C,  0x
b220: 34 37 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20  47, 0x68, 0x00, 
b230: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9c 20 74  0x00 },  /* .. t
b240: 6f 20 47 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o Gh */.  { 0x01
b250: 31 44 2c 20 20 30 78 36 37 2c 20 30 78 36 38 2c  1D,  0x67, 0x68,
b260: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b270: 2f 2a 20 c4 9d 20 74 6f 20 67 68 20 2a 2f 0a 20  /* .. to gh */. 
b280: 20 7b 20 30 78 30 31 31 45 2c 20 20 30 78 34 37   { 0x011E,  0x47
b290: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
b2a0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 9e 20 74 6f 20  00 },  /* .. to 
b2b0: 47 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 46 2c  G */.  { 0x011F,
b2c0: 20 20 30 78 36 37 2c 20 30 78 30 30 2c 20 30 78    0x67, 0x00, 0x
b2d0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b2e0: c4 9f 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30  .. to g */.  { 0
b2f0: 78 30 31 32 30 2c 20 20 30 78 34 37 2c 20 30 78  x0120,  0x47, 0x
b300: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
b310: 2c 20 20 2f 2a 20 c4 a0 20 74 6f 20 47 20 2a 2f  ,  /* .. to G */
b320: 0a 20 20 7b 20 30 78 30 31 32 31 2c 20 20 30 78  .  { 0x0121,  0x
b330: 36 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  67, 0x00, 0x00, 
b340: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a1 20 74  0x00 },  /* .. t
b350: 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o g */.  { 0x012
b360: 32 2c 20 20 30 78 34 37 2c 20 30 78 30 30 2c 20  2,  0x47, 0x00, 
b370: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b380: 2a 20 c4 a2 20 74 6f 20 47 20 2a 2f 0a 20 20 7b  * .. to G */.  {
b390: 20 30 78 30 31 32 33 2c 20 20 30 78 36 37 2c 20   0x0123,  0x67, 
b3a0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
b3b0: 20 7d 2c 20 20 2f 2a 20 c4 a3 20 74 6f 20 67 20   },  /* .. to g 
b3c0: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 34 2c 20 20  */.  { 0x0124,  
b3d0: 30 78 34 38 2c 20 30 78 36 38 2c 20 30 78 30 30  0x48, 0x68, 0x00
b3e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a4  , 0x00 },  /* ..
b3f0: 20 74 6f 20 48 68 20 2a 2f 0a 20 20 7b 20 30 78   to Hh */.  { 0x
b400: 30 31 32 35 2c 20 20 30 78 36 38 2c 20 30 78 36  0125,  0x68, 0x6
b410: 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  8, 0x00, 0x00 },
b420: 20 20 2f 2a 20 c4 a5 20 74 6f 20 68 68 20 2a 2f    /* .. to hh */
b430: 0a 20 20 7b 20 30 78 30 31 32 36 2c 20 20 30 78  .  { 0x0126,  0x
b440: 34 38 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  48, 0x00, 0x00, 
b450: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a6 20 74  0x00 },  /* .. t
b460: 6f 20 48 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o H */.  { 0x012
b470: 37 2c 20 20 30 78 36 38 2c 20 30 78 30 30 2c 20  7,  0x68, 0x00, 
b480: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b490: 2a 20 c4 a7 20 74 6f 20 68 20 2a 2f 0a 20 20 7b  * .. to h */.  {
b4a0: 20 30 78 30 31 32 38 2c 20 20 30 78 34 39 2c 20   0x0128,  0x49, 
b4b0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
b4c0: 20 7d 2c 20 20 2f 2a 20 c4 a8 20 74 6f 20 49 20   },  /* .. to I 
b4d0: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 39 2c 20 20  */.  { 0x0129,  
b4e0: 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x69, 0x00, 0x00
b4f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a9  , 0x00 },  /* ..
b500: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
b510: 31 32 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30  12A,  0x49, 0x00
b520: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
b530: 20 2f 2a 20 c4 aa 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
b540: 20 7b 20 30 78 30 31 32 42 2c 20 20 30 78 36 39   { 0x012B,  0x69
b550: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
b560: 30 30 20 7d 2c 20 20 2f 2a 20 c4 ab 20 74 6f 20  00 },  /* .. to 
b570: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 43 2c  i */.  { 0x012C,
b580: 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78    0x49, 0x00, 0x
b590: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b5a0: c4 ac 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
b5b0: 78 30 31 32 44 2c 20 20 30 78 36 39 2c 20 30 78  x012D,  0x69, 0x
b5c0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
b5d0: 2c 20 20 2f 2a 20 c4 ad 20 74 6f 20 69 20 2a 2f  ,  /* .. to i */
b5e0: 0a 20 20 7b 20 30 78 30 31 32 45 2c 20 20 30 78  .  { 0x012E,  0x
b5f0: 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  49, 0x00, 0x00, 
b600: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ae 20 74  0x00 },  /* .. t
b610: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o I */.  { 0x012
b620: 46 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c 20  F,  0x69, 0x00, 
b630: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b640: 2a 20 c4 af 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
b650: 20 30 78 30 31 33 30 2c 20 20 30 78 34 39 2c 20   0x0130,  0x49, 
b660: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
b670: 20 7d 2c 20 20 2f 2a 20 c4 b0 20 74 6f 20 49 20   },  /* .. to I 
b680: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 31 2c 20 20  */.  { 0x0131,  
b690: 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x69, 0x00, 0x00
b6a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b1  , 0x00 },  /* ..
b6b0: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
b6c0: 31 33 32 2c 20 20 30 78 34 39 2c 20 30 78 34 41  132,  0x49, 0x4A
b6d0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
b6e0: 20 2f 2a 20 c4 b2 20 74 6f 20 49 4a 20 2a 2f 0a   /* .. to IJ */.
b6f0: 20 20 7b 20 30 78 30 31 33 33 2c 20 20 30 78 36    { 0x0133,  0x6
b700: 39 2c 20 30 78 36 41 2c 20 30 78 30 30 2c 20 30  9, 0x6A, 0x00, 0
b710: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b3 20 74 6f  x00 },  /* .. to
b720: 20 69 6a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33   ij */.  { 0x013
b730: 34 2c 20 20 30 78 34 41 2c 20 30 78 36 38 2c 20  4,  0x4A, 0x68, 
b740: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b750: 2a 20 c4 b4 20 74 6f 20 4a 68 20 2a 2f 0a 20 20  * .. to Jh */.  
b760: 7b 20 30 78 30 31 33 35 2c 20 20 30 78 36 41 2c  { 0x0135,  0x6A,
b770: 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30   0x68, 0x00, 0x0
b780: 30 20 7d 2c 20 20 2f 2a 20 c4 b5 20 74 6f 20 6a  0 },  /* .. to j
b790: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 36 2c  h */.  { 0x0136,
b7a0: 20 20 30 78 34 42 2c 20 30 78 30 30 2c 20 30 78    0x4B, 0x00, 0x
b7b0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b7c0: c4 b6 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30  .. to K */.  { 0
b7d0: 78 30 31 33 37 2c 20 20 30 78 36 42 2c 20 30 78  x0137,  0x6B, 0x
b7e0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
b7f0: 2c 20 20 2f 2a 20 c4 b7 20 74 6f 20 6b 20 2a 2f  ,  /* .. to k */
b800: 0a 20 20 7b 20 30 78 30 31 33 38 2c 20 20 30 78  .  { 0x0138,  0x
b810: 36 42 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  6B, 0x00, 0x00, 
b820: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b8 20 74  0x00 },  /* .. t
b830: 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o k */.  { 0x013
b840: 39 2c 20 20 30 78 34 43 2c 20 30 78 30 30 2c 20  9,  0x4C, 0x00, 
b850: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b860: 2a 20 c4 b9 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b  * .. to L */.  {
b870: 20 30 78 30 31 33 41 2c 20 20 30 78 36 43 2c 20   0x013A,  0x6C, 
b880: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
b890: 20 7d 2c 20 20 2f 2a 20 c4 ba 20 74 6f 20 6c 20   },  /* .. to l 
b8a0: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 42 2c 20 20  */.  { 0x013B,  
b8b0: 30 78 34 43 2c 20 30 78 30 30 2c 20 30 78 30 30  0x4C, 0x00, 0x00
b8c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 bb  , 0x00 },  /* ..
b8d0: 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30   to L */.  { 0x0
b8e0: 31 33 43 2c 20 20 30 78 36 43 2c 20 30 78 30 30  13C,  0x6C, 0x00
b8f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
b900: 20 2f 2a 20 c4 bc 20 74 6f 20 6c 20 2a 2f 0a 20   /* .. to l */. 
b910: 20 7b 20 30 78 30 31 33 44 2c 20 20 30 78 34 43   { 0x013D,  0x4C
b920: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
b930: 30 30 20 7d 2c 20 20 2f 2a 20 c4 bd 20 74 6f 20  00 },  /* .. to 
b940: 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 45 2c  L */.  { 0x013E,
b950: 20 20 30 78 36 43 2c 20 30 78 30 30 2c 20 30 78    0x6C, 0x00, 0x
b960: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b970: c4 be 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30  .. to l */.  { 0
b980: 78 30 31 33 46 2c 20 20 30 78 34 43 2c 20 30 78  x013F,  0x4C, 0x
b990: 32 45 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  2E, 0x00, 0x00 }
b9a0: 2c 20 20 2f 2a 20 c4 bf 20 74 6f 20 4c 2e 20 2a  ,  /* .. to L. *
b9b0: 2f 0a 20 20 7b 20 30 78 30 31 34 30 2c 20 20 30  /.  { 0x0140,  0
b9c0: 78 36 43 2c 20 30 78 32 45 2c 20 30 78 30 30 2c  x6C, 0x2E, 0x00,
b9d0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 80 20   0x00 },  /* .. 
b9e0: 74 6f 20 6c 2e 20 2a 2f 0a 20 20 7b 20 30 78 30  to l. */.  { 0x0
b9f0: 31 34 31 2c 20 20 30 78 34 43 2c 20 30 78 30 30  141,  0x4C, 0x00
ba00: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
ba10: 20 2f 2a 20 c5 81 20 74 6f 20 4c 20 2a 2f 0a 20   /* .. to L */. 
ba20: 20 7b 20 30 78 30 31 34 32 2c 20 20 30 78 36 43   { 0x0142,  0x6C
ba30: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
ba40: 30 30 20 7d 2c 20 20 2f 2a 20 c5 82 20 74 6f 20  00 },  /* .. to 
ba50: 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 33 2c  l */.  { 0x0143,
ba60: 20 20 30 78 34 45 2c 20 30 78 30 30 2c 20 30 78    0x4E, 0x00, 0x
ba70: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
ba80: c5 83 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30  .. to N */.  { 0
ba90: 78 30 31 34 34 2c 20 20 30 78 36 45 2c 20 30 78  x0144,  0x6E, 0x
baa0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
bab0: 2c 20 20 2f 2a 20 c5 84 20 74 6f 20 6e 20 2a 2f  ,  /* .. to n */
bac0: 0a 20 20 7b 20 30 78 30 31 34 35 2c 20 20 30 78  .  { 0x0145,  0x
bad0: 34 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  4E, 0x00, 0x00, 
bae0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 85 20 74  0x00 },  /* .. t
baf0: 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34  o N */.  { 0x014
bb00: 36 2c 20 20 30 78 36 45 2c 20 30 78 30 30 2c 20  6,  0x6E, 0x00, 
bb10: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
bb20: 2a 20 c5 86 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b  * .. to n */.  {
bb30: 20 30 78 30 31 34 37 2c 20 20 30 78 34 45 2c 20   0x0147,  0x4E, 
bb40: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
bb50: 20 7d 2c 20 20 2f 2a 20 c5 87 20 74 6f 20 4e 20   },  /* .. to N 
bb60: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 38 2c 20 20  */.  { 0x0148,  
bb70: 30 78 36 45 2c 20 30 78 30 30 2c 20 30 78 30 30  0x6E, 0x00, 0x00
bb80: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 88  , 0x00 },  /* ..
bb90: 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30   to n */.  { 0x0
bba0: 31 34 39 2c 20 20 30 78 32 37 2c 20 30 78 36 45  149,  0x27, 0x6E
bbb0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
bbc0: 20 2f 2a 20 c5 89 20 74 6f 20 27 6e 20 2a 2f 0a   /* .. to 'n */.
bbd0: 20 20 7b 20 30 78 30 31 34 41 2c 20 20 30 78 34    { 0x014A,  0x4
bbe0: 45 2c 20 30 78 34 37 2c 20 30 78 30 30 2c 20 30  E, 0x47, 0x00, 0
bbf0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8a 20 74 6f  x00 },  /* .. to
bc00: 20 4e 47 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34   NG */.  { 0x014
bc10: 42 2c 20 20 30 78 36 45 2c 20 30 78 36 37 2c 20  B,  0x6E, 0x67, 
bc20: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
bc30: 2a 20 c5 8b 20 74 6f 20 6e 67 20 2a 2f 0a 20 20  * .. to ng */.  
bc40: 7b 20 30 78 30 31 34 43 2c 20 20 30 78 34 46 2c  { 0x014C,  0x4F,
bc50: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
bc60: 30 20 7d 2c 20 20 2f 2a 20 c5 8c 20 74 6f 20 4f  0 },  /* .. to O
bc70: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 44 2c 20   */.  { 0x014D, 
bc80: 20 30 78 36 46 2c 20 30 78 30 30 2c 20 30 78 30   0x6F, 0x00, 0x0
bc90: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
bca0: 8d 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
bcb0: 30 31 34 45 2c 20 20 30 78 34 46 2c 20 30 78 30  014E,  0x4F, 0x0
bcc0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
bcd0: 20 20 2f 2a 20 c5 8e 20 74 6f 20 4f 20 2a 2f 0a    /* .. to O */.
bce0: 20 20 7b 20 30 78 30 31 34 46 2c 20 20 30 78 36    { 0x014F,  0x6
bcf0: 46 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  F, 0x00, 0x00, 0
bd00: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8f 20 74 6f  x00 },  /* .. to
bd10: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 30   o */.  { 0x0150
bd20: 2c 20 20 30 78 34 46 2c 20 30 78 30 30 2c 20 30  ,  0x4F, 0x00, 0
bd30: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
bd40: 20 c5 90 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
bd50: 30 78 30 31 35 31 2c 20 20 30 78 36 46 2c 20 30  0x0151,  0x6F, 0
bd60: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
bd70: 7d 2c 20 20 2f 2a 20 c5 91 20 74 6f 20 6f 20 2a  },  /* .. to o *
bd80: 2f 0a 20 20 7b 20 30 78 30 31 35 32 2c 20 20 30  /.  { 0x0152,  0
bd90: 78 34 46 2c 20 30 78 34 35 2c 20 30 78 30 30 2c  x4F, 0x45, 0x00,
bda0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 92 20   0x00 },  /* .. 
bdb0: 74 6f 20 4f 45 20 2a 2f 0a 20 20 7b 20 30 78 30  to OE */.  { 0x0
bdc0: 31 35 33 2c 20 20 30 78 36 46 2c 20 30 78 36 35  153,  0x6F, 0x65
bdd0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
bde0: 20 2f 2a 20 c5 93 20 74 6f 20 6f 65 20 2a 2f 0a   /* .. to oe */.
bdf0: 20 20 7b 20 30 78 30 31 35 34 2c 20 20 30 78 35    { 0x0154,  0x5
be00: 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  2, 0x00, 0x00, 0
be10: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 94 20 74 6f  x00 },  /* .. to
be20: 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 35   R */.  { 0x0155
be30: 2c 20 20 30 78 37 32 2c 20 30 78 30 30 2c 20 30  ,  0x72, 0x00, 0
be40: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
be50: 20 c5 95 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20   .. to r */.  { 
be60: 30 78 30 31 35 36 2c 20 20 30 78 35 32 2c 20 30  0x0156,  0x52, 0
be70: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
be80: 7d 2c 20 20 2f 2a 20 c5 96 20 74 6f 20 52 20 2a  },  /* .. to R *
be90: 2f 0a 20 20 7b 20 30 78 30 31 35 37 2c 20 20 30  /.  { 0x0157,  0
bea0: 78 37 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x72, 0x00, 0x00,
beb0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 97 20   0x00 },  /* .. 
bec0: 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to r */.  { 0x01
bed0: 35 38 2c 20 20 30 78 35 32 2c 20 30 78 30 30 2c  58,  0x52, 0x00,
bee0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
bef0: 2f 2a 20 c5 98 20 74 6f 20 52 20 2a 2f 0a 20 20  /* .. to R */.  
bf00: 7b 20 30 78 30 31 35 39 2c 20 20 30 78 37 32 2c  { 0x0159,  0x72,
bf10: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
bf20: 30 20 7d 2c 20 20 2f 2a 20 c5 99 20 74 6f 20 72  0 },  /* .. to r
bf30: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 41 2c 20   */.  { 0x015A, 
bf40: 20 30 78 35 33 2c 20 30 78 30 30 2c 20 30 78 30   0x53, 0x00, 0x0
bf50: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
bf60: 9a 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78  . to S */.  { 0x
bf70: 30 31 35 42 2c 20 20 30 78 37 33 2c 20 30 78 30  015B,  0x73, 0x0
bf80: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
bf90: 20 20 2f 2a 20 c5 9b 20 74 6f 20 73 20 2a 2f 0a    /* .. to s */.
bfa0: 20 20 7b 20 30 78 30 31 35 43 2c 20 20 30 78 35    { 0x015C,  0x5
bfb0: 33 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30  3, 0x68, 0x00, 0
bfc0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9c 20 74 6f  x00 },  /* .. to
bfd0: 20 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35   Sh */.  { 0x015
bfe0: 44 2c 20 20 30 78 37 33 2c 20 30 78 36 38 2c 20  D,  0x73, 0x68, 
bff0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c000: 2a 20 c5 9d 20 74 6f 20 73 68 20 2a 2f 0a 20 20  * .. to sh */.  
c010: 7b 20 30 78 30 31 35 45 2c 20 20 30 78 35 33 2c  { 0x015E,  0x53,
c020: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
c030: 30 20 7d 2c 20 20 2f 2a 20 c5 9e 20 74 6f 20 53  0 },  /* .. to S
c040: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 46 2c 20   */.  { 0x015F, 
c050: 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30 78 30   0x73, 0x00, 0x0
c060: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
c070: 9f 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
c080: 30 31 36 30 2c 20 20 30 78 35 33 2c 20 30 78 30  0160,  0x53, 0x0
c090: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
c0a0: 20 20 2f 2a 20 c5 a0 20 74 6f 20 53 20 2a 2f 0a    /* .. to S */.
c0b0: 20 20 7b 20 30 78 30 31 36 31 2c 20 20 30 78 37    { 0x0161,  0x7
c0c0: 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  3, 0x00, 0x00, 0
c0d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a1 20 74 6f  x00 },  /* .. to
c0e0: 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 32   s */.  { 0x0162
c0f0: 2c 20 20 30 78 35 34 2c 20 30 78 30 30 2c 20 30  ,  0x54, 0x00, 0
c100: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
c110: 20 c5 a2 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20   .. to T */.  { 
c120: 30 78 30 31 36 33 2c 20 20 30 78 37 34 2c 20 30  0x0163,  0x74, 0
c130: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
c140: 7d 2c 20 20 2f 2a 20 c5 a3 20 74 6f 20 74 20 2a  },  /* .. to t *
c150: 2f 0a 20 20 7b 20 30 78 30 31 36 34 2c 20 20 30  /.  { 0x0164,  0
c160: 78 35 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x54, 0x00, 0x00,
c170: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a4 20   0x00 },  /* .. 
c180: 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to T */.  { 0x01
c190: 36 35 2c 20 20 30 78 37 34 2c 20 30 78 30 30 2c  65,  0x74, 0x00,
c1a0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
c1b0: 2f 2a 20 c5 a5 20 74 6f 20 74 20 2a 2f 0a 20 20  /* .. to t */.  
c1c0: 7b 20 30 78 30 31 36 36 2c 20 20 30 78 35 34 2c  { 0x0166,  0x54,
c1d0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
c1e0: 30 20 7d 2c 20 20 2f 2a 20 c5 a6 20 74 6f 20 54  0 },  /* .. to T
c1f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 37 2c 20   */.  { 0x0167, 
c200: 20 30 78 37 34 2c 20 30 78 30 30 2c 20 30 78 30   0x74, 0x00, 0x0
c210: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
c220: a7 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78  . to t */.  { 0x
c230: 30 31 36 38 2c 20 20 30 78 35 35 2c 20 30 78 30  0168,  0x55, 0x0
c240: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
c250: 20 20 2f 2a 20 c5 a8 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
c260: 20 20 7b 20 30 78 30 31 36 39 2c 20 20 30 78 37    { 0x0169,  0x7
c270: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
c280: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a9 20 74 6f  x00 },  /* .. to
c290: 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 41   u */.  { 0x016A
c2a0: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 2c 20 30  ,  0x55, 0x00, 0
c2b0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
c2c0: 20 c5 aa 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20   .. to U */.  { 
c2d0: 30 78 30 31 36 42 2c 20 20 30 78 37 35 2c 20 30  0x016B,  0x75, 0
c2e0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
c2f0: 7d 2c 20 20 2f 2a 20 c5 ab 20 74 6f 20 75 20 2a  },  /* .. to u *
c300: 2f 0a 20 20 7b 20 30 78 30 31 36 43 2c 20 20 30  /.  { 0x016C,  0
c310: 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x55, 0x00, 0x00,
c320: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ac 20   0x00 },  /* .. 
c330: 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to U */.  { 0x01
c340: 36 44 2c 20 20 30 78 37 35 2c 20 30 78 30 30 2c  6D,  0x75, 0x00,
c350: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
c360: 2f 2a 20 c5 ad 20 74 6f 20 75 20 2a 2f 0a 20 20  /* .. to u */.  
c370: 7b 20 30 78 30 31 36 45 2c 20 20 30 78 35 35 2c  { 0x016E,  0x55,
c380: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
c390: 30 20 7d 2c 20 20 2f 2a 20 c5 ae 20 74 6f 20 55  0 },  /* .. to U
c3a0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 46 2c 20   */.  { 0x016F, 
c3b0: 20 30 78 37 35 2c 20 30 78 30 30 2c 20 30 78 30   0x75, 0x00, 0x0
c3c0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
c3d0: af 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78  . to u */.  { 0x
c3e0: 30 31 37 30 2c 20 20 30 78 35 35 2c 20 30 78 30  0170,  0x55, 0x0
c3f0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
c400: 20 20 2f 2a 20 c5 b0 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
c410: 20 20 7b 20 30 78 30 31 37 31 2c 20 20 30 78 37    { 0x0171,  0x7
c420: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
c430: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b1 20 74 6f  x00 },  /* .. to
c440: 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 32   u */.  { 0x0172
c450: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 2c 20 30  ,  0x55, 0x00, 0
c460: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
c470: 20 c5 b2 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20   .. to U */.  { 
c480: 30 78 30 31 37 33 2c 20 20 30 78 37 35 2c 20 30  0x0173,  0x75, 0
c490: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
c4a0: 7d 2c 20 20 2f 2a 20 c5 b3 20 74 6f 20 75 20 2a  },  /* .. to u *
c4b0: 2f 0a 20 20 7b 20 30 78 30 31 37 34 2c 20 20 30  /.  { 0x0174,  0
c4c0: 78 35 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x57, 0x00, 0x00,
c4d0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b4 20   0x00 },  /* .. 
c4e0: 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to W */.  { 0x01
c4f0: 37 35 2c 20 20 30 78 37 37 2c 20 30 78 30 30 2c  75,  0x77, 0x00,
c500: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
c510: 2f 2a 20 c5 b5 20 74 6f 20 77 20 2a 2f 0a 20 20  /* .. to w */.  
c520: 7b 20 30 78 30 31 37 36 2c 20 20 30 78 35 39 2c  { 0x0176,  0x59,
c530: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
c540: 30 20 7d 2c 20 20 2f 2a 20 c5 b6 20 74 6f 20 59  0 },  /* .. to Y
c550: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 37 2c 20   */.  { 0x0177, 
c560: 20 30 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30   0x79, 0x00, 0x0
c570: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
c580: b7 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78  . to y */.  { 0x
c590: 30 31 37 38 2c 20 20 30 78 35 39 2c 20 30 78 30  0178,  0x59, 0x0
c5a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
c5b0: 20 20 2f 2a 20 c5 b8 20 74 6f 20 59 20 2a 2f 0a    /* .. to Y */.
c5c0: 20 20 7b 20 30 78 30 31 37 39 2c 20 20 30 78 35    { 0x0179,  0x5
c5d0: 41 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  A, 0x00, 0x00, 0
c5e0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b9 20 74 6f  x00 },  /* .. to
c5f0: 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 41   Z */.  { 0x017A
c600: 2c 20 20 30 78 37 41 2c 20 30 78 30 30 2c 20 30  ,  0x7A, 0x00, 0
c610: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
c620: 20 c5 ba 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20   .. to z */.  { 
c630: 30 78 30 31 37 42 2c 20 20 30 78 35 41 2c 20 30  0x017B,  0x5A, 0
c640: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
c650: 7d 2c 20 20 2f 2a 20 c5 bb 20 74 6f 20 5a 20 2a  },  /* .. to Z *
c660: 2f 0a 20 20 7b 20 30 78 30 31 37 43 2c 20 20 30  /.  { 0x017C,  0
c670: 78 37 41 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x7A, 0x00, 0x00,
c680: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bc 20   0x00 },  /* .. 
c690: 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to z */.  { 0x01
c6a0: 37 44 2c 20 20 30 78 35 41 2c 20 30 78 30 30 2c  7D,  0x5A, 0x00,
c6b0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
c6c0: 2f 2a 20 c5 bd 20 74 6f 20 5a 20 2a 2f 0a 20 20  /* .. to Z */.  
c6d0: 7b 20 30 78 30 31 37 45 2c 20 20 30 78 37 41 2c  { 0x017E,  0x7A,
c6e0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
c6f0: 30 20 7d 2c 20 20 2f 2a 20 c5 be 20 74 6f 20 7a  0 },  /* .. to z
c700: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 46 2c 20   */.  { 0x017F, 
c710: 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30 78 30   0x73, 0x00, 0x0
c720: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
c730: bf 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
c740: 30 31 39 32 2c 20 20 30 78 36 36 2c 20 30 78 30  0192,  0x66, 0x0
c750: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
c760: 20 20 2f 2a 20 c6 92 20 74 6f 20 66 20 2a 2f 0a    /* .. to f */.
c770: 20 20 7b 20 30 78 30 32 31 38 2c 20 20 30 78 35    { 0x0218,  0x5
c780: 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  3, 0x00, 0x00, 0
c790: 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 98 20 74 6f  x00 },  /* .. to
c7a0: 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 32 31 39   S */.  { 0x0219
c7b0: 2c 20 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30  ,  0x73, 0x00, 0
c7c0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
c7d0: 20 c8 99 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20   .. to s */.  { 
c7e0: 30 78 30 32 31 41 2c 20 20 30 78 35 34 2c 20 30  0x021A,  0x54, 0
c7f0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
c800: 7d 2c 20 20 2f 2a 20 c8 9a 20 74 6f 20 54 20 2a  },  /* .. to T *
c810: 2f 0a 20 20 7b 20 30 78 30 32 31 42 2c 20 20 30  /.  { 0x021B,  0
c820: 78 37 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x74, 0x00, 0x00,
c830: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9b 20   0x00 },  /* .. 
c840: 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to t */.  { 0x03
c850: 38 36 2c 20 20 30 78 34 31 2c 20 30 78 30 30 2c  86,  0x41, 0x00,
c860: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
c870: 2f 2a 20 ce 86 20 74 6f 20 41 20 2a 2f 0a 20 20  /* .. to A */.  
c880: 7b 20 30 78 30 33 38 38 2c 20 20 30 78 34 35 2c  { 0x0388,  0x45,
c890: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
c8a0: 30 20 7d 2c 20 20 2f 2a 20 ce 88 20 74 6f 20 45  0 },  /* .. to E
c8b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 39 2c 20   */.  { 0x0389, 
c8c0: 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30   0x49, 0x00, 0x0
c8d0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  0, 0x00 },  /* .
c8e0: 89 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
c8f0: 30 33 38 41 2c 20 20 30 78 34 39 2c 20 30 78 30  038A,  0x49, 0x0
c900: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
c910: 20 20 2f 2a 20 ce 8a 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
c920: 20 20 7b 20 30 78 30 33 38 43 2c 20 20 30 78 34    { 0x038C,  0x4
c930: 66 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  f, 0x00, 0x00, 0
c940: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 8c 20 74 6f  x00 },  /* .. to
c950: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 45   O */.  { 0x038E
c960: 2c 20 20 30 78 35 39 2c 20 30 78 30 30 2c 20 30  ,  0x59, 0x00, 0
c970: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
c980: 20 ce 8e 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20   .. to Y */.  { 
c990: 30 78 30 33 38 46 2c 20 20 30 78 34 66 2c 20 30  0x038F,  0x4f, 0
c9a0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
c9b0: 7d 2c 20 20 2f 2a 20 ce 8f 20 74 6f 20 4f 20 2a  },  /* .. to O *
c9c0: 2f 0a 20 20 7b 20 30 78 30 33 39 30 2c 20 20 30  /.  { 0x0390,  0
c9d0: 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x69, 0x00, 0x00,
c9e0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 90 20   0x00 },  /* .. 
c9f0: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to i */.  { 0x03
ca00: 39 31 2c 20 20 30 78 34 31 2c 20 30 78 30 30 2c  91,  0x41, 0x00,
ca10: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
ca20: 2f 2a 20 ce 91 20 74 6f 20 41 20 2a 2f 0a 20 20  /* .. to A */.  
ca30: 7b 20 30 78 30 33 39 32 2c 20 20 30 78 34 32 2c  { 0x0392,  0x42,
ca40: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
ca50: 30 20 7d 2c 20 20 2f 2a 20 ce 92 20 74 6f 20 42  0 },  /* .. to B
ca60: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 33 2c 20   */.  { 0x0393, 
ca70: 20 30 78 34 37 2c 20 30 78 30 30 2c 20 30 78 30   0x47, 0x00, 0x0
ca80: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  0, 0x00 },  /* .
ca90: 93 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78  . to G */.  { 0x
caa0: 30 33 39 34 2c 20 20 30 78 34 34 2c 20 30 78 30  0394,  0x44, 0x0
cab0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
cac0: 20 20 2f 2a 20 ce 94 20 74 6f 20 44 20 2a 2f 0a    /* .. to D */.
cad0: 20 20 7b 20 30 78 30 33 39 35 2c 20 20 30 78 34    { 0x0395,  0x4
cae0: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
caf0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 95 20 74 6f  x00 },  /* .. to
cb00: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 36   E */.  { 0x0396
cb10: 2c 20 20 30 78 35 61 2c 20 30 78 30 30 2c 20 30  ,  0x5a, 0x00, 0
cb20: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
cb30: 20 ce 96 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20   .. to Z */.  { 
cb40: 30 78 30 33 39 37 2c 20 20 30 78 34 39 2c 20 30  0x0397,  0x49, 0
cb50: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
cb60: 7d 2c 20 20 2f 2a 20 ce 97 20 74 6f 20 49 20 2a  },  /* .. to I *
cb70: 2f 0a 20 20 7b 20 30 78 30 33 39 38 2c 20 20 30  /.  { 0x0398,  0
cb80: 78 35 34 2c 20 30 78 36 38 2c 20 30 78 30 30 2c  x54, 0x68, 0x00,
cb90: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 98 20   0x00 },  /* .. 
cba0: 74 6f 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Th */.  { 0x0
cbb0: 33 39 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30  399,  0x49, 0x00
cbc0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
cbd0: 20 2f 2a 20 ce 99 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
cbe0: 20 7b 20 30 78 30 33 39 41 2c 20 20 30 78 34 62   { 0x039A,  0x4b
cbf0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
cc00: 30 30 20 7d 2c 20 20 2f 2a 20 ce 9a 20 74 6f 20  00 },  /* .. to 
cc10: 4b 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 42 2c  K */.  { 0x039B,
cc20: 20 20 30 78 34 63 2c 20 30 78 30 30 2c 20 30 78    0x4c, 0x00, 0x
cc30: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
cc40: ce 9b 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30  .. to L */.  { 0
cc50: 78 30 33 39 43 2c 20 20 30 78 34 64 2c 20 30 78  x039C,  0x4d, 0x
cc60: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
cc70: 2c 20 20 2f 2a 20 ce 9c 20 74 6f 20 4d 20 2a 2f  ,  /* .. to M */
cc80: 0a 20 20 7b 20 30 78 30 33 39 44 2c 20 20 30 78  .  { 0x039D,  0x
cc90: 34 65 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  4e, 0x00, 0x00, 
cca0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9d 20 74  0x00 },  /* .. t
ccb0: 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39  o N */.  { 0x039
ccc0: 45 2c 20 20 30 78 35 38 2c 20 30 78 30 30 2c 20  E,  0x58, 0x00, 
ccd0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
cce0: 2a 20 ce 9e 20 74 6f 20 58 20 2a 2f 0a 20 20 7b  * .. to X */.  {
ccf0: 20 30 78 30 33 39 46 2c 20 20 30 78 34 66 2c 20   0x039F,  0x4f, 
cd00: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
cd10: 20 7d 2c 20 20 2f 2a 20 ce 9f 20 74 6f 20 4f 20   },  /* .. to O 
cd20: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 30 2c 20 20  */.  { 0x03A0,  
cd30: 30 78 35 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x50, 0x00, 0x00
cd40: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a0  , 0x00 },  /* ..
cd50: 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 30   to P */.  { 0x0
cd60: 33 41 31 2c 20 20 30 78 35 32 2c 20 30 78 30 30  3A1,  0x52, 0x00
cd70: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
cd80: 20 2f 2a 20 ce a1 20 74 6f 20 52 20 2a 2f 0a 20   /* .. to R */. 
cd90: 20 7b 20 30 78 30 33 41 33 2c 20 20 30 78 35 33   { 0x03A3,  0x53
cda0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
cdb0: 30 30 20 7d 2c 20 20 2f 2a 20 ce a3 20 74 6f 20  00 },  /* .. to 
cdc0: 53 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 34 2c  S */.  { 0x03A4,
cdd0: 20 20 30 78 35 34 2c 20 30 78 30 30 2c 20 30 78    0x54, 0x00, 0x
cde0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
cdf0: ce a4 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30  .. to T */.  { 0
ce00: 78 30 33 41 35 2c 20 20 30 78 35 39 2c 20 30 78  x03A5,  0x59, 0x
ce10: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
ce20: 2c 20 20 2f 2a 20 ce a5 20 74 6f 20 59 20 2a 2f  ,  /* .. to Y */
ce30: 0a 20 20 7b 20 30 78 30 33 41 36 2c 20 20 30 78  .  { 0x03A6,  0x
ce40: 34 36 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  46, 0x00, 0x00, 
ce50: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a6 20 74  0x00 },  /* .. t
ce60: 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o F */.  { 0x03A
ce70: 37 2c 20 20 30 78 34 33 2c 20 30 78 36 38 2c 20  7,  0x43, 0x68, 
ce80: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
ce90: 2a 20 ce a7 20 74 6f 20 43 68 20 2a 2f 0a 20 20  * .. to Ch */.  
cea0: 7b 20 30 78 30 33 41 38 2c 20 20 30 78 35 30 2c  { 0x03A8,  0x50,
ceb0: 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30 78 30   0x73, 0x00, 0x0
cec0: 30 20 7d 2c 20 20 2f 2a 20 ce a8 20 74 6f 20 50  0 },  /* .. to P
ced0: 73 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 39 2c  s */.  { 0x03A9,
cee0: 20 20 30 78 34 66 2c 20 30 78 30 30 2c 20 30 78    0x4f, 0x00, 0x
cef0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
cf00: ce a9 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30  .. to O */.  { 0
cf10: 78 30 33 41 41 2c 20 20 30 78 34 39 2c 20 30 78  x03AA,  0x49, 0x
cf20: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
cf30: 2c 20 20 2f 2a 20 ce aa 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
cf40: 0a 20 20 7b 20 30 78 30 33 41 42 2c 20 20 30 78  .  { 0x03AB,  0x
cf50: 35 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  59, 0x00, 0x00, 
cf60: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ab 20 74  0x00 },  /* .. t
cf70: 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o Y */.  { 0x03A
cf80: 43 2c 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20  C,  0x61, 0x00, 
cf90: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
cfa0: 2a 20 ce ac 20 74 6f 20 61 20 2a 2f 0a 20 20 7b  * .. to a */.  {
cfb0: 20 30 78 30 33 41 44 2c 20 20 30 78 36 35 2c 20   0x03AD,  0x65, 
cfc0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
cfd0: 20 7d 2c 20 20 2f 2a 20 ce ad 20 74 6f 20 65 20   },  /* .. to e 
cfe0: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 45 2c 20 20  */.  { 0x03AE,  
cff0: 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x69, 0x00, 0x00
d000: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ae  , 0x00 },  /* ..
d010: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
d020: 33 41 46 2c 20 20 30 78 36 39 2c 20 30 78 30 30  3AF,  0x69, 0x00
d030: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
d040: 20 2f 2a 20 ce af 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
d050: 20 7b 20 30 78 30 33 42 31 2c 20 20 30 78 36 31   { 0x03B1,  0x61
d060: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
d070: 30 30 20 7d 2c 20 20 2f 2a 20 ce b1 20 74 6f 20  00 },  /* .. to 
d080: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 32 2c  a */.  { 0x03B2,
d090: 20 20 30 78 36 32 2c 20 30 78 30 30 2c 20 30 78    0x62, 0x00, 0x
d0a0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
d0b0: ce b2 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30  .. to b */.  { 0
d0c0: 78 30 33 42 33 2c 20 20 30 78 36 37 2c 20 30 78  x03B3,  0x67, 0x
d0d0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
d0e0: 2c 20 20 2f 2a 20 ce b3 20 74 6f 20 67 20 2a 2f  ,  /* .. to g */
d0f0: 0a 20 20 7b 20 30 78 30 33 42 34 2c 20 20 30 78  .  { 0x03B4,  0x
d100: 36 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  64, 0x00, 0x00, 
d110: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b4 20 74  0x00 },  /* .. t
d120: 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o d */.  { 0x03B
d130: 35 2c 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20  5,  0x65, 0x00, 
d140: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
d150: 2a 20 ce b5 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
d160: 20 30 78 30 33 42 36 2c 20 20 30 78 37 61 2c 20   0x03B6,  0x7a, 
d170: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
d180: 20 7d 2c 20 20 2f 2a 20 ce b6 20 74 6f 20 7a 20   },  /* .. to z 
d190: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 37 2c 20 20  */.  { 0x03B7,  
d1a0: 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x69, 0x00, 0x00
d1b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b7  , 0x00 },  /* ..
d1c0: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
d1d0: 33 42 38 2c 20 20 30 78 37 34 2c 20 30 78 36 38  3B8,  0x74, 0x68
d1e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
d1f0: 20 2f 2a 20 ce b8 20 74 6f 20 74 68 20 2a 2f 0a   /* .. to th */.
d200: 20 20 7b 20 30 78 30 33 42 39 2c 20 20 30 78 36    { 0x03B9,  0x6
d210: 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  9, 0x00, 0x00, 0
d220: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b9 20 74 6f  x00 },  /* .. to
d230: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 41   i */.  { 0x03BA
d240: 2c 20 20 30 78 36 62 2c 20 30 78 30 30 2c 20 30  ,  0x6b, 0x00, 0
d250: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d260: 20 ce ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20   .. to k */.  { 
d270: 30 78 30 33 42 42 2c 20 20 30 78 36 63 2c 20 30  0x03BB,  0x6c, 0
d280: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d290: 7d 2c 20 20 2f 2a 20 ce bb 20 74 6f 20 6c 20 2a  },  /* .. to l *
d2a0: 2f 0a 20 20 7b 20 30 78 30 33 42 43 2c 20 20 30  /.  { 0x03BC,  0
d2b0: 78 36 64 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x6d, 0x00, 0x00,
d2c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bc 20   0x00 },  /* .. 
d2d0: 74 6f 20 6d 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to m */.  { 0x03
d2e0: 42 44 2c 20 20 30 78 36 65 2c 20 30 78 30 30 2c  BD,  0x6e, 0x00,
d2f0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
d300: 2f 2a 20 ce bd 20 74 6f 20 6e 20 2a 2f 0a 20 20  /* .. to n */.  
d310: 7b 20 30 78 30 33 42 45 2c 20 20 30 78 37 38 2c  { 0x03BE,  0x78,
d320: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
d330: 30 20 7d 2c 20 20 2f 2a 20 ce be 20 74 6f 20 78  0 },  /* .. to x
d340: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 46 2c 20   */.  { 0x03BF, 
d350: 20 30 78 36 66 2c 20 30 78 30 30 2c 20 30 78 30   0x6f, 0x00, 0x0
d360: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  0, 0x00 },  /* .
d370: bf 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
d380: 30 33 43 30 2c 20 20 30 78 37 30 2c 20 30 78 30  03C0,  0x70, 0x0
d390: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
d3a0: 20 20 2f 2a 20 cf 80 20 74 6f 20 70 20 2a 2f 0a    /* .. to p */.
d3b0: 20 20 7b 20 30 78 30 33 43 31 2c 20 20 30 78 37    { 0x03C1,  0x7
d3c0: 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  2, 0x00, 0x00, 0
d3d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 81 20 74 6f  x00 },  /* .. to
d3e0: 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 33   r */.  { 0x03C3
d3f0: 2c 20 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30  ,  0x73, 0x00, 0
d400: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d410: 20 cf 83 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20   .. to s */.  { 
d420: 30 78 30 33 43 34 2c 20 20 30 78 37 34 2c 20 30  0x03C4,  0x74, 0
d430: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d440: 7d 2c 20 20 2f 2a 20 cf 84 20 74 6f 20 74 20 2a  },  /* .. to t *
d450: 2f 0a 20 20 7b 20 30 78 30 33 43 35 2c 20 20 30  /.  { 0x03C5,  0
d460: 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x79, 0x00, 0x00,
d470: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 85 20   0x00 },  /* .. 
d480: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to y */.  { 0x03
d490: 43 36 2c 20 20 30 78 36 36 2c 20 30 78 30 30 2c  C6,  0x66, 0x00,
d4a0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
d4b0: 2f 2a 20 cf 86 20 74 6f 20 66 20 2a 2f 0a 20 20  /* .. to f */.  
d4c0: 7b 20 30 78 30 33 43 37 2c 20 20 30 78 36 33 2c  { 0x03C7,  0x63,
d4d0: 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30   0x68, 0x00, 0x0
d4e0: 30 20 7d 2c 20 20 2f 2a 20 cf 87 20 74 6f 20 63  0 },  /* .. to c
d4f0: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 38 2c  h */.  { 0x03C8,
d500: 20 20 30 78 37 30 2c 20 30 78 37 33 2c 20 30 78    0x70, 0x73, 0x
d510: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
d520: cf 88 20 74 6f 20 70 73 20 2a 2f 0a 20 20 7b 20  .. to ps */.  { 
d530: 30 78 30 33 43 39 2c 20 20 30 78 36 66 2c 20 30  0x03C9,  0x6f, 0
d540: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d550: 7d 2c 20 20 2f 2a 20 cf 89 20 74 6f 20 6f 20 2a  },  /* .. to o *
d560: 2f 0a 20 20 7b 20 30 78 30 33 43 41 2c 20 20 30  /.  { 0x03CA,  0
d570: 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x69, 0x00, 0x00,
d580: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8a 20   0x00 },  /* .. 
d590: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to i */.  { 0x03
d5a0: 43 42 2c 20 20 30 78 37 39 2c 20 30 78 30 30 2c  CB,  0x79, 0x00,
d5b0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
d5c0: 2f 2a 20 cf 8b 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
d5d0: 7b 20 30 78 30 33 43 43 2c 20 20 30 78 36 66 2c  { 0x03CC,  0x6f,
d5e0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
d5f0: 30 20 7d 2c 20 20 2f 2a 20 cf 8c 20 74 6f 20 6f  0 },  /* .. to o
d600: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 44 2c 20   */.  { 0x03CD, 
d610: 20 30 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30   0x79, 0x00, 0x0
d620: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  0, 0x00 },  /* .
d630: 8d 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78  . to y */.  { 0x
d640: 30 33 43 45 2c 20 20 30 78 36 39 2c 20 30 78 30  03CE,  0x69, 0x0
d650: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
d660: 20 20 2f 2a 20 cf 8e 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
d670: 20 20 7b 20 30 78 30 34 30 30 2c 20 20 30 78 34    { 0x0400,  0x4
d680: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
d690: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 80 20 74 6f  x00 },  /* .. to
d6a0: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 31   E */.  { 0x0401
d6b0: 2c 20 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30  ,  0x45, 0x00, 0
d6c0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d6d0: 20 d0 81 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
d6e0: 30 78 30 34 30 32 2c 20 20 30 78 34 34 2c 20 30  0x0402,  0x44, 0
d6f0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d700: 7d 2c 20 20 2f 2a 20 d0 82 20 74 6f 20 44 20 2a  },  /* .. to D *
d710: 2f 0a 20 20 7b 20 30 78 30 34 30 33 2c 20 20 30  /.  { 0x0403,  0
d720: 78 34 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x47, 0x00, 0x00,
d730: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 83 20   0x00 },  /* .. 
d740: 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to G */.  { 0x04
d750: 30 34 2c 20 20 30 78 34 35 2c 20 30 78 30 30 2c  04,  0x45, 0x00,
d760: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
d770: 2f 2a 20 d0 84 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
d780: 7b 20 30 78 30 34 30 35 2c 20 20 30 78 35 61 2c  { 0x0405,  0x5a,
d790: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
d7a0: 30 20 7d 2c 20 20 2f 2a 20 d0 85 20 74 6f 20 5a  0 },  /* .. to Z
d7b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 36 2c 20   */.  { 0x0406, 
d7c0: 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30   0x49, 0x00, 0x0
d7d0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
d7e0: 86 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
d7f0: 30 34 30 37 2c 20 20 30 78 34 39 2c 20 30 78 30  0407,  0x49, 0x0
d800: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
d810: 20 20 2f 2a 20 d0 87 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
d820: 20 20 7b 20 30 78 30 34 30 38 2c 20 20 30 78 34    { 0x0408,  0x4
d830: 61 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  a, 0x00, 0x00, 0
d840: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 88 20 74 6f  x00 },  /* .. to
d850: 20 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 39   J */.  { 0x0409
d860: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30  ,  0x49, 0x00, 0
d870: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d880: 20 d0 89 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20   .. to I */.  { 
d890: 30 78 30 34 30 41 2c 20 20 30 78 34 65 2c 20 30  0x040A,  0x4e, 0
d8a0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d8b0: 7d 2c 20 20 2f 2a 20 d0 8a 20 74 6f 20 4e 20 2a  },  /* .. to N *
d8c0: 2f 0a 20 20 7b 20 30 78 30 34 30 42 2c 20 20 30  /.  { 0x040B,  0
d8d0: 78 34 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x44, 0x00, 0x00,
d8e0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8b 20   0x00 },  /* .. 
d8f0: 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to D */.  { 0x04
d900: 30 43 2c 20 20 30 78 34 62 2c 20 30 78 30 30 2c  0C,  0x4b, 0x00,
d910: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
d920: 2f 2a 20 d0 8c 20 74 6f 20 4b 20 2a 2f 0a 20 20  /* .. to K */.  
d930: 7b 20 30 78 30 34 30 44 2c 20 20 30 78 34 39 2c  { 0x040D,  0x49,
d940: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
d950: 30 20 7d 2c 20 20 2f 2a 20 d0 8d 20 74 6f 20 49  0 },  /* .. to I
d960: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 45 2c 20   */.  { 0x040E, 
d970: 20 30 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30   0x55, 0x00, 0x0
d980: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
d990: 8e 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
d9a0: 30 34 30 46 2c 20 20 30 78 34 34 2c 20 30 78 30  040F,  0x44, 0x0
d9b0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
d9c0: 20 20 2f 2a 20 d0 8f 20 74 6f 20 44 20 2a 2f 0a    /* .. to D */.
d9d0: 20 20 7b 20 30 78 30 34 31 30 2c 20 20 30 78 34    { 0x0410,  0x4
d9e0: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  1, 0x00, 0x00, 0
d9f0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 90 20 74 6f  x00 },  /* .. to
da00: 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 31   A */.  { 0x0411
da10: 2c 20 20 30 78 34 32 2c 20 30 78 30 30 2c 20 30  ,  0x42, 0x00, 0
da20: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
da30: 20 d0 91 20 74 6f 20 42 20 2a 2f 0a 20 20 7b 20   .. to B */.  { 
da40: 30 78 30 34 31 32 2c 20 20 30 78 35 36 2c 20 30  0x0412,  0x56, 0
da50: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
da60: 7d 2c 20 20 2f 2a 20 d0 92 20 74 6f 20 56 20 2a  },  /* .. to V *
da70: 2f 0a 20 20 7b 20 30 78 30 34 31 33 2c 20 20 30  /.  { 0x0413,  0
da80: 78 34 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x47, 0x00, 0x00,
da90: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 93 20   0x00 },  /* .. 
daa0: 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to G */.  { 0x04
dab0: 31 34 2c 20 20 30 78 34 34 2c 20 30 78 30 30 2c  14,  0x44, 0x00,
dac0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
dad0: 2f 2a 20 d0 94 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
dae0: 7b 20 30 78 30 34 31 35 2c 20 20 30 78 34 35 2c  { 0x0415,  0x45,
daf0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
db00: 30 20 7d 2c 20 20 2f 2a 20 d0 95 20 74 6f 20 45  0 },  /* .. to E
db10: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 36 2c 20   */.  { 0x0416, 
db20: 20 30 78 35 61 2c 20 30 78 36 38 2c 20 30 78 30   0x5a, 0x68, 0x0
db30: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
db40: 96 20 74 6f 20 5a 68 20 2a 2f 0a 20 20 7b 20 30  . to Zh */.  { 0
db50: 78 30 34 31 37 2c 20 20 30 78 35 61 2c 20 30 78  x0417,  0x5a, 0x
db60: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
db70: 2c 20 20 2f 2a 20 d0 97 20 74 6f 20 5a 20 2a 2f  ,  /* .. to Z */
db80: 0a 20 20 7b 20 30 78 30 34 31 38 2c 20 20 30 78  .  { 0x0418,  0x
db90: 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  49, 0x00, 0x00, 
dba0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 98 20 74  0x00 },  /* .. t
dbb0: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o I */.  { 0x041
dbc0: 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20  9,  0x49, 0x00, 
dbd0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
dbe0: 2a 20 d0 99 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
dbf0: 20 30 78 30 34 31 41 2c 20 20 30 78 34 62 2c 20   0x041A,  0x4b, 
dc00: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
dc10: 20 7d 2c 20 20 2f 2a 20 d0 9a 20 74 6f 20 4b 20   },  /* .. to K 
dc20: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 42 2c 20 20  */.  { 0x041B,  
dc30: 30 78 34 63 2c 20 30 78 30 30 2c 20 30 78 30 30  0x4c, 0x00, 0x00
dc40: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9b  , 0x00 },  /* ..
dc50: 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30   to L */.  { 0x0
dc60: 34 31 43 2c 20 20 30 78 34 64 2c 20 30 78 30 30  41C,  0x4d, 0x00
dc70: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
dc80: 20 2f 2a 20 d0 9c 20 74 6f 20 4d 20 2a 2f 0a 20   /* .. to M */. 
dc90: 20 7b 20 30 78 30 34 31 44 2c 20 20 30 78 34 65   { 0x041D,  0x4e
dca0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
dcb0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 9d 20 74 6f 20  00 },  /* .. to 
dcc0: 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 45 2c  N */.  { 0x041E,
dcd0: 20 20 30 78 34 66 2c 20 30 78 30 30 2c 20 30 78    0x4f, 0x00, 0x
dce0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
dcf0: d0 9e 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30  .. to O */.  { 0
dd00: 78 30 34 31 46 2c 20 20 30 78 35 30 2c 20 30 78  x041F,  0x50, 0x
dd10: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
dd20: 2c 20 20 2f 2a 20 d0 9f 20 74 6f 20 50 20 2a 2f  ,  /* .. to P */
dd30: 0a 20 20 7b 20 30 78 30 34 32 30 2c 20 20 30 78  .  { 0x0420,  0x
dd40: 35 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  52, 0x00, 0x00, 
dd50: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a0 20 74  0x00 },  /* .. t
dd60: 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32  o R */.  { 0x042
dd70: 31 2c 20 20 30 78 35 33 2c 20 30 78 30 30 2c 20  1,  0x53, 0x00, 
dd80: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
dd90: 2a 20 d0 a1 20 74 6f 20 53 20 2a 2f 0a 20 20 7b  * .. to S */.  {
dda0: 20 30 78 30 34 32 32 2c 20 20 30 78 35 34 2c 20   0x0422,  0x54, 
ddb0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
ddc0: 20 7d 2c 20 20 2f 2a 20 d0 a2 20 74 6f 20 54 20   },  /* .. to T 
ddd0: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 33 2c 20 20  */.  { 0x0423,  
dde0: 30 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30 30  0x55, 0x00, 0x00
ddf0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a3  , 0x00 },  /* ..
de00: 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30   to U */.  { 0x0
de10: 34 32 34 2c 20 20 30 78 34 36 2c 20 30 78 30 30  424,  0x46, 0x00
de20: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
de30: 20 2f 2a 20 d0 a4 20 74 6f 20 46 20 2a 2f 0a 20   /* .. to F */. 
de40: 20 7b 20 30 78 30 34 32 35 2c 20 20 30 78 34 62   { 0x0425,  0x4b
de50: 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78  , 0x68, 0x00, 0x
de60: 30 30 20 7d 2c 20 20 2f 2a 20 d0 a5 20 74 6f 20  00 },  /* .. to 
de70: 4b 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 36  Kh */.  { 0x0426
de80: 2c 20 20 30 78 35 34 2c 20 30 78 36 33 2c 20 30  ,  0x54, 0x63, 0
de90: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
dea0: 20 d0 a6 20 74 6f 20 54 63 20 2a 2f 0a 20 20 7b   .. to Tc */.  {
deb0: 20 30 78 30 34 32 37 2c 20 20 30 78 34 33 2c 20   0x0427,  0x43, 
dec0: 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30  0x68, 0x00, 0x00
ded0: 20 7d 2c 20 20 2f 2a 20 d0 a7 20 74 6f 20 43 68   },  /* .. to Ch
dee0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 38 2c 20   */.  { 0x0428, 
def0: 20 30 78 35 33 2c 20 30 78 36 38 2c 20 30 78 30   0x53, 0x68, 0x0
df00: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
df10: a8 20 74 6f 20 53 68 20 2a 2f 0a 20 20 7b 20 30  . to Sh */.  { 0
df20: 78 30 34 32 39 2c 20 20 30 78 35 33 2c 20 30 78  x0429,  0x53, 0x
df30: 36 38 2c 20 30 78 36 33 2c 20 30 78 36 38 20 7d  68, 0x63, 0x68 }
df40: 2c 20 20 2f 2a 20 d0 a9 20 74 6f 20 53 68 63 68  ,  /* .. to Shch
df50: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 41 2c 20   */.  { 0x042A, 
df60: 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78 30   0x61, 0x00, 0x0
df70: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20  0, 0x00 },  /*  
df80: 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to A */.  { 0x04
df90: 32 42 2c 20 20 30 78 35 39 2c 20 30 78 30 30 2c  2B,  0x59, 0x00,
dfa0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
dfb0: 2f 2a 20 d0 ab 20 74 6f 20 59 20 2a 2f 0a 20 20  /* .. to Y */.  
dfc0: 7b 20 30 78 30 34 32 43 2c 20 20 30 78 35 39 2c  { 0x042C,  0x59,
dfd0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
dfe0: 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 59 20 2a  0 },  /*  to Y *
dff0: 2f 0a 20 20 7b 20 30 78 30 34 32 44 2c 20 20 30  /.  { 0x042D,  0
e000: 78 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x45, 0x00, 0x00,
e010: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ad 20   0x00 },  /* .. 
e020: 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to E */.  { 0x04
e030: 32 45 2c 20 20 30 78 34 39 2c 20 30 78 37 35 2c  2E,  0x49, 0x75,
e040: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e050: 2f 2a 20 d0 ae 20 74 6f 20 49 75 20 2a 2f 0a 20  /* .. to Iu */. 
e060: 20 7b 20 30 78 30 34 32 46 2c 20 20 30 78 34 39   { 0x042F,  0x49
e070: 2c 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78  , 0x61, 0x00, 0x
e080: 30 30 20 7d 2c 20 20 2f 2a 20 d0 af 20 74 6f 20  00 },  /* .. to 
e090: 49 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 30  Ia */.  { 0x0430
e0a0: 2c 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30  ,  0x61, 0x00, 0
e0b0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
e0c0: 20 d0 b0 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20   .. to a */.  { 
e0d0: 30 78 30 34 33 31 2c 20 20 30 78 36 32 2c 20 30  0x0431,  0x62, 0
e0e0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
e0f0: 7d 2c 20 20 2f 2a 20 d0 b1 20 74 6f 20 62 20 2a  },  /* .. to b *
e100: 2f 0a 20 20 7b 20 30 78 30 34 33 32 2c 20 20 30  /.  { 0x0432,  0
e110: 78 37 36 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x76, 0x00, 0x00,
e120: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b2 20   0x00 },  /* .. 
e130: 74 6f 20 76 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to v */.  { 0x04
e140: 33 33 2c 20 20 30 78 36 37 2c 20 30 78 30 30 2c  33,  0x67, 0x00,
e150: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e160: 2f 2a 20 d0 b3 20 74 6f 20 67 20 2a 2f 0a 20 20  /* .. to g */.  
e170: 7b 20 30 78 30 34 33 34 2c 20 20 30 78 36 34 2c  { 0x0434,  0x64,
e180: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
e190: 30 20 7d 2c 20 20 2f 2a 20 d0 b4 20 74 6f 20 64  0 },  /* .. to d
e1a0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 35 2c 20   */.  { 0x0435, 
e1b0: 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30   0x65, 0x00, 0x0
e1c0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
e1d0: b5 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
e1e0: 30 34 33 36 2c 20 20 30 78 37 61 2c 20 30 78 36  0436,  0x7a, 0x6
e1f0: 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  8, 0x00, 0x00 },
e200: 20 20 2f 2a 20 d0 b6 20 74 6f 20 7a 68 20 2a 2f    /* .. to zh */
e210: 0a 20 20 7b 20 30 78 30 34 33 37 2c 20 20 30 78  .  { 0x0437,  0x
e220: 37 61 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  7a, 0x00, 0x00, 
e230: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b7 20 74  0x00 },  /* .. t
e240: 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33  o z */.  { 0x043
e250: 38 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c 20  8,  0x69, 0x00, 
e260: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
e270: 2a 20 d0 b8 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
e280: 20 30 78 30 34 33 39 2c 20 20 30 78 36 39 2c 20   0x0439,  0x69, 
e290: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
e2a0: 20 7d 2c 20 20 2f 2a 20 d0 b9 20 74 6f 20 69 20   },  /* .. to i 
e2b0: 2a 2f 0a 20 20 7b 20 30 78 30 34 33 41 2c 20 20  */.  { 0x043A,  
e2c0: 30 78 36 62 2c 20 30 78 30 30 2c 20 30 78 30 30  0x6b, 0x00, 0x00
e2d0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ba  , 0x00 },  /* ..
e2e0: 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30   to k */.  { 0x0
e2f0: 34 33 42 2c 20 20 30 78 36 63 2c 20 30 78 30 30  43B,  0x6c, 0x00
e300: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
e310: 20 2f 2a 20 d0 bb 20 74 6f 20 6c 20 2a 2f 0a 20   /* .. to l */. 
e320: 20 7b 20 30 78 30 34 33 43 2c 20 20 30 78 36 64   { 0x043C,  0x6d
e330: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
e340: 30 30 20 7d 2c 20 20 2f 2a 20 d0 bc 20 74 6f 20  00 },  /* .. to 
e350: 6d 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 44 2c  m */.  { 0x043D,
e360: 20 20 30 78 36 65 2c 20 30 78 30 30 2c 20 30 78    0x6e, 0x00, 0x
e370: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
e380: d0 bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30  .. to n */.  { 0
e390: 78 30 34 33 45 2c 20 20 30 78 36 66 2c 20 30 78  x043E,  0x6f, 0x
e3a0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
e3b0: 2c 20 20 2f 2a 20 d0 be 20 74 6f 20 6f 20 2a 2f  ,  /* .. to o */
e3c0: 0a 20 20 7b 20 30 78 30 34 33 46 2c 20 20 30 78  .  { 0x043F,  0x
e3d0: 37 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  70, 0x00, 0x00, 
e3e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bf 20 74  0x00 },  /* .. t
e3f0: 6f 20 70 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34  o p */.  { 0x044
e400: 30 2c 20 20 30 78 37 32 2c 20 30 78 30 30 2c 20  0,  0x72, 0x00, 
e410: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
e420: 2a 20 d1 80 20 74 6f 20 72 20 2a 2f 0a 20 20 7b  * .. to r */.  {
e430: 20 30 78 30 34 34 31 2c 20 20 30 78 37 33 2c 20   0x0441,  0x73, 
e440: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
e450: 20 7d 2c 20 20 2f 2a 20 d1 81 20 74 6f 20 73 20   },  /* .. to s 
e460: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 32 2c 20 20  */.  { 0x0442,  
e470: 30 78 37 34 2c 20 30 78 30 30 2c 20 30 78 30 30  0x74, 0x00, 0x00
e480: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 82  , 0x00 },  /* ..
e490: 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30   to t */.  { 0x0
e4a0: 34 34 33 2c 20 20 30 78 37 35 2c 20 30 78 30 30  443,  0x75, 0x00
e4b0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
e4c0: 20 2f 2a 20 d1 83 20 74 6f 20 75 20 2a 2f 0a 20   /* .. to u */. 
e4d0: 20 7b 20 30 78 30 34 34 34 2c 20 20 30 78 36 36   { 0x0444,  0x66
e4e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
e4f0: 30 30 20 7d 2c 20 20 2f 2a 20 d1 84 20 74 6f 20  00 },  /* .. to 
e500: 66 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 35 2c  f */.  { 0x0445,
e510: 20 20 30 78 36 62 2c 20 30 78 36 38 2c 20 30 78    0x6b, 0x68, 0x
e520: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
e530: d1 85 20 74 6f 20 6b 68 20 2a 2f 0a 20 20 7b 20  .. to kh */.  { 
e540: 30 78 30 34 34 36 2c 20 20 30 78 37 34 2c 20 30  0x0446,  0x74, 0
e550: 78 36 33 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x63, 0x00, 0x00 
e560: 7d 2c 20 20 2f 2a 20 d1 86 20 74 6f 20 74 63 20  },  /* .. to tc 
e570: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 37 2c 20 20  */.  { 0x0447,  
e580: 30 78 36 33 2c 20 30 78 36 38 2c 20 30 78 30 30  0x63, 0x68, 0x00
e590: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 87  , 0x00 },  /* ..
e5a0: 20 74 6f 20 63 68 20 2a 2f 0a 20 20 7b 20 30 78   to ch */.  { 0x
e5b0: 30 34 34 38 2c 20 20 30 78 37 33 2c 20 30 78 36  0448,  0x73, 0x6
e5c0: 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  8, 0x00, 0x00 },
e5d0: 20 20 2f 2a 20 d1 88 20 74 6f 20 73 68 20 2a 2f    /* .. to sh */
e5e0: 0a 20 20 7b 20 30 78 30 34 34 39 2c 20 20 30 78  .  { 0x0449,  0x
e5f0: 37 33 2c 20 30 78 36 38 2c 20 30 78 36 33 2c 20  73, 0x68, 0x63, 
e600: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d1 89 20 74  0x68 },  /* .. t
e610: 6f 20 73 68 63 68 20 2a 2f 0a 20 20 7b 20 30 78  o shch */.  { 0x
e620: 30 34 34 41 2c 20 20 30 78 36 31 2c 20 30 78 30  044A,  0x61, 0x0
e630: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
e640: 20 20 2f 2a 20 20 74 6f 20 61 20 2a 2f 0a 20 20    /*  to a */.  
e650: 7b 20 30 78 30 34 34 42 2c 20 20 30 78 37 39 2c  { 0x044B,  0x79,
e660: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
e670: 30 20 7d 2c 20 20 2f 2a 20 d1 8b 20 74 6f 20 79  0 },  /* .. to y
e680: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 43 2c 20   */.  { 0x044C, 
e690: 20 30 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30   0x79, 0x00, 0x0
e6a0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20  0, 0x00 },  /*  
e6b0: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to y */.  { 0x04
e6c0: 34 44 2c 20 20 30 78 36 35 2c 20 30 78 30 30 2c  4D,  0x65, 0x00,
e6d0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e6e0: 2f 2a 20 d1 8d 20 74 6f 20 65 20 2a 2f 0a 20 20  /* .. to e */.  
e6f0: 7b 20 30 78 30 34 34 45 2c 20 20 30 78 36 39 2c  { 0x044E,  0x69,
e700: 20 30 78 37 35 2c 20 30 78 30 30 2c 20 30 78 30   0x75, 0x00, 0x0
e710: 30 20 7d 2c 20 20 2f 2a 20 d1 8e 20 74 6f 20 69  0 },  /* .. to i
e720: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 46 2c  u */.  { 0x044F,
e730: 20 20 30 78 36 39 2c 20 30 78 36 31 2c 20 30 78    0x69, 0x61, 0x
e740: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
e750: d1 8f 20 74 6f 20 69 61 20 2a 2f 0a 20 20 7b 20  .. to ia */.  { 
e760: 30 78 30 34 35 30 2c 20 20 30 78 36 35 2c 20 30  0x0450,  0x65, 0
e770: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
e780: 7d 2c 20 20 2f 2a 20 d1 90 20 74 6f 20 65 20 2a  },  /* .. to e *
e790: 2f 0a 20 20 7b 20 30 78 30 34 35 31 2c 20 20 30  /.  { 0x0451,  0
e7a0: 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x65, 0x00, 0x00,
e7b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 91 20   0x00 },  /* .. 
e7c0: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to e */.  { 0x04
e7d0: 35 32 2c 20 20 30 78 36 34 2c 20 30 78 30 30 2c  52,  0x64, 0x00,
e7e0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e7f0: 2f 2a 20 d1 92 20 74 6f 20 64 20 2a 2f 0a 20 20  /* .. to d */.  
e800: 7b 20 30 78 30 34 35 33 2c 20 20 30 78 36 37 2c  { 0x0453,  0x67,
e810: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
e820: 30 20 7d 2c 20 20 2f 2a 20 d1 93 20 74 6f 20 67  0 },  /* .. to g
e830: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 34 2c 20   */.  { 0x0454, 
e840: 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30   0x65, 0x00, 0x0
e850: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  0, 0x00 },  /* .
e860: 94 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
e870: 30 34 35 35 2c 20 20 30 78 37 61 2c 20 30 78 30  0455,  0x7a, 0x0
e880: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
e890: 20 20 2f 2a 20 d1 95 20 74 6f 20 7a 20 2a 2f 0a    /* .. to z */.
e8a0: 20 20 7b 20 30 78 30 34 35 36 2c 20 20 30 78 36    { 0x0456,  0x6
e8b0: 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  9, 0x00, 0x00, 0
e8c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 96 20 74 6f  x00 },  /* .. to
e8d0: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 37   i */.  { 0x0457
e8e0: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30  ,  0x69, 0x00, 0
e8f0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
e900: 20 d1 97 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
e910: 30 78 30 34 35 38 2c 20 20 30 78 36 61 2c 20 30  0x0458,  0x6a, 0
e920: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
e930: 7d 2c 20 20 2f 2a 20 d1 98 20 74 6f 20 6a 20 2a  },  /* .. to j *
e940: 2f 0a 20 20 7b 20 30 78 30 34 35 39 2c 20 20 30  /.  { 0x0459,  0
e950: 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x69, 0x00, 0x00,
e960: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 99 20   0x00 },  /* .. 
e970: 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to i */.  { 0x04
e980: 35 41 2c 20 20 30 78 36 65 2c 20 30 78 30 30 2c  5A,  0x6e, 0x00,
e990: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e9a0: 2f 2a 20 d1 9a 20 74 6f 20 6e 20 2a 2f 0a 20 20  /* .. to n */.  
e9b0: 7b 20 30 78 30 34 35 42 2c 20 20 30 78 36 34 2c  { 0x045B,  0x64,
e9c0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
e9d0: 30 20 7d 2c 20 20 2f 2a 20 d1 9b 20 74 6f 20 64  0 },  /* .. to d
e9e0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 43 2c 20   */.  { 0x045C, 
e9f0: 20 30 78 36 62 2c 20 30 78 30 30 2c 20 30 78 30   0x6b, 0x00, 0x0
ea00: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  0, 0x00 },  /* .
ea10: 9c 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78  . to k */.  { 0x
ea20: 30 34 35 44 2c 20 20 30 78 36 39 2c 20 30 78 30  045D,  0x69, 0x0
ea30: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
ea40: 20 20 2f 2a 20 d1 9d 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
ea50: 20 20 7b 20 30 78 30 34 35 45 2c 20 20 30 78 37    { 0x045E,  0x7
ea60: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
ea70: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9e 20 74 6f  x00 },  /* .. to
ea80: 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 46   u */.  { 0x045F
ea90: 2c 20 20 30 78 36 34 2c 20 30 78 30 30 2c 20 30  ,  0x64, 0x00, 0
eaa0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
eab0: 20 d1 9f 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20   .. to d */.  { 
eac0: 30 78 31 45 30 32 2c 20 20 30 78 34 32 2c 20 30  0x1E02,  0x42, 0
ead0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
eae0: 7d 2c 20 20 2f 2a 20 e1 b8 82 20 74 6f 20 42 20  },  /* ... to B 
eaf0: 2a 2f 0a 20 20 7b 20 30 78 31 45 30 33 2c 20 20  */.  { 0x1E03,  
eb00: 30 78 36 32 2c 20 30 78 30 30 2c 20 30 78 30 30  0x62, 0x00, 0x00
eb10: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8  , 0x00 },  /* ..
eb20: 83 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78  . to b */.  { 0x
eb30: 31 45 30 41 2c 20 20 30 78 34 34 2c 20 30 78 30  1E0A,  0x44, 0x0
eb40: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
eb50: 20 20 2f 2a 20 e1 b8 8a 20 74 6f 20 44 20 2a 2f    /* ... to D */
eb60: 0a 20 20 7b 20 30 78 31 45 30 42 2c 20 20 30 78  .  { 0x1E0B,  0x
eb70: 36 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  64, 0x00, 0x00, 
eb80: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 8b 20  0x00 },  /* ... 
eb90: 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to d */.  { 0x1E
eba0: 31 45 2c 20 20 30 78 34 36 2c 20 30 78 30 30 2c  1E,  0x46, 0x00,
ebb0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
ebc0: 2f 2a 20 e1 b8 9e 20 74 6f 20 46 20 2a 2f 0a 20  /* ... to F */. 
ebd0: 20 7b 20 30 78 31 45 31 46 2c 20 20 30 78 36 36   { 0x1E1F,  0x66
ebe0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
ebf0: 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 9f 20 74 6f  00 },  /* ... to
ec00: 20 66 20 2a 2f 0a 20 20 7b 20 30 78 31 45 34 30   f */.  { 0x1E40
ec10: 2c 20 20 30 78 34 44 2c 20 30 78 30 30 2c 20 30  ,  0x4D, 0x00, 0
ec20: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
ec30: 20 e1 b9 80 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b   ... to M */.  {
ec40: 20 30 78 31 45 34 31 2c 20 20 30 78 36 44 2c 20   0x1E41,  0x6D, 
ec50: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
ec60: 20 7d 2c 20 20 2f 2a 20 e1 b9 81 20 74 6f 20 6d   },  /* ... to m
ec70: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 35 36 2c 20   */.  { 0x1E56, 
ec80: 20 30 78 35 30 2c 20 30 78 30 30 2c 20 30 78 30   0x50, 0x00, 0x0
ec90: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  0, 0x00 },  /* .
eca0: b9 96 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30  .. to P */.  { 0
ecb0: 78 31 45 35 37 2c 20 20 30 78 37 30 2c 20 30 78  x1E57,  0x70, 0x
ecc0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
ecd0: 2c 20 20 2f 2a 20 e1 b9 97 20 74 6f 20 70 20 2a  ,  /* ... to p *
ece0: 2f 0a 20 20 7b 20 30 78 31 45 36 30 2c 20 20 30  /.  { 0x1E60,  0
ecf0: 78 35 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x53, 0x00, 0x00,
ed00: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 a0   0x00 },  /* ...
ed10: 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 31   to S */.  { 0x1
ed20: 45 36 31 2c 20 20 30 78 37 33 2c 20 30 78 30 30  E61,  0x73, 0x00
ed30: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
ed40: 20 2f 2a 20 e1 b9 a1 20 74 6f 20 73 20 2a 2f 0a   /* ... to s */.
ed50: 20 20 7b 20 30 78 31 45 36 41 2c 20 20 30 78 35    { 0x1E6A,  0x5
ed60: 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  4, 0x00, 0x00, 0
ed70: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 aa 20 74  x00 },  /* ... t
ed80: 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36  o T */.  { 0x1E6
ed90: 42 2c 20 20 30 78 37 34 2c 20 30 78 30 30 2c 20  B,  0x74, 0x00, 
eda0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
edb0: 2a 20 e1 b9 ab 20 74 6f 20 74 20 2a 2f 0a 20 20  * ... to t */.  
edc0: 7b 20 30 78 31 45 38 30 2c 20 20 30 78 35 37 2c  { 0x1E80,  0x57,
edd0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
ede0: 30 20 7d 2c 20 20 2f 2a 20 e1 ba 80 20 74 6f 20  0 },  /* ... to 
edf0: 57 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 31 2c  W */.  { 0x1E81,
ee00: 20 20 30 78 37 37 2c 20 30 78 30 30 2c 20 30 78    0x77, 0x00, 0x
ee10: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
ee20: e1 ba 81 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20  ... to w */.  { 
ee30: 30 78 31 45 38 32 2c 20 20 30 78 35 37 2c 20 30  0x1E82,  0x57, 0
ee40: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
ee50: 7d 2c 20 20 2f 2a 20 e1 ba 82 20 74 6f 20 57 20  },  /* ... to W 
ee60: 2a 2f 0a 20 20 7b 20 30 78 31 45 38 33 2c 20 20  */.  { 0x1E83,  
ee70: 30 78 37 37 2c 20 30 78 30 30 2c 20 30 78 30 30  0x77, 0x00, 0x00
ee80: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba  , 0x00 },  /* ..
ee90: 83 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78  . to w */.  { 0x
eea0: 31 45 38 34 2c 20 20 30 78 35 37 2c 20 30 78 30  1E84,  0x57, 0x0
eeb0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
eec0: 20 20 2f 2a 20 e1 ba 84 20 74 6f 20 57 20 2a 2f    /* ... to W */
eed0: 0a 20 20 7b 20 30 78 31 45 38 35 2c 20 20 30 78  .  { 0x1E85,  0x
eee0: 37 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  77, 0x00, 0x00, 
eef0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 85 20  0x00 },  /* ... 
ef00: 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to w */.  { 0x1E
ef10: 46 32 2c 20 20 30 78 35 39 2c 20 30 78 30 30 2c  F2,  0x59, 0x00,
ef20: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
ef30: 2f 2a 20 e1 bb b2 20 74 6f 20 59 20 2a 2f 0a 20  /* ... to Y */. 
ef40: 20 7b 20 30 78 31 45 46 33 2c 20 20 30 78 37 39   { 0x1EF3,  0x79
ef50: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
ef60: 30 30 20 7d 2c 20 20 2f 2a 20 e1 bb b3 20 74 6f  00 },  /* ... to
ef70: 20 79 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 30   y */.  { 0xFB00
ef80: 2c 20 20 30 78 36 36 2c 20 30 78 36 36 2c 20 30  ,  0x66, 0x66, 0
ef90: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
efa0: 20 ef ac 80 20 74 6f 20 66 66 20 2a 2f 0a 20 20   ... to ff */.  
efb0: 7b 20 30 78 46 42 30 31 2c 20 20 30 78 36 36 2c  { 0xFB01,  0x66,
efc0: 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30   0x69, 0x00, 0x0
efd0: 30 20 7d 2c 20 20 2f 2a 20 ef ac 81 20 74 6f 20  0 },  /* ... to 
efe0: 66 69 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 32  fi */.  { 0xFB02
eff0: 2c 20 20 30 78 36 36 2c 20 30 78 36 43 2c 20 30  ,  0x66, 0x6C, 0
f000: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
f010: 20 ef ac 82 20 74 6f 20 66 6c 20 2a 2f 0a 20 20   ... to fl */.  
f020: 7b 20 30 78 46 42 30 35 2c 20 20 30 78 37 33 2c  { 0xFB05,  0x73,
f030: 20 30 78 37 34 2c 20 30 78 30 30 2c 20 30 78 30   0x74, 0x00, 0x0
f040: 30 20 7d 2c 20 20 2f 2a 20 ef ac 85 20 74 6f 20  0 },  /* ... to 
f050: 73 74 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 36  st */.  { 0xFB06
f060: 2c 20 20 30 78 37 33 2c 20 30 78 37 34 2c 20 30  ,  0x73, 0x74, 0
f070: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
f080: 20 ef ac 86 20 74 6f 20 73 74 20 2a 2f 0a 7d 3b   ... to st */.};
f090: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54  ..static const T
f0a0: 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 2a  ransliteration *
f0b0: 73 70 65 6c 6c 66 69 78 46 69 6e 64 54 72 61 6e  spellfixFindTran
f0c0: 73 6c 69 74 28 69 6e 74 20 63 2c 20 69 6e 74 20  slit(int c, int 
f0d0: 2a 70 78 54 6f 70 29 7b 0a 20 20 2a 70 78 54 6f  *pxTop){.  *pxTo
f0e0: 70 20 3d 20 28 73 69 7a 65 6f 66 28 74 72 61 6e  p = (sizeof(tran
f0f0: 73 6c 69 74 29 2f 73 69 7a 65 6f 66 28 74 72 61  slit)/sizeof(tra
f100: 6e 73 6c 69 74 5b 30 5d 29 29 20 2d 20 31 3b 0a  nslit[0])) - 1;.
f110: 20 20 72 65 74 75 72 6e 20 74 72 61 6e 73 6c 69    return transli
f120: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  t;.}../*.** Conv
f130: 65 72 74 20 74 68 65 20 69 6e 70 75 74 20 73 74  ert the input st
f140: 72 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38 20  ring from UTF-8 
f150: 69 6e 74 6f 20 70 75 72 65 20 41 53 43 49 49 20  into pure ASCII 
f160: 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 2a 2a  by converting.**
f170: 20 61 6c 6c 20 6e 6f 6e 2d 41 53 43 49 49 20 63   all non-ASCII c
f180: 68 61 72 61 63 74 65 72 73 20 74 6f 20 73 6f 6d  haracters to som
f190: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
f1a0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
f1b0: 68 65 0a 2a 2a 20 41 53 43 49 49 20 73 75 62 73  he.** ASCII subs
f1c0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  et..**.** The re
f1d0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 6d 69  turned string mi
f1e0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65  ght contain more
f1f0: 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 6e   characters than
f200: 20 74 68 65 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a   the input..**.*
f210: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
f220: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
f230: 69 6e 67 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  ing comes from s
f240: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
f250: 61 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65  and.** should be
f260: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
f270: 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
f280: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
f290: 72 61 6e 73 6c 69 74 65 72 61 74 65 28 63 6f 6e  ransliterate(con
f2a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
f2b0: 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b   *zIn, int nIn){
f2c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
f2d0: 50 45 4c 4c 46 49 58 5f 35 42 59 54 45 5f 4d 41  PELLFIX_5BYTE_MA
f2e0: 50 50 49 4e 47 53 0a 20 20 75 6e 73 69 67 6e 65  PPINGS.  unsigne
f2f0: 64 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73  d char *zOut = s
f300: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
f310: 20 6e 49 6e 2a 35 20 2b 20 31 20 29 3b 0a 23 65   nIn*5 + 1 );.#e
f320: 6c 73 65 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  lse.  unsigned c
f330: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
f340: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49  te3_malloc64( nI
f350: 6e 2a 34 20 2b 20 31 20 29 3b 0a 23 65 6e 64 69  n*4 + 1 );.#endi
f360: 66 0a 20 20 69 6e 74 20 63 2c 20 73 7a 2c 20 6e  f.  int c, sz, n
f370: 4f 75 74 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d  Out;.  if( zOut=
f380: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
f390: 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 77 68 69   nOut = 0;.  whi
f3a0: 6c 65 28 20 6e 49 6e 3e 30 20 29 7b 0a 20 20 20  le( nIn>0 ){.   
f3b0: 20 63 20 3d 20 75 74 66 38 52 65 61 64 28 7a 49   c = utf8Read(zI
f3c0: 6e 2c 20 6e 49 6e 2c 20 26 73 7a 29 3b 0a 20 20  n, nIn, &sz);.  
f3d0: 20 20 7a 49 6e 20 2b 3d 20 73 7a 3b 0a 20 20 20    zIn += sz;.   
f3e0: 20 6e 49 6e 20 2d 3d 20 73 7a 3b 0a 20 20 20 20   nIn -= sz;.    
f3f0: 69 66 28 20 63 3c 3d 31 32 37 20 29 7b 0a 20 20  if( c<=127 ){.  
f400: 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d      zOut[nOut++]
f410: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
f420: 72 29 63 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  r)c;.    }else{.
f430: 20 20 20 20 20 20 69 6e 74 20 78 54 6f 70 2c 20        int xTop, 
f440: 78 42 74 6d 2c 20 78 3b 0a 20 20 20 20 20 20 63  xBtm, x;.      c
f450: 6f 6e 73 74 20 54 72 61 6e 73 6c 69 74 65 72 61  onst Translitera
f460: 74 69 6f 6e 20 2a 74 62 6c 20 3d 20 73 70 65 6c  tion *tbl = spel
f470: 6c 66 69 78 46 69 6e 64 54 72 61 6e 73 6c 69 74  lfixFindTranslit
f480: 28 63 2c 20 26 78 54 6f 70 29 3b 0a 20 20 20 20  (c, &xTop);.    
f490: 20 20 78 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20    xBtm = 0;.    
f4a0: 20 20 77 68 69 6c 65 28 20 78 54 6f 70 3e 3d 78    while( xTop>=x
f4b0: 42 74 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 78  Btm ){.        x
f4c0: 20 3d 20 28 78 54 6f 70 20 2b 20 78 42 74 6d 29   = (xTop + xBtm)
f4d0: 2f 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  /2;.        if( 
f4e0: 74 62 6c 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20  tbl[x].cFrom==c 
f4f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75  ){.          zOu
f500: 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 62 6c 5b  t[nOut++] = tbl[
f510: 78 5d 2e 63 54 6f 30 3b 0a 20 20 20 20 20 20 20  x].cTo0;.       
f520: 20 20 20 69 66 28 20 74 62 6c 5b 78 5d 2e 63 54     if( tbl[x].cT
f530: 6f 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o1 ){.          
f540: 20 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d    zOut[nOut++] =
f550: 20 74 62 6c 5b 78 5d 2e 63 54 6f 31 3b 0a 20 20   tbl[x].cTo1;.  
f560: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74 62            if( tb
f570: 6c 5b 78 5d 2e 63 54 6f 32 20 29 7b 0a 20 20 20  l[x].cTo2 ){.   
f580: 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b             zOut[
f590: 6e 4f 75 74 2b 2b 5d 20 3d 20 74 62 6c 5b 78 5d  nOut++] = tbl[x]
f5a0: 2e 63 54 6f 32 3b 0a 20 20 20 20 20 20 20 20 20  .cTo2;.         
f5b0: 20 20 20 20 20 69 66 28 20 74 62 6c 5b 78 5d 2e       if( tbl[x].
f5c0: 63 54 6f 33 20 29 7b 0a 20 20 20 20 20 20 20 20  cTo3 ){.        
f5d0: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f 75          zOut[nOu
f5e0: 74 2b 2b 5d 20 3d 20 74 62 6c 5b 78 5d 2e 63 54  t++] = tbl[x].cT
f5f0: 6f 33 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  o3;.#ifdef SQLIT
f600: 45 5f 53 50 45 4c 4c 46 49 58 5f 35 42 59 54 45  E_SPELLFIX_5BYTE
f610: 5f 4d 41 50 50 49 4e 47 53 0a 20 20 20 20 20 20  _MAPPINGS.      
f620: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74 62            if( tb
f630: 6c 5b 78 5d 2e 63 54 6f 34 20 29 7b 0a 20 20 20  l[x].cTo4 ){.   
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
f650: 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 62  Out[nOut++] = tb
f660: 6c 5b 78 5d 2e 63 54 6f 34 3b 0a 20 20 20 20 20  l[x].cTo4;.     
f670: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e             }.#en
f680: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 50  dif /* SQLITE_SP
f690: 45 4c 4c 46 49 58 5f 35 42 59 54 45 5f 4d 41 50  ELLFIX_5BYTE_MAP
f6a0: 50 49 4e 47 53 20 2a 2f 0a 20 20 20 20 20 20 20  PINGS */.       
f6b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f6c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f6d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
f6e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
f6f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
f700: 73 65 20 69 66 28 20 74 62 6c 5b 78 5d 2e 63 46  se if( tbl[x].cF
f710: 72 6f 6d 3e 63 20 29 7b 0a 20 20 20 20 20 20 20  rom>c ){.       
f720: 20 20 20 78 54 6f 70 20 3d 20 78 2d 31 3b 0a 20     xTop = x-1;. 
f730: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f740: 20 20 20 20 20 20 20 20 78 42 74 6d 20 3d 20 78          xBtm = x
f750: 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
f760: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f770: 63 20 29 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d  c ) zOut[nOut++]
f780: 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20   = '?';.    }.  
f790: 7d 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 5d 20 3d  }.  zOut[nOut] =
f7a0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75   0;.  return zOu
f7b0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
f7c0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
f7d0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
f7e0: 68 65 20 73 68 6f 72 74 65 73 74 20 70 72 65 66  he shortest pref
f7f0: 69 78 20 6f 66 20 74 68 65 20 69 6e 70 75 74 0a  ix of the input.
f800: 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 74  ** string that t
f810: 72 61 6e 73 6c 69 74 65 72 61 74 65 73 20 74 6f  ransliterates to
f820: 20 61 6e 20 41 53 43 49 49 20 73 74 72 69 6e 67   an ASCII string
f830: 20 6e 54 72 61 6e 73 20 62 79 74 65 73 20 6f 72   nTrans bytes or
f840: 20 6c 6f 6e 67 65 72 2e 0a 2a 2a 20 4f 72 2c 20   longer..** Or, 
f850: 69 66 20 74 68 65 20 74 72 61 6e 73 6c 69 74 65  if the translite
f860: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e  ration of the in
f870: 70 75 74 20 73 74 72 69 6e 67 20 69 73 20 6c 65  put string is le
f880: 73 73 20 74 68 61 6e 20 6e 54 72 61 6e 73 0a 2a  ss than nTrans.*
f890: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
f8a0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   return the numb
f8b0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
f8c0: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74   in the input st
f8d0: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
f8e0: 69 6e 74 20 74 72 61 6e 73 6c 65 6e 5f 74 6f 5f  int translen_to_
f8f0: 63 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  charlen(const ch
f900: 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *zIn, int nIn
f910: 2c 20 69 6e 74 20 6e 54 72 61 6e 73 29 7b 0a 20  , int nTrans){. 
f920: 20 69 6e 74 20 69 2c 20 63 2c 20 73 7a 2c 20 6e   int i, c, sz, n
f930: 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 43 68 61 72  Out;.  int nChar
f940: 3b 0a 0a 20 20 69 20 3d 20 6e 4f 75 74 20 3d 20  ;..  i = nOut = 
f950: 30 3b 0a 20 20 66 6f 72 28 6e 43 68 61 72 3d 30  0;.  for(nChar=0
f960: 3b 20 69 3c 6e 49 6e 20 26 26 20 6e 4f 75 74 3c  ; i<nIn && nOut<
f970: 6e 54 72 61 6e 73 3b 20 6e 43 68 61 72 2b 2b 29  nTrans; nChar++)
f980: 7b 0a 20 20 20 20 63 20 3d 20 75 74 66 38 52 65  {.    c = utf8Re
f990: 61 64 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ad((const unsign
f9a0: 65 64 20 63 68 61 72 20 2a 29 26 7a 49 6e 5b 69  ed char *)&zIn[i
f9b0: 5d 2c 20 6e 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a  ], nIn-i, &sz);.
f9c0: 20 20 20 20 69 20 2b 3d 20 73 7a 3b 0a 0a 20 20      i += sz;..  
f9d0: 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 69 66    nOut++;.    if
f9e0: 28 20 63 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20  ( c>=128 ){.    
f9f0: 20 20 69 6e 74 20 78 54 6f 70 2c 20 78 42 74 6d    int xTop, xBtm
fa00: 2c 20 78 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  , x;.      const
fa10: 20 54 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e   Transliteration
fa20: 20 2a 74 62 6c 20 3d 20 73 70 65 6c 6c 66 69 78   *tbl = spellfix
fa30: 46 69 6e 64 54 72 61 6e 73 6c 69 74 28 63 2c 20  FindTranslit(c, 
fa40: 26 78 54 6f 70 29 3b 0a 20 20 20 20 20 20 78 42  &xTop);.      xB
fa50: 74 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  tm = 0;.      wh
fa60: 69 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20  ile( xTop>=xBtm 
fa70: 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28  ){.        x = (
fa80: 78 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a  xTop + xBtm)/2;.
fa90: 20 20 20 20 20 20 20 20 69 66 28 20 74 62 6c 5b          if( tbl[
faa0: 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20 29 7b 0a 20  x].cFrom==c ){. 
fab0: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 62 6c           if( tbl
fac0: 5b 78 5d 2e 63 54 6f 31 20 29 7b 0a 20 20 20 20  [x].cTo1 ){.    
fad0: 20 20 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a          nOut++;.
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
faf0: 74 62 6c 5b 78 5d 2e 63 54 6f 32 20 29 7b 0a 20  tbl[x].cTo2 ){. 
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4f 75               nOu
fb10: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
fb20: 20 20 20 69 66 28 20 74 62 6c 5b 78 5d 2e 63 54     if( tbl[x].cT
fb30: 6f 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o3 ){.          
fb40: 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20        nOut++;.  
fb50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
fb60: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
fb70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fb80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
fb90: 20 7d 65 6c 73 65 20 69 66 28 20 74 62 6c 5b 78   }else if( tbl[x
fba0: 5d 2e 63 46 72 6f 6d 3e 63 20 29 7b 0a 20 20 20  ].cFrom>c ){.   
fbb0: 20 20 20 20 20 20 20 78 54 6f 70 20 3d 20 78 2d         xTop = x-
fbc0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
fbd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 42 74 6d  {.          xBtm
fbe0: 20 3d 20 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   = x+1;.        
fbf0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
fc00: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 43    }..  return nC
fc10: 68 61 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 20  har;.}.../*.**  
fc20: 20 20 73 70 65 6c 6c 66 69 78 31 5f 74 72 61 6e    spellfix1_tran
fc30: 73 6c 69 74 28 58 29 0a 2a 2a 0a 2a 2a 20 43 6f  slit(X).**.** Co
fc40: 6e 76 65 72 74 20 61 20 73 74 72 69 6e 67 20 74  nvert a string t
fc50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e  hat contains non
fc60: 2d 41 53 43 49 49 20 52 6f 6d 61 6e 20 63 68 61  -ASCII Roman cha
fc70: 72 61 63 74 65 72 73 20 69 6e 74 6f 20 0a 2a 2a  racters into .**
fc80: 20 70 75 72 65 20 41 53 43 49 49 2e 0a 2a 2f 0a   pure ASCII..*/.
fc90: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e  static void tran
fca0: 73 6c 69 74 65 72 61 74 65 53 71 6c 46 75 6e 63  sliterateSqlFunc
fcb0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
fcc0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
fcd0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
fce0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
fcf0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
fd00: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d  gned char *zIn =
fd10: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
fd20: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
fd30: 69 6e 74 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65  int nIn = sqlite
fd40: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
fd50: 67 76 5b 30 5d 29 3b 0a 20 20 75 6e 73 69 67 6e  gv[0]);.  unsign
fd60: 65 64 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20  ed char *zOut = 
fd70: 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a 49  transliterate(zI
fd80: 6e 2c 20 6e 49 6e 29 3b 0a 20 20 69 66 28 20 7a  n, nIn);.  if( z
fd90: 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Out==0 ){.    sq
fda0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
fdb0: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
fdc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
fdd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
fde0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
fdf0: 61 72 2a 29 7a 4f 75 74 2c 20 2d 31 2c 20 73 71  ar*)zOut, -1, sq
fe00: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
fe10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70 65  .}../*.**    spe
fe20: 6c 6c 66 69 78 31 5f 73 63 72 69 70 74 63 6f 64  llfix1_scriptcod
fe30: 65 28 58 29 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74  e(X).**.** Try t
fe40: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
fe50: 64 6f 6d 69 6e 61 6e 74 20 73 63 72 69 70 74 20  dominant script 
fe60: 75 73 65 64 20 62 79 20 74 68 65 20 77 6f 72 64  used by the word
fe70: 20 58 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a   X and return.**
fe80: 20 69 74 73 20 49 53 4f 20 31 35 39 32 34 20 6e   its ISO 15924 n
fe90: 75 6d 65 72 69 63 20 63 6f 64 65 2e 0a 2a 2a 0a  umeric code..**.
fea0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
feb0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e  mplementation on
fec0: 6c 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74  ly understands t
fed0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 72  he following scr
fee0: 69 70 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 32  ipts:.**.**    2
fef0: 31 35 20 20 28 4c 61 74 69 6e 29 0a 2a 2a 20 20  15  (Latin).**  
ff00: 20 20 32 32 30 20 20 28 43 79 72 69 6c 6c 69 63    220  (Cyrillic
ff10: 29 0a 2a 2a 20 20 20 20 32 30 30 20 20 28 47 72  ).**    200  (Gr
ff20: 65 65 6b 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  eek).**.** This 
ff30: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
ff40: 75 72 6e 20 39 39 38 20 69 66 20 74 68 65 20 69  urn 998 if the i
ff50: 6e 70 75 74 20 58 20 63 6f 6e 74 61 69 6e 73 20  nput X contains 
ff60: 63 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d 0a  characters from.
ff70: 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f  ** two or more o
ff80: 66 20 74 68 65 20 61 62 6f 76 65 20 73 63 72 69  f the above scri
ff90: 70 74 73 20 6f 72 20 39 39 39 20 69 66 20 58 20  pts or 999 if X 
ffa0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 68 61 72  contains no char
ffb0: 61 63 74 65 72 73 0a 2a 2a 20 66 72 6f 6d 20 61  acters.** from a
ffc0: 6e 79 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ny of the above 
ffd0: 73 63 72 69 70 74 73 2e 0a 2a 2f 0a 73 74 61 74  scripts..*/.stat
ffe0: 69 63 20 76 6f 69 64 20 73 63 72 69 70 74 43 6f  ic void scriptCo
fff0: 64 65 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c  deSqlFunc(.  sql
10000 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
10010 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
10020 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
10030 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
10040 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10050 61 72 20 2a 7a 49 6e 20 3d 20 73 71 6c 69 74 65  ar *zIn = sqlite
10060 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
10070 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 49 6e  v[0]);.  int nIn
10080 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
10090 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
100a0 0a 20 20 69 6e 74 20 63 2c 20 73 7a 3b 0a 20 20  .  int c, sz;.  
100b0 69 6e 74 20 73 63 72 69 70 74 4d 61 73 6b 20 3d  int scriptMask =
100c0 20 30 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20   0;.  int res;. 
100d0 20 69 6e 74 20 73 65 65 6e 44 69 67 69 74 20 3d   int seenDigit =
100e0 20 30 3b 0a 23 20 64 65 66 69 6e 65 20 53 43 52   0;.# define SCR
100f0 49 50 54 5f 4c 41 54 49 4e 20 20 20 20 20 20 20  IPT_LATIN       
10100 30 78 30 30 30 31 0a 23 20 64 65 66 69 6e 65 20  0x0001.# define 
10110 53 43 52 49 50 54 5f 43 59 52 49 4c 4c 49 43 20  SCRIPT_CYRILLIC 
10120 20 20 20 30 78 30 30 30 32 0a 23 20 64 65 66 69     0x0002.# defi
10130 6e 65 20 53 43 52 49 50 54 5f 47 52 45 45 4b 20  ne SCRIPT_GREEK 
10140 20 20 20 20 20 20 30 78 30 30 30 34 0a 23 20 64        0x0004.# d
10150 65 66 69 6e 65 20 53 43 52 49 50 54 5f 48 45 42  efine SCRIPT_HEB
10160 52 45 57 20 20 20 20 20 20 30 78 30 30 30 38 0a  REW      0x0008.
10170 23 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f  # define SCRIPT_
10180 41 52 41 42 49 43 20 20 20 20 20 20 30 78 30 30  ARABIC      0x00
10190 31 30 0a 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e  10..  while( nIn
101a0 3e 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 75 74  >0 ){.    c = ut
101b0 66 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c  f8Read(zIn, nIn,
101c0 20 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b   &sz);.    zIn +
101d0 3d 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d  = sz;.    nIn -=
101e0 20 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c 30   sz;.    if( c<0
101f0 78 30 32 61 66 20 29 7b 0a 20 20 20 20 20 20 69  x02af ){.      i
10200 66 28 20 63 3e 3d 30 78 38 30 20 7c 7c 20 6d 69  f( c>=0x80 || mi
10210 64 43 6c 61 73 73 5b 63 26 30 78 37 66 5d 3c 43  dClass[c&0x7f]<C
10220 43 4c 41 53 53 5f 44 49 47 49 54 20 29 7b 0a 20  CLASS_DIGIT ){. 
10230 20 20 20 20 20 20 20 73 63 72 69 70 74 4d 61 73         scriptMas
10240 6b 20 7c 3d 20 53 43 52 49 50 54 5f 4c 41 54 49  k |= SCRIPT_LATI
10250 4e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  N;.      }else i
10260 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
10270 27 39 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73  '9' ){.        s
10280 65 65 6e 44 69 67 69 74 20 3d 20 31 3b 0a 20 20  eenDigit = 1;.  
10290 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
102a0 69 66 28 20 63 3e 3d 30 78 30 34 30 30 20 26 26  if( c>=0x0400 &&
102b0 20 63 3c 3d 30 78 30 34 66 66 20 29 7b 0a 20 20   c<=0x04ff ){.  
102c0 20 20 20 20 73 63 72 69 70 74 4d 61 73 6b 20 7c      scriptMask |
102d0 3d 20 53 43 52 49 50 54 5f 43 59 52 49 4c 4c 49  = SCRIPT_CYRILLI
102e0 43 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  C;.    }else if(
102f0 20 63 3e 3d 30 78 30 33 38 36 20 26 26 20 63 3c   c>=0x0386 && c<
10300 3d 30 78 30 33 63 65 20 29 7b 0a 20 20 20 20 20  =0x03ce ){.     
10310 20 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53   scriptMask |= S
10320 43 52 49 50 54 5f 47 52 45 45 4b 3b 0a 20 20 20  CRIPT_GREEK;.   
10330 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 30 78   }else if( c>=0x
10340 30 35 39 30 20 26 26 20 63 3c 3d 30 78 30 35 66  0590 && c<=0x05f
10350 66 20 29 7b 0a 20 20 20 20 20 20 73 63 72 69 70  f ){.      scrip
10360 74 4d 61 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f  tMask |= SCRIPT_
10370 48 45 42 52 45 57 3b 0a 20 20 20 20 7d 65 6c 73  HEBREW;.    }els
10380 65 20 69 66 28 20 63 3e 3d 30 78 30 36 30 30 20  e if( c>=0x0600 
10390 26 26 20 63 3c 3d 30 78 30 36 66 66 20 29 7b 0a  && c<=0x06ff ){.
103a0 20 20 20 20 20 20 73 63 72 69 70 74 4d 61 73 6b        scriptMask
103b0 20 7c 3d 20 53 43 52 49 50 54 5f 41 52 41 42 49   |= SCRIPT_ARABI
103c0 43 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  C;.    }.  }.  i
103d0 66 28 20 73 63 72 69 70 74 4d 61 73 6b 3d 3d 30  f( scriptMask==0
103e0 20 26 26 20 73 65 65 6e 44 69 67 69 74 20 29 20   && seenDigit ) 
103f0 73 63 72 69 70 74 4d 61 73 6b 20 3d 20 53 43 52  scriptMask = SCR
10400 49 50 54 5f 4c 41 54 49 4e 3b 0a 20 20 73 77 69  IPT_LATIN;.  swi
10410 74 63 68 28 20 73 63 72 69 70 74 4d 61 73 6b 20  tch( scriptMask 
10420 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 20 20  ){.    case 0:  
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
10440 73 20 3d 20 39 39 39 3b 20 62 72 65 61 6b 3b 0a  s = 999; break;.
10450 20 20 20 20 63 61 73 65 20 53 43 52 49 50 54 5f      case SCRIPT_
10460 4c 41 54 49 4e 3a 20 20 20 20 20 72 65 73 20 3d  LATIN:     res =
10470 20 32 31 35 3b 20 62 72 65 61 6b 3b 0a 20 20 20   215; break;.   
10480 20 63 61 73 65 20 53 43 52 49 50 54 5f 43 59 52   case SCRIPT_CYR
10490 49 4c 4c 49 43 3a 20 20 72 65 73 20 3d 20 32 32  ILLIC:  res = 22
104a0 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  0; break;.    ca
104b0 73 65 20 53 43 52 49 50 54 5f 47 52 45 45 4b 3a  se SCRIPT_GREEK:
104c0 20 20 20 20 20 72 65 73 20 3d 20 32 30 30 3b 20       res = 200; 
104d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
104e0 53 43 52 49 50 54 5f 48 45 42 52 45 57 3a 20 20  SCRIPT_HEBREW:  
104f0 20 20 72 65 73 20 3d 20 31 32 35 3b 20 62 72 65    res = 125; bre
10500 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 43 52  ak;.    case SCR
10510 49 50 54 5f 41 52 41 42 49 43 3a 20 20 20 20 72  IPT_ARABIC:    r
10520 65 73 20 3d 20 31 36 30 3b 20 62 72 65 61 6b 3b  es = 160; break;
10530 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
10540 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 20              res 
10550 3d 20 39 39 38 3b 20 62 72 65 61 6b 3b 0a 20 20  = 998; break;.  
10560 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
10570 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
10580 72 65 73 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20  res);.}../* End 
10590 74 72 61 6e 73 6c 69 74 65 72 61 74 65 0a 2a 2a  transliterate.**
105a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
105e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
105f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
10640 65 67 69 6e 20 73 70 65 6c 6c 66 69 78 31 20 76  egin spellfix1 v
10650 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f  irtual table..*/
10660 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e  ../* Maximum len
10670 67 74 68 20 6f 66 20 61 20 70 68 6f 6e 65 68 61  gth of a phoneha
10680 73 68 20 75 73 65 64 20 66 6f 72 20 71 75 65 72  sh used for quer
10690 79 69 6e 67 20 74 68 65 20 73 68 61 64 6f 77 20  ying the shadow 
106a0 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
106b0 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53   SPELLFIX_MX_HAS
106c0 48 20 20 33 32 0a 0a 2f 2a 20 4d 61 78 69 6d 75  H  32../* Maximu
106d0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 68 61 73 68  m number of hash
106e0 20 73 74 72 69 6e 67 73 20 74 6f 20 65 78 61 6d   strings to exam
106f0 69 6e 65 20 70 65 72 20 71 75 65 72 79 20 2a 2f  ine per query */
10700 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
10710 58 5f 4d 58 5f 52 55 4e 20 20 20 31 0a 0a 74 79  X_MX_RUN   1..ty
10720 70 65 64 65 66 20 73 74 72 75 63 74 20 73 70 65  pedef struct spe
10730 6c 6c 66 69 78 31 5f 76 74 61 62 20 73 70 65 6c  llfix1_vtab spel
10740 6c 66 69 78 31 5f 76 74 61 62 3b 0a 74 79 70 65  lfix1_vtab;.type
10750 64 65 66 20 73 74 72 75 63 74 20 73 70 65 6c 6c  def struct spell
10760 66 69 78 31 5f 63 75 72 73 6f 72 20 73 70 65 6c  fix1_cursor spel
10770 6c 66 69 78 31 5f 63 75 72 73 6f 72 3b 0a 0a 2f  lfix1_cursor;../
10780 2a 20 46 75 7a 7a 79 2d 73 65 61 72 63 68 20 76  * Fuzzy-search v
10790 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a  irtual table obj
107a0 65 63 74 20 2a 2f 0a 73 74 72 75 63 74 20 73 70  ect */.struct sp
107b0 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 7b 0a 20  ellfix1_vtab {. 
107c0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61   sqlite3_vtab ba
107d0 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42  se;         /* B
107e0 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74  ase class - must
107f0 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73   be first */.  s
10800 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
10810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
10820 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10830 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 4e   */.  char *zDbN
10840 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
10850 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61   /* Name of data
10860 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 69  base holding thi
10870 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61  s table */.  cha
10880 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 3b 20 20  r *zTableName;  
10890 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
108a0 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
108b0 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  able */.  char *
108c0 7a 43 6f 73 74 54 61 62 6c 65 3b 20 20 20 20 20  zCostTable;     
108d0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 6f       /* Table ho
108e0 6c 64 69 6e 67 20 65 64 69 74 2d 64 69 73 74 61  lding edit-dista
108f0 6e 63 65 20 63 6f 73 74 20 6e 75 6d 62 65 72 73  nce cost numbers
10900 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43   */.  EditDist3C
10910 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 33 3b  onfig *pConfig3;
10920 20 2f 2a 20 50 61 72 73 65 64 20 65 64 69 74 20   /* Parsed edit 
10930 64 69 73 74 61 6e 63 65 20 63 6f 73 74 73 20 2a  distance costs *
10940 2f 0a 7d 3b 0a 0a 2f 2a 20 46 75 7a 7a 79 2d 73  /.};../* Fuzzy-s
10950 65 61 72 63 68 20 63 75 72 73 6f 72 20 6f 62 6a  earch cursor obj
10960 65 63 74 20 2a 2f 0a 73 74 72 75 63 74 20 73 70  ect */.struct sp
10970 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 7b  ellfix1_cursor {
10980 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
10990 63 75 72 73 6f 72 20 62 61 73 65 3b 20 20 20 20  cursor base;    
109a0 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d 20  /* Base class - 
109b0 6d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f  must be first */
109c0 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  .  spellfix1_vta
109d0 62 20 2a 70 56 54 61 62 3b 20 20 20 20 20 20 20  b *pVTab;       
109e0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
109f0 77 68 69 63 68 20 74 68 69 73 20 63 75 72 73 6f  which this curso
10a00 72 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63  r belongs */.  c
10a10 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20  har *zPattern;  
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72              /* r
10a30 68 73 20 6f 66 20 4d 41 54 43 48 20 63 6c 61 75  hs of MATCH clau
10a40 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 4e  se */.  int idxN
10a50 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
10a60 20 20 20 20 20 2f 2a 20 69 64 78 4e 75 6d 20 76       /* idxNum v
10a70 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 78  alue passed to x
10a80 46 69 6c 74 65 72 28 29 20 2a 2f 0a 20 20 69 6e  Filter() */.  in
10a90 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
10aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10ab0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20  mber of rows of 
10ac0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
10ad0 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20   nAlloc;        
10ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10af0 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  ber of allocated
10b00 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
10b10 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
10b20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
10b30 6e 74 20 72 6f 77 20 6f 66 20 63 6f 6e 74 65 6e  nt row of conten
10b40 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  t */.  int iLang
10b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b60 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
10b70 74 68 65 20 6c 61 6e 67 69 64 3d 20 63 6f 6e 73  the langid= cons
10b80 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  traint */.  int 
10b90 69 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  iTop;           
10ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
10bb0 65 20 6f 66 20 74 68 65 20 74 6f 70 3d 20 63 6f  e of the top= co
10bc0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e  nstraint */.  in
10bd0 74 20 69 53 63 6f 70 65 3b 20 20 20 20 20 20 20  t iScope;       
10be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
10bf0 6c 75 65 20 6f 66 20 74 68 65 20 73 63 6f 70 65  lue of the scope
10c00 3d 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  = constraint */.
10c10 20 20 69 6e 74 20 6e 53 65 61 72 63 68 3b 20 20    int nSearch;  
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 6f 63 61  * Number of voca
10c40 62 75 6c 61 72 79 20 69 74 65 6d 73 20 63 68 65  bulary items che
10c50 63 6b 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cked */.  sqlite
10c60 33 5f 73 74 6d 74 20 2a 70 46 75 6c 6c 53 63 61  3_stmt *pFullSca
10c70 6e 3b 20 20 20 20 20 2f 2a 20 53 68 61 64 6f 77  n;     /* Shadow
10c80 20 71 75 65 72 79 20 66 6f 72 20 61 20 66 75 6c   query for a ful
10c90 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
10ca0 20 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69    struct spellfi
10cb0 78 31 5f 72 6f 77 20 7b 20 20 20 20 20 20 20 2f  x1_row {       /
10cc0 2a 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  * For each row o
10cd0 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20  f content */.   
10ce0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
10cf0 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f  Rowid;         /
10d00 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73  * Rowid for this
10d10 20 72 6f 77 20 2a 2f 0a 20 20 20 20 63 68 61 72   row */.    char
10d20 20 2a 7a 57 6f 72 64 3b 20 20 20 20 20 20 20 20   *zWord;        
10d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
10d40 74 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a  t for this row *
10d50 2f 0a 20 20 20 20 69 6e 74 20 69 52 61 6e 6b 3b  /.    int iRank;
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 20 20 20 2f 2a 20 52 61 6e 6b 20 66 6f 72 20      /* Rank for 
10d80 74 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  this row */.    
10d90 69 6e 74 20 69 44 69 73 74 61 6e 63 65 3b 20 20  int iDistance;  
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10db0 20 44 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 70   Distance from p
10dc0 61 74 74 65 72 6e 20 66 6f 72 20 74 68 69 73 20  attern for this 
10dd0 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  row */.    int i
10de0 53 63 6f 72 65 3b 20 20 20 20 20 20 20 20 20 20  Score;          
10df0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 6f 72           /* Scor
10e00 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 2a 2f  e for sorting */
10e10 0a 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c  .    int iMatchl
10e20 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
10e30 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6d     /* Value of m
10e40 61 74 63 68 6c 65 6e 20 63 6f 6c 75 6d 6e 20 28  atchlen column (
10e50 6f 72 20 2d 31 29 20 2a 2f 0a 20 20 20 20 63 68  or -1) */.    ch
10e60 61 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46 49  ar zHash[SPELLFI
10e70 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 2f 2a 20 74  X_MX_HASH]; /* t
10e80 68 65 20 70 68 6f 6e 65 68 61 73 68 20 75 73 65  he phonehash use
10e90 64 20 66 6f 72 20 74 68 69 73 20 6d 61 74 63 68  d for this match
10ea0 20 2a 2f 0a 20 20 7d 20 2a 61 3b 20 0a 7d 3b 0a   */.  } *a; .};.
10eb0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
10ec0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 53 51 4c   one or more SQL
10ed0 20 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f 6d   statements from
10ee0 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
10ef0 6e 67 20 67 69 76 65 6e 0a 2a 2a 20 61 6e 64 20  ng given.** and 
10f00 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68  then evaluate th
10f10 6f 73 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ose statements. 
10f20 54 68 65 20 73 75 63 63 65 73 73 20 63 6f 64 65  The success code
10f30 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
10f40 6e 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a 2a 2a 20  nto *pRc..**.** 
10f50 49 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74 69  If *pRc is initi
10f60 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  ally non-zero th
10f70 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
10f80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10f90 74 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c  tatic void spell
10fa0 66 69 78 31 44 62 45 78 65 63 28 0a 20 20 69 6e  fix1DbExec(.  in
10fb0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
10fc0 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20       /* Success 
10fd0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
10fe0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10ff0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20   /* Database in 
11000 77 68 69 63 68 20 74 6f 20 72 75 6e 20 53 51 4c  which to run SQL
11010 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11020 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 2f 2a 20   *zFormat,   /* 
11030 46 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f  Format string fo
11040 72 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e 20 20  r SQL */.  ...  
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11060 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
11070 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  o the format str
11080 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c  ing */.){.  va_l
11090 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
110a0 7a 53 71 6c 3b 0a 20 20 69 66 28 20 2a 70 52 63  zSql;.  if( *pRc
110b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f   ) return;.  va_
110c0 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
110d0 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
110e0 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
110f0 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
11100 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
11110 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  zSql==0 ){.    *
11120 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
11130 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
11140 20 2a 70 52 63 20 3d 20 73 71 6c 69 74 65 33 5f   *pRc = sqlite3_
11150 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30  exec(db, zSql, 0
11160 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
11170 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
11180 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 44  .  }.}../*.** xD
11190 69 73 63 6f 6e 6e 65 63 74 2f 78 44 65 73 74 72  isconnect/xDestr
111a0 6f 79 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68  oy method for th
111b0 65 20 66 75 7a 7a 79 2d 73 65 61 72 63 68 20 6d  e fuzzy-search m
111c0 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
111d0 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 55 6e   int spellfix1Un
111e0 69 6e 69 74 28 69 6e 74 20 69 73 44 65 73 74 72  init(int isDestr
111f0 6f 79 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  oy, sqlite3_vtab
11200 20 2a 70 56 54 61 62 29 7b 0a 20 20 73 70 65 6c   *pVTab){.  spel
11210 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20  lfix1_vtab *p = 
11220 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a  (spellfix1_vtab*
11230 29 70 56 54 61 62 3b 0a 20 20 69 6e 74 20 72 63  )pVTab;.  int rc
11240 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11250 69 66 28 20 69 73 44 65 73 74 72 6f 79 20 29 7b  if( isDestroy ){
11260 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
11270 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 70   = p->db;.    sp
11280 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72  ellfix1DbExec(&r
11290 63 2c 20 64 62 2c 20 22 44 52 4f 50 20 54 41 42  c, db, "DROP TAB
112a0 4c 45 20 49 46 20 45 58 49 53 54 53 20 5c 22 25  LE IF EXISTS \"%
112b0 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22  w\".\"%w_vocab\"
112c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
112d0 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c       p->zDbName,
112e0 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b   p->zTableName);
112f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
11300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11310 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
11320 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20  zTableName);.   
11330 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   editDist3Config
11340 44 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69  Delete(p->pConfi
11350 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
11360 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54 61  _free(p->zCostTa
11370 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ble);.    sqlite
11380 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20  3_free(p);.  }. 
11390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
113a0 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69  atic int spellfi
113b0 78 31 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c  x1Disconnect(sql
113c0 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
113d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c  ){.  return spel
113e0 6c 66 69 78 31 55 6e 69 6e 69 74 28 30 2c 20 70  lfix1Uninit(0, p
113f0 56 54 61 62 29 3b 0a 7d 0a 73 74 61 74 69 63 20  VTab);.}.static 
11400 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 44 65 73  int spellfix1Des
11410 74 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61  troy(sqlite3_vta
11420 62 20 2a 70 56 54 61 62 29 7b 0a 20 20 72 65 74  b *pVTab){.  ret
11430 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 55 6e 69  urn spellfix1Uni
11440 6e 69 74 28 31 2c 20 70 56 54 61 62 29 3b 0a 7d  nit(1, pVTab);.}
11450 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63  ../*.** Make a c
11460 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 2e  opy of a string.
11470 20 20 52 65 6d 6f 76 65 20 6c 65 61 64 69 6e 67    Remove leading
11480 20 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68   and trailing wh
11490 69 74 65 73 70 61 63 65 0a 2a 2a 20 61 6e 64 20  itespace.** and 
114a0 64 65 71 75 6f 74 65 20 69 74 2e 0a 2a 2f 0a 73  dequote it..*/.s
114b0 74 61 74 69 63 20 63 68 61 72 20 2a 73 70 65 6c  tatic char *spel
114c0 6c 66 69 78 31 44 65 71 75 6f 74 65 28 63 6f 6e  lfix1Dequote(con
114d0 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20  st char *zIn){. 
114e0 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 69   char *zOut;.  i
114f0 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
11500 63 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70  c;.  while( issp
11510 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ace((unsigned ch
11520 61 72 29 7a 49 6e 5b 30 5d 29 20 29 20 7a 49 6e  ar)zIn[0]) ) zIn
11530 2b 2b 3b 0a 20 20 7a 4f 75 74 20 3d 20 73 71 6c  ++;.  zOut = sql
11540 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
11550 22 2c 20 7a 49 6e 29 3b 0a 20 20 69 66 28 20 7a  ", zIn);.  if( z
11560 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Out==0 ) return 
11570 30 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29 73 74  0;.  i = (int)st
11580 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 23 69 66 20  rlen(zOut);.#if 
11590 30 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72  0  /* The parser
115a0 20 77 69 6c 6c 20 6e 65 76 65 72 20 6c 65 61 76   will never leav
115b0 65 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20  e spaces at the 
115c0 65 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  end */.  while( 
115d0 69 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 7a  i>0 && isspace(z
115e0 4f 75 74 5b 69 2d 31 5d 29 20 29 7b 20 69 2d 2d  Out[i-1]) ){ i--
115f0 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 4f 75  ; }.#endif.  zOu
11600 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 63 20 3d 20  t[i] = 0;.  c = 
11610 7a 4f 75 74 5b 30 5d 3b 0a 20 20 69 66 28 20 63  zOut[0];.  if( c
11620 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27  =='\'' || c=='"'
11630 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c   ){.    for(i=1,
11640 20 6a 3d 30 3b 20 41 4c 57 41 59 53 28 7a 4f 75   j=0; ALWAYS(zOu
11650 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[i]); i++){.   
11660 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a     zOut[j++] = z
11670 4f 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Out[i];.      if
11680 28 20 7a 4f 75 74 5b 69 5d 3d 3d 63 20 29 7b 0a  ( zOut[i]==c ){.
11690 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74          if( zOut
116a0 5b 69 2b 31 5d 3d 3d 63 20 29 7b 0a 20 20 20 20  [i+1]==c ){.    
116b0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
116c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
116d0 20 20 20 20 7a 4f 75 74 5b 6a 2d 31 5d 20 3d 20      zOut[j-1] = 
116e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
116f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
11700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11710 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d    return zOut;.}
11720 0a 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6e 6e 65 63  .../*.** xConnec
11730 74 2f 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64  t/xCreate method
11740 20 66 6f 72 20 74 68 65 20 73 70 65 6c 6c 66 69   for the spellfi
11750 78 31 20 6d 6f 64 75 6c 65 2e 20 41 72 67 75 6d  x1 module. Argum
11760 65 6e 74 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ents are:.**.** 
11770 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d    argv[0]   -> m
11780 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28 22 73 70  odule name  ("sp
11790 65 6c 6c 66 69 78 31 22 29 0a 2a 2a 20 20 20 61  ellfix1").**   a
117a0 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61  rgv[1]   -> data
117b0 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61  base name.**   a
117c0 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c  rgv[2]   -> tabl
117d0 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
117e0 5b 33 5d 2e 2e 20 2d 3e 20 6f 70 74 69 6f 6e 61  [3].. -> optiona
117f0 6c 20 61 72 67 75 6d 65 6e 74 73 20 28 69 2e 65  l arguments (i.e
11800 2e 20 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62  . "edit_cost_tab
11810 6c 65 22 20 70 61 72 61 6d 65 74 65 72 29 0a 2a  le" parameter).*
11820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
11830 6c 6c 66 69 78 31 49 6e 69 74 28 0a 20 20 69 6e  llfix1Init(.  in
11840 74 20 69 73 43 72 65 61 74 65 2c 0a 20 20 73 71  t isCreate,.  sq
11850 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
11860 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
11870 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
11880 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
11890 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
118a0 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  VTab,.  char **p
118b0 7a 45 72 72 0a 29 7b 0a 20 20 73 70 65 6c 6c 66  zErr.){.  spellf
118c0 69 78 31 5f 76 74 61 62 20 2a 70 4e 65 77 20 3d  ix1_vtab *pNew =
118d0 20 30 3b 0a 20 20 2f 2a 20 63 6f 6e 73 74 20 63   0;.  /* const c
118e0 68 61 72 20 2a 7a 4d 6f 64 75 6c 65 20 3d 20 61  har *zModule = a
118f0 72 67 76 5b 30 5d 3b 20 2f 2f 20 6e 6f 74 20 75  rgv[0]; // not u
11900 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
11910 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 61  har *zDbName = a
11920 72 67 76 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  rgv[1];.  const 
11930 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65  char *zTableName
11940 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e   = argv[2];.  in
11950 74 20 6e 44 62 4e 61 6d 65 3b 0a 20 20 69 6e 74  t nDbName;.  int
11960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11970 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 44 62  .  int i;..  nDb
11980 4e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  Name = (int)strl
11990 65 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 70  en(zDbName);.  p
119a0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
119b0 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
119c0 70 4e 65 77 29 20 2b 20 6e 44 62 4e 61 6d 65 20  pNew) + nDbName 
119d0 2b 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  + 1);.  if( pNew
119e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
119f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11a00 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
11a10 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
11a20 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 20 20 70  f(*pNew));.    p
11a30 4e 65 77 2d 3e 7a 44 62 4e 61 6d 65 20 3d 20 28  New->zDbName = (
11a40 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
11a50 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d      memcpy(pNew-
11a60 3e 7a 44 62 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  >zDbName, zDbNam
11a70 65 2c 20 6e 44 62 4e 61 6d 65 2b 31 29 3b 0a 20  e, nDbName+1);. 
11a80 20 20 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e     pNew->zTableN
11a90 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ame = sqlite3_mp
11aa0 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 61 62  rintf("%s", zTab
11ab0 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  leName);.    pNe
11ac0 77 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  w->db = db;.    
11ad0 69 66 28 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65  if( pNew->zTable
11ae0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
11af0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
11b00 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
11b10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11b20 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64  3_declare_vtab(d
11b30 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  b, .           "
11b40 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 77  CREATE TABLE x(w
11b50 6f 72 64 2c 72 61 6e 6b 2c 64 69 73 74 61 6e 63  ord,rank,distanc
11b60 65 2c 6c 61 6e 67 69 64 2c 20 22 0a 20 20 20 20  e,langid, ".    
11b70 20 20 20 20 20 20 20 22 73 63 6f 72 65 2c 20 6d         "score, m
11b80 61 74 63 68 6c 65 6e 2c 20 70 68 6f 6e 65 68 61  atchlen, phoneha
11b90 73 68 20 48 49 44 44 45 4e 2c 20 22 0a 20 20 20  sh HIDDEN, ".   
11ba0 20 20 20 20 20 20 20 20 22 74 6f 70 20 48 49 44          "top HID
11bb0 44 45 4e 2c 20 73 63 6f 70 65 20 48 49 44 44 45  DEN, scope HIDDE
11bc0 4e 2c 20 73 72 63 68 63 6e 74 20 48 49 44 44 45  N, srchcnt HIDDE
11bd0 4e 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  N, ".           
11be0 22 73 6f 75 6e 64 73 6c 69 6b 65 20 48 49 44 44  "soundslike HIDD
11bf0 45 4e 2c 20 63 6f 6d 6d 61 6e 64 20 48 49 44 44  EN, command HIDD
11c00 45 4e 29 22 0a 20 20 20 20 20 20 29 3b 0a 23 64  EN)".      );.#d
11c10 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43  efine SPELLFIX_C
11c20 4f 4c 5f 57 4f 52 44 20 20 20 20 20 20 20 20 20  OL_WORD         
11c30 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53 50 45     0.#define SPE
11c40 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b 20 20  LLFIX_COL_RANK  
11c50 20 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66            1.#def
11c60 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
11c70 5f 44 49 53 54 41 4e 43 45 20 20 20 20 20 20 20  _DISTANCE       
11c80 20 32 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c   2.#define SPELL
11c90 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20 20  FIX_COL_LANGID  
11ca0 20 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e          3.#defin
11cb0 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53  e SPELLFIX_COL_S
11cc0 43 4f 52 45 20 20 20 20 20 20 20 20 20 20 20 34  CORE           4
11cd0 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
11ce0 58 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45 4e 20 20  X_COL_MATCHLEN  
11cf0 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20        5.#define 
11d00 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f  SPELLFIX_COL_PHO
11d10 4e 45 48 41 53 48 20 20 20 20 20 20 20 36 0a 23  NEHASH       6.#
11d20 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
11d30 43 4f 4c 5f 54 4f 50 20 20 20 20 20 20 20 20 20  COL_TOP         
11d40 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 50      7.#define SP
11d50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45  ELLFIX_COL_SCOPE
11d60 20 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65             8.#de
11d70 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  fine SPELLFIX_CO
11d80 4c 5f 53 52 43 48 43 4e 54 20 20 20 20 20 20 20  L_SRCHCNT       
11d90 20 20 39 0a 23 64 65 66 69 6e 65 20 53 50 45 4c    9.#define SPEL
11da0 4c 46 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c  LFIX_COL_SOUNDSL
11db0 49 4b 45 20 20 20 20 20 31 30 0a 23 64 65 66 69  IKE     10.#defi
11dc0 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  ne SPELLFIX_COL_
11dd0 43 4f 4d 4d 41 4e 44 20 20 20 20 20 20 20 20 31  COMMAND        1
11de0 31 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  1.    }.    if( 
11df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11e00 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
11e10 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78     spellfix1DbEx
11e20 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20  ec(&rc, db,.    
11e30 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
11e40 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
11e50 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63   \"%w\".\"%w_voc
11e60 61 62 5c 22 28 5c 6e 22 0a 20 20 20 20 20 20 20  ab\"(\n".       
11e70 20 20 22 20 20 69 64 20 49 4e 54 45 47 45 52 20    "  id INTEGER 
11e80 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a  PRIMARY KEY,\n".
11e90 20 20 20 20 20 20 20 20 20 22 20 20 72 61 6e 6b           "  rank
11ea0 20 49 4e 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20   INT,\n".       
11eb0 20 20 22 20 20 6c 61 6e 67 69 64 20 49 4e 54 2c    "  langid INT,
11ec0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
11ed0 77 6f 72 64 20 54 45 58 54 2c 5c 6e 22 0a 20 20  word TEXT,\n".  
11ee0 20 20 20 20 20 20 20 22 20 20 6b 31 20 54 45 58         "  k1 TEX
11ef0 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22  T,\n".         "
11f00 20 20 6b 32 20 54 45 58 54 5c 6e 22 0a 20 20 20    k2 TEXT\n".   
11f10 20 20 20 20 20 20 22 29 3b 5c 6e 22 2c 0a 20 20        ");\n",.  
11f20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20         zDbName, 
11f30 7a 54 61 62 6c 65 4e 61 6d 65 0a 20 20 20 20 20  zTableName.     
11f40 20 29 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c 66   );.      spellf
11f50 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64  ix1DbExec(&rc, d
11f60 62 2c 0a 20 20 20 20 20 20 20 20 20 22 43 52 45  b,.         "CRE
11f70 41 54 45 20 49 4e 44 45 58 20 49 46 20 4e 4f 54  ATE INDEX IF NOT
11f80 20 45 58 49 53 54 53 20 5c 22 25 77 5c 22 2e 5c   EXISTS \"%w\".\
11f90 22 25 77 5f 76 6f 63 61 62 5f 69 6e 64 65 78 5f  "%w_vocab_index_
11fa0 6c 61 6e 67 69 64 5f 6b 32 5c 22 20 22 0a 20 20  langid_k2\" ".  
11fb0 20 20 20 20 20 20 20 20 20 20 22 4f 4e 20 5c 22            "ON \"
11fc0 25 77 5f 76 6f 63 61 62 5c 22 28 6c 61 6e 67 69  %w_vocab\"(langi
11fd0 64 2c 6b 32 29 3b 22 2c 0a 20 20 20 20 20 20 20  d,k2);",.       
11fe0 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 6c    zDbName, zTabl
11ff0 65 4e 61 6d 65 2c 20 7a 54 61 62 6c 65 4e 61 6d  eName, zTableNam
12000 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
12010 0a 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 72 63  .    for(i=3; rc
12020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
12030 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
12040 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
12050 72 67 76 5b 69 5d 2c 22 65 64 69 74 5f 63 6f 73  rgv[i],"edit_cos
12060 74 5f 74 61 62 6c 65 3d 22 2c 31 36 29 3d 3d 30  t_table=",16)==0
12070 20 26 26 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54   && pNew->zCostT
12080 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  able==0 ){.     
12090 20 20 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61     pNew->zCostTa
120a0 62 6c 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 44  ble = spellfix1D
120b0 65 71 75 6f 74 65 28 26 61 72 67 76 5b 69 5d 5b  equote(&argv[i][
120c0 31 36 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  16]);.        if
120d0 28 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62  ( pNew->zCostTab
120e0 6c 65 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  le==0 ) rc = SQL
120f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
12100 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12110 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 7a 45 72     }.      *pzEr
12120 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
12130 6e 74 66 28 22 62 61 64 20 61 72 67 75 6d 65 6e  ntf("bad argumen
12140 74 20 74 6f 20 73 70 65 6c 6c 66 69 78 31 28 29  t to spellfix1()
12150 3a 20 5c 22 25 73 5c 22 22 2c 20 61 72 67 76 5b  : \"%s\"", argv[
12160 69 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  i]);.      rc = 
12170 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 0a 20  SQLITE_ERROR; . 
12180 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
12190 72 63 20 26 26 20 70 4e 65 77 20 29 7b 0a 20 20  rc && pNew ){.  
121a0 20 20 2a 70 70 56 54 61 62 20 3d 20 30 3b 0a 20    *ppVTab = 0;. 
121b0 20 20 20 73 70 65 6c 6c 66 69 78 31 55 6e 69 6e     spellfix1Unin
121c0 69 74 28 30 2c 20 26 70 4e 65 77 2d 3e 62 61 73  it(0, &pNew->bas
121d0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
121e0 20 2a 70 70 56 54 61 62 20 3d 20 28 73 71 6c 69   *ppVTab = (sqli
121f0 74 65 33 5f 76 74 61 62 20 2a 29 70 4e 65 77 3b  te3_vtab *)pNew;
12200 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  ;.}../*.** The x
12220 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43 72 65  Connect and xCre
12230 61 74 65 20 6d 65 74 68 6f 64 73 0a 2a 2f 0a 73  ate methods.*/.s
12240 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
12250 69 78 31 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  ix1Connect(.  sq
12260 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
12270 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
12280 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
12290 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
122a0 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
122b0 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  VTab,.  char **p
122c0 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e  zErr.){.  return
122d0 20 73 70 65 6c 6c 66 69 78 31 49 6e 69 74 28 30   spellfix1Init(0
122e0 2c 20 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63  , db, pAux, argc
122f0 2c 20 61 72 67 76 2c 20 70 70 56 54 61 62 2c 20  , argv, ppVTab, 
12300 70 7a 45 72 72 29 3b 0a 7d 0a 73 74 61 74 69 63  pzErr);.}.static
12310 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 72   int spellfix1Cr
12320 65 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  eate(.  sqlite3 
12330 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75  *db,.  void *pAu
12340 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63  x,.  int argc, c
12350 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74  onst char *const
12360 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33  *argv,.  sqlite3
12370 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a  _vtab **ppVTab,.
12380 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
12390 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c  {.  return spell
123a0 66 69 78 31 49 6e 69 74 28 31 2c 20 64 62 2c 20  fix1Init(1, db, 
123b0 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76  pAux, argc, argv
123c0 2c 20 70 70 56 54 61 62 2c 20 70 7a 45 72 72 29  , ppVTab, pzErr)
123d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
123e0 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e 74   all of the cont
123f0 65 6e 74 20 66 72 6f 6d 20 61 20 63 75 72 73 6f  ent from a curso
12400 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
12410 64 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74  d spellfix1Reset
12420 43 75 72 73 6f 72 28 73 70 65 6c 6c 66 69 78 31  Cursor(spellfix1
12430 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  _cursor *pCur){.
12440 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
12450 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f 77  =0; i<pCur->nRow
12460 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
12470 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61  te3_free(pCur->a
12480 5b 69 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20 7d 0a  [i].zWord);.  }.
12490 20 20 70 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 30    pCur->nRow = 0
124a0 3b 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d  ;.  pCur->iRow =
124b0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 6e 53 65 61   0;.  pCur->nSea
124c0 72 63 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rch = 0;.  if( p
124d0 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29  Cur->pFullScan )
124e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  {.    sqlite3_fi
124f0 6e 61 6c 69 7a 65 28 70 43 75 72 2d 3e 70 46 75  nalize(pCur->pFu
12500 6c 6c 53 63 61 6e 29 3b 0a 20 20 20 20 70 43 75  llScan);.    pCu
12510 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 3d 20 30  r->pFullScan = 0
12520 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
12530 65 73 69 7a 65 20 74 68 65 20 63 75 72 73 6f 72  esize the cursor
12540 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 6f 20 4e   to hold up to N
12550 20 72 6f 77 73 20 6f 66 20 63 6f 6e 74 65 6e 74   rows of content
12560 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12570 73 70 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43  spellfix1ResizeC
12580 75 72 73 6f 72 28 73 70 65 6c 6c 66 69 78 31 5f  ursor(spellfix1_
12590 63 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  cursor *pCur, in
125a0 74 20 4e 29 7b 0a 20 20 73 74 72 75 63 74 20 73  t N){.  struct s
125b0 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 61 4e  pellfix1_row *aN
125c0 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  ew;.  assert( N>
125d0 3d 70 43 75 72 2d 3e 6e 52 6f 77 20 29 3b 0a 20  =pCur->nRow );. 
125e0 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
125f0 72 65 61 6c 6c 6f 63 36 34 28 70 43 75 72 2d 3e  realloc64(pCur->
12600 61 2c 20 73 69 7a 65 6f 66 28 70 43 75 72 2d 3e  a, sizeof(pCur->
12610 61 5b 30 5d 29 2a 4e 29 3b 0a 20 20 69 66 28 20  a[0])*N);.  if( 
12620 61 4e 65 77 3d 3d 30 20 26 26 20 4e 3e 30 20 29  aNew==0 && N>0 )
12630 7b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78 31 52  {.    spellfix1R
12640 65 73 65 74 43 75 72 73 6f 72 28 70 43 75 72 29  esetCursor(pCur)
12650 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12660 65 65 28 70 43 75 72 2d 3e 61 29 3b 0a 20 20 20  ee(pCur->a);.   
12670 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pCur->nAlloc = 
12680 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 20 3d  0;.    pCur->a =
12690 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
126a0 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pCur->nAlloc = 
126b0 4e 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 20 3d  N;.    pCur->a =
126c0 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f   aNew;.  }.}.../
126d0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 75 7a  *.** Close a fuz
126e0 7a 79 2d 73 65 61 72 63 68 20 63 75 72 73 6f 72  zy-search cursor
126f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12700 73 70 65 6c 6c 66 69 78 31 43 6c 6f 73 65 28 73  spellfix1Close(s
12710 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
12720 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 70 65 6c  or *cur){.  spel
12730 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
12740 75 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f  ur = (spellfix1_
12750 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  cursor *)cur;.  
12760 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43 75  spellfix1ResetCu
12770 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 73 70  rsor(pCur);.  sp
12780 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75 72  ellfix1ResizeCur
12790 73 6f 72 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  sor(pCur, 0);.  
127a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
127b0 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  r->zPattern);.  
127c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
127d0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
127e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 64 65 66 69  ITE_OK;.}..#defi
127f0 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e  ne SPELLFIX_IDXN
12800 55 4d 5f 4d 41 54 43 48 20 20 30 78 30 31 20 20  UM_MATCH  0x01  
12810 20 20 20 20 20 20 20 2f 2a 20 77 6f 72 64 20 4d         /* word M
12820 41 54 43 48 20 24 73 74 72 20 2a 2f 0a 23 64 65  ATCH $str */.#de
12830 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49 44  fine SPELLFIX_ID
12840 58 4e 55 4d 5f 4c 41 4e 47 49 44 20 30 78 30 32  XNUM_LANGID 0x02
12850 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 61 6e 67           /* lang
12860 69 64 20 3d 3d 20 24 6c 61 6e 67 69 64 20 2a 2f  id == $langid */
12870 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
12880 58 5f 49 44 58 4e 55 4d 5f 54 4f 50 20 20 20 20  X_IDXNUM_TOP    
12890 30 78 30 34 20 20 20 20 20 20 20 20 20 2f 2a 20  0x04         /* 
128a0 74 6f 70 20 3d 20 24 74 6f 70 20 2a 2f 0a 23 64  top = $top */.#d
128b0 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49  efine SPELLFIX_I
128c0 44 58 4e 55 4d 5f 53 43 4f 50 45 20 20 30 78 30  DXNUM_SCOPE  0x0
128d0 38 20 20 20 20 20 20 20 20 20 2f 2a 20 73 63 6f  8         /* sco
128e0 70 65 20 3d 20 24 73 63 6f 70 65 20 2a 2f 0a 23  pe = $scope */.#
128f0 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
12900 49 44 58 4e 55 4d 5f 44 49 53 54 4c 54 20 30 78  IDXNUM_DISTLT 0x
12910 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20 64 69  10         /* di
12920 73 74 61 6e 63 65 20 3c 20 24 64 69 73 74 61 6e  stance < $distan
12930 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  ce */.#define SP
12940 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44 49  ELLFIX_IDXNUM_DI
12950 53 54 4c 45 20 30 78 32 30 20 20 20 20 20 20 20  STLE 0x20       
12960 20 20 2f 2a 20 64 69 73 74 61 6e 63 65 20 3c 3d    /* distance <=
12970 20 24 64 69 73 74 61 6e 63 65 20 2a 2f 0a 23 64   $distance */.#d
12980 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49  efine SPELLFIX_I
12990 44 58 4e 55 4d 5f 52 4f 57 49 44 20 20 30 78 34  DXNUM_ROWID  0x4
129a0 30 20 20 20 20 20 20 20 20 20 2f 2a 20 72 6f 77  0         /* row
129b0 69 64 20 3d 20 24 72 6f 77 69 64 20 2a 2f 0a 23  id = $rowid */.#
129c0 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
129d0 49 44 58 4e 55 4d 5f 44 49 53 54 20 20 20 28 30  IDXNUM_DIST   (0
129e0 78 31 30 7c 30 78 32 30 29 20 20 2f 2a 20 44 49  x10|0x20)  /* DI
129f0 53 54 4c 54 20 61 6e 64 20 44 49 53 54 4c 45 20  STLT and DISTLE 
12a00 2a 2f 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  */../*.**.** The
12a10 20 70 6c 61 6e 20 6e 75 6d 62 65 72 20 69 73 20   plan number is 
12a20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65  a bitmask of the
12a30 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
12a40 5f 2a 20 76 61 6c 75 65 73 20 64 65 66 69 6e 65  _* values define
12a50 64 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  d.** above..**.*
12a60 2a 20 66 69 6c 74 65 72 2e 61 72 67 76 5b 2a 5d  * filter.argv[*]
12a70 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 73   values contains
12a80 20 24 73 74 72 2c 20 24 6c 61 6e 67 69 64 2c 20   $str, $langid, 
12a90 24 74 6f 70 2c 20 24 73 63 6f 70 65 20 61 6e 64  $top, $scope and
12aa0 20 24 72 6f 77 69 64 0a 2a 2a 20 69 66 20 73 70   $rowid.** if sp
12ab0 65 63 69 66 69 65 64 20 61 6e 64 20 69 6e 20 74  ecified and in t
12ac0 68 61 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  hat order..*/.st
12ad0 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69  atic int spellfi
12ae0 78 31 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69  x1BestIndex(sqli
12af0 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73  te3_vtab *tab, s
12b00 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
12b10 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20  o *pIdxInfo){.  
12b20 69 6e 74 20 69 50 6c 61 6e 20 3d 20 30 3b 0a 20  int iPlan = 0;. 
12b30 20 69 6e 74 20 69 4c 61 6e 67 54 65 72 6d 20 3d   int iLangTerm =
12b40 20 2d 31 3b 0a 20 20 69 6e 74 20 69 54 6f 70 54   -1;.  int iTopT
12b50 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  erm = -1;.  int 
12b60 69 53 63 6f 70 65 54 65 72 6d 20 3d 20 2d 31 3b  iScopeTerm = -1;
12b70 0a 20 20 69 6e 74 20 69 44 69 73 74 54 65 72 6d  .  int iDistTerm
12b80 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 52 6f   = -1;.  int iRo
12b90 77 69 64 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20  widTerm = -1;.  
12ba0 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 73  int i;.  const s
12bb0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
12bc0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
12bd0 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70  pConstraint;.  p
12be0 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
12bf0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
12c00 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nt;.  for(i=0; i
12c10 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
12c20 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f  traint; i++, pCo
12c30 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20  nstraint++){.   
12c40 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
12c50 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f  ->usable==0 ) co
12c60 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20  ntinue;..    /* 
12c70 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  Terms of the for
12c80 6d 3a 20 20 77 6f 72 64 20 4d 41 54 43 48 20 24  m:  word MATCH $
12c90 73 74 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  str */.    if( (
12ca0 69 50 6c 61 6e 20 26 20 53 50 45 4c 4c 46 49 58  iPlan & SPELLFIX
12cb0 5f 49 44 58 4e 55 4d 5f 4d 41 54 43 48 29 3d 3d  _IDXNUM_MATCH)==
12cc0 30 20 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73  0 .     && pCons
12cd0 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d  traint->iColumn=
12ce0 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f  =SPELLFIX_COL_WO
12cf0 52 44 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73  RD.     && pCons
12d00 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49  traint->op==SQLI
12d10 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
12d20 49 4e 54 5f 4d 41 54 43 48 0a 20 20 20 20 29 7b  INT_MATCH.    ){
12d30 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20  .      iPlan |= 
12d40 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
12d50 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 49 64  MATCH;.      pId
12d60 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
12d70 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
12d80 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  ndex = 1;.      
12d90 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
12da0 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d  raintUsage[i].om
12db0 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  it = 1;.    }.. 
12dc0 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74     /* Terms of t
12dd0 68 65 20 66 6f 72 6d 3a 20 20 6c 61 6e 67 69 64  he form:  langid
12de0 20 3d 20 24 6c 61 6e 67 69 64 20 20 2a 2f 0a 20   = $langid  */. 
12df0 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
12e00 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
12e10 4c 41 4e 47 49 44 29 3d 3d 30 0a 20 20 20 20 20  LANGID)==0.     
12e20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
12e30 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49  iColumn==SPELLFI
12e40 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 0a 20 20 20  X_COL_LANGID.   
12e50 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
12e60 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
12e70 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
12e80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50  .    ){.      iP
12e90 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f  lan |= SPELLFIX_
12ea0 49 44 58 4e 55 4d 5f 4c 41 4e 47 49 44 3b 0a 20  IDXNUM_LANGID;. 
12eb0 20 20 20 20 20 69 4c 61 6e 67 54 65 72 6d 20 3d       iLangTerm =
12ec0 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   i;.    }..    /
12ed0 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66  * Terms of the f
12ee0 6f 72 6d 3a 20 20 74 6f 70 20 3d 20 24 74 6f 70  orm:  top = $top
12ef0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c   */.    if( (iPl
12f00 61 6e 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44  an & SPELLFIX_ID
12f10 58 4e 55 4d 5f 54 4f 50 29 3d 3d 30 0a 20 20 20  XNUM_TOP)==0.   
12f20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
12f30 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c  ->iColumn==SPELL
12f40 46 49 58 5f 43 4f 4c 5f 54 4f 50 0a 20 20 20 20  FIX_COL_TOP.    
12f50 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
12f60 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
12f70 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a  X_CONSTRAINT_EQ.
12f80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c      ){.      iPl
12f90 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f 49  an |= SPELLFIX_I
12fa0 44 58 4e 55 4d 5f 54 4f 50 3b 0a 20 20 20 20 20  DXNUM_TOP;.     
12fb0 20 69 54 6f 70 54 65 72 6d 20 3d 20 69 3b 0a 20   iTopTerm = i;. 
12fc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72     }..    /* Ter
12fd0 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ms of the form: 
12fe0 20 73 63 6f 70 65 20 3d 20 24 73 63 6f 70 65 20   scope = $scope 
12ff0 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61  */.    if( (iPla
13000 6e 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58  n & SPELLFIX_IDX
13010 4e 55 4d 5f 53 43 4f 50 45 29 3d 3d 30 0a 20 20  NUM_SCOPE)==0.  
13020 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e     && pConstrain
13030 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c  t->iColumn==SPEL
13040 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 0a 20  LFIX_COL_SCOPE. 
13050 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69      && pConstrai
13060 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  nt->op==SQLITE_I
13070 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
13080 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  EQ.    ){.      
13090 69 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49  iPlan |= SPELLFI
130a0 58 5f 49 44 58 4e 55 4d 5f 53 43 4f 50 45 3b 0a  X_IDXNUM_SCOPE;.
130b0 20 20 20 20 20 20 69 53 63 6f 70 65 54 65 72 6d        iScopeTerm
130c0 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = i;.    }..   
130d0 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65   /* Terms of the
130e0 20 66 6f 72 6d 3a 20 20 64 69 73 74 61 6e 63 65   form:  distance
130f0 20 3c 20 24 64 69 73 74 20 6f 72 20 64 69 73 74   < $dist or dist
13100 61 6e 63 65 20 3c 3d 20 24 64 69 73 74 20 2a 2f  ance <= $dist */
13110 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20  .    if( (iPlan 
13120 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  & SPELLFIX_IDXNU
13130 4d 5f 44 49 53 54 29 3d 3d 30 0a 20 20 20 20 20  M_DIST)==0.     
13140 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
13150 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49  iColumn==SPELLFI
13160 58 5f 43 4f 4c 5f 44 49 53 54 41 4e 43 45 0a 20  X_COL_DISTANCE. 
13170 20 20 20 20 26 26 20 28 70 43 6f 6e 73 74 72 61      && (pConstra
13180 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f  int->op==SQLITE_
13190 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
131a0 5f 4c 54 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  _LT.          ||
131b0 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
131c0 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
131d0 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 29 0a 20 20  ONSTRAINT_LE).  
131e0 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
131f0 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
13200 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
13210 53 54 52 41 49 4e 54 5f 4c 54 20 29 7b 0a 20 20  STRAINT_LT ){.  
13220 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 53        iPlan |= S
13230 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44  PELLFIX_IDXNUM_D
13240 49 53 54 4c 54 3b 0a 20 20 20 20 20 20 7d 65 6c  ISTLT;.      }el
13250 73 65 7b 0a 20 20 20 20 20 20 20 20 69 50 6c 61  se{.        iPla
13260 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f 49 44  n |= SPELLFIX_ID
13270 58 4e 55 4d 5f 44 49 53 54 4c 45 3b 0a 20 20 20  XNUM_DISTLE;.   
13280 20 20 20 7d 0a 20 20 20 20 20 20 69 44 69 73 74     }.      iDist
13290 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  Term = i;.    }.
132a0 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
132b0 20 74 68 65 20 66 6f 72 6d 3a 20 20 64 69 73 74   the form:  dist
132c0 61 6e 63 65 20 3c 20 24 64 69 73 74 20 6f 72 20  ance < $dist or 
132d0 64 69 73 74 61 6e 63 65 20 3c 3d 20 24 64 69 73  distance <= $dis
132e0 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50  t */.    if( (iP
132f0 6c 61 6e 20 26 20 53 50 45 4c 4c 46 49 58 5f 49  lan & SPELLFIX_I
13300 44 58 4e 55 4d 5f 52 4f 57 49 44 29 3d 3d 30 0a  DXNUM_ROWID)==0.
13310 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
13320 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20  int->iColumn<0. 
13330 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69      && pConstrai
13340 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  nt->op==SQLITE_I
13350 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
13360 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  EQ.    ){.      
13370 69 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49  iPlan |= SPELLFI
13380 58 5f 49 44 58 4e 55 4d 5f 52 4f 57 49 44 3b 0a  X_IDXNUM_ROWID;.
13390 20 20 20 20 20 20 69 52 6f 77 69 64 54 65 72 6d        iRowidTerm
133a0 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
133b0 20 20 69 66 28 20 69 50 6c 61 6e 26 53 50 45 4c    if( iPlan&SPEL
133c0 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 4d 41 54 43  LFIX_IDXNUM_MATC
133d0 48 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  H ){.    int idx
133e0 20 3d 20 32 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 2;.    pIdxIn
133f0 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 69 50 6c  fo->idxNum = iPl
13400 61 6e 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  an;.    if( pIdx
13410 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d  Info->nOrderBy==
13420 31 0a 20 20 20 20 20 26 26 20 70 49 64 78 49 6e  1.     && pIdxIn
13430 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e  fo->aOrderBy[0].
13440 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49  iColumn==SPELLFI
13450 58 5f 43 4f 4c 5f 53 43 4f 52 45 0a 20 20 20 20  X_COL_SCORE.    
13460 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f   && pIdxInfo->aO
13470 72 64 65 72 42 79 5b 30 5d 2e 64 65 73 63 3d 3d  rderBy[0].desc==
13480 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
13490 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
134a0 43 6f 6e 73 75 6d 65 64 20 3d 20 31 3b 20 20 2f  Consumed = 1;  /
134b0 2a 20 44 65 66 61 75 6c 74 20 6f 72 64 65 72 20  * Default order 
134c0 62 79 20 69 53 63 6f 72 65 20 2a 2f 0a 20 20 20  by iScore */.   
134d0 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c 61 6e   }.    if( iPlan
134e0 26 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d  &SPELLFIX_IDXNUM
134f0 5f 4c 41 4e 47 49 44 20 29 7b 0a 20 20 20 20 20  _LANGID ){.     
13500 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
13510 74 72 61 69 6e 74 55 73 61 67 65 5b 69 4c 61 6e  traintUsage[iLan
13520 67 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78  gTerm].argvIndex
13530 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20   = idx++;.      
13540 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
13550 72 61 69 6e 74 55 73 61 67 65 5b 69 4c 61 6e 67  raintUsage[iLang
13560 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  Term].omit = 1;.
13570 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50      }.    if( iP
13580 6c 61 6e 26 53 50 45 4c 4c 46 49 58 5f 49 44 58  lan&SPELLFIX_IDX
13590 4e 55 4d 5f 54 4f 50 20 29 7b 0a 20 20 20 20 20  NUM_TOP ){.     
135a0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
135b0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 54 6f 70  traintUsage[iTop
135c0 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20  Term].argvIndex 
135d0 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70  = idx++;.      p
135e0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
135f0 61 69 6e 74 55 73 61 67 65 5b 69 54 6f 70 54 65  aintUsage[iTopTe
13600 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  rm].omit = 1;.  
13610 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c 61    }.    if( iPla
13620 6e 26 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  n&SPELLFIX_IDXNU
13630 4d 5f 53 43 4f 50 45 20 29 7b 0a 20 20 20 20 20  M_SCOPE ){.     
13640 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
13650 74 72 61 69 6e 74 55 73 61 67 65 5b 69 53 63 6f  traintUsage[iSco
13660 70 65 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65  peTerm].argvInde
13670 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20  x = idx++;.     
13680 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
13690 74 72 61 69 6e 74 55 73 61 67 65 5b 69 53 63 6f  traintUsage[iSco
136a0 70 65 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31  peTerm].omit = 1
136b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
136c0 69 50 6c 61 6e 26 53 50 45 4c 4c 46 49 58 5f 49  iPlan&SPELLFIX_I
136d0 44 58 4e 55 4d 5f 44 49 53 54 20 29 7b 0a 20 20  DXNUM_DIST ){.  
136e0 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
136f0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
13700 44 69 73 74 54 65 72 6d 5d 2e 61 72 67 76 49 6e  DistTerm].argvIn
13710 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20  dex = idx++;.   
13720 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
13730 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 44  nstraintUsage[iD
13740 69 73 74 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20  istTerm].omit = 
13750 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64  1;.    }.    pId
13760 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64  xInfo->estimated
13770 43 6f 73 74 20 3d 20 31 65 35 3b 0a 20 20 7d 65  Cost = 1e5;.  }e
13780 6c 73 65 20 69 66 28 20 28 69 50 6c 61 6e 20 26  lse if( (iPlan &
13790 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
137a0 5f 52 4f 57 49 44 29 20 29 7b 0a 20 20 20 20 70  _ROWID) ){.    p
137b0 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
137c0 3d 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  = SPELLFIX_IDXNU
137d0 4d 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 64  M_ROWID;.    pId
137e0 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
137f0 6e 74 55 73 61 67 65 5b 69 52 6f 77 69 64 54 65  ntUsage[iRowidTe
13800 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  rm].argvIndex = 
13810 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  1;.    pIdxInfo-
13820 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
13830 65 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e 6f 6d  e[iRowidTerm].om
13840 69 74 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78  it = 1;.    pIdx
13850 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
13860 6f 73 74 20 3d 20 35 3b 0a 20 20 7d 65 6c 73 65  ost = 5;.  }else
13870 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
13880 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
13890 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
138a0 74 65 64 43 6f 73 74 20 3d 20 31 65 35 30 3b 0a  tedCost = 1e50;.
138b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
138c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
138d0 20 4f 70 65 6e 20 61 20 6e 65 77 20 66 75 7a 7a   Open a new fuzz
138e0 79 2d 73 65 61 72 63 68 20 63 75 72 73 6f 72 2e  y-search cursor.
138f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13900 70 65 6c 6c 66 69 78 31 4f 70 65 6e 28 73 71 6c  pellfix1Open(sql
13910 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
13920 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
13930 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
13940 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76  ){.  spellfix1_v
13950 74 61 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66  tab *p = (spellf
13960 69 78 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b  ix1_vtab*)pVTab;
13970 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  .  spellfix1_cur
13980 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75  sor *pCur;.  pCu
13990 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
139a0 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43  oc64( sizeof(*pC
139b0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
139c0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
139d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
139e0 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69  mset(pCur, 0, si
139f0 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20  zeof(*pCur));.  
13a00 70 43 75 72 2d 3e 70 56 54 61 62 20 3d 20 70 3b  pCur->pVTab = p;
13a10 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26  .  *ppCursor = &
13a20 70 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65  pCur->base;.  re
13a30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13a40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
13a50 61 20 64 69 73 74 61 6e 63 65 20 6d 65 61 73 75  a distance measu
13a60 72 65 6d 65 6e 74 20 62 79 20 74 68 65 20 77 6f  rement by the wo
13a70 72 64 73 20 72 61 6e 6b 20 69 6e 20 6f 72 64 65  rds rank in orde
13a80 72 20 74 6f 20 73 68 6f 77 0a 2a 2a 20 70 72 65  r to show.** pre
13a90 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6d 6d 6f  ference to commo
13aa0 6e 20 77 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74  n words..*/.stat
13ab0 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
13ac0 53 63 6f 72 65 28 69 6e 74 20 69 44 69 73 74 61  Score(int iDista
13ad0 6e 63 65 2c 20 69 6e 74 20 69 52 61 6e 6b 29 7b  nce, int iRank){
13ae0 0a 20 20 69 6e 74 20 69 4c 6f 67 32 3b 0a 20 20  .  int iLog2;.  
13af0 66 6f 72 28 69 4c 6f 67 32 3d 30 3b 20 69 52 61  for(iLog2=0; iRa
13b00 6e 6b 3e 30 3b 20 69 4c 6f 67 32 2b 2b 2c 20 69  nk>0; iLog2++, i
13b10 52 61 6e 6b 3e 3e 3d 31 29 7b 7d 0a 20 20 72 65  Rank>>=1){}.  re
13b20 74 75 72 6e 20 69 44 69 73 74 61 6e 63 65 20 2b  turn iDistance +
13b30 20 33 32 20 2d 20 69 4c 6f 67 32 3b 0a 7d 0a 0a   32 - iLog2;.}..
13b40 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
13b50 6f 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20  o spellfix1_row 
13b60 6f 62 6a 65 63 74 73 20 66 6f 72 20 73 6f 72 74  objects for sort
13b70 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69 6e 20  ing purposes in 
13b80 71 73 6f 72 74 28 29 20 73 75 63 68 0a 2a 2a 20  qsort() such.** 
13b90 74 68 61 74 20 74 68 65 79 20 73 6f 72 74 20 69  that they sort i
13ba0 6e 20 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65  n order of incre
13bb0 61 73 69 6e 67 20 64 69 73 74 61 6e 63 65 2e 0a  asing distance..
13bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
13bd0 4c 49 54 45 5f 43 44 45 43 4c 20 73 70 65 6c 6c  LITE_CDECL spell
13be0 66 69 78 31 52 6f 77 43 6f 6d 70 61 72 65 28 63  fix1RowCompare(c
13bf0 6f 6e 73 74 20 76 6f 69 64 20 2a 41 2c 20 63 6f  onst void *A, co
13c00 6e 73 74 20 76 6f 69 64 20 2a 42 29 7b 0a 20 20  nst void *B){.  
13c10 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70 65  const struct spe
13c20 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 61 20 3d 20  llfix1_row *a = 
13c30 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70  (const struct sp
13c40 65 6c 6c 66 69 78 31 5f 72 6f 77 2a 29 41 3b 0a  ellfix1_row*)A;.
13c50 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
13c60 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 62 20  pellfix1_row *b 
13c70 3d 20 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20  = (const struct 
13c80 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 2a 29 42  spellfix1_row*)B
13c90 3b 0a 20 20 72 65 74 75 72 6e 20 61 2d 3e 69 53  ;.  return a->iS
13ca0 63 6f 72 65 20 2d 20 62 2d 3e 69 53 63 6f 72 65  core - b->iScore
13cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72  ;.}../*.** A str
13cc0 75 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 70  ucture used to p
13cd0 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ass information 
13ce0 66 72 6f 6d 20 73 70 65 6c 6c 66 69 78 31 46 69  from spellfix1Fi
13cf0 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 29 0a 2a  lterForMatch().*
13d00 2a 20 69 6e 74 6f 20 73 70 65 6c 6c 66 69 78 31  * into spellfix1
13d10 52 75 6e 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 74  RunQuery()..*/.t
13d20 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 61  ypedef struct Ma
13d30 74 63 68 51 75 65 72 79 20 7b 0a 20 20 73 70 65  tchQuery {.  spe
13d40 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70  llfix1_cursor *p
13d50 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur;          /*
13d60 20 54 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   The cursor bein
13d70 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 73  g queried */.  s
13d80 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13d90 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
13da0 2f 2a 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20  /* shadow table 
13db0 71 75 65 72 79 20 73 74 61 74 6d 65 6e 74 20 2a  query statment *
13dc0 2f 0a 20 20 63 68 61 72 20 7a 48 61 73 68 5b 53  /.  char zHash[S
13dd0 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d  PELLFIX_MX_HASH]
13de0 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72  ;    /* The curr
13df0 65 6e 74 20 70 68 6f 6e 65 68 61 73 68 20 66 6f  ent phonehash fo
13e00 72 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20  r zPattern */.  
13e10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
13e20 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tern;           
13e30 20 2f 2a 20 54 72 61 6e 73 6c 69 74 65 72 61 74   /* Transliterat
13e40 65 64 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  ed input string 
13e50 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72  */.  int nPatter
13e60 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
13e70 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
13e80 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20  of zPattern */. 
13e90 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
13ea0 72 69 6e 67 20 2a 70 4d 61 74 63 68 53 74 72 33  ring *pMatchStr3
13eb0 3b 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 75 6e  ; /* Original un
13ec0 69 63 6f 64 65 20 73 74 72 69 6e 67 20 2a 2f 0a  icode string */.
13ed0 20 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69    EditDist3Confi
13ee0 67 20 2a 70 43 6f 6e 66 69 67 33 3b 20 20 20 20  g *pConfig3;    
13ef0 20 20 20 2f 2a 20 45 64 69 74 2d 64 69 73 74 61     /* Edit-dista
13f00 6e 63 65 20 63 6f 73 74 20 63 6f 65 66 66 69 63  nce cost coeffic
13f10 69 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  ients */.  const
13f20 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a   EditDist3Lang *
13f30 70 4c 61 6e 67 3b 20 20 20 20 20 20 2f 2a 20 54  pLang;      /* T
13f40 68 65 20 73 65 6c 65 63 74 65 64 20 6c 61 6e 67  he selected lang
13f50 75 61 67 65 20 63 6f 65 66 66 69 63 69 65 6e 74  uage coefficient
13f60 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67  s */.  int iLang
13f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
13f90 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20  anguage id */.  
13fa0 69 6e 74 20 69 53 63 6f 70 65 3b 20 20 20 20 20  int iScope;     
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fc0 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 63 6f 70   /* Default scop
13fd0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 61 78 44  e */.  int iMaxD
13fe0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
13ff0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
14000 75 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69 74 20  um allowed edit 
14010 64 69 73 74 61 6e 63 65 2c 20 6f 72 20 2d 31 20  distance, or -1 
14020 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
14050 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 75  ode */.  int nRu
14060 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
14070 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
14080 20 70 72 69 6f 72 20 72 75 6e 73 20 66 6f 72 20   prior runs for 
14090 74 68 65 20 73 61 6d 65 20 7a 50 61 74 74 65 72  the same zPatter
140a0 6e 20 2a 2f 0a 20 20 63 68 61 72 20 61 7a 50 72  n */.  char azPr
140b0 69 6f 72 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  ior[SPELLFIX_MX_
140c0 52 55 4e 5d 5b 53 50 45 4c 4c 46 49 58 5f 4d 58  RUN][SPELLFIX_MX
140d0 5f 48 41 53 48 5d 3b 20 20 2f 2a 20 50 72 69 6f  _HASH];  /* Prio
140e0 72 20 68 61 73 68 65 73 20 2a 2f 0a 7d 20 4d 61  r hashes */.} Ma
140f0 74 63 68 51 75 65 72 79 3b 0a 0a 2f 2a 0a 2a 2a  tchQuery;../*.**
14100 20 52 75 6e 20 61 20 71 75 65 72 79 20 6c 6f 6f   Run a query loo
14110 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  king for the bes
14120 74 20 6d 61 74 63 68 65 73 20 61 67 61 69 6e 73  t matches agains
14130 74 20 7a 50 61 74 74 65 72 6e 20 75 73 69 6e 67  t zPattern using
14140 0a 2a 2a 20 7a 48 61 73 68 20 61 73 20 74 68 65  .** zHash as the
14150 20 63 68 61 72 61 63 74 65 72 20 63 6c 61 73 73   character class
14160 20 73 65 65 64 20 68 61 73 68 2e 0a 2a 2f 0a 73   seed hash..*/.s
14170 74 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c  tatic void spell
14180 66 69 78 31 52 75 6e 51 75 65 72 79 28 4d 61 74  fix1RunQuery(Mat
14190 63 68 51 75 65 72 79 20 2a 70 2c 20 63 6f 6e 73  chQuery *p, cons
141a0 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 2c 20  t char *zQuery, 
141b0 69 6e 74 20 6e 51 75 65 72 79 29 7b 0a 20 20 63  int nQuery){.  c
141c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 31 3b 0a  onst char *zK1;.
141d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
141e0 6f 72 64 3b 0a 20 20 69 6e 74 20 69 44 69 73 74  ord;.  int iDist
141f0 3b 0a 20 20 69 6e 74 20 69 52 61 6e 6b 3b 0a 20  ;.  int iRank;. 
14200 20 69 6e 74 20 69 53 63 6f 72 65 3b 0a 20 20 69   int iScore;.  i
14210 6e 74 20 69 57 6f 72 73 74 20 3d 20 30 3b 0a 20  nt iWorst = 0;. 
14220 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
14230 69 64 78 57 6f 72 73 74 20 3d 20 2d 31 3b 0a 20  idxWorst = -1;. 
14240 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53   int i;.  int iS
14250 63 6f 70 65 20 3d 20 70 2d 3e 69 53 63 6f 70 65  cope = p->iScope
14260 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  ;.  spellfix1_cu
14270 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e  rsor *pCur = p->
14280 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pCur;.  sqlite3_
14290 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d  stmt *pStmt = p-
142a0 3e 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 7a  >pStmt;.  char z
142b0 48 61 73 68 31 5b 53 50 45 4c 4c 46 49 58 5f 4d  Hash1[SPELLFIX_M
142c0 58 5f 48 41 53 48 5d 3b 0a 20 20 63 68 61 72 20  X_HASH];.  char 
142d0 7a 48 61 73 68 32 5b 53 50 45 4c 4c 46 49 58 5f  zHash2[SPELLFIX_
142e0 4d 58 5f 48 41 53 48 5d 3b 0a 20 20 63 68 61 72  MX_HASH];.  char
142f0 20 2a 7a 43 6c 61 73 73 3b 0a 20 20 69 6e 74 20   *zClass;.  int 
14300 6e 43 6c 61 73 73 3b 0a 20 20 69 6e 74 20 72 63  nClass;.  int rc
14310 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 61  ;..  if( pCur->a
14320 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 20 72  ==0 || p->rc ) r
14330 65 74 75 72 6e 3b 20 20 20 2f 2a 20 50 72 69 6f  eturn;   /* Prio
14340 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  r memory allocat
14350 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  ion failure */. 
14360 20 7a 43 6c 61 73 73 20 3d 20 28 63 68 61 72 2a   zClass = (char*
14370 29 70 68 6f 6e 65 74 69 63 48 61 73 68 28 28 75  )phoneticHash((u
14380 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 51  nsigned char*)zQ
14390 75 65 72 79 2c 20 6e 51 75 65 72 79 29 3b 0a 20  uery, nQuery);. 
143a0 20 69 66 28 20 7a 43 6c 61 73 73 3d 3d 30 20 29   if( zClass==0 )
143b0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
143c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
143d0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 43  return;.  }.  nC
143e0 6c 61 73 73 20 3d 20 28 69 6e 74 29 73 74 72 6c  lass = (int)strl
143f0 65 6e 28 7a 43 6c 61 73 73 29 3b 0a 20 20 69 66  en(zClass);.  if
14400 28 20 6e 43 6c 61 73 73 3e 53 50 45 4c 4c 46 49  ( nClass>SPELLFI
14410 58 5f 4d 58 5f 48 41 53 48 2d 32 20 29 7b 0a 20  X_MX_HASH-2 ){. 
14420 20 20 20 6e 43 6c 61 73 73 20 3d 20 53 50 45 4c     nClass = SPEL
14430 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 3b 0a  LFIX_MX_HASH-2;.
14440 20 20 20 20 7a 43 6c 61 73 73 5b 6e 43 6c 61 73      zClass[nClas
14450 73 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  s] = 0;.  }.  if
14460 28 20 6e 43 6c 61 73 73 3c 3d 69 53 63 6f 70 65  ( nClass<=iScope
14470 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 43 6c 61   ){.    if( nCla
14480 73 73 3e 32 20 29 7b 0a 20 20 20 20 20 20 69 53  ss>2 ){.      iS
14490 63 6f 70 65 20 3d 20 6e 43 6c 61 73 73 2d 31 3b  cope = nClass-1;
144a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
144b0 20 20 69 53 63 6f 70 65 20 3d 20 6e 43 6c 61 73    iScope = nClas
144c0 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d  s;.    }.  }.  m
144d0 65 6d 63 70 79 28 7a 48 61 73 68 31 2c 20 7a 43  emcpy(zHash1, zC
144e0 6c 61 73 73 2c 20 69 53 63 6f 70 65 29 3b 0a 20  lass, iScope);. 
144f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
14500 6c 61 73 73 29 3b 0a 20 20 7a 48 61 73 68 31 5b  lass);.  zHash1[
14510 69 53 63 6f 70 65 5d 20 3d 20 30 3b 0a 20 20 6d  iScope] = 0;.  m
14520 65 6d 63 70 79 28 7a 48 61 73 68 32 2c 20 7a 48  emcpy(zHash2, zH
14530 61 73 68 31 2c 20 69 53 63 6f 70 65 29 3b 0a 20  ash1, iScope);. 
14540 20 7a 48 61 73 68 32 5b 69 53 63 6f 70 65 5d 20   zHash2[iScope] 
14550 3d 20 27 5a 27 3b 0a 20 20 7a 48 61 73 68 32 5b  = 'Z';.  zHash2[
14560 69 53 63 6f 70 65 2b 31 5d 20 3d 20 30 3b 0a 23  iScope+1] = 0;.#
14570 69 66 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52  if SPELLFIX_MX_R
14580 55 4e 3e 31 0a 20 20 66 6f 72 28 69 3d 30 3b 20  UN>1.  for(i=0; 
14590 69 3c 70 2d 3e 6e 52 75 6e 3b 20 69 2b 2b 29 7b  i<p->nRun; i++){
145a0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
145b0 70 2d 3e 61 7a 50 72 69 6f 72 5b 69 5d 2c 20 7a  p->azPrior[i], z
145c0 48 61 73 68 31 29 3d 3d 30 20 29 20 72 65 74 75  Hash1)==0 ) retu
145d0 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
145e0 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 75 6e   assert( p->nRun
145f0 3c 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e  <SPELLFIX_MX_RUN
14600 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e   );.  memcpy(p->
14610 61 7a 50 72 69 6f 72 5b 70 2d 3e 6e 52 75 6e 2b  azPrior[p->nRun+
14620 2b 5d 2c 20 7a 48 61 73 68 31 2c 20 69 53 63 6f  +], zHash1, iSco
14630 70 65 2b 31 29 3b 0a 20 20 69 66 28 20 73 71 6c  pe+1);.  if( sql
14640 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
14650 53 74 6d 74 2c 20 31 2c 20 7a 48 61 73 68 31 2c  Stmt, 1, zHash1,
14660 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
14670 49 43 29 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  IC)==SQLITE_NOME
14680 4d 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f  M.   || sqlite3_
14690 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
146a0 20 32 2c 20 7a 48 61 73 68 32 2c 20 2d 31 2c 20   2, zHash2, -1, 
146b0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3d 3d  SQLITE_STATIC)==
146c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 29  SQLITE_NOMEM.  )
146d0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
146e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
146f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 69 66 20  return;.  }.#if 
14700 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 3e  SPELLFIX_MX_RUN>
14710 31 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  1.  for(i=0; i<p
14720 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b  Cur->nRow; i++){
14730 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
14740 5b 69 5d 2e 69 53 63 6f 72 65 3e 69 57 6f 72 73  [i].iScore>iWors
14750 74 20 29 7b 0a 20 20 20 20 20 20 69 57 6f 72 73  t ){.      iWors
14760 74 20 3d 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69  t = pCur->a[i].i
14770 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 69 64 78  Score;.      idx
14780 57 6f 72 73 74 20 3d 20 69 3b 0a 20 20 20 20 7d  Worst = i;.    }
14790 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68  .  }.#endif.  wh
147a0 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
147b0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
147c0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ROW ){.    int 
147d0 69 4d 61 74 63 68 6c 65 6e 20 3d 20 2d 31 3b 0a  iMatchlen = -1;.
147e0 20 20 20 20 69 52 61 6e 6b 20 3d 20 73 71 6c 69      iRank = sqli
147f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
14800 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 66  Stmt, 2);.    if
14810 28 20 70 2d 3e 70 4d 61 74 63 68 53 74 72 33 20  ( p->pMatchStr3 
14820 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 6f  ){.      int nWo
14830 72 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rd = sqlite3_col
14840 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
14850 20 31 29 3b 0a 20 20 20 20 20 20 7a 57 6f 72 64   1);.      zWord
14860 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
14870 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
14880 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  ext(pStmt, 1);. 
14890 20 20 20 20 20 69 44 69 73 74 20 3d 20 65 64 69       iDist = edi
148a0 74 44 69 73 74 33 43 6f 72 65 28 70 2d 3e 70 4d  tDist3Core(p->pM
148b0 61 74 63 68 53 74 72 33 2c 20 7a 57 6f 72 64 2c  atchStr3, zWord,
148c0 20 6e 57 6f 72 64 2c 20 70 2d 3e 70 4c 61 6e 67   nWord, p->pLang
148d0 2c 20 26 69 4d 61 74 63 68 6c 65 6e 29 3b 0a 20  , &iMatchlen);. 
148e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
148f0 7a 4b 31 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zK1 = (const cha
14900 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
14910 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33 29  n_text(pStmt, 3)
14920 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4b 31 3d  ;.      if( zK1=
14930 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
14940 20 20 20 20 20 69 44 69 73 74 20 3d 20 65 64 69       iDist = edi
14950 74 64 69 73 74 31 28 70 2d 3e 7a 50 61 74 74 65  tdist1(p->zPatte
14960 72 6e 2c 20 7a 4b 31 2c 20 30 29 3b 0a 20 20 20  rn, zK1, 0);.   
14970 20 7d 0a 20 20 20 20 69 66 28 20 69 44 69 73 74   }.    if( iDist
14980 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  <0 ){.      p->r
14990 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
149a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
149b0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 6e     }.    pCur->n
149c0 53 65 61 72 63 68 2b 2b 3b 0a 20 20 20 20 0a 20  Search++;.    . 
149d0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
149e0 73 20 61 20 22 64 69 73 74 61 6e 63 65 20 3c 20  s a "distance < 
149f0 24 64 69 73 74 22 20 6f 72 20 22 64 69 73 74 61  $dist" or "dista
14a00 6e 63 65 20 3c 3d 20 24 64 69 73 74 22 20 63 6f  nce <= $dist" co
14a10 6e 73 74 72 61 69 6e 74 2c 0a 20 20 20 20 2a 2a  nstraint,.    **
14a20 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 72   check if this r
14a30 6f 77 20 6d 65 65 74 73 20 69 74 2e 20 49 66 20  ow meets it. If 
14a40 6e 6f 74 2c 20 6a 75 6d 70 20 62 61 63 6b 20 75  not, jump back u
14a50 70 20 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  p to the top of 
14a60 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 20  the.    ** loop 
14a70 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 6e  to process the n
14a80 65 78 74 20 72 6f 77 2e 20 4f 74 68 65 72 77 69  ext row. Otherwi
14a90 73 65 2c 20 69 66 20 74 68 65 20 72 6f 77 20 64  se, if the row d
14aa0 6f 65 73 20 6d 61 74 63 68 20 74 68 65 0a 20 20  oes match the.  
14ab0 20 20 2a 2a 20 64 69 73 74 61 6e 63 65 20 63 6f    ** distance co
14ac0 6e 73 74 72 61 69 6e 74 2c 20 63 68 65 63 6b 20  nstraint, check 
14ad0 69 66 20 74 68 65 20 70 43 75 72 2d 3e 61 5b 5d  if the pCur->a[]
14ae0 20 61 72 72 61 79 20 69 73 20 61 6c 72 65 61 64   array is alread
14af0 79 20 66 75 6c 6c 2e 0a 20 20 20 20 2a 2a 20 49  y full..    ** I
14b00 66 20 69 74 20 69 73 20 61 6e 64 20 6e 6f 20 65  f it is and no e
14b10 78 70 6c 69 63 69 74 20 22 74 6f 70 20 3d 20 3f  xplicit "top = ?
14b20 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 61 73  " constraint was
14b30 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a   present in the.
14b40 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 67 72      ** query, gr
14b50 6f 77 20 74 68 65 20 61 72 72 61 79 20 74 6f 20  ow the array to 
14b60 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 20  ensure there is 
14b70 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77  room for the new
14b80 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 61   entry. */.    a
14b90 73 73 65 72 74 28 20 28 70 2d 3e 69 4d 61 78 44  ssert( (p->iMaxD
14ba0 69 73 74 3e 3d 30 29 3d 3d 28 28 70 43 75 72 2d  ist>=0)==((pCur-
14bb0 3e 69 64 78 4e 75 6d 20 26 20 53 50 45 4c 4c 46  >idxNum & SPELLF
14bc0 49 58 5f 49 44 58 4e 55 4d 5f 44 49 53 54 29 20  IX_IDXNUM_DIST) 
14bd0 3f 20 31 20 3a 20 30 29 20 29 3b 0a 20 20 20 20  ? 1 : 0) );.    
14be0 69 66 28 20 70 2d 3e 69 4d 61 78 44 69 73 74 3e  if( p->iMaxDist>
14bf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
14c00 69 44 69 73 74 3e 70 2d 3e 69 4d 61 78 44 69 73  iDist>p->iMaxDis
14c10 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
14c20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 52      if( pCur->nR
14c30 6f 77 3e 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63  ow>=pCur->nAlloc
14c40 20 26 26 20 28 70 43 75 72 2d 3e 69 64 78 4e 75   && (pCur->idxNu
14c50 6d 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58  m & SPELLFIX_IDX
14c60 4e 55 4d 5f 54 4f 50 29 3d 3d 30 20 29 7b 0a 20  NUM_TOP)==0 ){. 
14c70 20 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31         spellfix1
14c80 52 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75  ResizeCursor(pCu
14c90 72 2c 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 2a  r, pCur->nAlloc*
14ca0 32 20 2b 20 31 30 29 3b 0a 20 20 20 20 20 20 20  2 + 10);.       
14cb0 20 69 66 28 20 70 43 75 72 2d 3e 61 3d 3d 30 20   if( pCur->a==0 
14cc0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
14cd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 53 63 6f  .    }..    iSco
14ce0 72 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 53 63  re = spellfix1Sc
14cf0 6f 72 65 28 69 44 69 73 74 2c 69 52 61 6e 6b 29  ore(iDist,iRank)
14d00 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
14d10 6e 52 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c 6c 6f  nRow<pCur->nAllo
14d20 63 20 29 7b 0a 20 20 20 20 20 20 69 64 78 20 3d  c ){.      idx =
14d30 20 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20   pCur->nRow;.   
14d40 20 7d 65 6c 73 65 20 69 66 28 20 69 53 63 6f 72   }else if( iScor
14d50 65 3c 69 57 6f 72 73 74 20 29 7b 0a 20 20 20 20  e<iWorst ){.    
14d60 20 20 69 64 78 20 3d 20 69 64 78 57 6f 72 73 74    idx = idxWorst
14d70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14d80 66 72 65 65 28 70 43 75 72 2d 3e 61 5b 69 64 78  free(pCur->a[idx
14d90 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20 20 20 7d 65  ].zWord);.    }e
14da0 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69  lse{.      conti
14db0 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
14dc0 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f  pCur->a[idx].zWo
14dd0 72 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rd = sqlite3_mpr
14de0 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74  intf("%s", sqlit
14df0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
14e00 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69  Stmt, 1));.    i
14e10 66 28 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e  f( pCur->a[idx].
14e20 7a 57 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20  zWord==0 ){.    
14e30 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14e40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 62 72  _NOMEM;.      br
14e50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
14e60 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 52 6f 77  Cur->a[idx].iRow
14e70 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
14e80 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
14e90 20 30 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61   0);.    pCur->a
14ea0 5b 69 64 78 5d 2e 69 52 61 6e 6b 20 3d 20 69 52  [idx].iRank = iR
14eb0 61 6e 6b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  ank;.    pCur->a
14ec0 5b 69 64 78 5d 2e 69 44 69 73 74 61 6e 63 65 20  [idx].iDistance 
14ed0 3d 20 69 44 69 73 74 3b 0a 20 20 20 20 70 43 75  = iDist;.    pCu
14ee0 72 2d 3e 61 5b 69 64 78 5d 2e 69 53 63 6f 72 65  r->a[idx].iScore
14ef0 20 3d 20 69 53 63 6f 72 65 3b 0a 20 20 20 20 70   = iScore;.    p
14f00 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 4d 61 74  Cur->a[idx].iMat
14f10 63 68 6c 65 6e 20 3d 20 69 4d 61 74 63 68 6c 65  chlen = iMatchle
14f20 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43  n;.    memcpy(pC
14f30 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 48 61 73 68  ur->a[idx].zHash
14f40 2c 20 7a 48 61 73 68 31 2c 20 69 53 63 6f 70 65  , zHash1, iScope
14f50 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  +1);.    if( pCu
14f60 72 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d 3e 6e 41  r->nRow<pCur->nA
14f70 6c 6c 6f 63 20 29 20 70 43 75 72 2d 3e 6e 52 6f  lloc ) pCur->nRo
14f80 77 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 43 75  w++;.    if( pCu
14f90 72 2d 3e 6e 52 6f 77 3d 3d 70 43 75 72 2d 3e 6e  r->nRow==pCur->n
14fa0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69  Alloc ){.      i
14fb0 57 6f 72 73 74 20 3d 20 70 43 75 72 2d 3e 61 5b  Worst = pCur->a[
14fc0 30 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20 20 20  0].iScore;.     
14fd0 20 69 64 78 57 6f 72 73 74 20 3d 20 30 3b 0a 20   idxWorst = 0;. 
14fe0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
14ff0 70 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29  pCur->nRow; i++)
15000 7b 0a 20 20 20 20 20 20 20 20 69 53 63 6f 72 65  {.        iScore
15010 20 3d 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69 53   = pCur->a[i].iS
15020 63 6f 72 65 3b 0a 20 20 20 20 20 20 20 20 69 66  core;.        if
15030 28 20 69 57 6f 72 73 74 3c 69 53 63 6f 72 65 20  ( iWorst<iScore 
15040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 57 6f  ){.          iWo
15050 72 73 74 20 3d 20 69 53 63 6f 72 65 3b 0a 20 20  rst = iScore;.  
15060 20 20 20 20 20 20 20 20 69 64 78 57 6f 72 73 74          idxWorst
15070 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = i;.        }.
15080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15090 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
150a0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
150b0 20 69 66 28 20 72 63 20 29 20 70 2d 3e 72 63 20   if( rc ) p->rc 
150c0 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  = rc;.}../*.** T
150d0 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  his version of t
150e0 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f  he xFilter metho
150f0 64 20 77 6f 72 6b 20 69 66 20 74 68 65 20 4d 41  d work if the MA
15100 54 43 48 20 74 65 72 6d 20 69 73 20 70 72 65 73  TCH term is pres
15110 65 6e 74 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ent.** and we ar
15120 65 20 64 6f 69 6e 67 20 61 20 73 63 61 6e 2e 0a  e doing a scan..
15130 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
15140 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72  ellfix1FilterFor
15150 4d 61 74 63 68 28 0a 20 20 73 70 65 6c 6c 66 69  Match(.  spellfi
15160 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 2c  x1_cursor *pCur,
15170 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
15180 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
15190 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78  rgv.){.  int idx
151a0 4e 75 6d 20 3d 20 70 43 75 72 2d 3e 69 64 78 4e  Num = pCur->idxN
151b0 75 6d 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  um;.  const unsi
151c0 67 6e 65 64 20 63 68 61 72 20 2a 7a 4d 61 74 63  gned char *zMatc
151d0 68 54 68 69 73 3b 20 20 20 2f 2a 20 52 48 53 20  hThis;   /* RHS 
151e0 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65  of the MATCH ope
151f0 72 61 74 6f 72 20 2a 2f 0a 20 20 45 64 69 74 44  rator */.  EditD
15200 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a  ist3FromString *
15210 70 4d 61 74 63 68 53 74 72 33 20 3d 20 30 3b 20  pMatchStr3 = 0; 
15220 2f 2a 20 7a 4d 61 74 63 68 54 68 69 73 20 61 73  /* zMatchThis as
15230 20 61 6e 20 65 64 69 74 64 69 73 74 20 73 74 72   an editdist str
15240 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ing */.  char *z
15250 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20  Pattern;        
15260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15270 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 6f  ransliteration o
15280 66 20 7a 4d 61 74 63 68 54 68 69 73 20 2a 2f 0a  f zMatchThis */.
15290 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20    int nPattern; 
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
152c0 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20  f zPattern */.  
152d0 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 32 30 3b  int iLimit = 20;
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72     /* Max number
15300 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70   of rows of outp
15310 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63 6f  ut */.  int iSco
15320 70 65 20 3d 20 33 3b 20 20 20 20 20 20 20 20 20  pe = 3;         
15330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
15340 65 20 74 68 69 73 20 6d 61 6e 79 20 63 68 61 72  e this many char
15350 61 63 74 65 72 73 20 6f 66 20 7a 43 6c 61 73 73  acters of zClass
15360 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 20   */.  int iLang 
15370 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
15380 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67           /* Lang
15390 75 61 67 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63  uage code */.  c
153a0 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20  har *zSql;      
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 20 20 2f 2a 20 53 51 4c 20 6f 66 20 73 68 61 64    /* SQL of shad
153d0 6f 77 20 74 61 62 6c 65 20 71 75 65 72 79 20 2a  ow table query *
153e0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
153f0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20   *pStmt = 0;    
15400 20 20 20 20 20 20 20 2f 2a 20 53 68 61 64 6f 77         /* Shadow
15410 20 74 61 62 6c 65 20 71 75 65 72 79 20 2a 2f 0a   table query */.
15420 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15440 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
15450 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ode */.  int idx
15460 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
15470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15480 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 66 69  ext available fi
15490 6c 74 65 72 20 70 61 72 61 6d 65 74 65 72 20 2a  lter parameter *
154a0 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  /.  spellfix1_vt
154b0 61 62 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 56  ab *p = pCur->pV
154c0 54 61 62 3b 20 20 20 2f 2a 20 54 68 65 20 76 69  Tab;   /* The vi
154d0 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
154e0 20 6f 77 6e 73 20 70 43 75 72 20 2a 2f 0a 20 20   owns pCur */.  
154f0 4d 61 74 63 68 51 75 65 72 79 20 78 3b 20 20 20  MatchQuery x;   
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 20 20 20 2f 2a 20 46 6f 72 20 70 61 73 73 69 6e     /* For passin
15520 67 20 69 6e 66 6f 20 74 6f 20 52 75 6e 51 75 65  g info to RunQue
15530 72 79 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f  ry() */..  /* Lo
15540 61 64 20 74 68 65 20 63 6f 73 74 20 74 61 62 6c  ad the cost tabl
15550 65 20 69 66 20 77 65 20 68 61 76 65 20 6e 6f 74  e if we have not
15560 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 73 6f   already done so
15570 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f   */.  if( p->zCo
15580 73 74 54 61 62 6c 65 21 3d 30 20 26 26 20 70 2d  stTable!=0 && p-
15590 3e 70 43 6f 6e 66 69 67 33 3d 3d 30 20 29 7b 0a  >pConfig3==0 ){.
155a0 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20      p->pConfig3 
155b0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
155c0 36 34 28 20 73 69 7a 65 6f 66 28 70 2d 3e 70 43  64( sizeof(p->pC
155d0 6f 6e 66 69 67 33 5b 30 5d 29 20 29 3b 0a 20 20  onfig3[0]) );.  
155e0 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
155f0 33 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  3==0 ) return SQ
15600 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
15610 6d 65 6d 73 65 74 28 70 2d 3e 70 43 6f 6e 66 69  memset(p->pConfi
15620 67 33 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d  g3, 0, sizeof(p-
15630 3e 70 43 6f 6e 66 69 67 33 5b 30 5d 29 29 3b 0a  >pConfig3[0]));.
15640 20 20 20 20 72 63 20 3d 20 65 64 69 74 44 69 73      rc = editDis
15650 74 33 43 6f 6e 66 69 67 4c 6f 61 64 28 70 2d 3e  t3ConfigLoad(p->
15660 70 43 6f 6e 66 69 67 33 2c 20 70 2d 3e 64 62 2c  pConfig3, p->db,
15670 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b   p->zCostTable);
15680 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
15690 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6d  turn rc;.  }.  m
156a0 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
156b0 65 6f 66 28 78 29 29 3b 0a 20 20 78 2e 69 53 63  eof(x));.  x.iSc
156c0 6f 70 65 20 3d 20 33 3b 20 20 2f 2a 20 44 65 66  ope = 3;  /* Def
156d0 61 75 6c 74 20 73 63 6f 70 65 20 69 66 20 6e 6f  ault scope if no
156e0 6e 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ne specified by 
156f0 22 57 48 45 52 45 20 73 63 6f 70 65 3d 4e 22 20  "WHERE scope=N" 
15700 2a 2f 0a 20 20 78 2e 69 4d 61 78 44 69 73 74 20  */.  x.iMaxDist 
15710 3d 20 2d 31 3b 20 20 20 2f 2a 20 4d 61 78 69 6d  = -1;   /* Maxim
15720 75 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69 74 20  um allowed edit 
15730 64 69 73 74 61 6e 63 65 20 2a 2f 0a 0a 20 20 69  distance */..  i
15740 66 28 20 69 64 78 4e 75 6d 26 32 20 29 7b 0a 20  f( idxNum&2 ){. 
15750 20 20 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74     iLang = sqlit
15760 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
15770 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 7d 0a 20  v[idx++]);.  }. 
15780 20 69 66 28 20 69 64 78 4e 75 6d 26 34 20 29 7b   if( idxNum&4 ){
15790 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71  .    iLimit = sq
157a0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
157b0 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20  argv[idx++]);.  
157c0 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 31 20 29    if( iLimit<1 )
157d0 20 69 4c 69 6d 69 74 20 3d 20 31 3b 0a 20 20 7d   iLimit = 1;.  }
157e0 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 26 38 20  .  if( idxNum&8 
157f0 29 7b 0a 20 20 20 20 78 2e 69 53 63 6f 70 65 20  ){.    x.iScope 
15800 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
15810 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29  int(argv[idx++])
15820 3b 0a 20 20 20 20 69 66 28 20 78 2e 69 53 63 6f  ;.    if( x.iSco
15830 70 65 3c 31 20 29 20 78 2e 69 53 63 6f 70 65 20  pe<1 ) x.iScope 
15840 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 78 2e 69  = 1;.    if( x.i
15850 53 63 6f 70 65 3e 53 50 45 4c 4c 46 49 58 5f 4d  Scope>SPELLFIX_M
15860 58 5f 48 41 53 48 2d 32 20 29 20 78 2e 69 53 63  X_HASH-2 ) x.iSc
15870 6f 70 65 20 3d 20 53 50 45 4c 4c 46 49 58 5f 4d  ope = SPELLFIX_M
15880 58 5f 48 41 53 48 2d 32 3b 0a 20 20 7d 0a 20 20  X_HASH-2;.  }.  
15890 69 66 28 20 69 64 78 4e 75 6d 26 28 31 36 7c 33  if( idxNum&(16|3
158a0 32 29 20 29 7b 0a 20 20 20 20 78 2e 69 4d 61 78  2) ){.    x.iMax
158b0 44 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  Dist = sqlite3_v
158c0 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64  alue_int(argv[id
158d0 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  x++]);.    if( i
158e0 64 78 4e 75 6d 26 31 36 20 29 20 78 2e 69 4d 61  dxNum&16 ) x.iMa
158f0 78 44 69 73 74 2d 2d 3b 0a 20 20 20 20 69 66 28  xDist--;.    if(
15900 20 78 2e 69 4d 61 78 44 69 73 74 3c 30 20 29 20   x.iMaxDist<0 ) 
15910 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 30 3b 0a  x.iMaxDist = 0;.
15920 20 20 7d 0a 20 20 73 70 65 6c 6c 66 69 78 31 52    }.  spellfix1R
15930 65 73 65 74 43 75 72 73 6f 72 28 70 43 75 72 29  esetCursor(pCur)
15940 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73  ;.  spellfix1Res
15950 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72 2c 20  izeCursor(pCur, 
15960 69 4c 69 6d 69 74 29 3b 0a 20 20 7a 4d 61 74 63  iLimit);.  zMatc
15970 68 54 68 69 73 20 3d 20 73 71 6c 69 74 65 33 5f  hThis = sqlite3_
15980 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
15990 30 5d 29 3b 0a 20 20 69 66 28 20 7a 4d 61 74 63  0]);.  if( zMatc
159a0 68 54 68 69 73 3d 3d 30 20 29 20 72 65 74 75 72  hThis==0 ) retur
159b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
159c0 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 29  f( p->pConfig3 )
159d0 7b 0a 20 20 20 20 78 2e 70 4c 61 6e 67 20 3d 20  {.    x.pLang = 
159e0 65 64 69 74 44 69 73 74 33 46 69 6e 64 4c 61 6e  editDist3FindLan
159f0 67 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 69  g(p->pConfig3, i
15a00 4c 61 6e 67 29 3b 0a 20 20 20 20 70 4d 61 74 63  Lang);.    pMatc
15a10 68 53 74 72 33 20 3d 20 65 64 69 74 44 69 73 74  hStr3 = editDist
15a20 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 78  3FromStringNew(x
15a30 2e 70 4c 61 6e 67 2c 20 28 63 6f 6e 73 74 20 63  .pLang, (const c
15a40 68 61 72 2a 29 7a 4d 61 74 63 68 54 68 69 73 2c  har*)zMatchThis,
15a50 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4d   -1);.    if( pM
15a60 61 74 63 68 53 74 72 33 3d 3d 30 20 29 7b 0a 20  atchStr3==0 ){. 
15a70 20 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49       x.rc = SQLI
15a80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
15a90 67 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78 69 74  goto filter_exit
15aa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
15ab0 0a 20 20 20 20 78 2e 70 4c 61 6e 67 20 3d 20 30  .    x.pLang = 0
15ac0 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 74 65 72 6e  ;.  }.  zPattern
15ad0 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c   = (char*)transl
15ae0 69 74 65 72 61 74 65 28 7a 4d 61 74 63 68 54 68  iterate(zMatchTh
15af0 69 73 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  is, sqlite3_valu
15b00 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
15b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
15b20 65 28 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e  e(pCur->zPattern
15b30 29 3b 0a 20 20 70 43 75 72 2d 3e 7a 50 61 74 74  );.  pCur->zPatt
15b40 65 72 6e 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a  ern = zPattern;.
15b50 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d    if( zPattern==
15b60 30 20 29 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20  0 ){.    x.rc = 
15b70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15b80 20 20 67 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78    goto filter_ex
15b90 69 74 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 74 65  it;.  }.  nPatte
15ba0 72 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  rn = (int)strlen
15bb0 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 69 66  (zPattern);.  if
15bc0 28 20 7a 50 61 74 74 65 72 6e 5b 6e 50 61 74 74  ( zPattern[nPatt
15bd0 65 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 20 6e 50  ern-1]=='*' ) nP
15be0 61 74 74 65 72 6e 2d 2d 3b 0a 20 20 7a 53 71 6c  attern--;.  zSql
15bf0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
15c00 74 66 28 0a 20 20 20 20 20 22 53 45 4c 45 43 54  tf(.     "SELECT
15c10 20 69 64 2c 20 77 6f 72 64 2c 20 72 61 6e 6b 2c   id, word, rank,
15c20 20 63 6f 61 6c 65 73 63 65 28 6b 31 2c 77 6f 72   coalesce(k1,wor
15c30 64 29 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d  d)".     "  FROM
15c40 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63   \"%w\".\"%w_voc
15c50 61 62 5c 22 22 0a 20 20 20 20 20 22 20 57 48 45  ab\"".     " WHE
15c60 52 45 20 6c 61 6e 67 69 64 3d 25 64 20 41 4e 44  RE langid=%d AND
15c70 20 6b 32 3e 3d 3f 31 20 41 4e 44 20 6b 32 3c 3f   k2>=?1 AND k2<?
15c80 32 22 2c 0a 20 20 20 20 20 70 2d 3e 7a 44 62 4e  2",.     p->zDbN
15c90 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61  ame, p->zTableNa
15ca0 6d 65 2c 20 69 4c 61 6e 67 0a 20 20 29 3b 0a 20  me, iLang.  );. 
15cb0 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
15cc0 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49 54      x.rc = SQLIT
15cd0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 53 74  E_NOMEM;.    pSt
15ce0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  mt = 0;.    goto
15cf0 20 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20 20   filter_exit;.  
15d00 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
15d10 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
15d20 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
15d30 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
15d40 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
15d50 20 70 43 75 72 2d 3e 69 4c 61 6e 67 20 3d 20 69   pCur->iLang = i
15d60 4c 61 6e 67 3b 0a 20 20 78 2e 70 43 75 72 20 3d  Lang;.  x.pCur =
15d70 20 70 43 75 72 3b 0a 20 20 78 2e 70 53 74 6d 74   pCur;.  x.pStmt
15d80 20 3d 20 70 53 74 6d 74 3b 0a 20 20 78 2e 7a 50   = pStmt;.  x.zP
15d90 61 74 74 65 72 6e 20 3d 20 7a 50 61 74 74 65 72  attern = zPatter
15da0 6e 3b 0a 20 20 78 2e 6e 50 61 74 74 65 72 6e 20  n;.  x.nPattern 
15db0 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 78 2e  = nPattern;.  x.
15dc0 70 4d 61 74 63 68 53 74 72 33 20 3d 20 70 4d 61  pMatchStr3 = pMa
15dd0 74 63 68 53 74 72 33 3b 0a 20 20 78 2e 69 4c 61  tchStr3;.  x.iLa
15de0 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a 20 20 78 2e  ng = iLang;.  x.
15df0 72 63 20 3d 20 72 63 3b 0a 20 20 78 2e 70 43 6f  rc = rc;.  x.pCo
15e00 6e 66 69 67 33 20 3d 20 70 2d 3e 70 43 6f 6e 66  nfig3 = p->pConf
15e10 69 67 33 3b 0a 20 20 69 66 28 20 78 2e 72 63 3d  ig3;.  if( x.rc=
15e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15e30 20 20 73 70 65 6c 6c 66 69 78 31 52 75 6e 51 75    spellfix1RunQu
15e40 65 72 79 28 26 78 2c 20 7a 50 61 74 74 65 72 6e  ery(&x, zPattern
15e50 2c 20 6e 50 61 74 74 65 72 6e 29 3b 0a 20 20 7d  , nPattern);.  }
15e60 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 61 20  ..  if( pCur->a 
15e70 29 7b 0a 20 20 20 20 71 73 6f 72 74 28 70 43 75  ){.    qsort(pCu
15e80 72 2d 3e 61 2c 20 70 43 75 72 2d 3e 6e 52 6f 77  r->a, pCur->nRow
15e90 2c 20 73 69 7a 65 6f 66 28 70 43 75 72 2d 3e 61  , sizeof(pCur->a
15ea0 5b 30 5d 29 2c 20 73 70 65 6c 6c 66 69 78 31 52  [0]), spellfix1R
15eb0 6f 77 43 6f 6d 70 61 72 65 29 3b 0a 20 20 20 20  owCompare);.    
15ec0 70 43 75 72 2d 3e 69 54 6f 70 20 3d 20 69 4c 69  pCur->iTop = iLi
15ed0 6d 69 74 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  mit;.    pCur->i
15ee0 53 63 6f 70 65 20 3d 20 69 53 63 6f 70 65 3b 0a  Scope = iScope;.
15ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 72    }else{.    x.r
15f00 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
15f10 3b 0a 20 20 7d 0a 0a 66 69 6c 74 65 72 5f 65 78  ;.  }..filter_ex
15f20 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  it:.  sqlite3_fi
15f30 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
15f40 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   editDist3FromSt
15f50 72 69 6e 67 44 65 6c 65 74 65 28 70 4d 61 74 63  ringDelete(pMatc
15f60 68 53 74 72 33 29 3b 0a 20 20 72 65 74 75 72 6e  hStr3);.  return
15f70 20 78 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   x.rc;.}../*.** 
15f80 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
15f90 78 46 69 6c 74 65 72 20 68 61 6e 64 6c 65 73 20  xFilter handles 
15fa0 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61  a full-table sca
15fb0 6e 20 63 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63  n case.*/.static
15fc0 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46 69   int spellfix1Fi
15fd0 6c 74 65 72 46 6f 72 46 75 6c 6c 53 63 61 6e 28  lterForFullScan(
15fe0 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  .  spellfix1_cur
15ff0 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 69 6e 74  sor *pCur,.  int
16000 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
16010 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
16020 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16030 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 64 78  TE_OK;.  int idx
16040 4e 75 6d 20 3d 20 70 43 75 72 2d 3e 69 64 78 4e  Num = pCur->idxN
16050 75 6d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  um;.  char *zSql
16060 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  ;.  spellfix1_vt
16070 61 62 20 2a 70 56 54 61 62 20 3d 20 70 43 75 72  ab *pVTab = pCur
16080 2d 3e 70 56 54 61 62 3b 0a 20 20 73 70 65 6c 6c  ->pVTab;.  spell
16090 66 69 78 31 52 65 73 65 74 43 75 72 73 6f 72 28  fix1ResetCursor(
160a0 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28  pCur);.  assert(
160b0 20 69 64 78 4e 75 6d 3d 3d 30 20 7c 7c 20 69 64   idxNum==0 || id
160c0 78 4e 75 6d 3d 3d 36 34 20 29 3b 0a 20 20 7a 53  xNum==64 );.  zS
160d0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
160e0 69 6e 74 66 28 0a 20 20 20 20 20 22 53 45 4c 45  intf(.     "SELE
160f0 43 54 20 77 6f 72 64 2c 20 72 61 6e 6b 2c 20 4e  CT word, rank, N
16100 55 4c 4c 2c 20 6c 61 6e 67 69 64 2c 20 69 64 20  ULL, langid, id 
16110 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77  FROM \"%w\".\"%w
16120 5f 76 6f 63 61 62 5c 22 25 73 22 2c 0a 20 20 20  _vocab\"%s",.   
16130 20 20 70 56 54 61 62 2d 3e 7a 44 62 4e 61 6d 65    pVTab->zDbName
16140 2c 20 70 56 54 61 62 2d 3e 7a 54 61 62 6c 65 4e  , pVTab->zTableN
16150 61 6d 65 2c 0a 20 20 20 20 20 28 28 69 64 78 4e  ame,.     ((idxN
16160 75 6d 20 26 20 36 34 29 20 3f 20 22 20 57 48 45  um & 64) ? " WHE
16170 52 45 20 72 6f 77 69 64 3d 3f 22 20 3a 20 22 22  RE rowid=?" : ""
16180 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 53 71  ).  );.  if( zSq
16190 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
161a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
161b0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
161c0 72 65 5f 76 32 28 70 56 54 61 62 2d 3e 64 62 2c  re_v2(pVTab->db,
161d0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72   zSql, -1, &pCur
161e0 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 30 29 3b  ->pFullScan, 0);
161f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16200 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d  zSql);.  if( rc=
16210 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69  =SQLITE_OK && (i
16220 64 78 4e 75 6d 20 26 20 36 34 29 20 29 7b 0a 20  dxNum & 64) ){. 
16230 20 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d     assert( argc=
16240 3d 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =1 );.    rc = s
16250 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75  qlite3_bind_valu
16260 65 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  e(pCur->pFullSca
16270 6e 2c 20 31 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  n, 1, argv[0]);.
16280 20 20 7d 0a 20 20 70 43 75 72 2d 3e 6e 52 6f 77    }.  pCur->nRow
16290 20 3d 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20   = pCur->iRow = 
162a0 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
162b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
162c0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
162d0 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 29  pCur->pFullScan)
162e0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
162f0 4c 49 54 45 5f 52 4f 57 20 29 7b 20 70 43 75 72  LITE_ROW ){ pCur
16300 2d 3e 69 52 6f 77 20 3d 20 2d 31 3b 20 72 63 20  ->iRow = -1; rc 
16310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20  = SQLITE_OK; }. 
16320 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16330 45 5f 44 4f 4e 45 20 29 7b 20 72 63 20 3d 20 53  E_DONE ){ rc = S
16340 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 7d 65  QLITE_OK; }.  }e
16350 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  lse{.    pCur->i
16360 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
16370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
16380 0a 2a 2a 20 43 61 6c 6c 65 64 20 74 6f 20 22 72  .** Called to "r
16390 65 77 69 6e 64 22 20 61 20 63 75 72 73 6f 72 20  ewind" a cursor 
163a0 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
163b0 6e 6e 69 6e 67 20 73 6f 20 74 68 61 74 0a 2a 2a  nning so that.**
163c0 20 69 74 20 73 74 61 72 74 73 20 69 74 73 20 6f   it starts its o
163d0 75 74 70 75 74 20 6f 76 65 72 20 61 67 61 69 6e  utput over again
163e0 2e 20 20 41 6c 77 61 79 73 20 63 61 6c 6c 65 64  .  Always called
163f0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 0a 2a   at least once.*
16400 2a 20 70 72 69 6f 72 20 74 6f 20 61 6e 79 20 73  * prior to any s
16410 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c 20  pellfix1Column, 
16420 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64 2c 20  spellfix1Rowid, 
16430 6f 72 20 73 70 65 6c 6c 66 69 78 31 45 6f 66 20  or spellfix1Eof 
16440 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
16450 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46 69 6c  int spellfix1Fil
16460 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter(.  sqlite3_v
16470 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
16480 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20   .  int idxNum, 
16490 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
164a0 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
164b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
164c0 61 72 67 76 0a 29 7b 0a 20 20 73 70 65 6c 6c 66  argv.){.  spellf
164d0 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
164e0 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75   = (spellfix1_cu
164f0 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 69 6e  rsor *)cur;.  in
16500 74 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 69 64  t rc;.  pCur->id
16510 78 4e 75 6d 20 3d 20 69 64 78 4e 75 6d 3b 0a 20  xNum = idxNum;. 
16520 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20 31 20   if( idxNum & 1 
16530 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 70 65 6c  ){.    rc = spel
16540 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d 61  lfix1FilterForMa
16550 74 63 68 28 70 43 75 72 2c 20 61 72 67 63 2c 20  tch(pCur, argc, 
16560 61 72 67 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  argv);.  }else{.
16570 20 20 20 20 72 63 20 3d 20 73 70 65 6c 6c 66 69      rc = spellfi
16580 78 31 46 69 6c 74 65 72 46 6f 72 46 75 6c 6c 53  x1FilterForFullS
16590 63 61 6e 28 70 43 75 72 2c 20 61 72 67 63 2c 20  can(pCur, argc, 
165a0 61 72 67 76 29 3b 0a 20 20 7d 0a 20 20 72 65 74  argv);.  }.  ret
165b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
165c0 2a 20 41 64 76 61 6e 63 65 20 61 20 63 75 72 73  * Advance a curs
165d0 6f 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20 72  or to its next r
165e0 6f 77 20 6f 66 20 6f 75 74 70 75 74 0a 2a 2f 0a  ow of output.*/.
165f0 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
16600 66 69 78 31 4e 65 78 74 28 73 71 6c 69 74 65 33  fix1Next(sqlite3
16610 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
16620 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  r){.  spellfix1_
16630 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
16640 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
16650 20 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20 72 63   *)cur;.  int rc
16660 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16670 69 66 28 20 70 43 75 72 2d 3e 69 52 6f 77 20 3c  if( pCur->iRow <
16680 20 70 43 75 72 2d 3e 6e 52 6f 77 20 29 7b 0a 20   pCur->nRow ){. 
16690 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46 75     if( pCur->pFu
166a0 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 20 20  llScan ){.      
166b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
166c0 70 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  p(pCur->pFullSca
166d0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
166e0 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 70  !=SQLITE_ROW ) p
166f0 43 75 72 2d 3e 69 52 6f 77 20 3d 20 70 43 75 72  Cur->iRow = pCur
16700 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66  ->nRow;.      if
16710 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
16720 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
16730 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
16740 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
16750 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 52 6f  .      pCur->iRo
16760 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  w++;.    }.  }. 
16770 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16780 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
16790 20 69 66 20 77 65 20 61 72 65 20 61 74 20 74 68   if we are at th
167a0 65 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 0a 2a 2f  e end-of-file.*/
167b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
167c0 6c 66 69 78 31 45 6f 66 28 73 71 6c 69 74 65 33  lfix1Eof(sqlite3
167d0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
167e0 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  r){.  spellfix1_
167f0 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
16800 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
16810 20 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e   *)cur;.  return
16820 20 70 43 75 72 2d 3e 69 52 6f 77 3e 3d 70 43 75   pCur->iRow>=pCu
16830 72 2d 3e 6e 52 6f 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->nRow;.}../*.*
16840 2a 20 52 65 74 75 72 6e 20 63 6f 6c 75 6d 6e 73  * Return columns
16850 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
16860 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
16870 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 6f   int spellfix1Co
16880 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  lumn(.  sqlite3_
16890 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
168a0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ,.  sqlite3_cont
168b0 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20  ext *ctx,.  int 
168c0 69 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  i.){.  spellfix1
168d0 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
168e0 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
168f0 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70 43  r*)cur;.  if( pC
16900 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b  ur->pFullScan ){
16910 0a 20 20 20 20 69 66 28 20 69 3c 3d 53 50 45 4c  .    if( i<=SPEL
16920 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20  LFIX_COL_LANGID 
16930 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16940 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
16950 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  x, sqlite3_colum
16960 6e 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70 46  n_value(pCur->pF
16970 75 6c 6c 53 63 61 6e 2c 20 69 29 29 3b 0a 20 20  ullScan, i));.  
16980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
16990 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
169a0 6c 6c 28 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20  ll(ctx);.    }. 
169b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
169c0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  _OK;.  }.  switc
169d0 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65  h( i ){.    case
169e0 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f   SPELLFIX_COL_WO
169f0 52 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RD: {.      sqli
16a00 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
16a10 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75  ctx, pCur->a[pCu
16a20 72 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64 2c 20  r->iRow].zWord, 
16a30 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
16a40 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
16a50 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16a60 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e  SPELLFIX_COL_RAN
16a70 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K: {.      sqlit
16a80 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
16a90 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d  x, pCur->a[pCur-
16aa0 3e 69 52 6f 77 5d 2e 69 52 61 6e 6b 29 3b 0a 20  >iRow].iRank);. 
16ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16ac0 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c  }.    case SPELL
16ad0 46 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e 43 45  FIX_COL_DISTANCE
16ae0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
16af0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
16b00 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e  , pCur->a[pCur->
16b10 69 52 6f 77 5d 2e 69 44 69 73 74 61 6e 63 65 29  iRow].iDistance)
16b20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16b30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50     }.    case SP
16b40 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49  ELLFIX_COL_LANGI
16b50 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
16b60 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
16b70 78 2c 20 70 43 75 72 2d 3e 69 4c 61 6e 67 29 3b  x, pCur->iLang);
16b80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16b90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45    }.    case SPE
16ba0 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 3a  LLFIX_COL_SCORE:
16bb0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16bc0 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c  _result_int(ctx,
16bd0 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69   pCur->a[pCur->i
16be0 52 6f 77 5d 2e 69 53 63 6f 72 65 29 3b 0a 20 20  Row].iScore);.  
16bf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16c00 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
16c10 49 58 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45 4e 3a  IX_COL_MATCHLEN:
16c20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61   {.      int iMa
16c30 74 63 68 6c 65 6e 20 3d 20 70 43 75 72 2d 3e 61  tchlen = pCur->a
16c40 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 4d 61  [pCur->iRow].iMa
16c50 74 63 68 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66  tchlen;.      if
16c60 28 20 69 4d 61 74 63 68 6c 65 6e 3c 30 20 29 7b  ( iMatchlen<0 ){
16c70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61  .        int nPa
16c80 74 74 65 72 6e 20 3d 20 28 69 6e 74 29 73 74 72  ttern = (int)str
16c90 6c 65 6e 28 70 43 75 72 2d 3e 7a 50 61 74 74 65  len(pCur->zPatte
16ca0 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61  rn);.        cha
16cb0 72 20 2a 7a 57 6f 72 64 20 3d 20 70 43 75 72 2d  r *zWord = pCur-
16cc0 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a  >a[pCur->iRow].z
16cd0 57 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  Word;.        in
16ce0 74 20 6e 57 6f 72 64 20 3d 20 28 69 6e 74 29 73  t nWord = (int)s
16cf0 74 72 6c 65 6e 28 7a 57 6f 72 64 29 3b 0a 0a 20  trlen(zWord);.. 
16d00 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 74 74         if( nPatt
16d10 65 72 6e 3e 30 20 26 26 20 70 43 75 72 2d 3e 7a  ern>0 && pCur->z
16d20 50 61 74 74 65 72 6e 5b 6e 50 61 74 74 65 72 6e  Pattern[nPattern
16d30 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  -1]=='*' ){.    
16d40 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61        char *zTra
16d50 6e 73 6c 69 74 3b 0a 20 20 20 20 20 20 20 20 20  nslit;.         
16d60 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
16d70 20 20 20 20 7a 54 72 61 6e 73 6c 69 74 20 3d 20      zTranslit = 
16d80 28 63 68 61 72 20 2a 29 74 72 61 6e 73 6c 69 74  (char *)translit
16d90 65 72 61 74 65 28 28 75 6e 73 69 67 6e 65 64 20  erate((unsigned 
16da0 63 68 61 72 20 2a 29 7a 57 6f 72 64 2c 20 6e 57  char *)zWord, nW
16db0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ord);.          
16dc0 69 66 28 20 21 7a 54 72 61 6e 73 6c 69 74 20 29  if( !zTranslit )
16dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16de0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
16df0 72 65 73 20 3d 20 65 64 69 74 64 69 73 74 31 28  res = editdist1(
16e00 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 2c 20  pCur->zPattern, 
16e10 7a 54 72 61 6e 73 6c 69 74 2c 20 26 69 4d 61 74  zTranslit, &iMat
16e20 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  chlen);.        
16e30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
16e40 54 72 61 6e 73 6c 69 74 29 3b 0a 20 20 20 20 20  Translit);.     
16e50 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
16e60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16e70 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
16e80 69 4d 61 74 63 68 6c 65 6e 20 3d 20 74 72 61 6e  iMatchlen = tran
16e90 73 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65 6e 28  slen_to_charlen(
16ea0 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20 69 4d  zWord, nWord, iM
16eb0 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20  atchlen);.      
16ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16ed0 20 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 75     iMatchlen = u
16ee0 74 66 38 43 68 61 72 6c 65 6e 28 7a 57 6f 72 64  tf8Charlen(zWord
16ef0 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20  , nWord);.      
16f00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
16f10 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
16f20 74 5f 69 6e 74 28 63 74 78 2c 20 69 4d 61 74 63  t_int(ctx, iMatc
16f30 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  hlen);.      bre
16f40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16f50 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
16f60 50 48 4f 4e 45 48 41 53 48 3a 20 7b 0a 20 20 20  PHONEHASH: {.   
16f70 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
16f80 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43 75 72  t_text(ctx, pCur
16f90 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e  ->a[pCur->iRow].
16fa0 7a 48 61 73 68 2c 20 2d 31 2c 20 53 51 4c 49 54  zHash, -1, SQLIT
16fb0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
16fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16fd0 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f    case SPELLFIX_
16fe0 43 4f 4c 5f 54 4f 50 3a 20 7b 0a 20 20 20 20 20  COL_TOP: {.     
16ff0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
17000 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 69  int(ctx, pCur->i
17010 54 6f 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Top);.      brea
17020 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17030 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53  e SPELLFIX_COL_S
17040 43 4f 50 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  COPE: {.      sq
17050 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
17060 28 63 74 78 2c 20 70 43 75 72 2d 3e 69 53 63 6f  (ctx, pCur->iSco
17070 70 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pe);.      break
17080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17090 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52   SPELLFIX_COL_SR
170a0 43 48 43 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73  CHCNT: {.      s
170b0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
170c0 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 6e 53 65  t(ctx, pCur->nSe
170d0 61 72 63 68 29 3b 0a 20 20 20 20 20 20 62 72 65  arch);.      bre
170e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
170f0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
17100 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75  qlite3_result_nu
17110 6c 6c 28 63 74 78 29 3b 0a 20 20 20 20 20 20 62  ll(ctx);.      b
17120 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17140 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
17150 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69   rowid..*/.stati
17160 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52  c int spellfix1R
17170 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61  owid(sqlite3_vta
17180 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73  b_cursor *cur, s
17190 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f  qlite_int64 *pRo
171a0 77 69 64 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  wid){.  spellfix
171b0 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  1_cursor *pCur =
171c0 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73   (spellfix1_curs
171d0 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70  or*)cur;.  if( p
171e0 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29  Cur->pFullScan )
171f0 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20  {.    *pRowid = 
17200 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
17210 6e 74 36 34 28 70 43 75 72 2d 3e 70 46 75 6c 6c  nt64(pCur->pFull
17220 53 63 61 6e 2c 20 34 29 3b 0a 20 20 7d 65 6c 73  Scan, 4);.  }els
17230 65 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d  e{.    *pRowid =
17240 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69   pCur->a[pCur->i
17250 52 6f 77 5d 2e 69 52 6f 77 69 64 3b 0a 20 20 7d  Row].iRowid;.  }
17260 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17270 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
17280 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
17290 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55 70  alled by the xUp
172a0 64 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 20 49  date() method. I
172b0 74 20 72 65 74 75 72 6e 73 20 61 20 73 74 72 69  t returns a stri
172c0 6e 67 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  ng.** containing
172d0 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d 6f   the conflict mo
172e0 64 65 20 74 68 61 74 20 78 55 70 64 61 74 65 28  de that xUpdate(
172f0 29 20 73 68 6f 75 6c 64 20 75 73 65 20 66 6f 72  ) should use for
17300 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
17310 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f  operation. One o
17320 66 3a 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 22  f: "ROLLBACK", "
17330 49 47 4e 4f 52 45 22 2c 20 22 41 42 4f 52 54 22  IGNORE", "ABORT"
17340 20 6f 72 20 22 52 45 50 4c 41 43 45 22 2e 0a 2a   or "REPLACE"..*
17350 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
17360 68 61 72 20 2a 73 70 65 6c 6c 66 69 78 31 47 65  har *spellfix1Ge
17370 74 43 6f 6e 66 6c 69 63 74 28 73 71 6c 69 74 65  tConflict(sqlite
17380 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
17390 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43   const char *azC
173a0 6f 6e 66 6c 69 63 74 5b 5d 20 3d 20 7b 0a 20 20  onflict[] = {.  
173b0 20 20 2f 2a 20 4e 6f 74 65 3a 20 49 6e 73 74 65    /* Note: Inste
173c0 61 64 20 6f 66 20 22 46 41 49 4c 22 20 2d 20 22  ad of "FAIL" - "
173d0 41 42 4f 52 54 22 2e 20 2a 2f 0a 20 20 20 20 22  ABORT". */.    "
173e0 52 4f 4c 4c 42 41 43 4b 22 2c 20 22 49 47 4e 4f  ROLLBACK", "IGNO
173f0 52 45 22 2c 20 22 41 42 4f 52 54 22 2c 20 22 41  RE", "ABORT", "A
17400 42 4f 52 54 22 2c 20 22 52 45 50 4c 41 43 45 22  BORT", "REPLACE"
17410 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 65 43 6f 6e  .  };.  int eCon
17420 66 6c 69 63 74 20 3d 20 73 71 6c 69 74 65 33 5f  flict = sqlite3_
17430 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74  vtab_on_conflict
17440 28 64 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  (db);..  assert(
17450 20 65 43 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49   eConflict==SQLI
17460 54 45 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65  TE_ROLLBACK || e
17470 43 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54 45  Conflict==SQLITE
17480 5f 49 47 4e 4f 52 45 0a 20 20 20 20 20 20 20 7c  _IGNORE.       |
17490 7c 20 65 43 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c  | eConflict==SQL
174a0 49 54 45 5f 46 41 49 4c 20 7c 7c 20 65 43 6f 6e  ITE_FAIL || eCon
174b0 66 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f 41 42  flict==SQLITE_AB
174c0 4f 52 54 0a 20 20 20 20 20 20 20 7c 7c 20 65 43  ORT.       || eC
174d0 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f  onflict==SQLITE_
174e0 52 45 50 4c 41 43 45 0a 20 20 29 3b 0a 20 20 61  REPLACE.  );.  a
174f0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 52 4f  ssert( SQLITE_RO
17500 4c 4c 42 41 43 4b 3d 3d 31 20 29 3b 0a 20 20 61  LLBACK==1 );.  a
17510 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 49 47  ssert( SQLITE_IG
17520 4e 4f 52 45 3d 3d 32 20 29 3b 0a 20 20 61 73 73  NORE==2 );.  ass
17530 65 72 74 28 20 53 51 4c 49 54 45 5f 46 41 49 4c  ert( SQLITE_FAIL
17540 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==3 );.  assert(
17550 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3d 3d 34   SQLITE_ABORT==4
17560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
17570 4c 49 54 45 5f 52 45 50 4c 41 43 45 3d 3d 35 20  LITE_REPLACE==5 
17580 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 7a 43  );..  return azC
17590 6f 6e 66 6c 69 63 74 5b 65 43 6f 6e 66 6c 69 63  onflict[eConflic
175a0 74 2d 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  t-1];.}../*.** T
175b0 68 65 20 78 55 70 64 61 74 65 28 29 20 6d 65 74  he xUpdate() met
175c0 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
175d0 6e 74 20 73 70 65 6c 6c 66 69 78 31 55 70 64 61  nt spellfix1Upda
175e0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  te(.  sqlite3_vt
175f0 61 62 20 2a 70 56 54 61 62 2c 0a 20 20 69 6e 74  ab *pVTab,.  int
17600 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
17610 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 2c 0a 20  _value **argv,. 
17620 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
17630 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 72  Rowid.){.  int r
17640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17650 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72   sqlite3_int64 r
17660 6f 77 69 64 2c 20 6e 65 77 52 6f 77 69 64 3b 0a  owid, newRowid;.
17670 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62    spellfix1_vtab
17680 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31   *p = (spellfix1
17690 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20  _vtab*)pVTab;.  
176a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
176b0 3e 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  >db;..  if( argc
176c0 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20  ==1 ){.    /* A 
176d0 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e  delete operation
176e0 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 67 69   on the rowid gi
176f0 76 65 6e 20 62 79 20 61 72 67 76 5b 30 5d 20 2a  ven by argv[0] *
17700 2f 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 2a 70  /.    rowid = *p
17710 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
17720 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
17730 5b 30 5d 29 3b 0a 20 20 20 20 73 70 65 6c 6c 66  [0]);.    spellf
17740 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64  ix1DbExec(&rc, d
17750 62 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  b, "DELETE FROM 
17760 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
17770 62 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20  b\" ".          
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17790 20 22 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64   " WHERE id=%lld
177a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
177b0 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c       p->zDbName,
177c0 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20   p->zTableName, 
177d0 72 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  rowid);.  }else{
177e0 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
177f0 6e 65 64 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  ned char *zWord 
17800 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
17810 74 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46  text(argv[SPELLF
17820 49 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b  IX_COL_WORD+2]);
17830 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d  .    int nWord =
17840 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
17850 79 74 65 73 28 61 72 67 76 5b 53 50 45 4c 4c 46  ytes(argv[SPELLF
17860 49 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b  IX_COL_WORD+2]);
17870 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d  .    int iLang =
17880 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
17890 6e 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  nt(argv[SPELLFIX
178a0 5f 43 4f 4c 5f 4c 41 4e 47 49 44 2b 32 5d 29 3b  _COL_LANGID+2]);
178b0 0a 20 20 20 20 69 6e 74 20 69 52 61 6e 6b 20 3d  .    int iRank =
178c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
178d0 6e 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  nt(argv[SPELLFIX
178e0 5f 43 4f 4c 5f 52 41 4e 4b 2b 32 5d 29 3b 0a 20  _COL_RANK+2]);. 
178f0 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
17900 64 20 63 68 61 72 20 2a 7a 53 6f 75 6e 64 73 6c  d char *zSoundsl
17910 69 6b 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  ike =.          
17920 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
17930 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49  ext(argv[SPELLFI
17940 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45  X_COL_SOUNDSLIKE
17950 2b 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 53  +2]);.    int nS
17960 6f 75 6e 64 73 6c 69 6b 65 20 3d 20 73 71 6c 69  oundslike = sqli
17970 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
17980 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f  argv[SPELLFIX_CO
17990 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d 29  L_SOUNDSLIKE+2])
179a0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b 31 2c  ;.    char *zK1,
179b0 20 2a 7a 4b 32 3b 0a 20 20 20 20 69 6e 74 20 69   *zK2;.    int i
179c0 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20  ;.    char c;.  
179d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
179e0 6f 6e 66 6c 69 63 74 20 3d 20 73 70 65 6c 6c 66  onflict = spellf
179f0 69 78 31 47 65 74 43 6f 6e 66 6c 69 63 74 28 64  ix1GetConflict(d
17a00 62 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 57 6f  b);..    if( zWo
17a10 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  rd==0 ){.      /
17a20 2a 20 49 6e 73 65 72 74 73 20 6f 66 20 74 68 65  * Inserts of the
17a30 20 66 6f 72 6d 3a 20 20 49 4e 53 45 52 54 20 49   form:  INSERT I
17a40 4e 54 4f 20 74 61 62 6c 65 28 63 6f 6d 6d 61 6e  NTO table(comman
17a50 64 29 20 56 41 4c 55 45 53 28 27 78 79 7a 7a 79  d) VALUES('xyzzy
17a60 27 29 3b 0a 20 20 20 20 20 20 2a 2a 20 63 61 75  ');.      ** cau
17a70 73 65 20 7a 57 6f 72 64 20 74 6f 20 62 65 20 4e  se zWord to be N
17a80 55 4c 4c 2c 20 73 6f 20 77 65 20 6c 6f 6f 6b 20  ULL, so we look 
17a90 61 74 20 74 68 65 20 22 63 6f 6d 6d 61 6e 64 22  at the "command"
17aa0 20 63 6f 6c 75 6d 6e 20 74 6f 20 73 65 65 0a 20   column to see. 
17ab0 20 20 20 20 20 2a 2a 20 77 68 61 74 20 73 70 65       ** what spe
17ac0 63 69 61 6c 20 61 63 74 69 6f 6e 73 20 74 6f 20  cial actions to 
17ad0 74 61 6b 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  take */.      co
17ae0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d  nst char *zCmd =
17af0 20 0a 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73   .         (cons
17b00 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
17b10 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
17b20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43 4f 4d  SPELLFIX_COL_COM
17b30 4d 41 4e 44 2b 32 5d 29 3b 0a 20 20 20 20 20 20  MAND+2]);.      
17b40 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 7b 0a 20  if( zCmd==0 ){. 
17b50 20 20 20 20 20 20 20 70 56 54 61 62 2d 3e 7a 45         pVTab->zE
17b60 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
17b70 6d 70 72 69 6e 74 66 28 22 4e 4f 54 20 4e 55 4c  mprintf("NOT NUL
17b80 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  L constraint fai
17b90 6c 65 64 3a 20 25 73 2e 77 6f 72 64 22 2c 0a 20  led: %s.word",. 
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bc0 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 61 62 6c          p->zTabl
17bd0 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  eName);.        
17be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17bf0 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c  NSTRAINT_NOTNULL
17c00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17c10 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
17c20 22 72 65 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20  "reset")==0 ){. 
17c30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20         /* Reset 
17c40 74 68 65 20 20 65 64 69 74 20 63 6f 73 74 20 74  the  edit cost t
17c50 61 62 6c 65 20 28 69 66 20 74 68 65 72 65 20 69  able (if there i
17c60 73 20 6f 6e 65 29 2e 20 2a 2f 0a 20 20 20 20 20  s one). */.     
17c70 20 20 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66     editDist3Conf
17c80 69 67 44 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e  igDelete(p->pCon
17c90 66 69 67 33 29 3b 0a 20 20 20 20 20 20 20 20 70  fig3);.        p
17ca0 2d 3e 70 43 6f 6e 66 69 67 33 20 3d 20 30 3b 0a  ->pConfig3 = 0;.
17cb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
17cc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
17cd0 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  }.      if( strn
17ce0 63 6d 70 28 7a 43 6d 64 2c 22 65 64 69 74 5f 63  cmp(zCmd,"edit_c
17cf0 6f 73 74 5f 74 61 62 6c 65 3d 22 2c 31 36 29 3d  ost_table=",16)=
17d00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 64  =0 ){.        ed
17d10 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c  itDist3ConfigDel
17d20 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69 67 33 29  ete(p->pConfig3)
17d30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 43 6f  ;.        p->pCo
17d40 6e 66 69 67 33 20 3d 20 30 3b 0a 20 20 20 20 20  nfig3 = 0;.     
17d50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17d60 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b 0a  p->zCostTable);.
17d70 20 20 20 20 20 20 20 20 70 2d 3e 7a 43 6f 73 74          p->zCost
17d80 54 61 62 6c 65 20 3d 20 73 70 65 6c 6c 66 69 78  Table = spellfix
17d90 31 44 65 71 75 6f 74 65 28 7a 43 6d 64 2b 31 36  1Dequote(zCmd+16
17da0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
17db0 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d 30 20  ->zCostTable==0 
17dc0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
17dd0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 69  NOMEM;.        i
17de0 66 28 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65  f( p->zCostTable
17df0 5b 30 5d 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  [0]==0 || sqlite
17e00 33 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a 43 6f  3_stricmp(p->zCo
17e10 73 74 54 61 62 6c 65 2c 22 6e 75 6c 6c 22 29 3d  stTable,"null")=
17e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
17e30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
17e40 7a 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20 20 20  zCostTable);.   
17e50 20 20 20 20 20 20 20 70 2d 3e 7a 43 6f 73 74 54         p->zCostT
17e60 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
17e70 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
17e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17e90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 56 54 61      }.      pVTa
17ea0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  b->zErrMsg = sql
17eb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e  ite3_mprintf("un
17ec0 6b 6e 6f 77 6e 20 76 61 6c 75 65 20 66 6f 72 20  known value for 
17ed0 25 73 2e 63 6f 6d 6d 61 6e 64 3a 20 5c 22 25 77  %s.command: \"%w
17ee0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
17f10 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 43 6d 64 29  TableName, zCmd)
17f20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
17f30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
17f40 20 7d 0a 20 20 20 20 69 66 28 20 69 52 61 6e 6b   }.    if( iRank
17f50 3c 31 20 29 20 69 52 61 6e 6b 20 3d 20 31 3b 0a  <1 ) iRank = 1;.
17f60 20 20 20 20 69 66 28 20 7a 53 6f 75 6e 64 73 6c      if( zSoundsl
17f70 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 7a 4b 31  ike ){.      zK1
17f80 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c   = (char*)transl
17f90 69 74 65 72 61 74 65 28 7a 53 6f 75 6e 64 73 6c  iterate(zSoundsl
17fa0 69 6b 65 2c 20 6e 53 6f 75 6e 64 73 6c 69 6b 65  ike, nSoundslike
17fb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17fc0 20 20 20 20 7a 4b 31 20 3d 20 28 63 68 61 72 2a      zK1 = (char*
17fd0 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a  )transliterate(z
17fe0 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20 20  Word, nWord);.  
17ff0 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4b 31 3d    }.    if( zK1=
18000 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18010 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 66 6f  TE_NOMEM;.    fo
18020 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 4b 31 5b  r(i=0; (c = zK1[
18030 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
18040 20 20 20 20 20 69 66 28 20 63 3e 3d 27 41 27 20       if( c>='A' 
18050 26 26 20 63 3c 3d 27 5a 27 20 29 20 7a 4b 31 5b  && c<='Z' ) zK1[
18060 69 5d 20 2b 3d 20 27 61 27 20 2d 20 27 41 27 3b  i] += 'a' - 'A';
18070 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4b 32 20 3d  .    }.    zK2 =
18080 20 28 63 68 61 72 2a 29 70 68 6f 6e 65 74 69 63   (char*)phonetic
18090 48 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69  Hash((const unsi
180a0 67 6e 65 64 20 63 68 61 72 2a 29 7a 4b 31 2c 20  gned char*)zK1, 
180b0 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 4b 32 3d  i);.    if( zK2=
180c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
180d0 74 65 33 5f 66 72 65 65 28 7a 4b 31 29 3b 0a 20  te3_free(zK1);. 
180e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
180f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
18100 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
18110 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b  value_type(argv[
18120 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  0])==SQLITE_NULL
18130 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
18140 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
18150 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54  (argv[1])==SQLIT
18160 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  E_NULL ){.      
18170 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65    spellfix1DbExe
18180 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20  c(&rc, db,.     
18190 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
181a0 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 2e 5c 22  T INTO \"%w\".\"
181b0 25 77 5f 76 6f 63 61 62 5c 22 28 72 61 6e 6b 2c  %w_vocab\"(rank,
181c0 6c 61 6e 67 69 64 2c 77 6f 72 64 2c 6b 31 2c 6b  langid,word,k1,k
181d0 32 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  2) ".           
181e0 20 20 20 20 22 56 41 4c 55 45 53 28 25 64 2c 25      "VALUES(%d,%
181f0 64 2c 25 51 2c 6e 75 6c 6c 69 66 28 25 51 2c 25  d,%Q,nullif(%Q,%
18200 51 29 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20  Q),%Q)",.       
18210 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61          p->zDbNa
18220 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
18230 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
18240 20 20 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20    iRank, iLang, 
18250 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 57 6f 72  zWord, zK1, zWor
18260 64 2c 20 7a 4b 32 0a 20 20 20 20 20 20 20 20 29  d, zK2.        )
18270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18280 20 20 20 20 20 20 20 6e 65 77 52 6f 77 69 64 20         newRowid 
18290 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
182a0 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a  int64(argv[1]);.
182b0 20 20 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78          spellfix
182c0 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  1DbExec(&rc, db,
182d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e  .            "IN
182e0 53 45 52 54 20 4f 52 20 25 73 20 49 4e 54 4f 20  SERT OR %s INTO 
182f0 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
18300 62 5c 22 28 69 64 2c 72 61 6e 6b 2c 6c 61 6e 67  b\"(id,rank,lang
18310 69 64 2c 77 6f 72 64 2c 6b 31 2c 6b 32 29 20 22  id,word,k1,k2) "
18320 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 56 41  .            "VA
18330 4c 55 45 53 28 25 6c 6c 64 2c 25 64 2c 25 64 2c  LUES(%lld,%d,%d,
18340 25 51 2c 6e 75 6c 6c 69 66 28 25 51 2c 25 51 29  %Q,nullif(%Q,%Q)
18350 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%Q)",.         
18360 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 70 2d     zConflict, p-
18370 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61  >zDbName, p->zTa
18380 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
18390 20 20 20 20 20 6e 65 77 52 6f 77 69 64 2c 20 69       newRowid, i
183a0 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20 7a 57 6f  Rank, iLang, zWo
183b0 72 64 2c 20 7a 4b 31 2c 20 7a 57 6f 72 64 2c 20  rd, zK1, zWord, 
183c0 7a 4b 32 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  zK2.        );. 
183d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52       }.      *pR
183e0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c  owid = sqlite3_l
183f0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
18400 28 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  (db);.    }else{
18410 0a 20 20 20 20 20 20 72 6f 77 69 64 20 3d 20 73  .      rowid = s
18420 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
18430 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  64(argv[0]);.   
18440 20 20 20 6e 65 77 52 6f 77 69 64 20 3d 20 2a 70     newRowid = *p
18450 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
18460 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76  value_int64(argv
18470 5b 31 5d 29 3b 0a 20 20 20 20 20 20 73 70 65 6c  [1]);.      spel
18480 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c  lfix1DbExec(&rc,
18490 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20   db,.           
184a0 20 20 22 55 50 44 41 54 45 20 4f 52 20 25 73 20    "UPDATE OR %s 
184b0 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
184c0 62 5c 22 20 53 45 54 20 69 64 3d 25 6c 6c 64 2c  b\" SET id=%lld,
184d0 20 72 61 6e 6b 3d 25 64 2c 20 6c 61 6e 67 69 64   rank=%d, langid
184e0 3d 25 64 2c 22 0a 20 20 20 20 20 20 20 20 20 20  =%d,".          
184f0 20 20 20 22 20 77 6f 72 64 3d 25 51 2c 20 6b 31     " word=%Q, k1
18500 3d 6e 75 6c 6c 69 66 28 25 51 2c 25 51 29 2c 20  =nullif(%Q,%Q), 
18510 6b 32 3d 25 51 20 57 48 45 52 45 20 69 64 3d 25  k2=%Q WHERE id=%
18520 6c 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lld",.          
18530 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 70 2d     zConflict, p-
18540 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61  >zDbName, p->zTa
18550 62 6c 65 4e 61 6d 65 2c 20 6e 65 77 52 6f 77 69  bleName, newRowi
18560 64 2c 20 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c  d, iRank, iLang,
18570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 57  .             zW
18580 6f 72 64 2c 20 7a 4b 31 2c 20 7a 57 6f 72 64 2c  ord, zK1, zWord,
18590 20 7a 4b 32 2c 20 72 6f 77 69 64 0a 20 20 20 20   zK2, rowid.    
185a0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
185b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b 31 29  qlite3_free(zK1)
185c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
185d0 65 65 28 7a 4b 32 29 3b 0a 20 20 7d 0a 20 20 72  ee(zK2);.  }.  r
185e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
185f0 2a 2a 20 52 65 6e 61 6d 65 20 74 68 65 20 73 70  ** Rename the sp
18600 65 6c 6c 66 69 78 31 20 74 61 62 6c 65 2e 0a 2a  ellfix1 table..*
18610 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
18620 6c 6c 66 69 78 31 52 65 6e 61 6d 65 28 73 71 6c  llfix1Rename(sql
18630 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
18640 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
18650 65 77 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  ew){.  spellfix1
18660 5f 76 74 61 62 20 2a 70 20 3d 20 28 73 70 65 6c  _vtab *p = (spel
18670 6c 66 69 78 31 5f 76 74 61 62 2a 29 70 56 54 61  lfix1_vtab*)pVTa
18680 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  b;.  sqlite3 *db
18690 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
186a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
186b0 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
186c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
186d0 74 66 28 22 25 73 22 2c 20 7a 4e 65 77 29 3b 0a  tf("%s", zNew);.
186e0 20 20 69 66 28 20 7a 4e 65 77 4e 61 6d 65 3d 3d    if( zNewName==
186f0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
18700 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18710 7d 0a 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45  }.  spellfix1DbE
18720 78 65 63 28 26 72 63 2c 20 64 62 2c 20 0a 20 20  xec(&rc, db, .  
18730 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20     "ALTER TABLE 
18740 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
18750 62 5c 22 20 52 45 4e 41 4d 45 20 54 4f 20 5c 22  b\" RENAME TO \"
18760 25 77 5f 76 6f 63 61 62 5c 22 22 2c 0a 20 20 20  %w_vocab\"",.   
18770 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d    p->zDbName, p-
18780 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 4e 65  >zTableName, zNe
18790 77 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28  wName.  );.  if(
187a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
187b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
187c0 65 65 28 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65  ee(p->zTableName
187d0 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65  );.    p->zTable
187e0 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b  Name = zNewName;
187f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
18800 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 4e  lite3_free(zNewN
18810 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
18820 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
18830 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   A virtual table
18840 20 6d 6f 64 75 6c 65 20 74 68 61 74 20 70 72 6f   module that pro
18850 76 69 64 65 73 20 66 75 7a 7a 79 20 73 65 61 72  vides fuzzy sear
18860 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ch..*/.static sq
18870 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 73 70 65  lite3_module spe
18880 6c 6c 66 69 78 31 4d 6f 64 75 6c 65 20 3d 20 7b  llfix1Module = {
18890 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
188a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
188b0 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 70 65  Version */.  spe
188c0 6c 6c 66 69 78 31 43 72 65 61 74 65 2c 20 20 20  llfix1Create,   
188d0 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65        /* xCreate
188e0 20 2d 20 68 61 6e 64 6c 65 20 43 52 45 41 54 45   - handle CREATE
188f0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 2a   VIRTUAL TABLE *
18900 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 6f 6e  /.  spellfix1Con
18910 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
18920 78 43 6f 6e 6e 65 63 74 20 2d 20 72 65 63 6f 6e  xConnect - recon
18930 6e 65 63 74 65 64 20 74 6f 20 61 6e 20 65 78 69  nected to an exi
18940 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20  sting table */. 
18950 20 73 70 65 6c 6c 66 69 78 31 42 65 73 74 49 6e   spellfix1BestIn
18960 64 65 78 2c 20 20 20 20 20 20 2f 2a 20 78 42 65  dex,      /* xBe
18970 73 74 49 6e 64 65 78 20 2d 20 66 69 67 75 72 65  stIndex - figure
18980 20 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 61   out how to do a
18990 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 70 65 6c   query */.  spel
189a0 6c 66 69 78 31 44 69 73 63 6f 6e 6e 65 63 74 2c  lfix1Disconnect,
189b0 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e       /* xDisconn
189c0 65 63 74 20 2d 20 63 6c 6f 73 65 20 61 20 63 6f  ect - close a co
189d0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 70  nnection */.  sp
189e0 65 6c 6c 66 69 78 31 44 65 73 74 72 6f 79 2c 20  ellfix1Destroy, 
189f0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72         /* xDestr
18a00 6f 79 20 2d 20 68 61 6e 64 6c 65 20 44 52 4f 50  oy - handle DROP
18a10 20 54 41 42 4c 45 20 2a 2f 0a 20 20 73 70 65 6c   TABLE */.  spel
18a20 6c 66 69 78 31 4f 70 65 6e 2c 20 20 20 20 20 20  lfix1Open,      
18a30 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
18a40 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
18a50 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 6c 6f 73  .  spellfix1Clos
18a60 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  e,          /* x
18a70 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20  Close - close a 
18a80 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c  cursor */.  spel
18a90 6c 66 69 78 31 46 69 6c 74 65 72 2c 20 20 20 20  lfix1Filter,    
18aa0 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20       /* xFilter 
18ab0 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e  - configure scan
18ac0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
18ad0 20 20 73 70 65 6c 6c 66 69 78 31 4e 65 78 74 2c    spellfix1Next,
18ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
18af0 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
18b00 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c  cursor */.  spel
18b10 6c 66 69 78 31 45 6f 66 2c 20 20 20 20 20 20 20  lfix1Eof,       
18b20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63       /* xEof - c
18b30 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20  heck for end of 
18b40 73 63 61 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  scan */.  spellf
18b50 69 78 31 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  ix1Column,      
18b60 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20     /* xColumn - 
18b70 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 73  read data */.  s
18b80 70 65 6c 6c 66 69 78 31 52 6f 77 69 64 2c 20 20  pellfix1Rowid,  
18b90 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
18ba0 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
18bb0 0a 20 20 73 70 65 6c 6c 66 69 78 31 55 70 64 61  .  spellfix1Upda
18bc0 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  te,         /* x
18bd0 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20  Update */.  0,  
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bf0 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a       /* xBegin *
18c00 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  xSync */.  0,   
18c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c40 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a      /* xCommit *
18c50 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
18c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c70 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30  xRollback */.  0
18c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18c90 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
18ca0 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 70 65 6c  Method */.  spel
18cb0 6c 66 69 78 31 52 65 6e 61 6d 65 2c 20 20 20 20  lfix1Rename,    
18cc0 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20       /* xRename 
18cd0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  */.};../*.** Reg
18ce0 69 73 74 65 72 20 74 68 65 20 76 61 72 69 6f 75  ister the variou
18cf0 73 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  s functions and 
18d00 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
18d10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18d20 20 73 70 65 6c 6c 66 69 78 31 52 65 67 69 73 74   spellfix1Regist
18d30 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  er(sqlite3 *db){
18d40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18d50 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
18d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
18d70 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
18d80 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 74 72  b, "spellfix1_tr
18d90 61 6e 73 6c 69 74 22 2c 20 31 2c 0a 20 20 20 20  anslit", 1,.    
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18dc0 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44 45  E_UTF8|SQLITE_DE
18dd0 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e00 74 72 61 6e 73 6c 69 74 65 72 61 74 65 53 71 6c  transliterateSql
18e10 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
18e20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18e30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
18e40 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
18e50 74 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66  tion(db, "spellf
18e60 69 78 31 5f 65 64 69 74 64 69 73 74 22 2c 20 32  ix1_editdist", 2
18e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53     SQLITE_UTF8|S
18ea0 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
18eb0 54 49 43 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TIC, 0,.        
18ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ed0 20 20 20 20 20 20 20 20 20 20 65 64 69 74 64 69            editdi
18ee0 73 74 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  stSqlFunc, 0, 0)
18ef0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
18f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
18f20 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
18f30 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 70 68 6f  , "spellfix1_pho
18f40 6e 65 68 61 73 68 22 2c 20 31 2c 0a 20 20 20 20  nehash", 1,.    
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18f70 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
18f80 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
18f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 20 70 68 6f 6e 65 74 69 63 48 61 73 68      phoneticHash
18fc0 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
18fd0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
18fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18ff0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
19000 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
19010 22 73 70 65 6c 6c 66 69 78 31 5f 73 63 72 69 70  "spellfix1_scrip
19020 74 63 6f 64 65 22 2c 20 31 2c 0a 20 20 20 20 20  tcode", 1,.     
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
19050 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
19060 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
19070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19090 20 20 20 20 73 63 72 69 70 74 43 6f 64 65 53 71      scriptCodeSq
190a0 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  lFunc, 0, 0);.  
190b0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
190c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
190d0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
190e0 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73 70 65  _module(db, "spe
190f0 6c 6c 66 69 78 31 22 2c 20 26 73 70 65 6c 6c 66  llfix1", &spellf
19100 69 78 31 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20  ix1Module, 0);. 
19110 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
19120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
19130 20 3d 20 65 64 69 74 44 69 73 74 33 49 6e 73 74   = editDist3Inst
19140 61 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  all(db);.  }..  
19150 2f 2a 20 56 65 72 69 66 79 20 73 61 6e 69 74 79  /* Verify sanity
19160 20 6f 66 20 74 68 65 20 74 72 61 6e 73 6c 69 74   of the translit
19170 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  [] table */.  fo
19180 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
19190 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65 6f 66  translit)/sizeof
191a0 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 2d 31 3b  (translit[0])-1;
191b0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
191c0 74 28 20 74 72 61 6e 73 6c 69 74 5b 69 5d 2e 63  t( translit[i].c
191d0 46 72 6f 6d 3c 74 72 61 6e 73 6c 69 74 5b 69 2b  From<translit[i+
191e0 31 5d 2e 63 46 72 6f 6d 20 29 3b 0a 20 20 7d 0a  1].cFrom );.  }.
191f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19200 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19210 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
19220 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78  BLE */../*.** Ex
19230 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20 66 75 6e  tension load fun
19240 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66  ction..*/.#ifdef
19250 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70   _WIN32.__declsp
19260 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65  ec(dllexport).#e
19270 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33  ndif.int sqlite3
19280 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28 0a  _spellfix_init(.
19290 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
192a0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
192b0 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
192c0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
192d0 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49   *pApi.){.  SQLI
192e0 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
192f0 54 32 28 70 41 70 69 29 3b 0a 23 69 66 6e 64 65  T2(pApi);.#ifnde
19300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
19310 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 72 65 74  RTUALTABLE.  ret
19320 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 52 65 67  urn spellfix1Reg
19330 69 73 74 65 72 28 64 62 29 3b 0a 23 65 6e 64 69  ister(db);.#endi
19340 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
19350 45 5f 4f 4b 3b 0a 7d 0a                          E_OK;.}.