/ Hex Artifact Content
Login

Artifact 28faad8be801b36926cee7f74e8fffcddc2f6c4b56c699f7501ca2eeae316dfb:


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 69 66 28 20 70 2d  int n){.  if( p-
6b30: 3e 61 5b 70 2d 3e 6e 46 72 6f 6d 5d 21 3d 7a 5b  >a[p->nFrom]!=z[
6b40: 30 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  0] ) return 0;. 
6b50: 20 69 66 28 20 70 2d 3e 6e 54 6f 3e 6e 20 29 20   if( p->nTo>n ) 
6b60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
6b70: 73 74 72 6e 63 6d 70 28 70 2d 3e 61 2b 70 2d 3e  strncmp(p->a+p->
6b80: 6e 46 72 6f 6d 2c 20 7a 2c 20 70 2d 3e 6e 54 6f  nFrom, z, p->nTo
6b90: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
6ba0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
6bb0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
6bc0: 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  E (non-zero) if 
6bd0: 74 68 65 20 46 72 6f 6d 20 73 69 64 65 20 6f 66  the From side of
6be0: 20 74 68 65 20 67 69 76 65 6e 20 63 6f 73 74 20   the given cost 
6bf0: 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 67  matches.** the g
6c00: 69 76 65 6e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  iven string..*/.
6c10: 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68  static int match
6c20: 46 72 6f 6d 28 45 64 69 74 44 69 73 74 33 43 6f  From(EditDist3Co
6c30: 73 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  st *p, const cha
6c40: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
6c50: 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 6f 6d  assert( p->nFrom
6c60: 3c 3d 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  <=n );.  if( p->
6c70: 61 5b 30 5d 21 3d 7a 5b 30 5d 20 29 20 72 65 74  a[0]!=z[0] ) ret
6c80: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 74 72  urn 0;.  if( str
6c90: 6e 63 6d 70 28 70 2d 3e 61 2c 20 7a 2c 20 70 2d  ncmp(p->a, z, p-
6ca0: 3e 6e 46 72 6f 6d 29 21 3d 30 20 29 20 72 65 74  >nFrom)!=0 ) ret
6cb0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
6cc0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
6cd0: 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
6ce0: 6f 29 20 6f 66 20 74 68 65 20 6e 65 78 74 20 46  o) of the next F
6cf0: 52 4f 4d 20 63 68 61 72 61 63 74 65 72 20 61 6e  ROM character an
6d00: 64 20 74 68 65 20 6e 65 78 74 20 54 4f 0a 2a 2a  d the next TO.**
6d10: 20 63 68 61 72 61 63 74 65 72 20 61 72 65 20 74   character are t
6d20: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
6d30: 69 63 20 69 6e 74 20 6d 61 74 63 68 46 72 6f 6d  ic int matchFrom
6d40: 54 6f 28 0a 20 20 45 64 69 74 44 69 73 74 33 46  To(.  EditDist3F
6d50: 72 6f 6d 53 74 72 69 6e 67 20 2a 70 53 74 72 2c  romString *pStr,
6d60: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73    /* Left hand s
6d70: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  tring */.  int n
6d80: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
6d90: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
6da0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 63 68  of comparison ch
6db0: 61 72 61 63 74 65 72 20 6f 6e 20 74 68 65 20 6c  aracter on the l
6dc0: 65 66 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  eft */.  const c
6dd0: 68 61 72 20 2a 7a 32 2c 20 20 20 20 20 20 20 20  har *z2,        
6de0: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61       /* Right-ha
6df0: 6e 64 6c 20 63 6f 6d 70 61 72 69 73 6f 6e 20 63  ndl comparison c
6e00: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
6e10: 74 20 6e 32 20 20 20 20 20 20 20 20 20 20 20 20  t n2            
6e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
6e30: 65 73 20 72 65 6d 61 69 6e 69 6e 67 20 69 6e 20  es remaining in 
6e40: 7a 32 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  z2[] */.){.  int
6e50: 20 62 31 20 3d 20 70 53 74 72 2d 3e 61 5b 6e 31   b1 = pStr->a[n1
6e60: 5d 2e 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 62  ].nByte;.  if( b
6e70: 31 3e 6e 32 20 29 20 72 65 74 75 72 6e 20 30 3b  1>n2 ) return 0;
6e80: 0a 20 20 69 66 28 20 70 53 74 72 2d 3e 7a 5b 6e  .  if( pStr->z[n
6e90: 31 5d 21 3d 7a 32 5b 30 5d 20 29 20 72 65 74 75  1]!=z2[0] ) retu
6ea0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 74 72 6e  rn 0;.  if( strn
6eb0: 63 6d 70 28 70 53 74 72 2d 3e 7a 2b 6e 31 2c 20  cmp(pStr->z+n1, 
6ec0: 7a 32 2c 20 62 31 29 21 3d 30 20 29 20 72 65 74  z2, b1)!=0 ) ret
6ed0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
6ee0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  1;.}../*.** Dele
6ef0: 74 65 20 61 6e 20 45 64 69 74 44 69 73 74 33 46  te an EditDist3F
6f00: 72 6f 6d 53 74 72 69 6e 67 20 6f 62 6a 65 63 63  romString objecc
6f10: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
6f20: 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   editDist3FromSt
6f30: 72 69 6e 67 44 65 6c 65 74 65 28 45 64 69 74 44  ringDelete(EditD
6f40: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a  ist3FromString *
6f50: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
6f60: 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  f( p ){.    for(
6f70: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 3b 20 69 2b 2b  i=0; i<p->n; i++
6f80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6f90: 5f 66 72 65 65 28 70 2d 3e 61 5b 69 5d 2e 61 70  _free(p->a[i].ap
6fa0: 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Del);.      sqli
6fb0: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 5b 69 5d  te3_free(p->a[i]
6fc0: 2e 61 70 53 75 62 73 74 29 3b 0a 20 20 20 20 7d  .apSubst);.    }
6fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6fe0: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
6ff0: 2a 2a 20 43 72 65 61 74 65 20 61 20 45 64 69 74  ** Create a Edit
7000: 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20  Dist3FromString 
7010: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
7020: 63 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53  c EditDist3FromS
7030: 74 72 69 6e 67 20 2a 65 64 69 74 44 69 73 74 33  tring *editDist3
7040: 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 0a 20  FromStringNew(. 
7050: 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33   const EditDist3
7060: 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 0a 20 20 63  Lang *pLang,.  c
7070: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 0a 20 20  onst char *z,.  
7080: 69 6e 74 20 6e 0a 29 7b 0a 20 20 45 64 69 74 44  int n.){.  EditD
7090: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a  ist3FromString *
70a0: 70 53 74 72 3b 0a 20 20 45 64 69 74 44 69 73 74  pStr;.  EditDist
70b0: 33 43 6f 73 74 20 2a 70 3b 0a 20 20 69 6e 74 20  3Cost *p;.  int 
70c0: 69 3b 0a 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  i;..  if( z==0 )
70d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
70e0: 20 6e 3c 30 20 29 20 6e 20 3d 20 28 69 6e 74 29   n<0 ) n = (int)
70f0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 70 53 74  strlen(z);.  pSt
7100: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
7110: 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 53  oc64( sizeof(*pS
7120: 74 72 29 20 2b 20 73 69 7a 65 6f 66 28 70 53 74  tr) + sizeof(pSt
7130: 72 2d 3e 61 5b 30 5d 29 2a 6e 20 2b 20 6e 20 2b  r->a[0])*n + n +
7140: 20 31 20 29 3b 0a 20 20 69 66 28 20 70 53 74 72   1 );.  if( pStr
7150: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7160: 20 20 70 53 74 72 2d 3e 61 20 3d 20 28 45 64 69    pStr->a = (Edi
7170: 74 44 69 73 74 33 46 72 6f 6d 2a 29 26 70 53 74  tDist3From*)&pSt
7180: 72 5b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  r[1];.  memset(p
7190: 53 74 72 2d 3e 61 2c 20 30 2c 20 73 69 7a 65 6f  Str->a, 0, sizeo
71a0: 66 28 70 53 74 72 2d 3e 61 5b 30 5d 29 2a 6e 29  f(pStr->a[0])*n)
71b0: 3b 0a 20 20 70 53 74 72 2d 3e 6e 20 3d 20 6e 3b  ;.  pStr->n = n;
71c0: 0a 20 20 70 53 74 72 2d 3e 7a 20 3d 20 28 63 68  .  pStr->z = (ch
71d0: 61 72 2a 29 26 70 53 74 72 2d 3e 61 5b 6e 5d 3b  ar*)&pStr->a[n];
71e0: 0a 20 20 6d 65 6d 63 70 79 28 70 53 74 72 2d 3e  .  memcpy(pStr->
71f0: 7a 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 69 66  z, z, n+1);.  if
7200: 28 20 6e 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  ( n && z[n-1]=='
7210: 2a 27 20 29 7b 0a 20 20 20 20 70 53 74 72 2d 3e  *' ){.    pStr->
7220: 69 73 50 72 65 66 69 78 20 3d 20 31 3b 0a 20 20  isPrefix = 1;.  
7230: 20 20 6e 2d 2d 3b 0a 20 20 20 20 70 53 74 72 2d    n--;.    pStr-
7240: 3e 6e 2d 2d 3b 0a 20 20 20 20 70 53 74 72 2d 3e  >n--;.    pStr->
7250: 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  z[n] = 0;.  }els
7260: 65 7b 0a 20 20 20 20 70 53 74 72 2d 3e 69 73 50  e{.    pStr->isP
7270: 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  refix = 0;.  }..
7280: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
7290: 69 2b 2b 29 7b 0a 20 20 20 20 45 64 69 74 44 69  i++){.    EditDi
72a0: 73 74 33 46 72 6f 6d 20 2a 70 46 72 6f 6d 20 3d  st3From *pFrom =
72b0: 20 26 70 53 74 72 2d 3e 61 5b 69 5d 3b 0a 20 20   &pStr->a[i];.  
72c0: 20 20 6d 65 6d 73 65 74 28 70 46 72 6f 6d 2c 20    memset(pFrom, 
72d0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 72 6f 6d  0, sizeof(*pFrom
72e0: 29 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 6e  ));.    pFrom->n
72f0: 42 79 74 65 20 3d 20 75 74 66 38 4c 65 6e 28 28  Byte = utf8Len((
7300: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b  unsigned char)z[
7310: 69 5d 2c 20 6e 2d 69 29 3b 0a 20 20 20 20 66 6f  i], n-i);.    fo
7320: 72 28 70 3d 70 4c 61 6e 67 2d 3e 70 43 6f 73 74  r(p=pLang->pCost
7330: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
7340: 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69 73 74  {.      EditDist
7350: 33 43 6f 73 74 20 2a 2a 61 70 4e 65 77 3b 0a 20  3Cost **apNew;. 
7360: 20 20 20 20 20 69 66 28 20 69 2b 70 2d 3e 6e 46       if( i+p->nF
7370: 72 6f 6d 3e 6e 20 29 20 63 6f 6e 74 69 6e 75 65  rom>n ) continue
7380: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63  ;.      if( matc
7390: 68 46 72 6f 6d 28 70 2c 20 7a 2b 69 2c 20 6e 2d  hFrom(p, z+i, n-
73a0: 69 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i)==0 ) continue
73b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
73c0: 54 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  To==0 ){.       
73d0: 20 61 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   apNew = sqlite3
73e0: 5f 72 65 61 6c 6c 6f 63 36 34 28 70 46 72 6f 6d  _realloc64(pFrom
73f0: 2d 3e 61 70 44 65 6c 2c 0a 20 20 20 20 20 20 20  ->apDel,.       
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
7420: 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f 6d 2d 3e  *apNew)*(pFrom->
7430: 6e 44 65 6c 2b 31 29 29 3b 0a 20 20 20 20 20 20  nDel+1));.      
7440: 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29    if( apNew==0 )
7450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7460: 70 46 72 6f 6d 2d 3e 61 70 44 65 6c 20 3d 20 61  pFrom->apDel = a
7470: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 61 70  pNew;.        ap
7480: 4e 65 77 5b 70 46 72 6f 6d 2d 3e 6e 44 65 6c 2b  New[pFrom->nDel+
7490: 2b 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 7d 65  +] = p;.      }e
74a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 4e  lse{.        apN
74b0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
74c0: 6c 6c 6f 63 36 34 28 70 46 72 6f 6d 2d 3e 61 70  lloc64(pFrom->ap
74d0: 53 75 62 73 74 2c 0a 20 20 20 20 20 20 20 20 20  Subst,.         
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 61         sizeof(*a
7500: 70 4e 65 77 29 2a 28 70 46 72 6f 6d 2d 3e 6e 53  pNew)*(pFrom->nS
7510: 75 62 73 74 2b 31 29 29 3b 0a 20 20 20 20 20 20  ubst+1));.      
7520: 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30 20 29    if( apNew==0 )
7530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7540: 70 46 72 6f 6d 2d 3e 61 70 53 75 62 73 74 20 3d  pFrom->apSubst =
7550: 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20   apNew;.        
7560: 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e 6e 53 75  apNew[pFrom->nSu
7570: 62 73 74 2b 2b 5d 20 3d 20 70 3b 0a 20 20 20 20  bst++] = p;.    
7580: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7590: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 65 64 69  ( p ){.      edi
75a0: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
75b0: 44 65 6c 65 74 65 28 70 53 74 72 29 3b 0a 20 20  Delete(pStr);.  
75c0: 20 20 20 20 70 53 74 72 20 3d 20 30 3b 0a 20 20      pStr = 0;.  
75d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
75e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 53  .  }.  return pS
75f0: 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64  tr;.}../*.** Upd
7600: 61 74 65 20 65 6e 74 72 79 20 6d 5b 69 5d 20 73  ate entry m[i] s
7610: 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20 74  uch that it is t
7620: 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 69 74  he minimum of it
7630: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 0a  s current value.
7640: 2a 2a 20 61 6e 64 20 6d 5b 6a 5d 2b 69 43 6f 73  ** and m[j]+iCos
7650: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
7660: 64 20 75 70 64 61 74 65 43 6f 73 74 28 0a 20 20  d updateCost(.  
7670: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6d 2c  unsigned int *m,
7680: 0a 20 20 69 6e 74 20 69 2c 0a 20 20 69 6e 74 20  .  int i,.  int 
7690: 6a 2c 0a 20 20 69 6e 74 20 69 43 6f 73 74 0a 29  j,.  int iCost.)
76a0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
76b0: 20 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   b;.  assert( iC
76c0: 6f 73 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  ost>=0 );.  asse
76d0: 72 74 28 20 69 43 6f 73 74 3c 31 30 30 30 30 20  rt( iCost<10000 
76e0: 29 3b 0a 20 20 62 20 3d 20 6d 5b 6a 5d 20 2b 20  );.  b = m[j] + 
76f0: 69 43 6f 73 74 3b 0a 20 20 69 66 28 20 62 3c 6d  iCost;.  if( b<m
7700: 5b 69 5d 20 29 20 6d 5b 69 5d 20 3d 20 62 3b 0a  [i] ) m[i] = b;.
7710: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 6d 75 63  }../*.** How muc
7720: 68 20 73 74 61 63 6b 20 73 70 61 63 65 20 28 69  h stack space (i
7730: 6e 74 20 62 79 74 65 73 29 20 74 6f 20 75 73 65  nt bytes) to use
7740: 20 66 6f 72 20 57 61 67 6e 65 72 20 6d 61 74 72   for Wagner matr
7750: 69 78 20 69 6e 20 0a 2a 2a 20 65 64 69 74 44 69  ix in .** editDi
7760: 73 74 33 43 6f 72 65 28 29 2e 20 20 49 66 20 6d  st3Core().  If m
7770: 6f 72 65 20 73 70 61 63 65 20 74 68 61 6e 20 74  ore space than t
7780: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 2c  his is required,
7790: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 6d   the entire.** m
77a0: 61 74 72 69 78 20 69 73 20 74 61 6b 65 6e 20 66  atrix is taken f
77b0: 72 6f 6d 20 74 68 65 20 68 65 61 70 2e 20 20 54  rom the heap.  T
77c0: 6f 20 72 65 64 75 63 65 20 74 68 65 20 6c 6f 61  o reduce the loa
77d0: 64 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 0a  d on the memory.
77e0: 2a 2a 20 61 6c 6c 6f 63 61 74 6f 72 2c 20 6d 61  ** allocator, ma
77f0: 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 61 73  ke this value as
7800: 20 6c 61 72 67 65 20 61 73 20 70 72 61 63 74 69   large as practi
7810: 63 61 6c 20 66 6f 72 20 74 68 65 0a 2a 2a 20 61  cal for the.** a
7820: 72 63 68 69 74 65 63 74 75 72 65 20 69 6e 20 75  rchitecture in u
7830: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
7840: 51 4c 49 54 45 5f 53 50 45 4c 4c 46 49 58 5f 53  QLITE_SPELLFIX_S
7850: 54 41 43 4b 41 4c 4c 4f 43 5f 53 5a 0a 23 20 64  TACKALLOC_SZ.# d
7860: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 50 45  efine SQLITE_SPE
7870: 4c 4c 46 49 58 5f 53 54 41 43 4b 41 4c 4c 4f 43  LLFIX_STACKALLOC
7880: 5f 53 5a 20 20 28 31 30 32 34 29 0a 23 65 6e 64  _SZ  (1024).#end
7890: 69 66 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  if../* Compute t
78a0: 68 65 20 65 64 69 74 20 64 69 73 74 61 6e 63 65  he edit distance
78b0: 20 62 65 74 77 65 65 6e 20 74 77 6f 20 73 74 72   between two str
78c0: 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ings..**.** If a
78d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
78e0: 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  return a negativ
78f0: 65 20 6e 75 6d 62 65 72 20 77 68 69 63 68 20 69  e number which i
7900: 73 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  s the error code
7910: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 4d 61 74  ..**.** If pnMat
7920: 63 68 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ch is not NULL, 
7930: 74 68 65 6e 20 2a 70 6e 4d 61 74 63 68 20 69 73  then *pnMatch is
7940: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
7950: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
7960: 0a 2a 2a 20 28 6e 6f 74 20 62 79 74 65 73 29 20  .** (not bytes) 
7970: 69 6e 20 7a 32 20 74 68 61 74 20 6d 61 74 63 68  in z2 that match
7980: 65 64 20 74 68 65 20 73 65 61 72 63 68 20 70 61  ed the search pa
7990: 74 74 65 72 6e 20 69 6e 20 2a 70 46 72 6f 6d 2e  ttern in *pFrom.
79a0: 20 49 66 20 70 46 72 6f 6d 20 64 6f 65 73 0a 2a   If pFrom does.*
79b0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 74 68  * not contain th
79c0: 65 20 70 61 74 74 65 72 6e 20 66 6f 72 20 61 20  e pattern for a 
79d0: 70 72 65 66 69 78 2d 73 65 61 72 63 68 2c 20 74  prefix-search, t
79e0: 68 65 6e 20 74 68 69 73 20 69 73 20 61 6c 77 61  hen this is alwa
79f0: 79 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  ys the number.**
7a00: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
7a10: 6e 20 7a 32 2e 20 49 66 20 70 46 72 6f 6d 20 64  n z2. If pFrom d
7a20: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 70 72  oes contain a pr
7a30: 65 66 69 78 20 73 65 61 72 63 68 20 70 61 74 74  efix search patt
7a40: 65 72 6e 2c 20 74 68 65 6e 0a 2a 2a 20 69 74 20  ern, then.** it 
7a50: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
7a60: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
7a70: 68 65 20 70 72 65 66 69 78 20 6f 66 20 7a 32 20  he prefix of z2 
7a80: 74 68 61 74 20 77 61 73 20 64 65 65 6d 65 64 20  that was deemed 
7a90: 74 6f 20 0a 2a 2a 20 6d 61 74 63 68 20 70 46 72  to .** match pFr
7aa0: 6f 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  om..*/.static in
7ab0: 74 20 65 64 69 74 44 69 73 74 33 43 6f 72 65 28  t editDist3Core(
7ac0: 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  .  EditDist3From
7ad0: 53 74 72 69 6e 67 20 2a 70 46 72 6f 6d 2c 20 20  String *pFrom,  
7ae0: 2f 2a 20 54 68 65 20 46 52 4f 4d 20 73 74 72 69  /* The FROM stri
7af0: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
7b00: 61 72 20 2a 7a 32 2c 20 20 20 20 20 20 20 20 20  ar *z2,         
7b10: 20 20 20 20 20 2f 2a 20 54 68 65 20 54 4f 20 73       /* The TO s
7b20: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  tring */.  int n
7b30: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
7b40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
7b50: 68 20 6f 66 20 74 68 65 20 54 4f 20 73 74 72 69  h of the TO stri
7b60: 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 64  ng */.  const Ed
7b70: 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61  itDist3Lang *pLa
7b80: 6e 67 2c 20 20 2f 2a 20 45 64 69 74 20 77 65 69  ng,  /* Edit wei
7b90: 67 68 74 73 20 66 6f 72 20 61 20 70 61 72 74 69  ghts for a parti
7ba0: 63 75 6c 61 72 20 6c 61 6e 67 75 61 67 65 20 49  cular language I
7bb0: 44 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4d 61  D */.  int *pnMa
7bc0: 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
7bd0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 68 61 72      /* OUT: Char
7be0: 61 63 74 65 72 73 20 69 6e 20 6d 61 74 63 68 65  acters in matche
7bf0: 64 20 70 72 65 66 69 78 20 2a 2f 0a 29 7b 0a 20  d prefix */.){. 
7c00: 20 69 6e 74 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74   int k, n;.  int
7c10: 20 69 31 2c 20 62 31 3b 0a 20 20 69 6e 74 20 69   i1, b1;.  int i
7c20: 32 2c 20 62 32 3b 0a 20 20 45 64 69 74 44 69 73  2, b2;.  EditDis
7c30: 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 66 20 3d  t3FromString f =
7c40: 20 2a 70 46 72 6f 6d 3b 0a 20 20 45 64 69 74 44   *pFrom;.  EditD
7c50: 69 73 74 33 54 6f 20 2a 61 32 3b 0a 20 20 75 6e  ist3To *a2;.  un
7c60: 73 69 67 6e 65 64 20 69 6e 74 20 2a 6d 3b 0a 20  signed int *m;. 
7c70: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
7c80: 54 6f 46 72 65 65 3b 0a 20 20 69 6e 74 20 73 7a  ToFree;.  int sz
7c90: 52 6f 77 3b 0a 20 20 45 64 69 74 44 69 73 74 33  Row;.  EditDist3
7ca0: 43 6f 73 74 20 2a 70 3b 0a 20 20 69 6e 74 20 72  Cost *p;.  int r
7cb0: 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 75 69  es;.  sqlite3_ui
7cc0: 6e 74 36 34 20 6e 42 79 74 65 3b 0a 20 20 75 6e  nt64 nByte;.  un
7cd0: 73 69 67 6e 65 64 20 69 6e 74 20 73 74 61 63 6b  signed int stack
7ce0: 53 70 61 63 65 5b 53 51 4c 49 54 45 5f 53 50 45  Space[SQLITE_SPE
7cf0: 4c 4c 46 49 58 5f 53 54 41 43 4b 41 4c 4c 4f 43  LLFIX_STACKALLOC
7d00: 5f 53 5a 2f 73 69 7a 65 6f 66 28 75 6e 73 69 67  _SZ/sizeof(unsig
7d10: 6e 65 64 20 69 6e 74 29 5d 3b 0a 0a 20 20 2f 2a  ned int)];..  /*
7d20: 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 57 61   allocate the Wa
7d30: 67 6e 65 72 20 6d 61 74 72 69 78 20 61 6e 64 20  gner matrix and 
7d40: 74 68 65 20 61 54 6f 5b 5d 20 61 72 72 61 79 20  the aTo[] array 
7d50: 66 6f 72 20 74 68 65 20 54 4f 20 73 74 72 69 6e  for the TO strin
7d60: 67 20 2a 2f 0a 20 20 6e 20 3d 20 28 66 2e 6e 2b  g */.  n = (f.n+
7d70: 31 29 2a 28 6e 32 2b 31 29 3b 0a 20 20 6e 20 3d  1)*(n2+1);.  n =
7d80: 20 28 6e 2b 31 29 26 7e 31 3b 0a 20 20 6e 42 79   (n+1)&~1;.  nBy
7d90: 74 65 20 3d 20 6e 2a 73 69 7a 65 6f 66 28 6d 5b  te = n*sizeof(m[
7da0: 30 5d 29 20 2b 20 73 69 7a 65 6f 66 28 61 32 5b  0]) + sizeof(a2[
7db0: 30 5d 29 2a 6e 32 3b 0a 20 20 69 66 28 20 6e 42  0])*n2;.  if( nB
7dc0: 79 74 65 3c 3d 73 69 7a 65 6f 66 28 73 74 61 63  yte<=sizeof(stac
7dd0: 6b 53 70 61 63 65 29 20 29 7b 0a 20 20 20 20 6d  kSpace) ){.    m
7de0: 20 3d 20 73 74 61 63 6b 53 70 61 63 65 3b 0a 20   = stackSpace;. 
7df0: 20 20 20 70 54 6f 46 72 65 65 20 3d 20 30 3b 0a     pToFree = 0;.
7e00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 20 3d    }else{.    m =
7e10: 20 70 54 6f 46 72 65 65 20 3d 20 73 71 6c 69 74   pToFree = sqlit
7e20: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79  e3_malloc64( nBy
7e30: 74 65 20 29 3b 0a 20 20 20 20 69 66 28 20 6d 3d  te );.    if( m=
7e40: 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 20  =0 ) return -1; 
7e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
7e60: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
7e70: 20 7d 0a 20 20 61 32 20 3d 20 28 45 64 69 74 44   }.  a2 = (EditD
7e80: 69 73 74 33 54 6f 2a 29 26 6d 5b 6e 5d 3b 0a 20  ist3To*)&m[n];. 
7e90: 20 6d 65 6d 73 65 74 28 61 32 2c 20 30 2c 20 73   memset(a2, 0, s
7ea0: 69 7a 65 6f 66 28 61 32 5b 30 5d 29 2a 6e 32 29  izeof(a2[0])*n2)
7eb0: 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
7ec0: 74 68 65 20 61 31 5b 5d 20 6d 61 74 72 69 78 20  the a1[] matrix 
7ed0: 66 6f 72 20 61 6c 6c 20 63 68 61 72 61 63 74 65  for all characte
7ee0: 72 73 20 6f 66 20 74 68 65 20 54 4f 20 73 74 72  rs of the TO str
7ef0: 69 6e 67 20 2a 2f 0a 20 20 66 6f 72 28 69 32 3d  ing */.  for(i2=
7f00: 30 3b 20 69 32 3c 6e 32 3b 20 69 32 2b 2b 29 7b  0; i2<n2; i2++){
7f10: 0a 20 20 20 20 61 32 5b 69 32 5d 2e 6e 42 79 74  .    a2[i2].nByt
7f20: 65 20 3d 20 75 74 66 38 4c 65 6e 28 28 75 6e 73  e = utf8Len((uns
7f30: 69 67 6e 65 64 20 63 68 61 72 29 7a 32 5b 69 32  igned char)z2[i2
7f40: 5d 2c 20 6e 32 2d 69 32 29 3b 0a 20 20 20 20 66  ], n2-i2);.    f
7f50: 6f 72 28 70 3d 70 4c 61 6e 67 2d 3e 70 43 6f 73  or(p=pLang->pCos
7f60: 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  t; p; p=p->pNext
7f70: 29 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69 73  ){.      EditDis
7f80: 74 33 43 6f 73 74 20 2a 2a 61 70 4e 65 77 3b 0a  t3Cost **apNew;.
7f90: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 46 72        if( p->nFr
7fa0: 6f 6d 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  om>0 ) break;.  
7fb0: 20 20 20 20 69 66 28 20 69 32 2b 70 2d 3e 6e 54      if( i2+p->nT
7fc0: 6f 3e 6e 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b  o>n2 ) continue;
7fd0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 5b  .      if( p->a[
7fe0: 30 5d 3e 7a 32 5b 69 32 5d 20 29 20 62 72 65 61  0]>z2[i2] ) brea
7ff0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74  k;.      if( mat
8000: 63 68 54 6f 28 70 2c 20 7a 32 2b 69 32 2c 20 6e  chTo(p, z2+i2, n
8010: 32 2d 69 32 29 3d 3d 30 20 29 20 63 6f 6e 74 69  2-i2)==0 ) conti
8020: 6e 75 65 3b 0a 20 20 20 20 20 20 61 32 5b 69 32  nue;.      a2[i2
8030: 5d 2e 6e 49 6e 73 2b 2b 3b 0a 20 20 20 20 20 20  ].nIns++;.      
8040: 61 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  apNew = sqlite3_
8050: 72 65 61 6c 6c 6f 63 36 34 28 61 32 5b 69 32 5d  realloc64(a2[i2]
8060: 2e 61 70 49 6e 73 2c 20 73 69 7a 65 6f 66 28 2a  .apIns, sizeof(*
8070: 61 70 4e 65 77 29 2a 61 32 5b 69 32 5d 2e 6e 49  apNew)*a2[i2].nI
8080: 6e 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ns);.      if( a
8090: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
80a0: 20 20 20 72 65 73 20 3d 20 2d 31 3b 20 20 2f 2a     res = -1;  /*
80b0: 20 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   Out of memory *
80c0: 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  /.        goto e
80d0: 64 69 74 44 69 73 74 33 41 62 6f 72 74 3b 0a 20  ditDist3Abort;. 
80e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 32 5b       }.      a2[
80f0: 69 32 5d 2e 61 70 49 6e 73 20 3d 20 61 70 4e 65  i2].apIns = apNe
8100: 77 3b 0a 20 20 20 20 20 20 61 32 5b 69 32 5d 2e  w;.      a2[i2].
8110: 61 70 49 6e 73 5b 61 32 5b 69 32 5d 2e 6e 49 6e  apIns[a2[i2].nIn
8120: 73 2d 31 5d 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  s-1] = p;.    }.
8130: 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72    }..  /* Prepar
8140: 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
8150: 20 6d 69 6e 69 6d 75 6d 20 65 64 69 74 20 64 69   minimum edit di
8160: 73 74 61 6e 63 65 20 2a 2f 0a 20 20 73 7a 52 6f  stance */.  szRo
8170: 77 20 3d 20 66 2e 6e 2b 31 3b 0a 20 20 6d 65 6d  w = f.n+1;.  mem
8180: 73 65 74 28 6d 2c 20 30 78 30 31 2c 20 28 6e 32  set(m, 0x01, (n2
8190: 2b 31 29 2a 73 7a 52 6f 77 2a 73 69 7a 65 6f 66  +1)*szRow*sizeof
81a0: 28 6d 5b 30 5d 29 29 3b 0a 20 20 6d 5b 30 5d 20  (m[0]));.  m[0] 
81b0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74  = 0;..  /* First
81c0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 74 6f 70   fill in the top
81d0: 2d 72 6f 77 20 6f 66 20 74 68 65 20 6d 61 74 72  -row of the matr
81e0: 69 78 20 77 69 74 68 20 46 52 4f 4d 20 64 65 6c  ix with FROM del
81f0: 65 74 69 6f 6e 20 63 6f 73 74 73 20 2a 2f 0a 20  etion costs */. 
8200: 20 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e   for(i1=0; i1<f.
8210: 6e 3b 20 69 31 20 2b 3d 20 62 31 29 7b 0a 20 20  n; i1 += b1){.  
8220: 20 20 62 31 20 3d 20 66 2e 61 5b 69 31 5d 2e 6e    b1 = f.a[i1].n
8230: 42 79 74 65 3b 0a 20 20 20 20 75 70 64 61 74 65  Byte;.    update
8240: 43 6f 73 74 28 6d 2c 20 69 31 2b 62 31 2c 20 69  Cost(m, i1+b1, i
8250: 31 2c 20 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f  1, pLang->iDelCo
8260: 73 74 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30  st);.    for(k=0
8270: 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 44 65 6c  ; k<f.a[i1].nDel
8280: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20  ; k++){.      p 
8290: 3d 20 66 2e 61 5b 69 31 5d 2e 61 70 44 65 6c 5b  = f.a[i1].apDel[
82a0: 6b 5d 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  k];.      update
82b0: 43 6f 73 74 28 6d 2c 20 69 31 2b 70 2d 3e 6e 46  Cost(m, i1+p->nF
82c0: 72 6f 6d 2c 20 69 31 2c 20 70 2d 3e 69 43 6f 73  rom, i1, p->iCos
82d0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
82e0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 61 6c 6c 20   /* Fill in all 
82f0: 73 75 62 73 65 71 75 65 6e 74 20 72 6f 77 73 2c  subsequent rows,
8300: 20 74 6f 70 2d 74 6f 2d 62 6f 74 74 6f 6d 2c 20   top-to-bottom, 
8310: 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 2a 2f  left-to-right */
8320: 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c  .  for(i2=0; i2<
8330: 6e 32 3b 20 69 32 20 2b 3d 20 62 32 29 7b 0a 20  n2; i2 += b2){. 
8340: 20 20 20 69 6e 74 20 72 78 3b 20 20 20 20 20 20     int rx;      
8350: 2f 2a 20 53 74 61 72 74 69 6e 67 20 69 6e 64 65  /* Starting inde
8360: 78 20 66 6f 72 20 63 75 72 72 65 6e 74 20 72 6f  x for current ro
8370: 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 78 70  w */.    int rxp
8380: 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e  ;     /* Startin
8390: 67 20 69 6e 64 65 78 20 66 6f 72 20 70 72 65 76  g index for prev
83a0: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
83b0: 62 32 20 3d 20 61 32 5b 69 32 5d 2e 6e 42 79 74  b2 = a2[i2].nByt
83c0: 65 3b 0a 20 20 20 20 72 78 20 3d 20 73 7a 52 6f  e;.    rx = szRo
83d0: 77 2a 28 69 32 2b 62 32 29 3b 0a 20 20 20 20 72  w*(i2+b2);.    r
83e0: 78 70 20 3d 20 73 7a 52 6f 77 2a 69 32 3b 0a 20  xp = szRow*i2;. 
83f0: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
8400: 20 72 78 2c 20 72 78 70 2c 20 70 4c 61 6e 67 2d   rx, rxp, pLang-
8410: 3e 69 49 6e 73 43 6f 73 74 29 3b 0a 20 20 20 20  >iInsCost);.    
8420: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 61 32 5b 69 32  for(k=0; k<a2[i2
8430: 5d 2e 6e 49 6e 73 3b 20 6b 2b 2b 29 7b 0a 20 20  ].nIns; k++){.  
8440: 20 20 20 20 70 20 3d 20 61 32 5b 69 32 5d 2e 61      p = a2[i2].a
8450: 70 49 6e 73 5b 6b 5d 3b 0a 20 20 20 20 20 20 75  pIns[k];.      u
8460: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 73 7a 52  pdateCost(m, szR
8470: 6f 77 2a 28 69 32 2b 70 2d 3e 6e 54 6f 29 2c 20  ow*(i2+p->nTo), 
8480: 72 78 70 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a  rxp, p->iCost);.
8490: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 31      }.    for(i1
84a0: 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20 69 31 2b 3d  =0; i1<f.n; i1+=
84b0: 62 31 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  b1){.      int c
84c0: 78 3b 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f  x;    /* Index o
84d0: 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 2a  f current cell *
84e0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 78 70 3b  /.      int cxp;
84f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
8500: 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
8510: 74 6f 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  to the left */. 
8520: 20 20 20 20 20 69 6e 74 20 63 78 64 3b 20 20 20       int cxd;   
8530: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
8540: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
8550: 20 6f 6e 65 20 72 6f 77 20 61 62 6f 76 65 20 2a   one row above *
8560: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 78 75 3b  /.      int cxu;
8570: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
8580: 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
8590: 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62  above */.      b
85a0: 31 20 3d 20 66 2e 61 5b 69 31 5d 2e 6e 42 79 74  1 = f.a[i1].nByt
85b0: 65 3b 0a 20 20 20 20 20 20 63 78 70 20 3d 20 72  e;.      cxp = r
85c0: 78 20 2b 20 69 31 3b 0a 20 20 20 20 20 20 63 78  x + i1;.      cx
85d0: 20 3d 20 63 78 70 20 2b 20 62 31 3b 0a 20 20 20   = cxp + b1;.   
85e0: 20 20 20 63 78 64 20 3d 20 72 78 70 20 2b 20 69     cxd = rxp + i
85f0: 31 3b 0a 20 20 20 20 20 20 63 78 75 20 3d 20 63  1;.      cxu = c
8600: 78 64 20 2b 20 62 31 3b 0a 20 20 20 20 20 20 75  xd + b1;.      u
8610: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 2c  pdateCost(m, cx,
8620: 20 63 78 70 2c 20 70 4c 61 6e 67 2d 3e 69 44 65   cxp, pLang->iDe
8630: 6c 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 66 6f  lCost);.      fo
8640: 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d  r(k=0; k<f.a[i1]
8650: 2e 6e 44 65 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20  .nDel; k++){.   
8660: 20 20 20 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d       p = f.a[i1]
8670: 2e 61 70 44 65 6c 5b 6b 5d 3b 0a 20 20 20 20 20  .apDel[k];.     
8680: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
8690: 20 63 78 70 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 63   cxp+p->nFrom, c
86a0: 78 70 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20  xp, p->iCost);. 
86b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64       }.      upd
86c0: 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63  ateCost(m, cx, c
86d0: 78 75 2c 20 70 4c 61 6e 67 2d 3e 69 49 6e 73 43  xu, pLang->iInsC
86e0: 6f 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ost);.      if( 
86f0: 6d 61 74 63 68 46 72 6f 6d 54 6f 28 26 66 2c 20  matchFromTo(&f, 
8700: 69 31 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32  i1, z2+i2, n2-i2
8710: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 70 64  ) ){.        upd
8720: 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63  ateCost(m, cx, c
8730: 78 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  xd, 0);.      }.
8740: 20 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74        updateCost
8750: 28 6d 2c 20 63 78 2c 20 63 78 64 2c 20 70 4c 61  (m, cx, cxd, pLa
8760: 6e 67 2d 3e 69 53 75 62 43 6f 73 74 29 3b 0a 20  ng->iSubCost);. 
8770: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
8780: 66 2e 61 5b 69 31 5d 2e 6e 53 75 62 73 74 3b 20  f.a[i1].nSubst; 
8790: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 20  k++){.        p 
87a0: 3d 20 66 2e 61 5b 69 31 5d 2e 61 70 53 75 62 73  = f.a[i1].apSubs
87b0: 74 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  t[k];.        if
87c0: 28 20 6d 61 74 63 68 54 6f 28 70 2c 20 7a 32 2b  ( matchTo(p, z2+
87d0: 69 32 2c 20 6e 32 2d 69 32 29 20 29 7b 0a 20 20  i2, n2-i2) ){.  
87e0: 20 20 20 20 20 20 20 20 75 70 64 61 74 65 43 6f          updateCo
87f0: 73 74 28 6d 2c 20 63 78 64 2b 70 2d 3e 6e 46 72  st(m, cxd+p->nFr
8800: 6f 6d 2b 73 7a 52 6f 77 2a 70 2d 3e 6e 54 6f 2c  om+szRow*p->nTo,
8810: 20 63 78 64 2c 20 70 2d 3e 69 43 6f 73 74 29 3b   cxd, p->iCost);
8820: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8830: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
8840: 66 20 30 20 20 2f 2a 20 45 6e 61 62 6c 65 20 66  f 0  /* Enable f
8850: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 2a 2f 0a  or debugging */.
8860: 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20    printf("      
8870: 20 20 20 5e 22 29 3b 0a 20 20 66 6f 72 28 69 31     ^");.  for(i1
8880: 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20 69 31 2b 2b  =0; i1<f.n; i1++
8890: 29 20 70 72 69 6e 74 66 28 22 20 25 63 2d 25 32  ) printf(" %c-%2
88a0: 78 22 2c 20 66 2e 7a 5b 69 31 5d 2c 20 66 2e 7a  x", f.z[i1], f.z
88b0: 5b 69 31 5d 26 30 78 66 66 29 3b 0a 20 20 70 72  [i1]&0xff);.  pr
88c0: 69 6e 74 66 28 22 5c 6e 20 20 20 5e 3a 22 29 3b  intf("\n   ^:");
88d0: 0a 20 20 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c  .  for(i1=0; i1<
88e0: 73 7a 52 6f 77 3b 20 69 31 2b 2b 29 7b 0a 20 20  szRow; i1++){.  
88f0: 20 20 69 6e 74 20 76 20 3d 20 6d 5b 69 31 5d 3b    int v = m[i1];
8900: 0a 20 20 20 20 69 66 28 20 76 3e 39 39 39 39 20  .    if( v>9999 
8910: 29 20 70 72 69 6e 74 66 28 22 20 2a 2a 2a 2a 22  ) printf(" ****"
8920: 29 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  );.    else     
8930: 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 34 64      printf(" %4d
8940: 22 2c 20 76 29 3b 0a 20 20 7d 0a 20 20 70 72 69  ", v);.  }.  pri
8950: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 66 6f 72  ntf("\n");.  for
8960: 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b 20 69 32  (i2=0; i2<n2; i2
8970: 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  ++){.    printf(
8980: 22 25 63 2d 25 30 32 78 3a 22 2c 20 7a 32 5b 69  "%c-%02x:", z2[i
8990: 32 5d 2c 20 7a 32 5b 69 32 5d 26 30 78 66 66 29  2], z2[i2]&0xff)
89a0: 3b 0a 20 20 20 20 66 6f 72 28 69 31 3d 30 3b 20  ;.    for(i1=0; 
89b0: 69 31 3c 73 7a 52 6f 77 3b 20 69 31 2b 2b 29 7b  i1<szRow; i1++){
89c0: 0a 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 6d  .      int v = m
89d0: 5b 28 69 32 2b 31 29 2a 73 7a 52 6f 77 2b 69 31  [(i2+1)*szRow+i1
89e0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3e 39  ];.      if( v>9
89f0: 39 39 39 20 29 20 70 72 69 6e 74 66 28 22 20 2a  999 ) printf(" *
8a00: 2a 2a 2a 22 29 3b 0a 20 20 20 20 20 20 65 6c 73  ***");.      els
8a10: 65 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  e         printf
8a20: 28 22 20 25 34 64 22 2c 20 76 29 3b 0a 20 20 20  (" %4d", v);.   
8a30: 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c   }.    printf("\
8a40: 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n");.  }.#endif.
8a50: 0a 20 20 2f 2a 20 46 72 65 65 20 6d 65 6d 6f 72  .  /* Free memor
8a60: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 6e  y allocations an
8a70: 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73  d return the res
8a80: 75 6c 74 20 2a 2f 0a 20 20 72 65 73 20 3d 20 28  ult */.  res = (
8a90: 69 6e 74 29 6d 5b 73 7a 52 6f 77 2a 28 6e 32 2b  int)m[szRow*(n2+
8aa0: 31 29 2d 31 5d 3b 0a 20 20 6e 20 3d 20 6e 32 3b  1)-1];.  n = n2;
8ab0: 0a 20 20 69 66 28 20 66 2e 69 73 50 72 65 66 69  .  if( f.isPrefi
8ac0: 78 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 32 3d  x ){.    for(i2=
8ad0: 31 3b 20 69 32 3c 3d 6e 32 3b 20 69 32 2b 2b 29  1; i2<=n2; i2++)
8ae0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 20 3d 20  {.      int b = 
8af0: 6d 5b 73 7a 52 6f 77 2a 69 32 2d 31 5d 3b 0a 20  m[szRow*i2-1];. 
8b00: 20 20 20 20 20 69 66 28 20 62 3c 3d 72 65 73 20       if( b<=res 
8b10: 29 7b 20 0a 20 20 20 20 20 20 20 20 72 65 73 20  ){ .        res 
8b20: 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d  = b;.        n =
8b30: 20 69 32 20 2d 20 31 3b 0a 20 20 20 20 20 20 7d   i2 - 1;.      }
8b40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
8b50: 20 70 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20   pnMatch ){.    
8b60: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  int nExtra = 0;.
8b70: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
8b80: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; k++){.      if
8b90: 28 20 28 7a 32 5b 6b 5d 20 26 20 30 78 63 30 29  ( (z2[k] & 0xc0)
8ba0: 3d 3d 30 78 38 30 20 29 20 6e 45 78 74 72 61 2b  ==0x80 ) nExtra+
8bb0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e  +;.    }.    *pn
8bc0: 4d 61 74 63 68 20 3d 20 6e 20 2d 20 6e 45 78 74  Match = n - nExt
8bd0: 72 61 3b 0a 20 20 7d 0a 0a 65 64 69 74 44 69 73  ra;.  }..editDis
8be0: 74 33 41 62 6f 72 74 3a 0a 20 20 66 6f 72 28 69  t3Abort:.  for(i
8bf0: 32 3d 30 3b 20 69 32 3c 6e 32 3b 20 69 32 2b 2b  2=0; i2<n2; i2++
8c00: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61  ) sqlite3_free(a
8c10: 32 5b 69 32 5d 2e 61 70 49 6e 73 29 3b 0a 20 20  2[i2].apIns);.  
8c20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 6f  sqlite3_free(pTo
8c30: 46 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Free);.  return 
8c40: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  res;.}../*.** Ge
8c50: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
8c60: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 6f   EditDist3Lang o
8c70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
8c80: 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33   const EditDist3
8c90: 4c 61 6e 67 20 2a 65 64 69 74 44 69 73 74 33 46  Lang *editDist3F
8ca0: 69 6e 64 4c 61 6e 67 28 0a 20 20 45 64 69 74 44  indLang(.  EditD
8cb0: 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  ist3Config *pCon
8cc0: 66 69 67 2c 0a 20 20 69 6e 74 20 69 4c 61 6e 67  fig,.  int iLang
8cd0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
8ce0: 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69  or(i=0; i<pConfi
8cf0: 67 2d 3e 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a  g->nLang; i++){.
8d00: 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d      if( pConfig-
8d10: 3e 61 5b 69 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61  >a[i].iLang==iLa
8d20: 6e 67 20 29 20 72 65 74 75 72 6e 20 26 70 43 6f  ng ) return &pCo
8d30: 6e 66 69 67 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  nfig->a[i];.  }.
8d40: 20 20 72 65 74 75 72 6e 20 26 65 64 69 74 44 69    return &editDi
8d50: 73 74 33 4c 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  st3Lang;.}../*.*
8d60: 2a 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65  * Function:    e
8d70: 64 69 74 64 69 73 74 33 28 41 2c 42 2c 69 4c 61  ditdist3(A,B,iLa
8d80: 6e 67 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ng).**          
8d90: 20 20 20 20 65 64 69 74 64 69 73 74 33 28 74 61      editdist3(ta
8da0: 62 6c 65 6e 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52  blename).**.** R
8db0: 65 74 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f  eturn the cost o
8dc0: 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 73  f transforming s
8dd0: 74 72 69 6e 67 20 41 20 69 6e 74 6f 20 73 74 72  tring A into str
8de0: 69 6e 67 20 42 20 75 73 69 6e 67 20 65 64 69 74  ing B using edit
8df0: 0a 2a 2a 20 77 65 69 67 68 74 73 20 66 6f 72 20  .** weights for 
8e00: 69 4c 61 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iLang..**.** The
8e10: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61   second form loa
8e20: 64 73 20 65 64 69 74 20 77 65 69 67 68 74 73 20  ds edit weights 
8e30: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  into memory from
8e40: 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61   a table..*/.sta
8e50: 74 69 63 20 76 6f 69 64 20 65 64 69 74 44 69 73  tic void editDis
8e60: 74 33 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c  t3SqlFunc(.  sql
8e70: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8e80: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
8e90: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
8ea0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 45  ue **argv.){.  E
8eb0: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a  ditDist3Config *
8ec0: 70 43 6f 6e 66 69 67 20 3d 20 28 45 64 69 74 44  pConfig = (EditD
8ed0: 69 73 74 33 43 6f 6e 66 69 67 2a 29 73 71 6c 69  ist3Config*)sqli
8ee0: 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f  te3_user_data(co
8ef0: 6e 74 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65  ntext);.  sqlite
8f00: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
8f10: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
8f20: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 6e  e(context);.  in
8f30: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
8f40: 3d 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==1 ){.    const
8f50: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20   char *zTable = 
8f60: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
8f70: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8f80: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 63  argv[0]);.    rc
8f90: 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66   = editDist3Conf
8fa0: 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20  igLoad(pConfig, 
8fb0: 64 62 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20  db, zTable);.   
8fc0: 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65   if( rc ) sqlite
8fd0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63  3_result_error_c
8fe0: 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29  ode(context, rc)
8ff0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
9000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 20 3d 20  onst char *zA = 
9010: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
9020: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9030: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 63 6f  argv[0]);.    co
9040: 6e 73 74 20 63 68 61 72 20 2a 7a 42 20 3d 20 28  nst char *zB = (
9050: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
9060: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
9070: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 6e 74  rgv[1]);.    int
9080: 20 6e 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61   nA = sqlite3_va
9090: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
90a0: 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 42 20 3d  ]);.    int nB =
90b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
90c0: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
90d0: 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 61     int iLang = a
90e0: 72 67 63 3d 3d 33 20 3f 20 73 71 6c 69 74 65 33  rgc==3 ? sqlite3
90f0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
9100: 32 5d 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e  2]) : 0;.    con
9110: 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  st EditDist3Lang
9120: 20 2a 70 4c 61 6e 67 20 3d 20 65 64 69 74 44 69   *pLang = editDi
9130: 73 74 33 46 69 6e 64 4c 61 6e 67 28 70 43 6f 6e  st3FindLang(pCon
9140: 66 69 67 2c 20 69 4c 61 6e 67 29 3b 0a 20 20 20  fig, iLang);.   
9150: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
9160: 72 69 6e 67 20 2a 70 46 72 6f 6d 3b 0a 20 20 20  ring *pFrom;.   
9170: 20 69 6e 74 20 64 69 73 74 3b 0a 0a 20 20 20 20   int dist;..    
9180: 70 46 72 6f 6d 20 3d 20 65 64 69 74 44 69 73 74  pFrom = editDist
9190: 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 70  3FromStringNew(p
91a0: 4c 61 6e 67 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20  Lang, zA, nA);. 
91b0: 20 20 20 69 66 28 20 70 46 72 6f 6d 3d 3d 30 20     if( pFrom==0 
91c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
91d0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
91e0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
91f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
9200: 7d 0a 20 20 20 20 64 69 73 74 20 3d 20 65 64 69  }.    dist = edi
9210: 74 44 69 73 74 33 43 6f 72 65 28 70 46 72 6f 6d  tDist3Core(pFrom
9220: 2c 20 7a 42 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c  , zB, nB, pLang,
9230: 20 30 29 3b 0a 20 20 20 20 65 64 69 74 44 69 73   0);.    editDis
9240: 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65  t3FromStringDele
9250: 74 65 28 70 46 72 6f 6d 29 3b 0a 20 20 20 20 69  te(pFrom);.    i
9260: 66 28 20 64 69 73 74 3d 3d 28 2d 31 29 20 29 7b  f( dist==(-1) ){
9270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
9280: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
9290: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
92a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
92b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
92c0: 63 6f 6e 74 65 78 74 2c 20 64 69 73 74 29 3b 0a  context, dist);.
92d0: 20 20 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a      }.  } .}../*
92e0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65  .** Register the
92f0: 20 65 64 69 74 44 69 73 74 33 20 66 75 6e 63 74   editDist3 funct
9300: 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 0a  ion with SQLite.
9310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64  */.static int ed
9320: 69 74 44 69 73 74 33 49 6e 73 74 61 6c 6c 28 73  itDist3Install(s
9330: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
9340: 6e 74 20 72 63 3b 0a 20 20 45 64 69 74 44 69 73  nt rc;.  EditDis
9350: 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  t3Config *pConfi
9360: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  g = sqlite3_mall
9370: 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43  oc64( sizeof(*pC
9380: 6f 6e 66 69 67 29 20 29 3b 0a 20 20 69 66 28 20  onfig) );.  if( 
9390: 70 43 6f 6e 66 69 67 3d 3d 30 20 29 20 72 65 74  pConfig==0 ) ret
93a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
93b0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6e 66  ;.  memset(pConf
93c0: 69 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ig, 0, sizeof(*p
93d0: 43 6f 6e 66 69 67 29 29 3b 0a 20 20 72 63 20 3d  Config));.  rc =
93e0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
93f0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
9400: 22 65 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20  "editdist3",.   
9410: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 53 51             2, SQ
9420: 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45  LITE_UTF8|SQLITE
9430: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20  _DETERMINISTIC, 
9440: 70 43 6f 6e 66 69 67 2c 0a 20 20 20 20 20 20 20  pConfig,.       
9450: 20 20 20 20 20 20 20 65 64 69 74 44 69 73 74 33         editDist3
9460: 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30  SqlFunc, 0, 0, 0
9470: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
9480: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
9490: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
94a0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
94b0: 2c 20 22 65 64 69 74 64 69 73 74 33 22 2c 0a 20  , "editdist3",. 
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
94d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51  , SQLITE_UTF8|SQ
94e0: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
94f0: 49 43 2c 20 70 43 6f 6e 66 69 67 2c 0a 20 20 20  IC, pConfig,.   
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
9510: 74 44 69 73 74 33 53 71 6c 46 75 6e 63 2c 20 30  tDist3SqlFunc, 0
9520: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
9530: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9540: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
9550: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
9560: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69  tion_v2(db, "edi
9570: 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20  tdist3",.       
9580: 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49           1, SQLI
9590: 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44  TE_UTF8|SQLITE_D
95a0: 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 70 43  ETERMINISTIC, pC
95b0: 6f 6e 66 69 67 2c 0a 20 20 20 20 20 20 20 20 20  onfig,.         
95c0: 20 20 20 20 20 20 20 65 64 69 74 44 69 73 74 33         editDist3
95d0: 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 2c 20 65  SqlFunc, 0, 0, e
95e0: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65  ditDist3ConfigDe
95f0: 6c 65 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  lete);.  }else{.
9600: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9610: 28 70 43 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 20  (pConfig);.  }. 
9620: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
9630: 20 45 6e 64 20 63 6f 6e 66 69 67 75 72 61 62 6c   End configurabl
9640: 65 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20 65  e cost unicode e
9650: 64 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f 75  dit distance rou
9660: 74 69 6e 65 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tines.**********
9670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96b0: 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9700: 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 72 61  ***.** Begin tra
9710: 6e 73 6c 69 74 65 72 61 74 65 20 75 6e 69 63 6f  nsliterate unico
9720: 64 65 2d 74 6f 2d 61 73 63 69 69 20 69 6d 70 6c  de-to-ascii impl
9730: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2f 0a 0a 23  ementation.*/..#
9740: 69 66 20 21 53 51 4c 49 54 45 5f 41 4d 41 4c 47  if !SQLITE_AMALG
9750: 41 4d 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68  AMATION./*.** Th
9760: 69 73 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20  is lookup table 
9770: 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20  is used to help 
9780: 64 65 63 6f 64 65 20 74 68 65 20 66 69 72 73 74  decode the first
9790: 20 62 79 74 65 20 6f 66 0a 2a 2a 20 61 20 6d 75   byte of.** a mu
97a0: 6c 74 69 2d 62 79 74 65 20 55 54 46 38 20 63 68  lti-byte UTF8 ch
97b0: 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
97c0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
97d0: 64 20 63 68 61 72 20 73 71 6c 69 74 65 33 55 74  d char sqlite3Ut
97e0: 66 38 54 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20  f8Trans1[] = {. 
97f0: 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30   0x00, 0x01, 0x0
9800: 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30  2, 0x03, 0x04, 0
9810: 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c  x05, 0x06, 0x07,
9820: 0a 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30  .  0x08, 0x09, 0
9830: 78 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c  x0a, 0x0b, 0x0c,
9840: 20 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30   0x0d, 0x0e, 0x0
9850: 66 2c 0a 20 20 30 78 31 30 2c 20 30 78 31 31 2c  f,.  0x10, 0x11,
9860: 20 30 78 31 32 2c 20 30 78 31 33 2c 20 30 78 31   0x12, 0x13, 0x1
9870: 34 2c 20 30 78 31 35 2c 20 30 78 31 36 2c 20 30  4, 0x15, 0x16, 0
9880: 78 31 37 2c 0a 20 20 30 78 31 38 2c 20 30 78 31  x17,.  0x18, 0x1
9890: 39 2c 20 30 78 31 61 2c 20 30 78 31 62 2c 20 30  9, 0x1a, 0x1b, 0
98a0: 78 31 63 2c 20 30 78 31 64 2c 20 30 78 31 65 2c  x1c, 0x1d, 0x1e,
98b0: 20 30 78 31 66 2c 0a 20 20 30 78 30 30 2c 20 30   0x1f,.  0x00, 0
98c0: 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c  x01, 0x02, 0x03,
98d0: 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30   0x04, 0x05, 0x0
98e0: 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c  6, 0x07,.  0x08,
98f0: 20 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30   0x09, 0x0a, 0x0
9900: 62 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30  b, 0x0c, 0x0d, 0
9910: 78 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 30  x0e, 0x0f,.  0x0
9920: 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30  0, 0x01, 0x02, 0
9930: 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c  x03, 0x04, 0x05,
9940: 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30   0x06, 0x07,.  0
9950: 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c  x00, 0x01, 0x02,
9960: 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30   0x03, 0x00, 0x0
9970: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d  1, 0x00, 0x00,.}
9980: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
9990: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
99a0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 55 54   of the first UT
99b0: 46 2d 38 20 63 68 61 72 61 63 74 65 72 20 69 6e  F-8 character in
99c0: 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a   the string..*/.
99d0: 73 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 52  static int utf8R
99e0: 65 61 64 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ead(const unsign
99f0: 65 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ed char *z, int 
9a00: 6e 2c 20 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a  n, int *pSize){.
9a10: 20 20 69 6e 74 20 63 2c 20 69 3b 0a 0a 20 20 2f    int c, i;..  /
9a20: 2a 20 41 6c 6c 20 63 61 6c 6c 65 72 73 20 74 6f  * All callers to
9a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 28 69   this routine (i
9a40: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
9a50: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 0a 20 20  plementation).  
9a60: 2a 2a 20 61 6c 77 61 79 73 20 68 61 76 65 20 6e  ** always have n
9a70: 3e 30 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  >0. */.  if( NEV
9a80: 45 52 28 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20  ER(n==0) ){.    
9a90: 63 20 3d 20 69 20 3d 20 30 3b 0a 20 20 7d 65 6c  c = i = 0;.  }el
9aa0: 73 65 7b 0a 20 20 20 20 63 20 3d 20 7a 5b 30 5d  se{.    c = z[0]
9ab0: 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
9ac0: 20 69 66 28 20 63 3e 3d 30 78 63 30 20 29 7b 0a   if( c>=0xc0 ){.
9ad0: 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
9ae0: 33 55 74 66 38 54 72 61 6e 73 31 5b 63 2d 30 78  3Utf8Trans1[c-0x
9af0: 63 30 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  c0];.      while
9b00: 28 20 69 3c 6e 20 26 26 20 28 7a 5b 69 5d 20 26  ( i<n && (z[i] &
9b10: 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a   0xc0)==0x80 ){.
9b20: 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
9b30: 36 29 20 2b 20 28 30 78 33 66 20 26 20 7a 5b 69  6) + (0x3f & z[i
9b40: 2b 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ++]);.      }.  
9b50: 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65    }.  }.  *pSize
9b60: 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 63   = i;.  return c
9b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9b80: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9b90: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
9ba0: 65 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 69  e utf-8 string i
9bb0: 6e 20 74 68 65 20 6e 49 6e 20 62 79 74 65 0a 2a  n the nIn byte.*
9bc0: 2a 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  * buffer pointed
9bd0: 20 74 6f 20 62 79 20 7a 49 6e 2e 0a 2a 2f 0a 73   to by zIn..*/.s
9be0: 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 43 68  tatic int utf8Ch
9bf0: 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  arlen(const char
9c00: 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b   *zIn, int nIn){
9c10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
9c20: 6e 43 68 61 72 20 3d 20 30 3b 0a 20 20 66 6f 72  nChar = 0;.  for
9c30: 28 69 3d 30 3b 20 69 3c 6e 49 6e 3b 20 6e 43 68  (i=0; i<nIn; nCh
9c40: 61 72 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73  ar++){.    int s
9c50: 7a 3b 0a 20 20 20 20 75 74 66 38 52 65 61 64 28  z;.    utf8Read(
9c60: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
9c70: 63 68 61 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20  char *)&zIn[i], 
9c80: 6e 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20  nIn-i, &sz);.   
9c90: 20 69 20 2b 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20   i += sz;.  }.  
9ca0: 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a  return nChar;.}.
9cb0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
9cc0: 54 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20  Transliteration 
9cd0: 54 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 3b  Transliteration;
9ce0: 0a 73 74 72 75 63 74 20 54 72 61 6e 73 6c 69 74  .struct Translit
9cf0: 65 72 61 74 69 6f 6e 20 7b 0a 20 75 6e 73 69 67  eration {. unsig
9d00: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 46  ned short int cF
9d10: 72 6f 6d 3b 0a 20 75 6e 73 69 67 6e 65 64 20 63  rom;. unsigned c
9d20: 68 61 72 20 63 54 6f 30 2c 20 63 54 6f 31 2c 20  har cTo0, cTo1, 
9d30: 63 54 6f 32 2c 20 63 54 6f 33 3b 0a 7d 3b 0a 0a  cTo2, cTo3;.};..
9d40: 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f 66 20 74  /*.** Table of t
9d50: 72 61 6e 73 6c 61 74 69 6f 6e 73 20 66 72 6f 6d  ranslations from
9d60: 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
9d70: 65 72 73 20 69 6e 74 6f 20 41 53 43 49 49 2e 0a  ers into ASCII..
9d80: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9d90: 54 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20  Transliteration 
9da0: 74 72 61 6e 73 6c 69 74 5b 5d 20 3d 20 7b 0a 20  translit[] = {. 
9db0: 20 7b 20 30 78 30 30 41 30 2c 20 20 30 78 32 30   { 0x00A0,  0x20
9dc0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
9dd0: 30 30 20 7d 2c 20 20 2f 2a 20 c2 a0 20 74 6f 20  00 },  /* .. to 
9de0: 20 20 2a 2f 0a 20 20 7b 20 30 78 30 30 42 35 2c    */.  { 0x00B5,
9df0: 20 20 30 78 37 35 2c 20 30 78 30 30 2c 20 30 78    0x75, 0x00, 0x
9e00: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
9e10: c2 b5 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30  .. to u */.  { 0
9e20: 78 30 30 43 30 2c 20 20 30 78 34 31 2c 20 30 78  x00C0,  0x41, 0x
9e30: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
9e40: 2c 20 20 2f 2a 20 c3 80 20 74 6f 20 41 20 2a 2f  ,  /* .. to A */
9e50: 0a 20 20 7b 20 30 78 30 30 43 31 2c 20 20 30 78  .  { 0x00C1,  0x
9e60: 34 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  41, 0x00, 0x00, 
9e70: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 81 20 74  0x00 },  /* .. t
9e80: 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43  o A */.  { 0x00C
9e90: 32 2c 20 20 30 78 34 31 2c 20 30 78 30 30 2c 20  2,  0x41, 0x00, 
9ea0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
9eb0: 2a 20 c3 82 20 74 6f 20 41 20 2a 2f 0a 20 20 7b  * .. to A */.  {
9ec0: 20 30 78 30 30 43 33 2c 20 20 30 78 34 31 2c 20   0x00C3,  0x41, 
9ed0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
9ee0: 20 7d 2c 20 20 2f 2a 20 c3 83 20 74 6f 20 41 20   },  /* .. to A 
9ef0: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 34 2c 20 20  */.  { 0x00C4,  
9f00: 30 78 34 31 2c 20 30 78 36 35 2c 20 30 78 30 30  0x41, 0x65, 0x00
9f10: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 84  , 0x00 },  /* ..
9f20: 20 74 6f 20 41 65 20 2a 2f 0a 20 20 7b 20 30 78   to Ae */.  { 0x
9f30: 30 30 43 35 2c 20 20 30 78 34 31 2c 20 30 78 36  00C5,  0x41, 0x6
9f40: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  1, 0x00, 0x00 },
9f50: 20 20 2f 2a 20 c3 85 20 74 6f 20 41 61 20 2a 2f    /* .. to Aa */
9f60: 0a 20 20 7b 20 30 78 30 30 43 36 2c 20 20 30 78  .  { 0x00C6,  0x
9f70: 34 31 2c 20 30 78 34 35 2c 20 30 78 30 30 2c 20  41, 0x45, 0x00, 
9f80: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 86 20 74  0x00 },  /* .. t
9f90: 6f 20 41 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o AE */.  { 0x00
9fa0: 43 37 2c 20 20 30 78 34 33 2c 20 30 78 30 30 2c  C7,  0x43, 0x00,
9fb0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
9fc0: 2f 2a 20 c3 87 20 74 6f 20 43 20 2a 2f 0a 20 20  /* .. to C */.  
9fd0: 7b 20 30 78 30 30 43 38 2c 20 20 30 78 34 35 2c  { 0x00C8,  0x45,
9fe0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
9ff0: 30 20 7d 2c 20 20 2f 2a 20 c3 88 20 74 6f 20 45  0 },  /* .. to E
a000: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 39 2c 20   */.  { 0x00C9, 
a010: 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30 78 30   0x45, 0x00, 0x0
a020: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
a030: 89 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
a040: 30 30 43 41 2c 20 20 30 78 34 35 2c 20 30 78 30  00CA,  0x45, 0x0
a050: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
a060: 20 20 2f 2a 20 c3 8a 20 74 6f 20 45 20 2a 2f 0a    /* .. to E */.
a070: 20 20 7b 20 30 78 30 30 43 42 2c 20 20 30 78 34    { 0x00CB,  0x4
a080: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
a090: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8b 20 74 6f  x00 },  /* .. to
a0a0: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 43   E */.  { 0x00CC
a0b0: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30  ,  0x49, 0x00, 0
a0c0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
a0d0: 20 c3 8c 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20   .. to I */.  { 
a0e0: 30 78 30 30 43 44 2c 20 20 30 78 34 39 2c 20 30  0x00CD,  0x49, 0
a0f0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
a100: 7d 2c 20 20 2f 2a 20 c3 8d 20 74 6f 20 49 20 2a  },  /* .. to I *
a110: 2f 0a 20 20 7b 20 30 78 30 30 43 45 2c 20 20 30  /.  { 0x00CE,  0
a120: 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x49, 0x00, 0x00,
a130: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8e 20   0x00 },  /* .. 
a140: 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to I */.  { 0x00
a150: 43 46 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c  CF,  0x49, 0x00,
a160: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
a170: 2f 2a 20 c3 8f 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
a180: 7b 20 30 78 30 30 44 30 2c 20 20 30 78 34 34 2c  { 0x00D0,  0x44,
a190: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
a1a0: 30 20 7d 2c 20 20 2f 2a 20 c3 90 20 74 6f 20 44  0 },  /* .. to D
a1b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 31 2c 20   */.  { 0x00D1, 
a1c0: 20 30 78 34 45 2c 20 30 78 30 30 2c 20 30 78 30   0x4E, 0x00, 0x0
a1d0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
a1e0: 91 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78  . to N */.  { 0x
a1f0: 30 30 44 32 2c 20 20 30 78 34 46 2c 20 30 78 30  00D2,  0x4F, 0x0
a200: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
a210: 20 20 2f 2a 20 c3 92 20 74 6f 20 4f 20 2a 2f 0a    /* .. to O */.
a220: 20 20 7b 20 30 78 30 30 44 33 2c 20 20 30 78 34    { 0x00D3,  0x4
a230: 46 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  F, 0x00, 0x00, 0
a240: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 93 20 74 6f  x00 },  /* .. to
a250: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 34   O */.  { 0x00D4
a260: 2c 20 20 30 78 34 46 2c 20 30 78 30 30 2c 20 30  ,  0x4F, 0x00, 0
a270: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
a280: 20 c3 94 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
a290: 30 78 30 30 44 35 2c 20 20 30 78 34 46 2c 20 30  0x00D5,  0x4F, 0
a2a0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
a2b0: 7d 2c 20 20 2f 2a 20 c3 95 20 74 6f 20 4f 20 2a  },  /* .. to O *
a2c0: 2f 0a 20 20 7b 20 30 78 30 30 44 36 2c 20 20 30  /.  { 0x00D6,  0
a2d0: 78 34 46 2c 20 30 78 36 35 2c 20 30 78 30 30 2c  x4F, 0x65, 0x00,
a2e0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 96 20   0x00 },  /* .. 
a2f0: 74 6f 20 4f 65 20 2a 2f 0a 20 20 7b 20 30 78 30  to Oe */.  { 0x0
a300: 30 44 37 2c 20 20 30 78 37 38 2c 20 30 78 30 30  0D7,  0x78, 0x00
a310: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a320: 20 2f 2a 20 c3 97 20 74 6f 20 78 20 2a 2f 0a 20   /* .. to x */. 
a330: 20 7b 20 30 78 30 30 44 38 2c 20 20 30 78 34 46   { 0x00D8,  0x4F
a340: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a350: 30 30 20 7d 2c 20 20 2f 2a 20 c3 98 20 74 6f 20  00 },  /* .. to 
a360: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 39 2c  O */.  { 0x00D9,
a370: 20 20 30 78 35 35 2c 20 30 78 30 30 2c 20 30 78    0x55, 0x00, 0x
a380: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a390: c3 99 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30  .. to U */.  { 0
a3a0: 78 30 30 44 41 2c 20 20 30 78 35 35 2c 20 30 78  x00DA,  0x55, 0x
a3b0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
a3c0: 2c 20 20 2f 2a 20 c3 9a 20 74 6f 20 55 20 2a 2f  ,  /* .. to U */
a3d0: 0a 20 20 7b 20 30 78 30 30 44 42 2c 20 20 30 78  .  { 0x00DB,  0x
a3e0: 35 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  55, 0x00, 0x00, 
a3f0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9b 20 74  0x00 },  /* .. t
a400: 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44  o U */.  { 0x00D
a410: 43 2c 20 20 30 78 35 35 2c 20 30 78 36 35 2c 20  C,  0x55, 0x65, 
a420: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
a430: 2a 20 c3 9c 20 74 6f 20 55 65 20 2a 2f 0a 20 20  * .. to Ue */.  
a440: 7b 20 30 78 30 30 44 44 2c 20 20 30 78 35 39 2c  { 0x00DD,  0x59,
a450: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
a460: 30 20 7d 2c 20 20 2f 2a 20 c3 9d 20 74 6f 20 59  0 },  /* .. to Y
a470: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 45 2c 20   */.  { 0x00DE, 
a480: 20 30 78 35 34 2c 20 30 78 36 38 2c 20 30 78 30   0x54, 0x68, 0x0
a490: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
a4a0: 9e 20 74 6f 20 54 68 20 2a 2f 0a 20 20 7b 20 30  . to Th */.  { 0
a4b0: 78 30 30 44 46 2c 20 20 30 78 37 33 2c 20 30 78  x00DF,  0x73, 0x
a4c0: 37 33 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  73, 0x00, 0x00 }
a4d0: 2c 20 20 2f 2a 20 c3 9f 20 74 6f 20 73 73 20 2a  ,  /* .. to ss *
a4e0: 2f 0a 20 20 7b 20 30 78 30 30 45 30 2c 20 20 30  /.  { 0x00E0,  0
a4f0: 78 36 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x61, 0x00, 0x00,
a500: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a0 20   0x00 },  /* .. 
a510: 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to a */.  { 0x00
a520: 45 31 2c 20 20 30 78 36 31 2c 20 30 78 30 30 2c  E1,  0x61, 0x00,
a530: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
a540: 2f 2a 20 c3 a1 20 74 6f 20 61 20 2a 2f 0a 20 20  /* .. to a */.  
a550: 7b 20 30 78 30 30 45 32 2c 20 20 30 78 36 31 2c  { 0x00E2,  0x61,
a560: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
a570: 30 20 7d 2c 20 20 2f 2a 20 c3 a2 20 74 6f 20 61  0 },  /* .. to a
a580: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 33 2c 20   */.  { 0x00E3, 
a590: 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78 30   0x61, 0x00, 0x0
a5a0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
a5b0: a3 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78  . to a */.  { 0x
a5c0: 30 30 45 34 2c 20 20 30 78 36 31 2c 20 30 78 36  00E4,  0x61, 0x6
a5d0: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  5, 0x00, 0x00 },
a5e0: 20 20 2f 2a 20 c3 a4 20 74 6f 20 61 65 20 2a 2f    /* .. to ae */
a5f0: 0a 20 20 7b 20 30 78 30 30 45 35 2c 20 20 30 78  .  { 0x00E5,  0x
a600: 36 31 2c 20 30 78 36 31 2c 20 30 78 30 30 2c 20  61, 0x61, 0x00, 
a610: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a5 20 74  0x00 },  /* .. t
a620: 6f 20 61 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o aa */.  { 0x00
a630: 45 36 2c 20 20 30 78 36 31 2c 20 30 78 36 35 2c  E6,  0x61, 0x65,
a640: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
a650: 2f 2a 20 c3 a6 20 74 6f 20 61 65 20 2a 2f 0a 20  /* .. to ae */. 
a660: 20 7b 20 30 78 30 30 45 37 2c 20 20 30 78 36 33   { 0x00E7,  0x63
a670: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a680: 30 30 20 7d 2c 20 20 2f 2a 20 c3 a7 20 74 6f 20  00 },  /* .. to 
a690: 63 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 38 2c  c */.  { 0x00E8,
a6a0: 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78    0x65, 0x00, 0x
a6b0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a6c0: c3 a8 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
a6d0: 78 30 30 45 39 2c 20 20 30 78 36 35 2c 20 30 78  x00E9,  0x65, 0x
a6e0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
a6f0: 2c 20 20 2f 2a 20 c3 a9 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
a700: 0a 20 20 7b 20 30 78 30 30 45 41 2c 20 20 30 78  .  { 0x00EA,  0x
a710: 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  65, 0x00, 0x00, 
a720: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 aa 20 74  0x00 },  /* .. t
a730: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45  o e */.  { 0x00E
a740: 42 2c 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20  B,  0x65, 0x00, 
a750: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
a760: 2a 20 c3 ab 20 74 6f 20 65 20 2a 2f 0a 20 20 7b  * .. to e */.  {
a770: 20 30 78 30 30 45 43 2c 20 20 30 78 36 39 2c 20   0x00EC,  0x69, 
a780: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
a790: 20 7d 2c 20 20 2f 2a 20 c3 ac 20 74 6f 20 69 20   },  /* .. to i 
a7a0: 2a 2f 0a 20 20 7b 20 30 78 30 30 45 44 2c 20 20  */.  { 0x00ED,  
a7b0: 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x69, 0x00, 0x00
a7c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ad  , 0x00 },  /* ..
a7d0: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
a7e0: 30 45 45 2c 20 20 30 78 36 39 2c 20 30 78 30 30  0EE,  0x69, 0x00
a7f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a800: 20 2f 2a 20 c3 ae 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
a810: 20 7b 20 30 78 30 30 45 46 2c 20 20 30 78 36 39   { 0x00EF,  0x69
a820: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a830: 30 30 20 7d 2c 20 20 2f 2a 20 c3 af 20 74 6f 20  00 },  /* .. to 
a840: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 30 2c  i */.  { 0x00F0,
a850: 20 20 30 78 36 34 2c 20 30 78 30 30 2c 20 30 78    0x64, 0x00, 0x
a860: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a870: c3 b0 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30  .. to d */.  { 0
a880: 78 30 30 46 31 2c 20 20 30 78 36 45 2c 20 30 78  x00F1,  0x6E, 0x
a890: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
a8a0: 2c 20 20 2f 2a 20 c3 b1 20 74 6f 20 6e 20 2a 2f  ,  /* .. to n */
a8b0: 0a 20 20 7b 20 30 78 30 30 46 32 2c 20 20 30 78  .  { 0x00F2,  0x
a8c0: 36 46 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  6F, 0x00, 0x00, 
a8d0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b2 20 74  0x00 },  /* .. t
a8e0: 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46  o o */.  { 0x00F
a8f0: 33 2c 20 20 30 78 36 46 2c 20 30 78 30 30 2c 20  3,  0x6F, 0x00, 
a900: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
a910: 2a 20 c3 b3 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b  * .. to o */.  {
a920: 20 30 78 30 30 46 34 2c 20 20 30 78 36 46 2c 20   0x00F4,  0x6F, 
a930: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
a940: 20 7d 2c 20 20 2f 2a 20 c3 b4 20 74 6f 20 6f 20   },  /* .. to o 
a950: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 35 2c 20 20  */.  { 0x00F5,  
a960: 30 78 36 46 2c 20 30 78 30 30 2c 20 30 78 30 30  0x6F, 0x00, 0x00
a970: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b5  , 0x00 },  /* ..
a980: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
a990: 30 46 36 2c 20 20 30 78 36 46 2c 20 30 78 36 35  0F6,  0x6F, 0x65
a9a0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a9b0: 20 2f 2a 20 c3 b6 20 74 6f 20 6f 65 20 2a 2f 0a   /* .. to oe */.
a9c0: 20 20 7b 20 30 78 30 30 46 37 2c 20 20 30 78 33    { 0x00F7,  0x3
a9d0: 41 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  A, 0x00, 0x00, 0
a9e0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b7 20 74 6f  x00 },  /* .. to
a9f0: 20 3a 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 38   : */.  { 0x00F8
aa00: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 2c 20 30  ,  0x6F, 0x00, 0
aa10: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
aa20: 20 c3 b8 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
aa30: 30 78 30 30 46 39 2c 20 20 30 78 37 35 2c 20 30  0x00F9,  0x75, 0
aa40: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
aa50: 7d 2c 20 20 2f 2a 20 c3 b9 20 74 6f 20 75 20 2a  },  /* .. to u *
aa60: 2f 0a 20 20 7b 20 30 78 30 30 46 41 2c 20 20 30  /.  { 0x00FA,  0
aa70: 78 37 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x75, 0x00, 0x00,
aa80: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ba 20   0x00 },  /* .. 
aa90: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to u */.  { 0x00
aaa0: 46 42 2c 20 20 30 78 37 35 2c 20 30 78 30 30 2c  FB,  0x75, 0x00,
aab0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
aac0: 2f 2a 20 c3 bb 20 74 6f 20 75 20 2a 2f 0a 20 20  /* .. to u */.  
aad0: 7b 20 30 78 30 30 46 43 2c 20 20 30 78 37 35 2c  { 0x00FC,  0x75,
aae0: 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30   0x65, 0x00, 0x0
aaf0: 30 20 7d 2c 20 20 2f 2a 20 c3 bc 20 74 6f 20 75  0 },  /* .. to u
ab00: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 44 2c  e */.  { 0x00FD,
ab10: 20 20 30 78 37 39 2c 20 30 78 30 30 2c 20 30 78    0x79, 0x00, 0x
ab20: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
ab30: c3 bd 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30  .. to y */.  { 0
ab40: 78 30 30 46 45 2c 20 20 30 78 37 34 2c 20 30 78  x00FE,  0x74, 0x
ab50: 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  68, 0x00, 0x00 }
ab60: 2c 20 20 2f 2a 20 c3 be 20 74 6f 20 74 68 20 2a  ,  /* .. to th *
ab70: 2f 0a 20 20 7b 20 30 78 30 30 46 46 2c 20 20 30  /.  { 0x00FF,  0
ab80: 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x79, 0x00, 0x00,
ab90: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bf 20   0x00 },  /* .. 
aba0: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to y */.  { 0x01
abb0: 30 30 2c 20 20 30 78 34 31 2c 20 30 78 30 30 2c  00,  0x41, 0x00,
abc0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
abd0: 2f 2a 20 c4 80 20 74 6f 20 41 20 2a 2f 0a 20 20  /* .. to A */.  
abe0: 7b 20 30 78 30 31 30 31 2c 20 20 30 78 36 31 2c  { 0x0101,  0x61,
abf0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
ac00: 30 20 7d 2c 20 20 2f 2a 20 c4 81 20 74 6f 20 61  0 },  /* .. to a
ac10: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 32 2c 20   */.  { 0x0102, 
ac20: 20 30 78 34 31 2c 20 30 78 30 30 2c 20 30 78 30   0x41, 0x00, 0x0
ac30: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  0, 0x00 },  /* .
ac40: 82 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78  . to A */.  { 0x
ac50: 30 31 30 33 2c 20 20 30 78 36 31 2c 20 30 78 30  0103,  0x61, 0x0
ac60: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
ac70: 20 20 2f 2a 20 c4 83 20 74 6f 20 61 20 2a 2f 0a    /* .. to a */.
ac80: 20 20 7b 20 30 78 30 31 30 34 2c 20 20 30 78 34    { 0x0104,  0x4
ac90: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  1, 0x00, 0x00, 0
aca0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 84 20 74 6f  x00 },  /* .. to
acb0: 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 35   A */.  { 0x0105
acc0: 2c 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30  ,  0x61, 0x00, 0
acd0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
ace0: 20 c4 85 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20   .. to a */.  { 
acf0: 30 78 30 31 30 36 2c 20 20 30 78 34 33 2c 20 30  0x0106,  0x43, 0
ad00: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
ad10: 7d 2c 20 20 2f 2a 20 c4 86 20 74 6f 20 43 20 2a  },  /* .. to C *
ad20: 2f 0a 20 20 7b 20 30 78 30 31 30 37 2c 20 20 30  /.  { 0x0107,  0
ad30: 78 36 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x63, 0x00, 0x00,
ad40: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 87 20   0x00 },  /* .. 
ad50: 74 6f 20 63 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to c */.  { 0x01
ad60: 30 38 2c 20 20 30 78 34 33 2c 20 30 78 36 38 2c  08,  0x43, 0x68,
ad70: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
ad80: 2f 2a 20 c4 88 20 74 6f 20 43 68 20 2a 2f 0a 20  /* .. to Ch */. 
ad90: 20 7b 20 30 78 30 31 30 39 2c 20 20 30 78 36 33   { 0x0109,  0x63
ada0: 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78  , 0x68, 0x00, 0x
adb0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 89 20 74 6f 20  00 },  /* .. to 
adc0: 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 41  ch */.  { 0x010A
add0: 2c 20 20 30 78 34 33 2c 20 30 78 30 30 2c 20 30  ,  0x43, 0x00, 0
ade0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
adf0: 20 c4 8a 20 74 6f 20 43 20 2a 2f 0a 20 20 7b 20   .. to C */.  { 
ae00: 30 78 30 31 30 42 2c 20 20 30 78 36 33 2c 20 30  0x010B,  0x63, 0
ae10: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
ae20: 7d 2c 20 20 2f 2a 20 c4 8b 20 74 6f 20 63 20 2a  },  /* .. to c *
ae30: 2f 0a 20 20 7b 20 30 78 30 31 30 43 2c 20 20 30  /.  { 0x010C,  0
ae40: 78 34 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x43, 0x00, 0x00,
ae50: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8c 20   0x00 },  /* .. 
ae60: 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to C */.  { 0x01
ae70: 30 44 2c 20 20 30 78 36 33 2c 20 30 78 30 30 2c  0D,  0x63, 0x00,
ae80: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
ae90: 2f 2a 20 c4 8d 20 74 6f 20 63 20 2a 2f 0a 20 20  /* .. to c */.  
aea0: 7b 20 30 78 30 31 30 45 2c 20 20 30 78 34 34 2c  { 0x010E,  0x44,
aeb0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
aec0: 30 20 7d 2c 20 20 2f 2a 20 c4 8e 20 74 6f 20 44  0 },  /* .. to D
aed0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 46 2c 20   */.  { 0x010F, 
aee0: 20 30 78 36 34 2c 20 30 78 30 30 2c 20 30 78 30   0x64, 0x00, 0x0
aef0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  0, 0x00 },  /* .
af00: 8f 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78  . to d */.  { 0x
af10: 30 31 31 30 2c 20 20 30 78 34 34 2c 20 30 78 30  0110,  0x44, 0x0
af20: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
af30: 20 20 2f 2a 20 c4 90 20 74 6f 20 44 20 2a 2f 0a    /* .. to D */.
af40: 20 20 7b 20 30 78 30 31 31 31 2c 20 20 30 78 36    { 0x0111,  0x6
af50: 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  4, 0x00, 0x00, 0
af60: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 91 20 74 6f  x00 },  /* .. to
af70: 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 32   d */.  { 0x0112
af80: 2c 20 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30  ,  0x45, 0x00, 0
af90: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
afa0: 20 c4 92 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
afb0: 30 78 30 31 31 33 2c 20 20 30 78 36 35 2c 20 30  0x0113,  0x65, 0
afc0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
afd0: 7d 2c 20 20 2f 2a 20 c4 93 20 74 6f 20 65 20 2a  },  /* .. to e *
afe0: 2f 0a 20 20 7b 20 30 78 30 31 31 34 2c 20 20 30  /.  { 0x0114,  0
aff0: 78 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x45, 0x00, 0x00,
b000: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 94 20   0x00 },  /* .. 
b010: 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to E */.  { 0x01
b020: 31 35 2c 20 20 30 78 36 35 2c 20 30 78 30 30 2c  15,  0x65, 0x00,
b030: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b040: 2f 2a 20 c4 95 20 74 6f 20 65 20 2a 2f 0a 20 20  /* .. to e */.  
b050: 7b 20 30 78 30 31 31 36 2c 20 20 30 78 34 35 2c  { 0x0116,  0x45,
b060: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
b070: 30 20 7d 2c 20 20 2f 2a 20 c4 96 20 74 6f 20 45  0 },  /* .. to E
b080: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 37 2c 20   */.  { 0x0117, 
b090: 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30   0x65, 0x00, 0x0
b0a0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  0, 0x00 },  /* .
b0b0: 97 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
b0c0: 30 31 31 38 2c 20 20 30 78 34 35 2c 20 30 78 30  0118,  0x45, 0x0
b0d0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
b0e0: 20 20 2f 2a 20 c4 98 20 74 6f 20 45 20 2a 2f 0a    /* .. to E */.
b0f0: 20 20 7b 20 30 78 30 31 31 39 2c 20 20 30 78 36    { 0x0119,  0x6
b100: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
b110: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 99 20 74 6f  x00 },  /* .. to
b120: 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 41   e */.  { 0x011A
b130: 2c 20 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30  ,  0x45, 0x00, 0
b140: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
b150: 20 c4 9a 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
b160: 30 78 30 31 31 42 2c 20 20 30 78 36 35 2c 20 30  0x011B,  0x65, 0
b170: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
b180: 7d 2c 20 20 2f 2a 20 c4 9b 20 74 6f 20 65 20 2a  },  /* .. to e *
b190: 2f 0a 20 20 7b 20 30 78 30 31 31 43 2c 20 20 30  /.  { 0x011C,  0
b1a0: 78 34 37 2c 20 30 78 36 38 2c 20 30 78 30 30 2c  x47, 0x68, 0x00,
b1b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9c 20   0x00 },  /* .. 
b1c0: 74 6f 20 47 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Gh */.  { 0x0
b1d0: 31 31 44 2c 20 20 30 78 36 37 2c 20 30 78 36 38  11D,  0x67, 0x68
b1e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
b1f0: 20 2f 2a 20 c4 9d 20 74 6f 20 67 68 20 2a 2f 0a   /* .. to gh */.
b200: 20 20 7b 20 30 78 30 31 31 45 2c 20 20 30 78 34    { 0x011E,  0x4
b210: 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  7, 0x00, 0x00, 0
b220: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9e 20 74 6f  x00 },  /* .. to
b230: 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 46   G */.  { 0x011F
b240: 2c 20 20 30 78 36 37 2c 20 30 78 30 30 2c 20 30  ,  0x67, 0x00, 0
b250: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
b260: 20 c4 9f 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20   .. to g */.  { 
b270: 30 78 30 31 32 30 2c 20 20 30 78 34 37 2c 20 30  0x0120,  0x47, 0
b280: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
b290: 7d 2c 20 20 2f 2a 20 c4 a0 20 74 6f 20 47 20 2a  },  /* .. to G *
b2a0: 2f 0a 20 20 7b 20 30 78 30 31 32 31 2c 20 20 30  /.  { 0x0121,  0
b2b0: 78 36 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x67, 0x00, 0x00,
b2c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a1 20   0x00 },  /* .. 
b2d0: 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to g */.  { 0x01
b2e0: 32 32 2c 20 20 30 78 34 37 2c 20 30 78 30 30 2c  22,  0x47, 0x00,
b2f0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b300: 2f 2a 20 c4 a2 20 74 6f 20 47 20 2a 2f 0a 20 20  /* .. to G */.  
b310: 7b 20 30 78 30 31 32 33 2c 20 20 30 78 36 37 2c  { 0x0123,  0x67,
b320: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
b330: 30 20 7d 2c 20 20 2f 2a 20 c4 a3 20 74 6f 20 67  0 },  /* .. to g
b340: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 34 2c 20   */.  { 0x0124, 
b350: 20 30 78 34 38 2c 20 30 78 36 38 2c 20 30 78 30   0x48, 0x68, 0x0
b360: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  0, 0x00 },  /* .
b370: a4 20 74 6f 20 48 68 20 2a 2f 0a 20 20 7b 20 30  . to Hh */.  { 0
b380: 78 30 31 32 35 2c 20 20 30 78 36 38 2c 20 30 78  x0125,  0x68, 0x
b390: 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  68, 0x00, 0x00 }
b3a0: 2c 20 20 2f 2a 20 c4 a5 20 74 6f 20 68 68 20 2a  ,  /* .. to hh *
b3b0: 2f 0a 20 20 7b 20 30 78 30 31 32 36 2c 20 20 30  /.  { 0x0126,  0
b3c0: 78 34 38 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x48, 0x00, 0x00,
b3d0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a6 20   0x00 },  /* .. 
b3e0: 74 6f 20 48 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to H */.  { 0x01
b3f0: 32 37 2c 20 20 30 78 36 38 2c 20 30 78 30 30 2c  27,  0x68, 0x00,
b400: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b410: 2f 2a 20 c4 a7 20 74 6f 20 68 20 2a 2f 0a 20 20  /* .. to h */.  
b420: 7b 20 30 78 30 31 32 38 2c 20 20 30 78 34 39 2c  { 0x0128,  0x49,
b430: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
b440: 30 20 7d 2c 20 20 2f 2a 20 c4 a8 20 74 6f 20 49  0 },  /* .. to I
b450: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 39 2c 20   */.  { 0x0129, 
b460: 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30   0x69, 0x00, 0x0
b470: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  0, 0x00 },  /* .
b480: a9 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
b490: 30 31 32 41 2c 20 20 30 78 34 39 2c 20 30 78 30  012A,  0x49, 0x0
b4a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
b4b0: 20 20 2f 2a 20 c4 aa 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
b4c0: 20 20 7b 20 30 78 30 31 32 42 2c 20 20 30 78 36    { 0x012B,  0x6
b4d0: 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  9, 0x00, 0x00, 0
b4e0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ab 20 74 6f  x00 },  /* .. to
b4f0: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 43   i */.  { 0x012C
b500: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30  ,  0x49, 0x00, 0
b510: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
b520: 20 c4 ac 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20   .. to I */.  { 
b530: 30 78 30 31 32 44 2c 20 20 30 78 36 39 2c 20 30  0x012D,  0x69, 0
b540: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
b550: 7d 2c 20 20 2f 2a 20 c4 ad 20 74 6f 20 69 20 2a  },  /* .. to i *
b560: 2f 0a 20 20 7b 20 30 78 30 31 32 45 2c 20 20 30  /.  { 0x012E,  0
b570: 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x49, 0x00, 0x00,
b580: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ae 20   0x00 },  /* .. 
b590: 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to I */.  { 0x01
b5a0: 32 46 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c  2F,  0x69, 0x00,
b5b0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b5c0: 2f 2a 20 c4 af 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
b5d0: 7b 20 30 78 30 31 33 30 2c 20 20 30 78 34 39 2c  { 0x0130,  0x49,
b5e0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
b5f0: 30 20 7d 2c 20 20 2f 2a 20 c4 b0 20 74 6f 20 49  0 },  /* .. to I
b600: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 31 2c 20   */.  { 0x0131, 
b610: 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30   0x69, 0x00, 0x0
b620: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  0, 0x00 },  /* .
b630: b1 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
b640: 30 31 33 32 2c 20 20 30 78 34 39 2c 20 30 78 34  0132,  0x49, 0x4
b650: 41 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  A, 0x00, 0x00 },
b660: 20 20 2f 2a 20 c4 b2 20 74 6f 20 49 4a 20 2a 2f    /* .. to IJ */
b670: 0a 20 20 7b 20 30 78 30 31 33 33 2c 20 20 30 78  .  { 0x0133,  0x
b680: 36 39 2c 20 30 78 36 41 2c 20 30 78 30 30 2c 20  69, 0x6A, 0x00, 
b690: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b3 20 74  0x00 },  /* .. t
b6a0: 6f 20 69 6a 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o ij */.  { 0x01
b6b0: 33 34 2c 20 20 30 78 34 41 2c 20 30 78 36 38 2c  34,  0x4A, 0x68,
b6c0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b6d0: 2f 2a 20 c4 b4 20 74 6f 20 4a 68 20 2a 2f 0a 20  /* .. to Jh */. 
b6e0: 20 7b 20 30 78 30 31 33 35 2c 20 20 30 78 36 41   { 0x0135,  0x6A
b6f0: 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78  , 0x68, 0x00, 0x
b700: 30 30 20 7d 2c 20 20 2f 2a 20 c4 b5 20 74 6f 20  00 },  /* .. to 
b710: 6a 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 36  jh */.  { 0x0136
b720: 2c 20 20 30 78 34 42 2c 20 30 78 30 30 2c 20 30  ,  0x4B, 0x00, 0
b730: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
b740: 20 c4 b6 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20   .. to K */.  { 
b750: 30 78 30 31 33 37 2c 20 20 30 78 36 42 2c 20 30  0x0137,  0x6B, 0
b760: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
b770: 7d 2c 20 20 2f 2a 20 c4 b7 20 74 6f 20 6b 20 2a  },  /* .. to k *
b780: 2f 0a 20 20 7b 20 30 78 30 31 33 38 2c 20 20 30  /.  { 0x0138,  0
b790: 78 36 42 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x6B, 0x00, 0x00,
b7a0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b8 20   0x00 },  /* .. 
b7b0: 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to k */.  { 0x01
b7c0: 33 39 2c 20 20 30 78 34 43 2c 20 30 78 30 30 2c  39,  0x4C, 0x00,
b7d0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b7e0: 2f 2a 20 c4 b9 20 74 6f 20 4c 20 2a 2f 0a 20 20  /* .. to L */.  
b7f0: 7b 20 30 78 30 31 33 41 2c 20 20 30 78 36 43 2c  { 0x013A,  0x6C,
b800: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
b810: 30 20 7d 2c 20 20 2f 2a 20 c4 ba 20 74 6f 20 6c  0 },  /* .. to l
b820: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 42 2c 20   */.  { 0x013B, 
b830: 20 30 78 34 43 2c 20 30 78 30 30 2c 20 30 78 30   0x4C, 0x00, 0x0
b840: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4  0, 0x00 },  /* .
b850: bb 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78  . to L */.  { 0x
b860: 30 31 33 43 2c 20 20 30 78 36 43 2c 20 30 78 30  013C,  0x6C, 0x0
b870: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
b880: 20 20 2f 2a 20 c4 bc 20 74 6f 20 6c 20 2a 2f 0a    /* .. to l */.
b890: 20 20 7b 20 30 78 30 31 33 44 2c 20 20 30 78 34    { 0x013D,  0x4
b8a0: 43 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  C, 0x00, 0x00, 0
b8b0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 bd 20 74 6f  x00 },  /* .. to
b8c0: 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 45   L */.  { 0x013E
b8d0: 2c 20 20 30 78 36 43 2c 20 30 78 30 30 2c 20 30  ,  0x6C, 0x00, 0
b8e0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
b8f0: 20 c4 be 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20   .. to l */.  { 
b900: 30 78 30 31 33 46 2c 20 20 30 78 34 43 2c 20 30  0x013F,  0x4C, 0
b910: 78 32 45 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x2E, 0x00, 0x00 
b920: 7d 2c 20 20 2f 2a 20 c4 bf 20 74 6f 20 4c 2e 20  },  /* .. to L. 
b930: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 30 2c 20 20  */.  { 0x0140,  
b940: 30 78 36 43 2c 20 30 78 32 45 2c 20 30 78 30 30  0x6C, 0x2E, 0x00
b950: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 80  , 0x00 },  /* ..
b960: 20 74 6f 20 6c 2e 20 2a 2f 0a 20 20 7b 20 30 78   to l. */.  { 0x
b970: 30 31 34 31 2c 20 20 30 78 34 43 2c 20 30 78 30  0141,  0x4C, 0x0
b980: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
b990: 20 20 2f 2a 20 c5 81 20 74 6f 20 4c 20 2a 2f 0a    /* .. to L */.
b9a0: 20 20 7b 20 30 78 30 31 34 32 2c 20 20 30 78 36    { 0x0142,  0x6
b9b0: 43 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  C, 0x00, 0x00, 0
b9c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 82 20 74 6f  x00 },  /* .. to
b9d0: 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 33   l */.  { 0x0143
b9e0: 2c 20 20 30 78 34 45 2c 20 30 78 30 30 2c 20 30  ,  0x4E, 0x00, 0
b9f0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
ba00: 20 c5 83 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20   .. to N */.  { 
ba10: 30 78 30 31 34 34 2c 20 20 30 78 36 45 2c 20 30  0x0144,  0x6E, 0
ba20: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
ba30: 7d 2c 20 20 2f 2a 20 c5 84 20 74 6f 20 6e 20 2a  },  /* .. to n *
ba40: 2f 0a 20 20 7b 20 30 78 30 31 34 35 2c 20 20 30  /.  { 0x0145,  0
ba50: 78 34 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x4E, 0x00, 0x00,
ba60: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 85 20   0x00 },  /* .. 
ba70: 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to N */.  { 0x01
ba80: 34 36 2c 20 20 30 78 36 45 2c 20 30 78 30 30 2c  46,  0x6E, 0x00,
ba90: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
baa0: 2f 2a 20 c5 86 20 74 6f 20 6e 20 2a 2f 0a 20 20  /* .. to n */.  
bab0: 7b 20 30 78 30 31 34 37 2c 20 20 30 78 34 45 2c  { 0x0147,  0x4E,
bac0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
bad0: 30 20 7d 2c 20 20 2f 2a 20 c5 87 20 74 6f 20 4e  0 },  /* .. to N
bae0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 38 2c 20   */.  { 0x0148, 
baf0: 20 30 78 36 45 2c 20 30 78 30 30 2c 20 30 78 30   0x6E, 0x00, 0x0
bb00: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
bb10: 88 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78  . to n */.  { 0x
bb20: 30 31 34 39 2c 20 20 30 78 32 37 2c 20 30 78 36  0149,  0x27, 0x6
bb30: 45 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  E, 0x00, 0x00 },
bb40: 20 20 2f 2a 20 c5 89 20 74 6f 20 27 6e 20 2a 2f    /* .. to 'n */
bb50: 0a 20 20 7b 20 30 78 30 31 34 41 2c 20 20 30 78  .  { 0x014A,  0x
bb60: 34 45 2c 20 30 78 34 37 2c 20 30 78 30 30 2c 20  4E, 0x47, 0x00, 
bb70: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8a 20 74  0x00 },  /* .. t
bb80: 6f 20 4e 47 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o NG */.  { 0x01
bb90: 34 42 2c 20 20 30 78 36 45 2c 20 30 78 36 37 2c  4B,  0x6E, 0x67,
bba0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
bbb0: 2f 2a 20 c5 8b 20 74 6f 20 6e 67 20 2a 2f 0a 20  /* .. to ng */. 
bbc0: 20 7b 20 30 78 30 31 34 43 2c 20 20 30 78 34 46   { 0x014C,  0x4F
bbd0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
bbe0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 8c 20 74 6f 20  00 },  /* .. to 
bbf0: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 44 2c  O */.  { 0x014D,
bc00: 20 20 30 78 36 46 2c 20 30 78 30 30 2c 20 30 78    0x6F, 0x00, 0x
bc10: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
bc20: c5 8d 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30  .. to o */.  { 0
bc30: 78 30 31 34 45 2c 20 20 30 78 34 46 2c 20 30 78  x014E,  0x4F, 0x
bc40: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
bc50: 2c 20 20 2f 2a 20 c5 8e 20 74 6f 20 4f 20 2a 2f  ,  /* .. to O */
bc60: 0a 20 20 7b 20 30 78 30 31 34 46 2c 20 20 30 78  .  { 0x014F,  0x
bc70: 36 46 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  6F, 0x00, 0x00, 
bc80: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8f 20 74  0x00 },  /* .. t
bc90: 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35  o o */.  { 0x015
bca0: 30 2c 20 20 30 78 34 46 2c 20 30 78 30 30 2c 20  0,  0x4F, 0x00, 
bcb0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
bcc0: 2a 20 c5 90 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b  * .. to O */.  {
bcd0: 20 30 78 30 31 35 31 2c 20 20 30 78 36 46 2c 20   0x0151,  0x6F, 
bce0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
bcf0: 20 7d 2c 20 20 2f 2a 20 c5 91 20 74 6f 20 6f 20   },  /* .. to o 
bd00: 2a 2f 0a 20 20 7b 20 30 78 30 31 35 32 2c 20 20  */.  { 0x0152,  
bd10: 30 78 34 46 2c 20 30 78 34 35 2c 20 30 78 30 30  0x4F, 0x45, 0x00
bd20: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 92  , 0x00 },  /* ..
bd30: 20 74 6f 20 4f 45 20 2a 2f 0a 20 20 7b 20 30 78   to OE */.  { 0x
bd40: 30 31 35 33 2c 20 20 30 78 36 46 2c 20 30 78 36  0153,  0x6F, 0x6
bd50: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  5, 0x00, 0x00 },
bd60: 20 20 2f 2a 20 c5 93 20 74 6f 20 6f 65 20 2a 2f    /* .. to oe */
bd70: 0a 20 20 7b 20 30 78 30 31 35 34 2c 20 20 30 78  .  { 0x0154,  0x
bd80: 35 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  52, 0x00, 0x00, 
bd90: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 94 20 74  0x00 },  /* .. t
bda0: 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35  o R */.  { 0x015
bdb0: 35 2c 20 20 30 78 37 32 2c 20 30 78 30 30 2c 20  5,  0x72, 0x00, 
bdc0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
bdd0: 2a 20 c5 95 20 74 6f 20 72 20 2a 2f 0a 20 20 7b  * .. to r */.  {
bde0: 20 30 78 30 31 35 36 2c 20 20 30 78 35 32 2c 20   0x0156,  0x52, 
bdf0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
be00: 20 7d 2c 20 20 2f 2a 20 c5 96 20 74 6f 20 52 20   },  /* .. to R 
be10: 2a 2f 0a 20 20 7b 20 30 78 30 31 35 37 2c 20 20  */.  { 0x0157,  
be20: 30 78 37 32 2c 20 30 78 30 30 2c 20 30 78 30 30  0x72, 0x00, 0x00
be30: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 97  , 0x00 },  /* ..
be40: 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30   to r */.  { 0x0
be50: 31 35 38 2c 20 20 30 78 35 32 2c 20 30 78 30 30  158,  0x52, 0x00
be60: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
be70: 20 2f 2a 20 c5 98 20 74 6f 20 52 20 2a 2f 0a 20   /* .. to R */. 
be80: 20 7b 20 30 78 30 31 35 39 2c 20 20 30 78 37 32   { 0x0159,  0x72
be90: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
bea0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 99 20 74 6f 20  00 },  /* .. to 
beb0: 72 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 41 2c  r */.  { 0x015A,
bec0: 20 20 30 78 35 33 2c 20 30 78 30 30 2c 20 30 78    0x53, 0x00, 0x
bed0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
bee0: c5 9a 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30  .. to S */.  { 0
bef0: 78 30 31 35 42 2c 20 20 30 78 37 33 2c 20 30 78  x015B,  0x73, 0x
bf00: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
bf10: 2c 20 20 2f 2a 20 c5 9b 20 74 6f 20 73 20 2a 2f  ,  /* .. to s */
bf20: 0a 20 20 7b 20 30 78 30 31 35 43 2c 20 20 30 78  .  { 0x015C,  0x
bf30: 35 33 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20  53, 0x68, 0x00, 
bf40: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9c 20 74  0x00 },  /* .. t
bf50: 6f 20 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o Sh */.  { 0x01
bf60: 35 44 2c 20 20 30 78 37 33 2c 20 30 78 36 38 2c  5D,  0x73, 0x68,
bf70: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
bf80: 2f 2a 20 c5 9d 20 74 6f 20 73 68 20 2a 2f 0a 20  /* .. to sh */. 
bf90: 20 7b 20 30 78 30 31 35 45 2c 20 20 30 78 35 33   { 0x015E,  0x53
bfa0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
bfb0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 9e 20 74 6f 20  00 },  /* .. to 
bfc0: 53 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 46 2c  S */.  { 0x015F,
bfd0: 20 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30 78    0x73, 0x00, 0x
bfe0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
bff0: c5 9f 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30  .. to s */.  { 0
c000: 78 30 31 36 30 2c 20 20 30 78 35 33 2c 20 30 78  x0160,  0x53, 0x
c010: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
c020: 2c 20 20 2f 2a 20 c5 a0 20 74 6f 20 53 20 2a 2f  ,  /* .. to S */
c030: 0a 20 20 7b 20 30 78 30 31 36 31 2c 20 20 30 78  .  { 0x0161,  0x
c040: 37 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  73, 0x00, 0x00, 
c050: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a1 20 74  0x00 },  /* .. t
c060: 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36  o s */.  { 0x016
c070: 32 2c 20 20 30 78 35 34 2c 20 30 78 30 30 2c 20  2,  0x54, 0x00, 
c080: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c090: 2a 20 c5 a2 20 74 6f 20 54 20 2a 2f 0a 20 20 7b  * .. to T */.  {
c0a0: 20 30 78 30 31 36 33 2c 20 20 30 78 37 34 2c 20   0x0163,  0x74, 
c0b0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
c0c0: 20 7d 2c 20 20 2f 2a 20 c5 a3 20 74 6f 20 74 20   },  /* .. to t 
c0d0: 2a 2f 0a 20 20 7b 20 30 78 30 31 36 34 2c 20 20  */.  { 0x0164,  
c0e0: 30 78 35 34 2c 20 30 78 30 30 2c 20 30 78 30 30  0x54, 0x00, 0x00
c0f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a4  , 0x00 },  /* ..
c100: 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30   to T */.  { 0x0
c110: 31 36 35 2c 20 20 30 78 37 34 2c 20 30 78 30 30  165,  0x74, 0x00
c120: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c130: 20 2f 2a 20 c5 a5 20 74 6f 20 74 20 2a 2f 0a 20   /* .. to t */. 
c140: 20 7b 20 30 78 30 31 36 36 2c 20 20 30 78 35 34   { 0x0166,  0x54
c150: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c160: 30 30 20 7d 2c 20 20 2f 2a 20 c5 a6 20 74 6f 20  00 },  /* .. to 
c170: 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 37 2c  T */.  { 0x0167,
c180: 20 20 30 78 37 34 2c 20 30 78 30 30 2c 20 30 78    0x74, 0x00, 0x
c190: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
c1a0: c5 a7 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30  .. to t */.  { 0
c1b0: 78 30 31 36 38 2c 20 20 30 78 35 35 2c 20 30 78  x0168,  0x55, 0x
c1c0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
c1d0: 2c 20 20 2f 2a 20 c5 a8 20 74 6f 20 55 20 2a 2f  ,  /* .. to U */
c1e0: 0a 20 20 7b 20 30 78 30 31 36 39 2c 20 20 30 78  .  { 0x0169,  0x
c1f0: 37 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  75, 0x00, 0x00, 
c200: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a9 20 74  0x00 },  /* .. t
c210: 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36  o u */.  { 0x016
c220: 41 2c 20 20 30 78 35 35 2c 20 30 78 30 30 2c 20  A,  0x55, 0x00, 
c230: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c240: 2a 20 c5 aa 20 74 6f 20 55 20 2a 2f 0a 20 20 7b  * .. to U */.  {
c250: 20 30 78 30 31 36 42 2c 20 20 30 78 37 35 2c 20   0x016B,  0x75, 
c260: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
c270: 20 7d 2c 20 20 2f 2a 20 c5 ab 20 74 6f 20 75 20   },  /* .. to u 
c280: 2a 2f 0a 20 20 7b 20 30 78 30 31 36 43 2c 20 20  */.  { 0x016C,  
c290: 30 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30 30  0x55, 0x00, 0x00
c2a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ac  , 0x00 },  /* ..
c2b0: 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30   to U */.  { 0x0
c2c0: 31 36 44 2c 20 20 30 78 37 35 2c 20 30 78 30 30  16D,  0x75, 0x00
c2d0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c2e0: 20 2f 2a 20 c5 ad 20 74 6f 20 75 20 2a 2f 0a 20   /* .. to u */. 
c2f0: 20 7b 20 30 78 30 31 36 45 2c 20 20 30 78 35 35   { 0x016E,  0x55
c300: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c310: 30 30 20 7d 2c 20 20 2f 2a 20 c5 ae 20 74 6f 20  00 },  /* .. to 
c320: 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 46 2c  U */.  { 0x016F,
c330: 20 20 30 78 37 35 2c 20 30 78 30 30 2c 20 30 78    0x75, 0x00, 0x
c340: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
c350: c5 af 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30  .. to u */.  { 0
c360: 78 30 31 37 30 2c 20 20 30 78 35 35 2c 20 30 78  x0170,  0x55, 0x
c370: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
c380: 2c 20 20 2f 2a 20 c5 b0 20 74 6f 20 55 20 2a 2f  ,  /* .. to U */
c390: 0a 20 20 7b 20 30 78 30 31 37 31 2c 20 20 30 78  .  { 0x0171,  0x
c3a0: 37 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  75, 0x00, 0x00, 
c3b0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b1 20 74  0x00 },  /* .. t
c3c0: 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37  o u */.  { 0x017
c3d0: 32 2c 20 20 30 78 35 35 2c 20 30 78 30 30 2c 20  2,  0x55, 0x00, 
c3e0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c3f0: 2a 20 c5 b2 20 74 6f 20 55 20 2a 2f 0a 20 20 7b  * .. to U */.  {
c400: 20 30 78 30 31 37 33 2c 20 20 30 78 37 35 2c 20   0x0173,  0x75, 
c410: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
c420: 20 7d 2c 20 20 2f 2a 20 c5 b3 20 74 6f 20 75 20   },  /* .. to u 
c430: 2a 2f 0a 20 20 7b 20 30 78 30 31 37 34 2c 20 20  */.  { 0x0174,  
c440: 30 78 35 37 2c 20 30 78 30 30 2c 20 30 78 30 30  0x57, 0x00, 0x00
c450: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b4  , 0x00 },  /* ..
c460: 20 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 30   to W */.  { 0x0
c470: 31 37 35 2c 20 20 30 78 37 37 2c 20 30 78 30 30  175,  0x77, 0x00
c480: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c490: 20 2f 2a 20 c5 b5 20 74 6f 20 77 20 2a 2f 0a 20   /* .. to w */. 
c4a0: 20 7b 20 30 78 30 31 37 36 2c 20 20 30 78 35 39   { 0x0176,  0x59
c4b0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c4c0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 b6 20 74 6f 20  00 },  /* .. to 
c4d0: 59 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 37 2c  Y */.  { 0x0177,
c4e0: 20 20 30 78 37 39 2c 20 30 78 30 30 2c 20 30 78    0x79, 0x00, 0x
c4f0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
c500: c5 b7 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30  .. to y */.  { 0
c510: 78 30 31 37 38 2c 20 20 30 78 35 39 2c 20 30 78  x0178,  0x59, 0x
c520: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
c530: 2c 20 20 2f 2a 20 c5 b8 20 74 6f 20 59 20 2a 2f  ,  /* .. to Y */
c540: 0a 20 20 7b 20 30 78 30 31 37 39 2c 20 20 30 78  .  { 0x0179,  0x
c550: 35 41 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  5A, 0x00, 0x00, 
c560: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b9 20 74  0x00 },  /* .. t
c570: 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37  o Z */.  { 0x017
c580: 41 2c 20 20 30 78 37 41 2c 20 30 78 30 30 2c 20  A,  0x7A, 0x00, 
c590: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c5a0: 2a 20 c5 ba 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b  * .. to z */.  {
c5b0: 20 30 78 30 31 37 42 2c 20 20 30 78 35 41 2c 20   0x017B,  0x5A, 
c5c0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
c5d0: 20 7d 2c 20 20 2f 2a 20 c5 bb 20 74 6f 20 5a 20   },  /* .. to Z 
c5e0: 2a 2f 0a 20 20 7b 20 30 78 30 31 37 43 2c 20 20  */.  { 0x017C,  
c5f0: 30 78 37 41 2c 20 30 78 30 30 2c 20 30 78 30 30  0x7A, 0x00, 0x00
c600: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bc  , 0x00 },  /* ..
c610: 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30   to z */.  { 0x0
c620: 31 37 44 2c 20 20 30 78 35 41 2c 20 30 78 30 30  17D,  0x5A, 0x00
c630: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c640: 20 2f 2a 20 c5 bd 20 74 6f 20 5a 20 2a 2f 0a 20   /* .. to Z */. 
c650: 20 7b 20 30 78 30 31 37 45 2c 20 20 30 78 37 41   { 0x017E,  0x7A
c660: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c670: 30 30 20 7d 2c 20 20 2f 2a 20 c5 be 20 74 6f 20  00 },  /* .. to 
c680: 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 46 2c  z */.  { 0x017F,
c690: 20 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30 78    0x73, 0x00, 0x
c6a0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
c6b0: c5 bf 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30  .. to s */.  { 0
c6c0: 78 30 31 39 32 2c 20 20 30 78 36 36 2c 20 30 78  x0192,  0x66, 0x
c6d0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
c6e0: 2c 20 20 2f 2a 20 c6 92 20 74 6f 20 66 20 2a 2f  ,  /* .. to f */
c6f0: 0a 20 20 7b 20 30 78 30 32 31 38 2c 20 20 30 78  .  { 0x0218,  0x
c700: 35 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  53, 0x00, 0x00, 
c710: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 98 20 74  0x00 },  /* .. t
c720: 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 32 31  o S */.  { 0x021
c730: 39 2c 20 20 30 78 37 33 2c 20 30 78 30 30 2c 20  9,  0x73, 0x00, 
c740: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c750: 2a 20 c8 99 20 74 6f 20 73 20 2a 2f 0a 20 20 7b  * .. to s */.  {
c760: 20 30 78 30 32 31 41 2c 20 20 30 78 35 34 2c 20   0x021A,  0x54, 
c770: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
c780: 20 7d 2c 20 20 2f 2a 20 c8 9a 20 74 6f 20 54 20   },  /* .. to T 
c790: 2a 2f 0a 20 20 7b 20 30 78 30 32 31 42 2c 20 20  */.  { 0x021B,  
c7a0: 30 78 37 34 2c 20 30 78 30 30 2c 20 30 78 30 30  0x74, 0x00, 0x00
c7b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9b  , 0x00 },  /* ..
c7c0: 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30   to t */.  { 0x0
c7d0: 33 38 36 2c 20 20 30 78 34 31 2c 20 30 78 30 30  386,  0x41, 0x00
c7e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c7f0: 20 2f 2a 20 ce 86 20 74 6f 20 41 20 2a 2f 0a 20   /* .. to A */. 
c800: 20 7b 20 30 78 30 33 38 38 2c 20 20 30 78 34 35   { 0x0388,  0x45
c810: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c820: 30 30 20 7d 2c 20 20 2f 2a 20 ce 88 20 74 6f 20  00 },  /* .. to 
c830: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 39 2c  E */.  { 0x0389,
c840: 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78    0x49, 0x00, 0x
c850: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
c860: ce 89 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
c870: 78 30 33 38 41 2c 20 20 30 78 34 39 2c 20 30 78  x038A,  0x49, 0x
c880: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
c890: 2c 20 20 2f 2a 20 ce 8a 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
c8a0: 0a 20 20 7b 20 30 78 30 33 38 43 2c 20 20 30 78  .  { 0x038C,  0x
c8b0: 34 66 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  4f, 0x00, 0x00, 
c8c0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 8c 20 74  0x00 },  /* .. t
c8d0: 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38  o O */.  { 0x038
c8e0: 45 2c 20 20 30 78 35 39 2c 20 30 78 30 30 2c 20  E,  0x59, 0x00, 
c8f0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c900: 2a 20 ce 8e 20 74 6f 20 59 20 2a 2f 0a 20 20 7b  * .. to Y */.  {
c910: 20 30 78 30 33 38 46 2c 20 20 30 78 34 66 2c 20   0x038F,  0x4f, 
c920: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
c930: 20 7d 2c 20 20 2f 2a 20 ce 8f 20 74 6f 20 4f 20   },  /* .. to O 
c940: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 30 2c 20 20  */.  { 0x0390,  
c950: 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x69, 0x00, 0x00
c960: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 90  , 0x00 },  /* ..
c970: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
c980: 33 39 31 2c 20 20 30 78 34 31 2c 20 30 78 30 30  391,  0x41, 0x00
c990: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c9a0: 20 2f 2a 20 ce 91 20 74 6f 20 41 20 2a 2f 0a 20   /* .. to A */. 
c9b0: 20 7b 20 30 78 30 33 39 32 2c 20 20 30 78 34 32   { 0x0392,  0x42
c9c0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c9d0: 30 30 20 7d 2c 20 20 2f 2a 20 ce 92 20 74 6f 20  00 },  /* .. to 
c9e0: 42 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 33 2c  B */.  { 0x0393,
c9f0: 20 20 30 78 34 37 2c 20 30 78 30 30 2c 20 30 78    0x47, 0x00, 0x
ca00: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
ca10: ce 93 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30  .. to G */.  { 0
ca20: 78 30 33 39 34 2c 20 20 30 78 34 34 2c 20 30 78  x0394,  0x44, 0x
ca30: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
ca40: 2c 20 20 2f 2a 20 ce 94 20 74 6f 20 44 20 2a 2f  ,  /* .. to D */
ca50: 0a 20 20 7b 20 30 78 30 33 39 35 2c 20 20 30 78  .  { 0x0395,  0x
ca60: 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  45, 0x00, 0x00, 
ca70: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 95 20 74  0x00 },  /* .. t
ca80: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39  o E */.  { 0x039
ca90: 36 2c 20 20 30 78 35 61 2c 20 30 78 30 30 2c 20  6,  0x5a, 0x00, 
caa0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
cab0: 2a 20 ce 96 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b  * .. to Z */.  {
cac0: 20 30 78 30 33 39 37 2c 20 20 30 78 34 39 2c 20   0x0397,  0x49, 
cad0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
cae0: 20 7d 2c 20 20 2f 2a 20 ce 97 20 74 6f 20 49 20   },  /* .. to I 
caf0: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 38 2c 20 20  */.  { 0x0398,  
cb00: 30 78 35 34 2c 20 30 78 36 38 2c 20 30 78 30 30  0x54, 0x68, 0x00
cb10: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 98  , 0x00 },  /* ..
cb20: 20 74 6f 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78   to Th */.  { 0x
cb30: 30 33 39 39 2c 20 20 30 78 34 39 2c 20 30 78 30  0399,  0x49, 0x0
cb40: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
cb50: 20 20 2f 2a 20 ce 99 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
cb60: 20 20 7b 20 30 78 30 33 39 41 2c 20 20 30 78 34    { 0x039A,  0x4
cb70: 62 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  b, 0x00, 0x00, 0
cb80: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9a 20 74 6f  x00 },  /* .. to
cb90: 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 42   K */.  { 0x039B
cba0: 2c 20 20 30 78 34 63 2c 20 30 78 30 30 2c 20 30  ,  0x4c, 0x00, 0
cbb0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
cbc0: 20 ce 9b 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20   .. to L */.  { 
cbd0: 30 78 30 33 39 43 2c 20 20 30 78 34 64 2c 20 30  0x039C,  0x4d, 0
cbe0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
cbf0: 7d 2c 20 20 2f 2a 20 ce 9c 20 74 6f 20 4d 20 2a  },  /* .. to M *
cc00: 2f 0a 20 20 7b 20 30 78 30 33 39 44 2c 20 20 30  /.  { 0x039D,  0
cc10: 78 34 65 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x4e, 0x00, 0x00,
cc20: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9d 20   0x00 },  /* .. 
cc30: 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to N */.  { 0x03
cc40: 39 45 2c 20 20 30 78 35 38 2c 20 30 78 30 30 2c  9E,  0x58, 0x00,
cc50: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
cc60: 2f 2a 20 ce 9e 20 74 6f 20 58 20 2a 2f 0a 20 20  /* .. to X */.  
cc70: 7b 20 30 78 30 33 39 46 2c 20 20 30 78 34 66 2c  { 0x039F,  0x4f,
cc80: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
cc90: 30 20 7d 2c 20 20 2f 2a 20 ce 9f 20 74 6f 20 4f  0 },  /* .. to O
cca0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 30 2c 20   */.  { 0x03A0, 
ccb0: 20 30 78 35 30 2c 20 30 78 30 30 2c 20 30 78 30   0x50, 0x00, 0x0
ccc0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  0, 0x00 },  /* .
ccd0: a0 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78  . to P */.  { 0x
cce0: 30 33 41 31 2c 20 20 30 78 35 32 2c 20 30 78 30  03A1,  0x52, 0x0
ccf0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
cd00: 20 20 2f 2a 20 ce a1 20 74 6f 20 52 20 2a 2f 0a    /* .. to R */.
cd10: 20 20 7b 20 30 78 30 33 41 33 2c 20 20 30 78 35    { 0x03A3,  0x5
cd20: 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  3, 0x00, 0x00, 0
cd30: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a3 20 74 6f  x00 },  /* .. to
cd40: 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 34   S */.  { 0x03A4
cd50: 2c 20 20 30 78 35 34 2c 20 30 78 30 30 2c 20 30  ,  0x54, 0x00, 0
cd60: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
cd70: 20 ce a4 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20   .. to T */.  { 
cd80: 30 78 30 33 41 35 2c 20 20 30 78 35 39 2c 20 30  0x03A5,  0x59, 0
cd90: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
cda0: 7d 2c 20 20 2f 2a 20 ce a5 20 74 6f 20 59 20 2a  },  /* .. to Y *
cdb0: 2f 0a 20 20 7b 20 30 78 30 33 41 36 2c 20 20 30  /.  { 0x03A6,  0
cdc0: 78 34 36 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x46, 0x00, 0x00,
cdd0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a6 20   0x00 },  /* .. 
cde0: 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to F */.  { 0x03
cdf0: 41 37 2c 20 20 30 78 34 33 2c 20 30 78 36 38 2c  A7,  0x43, 0x68,
ce00: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
ce10: 2f 2a 20 ce a7 20 74 6f 20 43 68 20 2a 2f 0a 20  /* .. to Ch */. 
ce20: 20 7b 20 30 78 30 33 41 38 2c 20 20 30 78 35 30   { 0x03A8,  0x50
ce30: 2c 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30 78  , 0x73, 0x00, 0x
ce40: 30 30 20 7d 2c 20 20 2f 2a 20 ce a8 20 74 6f 20  00 },  /* .. to 
ce50: 50 73 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 39  Ps */.  { 0x03A9
ce60: 2c 20 20 30 78 34 66 2c 20 30 78 30 30 2c 20 30  ,  0x4f, 0x00, 0
ce70: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
ce80: 20 ce a9 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
ce90: 30 78 30 33 41 41 2c 20 20 30 78 34 39 2c 20 30  0x03AA,  0x49, 0
cea0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
ceb0: 7d 2c 20 20 2f 2a 20 ce aa 20 74 6f 20 49 20 2a  },  /* .. to I *
cec0: 2f 0a 20 20 7b 20 30 78 30 33 41 42 2c 20 20 30  /.  { 0x03AB,  0
ced0: 78 35 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x59, 0x00, 0x00,
cee0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ab 20   0x00 },  /* .. 
cef0: 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to Y */.  { 0x03
cf00: 41 43 2c 20 20 30 78 36 31 2c 20 30 78 30 30 2c  AC,  0x61, 0x00,
cf10: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
cf20: 2f 2a 20 ce ac 20 74 6f 20 61 20 2a 2f 0a 20 20  /* .. to a */.  
cf30: 7b 20 30 78 30 33 41 44 2c 20 20 30 78 36 35 2c  { 0x03AD,  0x65,
cf40: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
cf50: 30 20 7d 2c 20 20 2f 2a 20 ce ad 20 74 6f 20 65  0 },  /* .. to e
cf60: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 45 2c 20   */.  { 0x03AE, 
cf70: 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30   0x69, 0x00, 0x0
cf80: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  0, 0x00 },  /* .
cf90: ae 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
cfa0: 30 33 41 46 2c 20 20 30 78 36 39 2c 20 30 78 30  03AF,  0x69, 0x0
cfb0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
cfc0: 20 20 2f 2a 20 ce af 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
cfd0: 20 20 7b 20 30 78 30 33 42 31 2c 20 20 30 78 36    { 0x03B1,  0x6
cfe0: 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  1, 0x00, 0x00, 0
cff0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b1 20 74 6f  x00 },  /* .. to
d000: 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 32   a */.  { 0x03B2
d010: 2c 20 20 30 78 36 32 2c 20 30 78 30 30 2c 20 30  ,  0x62, 0x00, 0
d020: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d030: 20 ce b2 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20   .. to b */.  { 
d040: 30 78 30 33 42 33 2c 20 20 30 78 36 37 2c 20 30  0x03B3,  0x67, 0
d050: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d060: 7d 2c 20 20 2f 2a 20 ce b3 20 74 6f 20 67 20 2a  },  /* .. to g *
d070: 2f 0a 20 20 7b 20 30 78 30 33 42 34 2c 20 20 30  /.  { 0x03B4,  0
d080: 78 36 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x64, 0x00, 0x00,
d090: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b4 20   0x00 },  /* .. 
d0a0: 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to d */.  { 0x03
d0b0: 42 35 2c 20 20 30 78 36 35 2c 20 30 78 30 30 2c  B5,  0x65, 0x00,
d0c0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
d0d0: 2f 2a 20 ce b5 20 74 6f 20 65 20 2a 2f 0a 20 20  /* .. to e */.  
d0e0: 7b 20 30 78 30 33 42 36 2c 20 20 30 78 37 61 2c  { 0x03B6,  0x7a,
d0f0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
d100: 30 20 7d 2c 20 20 2f 2a 20 ce b6 20 74 6f 20 7a  0 },  /* .. to z
d110: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 37 2c 20   */.  { 0x03B7, 
d120: 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30   0x69, 0x00, 0x0
d130: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  0, 0x00 },  /* .
d140: b7 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
d150: 30 33 42 38 2c 20 20 30 78 37 34 2c 20 30 78 36  03B8,  0x74, 0x6
d160: 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  8, 0x00, 0x00 },
d170: 20 20 2f 2a 20 ce b8 20 74 6f 20 74 68 20 2a 2f    /* .. to th */
d180: 0a 20 20 7b 20 30 78 30 33 42 39 2c 20 20 30 78  .  { 0x03B9,  0x
d190: 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  69, 0x00, 0x00, 
d1a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b9 20 74  0x00 },  /* .. t
d1b0: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o i */.  { 0x03B
d1c0: 41 2c 20 20 30 78 36 62 2c 20 30 78 30 30 2c 20  A,  0x6b, 0x00, 
d1d0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
d1e0: 2a 20 ce ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b  * .. to k */.  {
d1f0: 20 30 78 30 33 42 42 2c 20 20 30 78 36 63 2c 20   0x03BB,  0x6c, 
d200: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
d210: 20 7d 2c 20 20 2f 2a 20 ce bb 20 74 6f 20 6c 20   },  /* .. to l 
d220: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 43 2c 20 20  */.  { 0x03BC,  
d230: 30 78 36 64 2c 20 30 78 30 30 2c 20 30 78 30 30  0x6d, 0x00, 0x00
d240: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bc  , 0x00 },  /* ..
d250: 20 74 6f 20 6d 20 2a 2f 0a 20 20 7b 20 30 78 30   to m */.  { 0x0
d260: 33 42 44 2c 20 20 30 78 36 65 2c 20 30 78 30 30  3BD,  0x6e, 0x00
d270: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
d280: 20 2f 2a 20 ce bd 20 74 6f 20 6e 20 2a 2f 0a 20   /* .. to n */. 
d290: 20 7b 20 30 78 30 33 42 45 2c 20 20 30 78 37 38   { 0x03BE,  0x78
d2a0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
d2b0: 30 30 20 7d 2c 20 20 2f 2a 20 ce be 20 74 6f 20  00 },  /* .. to 
d2c0: 78 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 46 2c  x */.  { 0x03BF,
d2d0: 20 20 30 78 36 66 2c 20 30 78 30 30 2c 20 30 78    0x6f, 0x00, 0x
d2e0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
d2f0: ce bf 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30  .. to o */.  { 0
d300: 78 30 33 43 30 2c 20 20 30 78 37 30 2c 20 30 78  x03C0,  0x70, 0x
d310: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
d320: 2c 20 20 2f 2a 20 cf 80 20 74 6f 20 70 20 2a 2f  ,  /* .. to p */
d330: 0a 20 20 7b 20 30 78 30 33 43 31 2c 20 20 30 78  .  { 0x03C1,  0x
d340: 37 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  72, 0x00, 0x00, 
d350: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 81 20 74  0x00 },  /* .. t
d360: 6f 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43  o r */.  { 0x03C
d370: 33 2c 20 20 30 78 37 33 2c 20 30 78 30 30 2c 20  3,  0x73, 0x00, 
d380: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
d390: 2a 20 cf 83 20 74 6f 20 73 20 2a 2f 0a 20 20 7b  * .. to s */.  {
d3a0: 20 30 78 30 33 43 34 2c 20 20 30 78 37 34 2c 20   0x03C4,  0x74, 
d3b0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
d3c0: 20 7d 2c 20 20 2f 2a 20 cf 84 20 74 6f 20 74 20   },  /* .. to t 
d3d0: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 35 2c 20 20  */.  { 0x03C5,  
d3e0: 30 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x79, 0x00, 0x00
d3f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 85  , 0x00 },  /* ..
d400: 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30   to y */.  { 0x0
d410: 33 43 36 2c 20 20 30 78 36 36 2c 20 30 78 30 30  3C6,  0x66, 0x00
d420: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
d430: 20 2f 2a 20 cf 86 20 74 6f 20 66 20 2a 2f 0a 20   /* .. to f */. 
d440: 20 7b 20 30 78 30 33 43 37 2c 20 20 30 78 36 33   { 0x03C7,  0x63
d450: 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78  , 0x68, 0x00, 0x
d460: 30 30 20 7d 2c 20 20 2f 2a 20 cf 87 20 74 6f 20  00 },  /* .. to 
d470: 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 38  ch */.  { 0x03C8
d480: 2c 20 20 30 78 37 30 2c 20 30 78 37 33 2c 20 30  ,  0x70, 0x73, 0
d490: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d4a0: 20 cf 88 20 74 6f 20 70 73 20 2a 2f 0a 20 20 7b   .. to ps */.  {
d4b0: 20 30 78 30 33 43 39 2c 20 20 30 78 36 66 2c 20   0x03C9,  0x6f, 
d4c0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
d4d0: 20 7d 2c 20 20 2f 2a 20 cf 89 20 74 6f 20 6f 20   },  /* .. to o 
d4e0: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 41 2c 20 20  */.  { 0x03CA,  
d4f0: 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x69, 0x00, 0x00
d500: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8a  , 0x00 },  /* ..
d510: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
d520: 33 43 42 2c 20 20 30 78 37 39 2c 20 30 78 30 30  3CB,  0x79, 0x00
d530: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
d540: 20 2f 2a 20 cf 8b 20 74 6f 20 79 20 2a 2f 0a 20   /* .. to y */. 
d550: 20 7b 20 30 78 30 33 43 43 2c 20 20 30 78 36 66   { 0x03CC,  0x6f
d560: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
d570: 30 30 20 7d 2c 20 20 2f 2a 20 cf 8c 20 74 6f 20  00 },  /* .. to 
d580: 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 44 2c  o */.  { 0x03CD,
d590: 20 20 30 78 37 39 2c 20 30 78 30 30 2c 20 30 78    0x79, 0x00, 0x
d5a0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
d5b0: cf 8d 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30  .. to y */.  { 0
d5c0: 78 30 33 43 45 2c 20 20 30 78 36 39 2c 20 30 78  x03CE,  0x69, 0x
d5d0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
d5e0: 2c 20 20 2f 2a 20 cf 8e 20 74 6f 20 69 20 2a 2f  ,  /* .. to i */
d5f0: 0a 20 20 7b 20 30 78 30 34 30 30 2c 20 20 30 78  .  { 0x0400,  0x
d600: 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  45, 0x00, 0x00, 
d610: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 80 20 74  0x00 },  /* .. t
d620: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30  o E */.  { 0x040
d630: 31 2c 20 20 30 78 34 35 2c 20 30 78 30 30 2c 20  1,  0x45, 0x00, 
d640: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
d650: 2a 20 d0 81 20 74 6f 20 45 20 2a 2f 0a 20 20 7b  * .. to E */.  {
d660: 20 30 78 30 34 30 32 2c 20 20 30 78 34 34 2c 20   0x0402,  0x44, 
d670: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
d680: 20 7d 2c 20 20 2f 2a 20 d0 82 20 74 6f 20 44 20   },  /* .. to D 
d690: 2a 2f 0a 20 20 7b 20 30 78 30 34 30 33 2c 20 20  */.  { 0x0403,  
d6a0: 30 78 34 37 2c 20 30 78 30 30 2c 20 30 78 30 30  0x47, 0x00, 0x00
d6b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 83  , 0x00 },  /* ..
d6c0: 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30   to G */.  { 0x0
d6d0: 34 30 34 2c 20 20 30 78 34 35 2c 20 30 78 30 30  404,  0x45, 0x00
d6e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
d6f0: 20 2f 2a 20 d0 84 20 74 6f 20 45 20 2a 2f 0a 20   /* .. to E */. 
d700: 20 7b 20 30 78 30 34 30 35 2c 20 20 30 78 35 61   { 0x0405,  0x5a
d710: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
d720: 30 30 20 7d 2c 20 20 2f 2a 20 d0 85 20 74 6f 20  00 },  /* .. to 
d730: 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 36 2c  Z */.  { 0x0406,
d740: 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78    0x49, 0x00, 0x
d750: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
d760: d0 86 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
d770: 78 30 34 30 37 2c 20 20 30 78 34 39 2c 20 30 78  x0407,  0x49, 0x
d780: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
d790: 2c 20 20 2f 2a 20 d0 87 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
d7a0: 0a 20 20 7b 20 30 78 30 34 30 38 2c 20 20 30 78  .  { 0x0408,  0x
d7b0: 34 61 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  4a, 0x00, 0x00, 
d7c0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 88 20 74  0x00 },  /* .. t
d7d0: 6f 20 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30  o J */.  { 0x040
d7e0: 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20  9,  0x49, 0x00, 
d7f0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
d800: 2a 20 d0 89 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
d810: 20 30 78 30 34 30 41 2c 20 20 30 78 34 65 2c 20   0x040A,  0x4e, 
d820: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
d830: 20 7d 2c 20 20 2f 2a 20 d0 8a 20 74 6f 20 4e 20   },  /* .. to N 
d840: 2a 2f 0a 20 20 7b 20 30 78 30 34 30 42 2c 20 20  */.  { 0x040B,  
d850: 30 78 34 34 2c 20 30 78 30 30 2c 20 30 78 30 30  0x44, 0x00, 0x00
d860: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8b  , 0x00 },  /* ..
d870: 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30   to D */.  { 0x0
d880: 34 30 43 2c 20 20 30 78 34 62 2c 20 30 78 30 30  40C,  0x4b, 0x00
d890: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
d8a0: 20 2f 2a 20 d0 8c 20 74 6f 20 4b 20 2a 2f 0a 20   /* .. to K */. 
d8b0: 20 7b 20 30 78 30 34 30 44 2c 20 20 30 78 34 39   { 0x040D,  0x49
d8c0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
d8d0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 8d 20 74 6f 20  00 },  /* .. to 
d8e0: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 45 2c  I */.  { 0x040E,
d8f0: 20 20 30 78 35 35 2c 20 30 78 30 30 2c 20 30 78    0x55, 0x00, 0x
d900: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
d910: d0 8e 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30  .. to U */.  { 0
d920: 78 30 34 30 46 2c 20 20 30 78 34 34 2c 20 30 78  x040F,  0x44, 0x
d930: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
d940: 2c 20 20 2f 2a 20 d0 8f 20 74 6f 20 44 20 2a 2f  ,  /* .. to D */
d950: 0a 20 20 7b 20 30 78 30 34 31 30 2c 20 20 30 78  .  { 0x0410,  0x
d960: 34 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  41, 0x00, 0x00, 
d970: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 90 20 74  0x00 },  /* .. t
d980: 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o A */.  { 0x041
d990: 31 2c 20 20 30 78 34 32 2c 20 30 78 30 30 2c 20  1,  0x42, 0x00, 
d9a0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
d9b0: 2a 20 d0 91 20 74 6f 20 42 20 2a 2f 0a 20 20 7b  * .. to B */.  {
d9c0: 20 30 78 30 34 31 32 2c 20 20 30 78 35 36 2c 20   0x0412,  0x56, 
d9d0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
d9e0: 20 7d 2c 20 20 2f 2a 20 d0 92 20 74 6f 20 56 20   },  /* .. to V 
d9f0: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 33 2c 20 20  */.  { 0x0413,  
da00: 30 78 34 37 2c 20 30 78 30 30 2c 20 30 78 30 30  0x47, 0x00, 0x00
da10: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 93  , 0x00 },  /* ..
da20: 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30   to G */.  { 0x0
da30: 34 31 34 2c 20 20 30 78 34 34 2c 20 30 78 30 30  414,  0x44, 0x00
da40: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
da50: 20 2f 2a 20 d0 94 20 74 6f 20 44 20 2a 2f 0a 20   /* .. to D */. 
da60: 20 7b 20 30 78 30 34 31 35 2c 20 20 30 78 34 35   { 0x0415,  0x45
da70: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
da80: 30 30 20 7d 2c 20 20 2f 2a 20 d0 95 20 74 6f 20  00 },  /* .. to 
da90: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 36 2c  E */.  { 0x0416,
daa0: 20 20 30 78 35 61 2c 20 30 78 36 38 2c 20 30 78    0x5a, 0x68, 0x
dab0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
dac0: d0 96 20 74 6f 20 5a 68 20 2a 2f 0a 20 20 7b 20  .. to Zh */.  { 
dad0: 30 78 30 34 31 37 2c 20 20 30 78 35 61 2c 20 30  0x0417,  0x5a, 0
dae0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
daf0: 7d 2c 20 20 2f 2a 20 d0 97 20 74 6f 20 5a 20 2a  },  /* .. to Z *
db00: 2f 0a 20 20 7b 20 30 78 30 34 31 38 2c 20 20 30  /.  { 0x0418,  0
db10: 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x49, 0x00, 0x00,
db20: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 98 20   0x00 },  /* .. 
db30: 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to I */.  { 0x04
db40: 31 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c  19,  0x49, 0x00,
db50: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
db60: 2f 2a 20 d0 99 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
db70: 7b 20 30 78 30 34 31 41 2c 20 20 30 78 34 62 2c  { 0x041A,  0x4b,
db80: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
db90: 30 20 7d 2c 20 20 2f 2a 20 d0 9a 20 74 6f 20 4b  0 },  /* .. to K
dba0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 42 2c 20   */.  { 0x041B, 
dbb0: 20 30 78 34 63 2c 20 30 78 30 30 2c 20 30 78 30   0x4c, 0x00, 0x0
dbc0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
dbd0: 9b 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78  . to L */.  { 0x
dbe0: 30 34 31 43 2c 20 20 30 78 34 64 2c 20 30 78 30  041C,  0x4d, 0x0
dbf0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
dc00: 20 20 2f 2a 20 d0 9c 20 74 6f 20 4d 20 2a 2f 0a    /* .. to M */.
dc10: 20 20 7b 20 30 78 30 34 31 44 2c 20 20 30 78 34    { 0x041D,  0x4
dc20: 65 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  e, 0x00, 0x00, 0
dc30: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9d 20 74 6f  x00 },  /* .. to
dc40: 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 45   N */.  { 0x041E
dc50: 2c 20 20 30 78 34 66 2c 20 30 78 30 30 2c 20 30  ,  0x4f, 0x00, 0
dc60: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
dc70: 20 d0 9e 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
dc80: 30 78 30 34 31 46 2c 20 20 30 78 35 30 2c 20 30  0x041F,  0x50, 0
dc90: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
dca0: 7d 2c 20 20 2f 2a 20 d0 9f 20 74 6f 20 50 20 2a  },  /* .. to P *
dcb0: 2f 0a 20 20 7b 20 30 78 30 34 32 30 2c 20 20 30  /.  { 0x0420,  0
dcc0: 78 35 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x52, 0x00, 0x00,
dcd0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a0 20   0x00 },  /* .. 
dce0: 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to R */.  { 0x04
dcf0: 32 31 2c 20 20 30 78 35 33 2c 20 30 78 30 30 2c  21,  0x53, 0x00,
dd00: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
dd10: 2f 2a 20 d0 a1 20 74 6f 20 53 20 2a 2f 0a 20 20  /* .. to S */.  
dd20: 7b 20 30 78 30 34 32 32 2c 20 20 30 78 35 34 2c  { 0x0422,  0x54,
dd30: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
dd40: 30 20 7d 2c 20 20 2f 2a 20 d0 a2 20 74 6f 20 54  0 },  /* .. to T
dd50: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 33 2c 20   */.  { 0x0423, 
dd60: 20 30 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30   0x55, 0x00, 0x0
dd70: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
dd80: a3 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
dd90: 30 34 32 34 2c 20 20 30 78 34 36 2c 20 30 78 30  0424,  0x46, 0x0
dda0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
ddb0: 20 20 2f 2a 20 d0 a4 20 74 6f 20 46 20 2a 2f 0a    /* .. to F */.
ddc0: 20 20 7b 20 30 78 30 34 32 35 2c 20 20 30 78 34    { 0x0425,  0x4
ddd0: 62 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30  b, 0x68, 0x00, 0
dde0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a5 20 74 6f  x00 },  /* .. to
ddf0: 20 4b 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32   Kh */.  { 0x042
de00: 36 2c 20 20 30 78 35 34 2c 20 30 78 36 33 2c 20  6,  0x54, 0x63, 
de10: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
de20: 2a 20 d0 a6 20 74 6f 20 54 63 20 2a 2f 0a 20 20  * .. to Tc */.  
de30: 7b 20 30 78 30 34 32 37 2c 20 20 30 78 34 33 2c  { 0x0427,  0x43,
de40: 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30   0x68, 0x00, 0x0
de50: 30 20 7d 2c 20 20 2f 2a 20 d0 a7 20 74 6f 20 43  0 },  /* .. to C
de60: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 38 2c  h */.  { 0x0428,
de70: 20 20 30 78 35 33 2c 20 30 78 36 38 2c 20 30 78    0x53, 0x68, 0x
de80: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
de90: d0 a8 20 74 6f 20 53 68 20 2a 2f 0a 20 20 7b 20  .. to Sh */.  { 
dea0: 30 78 30 34 32 39 2c 20 20 30 78 35 33 2c 20 30  0x0429,  0x53, 0
deb0: 78 36 38 2c 20 30 78 36 33 2c 20 30 78 36 38 20  x68, 0x63, 0x68 
dec0: 7d 2c 20 20 2f 2a 20 d0 a9 20 74 6f 20 53 68 63  },  /* .. to Shc
ded0: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 41 2c  h */.  { 0x042A,
dee0: 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78    0x61, 0x00, 0x
def0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
df00: 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30   to A */.  { 0x0
df10: 34 32 42 2c 20 20 30 78 35 39 2c 20 30 78 30 30  42B,  0x59, 0x00
df20: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
df30: 20 2f 2a 20 d0 ab 20 74 6f 20 59 20 2a 2f 0a 20   /* .. to Y */. 
df40: 20 7b 20 30 78 30 34 32 43 2c 20 20 30 78 35 39   { 0x042C,  0x59
df50: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
df60: 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 59 20  00 },  /*  to Y 
df70: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 44 2c 20 20  */.  { 0x042D,  
df80: 30 78 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30  0x45, 0x00, 0x00
df90: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ad  , 0x00 },  /* ..
dfa0: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
dfb0: 34 32 45 2c 20 20 30 78 34 39 2c 20 30 78 37 35  42E,  0x49, 0x75
dfc0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
dfd0: 20 2f 2a 20 d0 ae 20 74 6f 20 49 75 20 2a 2f 0a   /* .. to Iu */.
dfe0: 20 20 7b 20 30 78 30 34 32 46 2c 20 20 30 78 34    { 0x042F,  0x4
dff0: 39 2c 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30  9, 0x61, 0x00, 0
e000: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 af 20 74 6f  x00 },  /* .. to
e010: 20 49 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33   Ia */.  { 0x043
e020: 30 2c 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20  0,  0x61, 0x00, 
e030: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
e040: 2a 20 d0 b0 20 74 6f 20 61 20 2a 2f 0a 20 20 7b  * .. to a */.  {
e050: 20 30 78 30 34 33 31 2c 20 20 30 78 36 32 2c 20   0x0431,  0x62, 
e060: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
e070: 20 7d 2c 20 20 2f 2a 20 d0 b1 20 74 6f 20 62 20   },  /* .. to b 
e080: 2a 2f 0a 20 20 7b 20 30 78 30 34 33 32 2c 20 20  */.  { 0x0432,  
e090: 30 78 37 36 2c 20 30 78 30 30 2c 20 30 78 30 30  0x76, 0x00, 0x00
e0a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b2  , 0x00 },  /* ..
e0b0: 20 74 6f 20 76 20 2a 2f 0a 20 20 7b 20 30 78 30   to v */.  { 0x0
e0c0: 34 33 33 2c 20 20 30 78 36 37 2c 20 30 78 30 30  433,  0x67, 0x00
e0d0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
e0e0: 20 2f 2a 20 d0 b3 20 74 6f 20 67 20 2a 2f 0a 20   /* .. to g */. 
e0f0: 20 7b 20 30 78 30 34 33 34 2c 20 20 30 78 36 34   { 0x0434,  0x64
e100: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
e110: 30 30 20 7d 2c 20 20 2f 2a 20 d0 b4 20 74 6f 20  00 },  /* .. to 
e120: 64 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 35 2c  d */.  { 0x0435,
e130: 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78    0x65, 0x00, 0x
e140: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
e150: d0 b5 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
e160: 78 30 34 33 36 2c 20 20 30 78 37 61 2c 20 30 78  x0436,  0x7a, 0x
e170: 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  68, 0x00, 0x00 }
e180: 2c 20 20 2f 2a 20 d0 b6 20 74 6f 20 7a 68 20 2a  ,  /* .. to zh *
e190: 2f 0a 20 20 7b 20 30 78 30 34 33 37 2c 20 20 30  /.  { 0x0437,  0
e1a0: 78 37 61 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x7a, 0x00, 0x00,
e1b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b7 20   0x00 },  /* .. 
e1c0: 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to z */.  { 0x04
e1d0: 33 38 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c  38,  0x69, 0x00,
e1e0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e1f0: 2f 2a 20 d0 b8 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
e200: 7b 20 30 78 30 34 33 39 2c 20 20 30 78 36 39 2c  { 0x0439,  0x69,
e210: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
e220: 30 20 7d 2c 20 20 2f 2a 20 d0 b9 20 74 6f 20 69  0 },  /* .. to i
e230: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 41 2c 20   */.  { 0x043A, 
e240: 20 30 78 36 62 2c 20 30 78 30 30 2c 20 30 78 30   0x6b, 0x00, 0x0
e250: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
e260: ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78  . to k */.  { 0x
e270: 30 34 33 42 2c 20 20 30 78 36 63 2c 20 30 78 30  043B,  0x6c, 0x0
e280: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
e290: 20 20 2f 2a 20 d0 bb 20 74 6f 20 6c 20 2a 2f 0a    /* .. to l */.
e2a0: 20 20 7b 20 30 78 30 34 33 43 2c 20 20 30 78 36    { 0x043C,  0x6
e2b0: 64 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  d, 0x00, 0x00, 0
e2c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bc 20 74 6f  x00 },  /* .. to
e2d0: 20 6d 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 44   m */.  { 0x043D
e2e0: 2c 20 20 30 78 36 65 2c 20 30 78 30 30 2c 20 30  ,  0x6e, 0x00, 0
e2f0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
e300: 20 d0 bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20   .. to n */.  { 
e310: 30 78 30 34 33 45 2c 20 20 30 78 36 66 2c 20 30  0x043E,  0x6f, 0
e320: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
e330: 7d 2c 20 20 2f 2a 20 d0 be 20 74 6f 20 6f 20 2a  },  /* .. to o *
e340: 2f 0a 20 20 7b 20 30 78 30 34 33 46 2c 20 20 30  /.  { 0x043F,  0
e350: 78 37 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x70, 0x00, 0x00,
e360: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bf 20   0x00 },  /* .. 
e370: 74 6f 20 70 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to p */.  { 0x04
e380: 34 30 2c 20 20 30 78 37 32 2c 20 30 78 30 30 2c  40,  0x72, 0x00,
e390: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e3a0: 2f 2a 20 d1 80 20 74 6f 20 72 20 2a 2f 0a 20 20  /* .. to r */.  
e3b0: 7b 20 30 78 30 34 34 31 2c 20 20 30 78 37 33 2c  { 0x0441,  0x73,
e3c0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
e3d0: 30 20 7d 2c 20 20 2f 2a 20 d1 81 20 74 6f 20 73  0 },  /* .. to s
e3e0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 32 2c 20   */.  { 0x0442, 
e3f0: 20 30 78 37 34 2c 20 30 78 30 30 2c 20 30 78 30   0x74, 0x00, 0x0
e400: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  0, 0x00 },  /* .
e410: 82 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78  . to t */.  { 0x
e420: 30 34 34 33 2c 20 20 30 78 37 35 2c 20 30 78 30  0443,  0x75, 0x0
e430: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
e440: 20 20 2f 2a 20 d1 83 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
e450: 20 20 7b 20 30 78 30 34 34 34 2c 20 20 30 78 36    { 0x0444,  0x6
e460: 36 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  6, 0x00, 0x00, 0
e470: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 84 20 74 6f  x00 },  /* .. to
e480: 20 66 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 35   f */.  { 0x0445
e490: 2c 20 20 30 78 36 62 2c 20 30 78 36 38 2c 20 30  ,  0x6b, 0x68, 0
e4a0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
e4b0: 20 d1 85 20 74 6f 20 6b 68 20 2a 2f 0a 20 20 7b   .. to kh */.  {
e4c0: 20 30 78 30 34 34 36 2c 20 20 30 78 37 34 2c 20   0x0446,  0x74, 
e4d0: 30 78 36 33 2c 20 30 78 30 30 2c 20 30 78 30 30  0x63, 0x00, 0x00
e4e0: 20 7d 2c 20 20 2f 2a 20 d1 86 20 74 6f 20 74 63   },  /* .. to tc
e4f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 37 2c 20   */.  { 0x0447, 
e500: 20 30 78 36 33 2c 20 30 78 36 38 2c 20 30 78 30   0x63, 0x68, 0x0
e510: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  0, 0x00 },  /* .
e520: 87 20 74 6f 20 63 68 20 2a 2f 0a 20 20 7b 20 30  . to ch */.  { 0
e530: 78 30 34 34 38 2c 20 20 30 78 37 33 2c 20 30 78  x0448,  0x73, 0x
e540: 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  68, 0x00, 0x00 }
e550: 2c 20 20 2f 2a 20 d1 88 20 74 6f 20 73 68 20 2a  ,  /* .. to sh *
e560: 2f 0a 20 20 7b 20 30 78 30 34 34 39 2c 20 20 30  /.  { 0x0449,  0
e570: 78 37 33 2c 20 30 78 36 38 2c 20 30 78 36 33 2c  x73, 0x68, 0x63,
e580: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d1 89 20   0x68 },  /* .. 
e590: 74 6f 20 73 68 63 68 20 2a 2f 0a 20 20 7b 20 30  to shch */.  { 0
e5a0: 78 30 34 34 41 2c 20 20 30 78 36 31 2c 20 30 78  x044A,  0x61, 0x
e5b0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
e5c0: 2c 20 20 2f 2a 20 20 74 6f 20 61 20 2a 2f 0a 20  ,  /*  to a */. 
e5d0: 20 7b 20 30 78 30 34 34 42 2c 20 20 30 78 37 39   { 0x044B,  0x79
e5e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
e5f0: 30 30 20 7d 2c 20 20 2f 2a 20 d1 8b 20 74 6f 20  00 },  /* .. to 
e600: 79 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 43 2c  y */.  { 0x044C,
e610: 20 20 30 78 37 39 2c 20 30 78 30 30 2c 20 30 78    0x79, 0x00, 0x
e620: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
e630: 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30   to y */.  { 0x0
e640: 34 34 44 2c 20 20 30 78 36 35 2c 20 30 78 30 30  44D,  0x65, 0x00
e650: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
e660: 20 2f 2a 20 d1 8d 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
e670: 20 7b 20 30 78 30 34 34 45 2c 20 20 30 78 36 39   { 0x044E,  0x69
e680: 2c 20 30 78 37 35 2c 20 30 78 30 30 2c 20 30 78  , 0x75, 0x00, 0x
e690: 30 30 20 7d 2c 20 20 2f 2a 20 d1 8e 20 74 6f 20  00 },  /* .. to 
e6a0: 69 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 46  iu */.  { 0x044F
e6b0: 2c 20 20 30 78 36 39 2c 20 30 78 36 31 2c 20 30  ,  0x69, 0x61, 0
e6c0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
e6d0: 20 d1 8f 20 74 6f 20 69 61 20 2a 2f 0a 20 20 7b   .. to ia */.  {
e6e0: 20 30 78 30 34 35 30 2c 20 20 30 78 36 35 2c 20   0x0450,  0x65, 
e6f0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
e700: 20 7d 2c 20 20 2f 2a 20 d1 90 20 74 6f 20 65 20   },  /* .. to e 
e710: 2a 2f 0a 20 20 7b 20 30 78 30 34 35 31 2c 20 20  */.  { 0x0451,  
e720: 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30  0x65, 0x00, 0x00
e730: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 91  , 0x00 },  /* ..
e740: 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30   to e */.  { 0x0
e750: 34 35 32 2c 20 20 30 78 36 34 2c 20 30 78 30 30  452,  0x64, 0x00
e760: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
e770: 20 2f 2a 20 d1 92 20 74 6f 20 64 20 2a 2f 0a 20   /* .. to d */. 
e780: 20 7b 20 30 78 30 34 35 33 2c 20 20 30 78 36 37   { 0x0453,  0x67
e790: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
e7a0: 30 30 20 7d 2c 20 20 2f 2a 20 d1 93 20 74 6f 20  00 },  /* .. to 
e7b0: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 34 2c  g */.  { 0x0454,
e7c0: 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78    0x65, 0x00, 0x
e7d0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
e7e0: d1 94 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
e7f0: 78 30 34 35 35 2c 20 20 30 78 37 61 2c 20 30 78  x0455,  0x7a, 0x
e800: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
e810: 2c 20 20 2f 2a 20 d1 95 20 74 6f 20 7a 20 2a 2f  ,  /* .. to z */
e820: 0a 20 20 7b 20 30 78 30 34 35 36 2c 20 20 30 78  .  { 0x0456,  0x
e830: 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  69, 0x00, 0x00, 
e840: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 96 20 74  0x00 },  /* .. t
e850: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35  o i */.  { 0x045
e860: 37 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c 20  7,  0x69, 0x00, 
e870: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
e880: 2a 20 d1 97 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
e890: 20 30 78 30 34 35 38 2c 20 20 30 78 36 61 2c 20   0x0458,  0x6a, 
e8a0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
e8b0: 20 7d 2c 20 20 2f 2a 20 d1 98 20 74 6f 20 6a 20   },  /* .. to j 
e8c0: 2a 2f 0a 20 20 7b 20 30 78 30 34 35 39 2c 20 20  */.  { 0x0459,  
e8d0: 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x69, 0x00, 0x00
e8e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 99  , 0x00 },  /* ..
e8f0: 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30   to i */.  { 0x0
e900: 34 35 41 2c 20 20 30 78 36 65 2c 20 30 78 30 30  45A,  0x6e, 0x00
e910: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
e920: 20 2f 2a 20 d1 9a 20 74 6f 20 6e 20 2a 2f 0a 20   /* .. to n */. 
e930: 20 7b 20 30 78 30 34 35 42 2c 20 20 30 78 36 34   { 0x045B,  0x64
e940: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
e950: 30 30 20 7d 2c 20 20 2f 2a 20 d1 9b 20 74 6f 20  00 },  /* .. to 
e960: 64 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 43 2c  d */.  { 0x045C,
e970: 20 20 30 78 36 62 2c 20 30 78 30 30 2c 20 30 78    0x6b, 0x00, 0x
e980: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
e990: d1 9c 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30  .. to k */.  { 0
e9a0: 78 30 34 35 44 2c 20 20 30 78 36 39 2c 20 30 78  x045D,  0x69, 0x
e9b0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
e9c0: 2c 20 20 2f 2a 20 d1 9d 20 74 6f 20 69 20 2a 2f  ,  /* .. to i */
e9d0: 0a 20 20 7b 20 30 78 30 34 35 45 2c 20 20 30 78  .  { 0x045E,  0x
e9e0: 37 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  75, 0x00, 0x00, 
e9f0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9e 20 74  0x00 },  /* .. t
ea00: 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35  o u */.  { 0x045
ea10: 46 2c 20 20 30 78 36 34 2c 20 30 78 30 30 2c 20  F,  0x64, 0x00, 
ea20: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
ea30: 2a 20 d1 9f 20 74 6f 20 64 20 2a 2f 0a 20 20 7b  * .. to d */.  {
ea40: 20 30 78 31 45 30 32 2c 20 20 30 78 34 32 2c 20   0x1E02,  0x42, 
ea50: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
ea60: 20 7d 2c 20 20 2f 2a 20 e1 b8 82 20 74 6f 20 42   },  /* ... to B
ea70: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30 33 2c 20   */.  { 0x1E03, 
ea80: 20 30 78 36 32 2c 20 30 78 30 30 2c 20 30 78 30   0x62, 0x00, 0x0
ea90: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  0, 0x00 },  /* .
eaa0: b8 83 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30  .. to b */.  { 0
eab0: 78 31 45 30 41 2c 20 20 30 78 34 34 2c 20 30 78  x1E0A,  0x44, 0x
eac0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
ead0: 2c 20 20 2f 2a 20 e1 b8 8a 20 74 6f 20 44 20 2a  ,  /* ... to D *
eae0: 2f 0a 20 20 7b 20 30 78 31 45 30 42 2c 20 20 30  /.  { 0x1E0B,  0
eaf0: 78 36 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x64, 0x00, 0x00,
eb00: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 8b   0x00 },  /* ...
eb10: 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 31   to d */.  { 0x1
eb20: 45 31 45 2c 20 20 30 78 34 36 2c 20 30 78 30 30  E1E,  0x46, 0x00
eb30: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
eb40: 20 2f 2a 20 e1 b8 9e 20 74 6f 20 46 20 2a 2f 0a   /* ... to F */.
eb50: 20 20 7b 20 30 78 31 45 31 46 2c 20 20 30 78 36    { 0x1E1F,  0x6
eb60: 36 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  6, 0x00, 0x00, 0
eb70: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 9f 20 74  x00 },  /* ... t
eb80: 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 31 45 34  o f */.  { 0x1E4
eb90: 30 2c 20 20 30 78 34 44 2c 20 30 78 30 30 2c 20  0,  0x4D, 0x00, 
eba0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
ebb0: 2a 20 e1 b9 80 20 74 6f 20 4d 20 2a 2f 0a 20 20  * ... to M */.  
ebc0: 7b 20 30 78 31 45 34 31 2c 20 20 30 78 36 44 2c  { 0x1E41,  0x6D,
ebd0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
ebe0: 30 20 7d 2c 20 20 2f 2a 20 e1 b9 81 20 74 6f 20  0 },  /* ... to 
ebf0: 6d 20 2a 2f 0a 20 20 7b 20 30 78 31 45 35 36 2c  m */.  { 0x1E56,
ec00: 20 20 30 78 35 30 2c 20 30 78 30 30 2c 20 30 78    0x50, 0x00, 0x
ec10: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
ec20: e1 b9 96 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20  ... to P */.  { 
ec30: 30 78 31 45 35 37 2c 20 20 30 78 37 30 2c 20 30  0x1E57,  0x70, 0
ec40: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
ec50: 7d 2c 20 20 2f 2a 20 e1 b9 97 20 74 6f 20 70 20  },  /* ... to p 
ec60: 2a 2f 0a 20 20 7b 20 30 78 31 45 36 30 2c 20 20  */.  { 0x1E60,  
ec70: 30 78 35 33 2c 20 30 78 30 30 2c 20 30 78 30 30  0x53, 0x00, 0x00
ec80: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9  , 0x00 },  /* ..
ec90: a0 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78  . to S */.  { 0x
eca0: 31 45 36 31 2c 20 20 30 78 37 33 2c 20 30 78 30  1E61,  0x73, 0x0
ecb0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
ecc0: 20 20 2f 2a 20 e1 b9 a1 20 74 6f 20 73 20 2a 2f    /* ... to s */
ecd0: 0a 20 20 7b 20 30 78 31 45 36 41 2c 20 20 30 78  .  { 0x1E6A,  0x
ece0: 35 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  54, 0x00, 0x00, 
ecf0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 aa 20  0x00 },  /* ... 
ed00: 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to T */.  { 0x1E
ed10: 36 42 2c 20 20 30 78 37 34 2c 20 30 78 30 30 2c  6B,  0x74, 0x00,
ed20: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
ed30: 2f 2a 20 e1 b9 ab 20 74 6f 20 74 20 2a 2f 0a 20  /* ... to t */. 
ed40: 20 7b 20 30 78 31 45 38 30 2c 20 20 30 78 35 37   { 0x1E80,  0x57
ed50: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
ed60: 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 80 20 74 6f  00 },  /* ... to
ed70: 20 57 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 31   W */.  { 0x1E81
ed80: 2c 20 20 30 78 37 37 2c 20 30 78 30 30 2c 20 30  ,  0x77, 0x00, 0
ed90: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
eda0: 20 e1 ba 81 20 74 6f 20 77 20 2a 2f 0a 20 20 7b   ... to w */.  {
edb0: 20 30 78 31 45 38 32 2c 20 20 30 78 35 37 2c 20   0x1E82,  0x57, 
edc0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
edd0: 20 7d 2c 20 20 2f 2a 20 e1 ba 82 20 74 6f 20 57   },  /* ... to W
ede0: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 33 2c 20   */.  { 0x1E83, 
edf0: 20 30 78 37 37 2c 20 30 78 30 30 2c 20 30 78 30   0x77, 0x00, 0x0
ee00: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  0, 0x00 },  /* .
ee10: ba 83 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30  .. to w */.  { 0
ee20: 78 31 45 38 34 2c 20 20 30 78 35 37 2c 20 30 78  x1E84,  0x57, 0x
ee30: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
ee40: 2c 20 20 2f 2a 20 e1 ba 84 20 74 6f 20 57 20 2a  ,  /* ... to W *
ee50: 2f 0a 20 20 7b 20 30 78 31 45 38 35 2c 20 20 30  /.  { 0x1E85,  0
ee60: 78 37 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x77, 0x00, 0x00,
ee70: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 85   0x00 },  /* ...
ee80: 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31   to w */.  { 0x1
ee90: 45 46 32 2c 20 20 30 78 35 39 2c 20 30 78 30 30  EF2,  0x59, 0x00
eea0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
eeb0: 20 2f 2a 20 e1 bb b2 20 74 6f 20 59 20 2a 2f 0a   /* ... to Y */.
eec0: 20 20 7b 20 30 78 31 45 46 33 2c 20 20 30 78 37    { 0x1EF3,  0x7
eed0: 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  9, 0x00, 0x00, 0
eee0: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 bb b3 20 74  x00 },  /* ... t
eef0: 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30  o y */.  { 0xFB0
ef00: 30 2c 20 20 30 78 36 36 2c 20 30 78 36 36 2c 20  0,  0x66, 0x66, 
ef10: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
ef20: 2a 20 ef ac 80 20 74 6f 20 66 66 20 2a 2f 0a 20  * ... to ff */. 
ef30: 20 7b 20 30 78 46 42 30 31 2c 20 20 30 78 36 36   { 0xFB01,  0x66
ef40: 2c 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78  , 0x69, 0x00, 0x
ef50: 30 30 20 7d 2c 20 20 2f 2a 20 ef ac 81 20 74 6f  00 },  /* ... to
ef60: 20 66 69 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30   fi */.  { 0xFB0
ef70: 32 2c 20 20 30 78 36 36 2c 20 30 78 36 43 2c 20  2,  0x66, 0x6C, 
ef80: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
ef90: 2a 20 ef ac 82 20 74 6f 20 66 6c 20 2a 2f 0a 20  * ... to fl */. 
efa0: 20 7b 20 30 78 46 42 30 35 2c 20 20 30 78 37 33   { 0xFB05,  0x73
efb0: 2c 20 30 78 37 34 2c 20 30 78 30 30 2c 20 30 78  , 0x74, 0x00, 0x
efc0: 30 30 20 7d 2c 20 20 2f 2a 20 ef ac 85 20 74 6f  00 },  /* ... to
efd0: 20 73 74 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30   st */.  { 0xFB0
efe0: 36 2c 20 20 30 78 37 33 2c 20 30 78 37 34 2c 20  6,  0x73, 0x74, 
eff0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
f000: 2a 20 ef ac 86 20 74 6f 20 73 74 20 2a 2f 0a 7d  * ... to st */.}
f010: 3b 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  ;..static const 
f020: 54 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20  Transliteration 
f030: 2a 73 70 65 6c 6c 66 69 78 46 69 6e 64 54 72 61  *spellfixFindTra
f040: 6e 73 6c 69 74 28 69 6e 74 20 63 2c 20 69 6e 74  nslit(int c, int
f050: 20 2a 70 78 54 6f 70 29 7b 0a 20 20 2a 70 78 54   *pxTop){.  *pxT
f060: 6f 70 20 3d 20 28 73 69 7a 65 6f 66 28 74 72 61  op = (sizeof(tra
f070: 6e 73 6c 69 74 29 2f 73 69 7a 65 6f 66 28 74 72  nslit)/sizeof(tr
f080: 61 6e 73 6c 69 74 5b 30 5d 29 29 20 2d 20 31 3b  anslit[0])) - 1;
f090: 0a 20 20 72 65 74 75 72 6e 20 74 72 61 6e 73 6c  .  return transl
f0a0: 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  it;.}../*.** Con
f0b0: 76 65 72 74 20 74 68 65 20 69 6e 70 75 74 20 73  vert the input s
f0c0: 74 72 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38  tring from UTF-8
f0d0: 20 69 6e 74 6f 20 70 75 72 65 20 41 53 43 49 49   into pure ASCII
f0e0: 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 2a   by converting.*
f0f0: 2a 20 61 6c 6c 20 6e 6f 6e 2d 41 53 43 49 49 20  * all non-ASCII 
f100: 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 73 6f  characters to so
f110: 6d 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  me combination o
f120: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
f130: 74 68 65 0a 2a 2a 20 41 53 43 49 49 20 73 75 62  the.** ASCII sub
f140: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  set..**.** The r
f150: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 6d  eturned string m
f160: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 6d 6f 72  ight contain mor
f170: 65 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  e characters tha
f180: 6e 20 74 68 65 20 69 6e 70 75 74 2e 0a 2a 2a 0a  n the input..**.
f190: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
f1a0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
f1b0: 72 69 6e 67 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ring comes from 
f1c0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
f1d0: 20 61 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64 20 62   and.** should b
f1e0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
f1f0: 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
f200: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f210: 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 63 6f  transliterate(co
f220: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f230: 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29  r *zIn, int nIn)
f240: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
f250: 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
f260: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2a  3_malloc64( nIn*
f270: 34 20 2b 20 31 20 29 3b 0a 20 20 69 6e 74 20 63  4 + 1 );.  int c
f280: 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69 66  , sz, nOut;.  if
f290: 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75  ( zOut==0 ) retu
f2a0: 72 6e 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20 30  rn 0;.  nOut = 0
f2b0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30  ;.  while( nIn>0
f2c0: 20 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66 38   ){.    c = utf8
f2d0: 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20 26  Read(zIn, nIn, &
f2e0: 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20  sz);.    zIn += 
f2f0: 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20 73  sz;.    nIn -= s
f300: 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c 3d 31 32  z;.    if( c<=12
f310: 37 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b  7 ){.      zOut[
f320: 6e 4f 75 74 2b 2b 5d 20 3d 20 28 75 6e 73 69 67  nOut++] = (unsig
f330: 6e 65 64 20 63 68 61 72 29 63 3b 0a 20 20 20 20  ned char)c;.    
f340: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
f350: 20 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a   xTop, xBtm, x;.
f360: 20 20 20 20 20 20 63 6f 6e 73 74 20 54 72 61 6e        const Tran
f370: 73 6c 69 74 65 72 61 74 69 6f 6e 20 2a 74 62 6c  sliteration *tbl
f380: 20 3d 20 73 70 65 6c 6c 66 69 78 46 69 6e 64 54   = spellfixFindT
f390: 72 61 6e 73 6c 69 74 28 63 2c 20 26 78 54 6f 70  ranslit(c, &xTop
f3a0: 29 3b 0a 20 20 20 20 20 20 78 42 74 6d 20 3d 20  );.      xBtm = 
f3b0: 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
f3c0: 78 54 6f 70 3e 3d 78 42 74 6d 20 29 7b 0a 20 20  xTop>=xBtm ){.  
f3d0: 20 20 20 20 20 20 78 20 3d 20 28 78 54 6f 70 20        x = (xTop 
f3e0: 2b 20 78 42 74 6d 29 2f 32 3b 0a 20 20 20 20 20  + xBtm)/2;.     
f3f0: 20 20 20 69 66 28 20 74 62 6c 5b 78 5d 2e 63 46     if( tbl[x].cF
f400: 72 6f 6d 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20  rom==c ){.      
f410: 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d      zOut[nOut++]
f420: 20 3d 20 74 62 6c 5b 78 5d 2e 63 54 6f 30 3b 0a   = tbl[x].cTo0;.
f430: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74 62            if( tb
f440: 6c 5b 78 5d 2e 63 54 6f 31 20 29 7b 0a 20 20 20  l[x].cTo1 ){.   
f450: 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f           zOut[nO
f460: 75 74 2b 2b 5d 20 3d 20 74 62 6c 5b 78 5d 2e 63  ut++] = tbl[x].c
f470: 54 6f 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  To1;.           
f480: 20 69 66 28 20 74 62 6c 5b 78 5d 2e 63 54 6f 32   if( tbl[x].cTo2
f490: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f4a0: 20 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d    zOut[nOut++] =
f4b0: 20 74 62 6c 5b 78 5d 2e 63 54 6f 32 3b 0a 20 20   tbl[x].cTo2;.  
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
f4d0: 74 62 6c 5b 78 5d 2e 63 54 6f 33 20 29 7b 0a 20  tbl[x].cTo3 ){. 
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
f4f0: 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 62  Out[nOut++] = tb
f500: 6c 5b 78 5d 2e 63 54 6f 33 3b 0a 20 20 20 20 20  l[x].cTo3;.     
f510: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f530: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
f540: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f550: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f560: 65 6c 73 65 20 69 66 28 20 74 62 6c 5b 78 5d 2e  else if( tbl[x].
f570: 63 46 72 6f 6d 3e 63 20 29 7b 0a 20 20 20 20 20  cFrom>c ){.     
f580: 20 20 20 20 20 78 54 6f 70 20 3d 20 78 2d 31 3b       xTop = x-1;
f590: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f5a0: 20 20 20 20 20 20 20 20 20 20 78 42 74 6d 20 3d            xBtm =
f5b0: 20 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   x+1;.        }.
f5c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f5d0: 28 20 63 20 29 20 7a 4f 75 74 5b 6e 4f 75 74 2b  ( c ) zOut[nOut+
f5e0: 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
f5f0: 20 20 7d 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 5d    }.  zOut[nOut]
f600: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
f610: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
f620: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
f630: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
f640: 20 74 68 65 20 73 68 6f 72 74 65 73 74 20 70 72   the shortest pr
f650: 65 66 69 78 20 6f 66 20 74 68 65 20 69 6e 70 75  efix of the inpu
f660: 74 0a 2a 2a 20 73 74 72 69 6e 67 20 74 68 61 74  t.** string that
f670: 20 74 72 61 6e 73 6c 69 74 65 72 61 74 65 73 20   transliterates 
f680: 74 6f 20 61 6e 20 41 53 43 49 49 20 73 74 72 69  to an ASCII stri
f690: 6e 67 20 6e 54 72 61 6e 73 20 62 79 74 65 73 20  ng nTrans bytes 
f6a0: 6f 72 20 6c 6f 6e 67 65 72 2e 0a 2a 2a 20 4f 72  or longer..** Or
f6b0: 2c 20 69 66 20 74 68 65 20 74 72 61 6e 73 6c 69  , if the transli
f6c0: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
f6d0: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 69 73 20  input string is 
f6e0: 6c 65 73 73 20 74 68 61 6e 20 6e 54 72 61 6e 73  less than nTrans
f6f0: 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
f700: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75  e, return the nu
f710: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
f720: 72 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  rs in the input 
f730: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
f740: 63 20 69 6e 74 20 74 72 61 6e 73 6c 65 6e 5f 74  c int translen_t
f750: 6f 5f 63 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20  o_charlen(const 
f760: 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e  char *zIn, int n
f770: 49 6e 2c 20 69 6e 74 20 6e 54 72 61 6e 73 29 7b  In, int nTrans){
f780: 0a 20 20 69 6e 74 20 69 2c 20 63 2c 20 73 7a 2c  .  int i, c, sz,
f790: 20 6e 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 43 68   nOut;.  int nCh
f7a0: 61 72 3b 0a 0a 20 20 69 20 3d 20 6e 4f 75 74 20  ar;..  i = nOut 
f7b0: 3d 20 30 3b 0a 20 20 66 6f 72 28 6e 43 68 61 72  = 0;.  for(nChar
f7c0: 3d 30 3b 20 69 3c 6e 49 6e 20 26 26 20 6e 4f 75  =0; i<nIn && nOu
f7d0: 74 3c 6e 54 72 61 6e 73 3b 20 6e 43 68 61 72 2b  t<nTrans; nChar+
f7e0: 2b 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66 38  +){.    c = utf8
f7f0: 52 65 61 64 28 28 63 6f 6e 73 74 20 75 6e 73 69  Read((const unsi
f800: 67 6e 65 64 20 63 68 61 72 20 2a 29 26 7a 49 6e  gned char *)&zIn
f810: 5b 69 5d 2c 20 6e 49 6e 2d 69 2c 20 26 73 7a 29  [i], nIn-i, &sz)
f820: 3b 0a 20 20 20 20 69 20 2b 3d 20 73 7a 3b 0a 0a  ;.    i += sz;..
f830: 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20      nOut++;.    
f840: 69 66 28 20 63 3e 3d 31 32 38 20 29 7b 0a 20 20  if( c>=128 ){.  
f850: 20 20 20 20 69 6e 74 20 78 54 6f 70 2c 20 78 42      int xTop, xB
f860: 74 6d 2c 20 78 3b 0a 20 20 20 20 20 20 63 6f 6e  tm, x;.      con
f870: 73 74 20 54 72 61 6e 73 6c 69 74 65 72 61 74 69  st Transliterati
f880: 6f 6e 20 2a 74 62 6c 20 3d 20 73 70 65 6c 6c 66  on *tbl = spellf
f890: 69 78 46 69 6e 64 54 72 61 6e 73 6c 69 74 28 63  ixFindTranslit(c
f8a0: 2c 20 26 78 54 6f 70 29 3b 0a 20 20 20 20 20 20  , &xTop);.      
f8b0: 78 42 74 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  xBtm = 0;.      
f8c0: 77 68 69 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74  while( xTop>=xBt
f8d0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d  m ){.        x =
f8e0: 20 28 78 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32   (xTop + xBtm)/2
f8f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 62  ;.        if( tb
f900: 6c 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20 29 7b  l[x].cFrom==c ){
f910: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74  .          if( t
f920: 62 6c 5b 78 5d 2e 63 54 6f 31 20 29 7b 0a 20 20  bl[x].cTo1 ){.  
f930: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 2b 2b            nOut++
f940: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f950: 28 20 74 62 6c 5b 78 5d 2e 63 54 6f 32 20 29 7b  ( tbl[x].cTo2 ){
f960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
f970: 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Out++;.         
f980: 20 20 20 20 20 69 66 28 20 74 62 6c 5b 78 5d 2e       if( tbl[x].
f990: 63 54 6f 33 20 29 7b 0a 20 20 20 20 20 20 20 20  cTo3 ){.        
f9a0: 20 20 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a          nOut++;.
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
f9d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f9e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f9f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 62 6c     }else if( tbl
fa00: 5b 78 5d 2e 63 46 72 6f 6d 3e 63 20 29 7b 0a 20  [x].cFrom>c ){. 
fa10: 20 20 20 20 20 20 20 20 20 78 54 6f 70 20 3d 20           xTop = 
fa20: 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
fa30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 78 42  se{.          xB
fa40: 74 6d 20 3d 20 78 2b 31 3b 0a 20 20 20 20 20 20  tm = x+1;.      
fa50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fa60: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
fa70: 6e 43 68 61 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  nChar;.}.../*.**
fa80: 20 20 20 20 73 70 65 6c 6c 66 69 78 31 5f 74 72      spellfix1_tr
fa90: 61 6e 73 6c 69 74 28 58 29 0a 2a 2a 0a 2a 2a 20  anslit(X).**.** 
faa0: 43 6f 6e 76 65 72 74 20 61 20 73 74 72 69 6e 67  Convert a string
fab0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e   that contains n
fac0: 6f 6e 2d 41 53 43 49 49 20 52 6f 6d 61 6e 20 63  on-ASCII Roman c
fad0: 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f 20 0a  haracters into .
fae0: 2a 2a 20 70 75 72 65 20 41 53 43 49 49 2e 0a 2a  ** pure ASCII..*
faf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72  /.static void tr
fb00: 61 6e 73 6c 69 74 65 72 61 74 65 53 71 6c 46 75  ansliterateSqlFu
fb10: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
fb20: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
fb30: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
fb40: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
fb50: 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  gv.){.  const un
fb60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e  signed char *zIn
fb70: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
fb80: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
fb90: 20 20 69 6e 74 20 6e 49 6e 20 3d 20 73 71 6c 69    int nIn = sqli
fba0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
fbb0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 75 6e 73 69  argv[0]);.  unsi
fbc0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 4f 75 74 20  gned char *zOut 
fbd0: 3d 20 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28  = transliterate(
fbe0: 7a 49 6e 2c 20 6e 49 6e 29 3b 0a 20 20 69 66 28  zIn, nIn);.  if(
fbf0: 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20   zOut==0 ){.    
fc00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
fc10: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
fc20: 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  xt);.  }else{.  
fc30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
fc40: 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28  _text(context, (
fc50: 63 68 61 72 2a 29 7a 4f 75 74 2c 20 2d 31 2c 20  char*)zOut, -1, 
fc60: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
fc70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73   }.}../*.**    s
fc80: 70 65 6c 6c 66 69 78 31 5f 73 63 72 69 70 74 63  pellfix1_scriptc
fc90: 6f 64 65 28 58 29 0a 2a 2a 0a 2a 2a 20 54 72 79  ode(X).**.** Try
fca0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
fcb0: 65 20 64 6f 6d 69 6e 61 6e 74 20 73 63 72 69 70  e dominant scrip
fcc0: 74 20 75 73 65 64 20 62 79 20 74 68 65 20 77 6f  t used by the wo
fcd0: 72 64 20 58 20 61 6e 64 20 72 65 74 75 72 6e 0a  rd X and return.
fce0: 2a 2a 20 69 74 73 20 49 53 4f 20 31 35 39 32 34  ** its ISO 15924
fcf0: 20 6e 75 6d 65 72 69 63 20 63 6f 64 65 2e 0a 2a   numeric code..*
fd00: 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74  *.** The current
fd10: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
fd20: 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e 64 73  only understands
fd30: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
fd40: 63 72 69 70 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  cripts:.**.**   
fd50: 20 32 31 35 20 20 28 4c 61 74 69 6e 29 0a 2a 2a   215  (Latin).**
fd60: 20 20 20 20 32 32 30 20 20 28 43 79 72 69 6c 6c      220  (Cyrill
fd70: 69 63 29 0a 2a 2a 20 20 20 20 32 30 30 20 20 28  ic).**    200  (
fd80: 47 72 65 65 6b 29 0a 2a 2a 0a 2a 2a 20 54 68 69  Greek).**.** Thi
fd90: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
fda0: 65 74 75 72 6e 20 39 39 38 20 69 66 20 74 68 65  eturn 998 if the
fdb0: 20 69 6e 70 75 74 20 58 20 63 6f 6e 74 61 69 6e   input X contain
fdc0: 73 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f  s characters fro
fdd0: 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
fde0: 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 73 63   of the above sc
fdf0: 72 69 70 74 73 20 6f 72 20 39 39 39 20 69 66 20  ripts or 999 if 
fe00: 58 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 68  X contains no ch
fe10: 61 72 61 63 74 65 72 73 0a 2a 2a 20 66 72 6f 6d  aracters.** from
fe20: 20 61 6e 79 20 6f 66 20 74 68 65 20 61 62 6f 76   any of the abov
fe30: 65 20 73 63 72 69 70 74 73 2e 0a 2a 2f 0a 73 74  e scripts..*/.st
fe40: 61 74 69 63 20 76 6f 69 64 20 73 63 72 69 70 74  atic void script
fe50: 43 6f 64 65 53 71 6c 46 75 6e 63 28 0a 20 20 73  CodeSqlFunc(.  s
fe60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
fe70: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
fe80: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
fe90: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
fea0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
feb0: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 73 71 6c 69  char *zIn = sqli
fec0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
fed0: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  rgv[0]);.  int n
fee0: 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
fef0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
ff00: 29 3b 0a 20 20 69 6e 74 20 63 2c 20 73 7a 3b 0a  );.  int c, sz;.
ff10: 20 20 69 6e 74 20 73 63 72 69 70 74 4d 61 73 6b    int scriptMask
ff20: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 73 3b   = 0;.  int res;
ff30: 0a 20 20 69 6e 74 20 73 65 65 6e 44 69 67 69 74  .  int seenDigit
ff40: 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20 53   = 0;.# define S
ff50: 43 52 49 50 54 5f 4c 41 54 49 4e 20 20 20 20 20  CRIPT_LATIN     
ff60: 20 20 30 78 30 30 30 31 0a 23 20 64 65 66 69 6e    0x0001.# defin
ff70: 65 20 53 43 52 49 50 54 5f 43 59 52 49 4c 4c 49  e SCRIPT_CYRILLI
ff80: 43 20 20 20 20 30 78 30 30 30 32 0a 23 20 64 65  C    0x0002.# de
ff90: 66 69 6e 65 20 53 43 52 49 50 54 5f 47 52 45 45  fine SCRIPT_GREE
ffa0: 4b 20 20 20 20 20 20 20 30 78 30 30 30 34 0a 23  K       0x0004.#
ffb0: 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f 48   define SCRIPT_H
ffc0: 45 42 52 45 57 20 20 20 20 20 20 30 78 30 30 30  EBREW      0x000
ffd0: 38 0a 23 20 64 65 66 69 6e 65 20 53 43 52 49 50  8.# define SCRIP
ffe0: 54 5f 41 52 41 42 49 43 20 20 20 20 20 20 30 78  T_ARABIC      0x
fff0: 30 30 31 30 0a 0a 20 20 77 68 69 6c 65 28 20 6e  0010..  while( n
10000 49 6e 3e 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  In>0 ){.    c = 
10010 75 74 66 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49  utf8Read(zIn, nI
10020 6e 2c 20 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e  n, &sz);.    zIn
10030 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20   += sz;.    nIn 
10040 2d 3d 20 73 7a 3b 0a 20 20 20 20 69 66 28 20 63  -= sz;.    if( c
10050 3c 30 78 30 32 61 66 20 29 7b 0a 20 20 20 20 20  <0x02af ){.     
10060 20 69 66 28 20 63 3e 3d 30 78 38 30 20 7c 7c 20   if( c>=0x80 || 
10070 6d 69 64 43 6c 61 73 73 5b 63 26 30 78 37 66 5d  midClass[c&0x7f]
10080 3c 43 43 4c 41 53 53 5f 44 49 47 49 54 20 29 7b  <CCLASS_DIGIT ){
10090 0a 20 20 20 20 20 20 20 20 73 63 72 69 70 74 4d  .        scriptM
100a0 61 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 4c 41  ask |= SCRIPT_LA
100b0 54 49 4e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TIN;.      }else
100c0 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
100d0 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20 20  <='9' ){.       
100e0 20 73 65 65 6e 44 69 67 69 74 20 3d 20 31 3b 0a   seenDigit = 1;.
100f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10100 65 20 69 66 28 20 63 3e 3d 30 78 30 34 30 30 20  e if( c>=0x0400 
10110 26 26 20 63 3c 3d 30 78 30 34 66 66 20 29 7b 0a  && c<=0x04ff ){.
10120 20 20 20 20 20 20 73 63 72 69 70 74 4d 61 73 6b        scriptMask
10130 20 7c 3d 20 53 43 52 49 50 54 5f 43 59 52 49 4c   |= SCRIPT_CYRIL
10140 4c 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  LIC;.    }else i
10150 66 28 20 63 3e 3d 30 78 30 33 38 36 20 26 26 20  f( c>=0x0386 && 
10160 63 3c 3d 30 78 30 33 63 65 20 29 7b 0a 20 20 20  c<=0x03ce ){.   
10170 20 20 20 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d     scriptMask |=
10180 20 53 43 52 49 50 54 5f 47 52 45 45 4b 3b 0a 20   SCRIPT_GREEK;. 
10190 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d     }else if( c>=
101a0 30 78 30 35 39 30 20 26 26 20 63 3c 3d 30 78 30  0x0590 && c<=0x0
101b0 35 66 66 20 29 7b 0a 20 20 20 20 20 20 73 63 72  5ff ){.      scr
101c0 69 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52 49 50  iptMask |= SCRIP
101d0 54 5f 48 45 42 52 45 57 3b 0a 20 20 20 20 7d 65  T_HEBREW;.    }e
101e0 6c 73 65 20 69 66 28 20 63 3e 3d 30 78 30 36 30  lse if( c>=0x060
101f0 30 20 26 26 20 63 3c 3d 30 78 30 36 66 66 20 29  0 && c<=0x06ff )
10200 7b 0a 20 20 20 20 20 20 73 63 72 69 70 74 4d 61  {.      scriptMa
10210 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 41 52 41  sk |= SCRIPT_ARA
10220 42 49 43 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  BIC;.    }.  }. 
10230 20 69 66 28 20 73 63 72 69 70 74 4d 61 73 6b 3d   if( scriptMask=
10240 3d 30 20 26 26 20 73 65 65 6e 44 69 67 69 74 20  =0 && seenDigit 
10250 29 20 73 63 72 69 70 74 4d 61 73 6b 20 3d 20 53  ) scriptMask = S
10260 43 52 49 50 54 5f 4c 41 54 49 4e 3b 0a 20 20 73  CRIPT_LATIN;.  s
10270 77 69 74 63 68 28 20 73 63 72 69 70 74 4d 61 73  witch( scriptMas
10280 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  k ){.    case 0:
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 72 65 73 20 3d 20 39 39 39 3b 20 62 72 65 61 6b  res = 999; break
102b0 3b 0a 20 20 20 20 63 61 73 65 20 53 43 52 49 50  ;.    case SCRIP
102c0 54 5f 4c 41 54 49 4e 3a 20 20 20 20 20 72 65 73  T_LATIN:     res
102d0 20 3d 20 32 31 35 3b 20 62 72 65 61 6b 3b 0a 20   = 215; break;. 
102e0 20 20 20 63 61 73 65 20 53 43 52 49 50 54 5f 43     case SCRIPT_C
102f0 59 52 49 4c 4c 49 43 3a 20 20 72 65 73 20 3d 20  YRILLIC:  res = 
10300 32 32 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  220; break;.    
10310 63 61 73 65 20 53 43 52 49 50 54 5f 47 52 45 45  case SCRIPT_GREE
10320 4b 3a 20 20 20 20 20 72 65 73 20 3d 20 32 30 30  K:     res = 200
10330 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
10340 65 20 53 43 52 49 50 54 5f 48 45 42 52 45 57 3a  e SCRIPT_HEBREW:
10350 20 20 20 20 72 65 73 20 3d 20 31 32 35 3b 20 62      res = 125; b
10360 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
10370 43 52 49 50 54 5f 41 52 41 42 49 43 3a 20 20 20  CRIPT_ARABIC:   
10380 20 72 65 73 20 3d 20 31 36 30 3b 20 62 72 65 61   res = 160; brea
10390 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
103b0 73 20 3d 20 39 39 38 3b 20 62 72 65 61 6b 3b 0a  s = 998; break;.
103c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
103d0 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
103e0 2c 20 72 65 73 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e  , res);.}../* En
103f0 64 20 74 72 61 6e 73 6c 69 74 65 72 61 74 65 0a  d transliterate.
10400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
104a0 20 42 65 67 69 6e 20 73 70 65 6c 6c 66 69 78 31   Begin spellfix1
104b0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
104c0 2a 2f 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c  */../* Maximum l
104d0 65 6e 67 74 68 20 6f 66 20 61 20 70 68 6f 6e 65  ength of a phone
104e0 68 61 73 68 20 75 73 65 64 20 66 6f 72 20 71 75  hash used for qu
104f0 65 72 79 69 6e 67 20 74 68 65 20 73 68 61 64 6f  erying the shado
10500 77 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  w table */.#defi
10510 6e 65 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48  ne SPELLFIX_MX_H
10520 41 53 48 20 20 33 32 0a 0a 2f 2a 20 4d 61 78 69  ASH  32../* Maxi
10530 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 68 61  mum number of ha
10540 73 68 20 73 74 72 69 6e 67 73 20 74 6f 20 65 78  sh strings to ex
10550 61 6d 69 6e 65 20 70 65 72 20 71 75 65 72 79 20  amine per query 
10560 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c  */.#define SPELL
10570 46 49 58 5f 4d 58 5f 52 55 4e 20 20 20 31 0a 0a  FIX_MX_RUN   1..
10580 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
10590 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 73 70  pellfix1_vtab sp
105a0 65 6c 6c 66 69 78 31 5f 76 74 61 62 3b 0a 74 79  ellfix1_vtab;.ty
105b0 70 65 64 65 66 20 73 74 72 75 63 74 20 73 70 65  pedef struct spe
105c0 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 73 70  llfix1_cursor sp
105d0 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 3b 0a  ellfix1_cursor;.
105e0 0a 2f 2a 20 46 75 7a 7a 79 2d 73 65 61 72 63 68  ./* Fuzzy-search
105f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6f   virtual table o
10600 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75 63 74 20  bject */.struct 
10610 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 7b  spellfix1_vtab {
10620 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
10630 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  base;         /*
10640 20 42 61 73 65 20 63 6c 61 73 73 20 2d 20 6d 75   Base class - mu
10650 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20  st be first */. 
10660 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
10670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
10680 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10690 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  on */.  char *zD
106a0 62 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  bName;          
106b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61     /* Name of da
106c0 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
106d0 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  his table */.  c
106e0 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 3b  har *zTableName;
106f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
10700 65 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  e of the virtual
10710 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72   table */.  char
10720 20 2a 7a 43 6f 73 74 54 61 62 6c 65 3b 20 20 20   *zCostTable;   
10730 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
10740 68 6f 6c 64 69 6e 67 20 65 64 69 74 2d 64 69 73  holding edit-dis
10750 74 61 6e 63 65 20 63 6f 73 74 20 6e 75 6d 62 65  tance cost numbe
10760 72 73 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74  rs */.  EditDist
10770 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  3Config *pConfig
10780 33 3b 20 2f 2a 20 50 61 72 73 65 64 20 65 64 69  3; /* Parsed edi
10790 74 20 64 69 73 74 61 6e 63 65 20 63 6f 73 74 73  t distance costs
107a0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 75 7a 7a 79   */.};../* Fuzzy
107b0 2d 73 65 61 72 63 68 20 63 75 72 73 6f 72 20 6f  -search cursor o
107c0 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75 63 74 20  bject */.struct 
107d0 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
107e0 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
107f0 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20 20  b_cursor base;  
10800 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20    /* Base class 
10810 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20  - must be first 
10820 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76  */.  spellfix1_v
10830 74 61 62 20 2a 70 56 54 61 62 3b 20 20 20 20 20  tab *pVTab;     
10840 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
10850 6f 20 77 68 69 63 68 20 74 68 69 73 20 63 75 72  o which this cur
10860 73 6f 72 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  sor belongs */. 
10870 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b   char *zPattern;
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10890 20 72 68 73 20 6f 66 20 4d 41 54 43 48 20 63 6c   rhs of MATCH cl
108a0 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ause */.  int id
108b0 78 4e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  xNum;           
108c0 20 20 20 20 20 20 20 2f 2a 20 69 64 78 4e 75 6d         /* idxNum
108d0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   value passed to
108e0 20 78 46 69 6c 74 65 72 28 29 20 2a 2f 0a 20 20   xFilter() */.  
108f0 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  int nRow;       
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10910 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  Number of rows o
10920 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  f content */.  i
10930 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  nt nAlloc;      
10940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10950 75 6d 62 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74  umber of allocat
10960 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  ed rows */.  int
10970 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   iRow;          
10980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
10990 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 6f 6e 74  rent row of cont
109a0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61  ent */.  int iLa
109b0 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ng;             
109c0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
109d0 66 20 74 68 65 20 6c 61 6e 67 69 64 3d 20 63 6f  f the langid= co
109e0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e  nstraint */.  in
109f0 74 20 69 54 6f 70 3b 20 20 20 20 20 20 20 20 20  t iTop;         
10a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
10a10 6c 75 65 20 6f 66 20 74 68 65 20 74 6f 70 3d 20  lue of the top= 
10a20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
10a30 69 6e 74 20 69 53 63 6f 70 65 3b 20 20 20 20 20  int iScope;     
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a50 56 61 6c 75 65 20 6f 66 20 74 68 65 20 73 63 6f  Value of the sco
10a60 70 65 3d 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  pe= constraint *
10a70 2f 0a 20 20 69 6e 74 20 6e 53 65 61 72 63 68 3b  /.  int nSearch;
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 6f   /* Number of vo
10aa0 63 61 62 75 6c 61 72 79 20 69 74 65 6d 73 20 63  cabulary items c
10ab0 68 65 63 6b 65 64 20 2a 2f 0a 20 20 73 71 6c 69  hecked */.  sqli
10ac0 74 65 33 5f 73 74 6d 74 20 2a 70 46 75 6c 6c 53  te3_stmt *pFullS
10ad0 63 61 6e 3b 20 20 20 20 20 2f 2a 20 53 68 61 64  can;     /* Shad
10ae0 6f 77 20 71 75 65 72 79 20 66 6f 72 20 61 20 66  ow query for a f
10af0 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a  ull table scan *
10b00 2f 0a 20 20 73 74 72 75 63 74 20 73 70 65 6c 6c  /.  struct spell
10b10 66 69 78 31 5f 72 6f 77 20 7b 20 20 20 20 20 20  fix1_row {      
10b20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 72 6f 77   /* For each row
10b30 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20   of content */. 
10b40 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
10b50 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
10b60 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68   /* Rowid for th
10b70 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 63 68  is row */.    ch
10b80 61 72 20 2a 7a 57 6f 72 64 3b 20 20 20 20 20 20  ar *zWord;      
10b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10ba0 65 78 74 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ext for this row
10bb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 61 6e   */.    int iRan
10bc0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
10bd0 20 20 20 20 20 20 2f 2a 20 52 61 6e 6b 20 66 6f        /* Rank fo
10be0 72 20 74 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20  r this row */.  
10bf0 20 20 69 6e 74 20 69 44 69 73 74 61 6e 63 65 3b    int iDistance;
10c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c10 2f 2a 20 44 69 73 74 61 6e 63 65 20 66 72 6f 6d  /* Distance from
10c20 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74 68 69   pattern for thi
10c30 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
10c40 20 69 53 63 6f 72 65 3b 20 20 20 20 20 20 20 20   iScore;        
10c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
10c60 6f 72 65 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  ore for sorting 
10c70 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4d 61 74 63  */.    int iMatc
10c80 68 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  hlen;           
10c90 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
10ca0 20 6d 61 74 63 68 6c 65 6e 20 63 6f 6c 75 6d 6e   matchlen column
10cb0 20 28 6f 72 20 2d 31 29 20 2a 2f 0a 20 20 20 20   (or -1) */.    
10cc0 63 68 61 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c  char zHash[SPELL
10cd0 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 2f 2a  FIX_MX_HASH]; /*
10ce0 20 74 68 65 20 70 68 6f 6e 65 68 61 73 68 20 75   the phonehash u
10cf0 73 65 64 20 66 6f 72 20 74 68 69 73 20 6d 61 74  sed for this mat
10d00 63 68 20 2a 2f 0a 20 20 7d 20 2a 61 3b 20 0a 7d  ch */.  } *a; .}
10d10 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  ;../*.** Constru
10d20 63 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 53  ct one or more S
10d30 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 66 72  QL statements fr
10d40 6f 6d 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74  om the format st
10d50 72 69 6e 67 20 67 69 76 65 6e 0a 2a 2a 20 61 6e  ring given.** an
10d60 64 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20  d then evaluate 
10d70 74 68 6f 73 65 20 73 74 61 74 65 6d 65 6e 74 73  those statements
10d80 2e 20 54 68 65 20 73 75 63 63 65 73 73 20 63 6f  . The success co
10d90 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
10da0 20 69 6e 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a 2a   into *pRc..**.*
10db0 2a 20 49 66 20 2a 70 52 63 20 69 73 20 69 6e 69  * If *pRc is ini
10dc0 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
10dd0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
10de0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
10df0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 70 65  .static void spe
10e00 6c 6c 66 69 78 31 44 62 45 78 65 63 28 0a 20 20  llfix1DbExec(.  
10e10 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
10e20 20 20 20 20 20 20 20 2f 2a 20 53 75 63 63 65 73         /* Succes
10e30 73 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  s code */.  sqli
10e40 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
10e50 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
10e60 6e 20 77 68 69 63 68 20 74 6f 20 72 75 6e 20 53  n which to run S
10e70 51 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  QL */.  const ch
10e80 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 2f  ar *zFormat,   /
10e90 2a 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67 20  * Format string 
10ea0 66 6f 72 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e  for SQL */.  ...
10eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ec0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
10ed0 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73   to the format s
10ee0 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61  tring */.){.  va
10ef0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
10f00 20 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 2a 70   *zSql;.  if( *p
10f10 52 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  Rc ) return;.  v
10f20 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
10f30 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  mat);.  zSql = s
10f40 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
10f50 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
10f60 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
10f70 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
10f80 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
10f90 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
10fa0 20 20 20 2a 70 52 63 20 3d 20 73 71 6c 69 74 65     *pRc = sqlite
10fb0 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c  3_exec(db, zSql,
10fc0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   0, 0, 0);.    s
10fd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
10fe0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
10ff0 78 44 69 73 63 6f 6e 6e 65 63 74 2f 78 44 65 73  xDisconnect/xDes
11000 74 72 6f 79 20 6d 65 74 68 6f 64 20 66 6f 72 20  troy method for 
11010 74 68 65 20 66 75 7a 7a 79 2d 73 65 61 72 63 68  the fuzzy-search
11020 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
11030 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
11040 55 6e 69 6e 69 74 28 69 6e 74 20 69 73 44 65 73  Uninit(int isDes
11050 74 72 6f 79 2c 20 73 71 6c 69 74 65 33 5f 76 74  troy, sqlite3_vt
11060 61 62 20 2a 70 56 54 61 62 29 7b 0a 20 20 73 70  ab *pVTab){.  sp
11070 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20  ellfix1_vtab *p 
11080 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  = (spellfix1_vta
11090 62 2a 29 70 56 54 61 62 3b 0a 20 20 69 6e 74 20  b*)pVTab;.  int 
110a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
110b0 20 20 69 66 28 20 69 73 44 65 73 74 72 6f 79 20    if( isDestroy 
110c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
110d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
110e0 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28  spellfix1DbExec(
110f0 26 72 63 2c 20 64 62 2c 20 22 44 52 4f 50 20 54  &rc, db, "DROP T
11100 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 5c  ABLE IF EXISTS \
11110 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62  "%w\".\"%w_vocab
11120 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
11130 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d         p->zDbNam
11140 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65  e, p->zTableName
11150 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
11160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11170 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11180 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  ->zTableName);. 
11190 20 20 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66     editDist3Conf
111a0 69 67 44 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e  igDelete(p->pCon
111b0 66 69 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  fig3);.    sqlit
111c0 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74  e3_free(p->zCost
111d0 54 61 62 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69  Table);.    sqli
111e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
111f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11200 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
11210 66 69 78 31 44 69 73 63 6f 6e 6e 65 63 74 28 73  fix1Disconnect(s
11220 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
11230 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 70  ab){.  return sp
11240 65 6c 6c 66 69 78 31 55 6e 69 6e 69 74 28 30 2c  ellfix1Uninit(0,
11250 20 70 56 54 61 62 29 3b 0a 7d 0a 73 74 61 74 69   pVTab);.}.stati
11260 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 44  c int spellfix1D
11270 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 5f 76  estroy(sqlite3_v
11280 74 61 62 20 2a 70 56 54 61 62 29 7b 0a 20 20 72  tab *pVTab){.  r
11290 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 55  eturn spellfix1U
112a0 6e 69 6e 69 74 28 31 2c 20 70 56 54 61 62 29 3b  ninit(1, pVTab);
112b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
112c0 20 63 6f 70 79 20 6f 66 20 61 20 73 74 72 69 6e   copy of a strin
112d0 67 2e 20 20 52 65 6d 6f 76 65 20 6c 65 61 64 69  g.  Remove leadi
112e0 6e 67 20 61 6e 64 20 74 72 61 69 6c 69 6e 67 20  ng and trailing 
112f0 77 68 69 74 65 73 70 61 63 65 0a 2a 2a 20 61 6e  whitespace.** an
11300 64 20 64 65 71 75 6f 74 65 20 69 74 2e 0a 2a 2f  d dequote it..*/
11310 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 70  .static char *sp
11320 65 6c 6c 66 69 78 31 44 65 71 75 6f 74 65 28 63  ellfix1Dequote(c
11330 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b  onst char *zIn){
11340 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20  .  char *zOut;. 
11350 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
11360 72 20 63 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  r c;.  while( is
11370 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
11380 63 68 61 72 29 7a 49 6e 5b 30 5d 29 20 29 20 7a  char)zIn[0]) ) z
11390 49 6e 2b 2b 3b 0a 20 20 7a 4f 75 74 20 3d 20 73  In++;.  zOut = s
113a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
113b0 25 73 22 2c 20 7a 49 6e 29 3b 0a 20 20 69 66 28  %s", zIn);.  if(
113c0 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72   zOut==0 ) retur
113d0 6e 20 30 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29  n 0;.  i = (int)
113e0 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 23 69  strlen(zOut);.#i
113f0 66 20 30 20 20 2f 2a 20 54 68 65 20 70 61 72 73  f 0  /* The pars
11400 65 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 6c 65  er will never le
11410 61 76 65 20 73 70 61 63 65 73 20 61 74 20 74 68  ave spaces at th
11420 65 20 65 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65  e end */.  while
11430 28 20 69 3e 30 20 26 26 20 69 73 73 70 61 63 65  ( i>0 && isspace
11440 28 7a 4f 75 74 5b 69 2d 31 5d 29 20 29 7b 20 69  (zOut[i-1]) ){ i
11450 2d 2d 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a  --; }.#endif.  z
11460 4f 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 63 20  Out[i] = 0;.  c 
11470 3d 20 7a 4f 75 74 5b 30 5d 3b 0a 20 20 69 66 28  = zOut[0];.  if(
11480 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
11490 22 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  "' ){.    for(i=
114a0 31 2c 20 6a 3d 30 3b 20 41 4c 57 41 59 53 28 7a  1, j=0; ALWAYS(z
114b0 4f 75 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Out[i]); i++){. 
114c0 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d       zOut[j++] =
114d0 20 7a 4f 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20   zOut[i];.      
114e0 69 66 28 20 7a 4f 75 74 5b 69 5d 3d 3d 63 20 29  if( zOut[i]==c )
114f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f  {.        if( zO
11500 75 74 5b 69 2b 31 5d 3d 3d 63 20 29 7b 0a 20 20  ut[i+1]==c ){.  
11510 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
11520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11530 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2d 31 5d 20        zOut[j-1] 
11540 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 0;.          b
11550 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
11560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11570 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b  }.  return zOut;
11580 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6e 6e  .}.../*.** xConn
11590 65 63 74 2f 78 43 72 65 61 74 65 20 6d 65 74 68  ect/xCreate meth
115a0 6f 64 20 66 6f 72 20 74 68 65 20 73 70 65 6c 6c  od for the spell
115b0 66 69 78 31 20 6d 6f 64 75 6c 65 2e 20 41 72 67  fix1 module. Arg
115c0 75 6d 65 6e 74 73 20 61 72 65 3a 0a 2a 2a 0a 2a  uments are:.**.*
115d0 2a 20 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e  *   argv[0]   ->
115e0 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28 22   module name  ("
115f0 73 70 65 6c 6c 66 69 78 31 22 29 0a 2a 2a 20 20  spellfix1").**  
11600 20 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61   argv[1]   -> da
11610 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20  tabase name.**  
11620 20 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61   argv[2]   -> ta
11630 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72  ble name.**   ar
11640 67 76 5b 33 5d 2e 2e 20 2d 3e 20 6f 70 74 69 6f  gv[3].. -> optio
11650 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 28 69  nal arguments (i
11660 2e 65 2e 20 22 65 64 69 74 5f 63 6f 73 74 5f 74  .e. "edit_cost_t
11670 61 62 6c 65 22 20 70 61 72 61 6d 65 74 65 72 29  able" parameter)
11680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
11690 70 65 6c 6c 66 69 78 31 49 6e 69 74 28 0a 20 20  pellfix1Init(.  
116a0 69 6e 74 20 69 73 43 72 65 61 74 65 2c 0a 20 20  int isCreate,.  
116b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
116c0 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
116d0 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
116e0 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
116f0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
11700 70 70 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVTab,.  char *
11710 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 73 70 65 6c  *pzErr.){.  spel
11720 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 4e 65 77  lfix1_vtab *pNew
11730 20 3d 20 30 3b 0a 20 20 2f 2a 20 63 6f 6e 73 74   = 0;.  /* const
11740 20 63 68 61 72 20 2a 7a 4d 6f 64 75 6c 65 20 3d   char *zModule =
11750 20 61 72 67 76 5b 30 5d 3b 20 2f 2f 20 6e 6f 74   argv[0]; // not
11760 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
11770 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
11780 20 61 72 67 76 5b 31 5d 3b 0a 20 20 63 6f 6e 73   argv[1];.  cons
11790 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
117a0 6d 65 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  me = argv[2];.  
117b0 69 6e 74 20 6e 44 62 4e 61 6d 65 3b 0a 20 20 69  int nDbName;.  i
117c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
117d0 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  K;.  int i;..  n
117e0 44 62 4e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74  DbName = (int)st
117f0 72 6c 65 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20  rlen(zDbName);. 
11800 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
11810 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
11820 28 2a 70 4e 65 77 29 20 2b 20 6e 44 62 4e 61 6d  (*pNew) + nDbNam
11830 65 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 70 4e  e + 1);.  if( pN
11840 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ew==0 ){.    rc 
11850 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
11870 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a  set(pNew, 0, siz
11880 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 20  eof(*pNew));.   
11890 20 70 4e 65 77 2d 3e 7a 44 62 4e 61 6d 65 20 3d   pNew->zDbName =
118a0 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
118b0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65  ;.    memcpy(pNe
118c0 77 2d 3e 7a 44 62 4e 61 6d 65 2c 20 7a 44 62 4e  w->zDbName, zDbN
118d0 61 6d 65 2c 20 6e 44 62 4e 61 6d 65 2b 31 29 3b  ame, nDbName+1);
118e0 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 54 61 62 6c  .    pNew->zTabl
118f0 65 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  eName = sqlite3_
11900 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 54  mprintf("%s", zT
11910 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 70  ableName);.    p
11920 4e 65 77 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  New->db = db;.  
11930 20 20 69 66 28 20 70 4e 65 77 2d 3e 7a 54 61 62    if( pNew->zTab
11940 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  leName==0 ){.   
11950 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11960 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
11970 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11980 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
11990 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
119a0 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78   "CREATE TABLE x
119b0 28 77 6f 72 64 2c 72 61 6e 6b 2c 64 69 73 74 61  (word,rank,dista
119c0 6e 63 65 2c 6c 61 6e 67 69 64 2c 20 22 0a 20 20  nce,langid, ".  
119d0 20 20 20 20 20 20 20 20 20 22 73 63 6f 72 65 2c           "score,
119e0 20 6d 61 74 63 68 6c 65 6e 2c 20 70 68 6f 6e 65   matchlen, phone
119f0 68 61 73 68 20 48 49 44 44 45 4e 2c 20 22 0a 20  hash HIDDEN, ". 
11a00 20 20 20 20 20 20 20 20 20 20 22 74 6f 70 20 48            "top H
11a10 49 44 44 45 4e 2c 20 73 63 6f 70 65 20 48 49 44  IDDEN, scope HID
11a20 44 45 4e 2c 20 73 72 63 68 63 6e 74 20 48 49 44  DEN, srchcnt HID
11a30 44 45 4e 2c 20 22 0a 20 20 20 20 20 20 20 20 20  DEN, ".         
11a40 20 20 22 73 6f 75 6e 64 73 6c 69 6b 65 20 48 49    "soundslike HI
11a50 44 44 45 4e 2c 20 63 6f 6d 6d 61 6e 64 20 48 49  DDEN, command HI
11a60 44 44 45 4e 29 22 0a 20 20 20 20 20 20 29 3b 0a  DDEN)".      );.
11a70 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
11a80 5f 43 4f 4c 5f 57 4f 52 44 20 20 20 20 20 20 20  _COL_WORD       
11a90 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 53       0.#define S
11aa0 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b  PELLFIX_COL_RANK
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 23 64              1.#d
11ac0 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43  efine SPELLFIX_C
11ad0 4f 4c 5f 44 49 53 54 41 4e 43 45 20 20 20 20 20  OL_DISTANCE     
11ae0 20 20 20 32 0a 23 64 65 66 69 6e 65 20 53 50 45     2.#define SPE
11af0 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44  LLFIX_COL_LANGID
11b00 20 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66            3.#def
11b10 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
11b20 5f 53 43 4f 52 45 20 20 20 20 20 20 20 20 20 20  _SCORE          
11b30 20 34 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c   4.#define SPELL
11b40 46 49 58 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45 4e  FIX_COL_MATCHLEN
11b50 20 20 20 20 20 20 20 20 35 0a 23 64 65 66 69 6e          5.#defin
11b60 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50  e SPELLFIX_COL_P
11b70 48 4f 4e 45 48 41 53 48 20 20 20 20 20 20 20 36  HONEHASH       6
11b80 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
11b90 58 5f 43 4f 4c 5f 54 4f 50 20 20 20 20 20 20 20  X_COL_TOP       
11ba0 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20        7.#define 
11bb0 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f  SPELLFIX_COL_SCO
11bc0 50 45 20 20 20 20 20 20 20 20 20 20 20 38 0a 23  PE           8.#
11bd0 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
11be0 43 4f 4c 5f 53 52 43 48 43 4e 54 20 20 20 20 20  COL_SRCHCNT     
11bf0 20 20 20 20 39 0a 23 64 65 66 69 6e 65 20 53 50      9.#define SP
11c00 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44  ELLFIX_COL_SOUND
11c10 53 4c 49 4b 45 20 20 20 20 20 31 30 0a 23 64 65  SLIKE     10.#de
11c20 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  fine SPELLFIX_CO
11c30 4c 5f 43 4f 4d 4d 41 4e 44 20 20 20 20 20 20 20  L_COMMAND       
11c40 20 31 31 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   11.    }.    if
11c50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11c60 26 26 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20  && isCreate ){. 
11c70 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62       spellfix1Db
11c80 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20  Exec(&rc, db,.  
11c90 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
11ca0 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
11cb0 54 53 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76  TS \"%w\".\"%w_v
11cc0 6f 63 61 62 5c 22 28 5c 6e 22 0a 20 20 20 20 20  ocab\"(\n".     
11cd0 20 20 20 20 22 20 20 69 64 20 49 4e 54 45 47 45      "  id INTEGE
11ce0 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e  R PRIMARY KEY,\n
11cf0 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 72 61  ".         "  ra
11d00 6e 6b 20 49 4e 54 2c 5c 6e 22 0a 20 20 20 20 20  nk INT,\n".     
11d10 20 20 20 20 22 20 20 6c 61 6e 67 69 64 20 49 4e      "  langid IN
11d20 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22  T,\n".         "
11d30 20 20 77 6f 72 64 20 54 45 58 54 2c 5c 6e 22 0a    word TEXT,\n".
11d40 20 20 20 20 20 20 20 20 20 22 20 20 6b 31 20 54           "  k1 T
11d50 45 58 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  EXT,\n".        
11d60 20 22 20 20 6b 32 20 54 45 58 54 5c 6e 22 0a 20   "  k2 TEXT\n". 
11d70 20 20 20 20 20 20 20 20 22 29 3b 5c 6e 22 2c 0a          ");\n",.
11d80 20 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65           zDbName
11d90 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 0a 20 20 20  , zTableName.   
11da0 20 20 20 29 3b 0a 20 20 20 20 20 20 73 70 65 6c     );.      spel
11db0 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c  lfix1DbExec(&rc,
11dc0 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20 22 43   db,.         "C
11dd0 52 45 41 54 45 20 49 4e 44 45 58 20 49 46 20 4e  REATE INDEX IF N
11de0 4f 54 20 45 58 49 53 54 53 20 5c 22 25 77 5c 22  OT EXISTS \"%w\"
11df0 2e 5c 22 25 77 5f 76 6f 63 61 62 5f 69 6e 64 65  .\"%w_vocab_inde
11e00 78 5f 6c 61 6e 67 69 64 5f 6b 32 5c 22 20 22 0a  x_langid_k2\" ".
11e10 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 4e 20              "ON 
11e20 5c 22 25 77 5f 76 6f 63 61 62 5c 22 28 6c 61 6e  \"%w_vocab\"(lan
11e30 67 69 64 2c 6b 32 29 3b 22 2c 0a 20 20 20 20 20  gid,k2);",.     
11e40 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61      zDbName, zTa
11e50 62 6c 65 4e 61 6d 65 2c 20 7a 54 61 62 6c 65 4e  bleName, zTableN
11e60 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
11e70 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 33 3b 20   }.    for(i=3; 
11e80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11e90 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
11ea0 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
11eb0 28 61 72 67 76 5b 69 5d 2c 22 65 64 69 74 5f 63  (argv[i],"edit_c
11ec0 6f 73 74 5f 74 61 62 6c 65 3d 22 2c 31 36 29 3d  ost_table=",16)=
11ed0 3d 30 20 26 26 20 70 4e 65 77 2d 3e 7a 43 6f 73  =0 && pNew->zCos
11ee0 74 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  tTable==0 ){.   
11ef0 20 20 20 20 20 70 4e 65 77 2d 3e 7a 43 6f 73 74       pNew->zCost
11f00 54 61 62 6c 65 20 3d 20 73 70 65 6c 6c 66 69 78  Table = spellfix
11f10 31 44 65 71 75 6f 74 65 28 26 61 72 67 76 5b 69  1Dequote(&argv[i
11f20 5d 5b 31 36 5d 29 3b 0a 20 20 20 20 20 20 20 20  ][16]);.        
11f30 69 66 28 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54  if( pNew->zCostT
11f40 61 62 6c 65 3d 3d 30 20 29 20 72 63 20 3d 20 53  able==0 ) rc = S
11f50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11f60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
11f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 7a       }.      *pz
11f80 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Err = sqlite3_mp
11f90 72 69 6e 74 66 28 22 62 61 64 20 61 72 67 75 6d  rintf("bad argum
11fa0 65 6e 74 20 74 6f 20 73 70 65 6c 6c 66 69 78 31  ent to spellfix1
11fb0 28 29 3a 20 5c 22 25 73 5c 22 22 2c 20 61 72 67  (): \"%s\"", arg
11fc0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  v[i]);.      rc 
11fd0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
11fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
11ff0 28 20 72 63 20 26 26 20 70 4e 65 77 20 29 7b 0a  ( rc && pNew ){.
12000 20 20 20 20 2a 70 70 56 54 61 62 20 3d 20 30 3b      *ppVTab = 0;
12010 0a 20 20 20 20 73 70 65 6c 6c 66 69 78 31 55 6e  .    spellfix1Un
12020 69 6e 69 74 28 30 2c 20 26 70 4e 65 77 2d 3e 62  init(0, &pNew->b
12030 61 73 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ase);.  }else{. 
12040 20 20 20 2a 70 70 56 54 61 62 20 3d 20 28 73 71     *ppVTab = (sq
12050 6c 69 74 65 33 5f 76 74 61 62 20 2a 29 70 4e 65  lite3_vtab *)pNe
12060 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
12070 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
12080 20 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43   xConnect and xC
12090 72 65 61 74 65 20 6d 65 74 68 6f 64 73 0a 2a 2f  reate methods.*/
120a0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
120b0 6c 66 69 78 31 43 6f 6e 6e 65 63 74 28 0a 20 20  lfix1Connect(.  
120c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
120d0 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74  oid *pAux,.  int
120e0 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61   argc, const cha
120f0 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20  r *const*argv,. 
12100 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a   sqlite3_vtab **
12110 70 70 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a  ppVTab,.  char *
12120 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72 65 74 75  *pzErr.){.  retu
12130 72 6e 20 73 70 65 6c 6c 66 69 78 31 49 6e 69 74  rn spellfix1Init
12140 28 30 2c 20 64 62 2c 20 70 41 75 78 2c 20 61 72  (0, db, pAux, ar
12150 67 63 2c 20 61 72 67 76 2c 20 70 70 56 54 61 62  gc, argv, ppVTab
12160 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 73 74 61 74  , pzErr);.}.stat
12170 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
12180 43 72 65 61 74 65 28 0a 20 20 73 71 6c 69 74 65  Create(.  sqlite
12190 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70  3 *db,.  void *p
121a0 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Aux,.  int argc,
121b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
121c0 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74  st*argv,.  sqlit
121d0 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62  e3_vtab **ppVTab
121e0 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
121f0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65  .){.  return spe
12200 6c 6c 66 69 78 31 49 6e 69 74 28 31 2c 20 64 62  llfix1Init(1, db
12210 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72  , pAux, argc, ar
12220 67 76 2c 20 70 70 56 54 61 62 2c 20 70 7a 45 72  gv, ppVTab, pzEr
12230 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  r);.}../*.** Cle
12240 61 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  ar all of the co
12250 6e 74 65 6e 74 20 66 72 6f 6d 20 61 20 63 75 72  ntent from a cur
12260 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sor..*/.static v
12270 6f 69 64 20 73 70 65 6c 6c 66 69 78 31 52 65 73  oid spellfix1Res
12280 65 74 43 75 72 73 6f 72 28 73 70 65 6c 6c 66 69  etCursor(spellfi
12290 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 29  x1_cursor *pCur)
122a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
122b0 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 6e 52  (i=0; i<pCur->nR
122c0 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ow; i++){.    sq
122d0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
122e0 3e 61 5b 69 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20  >a[i].zWord);.  
122f0 7d 0a 20 20 70 43 75 72 2d 3e 6e 52 6f 77 20 3d  }.  pCur->nRow =
12300 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77   0;.  pCur->iRow
12310 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 6e 53   = 0;.  pCur->nS
12320 65 61 72 63 68 20 3d 20 30 3b 0a 20 20 69 66 28  earch = 0;.  if(
12330 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e   pCur->pFullScan
12340 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
12350 66 69 6e 61 6c 69 7a 65 28 70 43 75 72 2d 3e 70  finalize(pCur->p
12360 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20 20 20 70  FullScan);.    p
12370 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 3d  Cur->pFullScan =
12380 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
12390 20 52 65 73 69 7a 65 20 74 68 65 20 63 75 72 73   Resize the curs
123a0 6f 72 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 6f  or to hold up to
123b0 20 4e 20 72 6f 77 73 20 6f 66 20 63 6f 6e 74 65   N rows of conte
123c0 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  nt.*/.static voi
123d0 64 20 73 70 65 6c 6c 66 69 78 31 52 65 73 69 7a  d spellfix1Resiz
123e0 65 43 75 72 73 6f 72 28 73 70 65 6c 6c 66 69 78  eCursor(spellfix
123f0 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  1_cursor *pCur, 
12400 69 6e 74 20 4e 29 7b 0a 20 20 73 74 72 75 63 74  int N){.  struct
12410 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a   spellfix1_row *
12420 61 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20  aNew;.  assert( 
12430 4e 3e 3d 70 43 75 72 2d 3e 6e 52 6f 77 20 29 3b  N>=pCur->nRow );
12440 0a 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  aNew = sqlite
12450 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 43 75 72  3_realloc64(pCur
12460 2d 3e 61 2c 20 73 69 7a 65 6f 66 28 70 43 75 72  ->a, sizeof(pCur
12470 2d 3e 61 5b 30 5d 29 2a 4e 29 3b 0a 20 20 69 66  ->a[0])*N);.  if
12480 28 20 61 4e 65 77 3d 3d 30 20 26 26 20 4e 3e 30  ( aNew==0 && N>0
12490 20 29 7b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78   ){.    spellfix
124a0 31 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75  1ResetCursor(pCu
124b0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
124c0 66 72 65 65 28 70 43 75 72 2d 3e 61 29 3b 0a 20  free(pCur->a);. 
124d0 20 20 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20     pCur->nAlloc 
124e0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  = 0;.    pCur->a
124f0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12500 20 20 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20     pCur->nAlloc 
12510 3d 20 4e 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  = N;.    pCur->a
12520 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a   = aNew;.  }.}..
12530 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
12540 75 7a 7a 79 2d 73 65 61 72 63 68 20 63 75 72 73  uzzy-search curs
12550 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
12560 74 20 73 70 65 6c 6c 66 69 78 31 43 6c 6f 73 65  t spellfix1Close
12570 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
12580 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 70  rsor *cur){.  sp
12590 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
125a0 70 43 75 72 20 3d 20 28 73 70 65 6c 6c 66 69 78  pCur = (spellfix
125b0 31 5f 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a  1_cursor *)cur;.
125c0 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74    spellfix1Reset
125d0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
125e0 73 70 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43  spellfix1ResizeC
125f0 75 72 73 6f 72 28 70 43 75 72 2c 20 30 29 3b 0a  ursor(pCur, 0);.
12600 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12610 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a  Cur->zPattern);.
12620 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12630 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Cur);.  return S
12640 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 64 65  QLITE_OK;.}..#de
12650 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49 44  fine SPELLFIX_ID
12660 58 4e 55 4d 5f 4d 41 54 43 48 20 20 30 78 30 31  XNUM_MATCH  0x01
12670 20 20 20 20 20 20 20 20 20 2f 2a 20 77 6f 72 64           /* word
12680 20 4d 41 54 43 48 20 24 73 74 72 20 2a 2f 0a 23   MATCH $str */.#
12690 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
126a0 49 44 58 4e 55 4d 5f 4c 41 4e 47 49 44 20 30 78  IDXNUM_LANGID 0x
126b0 30 32 20 20 20 20 20 20 20 20 20 2f 2a 20 6c 61  02         /* la
126c0 6e 67 69 64 20 3d 3d 20 24 6c 61 6e 67 69 64 20  ngid == $langid 
126d0 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c  */.#define SPELL
126e0 46 49 58 5f 49 44 58 4e 55 4d 5f 54 4f 50 20 20  FIX_IDXNUM_TOP  
126f0 20 20 30 78 30 34 20 20 20 20 20 20 20 20 20 2f    0x04         /
12700 2a 20 74 6f 70 20 3d 20 24 74 6f 70 20 2a 2f 0a  * top = $top */.
12710 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
12720 5f 49 44 58 4e 55 4d 5f 53 43 4f 50 45 20 20 30  _IDXNUM_SCOPE  0
12730 78 30 38 20 20 20 20 20 20 20 20 20 2f 2a 20 73  x08         /* s
12740 63 6f 70 65 20 3d 20 24 73 63 6f 70 65 20 2a 2f  cope = $scope */
12750 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
12760 58 5f 49 44 58 4e 55 4d 5f 44 49 53 54 4c 54 20  X_IDXNUM_DISTLT 
12770 30 78 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20  0x10         /* 
12780 64 69 73 74 61 6e 63 65 20 3c 20 24 64 69 73 74  distance < $dist
12790 61 6e 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ance */.#define 
127a0 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
127b0 44 49 53 54 4c 45 20 30 78 32 30 20 20 20 20 20  DISTLE 0x20     
127c0 20 20 20 20 2f 2a 20 64 69 73 74 61 6e 63 65 20      /* distance 
127d0 3c 3d 20 24 64 69 73 74 61 6e 63 65 20 2a 2f 0a  <= $distance */.
127e0 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
127f0 5f 49 44 58 4e 55 4d 5f 52 4f 57 49 44 20 20 30  _IDXNUM_ROWID  0
12800 78 34 30 20 20 20 20 20 20 20 20 20 2f 2a 20 72  x40         /* r
12810 6f 77 69 64 20 3d 20 24 72 6f 77 69 64 20 2a 2f  owid = $rowid */
12820 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
12830 58 5f 49 44 58 4e 55 4d 5f 44 49 53 54 20 20 20  X_IDXNUM_DIST   
12840 28 30 78 31 30 7c 30 78 32 30 29 20 20 2f 2a 20  (0x10|0x20)  /* 
12850 44 49 53 54 4c 54 20 61 6e 64 20 44 49 53 54 4c  DISTLT and DISTL
12860 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  E */../*.**.** T
12870 68 65 20 70 6c 61 6e 20 6e 75 6d 62 65 72 20 69  he plan number i
12880 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 74  s a bitmask of t
12890 68 65 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e  he SPELLFIX_IDXN
128a0 55 4d 5f 2a 20 76 61 6c 75 65 73 20 64 65 66 69  UM_* values defi
128b0 6e 65 64 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a  ned.** above..**
128c0 0a 2a 2a 20 66 69 6c 74 65 72 2e 61 72 67 76 5b  .** filter.argv[
128d0 2a 5d 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  *] values contai
128e0 6e 73 20 24 73 74 72 2c 20 24 6c 61 6e 67 69 64  ns $str, $langid
128f0 2c 20 24 74 6f 70 2c 20 24 73 63 6f 70 65 20 61  , $top, $scope a
12900 6e 64 20 24 72 6f 77 69 64 0a 2a 2a 20 69 66 20  nd $rowid.** if 
12910 73 70 65 63 69 66 69 65 64 20 61 6e 64 20 69 6e  specified and in
12920 20 74 68 61 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a   that order..*/.
12930 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
12940 66 69 78 31 42 65 73 74 49 6e 64 65 78 28 73 71  fix1BestIndex(sq
12950 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c  lite3_vtab *tab,
12960 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
12970 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a  nfo *pIdxInfo){.
12980 20 20 69 6e 74 20 69 50 6c 61 6e 20 3d 20 30 3b    int iPlan = 0;
12990 0a 20 20 69 6e 74 20 69 4c 61 6e 67 54 65 72 6d  .  int iLangTerm
129a0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 54 6f   = -1;.  int iTo
129b0 70 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e  pTerm = -1;.  in
129c0 74 20 69 53 63 6f 70 65 54 65 72 6d 20 3d 20 2d  t iScopeTerm = -
129d0 31 3b 0a 20 20 69 6e 74 20 69 44 69 73 74 54 65  1;.  int iDistTe
129e0 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  rm = -1;.  int i
129f0 52 6f 77 69 64 54 65 72 6d 20 3d 20 2d 31 3b 0a  RowidTerm = -1;.
12a00 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
12a10 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
12a20 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
12a30 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20   *pConstraint;. 
12a40 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   pConstraint = p
12a50 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
12a60 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
12a70 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
12a80 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
12a90 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20  Constraint++){. 
12aa0 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69     if( pConstrai
12ab0 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20  nt->usable==0 ) 
12ac0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
12ad0 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66  * Terms of the f
12ae0 6f 72 6d 3a 20 20 77 6f 72 64 20 4d 41 54 43 48  orm:  word MATCH
12af0 20 24 73 74 72 20 2a 2f 0a 20 20 20 20 69 66 28   $str */.    if(
12b00 20 28 69 50 6c 61 6e 20 26 20 53 50 45 4c 4c 46   (iPlan & SPELLF
12b10 49 58 5f 49 44 58 4e 55 4d 5f 4d 41 54 43 48 29  IX_IDXNUM_MATCH)
12b20 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 43 6f  ==0 .     && pCo
12b30 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
12b40 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  n==SPELLFIX_COL_
12b50 57 4f 52 44 0a 20 20 20 20 20 26 26 20 70 43 6f  WORD.     && pCo
12b60 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51  nstraint->op==SQ
12b70 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
12b80 52 41 49 4e 54 5f 4d 41 54 43 48 0a 20 20 20 20  RAINT_MATCH.    
12b90 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c  ){.      iPlan |
12ba0 3d 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  = SPELLFIX_IDXNU
12bb0 4d 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70  M_MATCH;.      p
12bc0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
12bd0 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
12be0 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20  vIndex = 1;.    
12bf0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
12c00 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
12c10 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  omit = 1;.    }.
12c20 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
12c30 20 74 68 65 20 66 6f 72 6d 3a 20 20 6c 61 6e 67   the form:  lang
12c40 69 64 20 3d 20 24 6c 61 6e 67 69 64 20 20 2a 2f  id = $langid  */
12c50 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20  .    if( (iPlan 
12c60 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  & SPELLFIX_IDXNU
12c70 4d 5f 4c 41 4e 47 49 44 29 3d 3d 30 0a 20 20 20  M_LANGID)==0.   
12c80 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
12c90 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c  ->iColumn==SPELL
12ca0 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 0a 20  FIX_COL_LANGID. 
12cb0 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69      && pConstrai
12cc0 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  nt->op==SQLITE_I
12cd0 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12ce0 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  EQ.    ){.      
12cf0 69 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49  iPlan |= SPELLFI
12d00 58 5f 49 44 58 4e 55 4d 5f 4c 41 4e 47 49 44 3b  X_IDXNUM_LANGID;
12d10 0a 20 20 20 20 20 20 69 4c 61 6e 67 54 65 72 6d  .      iLangTerm
12d20 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = i;.    }..   
12d30 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65   /* Terms of the
12d40 20 66 6f 72 6d 3a 20 20 74 6f 70 20 3d 20 24 74   form:  top = $t
12d50 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69  op */.    if( (i
12d60 50 6c 61 6e 20 26 20 53 50 45 4c 4c 46 49 58 5f  Plan & SPELLFIX_
12d70 49 44 58 4e 55 4d 5f 54 4f 50 29 3d 3d 30 0a 20  IDXNUM_TOP)==0. 
12d80 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69      && pConstrai
12d90 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45  nt->iColumn==SPE
12da0 4c 4c 46 49 58 5f 43 4f 4c 5f 54 4f 50 0a 20 20  LLFIX_COL_TOP.  
12db0 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e     && pConstrain
12dc0 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t->op==SQLITE_IN
12dd0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
12de0 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  Q.    ){.      i
12df0 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58  Plan |= SPELLFIX
12e00 5f 49 44 58 4e 55 4d 5f 54 4f 50 3b 0a 20 20 20  _IDXNUM_TOP;.   
12e10 20 20 20 69 54 6f 70 54 65 72 6d 20 3d 20 69 3b     iTopTerm = i;
12e20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
12e30 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
12e40 3a 20 20 73 63 6f 70 65 20 3d 20 24 73 63 6f 70  :  scope = $scop
12e50 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50  e */.    if( (iP
12e60 6c 61 6e 20 26 20 53 50 45 4c 4c 46 49 58 5f 49  lan & SPELLFIX_I
12e70 44 58 4e 55 4d 5f 53 43 4f 50 45 29 3d 3d 30 0a  DXNUM_SCOPE)==0.
12e80 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61       && pConstra
12e90 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50  int->iColumn==SP
12ea0 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45  ELLFIX_COL_SCOPE
12eb0 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
12ec0 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  aint->op==SQLITE
12ed0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
12ee0 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20  T_EQ.    ){.    
12ef0 20 20 69 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c    iPlan |= SPELL
12f00 46 49 58 5f 49 44 58 4e 55 4d 5f 53 43 4f 50 45  FIX_IDXNUM_SCOPE
12f10 3b 0a 20 20 20 20 20 20 69 53 63 6f 70 65 54 65  ;.      iScopeTe
12f20 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20  rm = i;.    }.. 
12f30 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74     /* Terms of t
12f40 68 65 20 66 6f 72 6d 3a 20 20 64 69 73 74 61 6e  he form:  distan
12f50 63 65 20 3c 20 24 64 69 73 74 20 6f 72 20 64 69  ce < $dist or di
12f60 73 74 61 6e 63 65 20 3c 3d 20 24 64 69 73 74 20  stance <= $dist 
12f70 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61  */.    if( (iPla
12f80 6e 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58  n & SPELLFIX_IDX
12f90 4e 55 4d 5f 44 49 53 54 29 3d 3d 30 0a 20 20 20  NUM_DIST)==0.   
12fa0 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
12fb0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c  ->iColumn==SPELL
12fc0 46 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e 43 45  FIX_COL_DISTANCE
12fd0 0a 20 20 20 20 20 26 26 20 28 70 43 6f 6e 73 74  .     && (pConst
12fe0 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54  raint->op==SQLIT
12ff0 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
13000 4e 54 5f 4c 54 0a 20 20 20 20 20 20 20 20 20 20  NT_LT.          
13010 7c 7c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  || pConstraint->
13020 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
13030 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 29 0a  _CONSTRAINT_LE).
13040 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
13050 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
13060 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
13070 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 7b 0a  ONSTRAINT_LT ){.
13080 20 20 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d          iPlan |=
13090 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
130a0 5f 44 49 53 54 4c 54 3b 0a 20 20 20 20 20 20 7d  _DISTLT;.      }
130b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 50  else{.        iP
130c0 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f  lan |= SPELLFIX_
130d0 49 44 58 4e 55 4d 5f 44 49 53 54 4c 45 3b 0a 20  IDXNUM_DISTLE;. 
130e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 44 69       }.      iDi
130f0 73 74 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20  stTerm = i;.    
13100 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20  }..    /* Terms 
13110 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 64 69  of the form:  di
13120 73 74 61 6e 63 65 20 3c 20 24 64 69 73 74 20 6f  stance < $dist o
13130 72 20 64 69 73 74 61 6e 63 65 20 3c 3d 20 24 64  r distance <= $d
13140 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  ist */.    if( (
13150 69 50 6c 61 6e 20 26 20 53 50 45 4c 4c 46 49 58  iPlan & SPELLFIX
13160 5f 49 44 58 4e 55 4d 5f 52 4f 57 49 44 29 3d 3d  _IDXNUM_ROWID)==
13170 30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74  0.     && pConst
13180 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  raint->iColumn<0
13190 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
131a0 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45  aint->op==SQLITE
131b0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
131c0 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20 20  T_EQ.    ){.    
131d0 20 20 69 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c    iPlan |= SPELL
131e0 46 49 58 5f 49 44 58 4e 55 4d 5f 52 4f 57 49 44  FIX_IDXNUM_ROWID
131f0 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 54 65  ;.      iRowidTe
13200 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  rm = i;.    }.  
13210 7d 0a 20 20 69 66 28 20 69 50 6c 61 6e 26 53 50  }.  if( iPlan&SP
13220 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 4d 41  ELLFIX_IDXNUM_MA
13230 54 43 48 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  TCH ){.    int i
13240 64 78 20 3d 20 32 3b 0a 20 20 20 20 70 49 64 78  dx = 2;.    pIdx
13250 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 69  Info->idxNum = i
13260 50 6c 61 6e 3b 0a 20 20 20 20 69 66 28 20 70 49  Plan;.    if( pI
13270 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
13280 3d 3d 31 0a 20 20 20 20 20 26 26 20 70 49 64 78  ==1.     && pIdx
13290 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30  Info->aOrderBy[0
132a0 5d 2e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c  ].iColumn==SPELL
132b0 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 0a 20 20  FIX_COL_SCORE.  
132c0 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e     && pIdxInfo->
132d0 61 4f 72 64 65 72 42 79 5b 30 5d 2e 64 65 73 63  aOrderBy[0].desc
132e0 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
132f0 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72   pIdxInfo->order
13300 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 31 3b 20  ByConsumed = 1; 
13310 20 2f 2a 20 44 65 66 61 75 6c 74 20 6f 72 64 65   /* Default orde
13320 72 20 62 79 20 69 53 63 6f 72 65 20 2a 2f 0a 20  r by iScore */. 
13330 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c     }.    if( iPl
13340 61 6e 26 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e  an&SPELLFIX_IDXN
13350 55 4d 5f 4c 41 4e 47 49 44 20 29 7b 0a 20 20 20  UM_LANGID ){.   
13360 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
13370 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 4c  nstraintUsage[iL
13380 61 6e 67 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64  angTerm].argvInd
13390 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20  ex = idx++;.    
133a0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
133b0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 4c 61  straintUsage[iLa
133c0 6e 67 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31  ngTerm].omit = 1
133d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
133e0 69 50 6c 61 6e 26 53 50 45 4c 4c 46 49 58 5f 49  iPlan&SPELLFIX_I
133f0 44 58 4e 55 4d 5f 54 4f 50 20 29 7b 0a 20 20 20  DXNUM_TOP ){.   
13400 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
13410 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 54  nstraintUsage[iT
13420 6f 70 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65  opTerm].argvInde
13430 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20  x = idx++;.     
13440 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
13450 74 72 61 69 6e 74 55 73 61 67 65 5b 69 54 6f 70  traintUsage[iTop
13460 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  Term].omit = 1;.
13470 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50      }.    if( iP
13480 6c 61 6e 26 53 50 45 4c 4c 46 49 58 5f 49 44 58  lan&SPELLFIX_IDX
13490 4e 55 4d 5f 53 43 4f 50 45 20 29 7b 0a 20 20 20  NUM_SCOPE ){.   
134a0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
134b0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 53  nstraintUsage[iS
134c0 63 6f 70 65 54 65 72 6d 5d 2e 61 72 67 76 49 6e  copeTerm].argvIn
134d0 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20  dex = idx++;.   
134e0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
134f0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 53  nstraintUsage[iS
13500 63 6f 70 65 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d  copeTerm].omit =
13510 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
13520 28 20 69 50 6c 61 6e 26 53 50 45 4c 4c 46 49 58  ( iPlan&SPELLFIX
13530 5f 49 44 58 4e 55 4d 5f 44 49 53 54 20 29 7b 0a  _IDXNUM_DIST ){.
13540 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
13550 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
13560 5b 69 44 69 73 74 54 65 72 6d 5d 2e 61 72 67 76  [iDistTerm].argv
13570 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20  Index = idx++;. 
13580 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61       pIdxInfo->a
13590 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
135a0 69 44 69 73 74 54 65 72 6d 5d 2e 6f 6d 69 74 20  iDistTerm].omit 
135b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
135c0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
135d0 65 64 43 6f 73 74 20 3d 20 31 65 35 3b 0a 20 20  edCost = 1e5;.  
135e0 7d 65 6c 73 65 20 69 66 28 20 28 69 50 6c 61 6e  }else if( (iPlan
135f0 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e   & SPELLFIX_IDXN
13600 55 4d 5f 52 4f 57 49 44 29 20 29 7b 0a 20 20 20  UM_ROWID) ){.   
13610 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
13620 6d 20 3d 20 53 50 45 4c 4c 46 49 58 5f 49 44 58  m = SPELLFIX_IDX
13630 4e 55 4d 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70  NUM_ROWID;.    p
13640 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
13650 61 69 6e 74 55 73 61 67 65 5b 69 52 6f 77 69 64  aintUsage[iRowid
13660 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20  Term].argvIndex 
13670 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 1;.    pIdxInf
13680 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
13690 61 67 65 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e  age[iRowidTerm].
136a0 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 70 49  omit = 1;.    pI
136b0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
136c0 64 43 6f 73 74 20 3d 20 35 3b 0a 20 20 7d 65 6c  dCost = 5;.  }el
136d0 73 65 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  se{.    pIdxInfo
136e0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
136f0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
13700 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 65 35 30  matedCost = 1e50
13710 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
13720 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13730 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 66 75  ** Open a new fu
13740 7a 7a 79 2d 73 65 61 72 63 68 20 63 75 72 73 6f  zzy-search curso
13750 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
13760 20 73 70 65 6c 6c 66 69 78 31 4f 70 65 6e 28 73   spellfix1Open(s
13770 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
13780 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ab, sqlite3_vtab
13790 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
137a0 6f 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  or){.  spellfix1
137b0 5f 76 74 61 62 20 2a 70 20 3d 20 28 73 70 65 6c  _vtab *p = (spel
137c0 6c 66 69 78 31 5f 76 74 61 62 2a 29 70 56 54 61  lfix1_vtab*)pVTa
137d0 62 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63  b;.  spellfix1_c
137e0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70  ursor *pCur;.  p
137f0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Cur = sqlite3_ma
13800 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
13810 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
13820 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Cur==0 ) return 
13830 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13840 6d 65 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20  memset(pCur, 0, 
13850 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a  sizeof(*pCur));.
13860 20 20 70 43 75 72 2d 3e 70 56 54 61 62 20 3d 20    pCur->pVTab = 
13870 70 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d  p;.  *ppCursor =
13880 20 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20   &pCur->base;.  
13890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
138a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
138b0 74 20 61 20 64 69 73 74 61 6e 63 65 20 6d 65 61  t a distance mea
138c0 73 75 72 65 6d 65 6e 74 20 62 79 20 74 68 65 20  surement by the 
138d0 77 6f 72 64 73 20 72 61 6e 6b 20 69 6e 20 6f 72  words rank in or
138e0 64 65 72 20 74 6f 20 73 68 6f 77 0a 2a 2a 20 70  der to show.** p
138f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 63 6f 6d  reference to com
13900 6d 6f 6e 20 77 6f 72 64 73 2e 0a 2a 2f 0a 73 74  mon words..*/.st
13910 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69  atic int spellfi
13920 78 31 53 63 6f 72 65 28 69 6e 74 20 69 44 69 73  x1Score(int iDis
13930 74 61 6e 63 65 2c 20 69 6e 74 20 69 52 61 6e 6b  tance, int iRank
13940 29 7b 0a 20 20 69 6e 74 20 69 4c 6f 67 32 3b 0a  ){.  int iLog2;.
13950 20 20 66 6f 72 28 69 4c 6f 67 32 3d 30 3b 20 69    for(iLog2=0; i
13960 52 61 6e 6b 3e 30 3b 20 69 4c 6f 67 32 2b 2b 2c  Rank>0; iLog2++,
13970 20 69 52 61 6e 6b 3e 3e 3d 31 29 7b 7d 0a 20 20   iRank>>=1){}.  
13980 72 65 74 75 72 6e 20 69 44 69 73 74 61 6e 63 65  return iDistance
13990 20 2b 20 33 32 20 2d 20 69 4c 6f 67 32 3b 0a 7d   + 32 - iLog2;.}
139a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
139b0 74 77 6f 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f  two spellfix1_ro
139c0 77 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 73 6f  w objects for so
139d0 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 69  rting purposes i
139e0 6e 20 71 73 6f 72 74 28 29 20 73 75 63 68 0a 2a  n qsort() such.*
139f0 2a 20 74 68 61 74 20 74 68 65 79 20 73 6f 72 74  * that they sort
13a00 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 69 6e 63   in order of inc
13a10 72 65 61 73 69 6e 67 20 64 69 73 74 61 6e 63 65  reasing distance
13a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a30 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 73 70 65  SQLITE_CDECL spe
13a40 6c 6c 66 69 78 31 52 6f 77 43 6f 6d 70 61 72 65  llfix1RowCompare
13a50 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 41 2c 20  (const void *A, 
13a60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 42 29 7b 0a  const void *B){.
13a70 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
13a80 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 61 20  pellfix1_row *a 
13a90 3d 20 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20  = (const struct 
13aa0 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 2a 29 41  spellfix1_row*)A
13ab0 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
13ac0 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a   spellfix1_row *
13ad0 62 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 75 63  b = (const struc
13ae0 74 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 2a  t spellfix1_row*
13af0 29 42 3b 0a 20 20 72 65 74 75 72 6e 20 61 2d 3e  )B;.  return a->
13b00 69 53 63 6f 72 65 20 2d 20 62 2d 3e 69 53 63 6f  iScore - b->iSco
13b10 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  re;.}../*.** A s
13b20 74 72 75 63 74 75 72 65 20 75 73 65 64 20 74 6f  tructure used to
13b30 20 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f   pass informatio
13b40 6e 20 66 72 6f 6d 20 73 70 65 6c 6c 66 69 78 31  n from spellfix1
13b50 46 69 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 29  FilterForMatch()
13b60 0a 2a 2a 20 69 6e 74 6f 20 73 70 65 6c 6c 66 69  .** into spellfi
13b70 78 31 52 75 6e 51 75 65 72 79 28 29 2e 0a 2a 2f  x1RunQuery()..*/
13b80 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
13b90 4d 61 74 63 68 51 75 65 72 79 20 7b 0a 20 20 73  MatchQuery {.  s
13ba0 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
13bb0 2a 70 43 75 72 3b 20 20 20 20 20 20 20 20 20 20  *pCur;          
13bc0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 62 65  /* The cursor be
13bd0 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
13be0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
13bf0 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
13c00 20 20 2f 2a 20 73 68 61 64 6f 77 20 74 61 62 6c    /* shadow tabl
13c10 65 20 71 75 65 72 79 20 73 74 61 74 6d 65 6e 74  e query statment
13c20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 48 61 73 68   */.  char zHash
13c30 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53  [SPELLFIX_MX_HAS
13c40 48 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 75  H];    /* The cu
13c50 72 72 65 6e 74 20 70 68 6f 6e 65 68 61 73 68 20  rrent phonehash 
13c60 66 6f 72 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a  for zPattern */.
13c70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
13c80 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20  attern;         
13c90 20 20 20 2f 2a 20 54 72 61 6e 73 6c 69 74 65 72     /* Transliter
13ca0 61 74 65 64 20 69 6e 70 75 74 20 73 74 72 69 6e  ated input strin
13cb0 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74  g */.  int nPatt
13cc0 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ern;            
13cd0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
13ce0 68 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f  h of zPattern */
13cf0 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  .  EditDist3From
13d00 53 74 72 69 6e 67 20 2a 70 4d 61 74 63 68 53 74  String *pMatchSt
13d10 72 33 3b 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20  r3; /* Original 
13d20 75 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 2a  unicode string *
13d30 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 6e  /.  EditDist3Con
13d40 66 69 67 20 2a 70 43 6f 6e 66 69 67 33 3b 20 20  fig *pConfig3;  
13d50 20 20 20 20 20 2f 2a 20 45 64 69 74 2d 64 69 73       /* Edit-dis
13d60 74 61 6e 63 65 20 63 6f 73 74 20 63 6f 65 66 66  tance cost coeff
13d70 69 63 69 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  icients */.  con
13d80 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  st EditDist3Lang
13d90 20 2a 70 4c 61 6e 67 3b 20 20 20 20 20 20 2f 2a   *pLang;      /*
13da0 20 54 68 65 20 73 65 6c 65 63 74 65 64 20 6c 61   The selected la
13db0 6e 67 75 61 67 65 20 63 6f 65 66 66 69 63 69 65  nguage coefficie
13dc0 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61  nts */.  int iLa
13dd0 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ng;             
13de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13df0 20 6c 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a   language id */.
13e00 20 20 69 6e 74 20 69 53 63 6f 70 65 3b 20 20 20    int iScope;   
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 63     /* Default sc
13e30 6f 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 61  ope */.  int iMa
13e40 78 44 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  xDist;          
13e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
13e60 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69  imum allowed edi
13e70 74 20 64 69 73 74 61 6e 63 65 2c 20 6f 72 20 2d  t distance, or -
13e80 31 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  1 */.  int rc;  
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
13eb0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
13ec0 52 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Run;            
13ed0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13ee0 6f 66 20 70 72 69 6f 72 20 72 75 6e 73 20 66 6f  of prior runs fo
13ef0 72 20 74 68 65 20 73 61 6d 65 20 7a 50 61 74 74  r the same zPatt
13f00 65 72 6e 20 2a 2f 0a 20 20 63 68 61 72 20 61 7a  ern */.  char az
13f10 50 72 69 6f 72 5b 53 50 45 4c 4c 46 49 58 5f 4d  Prior[SPELLFIX_M
13f20 58 5f 52 55 4e 5d 5b 53 50 45 4c 4c 46 49 58 5f  X_RUN][SPELLFIX_
13f30 4d 58 5f 48 41 53 48 5d 3b 20 20 2f 2a 20 50 72  MX_HASH];  /* Pr
13f40 69 6f 72 20 68 61 73 68 65 73 20 2a 2f 0a 7d 20  ior hashes */.} 
13f50 4d 61 74 63 68 51 75 65 72 79 3b 0a 0a 2f 2a 0a  MatchQuery;../*.
13f60 2a 2a 20 52 75 6e 20 61 20 71 75 65 72 79 20 6c  ** Run a query l
13f70 6f 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62  ooking for the b
13f80 65 73 74 20 6d 61 74 63 68 65 73 20 61 67 61 69  est matches agai
13f90 6e 73 74 20 7a 50 61 74 74 65 72 6e 20 75 73 69  nst zPattern usi
13fa0 6e 67 0a 2a 2a 20 7a 48 61 73 68 20 61 73 20 74  ng.** zHash as t
13fb0 68 65 20 63 68 61 72 61 63 74 65 72 20 63 6c 61  he character cla
13fc0 73 73 20 73 65 65 64 20 68 61 73 68 2e 0a 2a 2f  ss seed hash..*/
13fd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 70 65  .static void spe
13fe0 6c 6c 66 69 78 31 52 75 6e 51 75 65 72 79 28 4d  llfix1RunQuery(M
13ff0 61 74 63 68 51 75 65 72 79 20 2a 70 2c 20 63 6f  atchQuery *p, co
14000 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79  nst char *zQuery
14010 2c 20 69 6e 74 20 6e 51 75 65 72 79 29 7b 0a 20  , int nQuery){. 
14020 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 31   const char *zK1
14030 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
14040 7a 57 6f 72 64 3b 0a 20 20 69 6e 74 20 69 44 69  zWord;.  int iDi
14050 73 74 3b 0a 20 20 69 6e 74 20 69 52 61 6e 6b 3b  st;.  int iRank;
14060 0a 20 20 69 6e 74 20 69 53 63 6f 72 65 3b 0a 20  .  int iScore;. 
14070 20 69 6e 74 20 69 57 6f 72 73 74 20 3d 20 30 3b   int iWorst = 0;
14080 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
14090 74 20 69 64 78 57 6f 72 73 74 20 3d 20 2d 31 3b  t idxWorst = -1;
140a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
140b0 69 53 63 6f 70 65 20 3d 20 70 2d 3e 69 53 63 6f  iScope = p->iSco
140c0 70 65 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  pe;.  spellfix1_
140d0 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  cursor *pCur = p
140e0 2d 3e 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65  ->pCur;.  sqlite
140f0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
14100 70 2d 3e 70 53 74 6d 74 3b 0a 20 20 63 68 61 72  p->pStmt;.  char
14110 20 7a 48 61 73 68 31 5b 53 50 45 4c 4c 46 49 58   zHash1[SPELLFIX
14120 5f 4d 58 5f 48 41 53 48 5d 3b 0a 20 20 63 68 61  _MX_HASH];.  cha
14130 72 20 7a 48 61 73 68 32 5b 53 50 45 4c 4c 46 49  r zHash2[SPELLFI
14140 58 5f 4d 58 5f 48 41 53 48 5d 3b 0a 20 20 63 68  X_MX_HASH];.  ch
14150 61 72 20 2a 7a 43 6c 61 73 73 3b 0a 20 20 69 6e  ar *zClass;.  in
14160 74 20 6e 43 6c 61 73 73 3b 0a 20 20 69 6e 74 20  t nClass;.  int 
14170 72 63 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d  rc;..  if( pCur-
14180 3e 61 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29  >a==0 || p->rc )
14190 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 50 72   return;   /* Pr
141a0 69 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ior memory alloc
141b0 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f  ation failure */
141c0 0a 20 20 7a 43 6c 61 73 73 20 3d 20 28 63 68 61  .  zClass = (cha
141d0 72 2a 29 70 68 6f 6e 65 74 69 63 48 61 73 68 28  r*)phoneticHash(
141e0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
141f0 7a 51 75 65 72 79 2c 20 6e 51 75 65 72 79 29 3b  zQuery, nQuery);
14200 0a 20 20 69 66 28 20 7a 43 6c 61 73 73 3d 3d 30  .  if( zClass==0
14210 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
14220 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14230 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
14240 6e 43 6c 61 73 73 20 3d 20 28 69 6e 74 29 73 74  nClass = (int)st
14250 72 6c 65 6e 28 7a 43 6c 61 73 73 29 3b 0a 20 20  rlen(zClass);.  
14260 69 66 28 20 6e 43 6c 61 73 73 3e 53 50 45 4c 4c  if( nClass>SPELL
14270 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 20 29 7b  FIX_MX_HASH-2 ){
14280 0a 20 20 20 20 6e 43 6c 61 73 73 20 3d 20 53 50  .    nClass = SP
14290 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32  ELLFIX_MX_HASH-2
142a0 3b 0a 20 20 20 20 7a 43 6c 61 73 73 5b 6e 43 6c  ;.    zClass[nCl
142b0 61 73 73 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ass] = 0;.  }.  
142c0 69 66 28 20 6e 43 6c 61 73 73 3c 3d 69 53 63 6f  if( nClass<=iSco
142d0 70 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 43  pe ){.    if( nC
142e0 6c 61 73 73 3e 32 20 29 7b 0a 20 20 20 20 20 20  lass>2 ){.      
142f0 69 53 63 6f 70 65 20 3d 20 6e 43 6c 61 73 73 2d  iScope = nClass-
14300 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
14310 20 20 20 20 69 53 63 6f 70 65 20 3d 20 6e 43 6c      iScope = nCl
14320 61 73 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ass;.    }.  }. 
14330 20 6d 65 6d 63 70 79 28 7a 48 61 73 68 31 2c 20   memcpy(zHash1, 
14340 7a 43 6c 61 73 73 2c 20 69 53 63 6f 70 65 29 3b  zClass, iScope);
14350 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
14360 7a 43 6c 61 73 73 29 3b 0a 20 20 7a 48 61 73 68  zClass);.  zHash
14370 31 5b 69 53 63 6f 70 65 5d 20 3d 20 30 3b 0a 20  1[iScope] = 0;. 
14380 20 6d 65 6d 63 70 79 28 7a 48 61 73 68 32 2c 20   memcpy(zHash2, 
14390 7a 48 61 73 68 31 2c 20 69 53 63 6f 70 65 29 3b  zHash1, iScope);
143a0 0a 20 20 7a 48 61 73 68 32 5b 69 53 63 6f 70 65  .  zHash2[iScope
143b0 5d 20 3d 20 27 5a 27 3b 0a 20 20 7a 48 61 73 68  ] = 'Z';.  zHash
143c0 32 5b 69 53 63 6f 70 65 2b 31 5d 20 3d 20 30 3b  2[iScope+1] = 0;
143d0 0a 23 69 66 20 53 50 45 4c 4c 46 49 58 5f 4d 58  .#if SPELLFIX_MX
143e0 5f 52 55 4e 3e 31 0a 20 20 66 6f 72 28 69 3d 30  _RUN>1.  for(i=0
143f0 3b 20 69 3c 70 2d 3e 6e 52 75 6e 3b 20 69 2b 2b  ; i<p->nRun; i++
14400 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
14410 70 28 70 2d 3e 61 7a 50 72 69 6f 72 5b 69 5d 2c  p(p->azPrior[i],
14420 20 7a 48 61 73 68 31 29 3d 3d 30 20 29 20 72 65   zHash1)==0 ) re
14430 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
14440 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52  .  assert( p->nR
14450 75 6e 3c 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52  un<SPELLFIX_MX_R
14460 55 4e 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  UN );.  memcpy(p
14470 2d 3e 61 7a 50 72 69 6f 72 5b 70 2d 3e 6e 52 75  ->azPrior[p->nRu
14480 6e 2b 2b 5d 2c 20 7a 48 61 73 68 31 2c 20 69 53  n++], zHash1, iS
14490 63 6f 70 65 2b 31 29 3b 0a 20 20 69 66 28 20 73  cope+1);.  if( s
144a0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
144b0 28 70 53 74 6d 74 2c 20 31 2c 20 7a 48 61 73 68  (pStmt, 1, zHash
144c0 31 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  1, -1, SQLITE_ST
144d0 41 54 49 43 29 3d 3d 53 51 4c 49 54 45 5f 4e 4f  ATIC)==SQLITE_NO
144e0 4d 45 4d 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65  MEM.   || sqlite
144f0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
14500 74 2c 20 32 2c 20 7a 48 61 73 68 32 2c 20 2d 31  t, 2, zHash2, -1
14510 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14520 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  ==SQLITE_NOMEM. 
14530 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
14540 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14550 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 69    return;.  }.#i
14560 66 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55  f SPELLFIX_MX_RU
14570 4e 3e 31 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  N>1.  for(i=0; i
14580 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b  <pCur->nRow; i++
14590 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
145a0 3e 61 5b 69 5d 2e 69 53 63 6f 72 65 3e 69 57 6f  >a[i].iScore>iWo
145b0 72 73 74 20 29 7b 0a 20 20 20 20 20 20 69 57 6f  rst ){.      iWo
145c0 72 73 74 20 3d 20 70 43 75 72 2d 3e 61 5b 69 5d  rst = pCur->a[i]
145d0 2e 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 69  .iScore;.      i
145e0 64 78 57 6f 72 73 74 20 3d 20 69 3b 0a 20 20 20  dxWorst = i;.   
145f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
14600 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
14610 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
14620 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
14630 74 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 2d 31  t iMatchlen = -1
14640 3b 0a 20 20 20 20 69 52 61 6e 6b 20 3d 20 73 71  ;.    iRank = sq
14650 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
14660 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20  (pStmt, 2);.    
14670 69 66 28 20 70 2d 3e 70 4d 61 74 63 68 53 74 72  if( p->pMatchStr
14680 33 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  3 ){.      int n
14690 57 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  Word = sqlite3_c
146a0 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
146b0 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a 57 6f  t, 1);.      zWo
146c0 72 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rd = (const char
146d0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
146e0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
146f0 0a 20 20 20 20 20 20 69 44 69 73 74 20 3d 20 65  .      iDist = e
14700 64 69 74 44 69 73 74 33 43 6f 72 65 28 70 2d 3e  ditDist3Core(p->
14710 70 4d 61 74 63 68 53 74 72 33 2c 20 7a 57 6f 72  pMatchStr3, zWor
14720 64 2c 20 6e 57 6f 72 64 2c 20 70 2d 3e 70 4c 61  d, nWord, p->pLa
14730 6e 67 2c 20 26 69 4d 61 74 63 68 6c 65 6e 29 3b  ng, &iMatchlen);
14740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14750 20 20 7a 4b 31 20 3d 20 28 63 6f 6e 73 74 20 63    zK1 = (const c
14760 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
14770 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
14780 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4b  3);.      if( zK
14790 31 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  1==0 ) continue;
147a0 0a 20 20 20 20 20 20 69 44 69 73 74 20 3d 20 65  .      iDist = e
147b0 64 69 74 64 69 73 74 31 28 70 2d 3e 7a 50 61 74  ditdist1(p->zPat
147c0 74 65 72 6e 2c 20 7a 4b 31 2c 20 30 29 3b 0a 20  tern, zK1, 0);. 
147d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 69     }.    if( iDi
147e0 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  st<0 ){.      p-
147f0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
14800 45 4d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  EM;.      break;
14810 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
14820 3e 6e 53 65 61 72 63 68 2b 2b 3b 0a 20 20 20 20  >nSearch++;.    
14830 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
14840 20 69 73 20 61 20 22 64 69 73 74 61 6e 63 65 20   is a "distance 
14850 3c 20 24 64 69 73 74 22 20 6f 72 20 22 64 69 73  < $dist" or "dis
14860 74 61 6e 63 65 20 3c 3d 20 24 64 69 73 74 22 20  tance <= $dist" 
14870 63 6f 6e 73 74 72 61 69 6e 74 2c 0a 20 20 20 20  constraint,.    
14880 2a 2a 20 63 68 65 63 6b 20 69 66 20 74 68 69 73  ** check if this
14890 20 72 6f 77 20 6d 65 65 74 73 20 69 74 2e 20 49   row meets it. I
148a0 66 20 6e 6f 74 2c 20 6a 75 6d 70 20 62 61 63 6b  f not, jump back
148b0 20 75 70 20 74 6f 20 74 68 65 20 74 6f 70 20 6f   up to the top o
148c0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f  f the.    ** loo
148d0 70 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  p to process the
148e0 20 6e 65 78 74 20 72 6f 77 2e 20 4f 74 68 65 72   next row. Other
148f0 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 6f 77  wise, if the row
14900 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 65 0a   does match the.
14910 20 20 20 20 2a 2a 20 64 69 73 74 61 6e 63 65 20      ** distance 
14920 63 6f 6e 73 74 72 61 69 6e 74 2c 20 63 68 65 63  constraint, chec
14930 6b 20 69 66 20 74 68 65 20 70 43 75 72 2d 3e 61  k if the pCur->a
14940 5b 5d 20 61 72 72 61 79 20 69 73 20 61 6c 72 65  [] array is alre
14950 61 64 79 20 66 75 6c 6c 2e 0a 20 20 20 20 2a 2a  ady full..    **
14960 20 49 66 20 69 74 20 69 73 20 61 6e 64 20 6e 6f   If it is and no
14970 20 65 78 70 6c 69 63 69 74 20 22 74 6f 70 20 3d   explicit "top =
14980 20 3f 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 77   ?" constraint w
14990 61 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  as present in th
149a0 65 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20  e.    ** query, 
149b0 67 72 6f 77 20 74 68 65 20 61 72 72 61 79 20 74  grow the array t
149c0 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
149d0 73 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  s room for the n
149e0 65 77 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20  ew entry. */.   
149f0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 69 4d 61   assert( (p->iMa
14a00 78 44 69 73 74 3e 3d 30 29 3d 3d 28 28 70 43 75  xDist>=0)==((pCu
14a10 72 2d 3e 69 64 78 4e 75 6d 20 26 20 53 50 45 4c  r->idxNum & SPEL
14a20 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44 49 53 54  LFIX_IDXNUM_DIST
14a30 29 20 3f 20 31 20 3a 20 30 29 20 29 3b 0a 20 20  ) ? 1 : 0) );.  
14a40 20 20 69 66 28 20 70 2d 3e 69 4d 61 78 44 69 73    if( p->iMaxDis
14a50 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  t>=0 ){.      if
14a60 28 20 69 44 69 73 74 3e 70 2d 3e 69 4d 61 78 44  ( iDist>p->iMaxD
14a70 69 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ist ) continue;.
14a80 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
14a90 6e 52 6f 77 3e 3d 70 43 75 72 2d 3e 6e 41 6c 6c  nRow>=pCur->nAll
14aa0 6f 63 20 26 26 20 28 70 43 75 72 2d 3e 69 64 78  oc && (pCur->idx
14ab0 4e 75 6d 20 26 20 53 50 45 4c 4c 46 49 58 5f 49  Num & SPELLFIX_I
14ac0 44 58 4e 55 4d 5f 54 4f 50 29 3d 3d 30 20 29 7b  DXNUM_TOP)==0 ){
14ad0 0a 20 20 20 20 20 20 20 20 73 70 65 6c 6c 66 69  .        spellfi
14ae0 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28 70  x1ResizeCursor(p
14af0 43 75 72 2c 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f  Cur, pCur->nAllo
14b00 63 2a 32 20 2b 20 31 30 29 3b 0a 20 20 20 20 20  c*2 + 10);.     
14b10 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 3d 3d     if( pCur->a==
14b20 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
14b30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 53   }.    }..    iS
14b40 63 6f 72 65 20 3d 20 73 70 65 6c 6c 66 69 78 31  core = spellfix1
14b50 53 63 6f 72 65 28 69 44 69 73 74 2c 69 52 61 6e  Score(iDist,iRan
14b60 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  k);.    if( pCur
14b70 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c  ->nRow<pCur->nAl
14b80 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 64 78  loc ){.      idx
14b90 20 3d 20 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 20   = pCur->nRow;. 
14ba0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53 63     }else if( iSc
14bb0 6f 72 65 3c 69 57 6f 72 73 74 20 29 7b 0a 20 20  ore<iWorst ){.  
14bc0 20 20 20 20 69 64 78 20 3d 20 69 64 78 57 6f 72      idx = idxWor
14bd0 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
14be0 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 5b 69  3_free(pCur->a[i
14bf0 64 78 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20 20 20  dx].zWord);.    
14c00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
14c10 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
14c20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a    pCur->a[idx].z
14c30 57 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Word = sqlite3_m
14c40 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c  printf("%s", sql
14c50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
14c60 28 70 53 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20  (pStmt, 1));.   
14c70 20 69 66 28 20 70 43 75 72 2d 3e 61 5b 69 64 78   if( pCur->a[idx
14c80 5d 2e 7a 57 6f 72 64 3d 3d 30 20 29 7b 0a 20 20  ].zWord==0 ){.  
14c90 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
14ca0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
14cb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14cc0 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 52   pCur->a[idx].iR
14cd0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  owid = sqlite3_c
14ce0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
14cf0 74 2c 20 30 29 3b 0a 20 20 20 20 70 43 75 72 2d  t, 0);.    pCur-
14d00 3e 61 5b 69 64 78 5d 2e 69 52 61 6e 6b 20 3d 20  >a[idx].iRank = 
14d10 69 52 61 6e 6b 3b 0a 20 20 20 20 70 43 75 72 2d  iRank;.    pCur-
14d20 3e 61 5b 69 64 78 5d 2e 69 44 69 73 74 61 6e 63  >a[idx].iDistanc
14d30 65 20 3d 20 69 44 69 73 74 3b 0a 20 20 20 20 70  e = iDist;.    p
14d40 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 53 63 6f  Cur->a[idx].iSco
14d50 72 65 20 3d 20 69 53 63 6f 72 65 3b 0a 20 20 20  re = iScore;.   
14d60 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 4d   pCur->a[idx].iM
14d70 61 74 63 68 6c 65 6e 20 3d 20 69 4d 61 74 63 68  atchlen = iMatch
14d80 6c 65 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  len;.    memcpy(
14d90 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 48 61  pCur->a[idx].zHa
14da0 73 68 2c 20 7a 48 61 73 68 31 2c 20 69 53 63 6f  sh, zHash1, iSco
14db0 70 65 2b 31 29 3b 0a 20 20 20 20 69 66 28 20 70  pe+1);.    if( p
14dc0 43 75 72 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d 3e  Cur->nRow<pCur->
14dd0 6e 41 6c 6c 6f 63 20 29 20 70 43 75 72 2d 3e 6e  nAlloc ) pCur->n
14de0 52 6f 77 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Row++;.    if( p
14df0 43 75 72 2d 3e 6e 52 6f 77 3d 3d 70 43 75 72 2d  Cur->nRow==pCur-
14e00 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  >nAlloc ){.     
14e10 20 69 57 6f 72 73 74 20 3d 20 70 43 75 72 2d 3e   iWorst = pCur->
14e20 61 5b 30 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20  a[0].iScore;.   
14e30 20 20 20 69 64 78 57 6f 72 73 74 20 3d 20 30 3b     idxWorst = 0;
14e40 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
14e50 69 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b  i<pCur->nRow; i+
14e60 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 53 63 6f  +){.        iSco
14e70 72 65 20 3d 20 70 43 75 72 2d 3e 61 5b 69 5d 2e  re = pCur->a[i].
14e80 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 20 20  iScore;.        
14e90 69 66 28 20 69 57 6f 72 73 74 3c 69 53 63 6f 72  if( iWorst<iScor
14ea0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
14eb0 57 6f 72 73 74 20 3d 20 69 53 63 6f 72 65 3b 0a  Worst = iScore;.
14ec0 20 20 20 20 20 20 20 20 20 20 69 64 78 57 6f 72            idxWor
14ed0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
14ee0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
14ef0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
14f00 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
14f10 0a 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e 72  .  if( rc ) p->r
14f20 63 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c = rc;.}../*.**
14f30 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
14f40 20 74 68 65 20 78 46 69 6c 74 65 72 20 6d 65 74   the xFilter met
14f50 68 6f 64 20 77 6f 72 6b 20 69 66 20 74 68 65 20  hod work if the 
14f60 4d 41 54 43 48 20 74 65 72 6d 20 69 73 20 70 72  MATCH term is pr
14f70 65 73 65 6e 74 0a 2a 2a 20 61 6e 64 20 77 65 20  esent.** and we 
14f80 61 72 65 20 64 6f 69 6e 67 20 61 20 73 63 61 6e  are doing a scan
14f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14fa0 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46  spellfix1FilterF
14fb0 6f 72 4d 61 74 63 68 28 0a 20 20 73 70 65 6c 6c  orMatch(.  spell
14fc0 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75  fix1_cursor *pCu
14fd0 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  r,.  int argc,. 
14fe0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
14ff0 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
15000 64 78 4e 75 6d 20 3d 20 70 43 75 72 2d 3e 69 64  dxNum = pCur->id
15010 78 4e 75 6d 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  xNum;.  const un
15020 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4d 61  signed char *zMa
15030 74 63 68 54 68 69 73 3b 20 20 20 2f 2a 20 52 48  tchThis;   /* RH
15040 53 20 6f 66 20 74 68 65 20 4d 41 54 43 48 20 6f  S of the MATCH o
15050 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 64 69  perator */.  Edi
15060 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
15070 20 2a 70 4d 61 74 63 68 53 74 72 33 20 3d 20 30   *pMatchStr3 = 0
15080 3b 20 2f 2a 20 7a 4d 61 74 63 68 54 68 69 73 20  ; /* zMatchThis 
15090 61 73 20 61 6e 20 65 64 69 74 64 69 73 74 20 73  as an editdist s
150a0 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
150b0 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20  *zPattern;      
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
150d0 20 54 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e   Transliteration
150e0 20 6f 66 20 7a 4d 61 74 63 68 54 68 69 73 20 2a   of zMatchThis *
150f0 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e  /.  int nPattern
15100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15110 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
15120 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a   of zPattern */.
15130 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 32    int iLimit = 2
15140 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15150 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62       /* Max numb
15160 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75  er of rows of ou
15170 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  tput */.  int iS
15180 63 6f 70 65 20 3d 20 33 3b 20 20 20 20 20 20 20  cope = 3;       
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
151a0 55 73 65 20 74 68 69 73 20 6d 61 6e 79 20 63 68  Use this many ch
151b0 61 72 61 63 74 65 72 73 20 6f 66 20 7a 43 6c 61  aracters of zCla
151c0 73 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  ss */.  int iLan
151d0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
151e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
151f0 6e 67 75 61 67 65 20 63 6f 64 65 20 2a 2f 0a 20  nguage code */. 
15200 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15220 20 20 20 20 2f 2a 20 53 51 4c 20 6f 66 20 73 68      /* SQL of sh
15230 61 64 6f 77 20 74 61 62 6c 65 20 71 75 65 72 79  adow table query
15240 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
15250 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
15260 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 64           /* Shad
15270 6f 77 20 74 61 62 6c 65 20 71 75 65 72 79 20 2a  ow table query *
15280 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
152b0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
152c0 64 78 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  dx = 1;         
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
152e0 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
152f0 66 69 6c 74 65 72 20 70 61 72 61 6d 65 74 65 72  filter parameter
15300 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f   */.  spellfix1_
15310 76 74 61 62 20 2a 70 20 3d 20 70 43 75 72 2d 3e  vtab *p = pCur->
15320 70 56 54 61 62 3b 20 20 20 2f 2a 20 54 68 65 20  pVTab;   /* The 
15330 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
15340 61 74 20 6f 77 6e 73 20 70 43 75 72 20 2a 2f 0a  at owns pCur */.
15350 20 20 4d 61 74 63 68 51 75 65 72 79 20 78 3b 20    MatchQuery x; 
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 20 20 2f 2a 20 46 6f 72 20 70 61 73 73       /* For pass
15380 69 6e 67 20 69 6e 66 6f 20 74 6f 20 52 75 6e 51  ing info to RunQ
15390 75 65 72 79 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  uery() */..  /* 
153a0 4c 6f 61 64 20 74 68 65 20 63 6f 73 74 20 74 61  Load the cost ta
153b0 62 6c 65 20 69 66 20 77 65 20 68 61 76 65 20 6e  ble if we have n
153c0 6f 74 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20  ot already done 
153d0 73 6f 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 7a  so */.  if( p->z
153e0 43 6f 73 74 54 61 62 6c 65 21 3d 30 20 26 26 20  CostTable!=0 && 
153f0 70 2d 3e 70 43 6f 6e 66 69 67 33 3d 3d 30 20 29  p->pConfig3==0 )
15400 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67  {.    p->pConfig
15410 33 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  3 = sqlite3_mall
15420 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 70 2d 3e  oc64( sizeof(p->
15430 70 43 6f 6e 66 69 67 33 5b 30 5d 29 20 29 3b 0a  pConfig3[0]) );.
15440 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66      if( p->pConf
15450 69 67 33 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ig3==0 ) return 
15460 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15470 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 43 6f 6e    memset(p->pCon
15480 66 69 67 33 2c 20 30 2c 20 73 69 7a 65 6f 66 28  fig3, 0, sizeof(
15490 70 2d 3e 70 43 6f 6e 66 69 67 33 5b 30 5d 29 29  p->pConfig3[0]))
154a0 3b 0a 20 20 20 20 72 63 20 3d 20 65 64 69 74 44  ;.    rc = editD
154b0 69 73 74 33 43 6f 6e 66 69 67 4c 6f 61 64 28 70  ist3ConfigLoad(p
154c0 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 70 2d 3e 64  ->pConfig3, p->d
154d0 62 2c 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65  b, p->zCostTable
154e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
154f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
15500 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73   memset(&x, 0, s
15510 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 78 2e 69  izeof(x));.  x.i
15520 53 63 6f 70 65 20 3d 20 33 3b 20 20 2f 2a 20 44  Scope = 3;  /* D
15530 65 66 61 75 6c 74 20 73 63 6f 70 65 20 69 66 20  efault scope if 
15540 6e 6f 6e 65 20 73 70 65 63 69 66 69 65 64 20 62  none specified b
15550 79 20 22 57 48 45 52 45 20 73 63 6f 70 65 3d 4e  y "WHERE scope=N
15560 22 20 2a 2f 0a 20 20 78 2e 69 4d 61 78 44 69 73  " */.  x.iMaxDis
15570 74 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 4d 61 78  t = -1;   /* Max
15580 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69  imum allowed edi
15590 74 20 64 69 73 74 61 6e 63 65 20 2a 2f 0a 0a 20  t distance */.. 
155a0 20 69 66 28 20 69 64 78 4e 75 6d 26 32 20 29 7b   if( idxNum&2 ){
155b0 0a 20 20 20 20 69 4c 61 6e 67 20 3d 20 73 71 6c  .    iLang = sql
155c0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
155d0 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 7d  rgv[idx++]);.  }
155e0 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 26 34 20  .  if( idxNum&4 
155f0 29 7b 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  ){.    iLimit = 
15600 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
15610 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a  t(argv[idx++]);.
15620 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 31      if( iLimit<1
15630 20 29 20 69 4c 69 6d 69 74 20 3d 20 31 3b 0a 20   ) iLimit = 1;. 
15640 20 7d 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 26   }.  if( idxNum&
15650 38 20 29 7b 0a 20 20 20 20 78 2e 69 53 63 6f 70  8 ){.    x.iScop
15660 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  e = sqlite3_valu
15670 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b  e_int(argv[idx++
15680 5d 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 69 53  ]);.    if( x.iS
15690 63 6f 70 65 3c 31 20 29 20 78 2e 69 53 63 6f 70  cope<1 ) x.iScop
156a0 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 78  e = 1;.    if( x
156b0 2e 69 53 63 6f 70 65 3e 53 50 45 4c 4c 46 49 58  .iScope>SPELLFIX
156c0 5f 4d 58 5f 48 41 53 48 2d 32 20 29 20 78 2e 69  _MX_HASH-2 ) x.i
156d0 53 63 6f 70 65 20 3d 20 53 50 45 4c 4c 46 49 58  Scope = SPELLFIX
156e0 5f 4d 58 5f 48 41 53 48 2d 32 3b 0a 20 20 7d 0a  _MX_HASH-2;.  }.
156f0 20 20 69 66 28 20 69 64 78 4e 75 6d 26 28 31 36    if( idxNum&(16
15700 7c 33 32 29 20 29 7b 0a 20 20 20 20 78 2e 69 4d  |32) ){.    x.iM
15710 61 78 44 69 73 74 20 3d 20 73 71 6c 69 74 65 33  axDist = sqlite3
15720 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
15730 69 64 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28  idx++]);.    if(
15740 20 69 64 78 4e 75 6d 26 31 36 20 29 20 78 2e 69   idxNum&16 ) x.i
15750 4d 61 78 44 69 73 74 2d 2d 3b 0a 20 20 20 20 69  MaxDist--;.    i
15760 66 28 20 78 2e 69 4d 61 78 44 69 73 74 3c 30 20  f( x.iMaxDist<0 
15770 29 20 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 30  ) x.iMaxDist = 0
15780 3b 0a 20 20 7d 0a 20 20 73 70 65 6c 6c 66 69 78  ;.  }.  spellfix
15790 31 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75  1ResetCursor(pCu
157a0 72 29 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 52  r);.  spellfix1R
157b0 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72  esizeCursor(pCur
157c0 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 7a 4d 61  , iLimit);.  zMa
157d0 74 63 68 54 68 69 73 20 3d 20 73 71 6c 69 74 65  tchThis = sqlite
157e0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
157f0 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 4d 61  v[0]);.  if( zMa
15800 74 63 68 54 68 69 73 3d 3d 30 20 29 20 72 65 74  tchThis==0 ) ret
15810 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15820 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 33   if( p->pConfig3
15830 20 29 7b 0a 20 20 20 20 78 2e 70 4c 61 6e 67 20   ){.    x.pLang 
15840 3d 20 65 64 69 74 44 69 73 74 33 46 69 6e 64 4c  = editDist3FindL
15850 61 6e 67 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c  ang(p->pConfig3,
15860 20 69 4c 61 6e 67 29 3b 0a 20 20 20 20 70 4d 61   iLang);.    pMa
15870 74 63 68 53 74 72 33 20 3d 20 65 64 69 74 44 69  tchStr3 = editDi
15880 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77  st3FromStringNew
15890 28 78 2e 70 4c 61 6e 67 2c 20 28 63 6f 6e 73 74  (x.pLang, (const
158a0 20 63 68 61 72 2a 29 7a 4d 61 74 63 68 54 68 69   char*)zMatchThi
158b0 73 2c 20 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  s, -1);.    if( 
158c0 70 4d 61 74 63 68 53 74 72 33 3d 3d 30 20 29 7b  pMatchStr3==0 ){
158d0 0a 20 20 20 20 20 20 78 2e 72 63 20 3d 20 53 51  .      x.rc = SQ
158e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
158f0 20 20 67 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78    goto filter_ex
15900 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  it;.    }.  }els
15910 65 7b 0a 20 20 20 20 78 2e 70 4c 61 6e 67 20 3d  e{.    x.pLang =
15920 20 30 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 74 65   0;.  }.  zPatte
15930 72 6e 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e  rn = (char*)tran
15940 73 6c 69 74 65 72 61 74 65 28 7a 4d 61 74 63 68  sliterate(zMatch
15950 54 68 69 73 2c 20 73 71 6c 69 74 65 33 5f 76 61  This, sqlite3_va
15960 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
15970 5d 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ]));.  sqlite3_f
15980 72 65 65 28 70 43 75 72 2d 3e 7a 50 61 74 74 65  ree(pCur->zPatte
15990 72 6e 29 3b 0a 20 20 70 43 75 72 2d 3e 7a 50 61  rn);.  pCur->zPa
159a0 74 74 65 72 6e 20 3d 20 7a 50 61 74 74 65 72 6e  ttern = zPattern
159b0 3b 0a 20 20 69 66 28 20 7a 50 61 74 74 65 72 6e  ;.  if( zPattern
159c0 3d 3d 30 20 29 7b 0a 20 20 20 20 78 2e 72 63 20  ==0 ){.    x.rc 
159d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
159e0 20 20 20 20 67 6f 74 6f 20 66 69 6c 74 65 72 5f      goto filter_
159f0 65 78 69 74 3b 0a 20 20 7d 0a 20 20 6e 50 61 74  exit;.  }.  nPat
15a00 74 65 72 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  tern = (int)strl
15a10 65 6e 28 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  en(zPattern);.  
15a20 69 66 28 20 7a 50 61 74 74 65 72 6e 5b 6e 50 61  if( zPattern[nPa
15a30 74 74 65 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 20  ttern-1]=='*' ) 
15a40 6e 50 61 74 74 65 72 6e 2d 2d 3b 0a 20 20 7a 53  nPattern--;.  zS
15a50 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
15a60 69 6e 74 66 28 0a 20 20 20 20 20 22 53 45 4c 45  intf(.     "SELE
15a70 43 54 20 69 64 2c 20 77 6f 72 64 2c 20 72 61 6e  CT id, word, ran
15a80 6b 2c 20 63 6f 61 6c 65 73 63 65 28 6b 31 2c 77  k, coalesce(k1,w
15a90 6f 72 64 29 22 0a 20 20 20 20 20 22 20 20 46 52  ord)".     "  FR
15aa0 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76  OM \"%w\".\"%w_v
15ab0 6f 63 61 62 5c 22 22 0a 20 20 20 20 20 22 20 57  ocab\"".     " W
15ac0 48 45 52 45 20 6c 61 6e 67 69 64 3d 25 64 20 41  HERE langid=%d A
15ad0 4e 44 20 6b 32 3e 3d 3f 31 20 41 4e 44 20 6b 32  ND k2>=?1 AND k2
15ae0 3c 3f 32 22 2c 0a 20 20 20 20 20 70 2d 3e 7a 44  <?2",.     p->zD
15af0 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65  bName, p->zTable
15b00 4e 61 6d 65 2c 20 69 4c 61 6e 67 0a 20 20 29 3b  Name, iLang.  );
15b10 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
15b20 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c  {.    x.rc = SQL
15b30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
15b40 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 67 6f  Stmt = 0;.    go
15b50 74 6f 20 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a  to filter_exit;.
15b60 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
15b70 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
15b80 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
15b90 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
15ba0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
15bb0 0a 20 20 70 43 75 72 2d 3e 69 4c 61 6e 67 20 3d  .  pCur->iLang =
15bc0 20 69 4c 61 6e 67 3b 0a 20 20 78 2e 70 43 75 72   iLang;.  x.pCur
15bd0 20 3d 20 70 43 75 72 3b 0a 20 20 78 2e 70 53 74   = pCur;.  x.pSt
15be0 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 78 2e  mt = pStmt;.  x.
15bf0 7a 50 61 74 74 65 72 6e 20 3d 20 7a 50 61 74 74  zPattern = zPatt
15c00 65 72 6e 3b 0a 20 20 78 2e 6e 50 61 74 74 65 72  ern;.  x.nPatter
15c10 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  n = nPattern;.  
15c20 78 2e 70 4d 61 74 63 68 53 74 72 33 20 3d 20 70  x.pMatchStr3 = p
15c30 4d 61 74 63 68 53 74 72 33 3b 0a 20 20 78 2e 69  MatchStr3;.  x.i
15c40 4c 61 6e 67 20 3d 20 69 4c 61 6e 67 3b 0a 20 20  Lang = iLang;.  
15c50 78 2e 72 63 20 3d 20 72 63 3b 0a 20 20 78 2e 70  x.rc = rc;.  x.p
15c60 43 6f 6e 66 69 67 33 20 3d 20 70 2d 3e 70 43 6f  Config3 = p->pCo
15c70 6e 66 69 67 33 3b 0a 20 20 69 66 28 20 78 2e 72  nfig3;.  if( x.r
15c80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15c90 20 20 20 20 73 70 65 6c 6c 66 69 78 31 52 75 6e      spellfix1Run
15ca0 51 75 65 72 79 28 26 78 2c 20 7a 50 61 74 74 65  Query(&x, zPatte
15cb0 72 6e 2c 20 6e 50 61 74 74 65 72 6e 29 3b 0a 20  rn, nPattern);. 
15cc0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
15cd0 61 20 29 7b 0a 20 20 20 20 71 73 6f 72 74 28 70  a ){.    qsort(p
15ce0 43 75 72 2d 3e 61 2c 20 70 43 75 72 2d 3e 6e 52  Cur->a, pCur->nR
15cf0 6f 77 2c 20 73 69 7a 65 6f 66 28 70 43 75 72 2d  ow, sizeof(pCur-
15d00 3e 61 5b 30 5d 29 2c 20 73 70 65 6c 6c 66 69 78  >a[0]), spellfix
15d10 31 52 6f 77 43 6f 6d 70 61 72 65 29 3b 0a 20 20  1RowCompare);.  
15d20 20 20 70 43 75 72 2d 3e 69 54 6f 70 20 3d 20 69    pCur->iTop = i
15d30 4c 69 6d 69 74 3b 0a 20 20 20 20 70 43 75 72 2d  Limit;.    pCur-
15d40 3e 69 53 63 6f 70 65 20 3d 20 69 53 63 6f 70 65  >iScope = iScope
15d50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
15d60 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  .rc = SQLITE_NOM
15d70 45 4d 3b 0a 20 20 7d 0a 0a 66 69 6c 74 65 72 5f  EM;.  }..filter_
15d80 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  exit:.  sqlite3_
15d90 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
15da0 0a 20 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d  .  editDist3From
15db0 53 74 72 69 6e 67 44 65 6c 65 74 65 28 70 4d 61  StringDelete(pMa
15dc0 74 63 68 53 74 72 33 29 3b 0a 20 20 72 65 74 75  tchStr3);.  retu
15dd0 72 6e 20 78 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn x.rc;.}../*.*
15de0 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
15df0 66 20 78 46 69 6c 74 65 72 20 68 61 6e 64 6c 65  f xFilter handle
15e00 73 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73  s a full-table s
15e10 63 61 6e 20 63 61 73 65 0a 2a 2f 0a 73 74 61 74  can case.*/.stat
15e20 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
15e30 46 69 6c 74 65 72 46 6f 72 46 75 6c 6c 53 63 61  FilterForFullSca
15e40 6e 28 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63  n(.  spellfix1_c
15e50 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 69  ursor *pCur,.  i
15e60 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
15e70 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
15e80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15e90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
15ea0 64 78 4e 75 6d 20 3d 20 70 43 75 72 2d 3e 69 64  dxNum = pCur->id
15eb0 78 4e 75 6d 3b 0a 20 20 63 68 61 72 20 2a 7a 53  xNum;.  char *zS
15ec0 71 6c 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  ql;.  spellfix1_
15ed0 76 74 61 62 20 2a 70 56 54 61 62 20 3d 20 70 43  vtab *pVTab = pC
15ee0 75 72 2d 3e 70 56 54 61 62 3b 0a 20 20 73 70 65  ur->pVTab;.  spe
15ef0 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f  llfix1ResetCurso
15f00 72 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72  r(pCur);.  asser
15f10 74 28 20 69 64 78 4e 75 6d 3d 3d 30 20 7c 7c 20  t( idxNum==0 || 
15f20 69 64 78 4e 75 6d 3d 3d 36 34 20 29 3b 0a 20 20  idxNum==64 );.  
15f30 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
15f40 70 72 69 6e 74 66 28 0a 20 20 20 20 20 22 53 45  printf(.     "SE
15f50 4c 45 43 54 20 77 6f 72 64 2c 20 72 61 6e 6b 2c  LECT word, rank,
15f60 20 4e 55 4c 4c 2c 20 6c 61 6e 67 69 64 2c 20 69   NULL, langid, i
15f70 64 20 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22  d FROM \"%w\".\"
15f80 25 77 5f 76 6f 63 61 62 5c 22 25 73 22 2c 0a 20  %w_vocab\"%s",. 
15f90 20 20 20 20 70 56 54 61 62 2d 3e 7a 44 62 4e 61      pVTab->zDbNa
15fa0 6d 65 2c 20 70 56 54 61 62 2d 3e 7a 54 61 62 6c  me, pVTab->zTabl
15fb0 65 4e 61 6d 65 2c 0a 20 20 20 20 20 28 28 69 64  eName,.     ((id
15fc0 78 4e 75 6d 20 26 20 36 34 29 20 3f 20 22 20 57  xNum & 64) ? " W
15fd0 48 45 52 45 20 72 6f 77 69 64 3d 3f 22 20 3a 20  HERE rowid=?" : 
15fe0 22 22 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a  "").  );.  if( z
15ff0 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
16000 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
16010 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
16020 70 61 72 65 5f 76 32 28 70 56 54 61 62 2d 3e 64  pare_v2(pVTab->d
16030 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
16040 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 30  ur->pFullScan, 0
16050 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
16060 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 72  e(zSql);.  if( r
16070 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
16080 28 69 64 78 4e 75 6d 20 26 20 36 34 29 20 29 7b  (idxNum & 64) ){
16090 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 72 67  .    assert( arg
160a0 63 3d 3d 31 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==1 );.    rc =
160b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61   sqlite3_bind_va
160c0 6c 75 65 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53  lue(pCur->pFullS
160d0 63 61 6e 2c 20 31 2c 20 61 72 67 76 5b 30 5d 29  can, 1, argv[0])
160e0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 6e 52  ;.  }.  pCur->nR
160f0 6f 77 20 3d 20 70 43 75 72 2d 3e 69 52 6f 77 20  ow = pCur->iRow 
16100 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
16110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16120 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
16130 70 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  p(pCur->pFullSca
16140 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  n);.    if( rc==
16150 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 20 70 43  SQLITE_ROW ){ pC
16160 75 72 2d 3e 69 52 6f 77 20 3d 20 2d 31 3b 20 72  ur->iRow = -1; r
16170 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d  c = SQLITE_OK; }
16180 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16190 49 54 45 5f 44 4f 4e 45 20 29 7b 20 72 63 20 3d  ITE_DONE ){ rc =
161a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20   SQLITE_OK; }.  
161b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
161c0 3e 69 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  >iRow = 0;.  }. 
161d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
161e0 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 74 6f 20  /*.** Called to 
161f0 22 72 65 77 69 6e 64 22 20 61 20 63 75 72 73 6f  "rewind" a curso
16200 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  r back to the be
16210 67 69 6e 6e 69 6e 67 20 73 6f 20 74 68 61 74 0a  ginning so that.
16220 2a 2a 20 69 74 20 73 74 61 72 74 73 20 69 74 73  ** it starts its
16230 20 6f 75 74 70 75 74 20 6f 76 65 72 20 61 67 61   output over aga
16240 69 6e 2e 20 20 41 6c 77 61 79 73 20 63 61 6c 6c  in.  Always call
16250 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  ed at least once
16260 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 6e 79  .** prior to any
16270 20 73 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e   spellfix1Column
16280 2c 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64  , spellfix1Rowid
16290 2c 20 6f 72 20 73 70 65 6c 6c 66 69 78 31 45 6f  , or spellfix1Eo
162a0 66 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  f call..*/.stati
162b0 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46  c int spellfix1F
162c0 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
162d0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
162e0 72 2c 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  r, .  int idxNum
162f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
16300 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
16310 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
16320 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 70 65 6c  **argv.){.  spel
16330 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
16340 75 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f  ur = (spellfix1_
16350 63 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20  cursor *)cur;.  
16360 69 6e 74 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e  int rc;.  pCur->
16370 69 64 78 4e 75 6d 20 3d 20 69 64 78 4e 75 6d 3b  idxNum = idxNum;
16380 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20 26 20  .  if( idxNum & 
16390 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 70  1 ){.    rc = sp
163a0 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72  ellfix1FilterFor
163b0 4d 61 74 63 68 28 70 43 75 72 2c 20 61 72 67 63  Match(pCur, argc
163c0 2c 20 61 72 67 76 29 3b 0a 20 20 7d 65 6c 73 65  , argv);.  }else
163d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 70 65 6c 6c  {.    rc = spell
163e0 66 69 78 31 46 69 6c 74 65 72 46 6f 72 46 75 6c  fix1FilterForFul
163f0 6c 53 63 61 6e 28 70 43 75 72 2c 20 61 72 67 63  lScan(pCur, argc
16400 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 20 20 72  , argv);.  }.  r
16410 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
16420 0a 2a 2a 20 41 64 76 61 6e 63 65 20 61 20 63 75  .** Advance a cu
16430 72 73 6f 72 20 74 6f 20 69 74 73 20 6e 65 78 74  rsor to its next
16440 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 0a 2a   row of output.*
16450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
16460 6c 6c 66 69 78 31 4e 65 78 74 28 73 71 6c 69 74  llfix1Next(sqlit
16470 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
16480 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  cur){.  spellfix
16490 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  1_cursor *pCur =
164a0 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73   (spellfix1_curs
164b0 6f 72 20 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20  or *)cur;.  int 
164c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
164d0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 52 6f 77    if( pCur->iRow
164e0 20 3c 20 70 43 75 72 2d 3e 6e 52 6f 77 20 29 7b   < pCur->nRow ){
164f0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
16500 46 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20  FullScan ){.    
16510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
16520 74 65 70 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53  tep(pCur->pFullS
16530 63 61 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  can);.      if( 
16540 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
16550 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 70 43   pCur->iRow = pC
16560 75 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20  ur->nRow;.      
16570 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
16580 4f 57 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OW || rc==SQLITE
16590 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
165a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
165b0 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  e{.      pCur->i
165c0 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Row++;.    }.  }
165d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
165e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
165f0 55 45 20 69 66 20 77 65 20 61 72 65 20 61 74 20  UE if we are at 
16600 74 68 65 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 0a  the end-of-file.
16610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
16620 65 6c 6c 66 69 78 31 45 6f 66 28 73 71 6c 69 74  ellfix1Eof(sqlit
16630 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
16640 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  cur){.  spellfix
16650 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  1_cursor *pCur =
16660 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73   (spellfix1_curs
16670 6f 72 20 2a 29 63 75 72 3b 0a 20 20 72 65 74 75  or *)cur;.  retu
16680 72 6e 20 70 43 75 72 2d 3e 69 52 6f 77 3e 3d 70  rn pCur->iRow>=p
16690 43 75 72 2d 3e 6e 52 6f 77 3b 0a 7d 0a 0a 2f 2a  Cur->nRow;.}../*
166a0 0a 2a 2a 20 52 65 74 75 72 6e 20 63 6f 6c 75 6d  .** Return colum
166b0 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ns from the curr
166c0 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ent row..*/.stat
166d0 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
166e0 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
166f0 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
16700 75 72 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ur,.  sqlite3_co
16710 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e  ntext *ctx,.  in
16720 74 20 69 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69  t i.){.  spellfi
16730 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  x1_cursor *pCur 
16740 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  = (spellfix1_cur
16750 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20  sor*)cur;.  if( 
16760 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20  pCur->pFullScan 
16770 29 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d 53 50  ){.    if( i<=SP
16780 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49  ELLFIX_COL_LANGI
16790 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
167a0 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
167b0 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ctx, sqlite3_col
167c0 75 6d 6e 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e  umn_value(pCur->
167d0 70 46 75 6c 6c 53 63 61 6e 2c 20 69 29 29 3b 0a  pFullScan, i));.
167e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
167f0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
16800 6e 75 6c 6c 28 63 74 78 29 3b 0a 20 20 20 20 7d  null(ctx);.    }
16810 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16820 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 77 69  TE_OK;.  }.  swi
16830 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61  tch( i ){.    ca
16840 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
16850 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  WORD: {.      sq
16860 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
16870 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70  t(ctx, pCur->a[p
16880 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64  Cur->iRow].zWord
16890 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
168a0 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  TIC);.      brea
168b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
168c0 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52  e SPELLFIX_COL_R
168d0 41 4e 4b 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ANK: {.      sql
168e0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
168f0 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75  ctx, pCur->a[pCu
16900 72 2d 3e 69 52 6f 77 5d 2e 69 52 61 6e 6b 29 3b  r->iRow].iRank);
16910 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16920 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45    }.    case SPE
16930 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e  LLFIX_COL_DISTAN
16940 43 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CE: {.      sqli
16950 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
16960 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72  tx, pCur->a[pCur
16970 2d 3e 69 52 6f 77 5d 2e 69 44 69 73 74 61 6e 63  ->iRow].iDistanc
16980 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
16990 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
169a0 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e  SPELLFIX_COL_LAN
169b0 47 49 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  GID: {.      sql
169c0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
169d0 63 74 78 2c 20 70 43 75 72 2d 3e 69 4c 61 6e 67  ctx, pCur->iLang
169e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
169f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
16a00 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52  PELLFIX_COL_SCOR
16a10 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
16a20 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
16a30 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d  x, pCur->a[pCur-
16a40 3e 69 52 6f 77 5d 2e 69 53 63 6f 72 65 29 3b 0a  >iRow].iScore);.
16a50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16a60 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c   }.    case SPEL
16a70 4c 46 49 58 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45  LFIX_COL_MATCHLE
16a80 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  N: {.      int i
16a90 4d 61 74 63 68 6c 65 6e 20 3d 20 70 43 75 72 2d  Matchlen = pCur-
16aa0 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69  >a[pCur->iRow].i
16ab0 4d 61 74 63 68 6c 65 6e 3b 0a 20 20 20 20 20 20  Matchlen;.      
16ac0 69 66 28 20 69 4d 61 74 63 68 6c 65 6e 3c 30 20  if( iMatchlen<0 
16ad0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
16ae0 50 61 74 74 65 72 6e 20 3d 20 28 69 6e 74 29 73  Pattern = (int)s
16af0 74 72 6c 65 6e 28 70 43 75 72 2d 3e 7a 50 61 74  trlen(pCur->zPat
16b00 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20 20 63  tern);.        c
16b10 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 70 43 75  har *zWord = pCu
16b20 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d  r->a[pCur->iRow]
16b30 2e 7a 57 6f 72 64 3b 0a 20 20 20 20 20 20 20 20  .zWord;.        
16b40 69 6e 74 20 6e 57 6f 72 64 20 3d 20 28 69 6e 74  int nWord = (int
16b50 29 73 74 72 6c 65 6e 28 7a 57 6f 72 64 29 3b 0a  )strlen(zWord);.
16b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
16b70 74 74 65 72 6e 3e 30 20 26 26 20 70 43 75 72 2d  ttern>0 && pCur-
16b80 3e 7a 50 61 74 74 65 72 6e 5b 6e 50 61 74 74 65  >zPattern[nPatte
16b90 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20  rn-1]=='*' ){.  
16ba0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
16bb0 72 61 6e 73 6c 69 74 3b 0a 20 20 20 20 20 20 20  ranslit;.       
16bc0 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
16bd0 20 20 20 20 20 20 7a 54 72 61 6e 73 6c 69 74 20        zTranslit 
16be0 3d 20 28 63 68 61 72 20 2a 29 74 72 61 6e 73 6c  = (char *)transl
16bf0 69 74 65 72 61 74 65 28 28 75 6e 73 69 67 6e 65  iterate((unsigne
16c00 64 20 63 68 61 72 20 2a 29 7a 57 6f 72 64 2c 20  d char *)zWord, 
16c10 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  nWord);.        
16c20 20 20 69 66 28 20 21 7a 54 72 61 6e 73 6c 69 74    if( !zTranslit
16c30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16c40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
16c50 20 20 72 65 73 20 3d 20 65 64 69 74 64 69 73 74    res = editdist
16c60 31 28 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e  1(pCur->zPattern
16c70 2c 20 7a 54 72 61 6e 73 6c 69 74 2c 20 26 69 4d  , zTranslit, &iM
16c80 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20  atchlen);.      
16c90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16ca0 28 7a 54 72 61 6e 73 6c 69 74 29 3b 0a 20 20 20  (zTranslit);.   
16cb0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30         if( res<0
16cc0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16cd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
16ce0 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 74 72    iMatchlen = tr
16cf0 61 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65  anslen_to_charle
16d00 6e 28 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20  n(zWord, nWord, 
16d10 69 4d 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20  iMatchlen);.    
16d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16d30 20 20 20 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d       iMatchlen =
16d40 20 75 74 66 38 43 68 61 72 6c 65 6e 28 7a 57 6f   utf8Charlen(zWo
16d50 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20  rd, nWord);.    
16d60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
16d70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
16d80 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 69 4d 61  ult_int(ctx, iMa
16d90 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62  tchlen);.      b
16da0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16db0 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  case SPELLFIX_CO
16dc0 4c 5f 50 48 4f 4e 45 48 41 53 48 3a 20 7b 0a 20  L_PHONEHASH: {. 
16dd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
16de0 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 43  ult_text(ctx, pC
16df0 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77  ur->a[pCur->iRow
16e00 5d 2e 7a 48 61 73 68 2c 20 2d 31 2c 20 53 51 4c  ].zHash, -1, SQL
16e10 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
16e20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16e30 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49      case SPELLFI
16e40 58 5f 43 4f 4c 5f 54 4f 50 3a 20 7b 0a 20 20 20  X_COL_TOP: {.   
16e50 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
16e60 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d  t_int(ctx, pCur-
16e70 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 62 72  >iTop);.      br
16e80 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16e90 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ase SPELLFIX_COL
16ea0 5f 53 43 4f 50 45 3a 20 7b 0a 20 20 20 20 20 20  _SCOPE: {.      
16eb0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
16ec0 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 69 53  nt(ctx, pCur->iS
16ed0 63 6f 70 65 29 3b 0a 20 20 20 20 20 20 62 72 65  cope);.      bre
16ee0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
16ef0 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
16f00 53 52 43 48 43 4e 54 3a 20 7b 0a 20 20 20 20 20  SRCHCNT: {.     
16f10 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
16f20 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 6e  int(ctx, pCur->n
16f30 53 65 61 72 63 68 29 3b 0a 20 20 20 20 20 20 62  Search);.      b
16f40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
16f50 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
16f60 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
16f70 6e 75 6c 6c 28 63 74 78 29 3b 0a 20 20 20 20 20  null(ctx);.     
16f80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16f90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16fa0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
16fb0 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61  he rowid..*/.sta
16fc0 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
16fd0 31 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76  1Rowid(sqlite3_v
16fe0 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
16ff0 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
17000 52 6f 77 69 64 29 7b 0a 20 20 73 70 65 6c 6c 66  Rowid){.  spellf
17010 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
17020 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75   = (spellfix1_cu
17030 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66 28  rsor*)cur;.  if(
17040 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e   pCur->pFullScan
17050 20 29 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64 20   ){.    *pRowid 
17060 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
17070 5f 69 6e 74 36 34 28 70 43 75 72 2d 3e 70 46 75  _int64(pCur->pFu
17080 6c 6c 53 63 61 6e 2c 20 34 29 3b 0a 20 20 7d 65  llScan, 4);.  }e
17090 6c 73 65 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64  lse{.    *pRowid
170a0 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d   = pCur->a[pCur-
170b0 3e 69 52 6f 77 5d 2e 69 52 6f 77 69 64 3b 0a 20  >iRow].iRowid;. 
170c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
170d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
170e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
170f0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 78   called by the x
17100 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 2e  Update() method.
17110 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 73 74   It returns a st
17120 72 69 6e 67 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69  ring.** containi
17130 6e 67 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 20  ng the conflict 
17140 6d 6f 64 65 20 74 68 61 74 20 78 55 70 64 61 74  mode that xUpdat
17150 65 28 29 20 73 68 6f 75 6c 64 20 75 73 65 20 66  e() should use f
17160 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  or the current.*
17170 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65  * operation. One
17180 20 6f 66 3a 20 22 52 4f 4c 4c 42 41 43 4b 22 2c   of: "ROLLBACK",
17190 20 22 49 47 4e 4f 52 45 22 2c 20 22 41 42 4f 52   "IGNORE", "ABOR
171a0 54 22 20 6f 72 20 22 52 45 50 4c 41 43 45 22 2e  T" or "REPLACE".
171b0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
171c0 20 63 68 61 72 20 2a 73 70 65 6c 6c 66 69 78 31   char *spellfix1
171d0 47 65 74 43 6f 6e 66 6c 69 63 74 28 73 71 6c 69  GetConflict(sqli
171e0 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
171f0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
17200 7a 43 6f 6e 66 6c 69 63 74 5b 5d 20 3d 20 7b 0a  zConflict[] = {.
17210 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 49 6e 73      /* Note: Ins
17220 74 65 61 64 20 6f 66 20 22 46 41 49 4c 22 20 2d  tead of "FAIL" -
17230 20 22 41 42 4f 52 54 22 2e 20 2a 2f 0a 20 20 20   "ABORT". */.   
17240 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 22 49 47   "ROLLBACK", "IG
17250 4e 4f 52 45 22 2c 20 22 41 42 4f 52 54 22 2c 20  NORE", "ABORT", 
17260 22 41 42 4f 52 54 22 2c 20 22 52 45 50 4c 41 43  "ABORT", "REPLAC
17270 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 65 43  E".  };.  int eC
17280 6f 6e 66 6c 69 63 74 20 3d 20 73 71 6c 69 74 65  onflict = sqlite
17290 33 5f 76 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69  3_vtab_on_confli
172a0 63 74 28 64 62 29 3b 0a 0a 20 20 61 73 73 65 72  ct(db);..  asser
172b0 74 28 20 65 43 6f 6e 66 6c 69 63 74 3d 3d 53 51  t( eConflict==SQ
172c0 4c 49 54 45 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  LITE_ROLLBACK ||
172d0 20 65 43 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49   eConflict==SQLI
172e0 54 45 5f 49 47 4e 4f 52 45 0a 20 20 20 20 20 20  TE_IGNORE.      
172f0 20 7c 7c 20 65 43 6f 6e 66 6c 69 63 74 3d 3d 53   || eConflict==S
17300 51 4c 49 54 45 5f 46 41 49 4c 20 7c 7c 20 65 43  QLITE_FAIL || eC
17310 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f  onflict==SQLITE_
17320 41 42 4f 52 54 0a 20 20 20 20 20 20 20 7c 7c 20  ABORT.       || 
17330 65 43 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54  eConflict==SQLIT
17340 45 5f 52 45 50 4c 41 43 45 0a 20 20 29 3b 0a 20  E_REPLACE.  );. 
17350 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
17360 52 4f 4c 4c 42 41 43 4b 3d 3d 31 20 29 3b 0a 20  ROLLBACK==1 );. 
17370 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
17380 49 47 4e 4f 52 45 3d 3d 32 20 29 3b 0a 20 20 61  IGNORE==2 );.  a
17390 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 41  ssert( SQLITE_FA
173a0 49 4c 3d 3d 33 20 29 3b 0a 20 20 61 73 73 65 72  IL==3 );.  asser
173b0 74 28 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3d  t( SQLITE_ABORT=
173c0 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
173d0 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 3d 3d  SQLITE_REPLACE==
173e0 35 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  5 );..  return a
173f0 7a 43 6f 6e 66 6c 69 63 74 5b 65 43 6f 6e 66 6c  zConflict[eConfl
17400 69 63 74 2d 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ict-1];.}../*.**
17410 20 54 68 65 20 78 55 70 64 61 74 65 28 29 20 6d   The xUpdate() m
17420 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ethod..*/.static
17430 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 55 70   int spellfix1Up
17440 64 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  date(.  sqlite3_
17450 76 74 61 62 20 2a 70 56 54 61 62 2c 0a 20 20 69  vtab *pVTab,.  i
17460 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
17470 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 2c  e3_value **argv,
17480 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
17490 2a 70 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74  *pRowid.){.  int
174a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
174b0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
174c0 20 72 6f 77 69 64 2c 20 6e 65 77 52 6f 77 69 64   rowid, newRowid
174d0 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  ;.  spellfix1_vt
174e0 61 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69  ab *p = (spellfi
174f0 78 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a  x1_vtab*)pVTab;.
17500 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17510 70 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 61 72  p->db;..  if( ar
17520 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20  gc==1 ){.    /* 
17530 41 20 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69  A delete operati
17540 6f 6e 20 6f 6e 20 74 68 65 20 72 6f 77 69 64 20  on on the rowid 
17550 67 69 76 65 6e 20 62 79 20 61 72 67 76 5b 30 5d  given by argv[0]
17560 20 2a 2f 0a 20 20 20 20 72 6f 77 69 64 20 3d 20   */.    rowid = 
17570 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  *pRowid = sqlite
17580 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
17590 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73 70 65 6c  gv[0]);.    spel
175a0 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c  lfix1DbExec(&rc,
175b0 20 64 62 2c 20 22 44 45 4c 45 54 45 20 46 52 4f   db, "DELETE FRO
175c0 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f  M \"%w\".\"%w_vo
175d0 63 61 62 5c 22 20 22 0a 20 20 20 20 20 20 20 20  cab\" ".        
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 20 20 22 20 57 48 45 52 45 20 69 64 3d 25 6c     " WHERE id=%l
17600 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ld",.           
17610 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d         p->zDbNam
17620 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65  e, p->zTableName
17630 2c 20 72 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73  , rowid);.  }els
17640 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e{.    const uns
17650 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 57 6f 72  igned char *zWor
17660 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
17670 65 5f 74 65 78 74 28 61 72 67 76 5b 53 50 45 4c  e_text(argv[SPEL
17680 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d  LFIX_COL_WORD+2]
17690 29 3b 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72 64  );.    int nWord
176a0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
176b0 5f 62 79 74 65 73 28 61 72 67 76 5b 53 50 45 4c  _bytes(argv[SPEL
176c0 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d  LFIX_COL_WORD+2]
176d0 29 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67  );.    int iLang
176e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
176f0 5f 69 6e 74 28 61 72 67 76 5b 53 50 45 4c 4c 46  _int(argv[SPELLF
17700 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 2b 32 5d  IX_COL_LANGID+2]
17710 29 3b 0a 20 20 20 20 69 6e 74 20 69 52 61 6e 6b  );.    int iRank
17720 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
17730 5f 69 6e 74 28 61 72 67 76 5b 53 50 45 4c 4c 46  _int(argv[SPELLF
17740 49 58 5f 43 4f 4c 5f 52 41 4e 4b 2b 32 5d 29 3b  IX_COL_RANK+2]);
17750 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
17760 6e 65 64 20 63 68 61 72 20 2a 7a 53 6f 75 6e 64  ned char *zSound
17770 73 6c 69 6b 65 20 3d 0a 20 20 20 20 20 20 20 20  slike =.        
17780 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
17790 5f 74 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c  _text(argv[SPELL
177a0 46 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49  FIX_COL_SOUNDSLI
177b0 4b 45 2b 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20  KE+2]);.    int 
177c0 6e 53 6f 75 6e 64 73 6c 69 6b 65 20 3d 20 73 71  nSoundslike = sq
177d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
177e0 73 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  s(argv[SPELLFIX_
177f0 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b 32  COL_SOUNDSLIKE+2
17800 5d 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b  ]);.    char *zK
17810 31 2c 20 2a 7a 4b 32 3b 0a 20 20 20 20 69 6e 74  1, *zK2;.    int
17820 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a   i;.    char c;.
17830 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
17840 7a 43 6f 6e 66 6c 69 63 74 20 3d 20 73 70 65 6c  zConflict = spel
17850 6c 66 69 78 31 47 65 74 43 6f 6e 66 6c 69 63 74  lfix1GetConflict
17860 28 64 62 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a  (db);..    if( z
17870 57 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Word==0 ){.     
17880 20 2f 2a 20 49 6e 73 65 72 74 73 20 6f 66 20 74   /* Inserts of t
17890 68 65 20 66 6f 72 6d 3a 20 20 49 4e 53 45 52 54  he form:  INSERT
178a0 20 49 4e 54 4f 20 74 61 62 6c 65 28 63 6f 6d 6d   INTO table(comm
178b0 61 6e 64 29 20 56 41 4c 55 45 53 28 27 78 79 7a  and) VALUES('xyz
178c0 7a 79 27 29 3b 0a 20 20 20 20 20 20 2a 2a 20 63  zy');.      ** c
178d0 61 75 73 65 20 7a 57 6f 72 64 20 74 6f 20 62 65  ause zWord to be
178e0 20 4e 55 4c 4c 2c 20 73 6f 20 77 65 20 6c 6f 6f   NULL, so we loo
178f0 6b 20 61 74 20 74 68 65 20 22 63 6f 6d 6d 61 6e  k at the "comman
17900 64 22 20 63 6f 6c 75 6d 6e 20 74 6f 20 73 65 65  d" column to see
17910 0a 20 20 20 20 20 20 2a 2a 20 77 68 61 74 20 73  .      ** what s
17920 70 65 63 69 61 6c 20 61 63 74 69 6f 6e 73 20 74  pecial actions t
17930 6f 20 74 61 6b 65 20 2a 2f 0a 20 20 20 20 20 20  o take */.      
17940 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64  const char *zCmd
17950 20 3d 20 0a 20 20 20 20 20 20 20 20 20 28 63 6f   = .         (co
17960 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
17970 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
17980 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43  v[SPELLFIX_COL_C
17990 4f 4d 4d 41 4e 44 2b 32 5d 29 3b 0a 20 20 20 20  OMMAND+2]);.    
179a0 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 7b    if( zCmd==0 ){
179b0 0a 20 20 20 20 20 20 20 20 70 56 54 61 62 2d 3e  .        pVTab->
179c0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
179d0 33 5f 6d 70 72 69 6e 74 66 28 22 4e 4f 54 20 4e  3_mprintf("NOT N
179e0 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  ULL constraint f
179f0 61 69 6c 65 64 3a 20 25 73 2e 77 6f 72 64 22 2c  ailed: %s.word",
17a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 61            p->zTa
17a30 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  bleName);.      
17a40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17a50 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
17a60 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
17a70 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
17a80 64 2c 22 72 65 73 65 74 22 29 3d 3d 30 20 29 7b  d,"reset")==0 ){
17a90 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65  .        /* Rese
17aa0 74 20 74 68 65 20 20 65 64 69 74 20 63 6f 73 74  t the  edit cost
17ab0 20 74 61 62 6c 65 20 28 69 66 20 74 68 65 72 65   table (if there
17ac0 20 69 73 20 6f 6e 65 29 2e 20 2a 2f 0a 20 20 20   is one). */.   
17ad0 20 20 20 20 20 65 64 69 74 44 69 73 74 33 43 6f       editDist3Co
17ae0 6e 66 69 67 44 65 6c 65 74 65 28 70 2d 3e 70 43  nfigDelete(p->pC
17af0 6f 6e 66 69 67 33 29 3b 0a 20 20 20 20 20 20 20  onfig3);.       
17b00 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d 20 30   p->pConfig3 = 0
17b10 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
17b20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17b30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74    }.      if( st
17b40 72 6e 63 6d 70 28 7a 43 6d 64 2c 22 65 64 69 74  rncmp(zCmd,"edit
17b50 5f 63 6f 73 74 5f 74 61 62 6c 65 3d 22 2c 31 36  _cost_table=",16
17b60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
17b70 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44  editDist3ConfigD
17b80 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69 67  elete(p->pConfig
17b90 33 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  3);.        p->p
17ba0 43 6f 6e 66 69 67 33 20 3d 20 30 3b 0a 20 20 20  Config3 = 0;.   
17bb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
17bc0 65 28 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29  e(p->zCostTable)
17bd0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 43 6f  ;.        p->zCo
17be0 73 74 54 61 62 6c 65 20 3d 20 73 70 65 6c 6c 66  stTable = spellf
17bf0 69 78 31 44 65 71 75 6f 74 65 28 7a 43 6d 64 2b  ix1Dequote(zCmd+
17c00 31 36 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  16);.        if(
17c10 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d   p->zCostTable==
17c20 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
17c30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
17c40 20 69 66 28 20 70 2d 3e 7a 43 6f 73 74 54 61 62   if( p->zCostTab
17c50 6c 65 5b 30 5d 3d 3d 30 20 7c 7c 20 73 71 6c 69  le[0]==0 || sqli
17c60 74 65 33 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a  te3_stricmp(p->z
17c70 43 6f 73 74 54 61 62 6c 65 2c 22 6e 75 6c 6c 22  CostTable,"null"
17c80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
17c90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17ca0 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20  ->zCostTable);. 
17cb0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 43 6f 73           p->zCos
17cc0 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  tTable = 0;.    
17cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
17ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 56        }.      pV
17d00 54 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73  Tab->zErrMsg = s
17d10 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
17d20 75 6e 6b 6e 6f 77 6e 20 76 61 6c 75 65 20 66 6f  unknown value fo
17d30 72 20 25 73 2e 63 6f 6d 6d 61 6e 64 3a 20 5c 22  r %s.command: \"
17d40 25 77 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %w\"",.         
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
17d70 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 43 6d  >zTableName, zCm
17d80 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
17d90 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17da0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 52 61     }.    if( iRa
17db0 6e 6b 3c 31 20 29 20 69 52 61 6e 6b 20 3d 20 31  nk<1 ) iRank = 1
17dc0 3b 0a 20 20 20 20 69 66 28 20 7a 53 6f 75 6e 64  ;.    if( zSound
17dd0 73 6c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 7a  slike ){.      z
17de0 4b 31 20 3d 20 28 63 68 61 72 2a 29 74 72 61 6e  K1 = (char*)tran
17df0 73 6c 69 74 65 72 61 74 65 28 7a 53 6f 75 6e 64  sliterate(zSound
17e00 73 6c 69 6b 65 2c 20 6e 53 6f 75 6e 64 73 6c 69  slike, nSoundsli
17e10 6b 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ke);.    }else{.
17e20 20 20 20 20 20 20 7a 4b 31 20 3d 20 28 63 68 61        zK1 = (cha
17e30 72 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74 65  r*)transliterate
17e40 28 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a  (zWord, nWord);.
17e50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4b      }.    if( zK
17e60 31 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  1==0 ) return SQ
17e70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17e80 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 4b  for(i=0; (c = zK
17e90 31 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  1[i])!=0; i++){.
17ea0 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 27 41         if( c>='A
17eb0 27 20 26 26 20 63 3c 3d 27 5a 27 20 29 20 7a 4b  ' && c<='Z' ) zK
17ec0 31 5b 69 5d 20 2b 3d 20 27 61 27 20 2d 20 27 41  1[i] += 'a' - 'A
17ed0 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4b 32  ';.    }.    zK2
17ee0 20 3d 20 28 63 68 61 72 2a 29 70 68 6f 6e 65 74   = (char*)phonet
17ef0 69 63 48 61 73 68 28 28 63 6f 6e 73 74 20 75 6e  icHash((const un
17f00 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 4b 31  signed char*)zK1
17f10 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 7a 4b  , i);.    if( zK
17f20 32 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  2==0 ){.      sq
17f30 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b 31 29 3b  lite3_free(zK1);
17f40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
17f50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17f60 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
17f70 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
17f80 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[0])==SQLITE_NU
17f90 4c 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LL ){.      if( 
17fa0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
17fb0 70 65 28 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c  pe(argv[1])==SQL
17fc0 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_NULL ){.    
17fd0 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45      spellfix1DbE
17fe0 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20  xec(&rc, db,.   
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53              "INS
18000 45 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 2e  ERT INTO \"%w\".
18010 5c 22 25 77 5f 76 6f 63 61 62 5c 22 28 72 61 6e  \"%w_vocab\"(ran
18020 6b 2c 6c 61 6e 67 69 64 2c 77 6f 72 64 2c 6b 31  k,langid,word,k1
18030 2c 6b 32 29 20 22 0a 20 20 20 20 20 20 20 20 20  ,k2) ".         
18040 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 25 64        "VALUES(%d
18050 2c 25 64 2c 25 51 2c 6e 75 6c 6c 69 66 28 25 51  ,%d,%Q,nullif(%Q
18060 2c 25 51 29 2c 25 51 29 22 2c 0a 20 20 20 20 20  ,%Q),%Q)",.     
18070 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62            p->zDb
18080 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e  Name, p->zTableN
18090 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
180a0 20 20 20 20 69 52 61 6e 6b 2c 20 69 4c 61 6e 67      iRank, iLang
180b0 2c 20 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 57  , zWord, zK1, zW
180c0 6f 72 64 2c 20 7a 4b 32 0a 20 20 20 20 20 20 20  ord, zK2.       
180d0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
180e0 0a 20 20 20 20 20 20 20 20 6e 65 77 52 6f 77 69  .        newRowi
180f0 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
18100 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29  e_int64(argv[1])
18110 3b 0a 20 20 20 20 20 20 20 20 73 70 65 6c 6c 66  ;.        spellf
18120 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64  ix1DbExec(&rc, d
18130 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  b,.            "
18140 49 4e 53 45 52 54 20 4f 52 20 25 73 20 49 4e 54  INSERT OR %s INT
18150 4f 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f  O \"%w\".\"%w_vo
18160 63 61 62 5c 22 28 69 64 2c 72 61 6e 6b 2c 6c 61  cab\"(id,rank,la
18170 6e 67 69 64 2c 77 6f 72 64 2c 6b 31 2c 6b 32 29  ngid,word,k1,k2)
18180 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
18190 56 41 4c 55 45 53 28 25 6c 6c 64 2c 25 64 2c 25  VALUES(%lld,%d,%
181a0 64 2c 25 51 2c 6e 75 6c 6c 69 66 28 25 51 2c 25  d,%Q,nullif(%Q,%
181b0 51 29 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20  Q),%Q)",.       
181c0 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
181d0 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a  p->zDbName, p->z
181e0 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
181f0 20 20 20 20 20 20 20 6e 65 77 52 6f 77 69 64 2c         newRowid,
18200 20 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20 7a   iRank, iLang, z
18210 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 57 6f 72 64  Word, zK1, zWord
18220 2c 20 7a 4b 32 0a 20 20 20 20 20 20 20 20 29 3b  , zK2.        );
18230 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
18240 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  pRowid = sqlite3
18250 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
18260 69 64 28 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73  id(db);.    }els
18270 65 7b 0a 20 20 20 20 20 20 72 6f 77 69 64 20 3d  e{.      rowid =
18280 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
18290 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20  nt64(argv[0]);. 
182a0 20 20 20 20 20 6e 65 77 52 6f 77 69 64 20 3d 20       newRowid = 
182b0 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  *pRowid = sqlite
182c0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
182d0 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 73 70  gv[1]);.      sp
182e0 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72  ellfix1DbExec(&r
182f0 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20  c, db,.         
18300 20 20 20 20 22 55 50 44 41 54 45 20 4f 52 20 25      "UPDATE OR %
18310 73 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f  s \"%w\".\"%w_vo
18320 63 61 62 5c 22 20 53 45 54 20 69 64 3d 25 6c 6c  cab\" SET id=%ll
18330 64 2c 20 72 61 6e 6b 3d 25 64 2c 20 6c 61 6e 67  d, rank=%d, lang
18340 69 64 3d 25 64 2c 22 0a 20 20 20 20 20 20 20 20  id=%d,".        
18350 20 20 20 20 20 22 20 77 6f 72 64 3d 25 51 2c 20       " word=%Q, 
18360 6b 31 3d 6e 75 6c 6c 69 66 28 25 51 2c 25 51 29  k1=nullif(%Q,%Q)
18370 2c 20 6b 32 3d 25 51 20 57 48 45 52 45 20 69 64  , k2=%Q WHERE id
18380 3d 25 6c 6c 64 22 2c 0a 20 20 20 20 20 20 20 20  =%lld",.        
18390 20 20 20 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20       zConflict, 
183a0 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a  p->zDbName, p->z
183b0 54 61 62 6c 65 4e 61 6d 65 2c 20 6e 65 77 52 6f  TableName, newRo
183c0 77 69 64 2c 20 69 52 61 6e 6b 2c 20 69 4c 61 6e  wid, iRank, iLan
183d0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
183e0 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 57 6f 72  zWord, zK1, zWor
183f0 64 2c 20 7a 4b 32 2c 20 72 6f 77 69 64 0a 20 20  d, zK2, rowid.  
18400 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
18410 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b   sqlite3_free(zK
18420 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
18430 66 72 65 65 28 7a 4b 32 29 3b 0a 20 20 7d 0a 20  free(zK2);.  }. 
18440 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18450 2a 0a 2a 2a 20 52 65 6e 61 6d 65 20 74 68 65 20  *.** Rename the 
18460 73 70 65 6c 6c 66 69 78 31 20 74 61 62 6c 65 2e  spellfix1 table.
18470 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18480 70 65 6c 6c 66 69 78 31 52 65 6e 61 6d 65 28 73  pellfix1Rename(s
18490 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
184a0 61 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ab, const char *
184b0 7a 4e 65 77 29 7b 0a 20 20 73 70 65 6c 6c 66 69  zNew){.  spellfi
184c0 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28 73 70  x1_vtab *p = (sp
184d0 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29 70 56  ellfix1_vtab*)pV
184e0 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
184f0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
18500 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18510 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61  ;.  char *zNewNa
18520 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  me = sqlite3_mpr
18530 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 65 77 29  intf("%s", zNew)
18540 3b 0a 20 20 69 66 28 20 7a 4e 65 77 4e 61 6d 65  ;.  if( zNewName
18550 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
18560 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18570 20 20 7d 0a 20 20 73 70 65 6c 6c 66 69 78 31 44    }.  spellfix1D
18580 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 0a  bExec(&rc, db, .
18590 20 20 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c       "ALTER TABL
185a0 45 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f  E \"%w\".\"%w_vo
185b0 63 61 62 5c 22 20 52 45 4e 41 4d 45 20 54 4f 20  cab\" RENAME TO 
185c0 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22 2c 0a 20  \"%w_vocab\"",. 
185d0 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20      p->zDbName, 
185e0 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  p->zTableName, z
185f0 4e 65 77 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69  NewName.  );.  i
18600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18620 66 72 65 65 28 70 2d 3e 7a 54 61 62 6c 65 4e 61  free(p->zTableNa
18630 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 61 62  me);.    p->zTab
18640 6c 65 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d  leName = zNewNam
18650 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
18660 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65  sqlite3_free(zNe
18670 77 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65  wName);.  }.  re
18680 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
18690 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62  ** A virtual tab
186a0 6c 65 20 6d 6f 64 75 6c 65 20 74 68 61 74 20 70  le module that p
186b0 72 6f 76 69 64 65 73 20 66 75 7a 7a 79 20 73 65  rovides fuzzy se
186c0 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arch..*/.static 
186d0 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 73  sqlite3_module s
186e0 70 65 6c 6c 66 69 78 31 4d 6f 64 75 6c 65 20 3d  pellfix1Module =
186f0 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20   {.  0,         
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18710 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73   iVersion */.  s
18720 70 65 6c 6c 66 69 78 31 43 72 65 61 74 65 2c 20  pellfix1Create, 
18730 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61          /* xCrea
18740 74 65 20 2d 20 68 61 6e 64 6c 65 20 43 52 45 41  te - handle CREA
18750 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
18760 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43   */.  spellfix1C
18770 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f  onnect,        /
18780 2a 20 78 43 6f 6e 6e 65 63 74 20 2d 20 72 65 63  * xConnect - rec
18790 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 6e 20 65  onnected to an e
187a0 78 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f  xisting table */
187b0 0a 20 20 73 70 65 6c 6c 66 69 78 31 42 65 73 74  .  spellfix1Best
187c0 49 6e 64 65 78 2c 20 20 20 20 20 20 2f 2a 20 78  Index,      /* x
187d0 42 65 73 74 49 6e 64 65 78 20 2d 20 66 69 67 75  BestIndex - figu
187e0 72 65 20 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f  re out how to do
187f0 20 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 70   a query */.  sp
18800 65 6c 6c 66 69 78 31 44 69 73 63 6f 6e 6e 65 63  ellfix1Disconnec
18810 74 2c 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f  t,     /* xDisco
18820 6e 6e 65 63 74 20 2d 20 63 6c 6f 73 65 20 61 20  nnect - close a 
18830 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
18840 73 70 65 6c 6c 66 69 78 31 44 65 73 74 72 6f 79  spellfix1Destroy
18850 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73  ,        /* xDes
18860 74 72 6f 79 20 2d 20 68 61 6e 64 6c 65 20 44 52  troy - handle DR
18870 4f 50 20 54 41 42 4c 45 20 2a 2f 0a 20 20 73 70  OP TABLE */.  sp
18880 65 6c 6c 66 69 78 31 4f 70 65 6e 2c 20 20 20 20  ellfix1Open,    
18890 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
188a0 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
188b0 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 6c  */.  spellfix1Cl
188c0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
188d0 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
188e0 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 70  a cursor */.  sp
188f0 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 2c 20 20  ellfix1Filter,  
18900 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
18910 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
18920 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
18930 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 4e 65 78  /.  spellfix1Nex
18940 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
18950 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20  xNext - advance 
18960 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 70  a cursor */.  sp
18970 65 6c 6c 66 69 78 31 45 6f 66 2c 20 20 20 20 20  ellfix1Eof,     
18980 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d         /* xEof -
18990 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f   check for end o
189a0 66 20 73 63 61 6e 20 2a 2f 0a 20 20 73 70 65 6c  f scan */.  spel
189b0 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c 20 20 20 20  lfix1Column,    
189c0 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20       /* xColumn 
189d0 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
189e0 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64 2c   spellfix1Rowid,
189f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
18a00 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20  wid - read data 
18a10 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 55 70  */.  spellfix1Up
18a20 64 61 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  date,         /*
18a30 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c   xUpdate */.  0,
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a50 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e         /* xBegin
18a60 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a80 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20  * xSync */.  0, 
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18aa0 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
18ab0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18ad0 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  * xRollback */. 
18ae0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
18af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
18b00 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 70  ndMethod */.  sp
18b10 65 6c 6c 66 69 78 31 52 65 6e 61 6d 65 2c 20 20  ellfix1Rename,  
18b20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
18b30 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
18b40 65 67 69 73 74 65 72 20 74 68 65 20 76 61 72 69  egister the vari
18b50 6f 75 73 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ous functions an
18b60 64 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  d the virtual ta
18b70 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
18b80 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 65 67 69  nt spellfix1Regi
18b90 73 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62  ster(sqlite3 *db
18ba0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18bb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
18bc0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18bd0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
18be0 28 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f  (db, "spellfix1_
18bf0 74 72 61 6e 73 6c 69 74 22 2c 20 31 2c 0a 20 20  translit", 1,.  
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
18c20 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
18c30 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
18c40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c60 20 20 74 72 61 6e 73 6c 69 74 65 72 61 74 65 53    transliterateS
18c70 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
18c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18c90 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
18ca0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
18cb0 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c  nction(db, "spel
18cc0 6c 66 69 78 31 5f 65 64 69 74 64 69 73 74 22 2c  lfix1_editdist",
18cd0 20 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   2,.            
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
18d00 7c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e  |SQLITE_DETERMIN
18d10 49 53 54 49 43 2c 20 30 2c 0a 20 20 20 20 20 20  ISTIC, 0,.      
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d30 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
18d40 64 69 73 74 53 71 6c 46 75 6e 63 2c 20 30 2c 20  distSqlFunc, 0, 
18d50 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
18d60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18d70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
18d80 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
18d90 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 70  db, "spellfix1_p
18da0 68 6f 6e 65 68 61 73 68 22 2c 20 31 2c 0a 20 20  honehash", 1,.  
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18dd0 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54  QLITE_UTF8|SQLIT
18de0 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
18df0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e10 20 20 20 20 20 20 70 68 6f 6e 65 74 69 63 48 61        phoneticHa
18e20 73 68 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29  shSqlFunc, 0, 0)
18e30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
18e40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18e50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
18e60 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
18e70 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 73 63 72  , "spellfix1_scr
18e80 69 70 74 63 6f 64 65 22 2c 20 31 2c 0a 20 20 20  iptcode", 1,.   
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18eb0 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54  QLITE_UTF8|SQLIT
18ec0 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
18ed0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
18ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ef0 20 20 20 20 20 20 73 63 72 69 70 74 43 6f 64 65        scriptCode
18f00 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
18f10 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
18f20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18f30 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
18f40 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73  te_module(db, "s
18f50 70 65 6c 6c 66 69 78 31 22 2c 20 26 73 70 65 6c  pellfix1", &spel
18f60 6c 66 69 78 31 4d 6f 64 75 6c 65 2c 20 30 29 3b  lfix1Module, 0);
18f70 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
18f80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18f90 72 63 20 3d 20 65 64 69 74 44 69 73 74 33 49 6e  rc = editDist3In
18fa0 73 74 61 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 0a  stall(db);.  }..
18fb0 20 20 2f 2a 20 56 65 72 69 66 79 20 73 61 6e 69    /* Verify sani
18fc0 74 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73 6c  ty of the transl
18fd0 69 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  it[] table */.  
18fe0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
18ff0 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65  f(translit)/size
19000 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 2d  of(translit[0])-
19010 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  1; i++){.    ass
19020 65 72 74 28 20 74 72 61 6e 73 6c 69 74 5b 69 5d  ert( translit[i]
19030 2e 63 46 72 6f 6d 3c 74 72 61 6e 73 6c 69 74 5b  .cFrom<translit[
19040 69 2b 31 5d 2e 63 46 72 6f 6d 20 29 3b 0a 20 20  i+1].cFrom );.  
19050 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
19060 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
19070 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19080 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
19090 45 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20 66  Extension load f
190a0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64  unction..*/.#ifd
190b0 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c  ef _WIN32.__decl
190c0 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a  spec(dllexport).
190d0 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74  #endif.int sqlit
190e0 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74  e3_spellfix_init
190f0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
19100 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
19110 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71  Msg, .  const sq
19120 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
19130 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51  es *pApi.){.  SQ
19140 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
19150 4e 49 54 32 28 70 41 70 69 29 3b 0a 23 69 66 6e  NIT2(pApi);.#ifn
19160 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19170 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 72  VIRTUALTABLE.  r
19180 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 52  eturn spellfix1R
19190 65 67 69 73 74 65 72 28 64 62 29 3b 0a 23 65 6e  egister(db);.#en
191a0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
191b0 49 54 45 5f 4f 4b 3b 0a 7d 0a                    ITE_OK;.}.