/ Hex Artifact Content
Login

Artifact bb73be37491fd5007efab8dfd8ac416315d47f8aba99179b8adb4255e85c7ff5:


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: 0a 2a 2a 20 4c 6f 61 64 20 61 6c 6c 20 65 64 69  .** Load all edi
5910: 74 2d 64 69 73 74 61 6e 63 65 20 77 65 69 67 68  t-distance weigh
5920: 74 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 2e  ts from a table.
5930: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5940: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c 6f  ditDist3ConfigLo
5950: 61 64 28 0a 20 20 45 64 69 74 44 69 73 74 33 43  ad(.  EditDist3C
5960: 6f 6e 66 69 67 20 2a 70 2c 20 20 20 20 20 20 2f  onfig *p,      /
5970: 2a 20 54 68 65 20 65 64 69 74 20 64 69 73 74 61  * The edit dista
5980: 6e 63 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  nce configuratio
5990: 6e 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20 73  n to load */.  s
59a0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
59b0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 66         /* Load f
59c0: 72 6f 6d 20 74 68 69 73 20 64 61 74 61 62 61 73  rom this databas
59d0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
59e0: 72 20 2a 7a 54 61 62 6c 65 20 20 20 20 20 20 2f  r *zTable      /
59f0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
5a00: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ble from which t
5a10: 6f 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73  o load */.){.  s
5a20: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
5a30: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 2c 20 72 63  mt;.  int rc, rc
5a40: 32 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  2;.  char *zSql;
5a50: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 50 72 65 76  .  int iLangPrev
5a60: 20 3d 20 2d 39 39 39 39 3b 0a 20 20 45 64 69 74   = -9999;.  Edit
5a70: 44 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67  Dist3Lang *pLang
5a80: 20 3d 20 30 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20   = 0;..  zSql = 
5a90: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5aa0: 22 53 45 4c 45 43 54 20 69 4c 61 6e 67 2c 20 63  "SELECT iLang, c
5ab0: 46 72 6f 6d 2c 20 63 54 6f 2c 20 69 43 6f 73 74  From, cTo, iCost
5ac0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
5ad0: 20 20 20 20 20 20 20 20 20 20 20 22 20 46 52 4f             " FRO
5ae0: 4d 20 5c 22 25 77 5c 22 20 57 48 45 52 45 20 69  M \"%w\" WHERE i
5af0: 4c 61 6e 67 3e 3d 30 20 4f 52 44 45 52 20 42 59  Lang>=0 ORDER BY
5b00: 20 69 4c 61 6e 67 22 2c 20 7a 54 61 62 6c 65 29   iLang", zTable)
5b10: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
5b20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
5b30: 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71  NOMEM;.  rc = sq
5b40: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
5b50: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
5b60: 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
5b70: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
5b80: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
5b90: 72 63 3b 0a 20 20 65 64 69 74 44 69 73 74 33 43  rc;.  editDist3C
5ba0: 6f 6e 66 69 67 43 6c 65 61 72 28 70 29 3b 0a 20  onfigClear(p);. 
5bb0: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
5bc0: 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
5bd0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69  ITE_ROW ){.    i
5be0: 6e 74 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74  nt iLang = sqlit
5bf0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
5c00: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  tmt, 0);.    con
5c10: 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d  st char *zFrom =
5c20: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
5c30: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
5c40: 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
5c50: 20 69 6e 74 20 6e 46 72 6f 6d 20 3d 20 7a 46 72   int nFrom = zFr
5c60: 6f 6d 20 3f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  om ? sqlite3_col
5c70: 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
5c80: 20 31 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e   1) : 0;.    con
5c90: 73 74 20 63 68 61 72 20 2a 7a 54 6f 20 3d 20 28  st char *zTo = (
5ca0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
5cb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
5cc0: 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69  pStmt, 2);.    i
5cd0: 6e 74 20 6e 54 6f 20 3d 20 7a 54 6f 20 3f 20 73  nt nTo = zTo ? s
5ce0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
5cf0: 74 65 73 28 70 53 74 6d 74 2c 20 32 29 20 3a 20  tes(pStmt, 2) : 
5d00: 30 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 73 74  0;.    int iCost
5d10: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
5d20: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b  n_int(pStmt, 3);
5d30: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46  ..    assert( zF
5d40: 72 6f 6d 21 3d 30 20 7c 7c 20 6e 46 72 6f 6d 3d  rom!=0 || nFrom=
5d50: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
5d60: 28 20 7a 54 6f 21 3d 30 20 7c 7c 20 6e 54 6f 3d  ( zTo!=0 || nTo=
5d70: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  =0 );.    if( nF
5d80: 72 6f 6d 3e 31 30 30 20 7c 7c 20 6e 54 6f 3e 31  rom>100 || nTo>1
5d90: 30 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  00 ) continue;. 
5da0: 20 20 20 69 66 28 20 69 43 6f 73 74 3c 30 20 29     if( iCost<0 )
5db0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
5dc0: 66 28 20 70 4c 61 6e 67 3d 3d 30 20 7c 7c 20 69  f( pLang==0 || i
5dd0: 4c 61 6e 67 21 3d 69 4c 61 6e 67 50 72 65 76 20  Lang!=iLangPrev 
5de0: 29 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69 73  ){.      EditDis
5df0: 74 33 4c 61 6e 67 20 2a 70 4e 65 77 3b 0a 20 20  t3Lang *pNew;.  
5e00: 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
5e10: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e  e3_realloc64(p->
5e20: 61 2c 20 28 70 2d 3e 6e 4c 61 6e 67 2b 31 29 2a  a, (p->nLang+1)*
5e30: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 29  sizeof(p->a[0]))
5e40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
5e50: 3d 3d 30 20 29 7b 20 72 63 20 3d 20 53 51 4c 49  ==0 ){ rc = SQLI
5e60: 54 45 5f 4e 4f 4d 45 4d 3b 20 62 72 65 61 6b 3b  TE_NOMEM; break;
5e70: 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61 20 3d 20   }.      p->a = 
5e80: 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4c 61 6e  pNew;.      pLan
5e90: 67 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 4c 61  g = &p->a[p->nLa
5ea0: 6e 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c  ng];.      p->nL
5eb0: 61 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 61  ang++;.      pLa
5ec0: 6e 67 2d 3e 69 4c 61 6e 67 20 3d 20 69 4c 61 6e  ng->iLang = iLan
5ed0: 67 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e  g;.      pLang->
5ee0: 69 49 6e 73 43 6f 73 74 20 3d 20 31 30 30 3b 0a  iInsCost = 100;.
5ef0: 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 44 65        pLang->iDe
5f00: 6c 43 6f 73 74 20 3d 20 31 30 30 3b 0a 20 20 20  lCost = 100;.   
5f10: 20 20 20 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f     pLang->iSubCo
5f20: 73 74 20 3d 20 31 35 30 3b 0a 20 20 20 20 20 20  st = 150;.      
5f30: 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 20 3d 20 30  pLang->pCost = 0
5f40: 3b 0a 20 20 20 20 20 20 69 4c 61 6e 67 50 72 65  ;.      iLangPre
5f50: 76 20 3d 20 69 4c 61 6e 67 3b 0a 20 20 20 20 7d  v = iLang;.    }
5f60: 0a 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d  .    if( nFrom==
5f70: 31 20 26 26 20 7a 46 72 6f 6d 5b 30 5d 3d 3d 27  1 && zFrom[0]=='
5f80: 3f 27 20 26 26 20 6e 54 6f 3d 3d 30 20 29 7b 0a  ?' && nTo==0 ){.
5f90: 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 44 65        pLang->iDe
5fa0: 6c 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a 20  lCost = iCost;. 
5fb0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
5fc0: 6f 6d 3d 3d 30 20 26 26 20 6e 54 6f 3d 3d 31 20  om==0 && nTo==1 
5fd0: 26 26 20 7a 54 6f 5b 30 5d 3d 3d 27 3f 27 20 29  && zTo[0]=='?' )
5fe0: 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  {.      pLang->i
5ff0: 49 6e 73 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b  InsCost = iCost;
6000: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
6010: 46 72 6f 6d 3d 3d 31 20 26 26 20 6e 54 6f 3d 3d  From==1 && nTo==
6020: 31 20 26 26 20 7a 46 72 6f 6d 5b 30 5d 3d 3d 27  1 && zFrom[0]=='
6030: 3f 27 20 26 26 20 7a 54 6f 5b 30 5d 3d 3d 27 3f  ?' && zTo[0]=='?
6040: 27 20 29 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67  ' ){.      pLang
6050: 2d 3e 69 53 75 62 43 6f 73 74 20 3d 20 69 43 6f  ->iSubCost = iCo
6060: 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  st;.    }else{. 
6070: 20 20 20 20 20 45 64 69 74 44 69 73 74 33 43 6f       EditDist3Co
6080: 73 74 20 2a 70 43 6f 73 74 3b 0a 20 20 20 20 20  st *pCost;.     
6090: 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 6e 46   int nExtra = nF
60a0: 72 6f 6d 20 2b 20 6e 54 6f 20 2d 20 34 3b 0a 20  rom + nTo - 4;. 
60b0: 20 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3c       if( nExtra<
60c0: 30 20 29 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a  0 ) nExtra = 0;.
60d0: 20 20 20 20 20 20 70 43 6f 73 74 20 3d 20 73 71        pCost = sq
60e0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
60f0: 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 20 2b  sizeof(*pCost) +
6100: 20 6e 45 78 74 72 61 20 29 3b 0a 20 20 20 20 20   nExtra );.     
6110: 20 69 66 28 20 70 43 6f 73 74 3d 3d 30 20 29 7b   if( pCost==0 ){
6120: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6130: 45 4d 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  EM; break; }.   
6140: 20 20 20 70 43 6f 73 74 2d 3e 6e 46 72 6f 6d 20     pCost->nFrom 
6150: 3d 20 28 75 38 29 6e 46 72 6f 6d 3b 0a 20 20 20  = (u8)nFrom;.   
6160: 20 20 20 70 43 6f 73 74 2d 3e 6e 54 6f 20 3d 20     pCost->nTo = 
6170: 28 75 38 29 6e 54 6f 3b 0a 20 20 20 20 20 20 70  (u8)nTo;.      p
6180: 43 6f 73 74 2d 3e 69 43 6f 73 74 20 3d 20 28 75  Cost->iCost = (u
6190: 31 36 29 69 43 6f 73 74 3b 0a 20 20 20 20 20 20  16)iCost;.      
61a0: 6d 65 6d 63 70 79 28 70 43 6f 73 74 2d 3e 61 2c  memcpy(pCost->a,
61b0: 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 29 3b 0a   zFrom, nFrom);.
61c0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f        memcpy(pCo
61d0: 73 74 2d 3e 61 20 2b 20 6e 46 72 6f 6d 2c 20 7a  st->a + nFrom, z
61e0: 54 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20  To, nTo);.      
61f0: 70 43 6f 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pCost->pNext = p
6200: 4c 61 6e 67 2d 3e 70 43 6f 73 74 3b 0a 20 20 20  Lang->pCost;.   
6210: 20 20 20 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 20     pLang->pCost 
6220: 3d 20 70 43 6f 73 74 3b 20 0a 20 20 20 20 7d 0a  = pCost; .    }.
6230: 20 20 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69    }.  rc2 = sqli
6240: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
6250: 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  mt);.  if( rc==S
6260: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
6270: 72 63 32 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rc2;.  return rc
6280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6290: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 28 69 6e  n the length (in
62a0: 20 62 79 74 65 73 29 20 6f 66 20 61 20 75 74 66   bytes) of a utf
62b0: 2d 38 20 63 68 61 72 61 63 74 65 72 2e 20 20 4f  -8 character.  O
62c0: 72 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d  r return a maxim
62d0: 75 6d 0a 2a 2a 20 6f 66 20 4e 2e 0a 2a 2f 0a 73  um.** of N..*/.s
62e0: 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 4c 65  tatic int utf8Le
62f0: 6e 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  n(unsigned char 
6300: 63 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74  c, int N){.  int
6310: 20 6c 65 6e 20 3d 20 31 3b 0a 20 20 69 66 28 20   len = 1;.  if( 
6320: 63 3e 30 78 37 66 20 29 7b 0a 20 20 20 20 69 66  c>0x7f ){.    if
6330: 28 20 28 63 26 30 78 65 30 29 3d 3d 30 78 63 30  ( (c&0xe0)==0xc0
6340: 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20   ){.      len = 
6350: 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  2;.    }else if(
6360: 20 28 63 26 30 78 66 30 29 3d 3d 30 78 65 30 20   (c&0xf0)==0xe0 
6370: 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 33  ){.      len = 3
6380: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6390: 20 20 20 6c 65 6e 20 3d 20 34 3b 0a 20 20 20 20     len = 4;.    
63a0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 3e  }.  }.  if( len>
63b0: 4e 20 29 20 6c 65 6e 20 3d 20 4e 3b 0a 20 20 72  N ) len = N;.  r
63c0: 65 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a  eturn len;.}../*
63d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
63e0: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68  (non-zero) if th
63f0: 65 20 54 6f 20 73 69 64 65 20 6f 66 20 74 68 65  e To side of the
6400: 20 67 69 76 65 6e 20 63 6f 73 74 20 6d 61 74 63   given cost matc
6410: 68 65 73 0a 2a 2a 20 74 68 65 20 67 69 76 65 6e  hes.** the given
6420: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
6430: 69 63 20 69 6e 74 20 6d 61 74 63 68 54 6f 28 45  ic int matchTo(E
6440: 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 70 2c  ditDist3Cost *p,
6450: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
6460: 69 6e 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 2d  int n){.  if( p-
6470: 3e 6e 54 6f 3e 6e 20 29 20 72 65 74 75 72 6e 20  >nTo>n ) return 
6480: 30 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  0;.  if( strncmp
6490: 28 70 2d 3e 61 2b 70 2d 3e 6e 46 72 6f 6d 2c 20  (p->a+p->nFrom, 
64a0: 7a 2c 20 70 2d 3e 6e 54 6f 29 21 3d 30 20 29 20  z, p->nTo)!=0 ) 
64b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
64c0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 1;.}../*.** R
64d0: 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
64e0: 7a 65 72 6f 29 20 69 66 20 74 68 65 20 46 72 6f  zero) if the Fro
64f0: 6d 20 73 69 64 65 20 6f 66 20 74 68 65 20 67 69  m side of the gi
6500: 76 65 6e 20 63 6f 73 74 20 6d 61 74 63 68 65 73  ven cost matches
6510: 0a 2a 2a 20 74 68 65 20 67 69 76 65 6e 20 73 74  .** the given st
6520: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
6530: 69 6e 74 20 6d 61 74 63 68 46 72 6f 6d 28 45 64  int matchFrom(Ed
6540: 69 74 44 69 73 74 33 43 6f 73 74 20 2a 70 2c 20  itDist3Cost *p, 
6550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
6560: 6e 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt n){.  assert(
6570: 20 70 2d 3e 6e 46 72 6f 6d 3c 3d 6e 20 29 3b 0a   p->nFrom<=n );.
6580: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 2d    if( strncmp(p-
6590: 3e 61 2c 20 7a 2c 20 70 2d 3e 6e 46 72 6f 6d 29  >a, z, p->nFrom)
65a0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
65b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
65c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
65d0: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 6f 66 20 74   (non-zero) of t
65e0: 68 65 20 6e 65 78 74 20 46 52 4f 4d 20 63 68 61  he next FROM cha
65f0: 72 61 63 74 65 72 20 61 6e 64 20 74 68 65 20 6e  racter and the n
6600: 65 78 74 20 54 4f 0a 2a 2a 20 63 68 61 72 61 63  ext TO.** charac
6610: 74 65 72 20 61 72 65 20 74 68 65 20 73 61 6d 65  ter are the same
6620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6630: 6d 61 74 63 68 46 72 6f 6d 54 6f 28 0a 20 20 45  matchFromTo(.  E
6640: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
6650: 6e 67 20 2a 70 53 74 72 2c 20 20 2f 2a 20 4c 65  ng *pStr,  /* Le
6660: 66 74 20 68 61 6e 64 20 73 74 72 69 6e 67 20 2a  ft hand string *
6670: 2f 0a 20 20 69 6e 74 20 6e 31 2c 20 20 20 20 20  /.  int n1,     
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6d 70  /* Index of comp
66a0: 61 72 69 73 6f 6e 20 63 68 61 72 61 63 74 65 72  arison character
66b0: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
66c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32    const char *z2
66d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
66e0: 20 52 69 67 68 74 2d 68 61 6e 64 6c 20 63 6f 6d   Right-handl com
66f0: 70 61 72 69 73 6f 6e 20 63 68 61 72 61 63 74 65  parison characte
6700: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 20 20 20  r */.  int n2   
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 2f 2a 20 42 79 74 65 73 20 72 65 6d 61     /* Bytes rema
6730: 69 6e 69 6e 67 20 69 6e 20 7a 32 5b 5d 20 2a 2f  ining in z2[] */
6740: 0a 29 7b 0a 20 20 69 6e 74 20 62 31 20 3d 20 70  .){.  int b1 = p
6750: 53 74 72 2d 3e 61 5b 6e 31 5d 2e 6e 42 79 74 65  Str->a[n1].nByte
6760: 3b 0a 20 20 69 66 28 20 62 31 3e 6e 32 20 29 20  ;.  if( b1>n2 ) 
6770: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
6780: 6d 65 6d 63 6d 70 28 70 53 74 72 2d 3e 7a 2b 6e  memcmp(pStr->z+n
6790: 31 2c 20 7a 32 2c 20 62 31 29 21 3d 30 20 29 20  1, z2, b1)!=0 ) 
67a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
67b0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 1;.}../*.** D
67c0: 65 6c 65 74 65 20 61 6e 20 45 64 69 74 44 69 73  elete an EditDis
67d0: 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 6f 62 6a  t3FromString obj
67e0: 65 63 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ecct.*/.static v
67f0: 6f 69 64 20 65 64 69 74 44 69 73 74 33 46 72 6f  oid editDist3Fro
6800: 6d 53 74 72 69 6e 67 44 65 6c 65 74 65 28 45 64  mStringDelete(Ed
6810: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
6820: 67 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  g *p){.  int i;.
6830: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 66    if( p ){.    f
6840: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 3b 20  or(i=0; i<p->n; 
6850: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
6860: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 5b 69 5d  te3_free(p->a[i]
6870: 2e 61 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 73  .apDel);.      s
6880: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
6890: 5b 69 5d 2e 61 70 53 75 62 73 74 29 3b 0a 20 20  [i].apSubst);.  
68a0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
68b0: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
68c0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 45  /*.** Create a E
68d0: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
68e0: 6e 67 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  ng object..*/.st
68f0: 61 74 69 63 20 45 64 69 74 44 69 73 74 33 46 72  atic EditDist3Fr
6900: 6f 6d 53 74 72 69 6e 67 20 2a 65 64 69 74 44 69  omString *editDi
6910: 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77  st3FromStringNew
6920: 28 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69  (.  const EditDi
6930: 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 0a  st3Lang *pLang,.
6940: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
6950: 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 45 64  .  int n.){.  Ed
6960: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
6970: 67 20 2a 70 53 74 72 3b 0a 20 20 45 64 69 74 44  g *pStr;.  EditD
6980: 69 73 74 33 43 6f 73 74 20 2a 70 3b 0a 20 20 69  ist3Cost *p;.  i
6990: 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 7a 3d 3d  nt i;..  if( z==
69a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
69b0: 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 28 69  if( n<0 ) n = (i
69c0: 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20  nt)strlen(z);.  
69d0: 70 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pStr = sqlite3_m
69e0: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
69f0: 2a 70 53 74 72 29 20 2b 20 73 69 7a 65 6f 66 28  *pStr) + sizeof(
6a00: 70 53 74 72 2d 3e 61 5b 30 5d 29 2a 6e 20 2b 20  pStr->a[0])*n + 
6a10: 6e 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  n + 1 );.  if( p
6a20: 53 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Str==0 ) return 
6a30: 30 3b 0a 20 20 70 53 74 72 2d 3e 61 20 3d 20 28  0;.  pStr->a = (
6a40: 45 64 69 74 44 69 73 74 33 46 72 6f 6d 2a 29 26  EditDist3From*)&
6a50: 70 53 74 72 5b 31 5d 3b 0a 20 20 6d 65 6d 73 65  pStr[1];.  memse
6a60: 74 28 70 53 74 72 2d 3e 61 2c 20 30 2c 20 73 69  t(pStr->a, 0, si
6a70: 7a 65 6f 66 28 70 53 74 72 2d 3e 61 5b 30 5d 29  zeof(pStr->a[0])
6a80: 2a 6e 29 3b 0a 20 20 70 53 74 72 2d 3e 6e 20 3d  *n);.  pStr->n =
6a90: 20 6e 3b 0a 20 20 70 53 74 72 2d 3e 7a 20 3d 20   n;.  pStr->z = 
6aa0: 28 63 68 61 72 2a 29 26 70 53 74 72 2d 3e 61 5b  (char*)&pStr->a[
6ab0: 6e 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 53 74  n];.  memcpy(pSt
6ac0: 72 2d 3e 7a 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20  r->z, z, n+1);. 
6ad0: 20 69 66 28 20 6e 20 26 26 20 7a 5b 6e 2d 31 5d   if( n && z[n-1]
6ae0: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 70 53 74  =='*' ){.    pSt
6af0: 72 2d 3e 69 73 50 72 65 66 69 78 20 3d 20 31 3b  r->isPrefix = 1;
6b00: 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 70 53  .    n--;.    pS
6b10: 74 72 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 70 53 74  tr->n--;.    pSt
6b20: 72 2d 3e 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d  r->z[n] = 0;.  }
6b30: 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 72 2d 3e  else{.    pStr->
6b40: 69 73 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20  isPrefix = 0;.  
6b50: 7d 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  }..  for(i=0; i<
6b60: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 64 69  n; i++){.    Edi
6b70: 74 44 69 73 74 33 46 72 6f 6d 20 2a 70 46 72 6f  tDist3From *pFro
6b80: 6d 20 3d 20 26 70 53 74 72 2d 3e 61 5b 69 5d 3b  m = &pStr->a[i];
6b90: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 72 6f  .    memset(pFro
6ba0: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46  m, 0, sizeof(*pF
6bb0: 72 6f 6d 29 29 3b 0a 20 20 20 20 70 46 72 6f 6d  rom));.    pFrom
6bc0: 2d 3e 6e 42 79 74 65 20 3d 20 75 74 66 38 4c 65  ->nByte = utf8Le
6bd0: 6e 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n((unsigned char
6be0: 29 7a 5b 69 5d 2c 20 6e 2d 69 29 3b 0a 20 20 20  )z[i], n-i);.   
6bf0: 20 66 6f 72 28 70 3d 70 4c 61 6e 67 2d 3e 70 43   for(p=pLang->pC
6c00: 6f 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  ost; p; p=p->pNe
6c10: 78 74 29 7b 0a 20 20 20 20 20 20 45 64 69 74 44  xt){.      EditD
6c20: 69 73 74 33 43 6f 73 74 20 2a 2a 61 70 4e 65 77  ist3Cost **apNew
6c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 2b 70 2d  ;.      if( i+p-
6c40: 3e 6e 46 72 6f 6d 3e 6e 20 29 20 63 6f 6e 74 69  >nFrom>n ) conti
6c50: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6d  nue;.      if( m
6c60: 61 74 63 68 46 72 6f 6d 28 70 2c 20 7a 2b 69 2c  atchFrom(p, z+i,
6c70: 20 6e 2d 69 29 3d 3d 30 20 29 20 63 6f 6e 74 69   n-i)==0 ) conti
6c80: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
6c90: 2d 3e 6e 54 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  ->nTo==0 ){.    
6ca0: 20 20 20 20 61 70 4e 65 77 20 3d 20 73 71 6c 69      apNew = sqli
6cb0: 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 46  te3_realloc64(pF
6cc0: 72 6f 6d 2d 3e 61 70 44 65 6c 2c 0a 20 20 20 20  rom->apDel,.    
6cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
6cf0: 6f 66 28 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f  of(*apNew)*(pFro
6d00: 6d 2d 3e 6e 44 65 6c 2b 31 29 29 3b 0a 20 20 20  m->nDel+1));.   
6d10: 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d       if( apNew==
6d20: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
6d30: 20 20 20 70 46 72 6f 6d 2d 3e 61 70 44 65 6c 20     pFrom->apDel 
6d40: 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 20  = apNew;.       
6d50: 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e 6e 44   apNew[pFrom->nD
6d60: 65 6c 2b 2b 5d 20 3d 20 70 3b 0a 20 20 20 20 20  el++] = p;.     
6d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6d80: 61 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f  apNew = sqlite3_
6d90: 72 65 61 6c 6c 6f 63 36 34 28 70 46 72 6f 6d 2d  realloc64(pFrom-
6da0: 3e 61 70 53 75 62 73 74 2c 0a 20 20 20 20 20 20  >apSubst,.      
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dc0: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
6dd0: 28 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f 6d 2d  (*apNew)*(pFrom-
6de0: 3e 6e 53 75 62 73 74 2b 31 29 29 3b 0a 20 20 20  >nSubst+1));.   
6df0: 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d       if( apNew==
6e00: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
6e10: 20 20 20 70 46 72 6f 6d 2d 3e 61 70 53 75 62 73     pFrom->apSubs
6e20: 74 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20  t = apNew;.     
6e30: 20 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e     apNew[pFrom->
6e40: 6e 53 75 62 73 74 2b 2b 5d 20 3d 20 70 3b 0a 20  nSubst++] = p;. 
6e50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6e60: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
6e70: 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  editDist3FromStr
6e80: 69 6e 67 44 65 6c 65 74 65 28 70 53 74 72 29 3b  ingDelete(pStr);
6e90: 0a 20 20 20 20 20 20 70 53 74 72 20 3d 20 30 3b  .      pStr = 0;
6ea0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6eb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6ec0: 20 70 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pStr;.}../*.** 
6ed0: 55 70 64 61 74 65 20 65 6e 74 72 79 20 6d 5b 69  Update entry m[i
6ee0: 5d 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  ] such that it i
6ef0: 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 66  s the minimum of
6f00: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
6f10: 75 65 0a 2a 2a 20 61 6e 64 20 6d 5b 6a 5d 2b 69  ue.** and m[j]+i
6f20: 43 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Cost..**.** If t
6f30: 68 65 20 69 43 6f 73 74 20 69 73 20 31 2c 30 30  he iCost is 1,00
6f40: 30 2c 30 30 30 20 6f 72 20 67 72 65 61 74 65 72  0,000 or greater
6f50: 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20  , then consider 
6f60: 74 68 65 20 63 6f 73 74 20 74 6f 20 62 65 0a 2a  the cost to be.*
6f70: 2a 20 69 6e 66 69 6e 69 74 65 20 61 6e 64 20 73  * infinite and s
6f80: 6b 69 70 20 74 68 65 20 75 70 64 61 74 65 2e 0a  kip the update..
6f90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
6fa0: 70 64 61 74 65 43 6f 73 74 28 0a 20 20 75 6e 73  pdateCost(.  uns
6fb0: 69 67 6e 65 64 20 69 6e 74 20 2a 6d 2c 0a 20 20  igned int *m,.  
6fc0: 69 6e 74 20 69 2c 0a 20 20 69 6e 74 20 6a 2c 0a  int i,.  int j,.
6fd0: 20 20 69 6e 74 20 69 43 6f 73 74 0a 29 7b 0a 20    int iCost.){. 
6fe0: 20 61 73 73 65 72 74 28 20 69 43 6f 73 74 3e 3d   assert( iCost>=
6ff0: 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 73 74  0 );.  if( iCost
7000: 3c 31 30 30 30 30 20 29 7b 0a 20 20 20 20 75 6e  <10000 ){.    un
7010: 73 69 67 6e 65 64 20 69 6e 74 20 62 20 3d 20 6d  signed int b = m
7020: 5b 6a 5d 20 2b 20 69 43 6f 73 74 3b 0a 20 20 20  [j] + iCost;.   
7030: 20 69 66 28 20 62 3c 6d 5b 69 5d 20 29 20 6d 5b   if( b<m[i] ) m[
7040: 69 5d 20 3d 20 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f  i] = b;.  }.}../
7050: 2a 0a 2a 2a 20 48 6f 77 20 6d 75 63 68 20 73 74  *.** How much st
7060: 61 63 6b 20 73 70 61 63 65 20 28 69 6e 74 20 62  ack space (int b
7070: 79 74 65 73 29 20 74 6f 20 75 73 65 20 66 6f 72  ytes) to use for
7080: 20 57 61 67 6e 65 72 20 6d 61 74 72 69 78 20 69   Wagner matrix i
7090: 6e 20 0a 2a 2a 20 65 64 69 74 44 69 73 74 33 43  n .** editDist3C
70a0: 6f 72 65 28 29 2e 20 20 49 66 20 6d 6f 72 65 20  ore().  If more 
70b0: 73 70 61 63 65 20 74 68 61 6e 20 74 68 69 73 20  space than this 
70c0: 69 73 20 72 65 71 75 69 72 65 64 2c 20 74 68 65  is required, the
70d0: 20 65 6e 74 69 72 65 0a 2a 2a 20 6d 61 74 72 69   entire.** matri
70e0: 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
70f0: 74 68 65 20 68 65 61 70 2e 20 20 54 6f 20 72 65  the heap.  To re
7100: 64 75 63 65 20 74 68 65 20 6c 6f 61 64 20 6f 6e  duce the load on
7110: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61   the memory.** a
7120: 6c 6c 6f 63 61 74 6f 72 2c 20 6d 61 6b 65 20 74  llocator, make t
7130: 68 69 73 20 76 61 6c 75 65 20 61 73 20 6c 61 72  his value as lar
7140: 67 65 20 61 73 20 70 72 61 63 74 69 63 61 6c 20  ge as practical 
7150: 66 6f 72 20 74 68 65 0a 2a 2a 20 61 72 63 68 69  for the.** archi
7160: 74 65 63 74 75 72 65 20 69 6e 20 75 73 65 2e 0a  tecture in use..
7170: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
7180: 45 5f 53 50 45 4c 4c 46 49 58 5f 53 54 41 43 4b  E_SPELLFIX_STACK
7190: 41 4c 4c 4f 43 5f 53 5a 0a 23 20 64 65 66 69 6e  ALLOC_SZ.# defin
71a0: 65 20 53 51 4c 49 54 45 5f 53 50 45 4c 4c 46 49  e SQLITE_SPELLFI
71b0: 58 5f 53 54 41 43 4b 41 4c 4c 4f 43 5f 53 5a 20  X_STACKALLOC_SZ 
71c0: 20 28 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a   (1024).#endif..
71d0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 65  /* Compute the e
71e0: 64 69 74 20 64 69 73 74 61 6e 63 65 20 62 65 74  dit distance bet
71f0: 77 65 65 6e 20 74 77 6f 20 73 74 72 69 6e 67 73  ween two strings
7200: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
7210: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
7220: 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
7230: 6d 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68  mber which is th
7240: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  e error code..**
7250: 0a 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69  .** If pnMatch i
7260: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
7270: 20 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74   *pnMatch is set
7280: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
7290: 66 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20  f characters.** 
72a0: 28 6e 6f 74 20 62 79 74 65 73 29 20 69 6e 20 7a  (not bytes) in z
72b0: 32 20 74 68 61 74 20 6d 61 74 63 68 65 64 20 74  2 that matched t
72c0: 68 65 20 73 65 61 72 63 68 20 70 61 74 74 65 72  he search patter
72d0: 6e 20 69 6e 20 2a 70 46 72 6f 6d 2e 20 49 66 20  n in *pFrom. If 
72e0: 70 46 72 6f 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f  pFrom does.** no
72f0: 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 61  t contain the pa
7300: 74 74 65 72 6e 20 66 6f 72 20 61 20 70 72 65 66  ttern for a pref
7310: 69 78 2d 73 65 61 72 63 68 2c 20 74 68 65 6e 20  ix-search, then 
7320: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
7330: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
7340: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 32  characters in z2
7350: 2e 20 49 66 20 70 46 72 6f 6d 20 64 6f 65 73 20  . If pFrom does 
7360: 63 6f 6e 74 61 69 6e 20 61 20 70 72 65 66 69 78  contain a prefix
7370: 20 73 65 61 72 63 68 20 70 61 74 74 65 72 6e 2c   search pattern,
7380: 20 74 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 74   then.** it is t
7390: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
73a0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 70  racters in the p
73b0: 72 65 66 69 78 20 6f 66 20 7a 32 20 74 68 61 74  refix of z2 that
73c0: 20 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20 0a   was deemed to .
73d0: 2a 2a 20 6d 61 74 63 68 20 70 46 72 6f 6d 2e 0a  ** match pFrom..
73e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64  */.static int ed
73f0: 69 74 44 69 73 74 33 43 6f 72 65 28 0a 20 20 45  itDist3Core(.  E
7400: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
7410: 6e 67 20 2a 70 46 72 6f 6d 2c 20 20 2f 2a 20 54  ng *pFrom,  /* T
7420: 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a  he FROM string *
7430: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7440: 7a 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  z2,             
7450: 20 2f 2a 20 54 68 65 20 54 4f 20 73 74 72 69 6e   /* The TO strin
7460: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 20  g */.  int n2,  
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
7490: 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a   the TO string *
74a0: 2f 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69  /.  const EditDi
74b0: 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 20  st3Lang *pLang, 
74c0: 20 2f 2a 20 45 64 69 74 20 77 65 69 67 68 74 73   /* Edit weights
74d0: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
74e0: 72 20 6c 61 6e 67 75 61 67 65 20 49 44 20 2a 2f  r language ID */
74f0: 0a 20 20 69 6e 74 20 2a 70 6e 4d 61 74 63 68 20  .  int *pnMatch 
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 2f 2a 20 4f 55 54 3a 20 43 68 61 72 61 63 74 65  /* OUT: Characte
7520: 72 73 20 69 6e 20 6d 61 74 63 68 65 64 20 70 72  rs in matched pr
7530: 65 66 69 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  efix */.){.  int
7540: 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 31 2c   k, n;.  int i1,
7550: 20 62 31 3b 0a 20 20 69 6e 74 20 69 32 2c 20 62   b1;.  int i2, b
7560: 32 3b 0a 20 20 45 64 69 74 44 69 73 74 33 46 72  2;.  EditDist3Fr
7570: 6f 6d 53 74 72 69 6e 67 20 66 20 3d 20 2a 70 46  omString f = *pF
7580: 72 6f 6d 3b 0a 20 20 45 64 69 74 44 69 73 74 33  rom;.  EditDist3
7590: 54 6f 20 2a 61 32 3b 0a 20 20 75 6e 73 69 67 6e  To *a2;.  unsign
75a0: 65 64 20 69 6e 74 20 2a 6d 3b 0a 20 20 75 6e 73  ed int *m;.  uns
75b0: 69 67 6e 65 64 20 69 6e 74 20 2a 70 54 6f 46 72  igned int *pToFr
75c0: 65 65 3b 0a 20 20 69 6e 74 20 73 7a 52 6f 77 3b  ee;.  int szRow;
75d0: 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74  .  EditDist3Cost
75e0: 20 2a 70 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a   *p;.  int res;.
75f0: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
7600: 20 6e 42 79 74 65 3b 0a 20 20 75 6e 73 69 67 6e   nByte;.  unsign
7610: 65 64 20 69 6e 74 20 73 74 61 63 6b 53 70 61 63  ed int stackSpac
7620: 65 5b 53 51 4c 49 54 45 5f 53 50 45 4c 4c 46 49  e[SQLITE_SPELLFI
7630: 58 5f 53 54 41 43 4b 41 4c 4c 4f 43 5f 53 5a 2f  X_STACKALLOC_SZ/
7640: 73 69 7a 65 6f 66 28 75 6e 73 69 67 6e 65 64 20  sizeof(unsigned 
7650: 69 6e 74 29 5d 3b 0a 0a 20 20 2f 2a 20 61 6c 6c  int)];..  /* all
7660: 6f 63 61 74 65 20 74 68 65 20 57 61 67 6e 65 72  ocate the Wagner
7670: 20 6d 61 74 72 69 78 20 61 6e 64 20 74 68 65 20   matrix and the 
7680: 61 54 6f 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  aTo[] array for 
7690: 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f  the TO string */
76a0: 0a 20 20 6e 20 3d 20 28 66 2e 6e 2b 31 29 2a 28  .  n = (f.n+1)*(
76b0: 6e 32 2b 31 29 3b 0a 20 20 6e 20 3d 20 28 6e 2b  n2+1);.  n = (n+
76c0: 31 29 26 7e 31 3b 0a 20 20 6e 42 79 74 65 20 3d  1)&~1;.  nByte =
76d0: 20 6e 2a 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 20   n*sizeof(m[0]) 
76e0: 2b 20 73 69 7a 65 6f 66 28 61 32 5b 30 5d 29 2a  + sizeof(a2[0])*
76f0: 6e 32 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c  n2;.  if( nByte<
7700: 3d 73 69 7a 65 6f 66 28 73 74 61 63 6b 53 70 61  =sizeof(stackSpa
7710: 63 65 29 20 29 7b 0a 20 20 20 20 6d 20 3d 20 73  ce) ){.    m = s
7720: 74 61 63 6b 53 70 61 63 65 3b 0a 20 20 20 20 70  tackSpace;.    p
7730: 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  ToFree = 0;.  }e
7740: 6c 73 65 7b 0a 20 20 20 20 6d 20 3d 20 70 54 6f  lse{.    m = pTo
7750: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Free = sqlite3_m
7760: 61 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 20 29  alloc64( nByte )
7770: 3b 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29  ;.    if( m==0 )
7780: 20 72 65 74 75 72 6e 20 2d 31 3b 20 20 20 20 20   return -1;     
7790: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66         /* Out of
77a0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 7d 0a 20   memory */.  }. 
77b0: 20 61 32 20 3d 20 28 45 64 69 74 44 69 73 74 33   a2 = (EditDist3
77c0: 54 6f 2a 29 26 6d 5b 6e 5d 3b 0a 20 20 6d 65 6d  To*)&m[n];.  mem
77d0: 73 65 74 28 61 32 2c 20 30 2c 20 73 69 7a 65 6f  set(a2, 0, sizeo
77e0: 66 28 61 32 5b 30 5d 29 2a 6e 32 29 3b 0a 0a 20  f(a2[0])*n2);.. 
77f0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
7800: 61 31 5b 5d 20 6d 61 74 72 69 78 20 66 6f 72 20  a1[] matrix for 
7810: 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20 6f  all characters o
7820: 66 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20  f the TO string 
7830: 2a 2f 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20 69  */.  for(i2=0; i
7840: 32 3c 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20 20 20  2<n2; i2++){.   
7850: 20 61 32 5b 69 32 5d 2e 6e 42 79 74 65 20 3d 20   a2[i2].nByte = 
7860: 75 74 66 38 4c 65 6e 28 28 75 6e 73 69 67 6e 65  utf8Len((unsigne
7870: 64 20 63 68 61 72 29 7a 32 5b 69 32 5d 2c 20 6e  d char)z2[i2], n
7880: 32 2d 69 32 29 3b 0a 20 20 20 20 66 6f 72 28 70  2-i2);.    for(p
7890: 3d 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 3b 20 70  =pLang->pCost; p
78a0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
78b0: 20 20 20 20 20 45 64 69 74 44 69 73 74 33 43 6f       EditDist3Co
78c0: 73 74 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20  st **apNew;.    
78d0: 20 20 69 66 28 20 70 2d 3e 6e 46 72 6f 6d 3e 30    if( p->nFrom>0
78e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
78f0: 20 20 20 69 66 28 20 69 32 2b 70 2d 3e 6e 54 6f     if( i2+p->nTo
7900: 3e 6e 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >n2 ) continue;.
7910: 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 54        if( matchT
7920: 6f 28 70 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d 69  o(p, z2+i2, n2-i
7930: 32 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  2)==0 ) continue
7940: 3b 0a 20 20 20 20 20 20 61 32 5b 69 32 5d 2e 6e  ;.      a2[i2].n
7950: 49 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 61 70 4e  Ins++;.      apN
7960: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
7970: 6c 6c 6f 63 36 34 28 61 32 5b 69 32 5d 2e 61 70  lloc64(a2[i2].ap
7980: 49 6e 73 2c 20 73 69 7a 65 6f 66 28 2a 61 70 4e  Ins, sizeof(*apN
7990: 65 77 29 2a 61 32 5b 69 32 5d 2e 6e 49 6e 73 29  ew)*a2[i2].nIns)
79a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  ;.      if( apNe
79b0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
79c0: 72 65 73 20 3d 20 2d 31 3b 20 20 2f 2a 20 4f 75  res = -1;  /* Ou
79d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
79e0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 64 69 74         goto edit
79f0: 44 69 73 74 33 41 62 6f 72 74 3b 0a 20 20 20 20  Dist3Abort;.    
7a00: 20 20 7d 0a 20 20 20 20 20 20 61 32 5b 69 32 5d    }.      a2[i2]
7a10: 2e 61 70 49 6e 73 20 3d 20 61 70 4e 65 77 3b 0a  .apIns = apNew;.
7a20: 20 20 20 20 20 20 61 32 5b 69 32 5d 2e 61 70 49        a2[i2].apI
7a30: 6e 73 5b 61 32 5b 69 32 5d 2e 6e 49 6e 73 2d 31  ns[a2[i2].nIns-1
7a40: 5d 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = p;.    }.  }
7a50: 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74  ..  /* Prepare t
7a60: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 69  o compute the mi
7a70: 6e 69 6d 75 6d 20 65 64 69 74 20 64 69 73 74 61  nimum edit dista
7a80: 6e 63 65 20 2a 2f 0a 20 20 73 7a 52 6f 77 20 3d  nce */.  szRow =
7a90: 20 66 2e 6e 2b 31 3b 0a 20 20 6d 65 6d 73 65 74   f.n+1;.  memset
7aa0: 28 6d 2c 20 30 78 30 31 2c 20 28 6e 32 2b 31 29  (m, 0x01, (n2+1)
7ab0: 2a 73 7a 52 6f 77 2a 73 69 7a 65 6f 66 28 6d 5b  *szRow*sizeof(m[
7ac0: 30 5d 29 29 3b 0a 20 20 6d 5b 30 5d 20 3d 20 30  0]));.  m[0] = 0
7ad0: 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 66 69  ;..  /* First fi
7ae0: 6c 6c 20 69 6e 20 74 68 65 20 74 6f 70 2d 72 6f  ll in the top-ro
7af0: 77 20 6f 66 20 74 68 65 20 6d 61 74 72 69 78 20  w of the matrix 
7b00: 77 69 74 68 20 46 52 4f 4d 20 64 65 6c 65 74 69  with FROM deleti
7b10: 6f 6e 20 63 6f 73 74 73 20 2a 2f 0a 20 20 66 6f  on costs */.  fo
7b20: 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20  r(i1=0; i1<f.n; 
7b30: 69 31 20 2b 3d 20 62 31 29 7b 0a 20 20 20 20 62  i1 += b1){.    b
7b40: 31 20 3d 20 66 2e 61 5b 69 31 5d 2e 6e 42 79 74  1 = f.a[i1].nByt
7b50: 65 3b 0a 20 20 20 20 75 70 64 61 74 65 43 6f 73  e;.    updateCos
7b60: 74 28 6d 2c 20 69 31 2b 62 31 2c 20 69 31 2c 20  t(m, i1+b1, i1, 
7b70: 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f 73 74 29  pLang->iDelCost)
7b80: 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b  ;.    for(k=0; k
7b90: 3c 66 2e 61 5b 69 31 5d 2e 6e 44 65 6c 3b 20 6b  <f.a[i1].nDel; k
7ba0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 66  ++){.      p = f
7bb0: 2e 61 5b 69 31 5d 2e 61 70 44 65 6c 5b 6b 5d 3b  .a[i1].apDel[k];
7bc0: 0a 20 20 20 20 20 20 75 70 64 61 74 65 43 6f 73  .      updateCos
7bd0: 74 28 6d 2c 20 69 31 2b 70 2d 3e 6e 46 72 6f 6d  t(m, i1+p->nFrom
7be0: 2c 20 69 31 2c 20 70 2d 3e 69 43 6f 73 74 29 3b  , i1, p->iCost);
7bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7c00: 20 46 69 6c 6c 20 69 6e 20 61 6c 6c 20 73 75 62   Fill in all sub
7c10: 73 65 71 75 65 6e 74 20 72 6f 77 73 2c 20 74 6f  sequent rows, to
7c20: 70 2d 74 6f 2d 62 6f 74 74 6f 6d 2c 20 6c 65 66  p-to-bottom, lef
7c30: 74 2d 74 6f 2d 72 69 67 68 74 20 2a 2f 0a 20 20  t-to-right */.  
7c40: 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b  for(i2=0; i2<n2;
7c50: 20 69 32 20 2b 3d 20 62 32 29 7b 0a 20 20 20 20   i2 += b2){.    
7c60: 69 6e 74 20 72 78 3b 20 20 20 20 20 20 2f 2a 20  int rx;      /* 
7c70: 53 74 61 72 74 69 6e 67 20 69 6e 64 65 78 20 66  Starting index f
7c80: 6f 72 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a  or current row *
7c90: 2f 0a 20 20 20 20 69 6e 74 20 72 78 70 3b 20 20  /.    int rxp;  
7ca0: 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 69     /* Starting i
7cb0: 6e 64 65 78 20 66 6f 72 20 70 72 65 76 69 6f 75  ndex for previou
7cc0: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 62 32 20  s row */.    b2 
7cd0: 3d 20 61 32 5b 69 32 5d 2e 6e 42 79 74 65 3b 0a  = a2[i2].nByte;.
7ce0: 20 20 20 20 72 78 20 3d 20 73 7a 52 6f 77 2a 28      rx = szRow*(
7cf0: 69 32 2b 62 32 29 3b 0a 20 20 20 20 72 78 70 20  i2+b2);.    rxp 
7d00: 3d 20 73 7a 52 6f 77 2a 69 32 3b 0a 20 20 20 20  = szRow*i2;.    
7d10: 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 72 78  updateCost(m, rx
7d20: 2c 20 72 78 70 2c 20 70 4c 61 6e 67 2d 3e 69 49  , rxp, pLang->iI
7d30: 6e 73 43 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72  nsCost);.    for
7d40: 28 6b 3d 30 3b 20 6b 3c 61 32 5b 69 32 5d 2e 6e  (k=0; k<a2[i2].n
7d50: 49 6e 73 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Ins; k++){.     
7d60: 20 70 20 3d 20 61 32 5b 69 32 5d 2e 61 70 49 6e   p = a2[i2].apIn
7d70: 73 5b 6b 5d 3b 0a 20 20 20 20 20 20 75 70 64 61  s[k];.      upda
7d80: 74 65 43 6f 73 74 28 6d 2c 20 73 7a 52 6f 77 2a  teCost(m, szRow*
7d90: 28 69 32 2b 70 2d 3e 6e 54 6f 29 2c 20 72 78 70  (i2+p->nTo), rxp
7da0: 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20  , p->iCost);.   
7db0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 31 3d 30 3b   }.    for(i1=0;
7dc0: 20 69 31 3c 66 2e 6e 3b 20 69 31 2b 3d 62 31 29   i1<f.n; i1+=b1)
7dd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 78 3b 20  {.      int cx; 
7de0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
7df0: 75 72 72 65 6e 74 20 63 65 6c 6c 20 2a 2f 0a 20  urrent cell */. 
7e00: 20 20 20 20 20 69 6e 74 20 63 78 70 3b 20 20 20       int cxp;   
7e10: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
7e20: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
7e30: 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
7e40: 20 20 69 6e 74 20 63 78 64 3b 20 20 20 2f 2a 20    int cxd;   /* 
7e50: 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f  Index of cell to
7e60: 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 6f 6e   the left and on
7e70: 65 20 72 6f 77 20 61 62 6f 76 65 20 2a 2f 0a 20  e row above */. 
7e80: 20 20 20 20 20 69 6e 74 20 63 78 75 3b 20 20 20       int cxu;   
7e90: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
7ea0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 62 6f   immediately abo
7eb0: 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 31 20 3d  ve */.      b1 =
7ec0: 20 66 2e 61 5b 69 31 5d 2e 6e 42 79 74 65 3b 0a   f.a[i1].nByte;.
7ed0: 20 20 20 20 20 20 63 78 70 20 3d 20 72 78 20 2b        cxp = rx +
7ee0: 20 69 31 3b 0a 20 20 20 20 20 20 63 78 20 3d 20   i1;.      cx = 
7ef0: 63 78 70 20 2b 20 62 31 3b 0a 20 20 20 20 20 20  cxp + b1;.      
7f00: 63 78 64 20 3d 20 72 78 70 20 2b 20 69 31 3b 0a  cxd = rxp + i1;.
7f10: 20 20 20 20 20 20 63 78 75 20 3d 20 63 78 64 20        cxu = cxd 
7f20: 2b 20 62 31 3b 0a 20 20 20 20 20 20 75 70 64 61  + b1;.      upda
7f30: 74 65 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78  teCost(m, cx, cx
7f40: 70 2c 20 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f  p, pLang->iDelCo
7f50: 73 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  st);.      for(k
7f60: 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 44  =0; k<f.a[i1].nD
7f70: 65 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  el; k++){.      
7f80: 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70    p = f.a[i1].ap
7f90: 44 65 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  Del[k];.        
7fa0: 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78  updateCost(m, cx
7fb0: 70 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 63 78 70 2c  p+p->nFrom, cxp,
7fc0: 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20   p->iCost);.    
7fd0: 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65    }.      update
7fe0: 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 75 2c  Cost(m, cx, cxu,
7ff0: 20 70 4c 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74   pLang->iInsCost
8000: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74  );.      if( mat
8010: 63 68 46 72 6f 6d 54 6f 28 26 66 2c 20 69 31 2c  chFromTo(&f, i1,
8020: 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29 20 29   z2+i2, n2-i2) )
8030: 7b 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  {.        update
8040: 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 64 2c  Cost(m, cx, cxd,
8050: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
8060: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
8070: 20 63 78 2c 20 63 78 64 2c 20 70 4c 61 6e 67 2d   cx, cxd, pLang-
8080: 3e 69 53 75 62 43 6f 73 74 29 3b 0a 20 20 20 20  >iSubCost);.    
8090: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61    for(k=0; k<f.a
80a0: 5b 69 31 5d 2e 6e 53 75 62 73 74 3b 20 6b 2b 2b  [i1].nSubst; k++
80b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66  ){.        p = f
80c0: 2e 61 5b 69 31 5d 2e 61 70 53 75 62 73 74 5b 6b  .a[i1].apSubst[k
80d0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  ];.        if( m
80e0: 61 74 63 68 54 6f 28 70 2c 20 7a 32 2b 69 32 2c  atchTo(p, z2+i2,
80f0: 20 6e 32 2d 69 32 29 20 29 7b 0a 20 20 20 20 20   n2-i2) ){.     
8100: 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28       updateCost(
8110: 6d 2c 20 63 78 64 2b 70 2d 3e 6e 46 72 6f 6d 2b  m, cxd+p->nFrom+
8120: 73 7a 52 6f 77 2a 70 2d 3e 6e 54 6f 2c 20 63 78  szRow*p->nTo, cx
8130: 64 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20  d, p->iCost);.  
8140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8150: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 30      }.  }..#if 0
8160: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 66 6f 72 20    /* Enable for 
8170: 64 65 62 75 67 67 69 6e 67 20 2a 2f 0a 20 20 70  debugging */.  p
8180: 72 69 6e 74 66 28 22 20 20 20 20 20 20 20 20 20  rintf("         
8190: 5e 22 29 3b 0a 20 20 66 6f 72 28 69 31 3d 30 3b  ^");.  for(i1=0;
81a0: 20 69 31 3c 66 2e 6e 3b 20 69 31 2b 2b 29 20 70   i1<f.n; i1++) p
81b0: 72 69 6e 74 66 28 22 20 25 63 2d 25 32 78 22 2c  rintf(" %c-%2x",
81c0: 20 66 2e 7a 5b 69 31 5d 2c 20 66 2e 7a 5b 69 31   f.z[i1], f.z[i1
81d0: 5d 26 30 78 66 66 29 3b 0a 20 20 70 72 69 6e 74  ]&0xff);.  print
81e0: 66 28 22 5c 6e 20 20 20 5e 3a 22 29 3b 0a 20 20  f("\n   ^:");.  
81f0: 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 73 7a 52  for(i1=0; i1<szR
8200: 6f 77 3b 20 69 31 2b 2b 29 7b 0a 20 20 20 20 69  ow; i1++){.    i
8210: 6e 74 20 76 20 3d 20 6d 5b 69 31 5d 3b 0a 20 20  nt v = m[i1];.  
8220: 20 20 69 66 28 20 76 3e 39 39 39 39 20 29 20 70    if( v>9999 ) p
8230: 72 69 6e 74 66 28 22 20 2a 2a 2a 2a 22 29 3b 0a  rintf(" ****");.
8240: 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
8250: 20 70 72 69 6e 74 66 28 22 20 25 34 64 22 2c 20   printf(" %4d", 
8260: 76 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66  v);.  }.  printf
8270: 28 22 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 32  ("\n");.  for(i2
8280: 3d 30 3b 20 69 32 3c 6e 32 3b 20 69 32 2b 2b 29  =0; i2<n2; i2++)
8290: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 63  {.    printf("%c
82a0: 2d 25 30 32 78 3a 22 2c 20 7a 32 5b 69 32 5d 2c  -%02x:", z2[i2],
82b0: 20 7a 32 5b 69 32 5d 26 30 78 66 66 29 3b 0a 20   z2[i2]&0xff);. 
82c0: 20 20 20 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c     for(i1=0; i1<
82d0: 73 7a 52 6f 77 3b 20 69 31 2b 2b 29 7b 0a 20 20  szRow; i1++){.  
82e0: 20 20 20 20 69 6e 74 20 76 20 3d 20 6d 5b 28 69      int v = m[(i
82f0: 32 2b 31 29 2a 73 7a 52 6f 77 2b 69 31 5d 3b 0a  2+1)*szRow+i1];.
8300: 20 20 20 20 20 20 69 66 28 20 76 3e 39 39 39 39        if( v>9999
8310: 20 29 20 70 72 69 6e 74 66 28 22 20 2a 2a 2a 2a   ) printf(" ****
8320: 22 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20  ");.      else  
8330: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20         printf(" 
8340: 25 34 64 22 2c 20 76 29 3b 0a 20 20 20 20 7d 0a  %4d", v);.    }.
8350: 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
8360: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
8370: 2f 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 61  /* Free memory a
8380: 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 6e 64 20 72  llocations and r
8390: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
83a0: 20 2a 2f 0a 20 20 72 65 73 20 3d 20 28 69 6e 74   */.  res = (int
83b0: 29 6d 5b 73 7a 52 6f 77 2a 28 6e 32 2b 31 29 2d  )m[szRow*(n2+1)-
83c0: 31 5d 3b 0a 20 20 6e 20 3d 20 6e 32 3b 0a 20 20  1];.  n = n2;.  
83d0: 69 66 28 20 66 2e 69 73 50 72 65 66 69 78 20 29  if( f.isPrefix )
83e0: 7b 0a 20 20 20 20 66 6f 72 28 69 32 3d 31 3b 20  {.    for(i2=1; 
83f0: 69 32 3c 3d 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20  i2<=n2; i2++){. 
8400: 20 20 20 20 20 69 6e 74 20 62 20 3d 20 6d 5b 73       int b = m[s
8410: 7a 52 6f 77 2a 69 32 2d 31 5d 3b 0a 20 20 20 20  zRow*i2-1];.    
8420: 20 20 69 66 28 20 62 3c 3d 72 65 73 20 29 7b 20    if( b<=res ){ 
8430: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 62  .        res = b
8440: 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 69 32  ;.        n = i2
8450: 20 2d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   - 1;.      }.  
8460: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e    }.  }.  if( pn
8470: 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 69 6e 74  Match ){.    int
8480: 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20   nExtra = 0;.   
8490: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b   for(k=0; k<n; k
84a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
84b0: 7a 32 5b 6b 5d 20 26 20 30 78 63 30 29 3d 3d 30  z2[k] & 0xc0)==0
84c0: 78 38 30 20 29 20 6e 45 78 74 72 61 2b 2b 3b 0a  x80 ) nExtra++;.
84d0: 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4d 61 74      }.    *pnMat
84e0: 63 68 20 3d 20 6e 20 2d 20 6e 45 78 74 72 61 3b  ch = n - nExtra;
84f0: 0a 20 20 7d 0a 0a 65 64 69 74 44 69 73 74 33 41  .  }..editDist3A
8500: 62 6f 72 74 3a 0a 20 20 66 6f 72 28 69 32 3d 30  bort:.  for(i2=0
8510: 3b 20 69 32 3c 6e 32 3b 20 69 32 2b 2b 29 20 73  ; i2<n2; i2++) s
8520: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 32 5b 69  qlite3_free(a2[i
8530: 32 5d 2e 61 70 49 6e 73 29 3b 0a 20 20 73 71 6c  2].apIns);.  sql
8540: 69 74 65 33 5f 66 72 65 65 28 70 54 6f 46 72 65  ite3_free(pToFre
8550: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  e);.  return res
8560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
8570: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 45 64  n appropriate Ed
8580: 69 74 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a 65  itDist3Lang obje
8590: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ct..*/.static co
85a0: 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e  nst EditDist3Lan
85b0: 67 20 2a 65 64 69 74 44 69 73 74 33 46 69 6e 64  g *editDist3Find
85c0: 4c 61 6e 67 28 0a 20 20 45 64 69 74 44 69 73 74  Lang(.  EditDist
85d0: 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  3Config *pConfig
85e0: 2c 0a 20 20 69 6e 74 20 69 4c 61 6e 67 0a 29 7b  ,.  int iLang.){
85f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
8600: 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e  i=0; i<pConfig->
8610: 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nLang; i++){.   
8620: 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 5b   if( pConfig->a[
8630: 69 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61 6e 67 20  i].iLang==iLang 
8640: 29 20 72 65 74 75 72 6e 20 26 70 43 6f 6e 66 69  ) return &pConfi
8650: 67 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  g->a[i];.  }.  r
8660: 65 74 75 72 6e 20 26 65 64 69 74 44 69 73 74 33  eturn &editDist3
8670: 4c 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  Lang;.}../*.** F
8680: 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65 64 69 74  unction:    edit
8690: 64 69 73 74 33 28 41 2c 42 2c 69 4c 61 6e 67 29  dist3(A,B,iLang)
86a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
86b0: 20 65 64 69 74 64 69 73 74 33 28 74 61 62 6c 65   editdist3(table
86c0: 6e 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  name).**.** Retu
86d0: 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74  rn the cost of t
86e0: 72 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74 72 69  ransforming stri
86f0: 6e 67 20 41 20 69 6e 74 6f 20 73 74 72 69 6e 67  ng A into string
8700: 20 42 20 75 73 69 6e 67 20 65 64 69 74 0a 2a 2a   B using edit.**
8710: 20 77 65 69 67 68 74 73 20 66 6f 72 20 69 4c 61   weights for iLa
8720: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ng..**.** The se
8730: 63 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61 64 73 20  cond form loads 
8740: 65 64 69 74 20 77 65 69 67 68 74 73 20 69 6e 74  edit weights int
8750: 6f 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 61 20  o memory from a 
8760: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
8770: 20 76 6f 69 64 20 65 64 69 74 44 69 73 74 33 53   void editDist3S
8780: 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  qlFunc(.  sqlite
8790: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
87a0: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
87b0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
87c0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 45 64 69 74  **argv.){.  Edit
87d0: 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f  Dist3Config *pCo
87e0: 6e 66 69 67 20 3d 20 28 45 64 69 74 44 69 73 74  nfig = (EditDist
87f0: 33 43 6f 6e 66 69 67 2a 29 73 71 6c 69 74 65 33  3Config*)sqlite3
8800: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
8810: 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  xt);.  sqlite3 *
8820: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
8830: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
8840: 6f 6e 74 65 78 74 29 3b 0a 20 20 69 6e 74 20 72  ontext);.  int r
8850: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31  c;.  if( argc==1
8860: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
8870: 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20 28 63 6f  ar *zTable = (co
8880: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
8890: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
88a0: 76 5b 30 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  v[0]);.    rc = 
88b0: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c  editDist3ConfigL
88c0: 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 64 62 2c  oad(pConfig, db,
88d0: 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
88e0: 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 5f 72  ( rc ) sqlite3_r
88f0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
8900: 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20  (context, rc);. 
8910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
8920: 74 20 63 68 61 72 20 2a 7a 41 20 3d 20 28 63 6f  t char *zA = (co
8930: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
8940: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8950: 76 5b 30 5d 29 3b 0a 20 20 20 20 63 6f 6e 73 74  v[0]);.    const
8960: 20 63 68 61 72 20 2a 7a 42 20 3d 20 28 63 6f 6e   char *zB = (con
8970: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
8980: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8990: 5b 31 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 41  [1]);.    int nA
89a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
89b0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
89c0: 0a 20 20 20 20 69 6e 74 20 6e 42 20 3d 20 73 71  .    int nB = sq
89d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
89e0: 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  s(argv[1]);.    
89f0: 69 6e 74 20 69 4c 61 6e 67 20 3d 20 61 72 67 63  int iLang = argc
8a00: 3d 3d 33 20 3f 20 73 71 6c 69 74 65 33 5f 76 61  ==3 ? sqlite3_va
8a10: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29  lue_int(argv[2])
8a20: 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   : 0;.    const 
8a30: 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70  EditDist3Lang *p
8a40: 4c 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74 33  Lang = editDist3
8a50: 46 69 6e 64 4c 61 6e 67 28 70 43 6f 6e 66 69 67  FindLang(pConfig
8a60: 2c 20 69 4c 61 6e 67 29 3b 0a 20 20 20 20 45 64  , iLang);.    Ed
8a70: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
8a80: 67 20 2a 70 46 72 6f 6d 3b 0a 20 20 20 20 69 6e  g *pFrom;.    in
8a90: 74 20 64 69 73 74 3b 0a 0a 20 20 20 20 70 46 72  t dist;..    pFr
8aa0: 6f 6d 20 3d 20 65 64 69 74 44 69 73 74 33 46 72  om = editDist3Fr
8ab0: 6f 6d 53 74 72 69 6e 67 4e 65 77 28 70 4c 61 6e  omStringNew(pLan
8ac0: 67 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20 20 20 20  g, zA, nA);.    
8ad0: 69 66 28 20 70 46 72 6f 6d 3d 3d 30 20 29 7b 0a  if( pFrom==0 ){.
8ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8af0: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
8b00: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  (context);.     
8b10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8b20: 20 20 20 64 69 73 74 20 3d 20 65 64 69 74 44 69     dist = editDi
8b30: 73 74 33 43 6f 72 65 28 70 46 72 6f 6d 2c 20 7a  st3Core(pFrom, z
8b40: 42 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c 20 30 29  B, nB, pLang, 0)
8b50: 3b 0a 20 20 20 20 65 64 69 74 44 69 73 74 33 46  ;.    editDist3F
8b60: 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65 74 65 28  romStringDelete(
8b70: 70 46 72 6f 6d 29 3b 0a 20 20 20 20 69 66 28 20  pFrom);.    if( 
8b80: 64 69 73 74 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  dist==(-1) ){.  
8b90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8ba0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
8bb0: 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c  ontext);.    }el
8bc0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8bd0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
8be0: 74 65 78 74 2c 20 64 69 73 74 29 3b 0a 20 20 20  text, dist);.   
8bf0: 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a   }.  } .}../*.**
8c00: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 65 64   Register the ed
8c10: 69 74 44 69 73 74 33 20 66 75 6e 63 74 69 6f 6e  itDist3 function
8c20: 20 77 69 74 68 20 53 51 4c 69 74 65 0a 2a 2f 0a   with SQLite.*/.
8c30: 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74 44  static int editD
8c40: 69 73 74 33 49 6e 73 74 61 6c 6c 28 73 71 6c 69  ist3Install(sqli
8c50: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
8c60: 72 63 3b 0a 20 20 45 64 69 74 44 69 73 74 33 43  rc;.  EditDist3C
8c70: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
8c80: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
8c90: 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66  4( sizeof(*pConf
8ca0: 69 67 29 20 29 3b 0a 20 20 69 66 28 20 70 43 6f  ig) );.  if( pCo
8cb0: 6e 66 69 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nfig==0 ) return
8cc0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8cd0: 20 6d 65 6d 73 65 74 28 70 43 6f 6e 66 69 67 2c   memset(pConfig,
8ce0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e   0, sizeof(*pCon
8cf0: 66 69 67 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  fig));.  rc = sq
8d00: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8d10: 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64  ction_v2(db, "ed
8d20: 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20  itdist3",.      
8d30: 20 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54          2, SQLIT
8d40: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44 45  E_UTF8|SQLITE_DE
8d50: 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 70 43 6f  TERMINISTIC, pCo
8d60: 6e 66 69 67 2c 0a 20 20 20 20 20 20 20 20 20 20  nfig,.          
8d70: 20 20 20 20 65 64 69 74 44 69 73 74 33 53 71 6c      editDist3Sql
8d80: 46 75 6e 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Func, 0, 0, 0);.
8d90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8da0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
8db0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
8dc0: 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22  unction_v2(db, "
8dd0: 65 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20 20  editdist3",.    
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 33 2c 20 53              3, S
8df0: 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54  QLITE_UTF8|SQLIT
8e00: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
8e10: 20 70 43 6f 6e 66 69 67 2c 0a 20 20 20 20 20 20   pConfig,.      
8e20: 20 20 20 20 20 20 20 20 20 20 65 64 69 74 44 69            editDi
8e30: 73 74 33 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  st3SqlFunc, 0, 0
8e40: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
8e50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8e60: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8e70: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8e80: 6e 5f 76 32 28 64 62 2c 20 22 65 64 69 74 64 69  n_v2(db, "editdi
8e90: 73 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20 20  st3",.          
8ea0: 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f        1, SQLITE_
8eb0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45  UTF8|SQLITE_DETE
8ec0: 52 4d 49 4e 49 53 54 49 43 2c 20 70 43 6f 6e 66  RMINISTIC, pConf
8ed0: 69 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ig,.            
8ee0: 20 20 20 20 65 64 69 74 44 69 73 74 33 53 71 6c      editDist3Sql
8ef0: 46 75 6e 63 2c 20 30 2c 20 30 2c 20 65 64 69 74  Func, 0, 0, edit
8f00: 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74  Dist3ConfigDelet
8f10: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
8f20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
8f30: 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 20 20 72 65  onfig);.  }.  re
8f40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e  turn rc;.}./* En
8f50: 64 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 20 63  d configurable c
8f60: 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64 69 74  ost unicode edit
8f70: 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74 69 6e   distance routin
8f80: 65 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  es.*************
8f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fd0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
8fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9020: 0a 2a 2a 20 42 65 67 69 6e 20 74 72 61 6e 73 6c  .** Begin transl
9030: 69 74 65 72 61 74 65 20 75 6e 69 63 6f 64 65 2d  iterate unicode-
9040: 74 6f 2d 61 73 63 69 69 20 69 6d 70 6c 65 6d 65  to-ascii impleme
9050: 6e 74 61 74 69 6f 6e 0a 2a 2f 0a 0a 23 69 66 20  ntation.*/..#if 
9060: 21 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41  !SQLITE_AMALGAMA
9070: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TION./*.** This 
9080: 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69 73 20  lookup table is 
9090: 75 73 65 64 20 74 6f 20 68 65 6c 70 20 64 65 63  used to help dec
90a0: 6f 64 65 20 74 68 65 20 66 69 72 73 74 20 62 79  ode the first by
90b0: 74 65 20 6f 66 0a 2a 2a 20 61 20 6d 75 6c 74 69  te of.** a multi
90c0: 2d 62 79 74 65 20 55 54 46 38 20 63 68 61 72 61  -byte UTF8 chara
90d0: 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cter..*/.static 
90e0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
90f0: 68 61 72 20 73 71 6c 69 74 65 33 55 74 66 38 54  har sqlite3Utf8T
9100: 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20 30 78  rans1[] = {.  0x
9110: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20  00, 0x01, 0x02, 
9120: 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35  0x03, 0x04, 0x05
9130: 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20  , 0x06, 0x07,.  
9140: 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61  0x08, 0x09, 0x0a
9150: 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78  , 0x0b, 0x0c, 0x
9160: 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a  0d, 0x0e, 0x0f,.
9170: 20 20 30 78 31 30 2c 20 30 78 31 31 2c 20 30 78    0x10, 0x11, 0x
9180: 31 32 2c 20 30 78 31 33 2c 20 30 78 31 34 2c 20  12, 0x13, 0x14, 
9190: 30 78 31 35 2c 20 30 78 31 36 2c 20 30 78 31 37  0x15, 0x16, 0x17
91a0: 2c 0a 20 20 30 78 31 38 2c 20 30 78 31 39 2c 20  ,.  0x18, 0x19, 
91b0: 30 78 31 61 2c 20 30 78 31 62 2c 20 30 78 31 63  0x1a, 0x1b, 0x1c
91c0: 2c 20 30 78 31 64 2c 20 30 78 31 65 2c 20 30 78  , 0x1d, 0x1e, 0x
91d0: 31 66 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31  1f,.  0x00, 0x01
91e0: 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78  , 0x02, 0x03, 0x
91f0: 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20  04, 0x05, 0x06, 
9200: 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78  0x07,.  0x08, 0x
9210: 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20  09, 0x0a, 0x0b, 
9220: 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65  0x0c, 0x0d, 0x0e
9230: 2c 20 30 78 30 66 2c 0a 20 20 30 78 30 30 2c 20  , 0x0f,.  0x00, 
9240: 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33  0x01, 0x02, 0x03
9250: 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78  , 0x04, 0x05, 0x
9260: 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 30  06, 0x07,.  0x00
9270: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
9280: 30 33 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20  03, 0x00, 0x01, 
9290: 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d 3b 0a 23  0x00, 0x00,.};.#
92a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
92b0: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
92c0: 20 74 68 65 20 66 69 72 73 74 20 55 54 46 2d 38   the first UTF-8
92d0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
92e0: 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
92f0: 74 69 63 20 69 6e 74 20 75 74 66 38 52 65 61 64  tic int utf8Read
9300: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
9310: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
9320: 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  int *pSize){.  i
9330: 6e 74 20 63 2c 20 69 3b 0a 0a 20 20 2f 2a 20 41  nt c, i;..  /* A
9340: 6c 6c 20 63 61 6c 6c 65 72 73 20 74 6f 20 74 68  ll callers to th
9350: 69 73 20 72 6f 75 74 69 6e 65 20 28 69 6e 20 74  is routine (in t
9360: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
9370: 6d 65 6e 74 61 74 69 6f 6e 29 0a 20 20 2a 2a 20  mentation).  ** 
9380: 61 6c 77 61 79 73 20 68 61 76 65 20 6e 3e 30 2e  always have n>0.
9390: 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
93a0: 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 63 20 3d  n==0) ){.    c =
93b0: 20 69 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b   i = 0;.  }else{
93c0: 0a 20 20 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20  .    c = z[0];. 
93d0: 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 69 66     i = 1;.    if
93e0: 28 20 63 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ( c>=0xc0 ){.   
93f0: 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74     c = sqlite3Ut
9400: 66 38 54 72 61 6e 73 31 5b 63 2d 30 78 63 30 5d  f8Trans1[c-0xc0]
9410: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  ;.      while( i
9420: 3c 6e 20 26 26 20 28 7a 5b 69 5d 20 26 20 30 78  <n && (z[i] & 0x
9430: 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20 20  c0)==0x80 ){.   
9440: 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36 29 20       c = (c<<6) 
9450: 2b 20 28 30 78 33 66 20 26 20 7a 5b 69 2b 2b 5d  + (0x3f & z[i++]
9460: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9470: 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
9480: 69 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  i;.  return c;.}
9490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
94a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
94b0: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 75  racters in the u
94c0: 74 66 2d 38 20 73 74 72 69 6e 67 20 69 6e 20 74  tf-8 string in t
94d0: 68 65 20 6e 49 6e 20 62 79 74 65 0a 2a 2a 20 62  he nIn byte.** b
94e0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
94f0: 20 62 79 20 7a 49 6e 2e 0a 2a 2f 0a 73 74 61 74   by zIn..*/.stat
9500: 69 63 20 69 6e 74 20 75 74 66 38 43 68 61 72 6c  ic int utf8Charl
9510: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
9520: 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20  In, int nIn){.  
9530: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 68  int i;.  int nCh
9540: 61 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ar = 0;.  for(i=
9550: 30 3b 20 69 3c 6e 49 6e 3b 20 6e 43 68 61 72 2b  0; i<nIn; nChar+
9560: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a  +){.    int sz;.
9570: 20 20 20 20 75 74 66 38 52 65 61 64 28 28 63 6f      utf8Read((co
9580: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
9590: 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49 6e  r *)&zIn[i], nIn
95a0: 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 20  -i, &sz);.    i 
95b0: 2b 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 72 65 74  += sz;.  }.  ret
95c0: 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 74 79  urn nChar;.}..ty
95d0: 70 65 64 65 66 20 73 74 72 75 63 74 20 54 72 61  pedef struct Tra
95e0: 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 54 72 61  nsliteration Tra
95f0: 6e 73 6c 69 74 65 72 61 74 69 6f 6e 3b 0a 73 74  nsliteration;.st
9600: 72 75 63 74 20 54 72 61 6e 73 6c 69 74 65 72 61  ruct Translitera
9610: 74 69 6f 6e 20 7b 0a 20 75 6e 73 69 67 6e 65 64  tion {. unsigned
9620: 20 73 68 6f 72 74 20 69 6e 74 20 63 46 72 6f 6d   short int cFrom
9630: 3b 0a 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;. unsigned char
9640: 20 63 54 6f 30 2c 20 63 54 6f 31 2c 20 63 54 6f   cTo0, cTo1, cTo
9650: 32 2c 20 63 54 6f 33 3b 0a 7d 3b 0a 0a 2f 2a 0a  2, cTo3;.};../*.
9660: 2a 2a 20 54 61 62 6c 65 20 6f 66 20 74 72 61 6e  ** Table of tran
9670: 73 6c 61 74 69 6f 6e 73 20 66 72 6f 6d 20 75 6e  slations from un
9680: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73  icode characters
9690: 20 69 6e 74 6f 20 41 53 43 49 49 2e 0a 2a 2f 0a   into ASCII..*/.
96a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 72 61  static const Tra
96b0: 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 74 72 61  nsliteration tra
96c0: 6e 73 6c 69 74 5b 5d 20 3d 20 7b 0a 20 20 7b 20  nslit[] = {.  { 
96d0: 30 78 30 30 41 30 2c 20 20 30 78 32 30 2c 20 30  0x00A0,  0x20, 0
96e0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
96f0: 7d 2c 20 20 2f 2a 20 c2 a0 20 74 6f 20 20 20 2a  },  /* .. to   *
9700: 2f 0a 20 20 7b 20 30 78 30 30 42 35 2c 20 20 30  /.  { 0x00B5,  0
9710: 78 37 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x75, 0x00, 0x00,
9720: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c2 b5 20   0x00 },  /* .. 
9730: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to u */.  { 0x00
9740: 43 30 2c 20 20 30 78 34 31 2c 20 30 78 30 30 2c  C0,  0x41, 0x00,
9750: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
9760: 2f 2a 20 c3 80 20 74 6f 20 41 20 2a 2f 0a 20 20  /* .. to A */.  
9770: 7b 20 30 78 30 30 43 31 2c 20 20 30 78 34 31 2c  { 0x00C1,  0x41,
9780: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
9790: 30 20 7d 2c 20 20 2f 2a 20 c3 81 20 74 6f 20 41  0 },  /* .. to A
97a0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 32 2c 20   */.  { 0x00C2, 
97b0: 20 30 78 34 31 2c 20 30 78 30 30 2c 20 30 78 30   0x41, 0x00, 0x0
97c0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
97d0: 82 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78  . to A */.  { 0x
97e0: 30 30 43 33 2c 20 20 30 78 34 31 2c 20 30 78 30  00C3,  0x41, 0x0
97f0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
9800: 20 20 2f 2a 20 c3 83 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
9810: 20 20 7b 20 30 78 30 30 43 34 2c 20 20 30 78 34    { 0x00C4,  0x4
9820: 31 2c 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30  1, 0x65, 0x00, 0
9830: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 84 20 74 6f  x00 },  /* .. to
9840: 20 41 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43   Ae */.  { 0x00C
9850: 35 2c 20 20 30 78 34 31 2c 20 30 78 36 31 2c 20  5,  0x41, 0x61, 
9860: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
9870: 2a 20 c3 85 20 74 6f 20 41 61 20 2a 2f 0a 20 20  * .. to Aa */.  
9880: 7b 20 30 78 30 30 43 36 2c 20 20 30 78 34 31 2c  { 0x00C6,  0x41,
9890: 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30 78 30   0x45, 0x00, 0x0
98a0: 30 20 7d 2c 20 20 2f 2a 20 c3 86 20 74 6f 20 41  0 },  /* .. to A
98b0: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 37 2c  E */.  { 0x00C7,
98c0: 20 20 30 78 34 33 2c 20 30 78 30 30 2c 20 30 78    0x43, 0x00, 0x
98d0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
98e0: c3 87 20 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30  .. to C */.  { 0
98f0: 78 30 30 43 38 2c 20 20 30 78 34 35 2c 20 30 78  x00C8,  0x45, 0x
9900: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
9910: 2c 20 20 2f 2a 20 c3 88 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
9920: 0a 20 20 7b 20 30 78 30 30 43 39 2c 20 20 30 78  .  { 0x00C9,  0x
9930: 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  45, 0x00, 0x00, 
9940: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 89 20 74  0x00 },  /* .. t
9950: 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43  o E */.  { 0x00C
9960: 41 2c 20 20 30 78 34 35 2c 20 30 78 30 30 2c 20  A,  0x45, 0x00, 
9970: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
9980: 2a 20 c3 8a 20 74 6f 20 45 20 2a 2f 0a 20 20 7b  * .. to E */.  {
9990: 20 30 78 30 30 43 42 2c 20 20 30 78 34 35 2c 20   0x00CB,  0x45, 
99a0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
99b0: 20 7d 2c 20 20 2f 2a 20 c3 8b 20 74 6f 20 45 20   },  /* .. to E 
99c0: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 43 2c 20 20  */.  { 0x00CC,  
99d0: 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x49, 0x00, 0x00
99e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8c  , 0x00 },  /* ..
99f0: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
9a00: 30 43 44 2c 20 20 30 78 34 39 2c 20 30 78 30 30  0CD,  0x49, 0x00
9a10: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
9a20: 20 2f 2a 20 c3 8d 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
9a30: 20 7b 20 30 78 30 30 43 45 2c 20 20 30 78 34 39   { 0x00CE,  0x49
9a40: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
9a50: 30 30 20 7d 2c 20 20 2f 2a 20 c3 8e 20 74 6f 20  00 },  /* .. to 
9a60: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 46 2c  I */.  { 0x00CF,
9a70: 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78    0x49, 0x00, 0x
9a80: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
9a90: c3 8f 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
9aa0: 78 30 30 44 30 2c 20 20 30 78 34 34 2c 20 30 78  x00D0,  0x44, 0x
9ab0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
9ac0: 2c 20 20 2f 2a 20 c3 90 20 74 6f 20 44 20 2a 2f  ,  /* .. to D */
9ad0: 0a 20 20 7b 20 30 78 30 30 44 31 2c 20 20 30 78  .  { 0x00D1,  0x
9ae0: 34 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  4E, 0x00, 0x00, 
9af0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 91 20 74  0x00 },  /* .. t
9b00: 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44  o N */.  { 0x00D
9b10: 32 2c 20 20 30 78 34 46 2c 20 30 78 30 30 2c 20  2,  0x4F, 0x00, 
9b20: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
9b30: 2a 20 c3 92 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b  * .. to O */.  {
9b40: 20 30 78 30 30 44 33 2c 20 20 30 78 34 46 2c 20   0x00D3,  0x4F, 
9b50: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
9b60: 20 7d 2c 20 20 2f 2a 20 c3 93 20 74 6f 20 4f 20   },  /* .. to O 
9b70: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 34 2c 20 20  */.  { 0x00D4,  
9b80: 30 78 34 46 2c 20 30 78 30 30 2c 20 30 78 30 30  0x4F, 0x00, 0x00
9b90: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 94  , 0x00 },  /* ..
9ba0: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
9bb0: 30 44 35 2c 20 20 30 78 34 46 2c 20 30 78 30 30  0D5,  0x4F, 0x00
9bc0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
9bd0: 20 2f 2a 20 c3 95 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
9be0: 20 7b 20 30 78 30 30 44 36 2c 20 20 30 78 34 46   { 0x00D6,  0x4F
9bf0: 2c 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78  , 0x65, 0x00, 0x
9c00: 30 30 20 7d 2c 20 20 2f 2a 20 c3 96 20 74 6f 20  00 },  /* .. to 
9c10: 4f 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 37  Oe */.  { 0x00D7
9c20: 2c 20 20 30 78 37 38 2c 20 30 78 30 30 2c 20 30  ,  0x78, 0x00, 0
9c30: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
9c40: 20 c3 97 20 74 6f 20 78 20 2a 2f 0a 20 20 7b 20   .. to x */.  { 
9c50: 30 78 30 30 44 38 2c 20 20 30 78 34 46 2c 20 30  0x00D8,  0x4F, 0
9c60: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
9c70: 7d 2c 20 20 2f 2a 20 c3 98 20 74 6f 20 4f 20 2a  },  /* .. to O *
9c80: 2f 0a 20 20 7b 20 30 78 30 30 44 39 2c 20 20 30  /.  { 0x00D9,  0
9c90: 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x55, 0x00, 0x00,
9ca0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 99 20   0x00 },  /* .. 
9cb0: 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to U */.  { 0x00
9cc0: 44 41 2c 20 20 30 78 35 35 2c 20 30 78 30 30 2c  DA,  0x55, 0x00,
9cd0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
9ce0: 2f 2a 20 c3 9a 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
9cf0: 7b 20 30 78 30 30 44 42 2c 20 20 30 78 35 35 2c  { 0x00DB,  0x55,
9d00: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
9d10: 30 20 7d 2c 20 20 2f 2a 20 c3 9b 20 74 6f 20 55  0 },  /* .. to U
9d20: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 43 2c 20   */.  { 0x00DC, 
9d30: 20 30 78 35 35 2c 20 30 78 36 35 2c 20 30 78 30   0x55, 0x65, 0x0
9d40: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
9d50: 9c 20 74 6f 20 55 65 20 2a 2f 0a 20 20 7b 20 30  . to Ue */.  { 0
9d60: 78 30 30 44 44 2c 20 20 30 78 35 39 2c 20 30 78  x00DD,  0x59, 0x
9d70: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
9d80: 2c 20 20 2f 2a 20 c3 9d 20 74 6f 20 59 20 2a 2f  ,  /* .. to Y */
9d90: 0a 20 20 7b 20 30 78 30 30 44 45 2c 20 20 30 78  .  { 0x00DE,  0x
9da0: 35 34 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20  54, 0x68, 0x00, 
9db0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9e 20 74  0x00 },  /* .. t
9dc0: 6f 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78 30 30  o Th */.  { 0x00
9dd0: 44 46 2c 20 20 30 78 37 33 2c 20 30 78 37 33 2c  DF,  0x73, 0x73,
9de0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
9df0: 2f 2a 20 c3 9f 20 74 6f 20 73 73 20 2a 2f 0a 20  /* .. to ss */. 
9e00: 20 7b 20 30 78 30 30 45 30 2c 20 20 30 78 36 31   { 0x00E0,  0x61
9e10: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
9e20: 30 30 20 7d 2c 20 20 2f 2a 20 c3 a0 20 74 6f 20  00 },  /* .. to 
9e30: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 31 2c  a */.  { 0x00E1,
9e40: 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78    0x61, 0x00, 0x
9e50: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
9e60: c3 a1 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30  .. to a */.  { 0
9e70: 78 30 30 45 32 2c 20 20 30 78 36 31 2c 20 30 78  x00E2,  0x61, 0x
9e80: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
9e90: 2c 20 20 2f 2a 20 c3 a2 20 74 6f 20 61 20 2a 2f  ,  /* .. to a */
9ea0: 0a 20 20 7b 20 30 78 30 30 45 33 2c 20 20 30 78  .  { 0x00E3,  0x
9eb0: 36 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  61, 0x00, 0x00, 
9ec0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a3 20 74  0x00 },  /* .. t
9ed0: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45  o a */.  { 0x00E
9ee0: 34 2c 20 20 30 78 36 31 2c 20 30 78 36 35 2c 20  4,  0x61, 0x65, 
9ef0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
9f00: 2a 20 c3 a4 20 74 6f 20 61 65 20 2a 2f 0a 20 20  * .. to ae */.  
9f10: 7b 20 30 78 30 30 45 35 2c 20 20 30 78 36 31 2c  { 0x00E5,  0x61,
9f20: 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78 30   0x61, 0x00, 0x0
9f30: 30 20 7d 2c 20 20 2f 2a 20 c3 a5 20 74 6f 20 61  0 },  /* .. to a
9f40: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 36 2c  a */.  { 0x00E6,
9f50: 20 20 30 78 36 31 2c 20 30 78 36 35 2c 20 30 78    0x61, 0x65, 0x
9f60: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
9f70: c3 a6 20 74 6f 20 61 65 20 2a 2f 0a 20 20 7b 20  .. to ae */.  { 
9f80: 30 78 30 30 45 37 2c 20 20 30 78 36 33 2c 20 30  0x00E7,  0x63, 0
9f90: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
9fa0: 7d 2c 20 20 2f 2a 20 c3 a7 20 74 6f 20 63 20 2a  },  /* .. to c *
9fb0: 2f 0a 20 20 7b 20 30 78 30 30 45 38 2c 20 20 30  /.  { 0x00E8,  0
9fc0: 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x65, 0x00, 0x00,
9fd0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a8 20   0x00 },  /* .. 
9fe0: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to e */.  { 0x00
9ff0: 45 39 2c 20 20 30 78 36 35 2c 20 30 78 30 30 2c  E9,  0x65, 0x00,
a000: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
a010: 2f 2a 20 c3 a9 20 74 6f 20 65 20 2a 2f 0a 20 20  /* .. to e */.  
a020: 7b 20 30 78 30 30 45 41 2c 20 20 30 78 36 35 2c  { 0x00EA,  0x65,
a030: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
a040: 30 20 7d 2c 20 20 2f 2a 20 c3 aa 20 74 6f 20 65  0 },  /* .. to e
a050: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 42 2c 20   */.  { 0x00EB, 
a060: 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30   0x65, 0x00, 0x0
a070: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
a080: ab 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
a090: 30 30 45 43 2c 20 20 30 78 36 39 2c 20 30 78 30  00EC,  0x69, 0x0
a0a0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
a0b0: 20 20 2f 2a 20 c3 ac 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
a0c0: 20 20 7b 20 30 78 30 30 45 44 2c 20 20 30 78 36    { 0x00ED,  0x6
a0d0: 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  9, 0x00, 0x00, 0
a0e0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ad 20 74 6f  x00 },  /* .. to
a0f0: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 45   i */.  { 0x00EE
a100: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30  ,  0x69, 0x00, 0
a110: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
a120: 20 c3 ae 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
a130: 30 78 30 30 45 46 2c 20 20 30 78 36 39 2c 20 30  0x00EF,  0x69, 0
a140: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
a150: 7d 2c 20 20 2f 2a 20 c3 af 20 74 6f 20 69 20 2a  },  /* .. to i *
a160: 2f 0a 20 20 7b 20 30 78 30 30 46 30 2c 20 20 30  /.  { 0x00F0,  0
a170: 78 36 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x64, 0x00, 0x00,
a180: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b0 20   0x00 },  /* .. 
a190: 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to d */.  { 0x00
a1a0: 46 31 2c 20 20 30 78 36 45 2c 20 30 78 30 30 2c  F1,  0x6E, 0x00,
a1b0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
a1c0: 2f 2a 20 c3 b1 20 74 6f 20 6e 20 2a 2f 0a 20 20  /* .. to n */.  
a1d0: 7b 20 30 78 30 30 46 32 2c 20 20 30 78 36 46 2c  { 0x00F2,  0x6F,
a1e0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
a1f0: 30 20 7d 2c 20 20 2f 2a 20 c3 b2 20 74 6f 20 6f  0 },  /* .. to o
a200: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 33 2c 20   */.  { 0x00F3, 
a210: 20 30 78 36 46 2c 20 30 78 30 30 2c 20 30 78 30   0x6F, 0x00, 0x0
a220: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  0, 0x00 },  /* .
a230: b3 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
a240: 30 30 46 34 2c 20 20 30 78 36 46 2c 20 30 78 30  00F4,  0x6F, 0x0
a250: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
a260: 20 20 2f 2a 20 c3 b4 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
a270: 20 20 7b 20 30 78 30 30 46 35 2c 20 20 30 78 36    { 0x00F5,  0x6
a280: 46 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  F, 0x00, 0x00, 0
a290: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b5 20 74 6f  x00 },  /* .. to
a2a0: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 36   o */.  { 0x00F6
a2b0: 2c 20 20 30 78 36 46 2c 20 30 78 36 35 2c 20 30  ,  0x6F, 0x65, 0
a2c0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
a2d0: 20 c3 b6 20 74 6f 20 6f 65 20 2a 2f 0a 20 20 7b   .. to oe */.  {
a2e0: 20 30 78 30 30 46 37 2c 20 20 30 78 33 41 2c 20   0x00F7,  0x3A, 
a2f0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
a300: 20 7d 2c 20 20 2f 2a 20 c3 b7 20 74 6f 20 3a 20   },  /* .. to : 
a310: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 38 2c 20 20  */.  { 0x00F8,  
a320: 30 78 36 46 2c 20 30 78 30 30 2c 20 30 78 30 30  0x6F, 0x00, 0x00
a330: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b8  , 0x00 },  /* ..
a340: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
a350: 30 46 39 2c 20 20 30 78 37 35 2c 20 30 78 30 30  0F9,  0x75, 0x00
a360: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a370: 20 2f 2a 20 c3 b9 20 74 6f 20 75 20 2a 2f 0a 20   /* .. to u */. 
a380: 20 7b 20 30 78 30 30 46 41 2c 20 20 30 78 37 35   { 0x00FA,  0x75
a390: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a3a0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 ba 20 74 6f 20  00 },  /* .. to 
a3b0: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 42 2c  u */.  { 0x00FB,
a3c0: 20 20 30 78 37 35 2c 20 30 78 30 30 2c 20 30 78    0x75, 0x00, 0x
a3d0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a3e0: c3 bb 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30  .. to u */.  { 0
a3f0: 78 30 30 46 43 2c 20 20 30 78 37 35 2c 20 30 78  x00FC,  0x75, 0x
a400: 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  65, 0x00, 0x00 }
a410: 2c 20 20 2f 2a 20 c3 bc 20 74 6f 20 75 65 20 2a  ,  /* .. to ue *
a420: 2f 0a 20 20 7b 20 30 78 30 30 46 44 2c 20 20 30  /.  { 0x00FD,  0
a430: 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x79, 0x00, 0x00,
a440: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bd 20   0x00 },  /* .. 
a450: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to y */.  { 0x00
a460: 46 45 2c 20 20 30 78 37 34 2c 20 30 78 36 38 2c  FE,  0x74, 0x68,
a470: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
a480: 2f 2a 20 c3 be 20 74 6f 20 74 68 20 2a 2f 0a 20  /* .. to th */. 
a490: 20 7b 20 30 78 30 30 46 46 2c 20 20 30 78 37 39   { 0x00FF,  0x79
a4a0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a4b0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 bf 20 74 6f 20  00 },  /* .. to 
a4c0: 79 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 30 2c  y */.  { 0x0100,
a4d0: 20 20 30 78 34 31 2c 20 30 78 30 30 2c 20 30 78    0x41, 0x00, 0x
a4e0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a4f0: c4 80 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30  .. to A */.  { 0
a500: 78 30 31 30 31 2c 20 20 30 78 36 31 2c 20 30 78  x0101,  0x61, 0x
a510: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
a520: 2c 20 20 2f 2a 20 c4 81 20 74 6f 20 61 20 2a 2f  ,  /* .. to a */
a530: 0a 20 20 7b 20 30 78 30 31 30 32 2c 20 20 30 78  .  { 0x0102,  0x
a540: 34 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  41, 0x00, 0x00, 
a550: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 82 20 74  0x00 },  /* .. t
a560: 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o A */.  { 0x010
a570: 33 2c 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20  3,  0x61, 0x00, 
a580: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
a590: 2a 20 c4 83 20 74 6f 20 61 20 2a 2f 0a 20 20 7b  * .. to a */.  {
a5a0: 20 30 78 30 31 30 34 2c 20 20 30 78 34 31 2c 20   0x0104,  0x41, 
a5b0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
a5c0: 20 7d 2c 20 20 2f 2a 20 c4 84 20 74 6f 20 41 20   },  /* .. to A 
a5d0: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 35 2c 20 20  */.  { 0x0105,  
a5e0: 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78 30 30  0x61, 0x00, 0x00
a5f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 85  , 0x00 },  /* ..
a600: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
a610: 31 30 36 2c 20 20 30 78 34 33 2c 20 30 78 30 30  106,  0x43, 0x00
a620: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a630: 20 2f 2a 20 c4 86 20 74 6f 20 43 20 2a 2f 0a 20   /* .. to C */. 
a640: 20 7b 20 30 78 30 31 30 37 2c 20 20 30 78 36 33   { 0x0107,  0x63
a650: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a660: 30 30 20 7d 2c 20 20 2f 2a 20 c4 87 20 74 6f 20  00 },  /* .. to 
a670: 63 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 38 2c  c */.  { 0x0108,
a680: 20 20 30 78 34 33 2c 20 30 78 36 38 2c 20 30 78    0x43, 0x68, 0x
a690: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a6a0: c4 88 20 74 6f 20 43 68 20 2a 2f 0a 20 20 7b 20  .. to Ch */.  { 
a6b0: 30 78 30 31 30 39 2c 20 20 30 78 36 33 2c 20 30  0x0109,  0x63, 0
a6c0: 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x68, 0x00, 0x00 
a6d0: 7d 2c 20 20 2f 2a 20 c4 89 20 74 6f 20 63 68 20  },  /* .. to ch 
a6e0: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 41 2c 20 20  */.  { 0x010A,  
a6f0: 30 78 34 33 2c 20 30 78 30 30 2c 20 30 78 30 30  0x43, 0x00, 0x00
a700: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8a  , 0x00 },  /* ..
a710: 20 74 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30   to C */.  { 0x0
a720: 31 30 42 2c 20 20 30 78 36 33 2c 20 30 78 30 30  10B,  0x63, 0x00
a730: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a740: 20 2f 2a 20 c4 8b 20 74 6f 20 63 20 2a 2f 0a 20   /* .. to c */. 
a750: 20 7b 20 30 78 30 31 30 43 2c 20 20 30 78 34 33   { 0x010C,  0x43
a760: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a770: 30 30 20 7d 2c 20 20 2f 2a 20 c4 8c 20 74 6f 20  00 },  /* .. to 
a780: 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 44 2c  C */.  { 0x010D,
a790: 20 20 30 78 36 33 2c 20 30 78 30 30 2c 20 30 78    0x63, 0x00, 0x
a7a0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a7b0: c4 8d 20 74 6f 20 63 20 2a 2f 0a 20 20 7b 20 30  .. to c */.  { 0
a7c0: 78 30 31 30 45 2c 20 20 30 78 34 34 2c 20 30 78  x010E,  0x44, 0x
a7d0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
a7e0: 2c 20 20 2f 2a 20 c4 8e 20 74 6f 20 44 20 2a 2f  ,  /* .. to D */
a7f0: 0a 20 20 7b 20 30 78 30 31 30 46 2c 20 20 30 78  .  { 0x010F,  0x
a800: 36 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  64, 0x00, 0x00, 
a810: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8f 20 74  0x00 },  /* .. t
a820: 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o d */.  { 0x011
a830: 30 2c 20 20 30 78 34 34 2c 20 30 78 30 30 2c 20  0,  0x44, 0x00, 
a840: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
a850: 2a 20 c4 90 20 74 6f 20 44 20 2a 2f 0a 20 20 7b  * .. to D */.  {
a860: 20 30 78 30 31 31 31 2c 20 20 30 78 36 34 2c 20   0x0111,  0x64, 
a870: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
a880: 20 7d 2c 20 20 2f 2a 20 c4 91 20 74 6f 20 64 20   },  /* .. to d 
a890: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 32 2c 20 20  */.  { 0x0112,  
a8a0: 30 78 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30  0x45, 0x00, 0x00
a8b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 92  , 0x00 },  /* ..
a8c0: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
a8d0: 31 31 33 2c 20 20 30 78 36 35 2c 20 30 78 30 30  113,  0x65, 0x00
a8e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
a8f0: 20 2f 2a 20 c4 93 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
a900: 20 7b 20 30 78 30 31 31 34 2c 20 20 30 78 34 35   { 0x0114,  0x45
a910: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
a920: 30 30 20 7d 2c 20 20 2f 2a 20 c4 94 20 74 6f 20  00 },  /* .. to 
a930: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 35 2c  E */.  { 0x0115,
a940: 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78    0x65, 0x00, 0x
a950: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
a960: c4 95 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
a970: 78 30 31 31 36 2c 20 20 30 78 34 35 2c 20 30 78  x0116,  0x45, 0x
a980: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
a990: 2c 20 20 2f 2a 20 c4 96 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
a9a0: 0a 20 20 7b 20 30 78 30 31 31 37 2c 20 20 30 78  .  { 0x0117,  0x
a9b0: 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  65, 0x00, 0x00, 
a9c0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 97 20 74  0x00 },  /* .. t
a9d0: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o e */.  { 0x011
a9e0: 38 2c 20 20 30 78 34 35 2c 20 30 78 30 30 2c 20  8,  0x45, 0x00, 
a9f0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
aa00: 2a 20 c4 98 20 74 6f 20 45 20 2a 2f 0a 20 20 7b  * .. to E */.  {
aa10: 20 30 78 30 31 31 39 2c 20 20 30 78 36 35 2c 20   0x0119,  0x65, 
aa20: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
aa30: 20 7d 2c 20 20 2f 2a 20 c4 99 20 74 6f 20 65 20   },  /* .. to e 
aa40: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 41 2c 20 20  */.  { 0x011A,  
aa50: 30 78 34 35 2c 20 30 78 30 30 2c 20 30 78 30 30  0x45, 0x00, 0x00
aa60: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9a  , 0x00 },  /* ..
aa70: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
aa80: 31 31 42 2c 20 20 30 78 36 35 2c 20 30 78 30 30  11B,  0x65, 0x00
aa90: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
aaa0: 20 2f 2a 20 c4 9b 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
aab0: 20 7b 20 30 78 30 31 31 43 2c 20 20 30 78 34 37   { 0x011C,  0x47
aac0: 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78  , 0x68, 0x00, 0x
aad0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 9c 20 74 6f 20  00 },  /* .. to 
aae0: 47 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 44  Gh */.  { 0x011D
aaf0: 2c 20 20 30 78 36 37 2c 20 30 78 36 38 2c 20 30  ,  0x67, 0x68, 0
ab00: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
ab10: 20 c4 9d 20 74 6f 20 67 68 20 2a 2f 0a 20 20 7b   .. to gh */.  {
ab20: 20 30 78 30 31 31 45 2c 20 20 30 78 34 37 2c 20   0x011E,  0x47, 
ab30: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
ab40: 20 7d 2c 20 20 2f 2a 20 c4 9e 20 74 6f 20 47 20   },  /* .. to G 
ab50: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 46 2c 20 20  */.  { 0x011F,  
ab60: 30 78 36 37 2c 20 30 78 30 30 2c 20 30 78 30 30  0x67, 0x00, 0x00
ab70: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 9f  , 0x00 },  /* ..
ab80: 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30   to g */.  { 0x0
ab90: 31 32 30 2c 20 20 30 78 34 37 2c 20 30 78 30 30  120,  0x47, 0x00
aba0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
abb0: 20 2f 2a 20 c4 a0 20 74 6f 20 47 20 2a 2f 0a 20   /* .. to G */. 
abc0: 20 7b 20 30 78 30 31 32 31 2c 20 20 30 78 36 37   { 0x0121,  0x67
abd0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
abe0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 a1 20 74 6f 20  00 },  /* .. to 
abf0: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 32 2c  g */.  { 0x0122,
ac00: 20 20 30 78 34 37 2c 20 30 78 30 30 2c 20 30 78    0x47, 0x00, 0x
ac10: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
ac20: c4 a2 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30  .. to G */.  { 0
ac30: 78 30 31 32 33 2c 20 20 30 78 36 37 2c 20 30 78  x0123,  0x67, 0x
ac40: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
ac50: 2c 20 20 2f 2a 20 c4 a3 20 74 6f 20 67 20 2a 2f  ,  /* .. to g */
ac60: 0a 20 20 7b 20 30 78 30 31 32 34 2c 20 20 30 78  .  { 0x0124,  0x
ac70: 34 38 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20  48, 0x68, 0x00, 
ac80: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a4 20 74  0x00 },  /* .. t
ac90: 6f 20 48 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o Hh */.  { 0x01
aca0: 32 35 2c 20 20 30 78 36 38 2c 20 30 78 36 38 2c  25,  0x68, 0x68,
acb0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
acc0: 2f 2a 20 c4 a5 20 74 6f 20 68 68 20 2a 2f 0a 20  /* .. to hh */. 
acd0: 20 7b 20 30 78 30 31 32 36 2c 20 20 30 78 34 38   { 0x0126,  0x48
ace0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
acf0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 a6 20 74 6f 20  00 },  /* .. to 
ad00: 48 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 37 2c  H */.  { 0x0127,
ad10: 20 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78    0x68, 0x00, 0x
ad20: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
ad30: c4 a7 20 74 6f 20 68 20 2a 2f 0a 20 20 7b 20 30  .. to h */.  { 0
ad40: 78 30 31 32 38 2c 20 20 30 78 34 39 2c 20 30 78  x0128,  0x49, 0x
ad50: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
ad60: 2c 20 20 2f 2a 20 c4 a8 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
ad70: 0a 20 20 7b 20 30 78 30 31 32 39 2c 20 20 30 78  .  { 0x0129,  0x
ad80: 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  69, 0x00, 0x00, 
ad90: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a9 20 74  0x00 },  /* .. t
ada0: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o i */.  { 0x012
adb0: 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20  A,  0x49, 0x00, 
adc0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
add0: 2a 20 c4 aa 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
ade0: 20 30 78 30 31 32 42 2c 20 20 30 78 36 39 2c 20   0x012B,  0x69, 
adf0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
ae00: 20 7d 2c 20 20 2f 2a 20 c4 ab 20 74 6f 20 69 20   },  /* .. to i 
ae10: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 43 2c 20 20  */.  { 0x012C,  
ae20: 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30  0x49, 0x00, 0x00
ae30: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ac  , 0x00 },  /* ..
ae40: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
ae50: 31 32 44 2c 20 20 30 78 36 39 2c 20 30 78 30 30  12D,  0x69, 0x00
ae60: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
ae70: 20 2f 2a 20 c4 ad 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
ae80: 20 7b 20 30 78 30 31 32 45 2c 20 20 30 78 34 39   { 0x012E,  0x49
ae90: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
aea0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 ae 20 74 6f 20  00 },  /* .. to 
aeb0: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 46 2c  I */.  { 0x012F,
aec0: 20 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78    0x69, 0x00, 0x
aed0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
aee0: c4 af 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
aef0: 78 30 31 33 30 2c 20 20 30 78 34 39 2c 20 30 78  x0130,  0x49, 0x
af00: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
af10: 2c 20 20 2f 2a 20 c4 b0 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
af20: 0a 20 20 7b 20 30 78 30 31 33 31 2c 20 20 30 78  .  { 0x0131,  0x
af30: 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  69, 0x00, 0x00, 
af40: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b1 20 74  0x00 },  /* .. t
af50: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o i */.  { 0x013
af60: 32 2c 20 20 30 78 34 39 2c 20 30 78 34 41 2c 20  2,  0x49, 0x4A, 
af70: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
af80: 2a 20 c4 b2 20 74 6f 20 49 4a 20 2a 2f 0a 20 20  * .. to IJ */.  
af90: 7b 20 30 78 30 31 33 33 2c 20 20 30 78 36 39 2c  { 0x0133,  0x69,
afa0: 20 30 78 36 41 2c 20 30 78 30 30 2c 20 30 78 30   0x6A, 0x00, 0x0
afb0: 30 20 7d 2c 20 20 2f 2a 20 c4 b3 20 74 6f 20 69  0 },  /* .. to i
afc0: 6a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 34 2c  j */.  { 0x0134,
afd0: 20 20 30 78 34 41 2c 20 30 78 36 38 2c 20 30 78    0x4A, 0x68, 0x
afe0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
aff0: c4 b4 20 74 6f 20 4a 68 20 2a 2f 0a 20 20 7b 20  .. to Jh */.  { 
b000: 30 78 30 31 33 35 2c 20 20 30 78 36 41 2c 20 30  0x0135,  0x6A, 0
b010: 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x68, 0x00, 0x00 
b020: 7d 2c 20 20 2f 2a 20 c4 b5 20 74 6f 20 6a 68 20  },  /* .. to jh 
b030: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 36 2c 20 20  */.  { 0x0136,  
b040: 30 78 34 42 2c 20 30 78 30 30 2c 20 30 78 30 30  0x4B, 0x00, 0x00
b050: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 b6  , 0x00 },  /* ..
b060: 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30   to K */.  { 0x0
b070: 31 33 37 2c 20 20 30 78 36 42 2c 20 30 78 30 30  137,  0x6B, 0x00
b080: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
b090: 20 2f 2a 20 c4 b7 20 74 6f 20 6b 20 2a 2f 0a 20   /* .. to k */. 
b0a0: 20 7b 20 30 78 30 31 33 38 2c 20 20 30 78 36 42   { 0x0138,  0x6B
b0b0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
b0c0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 b8 20 74 6f 20  00 },  /* .. to 
b0d0: 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 39 2c  k */.  { 0x0139,
b0e0: 20 20 30 78 34 43 2c 20 30 78 30 30 2c 20 30 78    0x4C, 0x00, 0x
b0f0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b100: c4 b9 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30  .. to L */.  { 0
b110: 78 30 31 33 41 2c 20 20 30 78 36 43 2c 20 30 78  x013A,  0x6C, 0x
b120: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
b130: 2c 20 20 2f 2a 20 c4 ba 20 74 6f 20 6c 20 2a 2f  ,  /* .. to l */
b140: 0a 20 20 7b 20 30 78 30 31 33 42 2c 20 20 30 78  .  { 0x013B,  0x
b150: 34 43 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  4C, 0x00, 0x00, 
b160: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 bb 20 74  0x00 },  /* .. t
b170: 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o L */.  { 0x013
b180: 43 2c 20 20 30 78 36 43 2c 20 30 78 30 30 2c 20  C,  0x6C, 0x00, 
b190: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b1a0: 2a 20 c4 bc 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b  * .. to l */.  {
b1b0: 20 30 78 30 31 33 44 2c 20 20 30 78 34 43 2c 20   0x013D,  0x4C, 
b1c0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
b1d0: 20 7d 2c 20 20 2f 2a 20 c4 bd 20 74 6f 20 4c 20   },  /* .. to L 
b1e0: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 45 2c 20 20  */.  { 0x013E,  
b1f0: 30 78 36 43 2c 20 30 78 30 30 2c 20 30 78 30 30  0x6C, 0x00, 0x00
b200: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 be  , 0x00 },  /* ..
b210: 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30   to l */.  { 0x0
b220: 31 33 46 2c 20 20 30 78 34 43 2c 20 30 78 32 45  13F,  0x4C, 0x2E
b230: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
b240: 20 2f 2a 20 c4 bf 20 74 6f 20 4c 2e 20 2a 2f 0a   /* .. to L. */.
b250: 20 20 7b 20 30 78 30 31 34 30 2c 20 20 30 78 36    { 0x0140,  0x6
b260: 43 2c 20 30 78 32 45 2c 20 30 78 30 30 2c 20 30  C, 0x2E, 0x00, 0
b270: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 80 20 74 6f  x00 },  /* .. to
b280: 20 6c 2e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34   l. */.  { 0x014
b290: 31 2c 20 20 30 78 34 43 2c 20 30 78 30 30 2c 20  1,  0x4C, 0x00, 
b2a0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b2b0: 2a 20 c5 81 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b  * .. to L */.  {
b2c0: 20 30 78 30 31 34 32 2c 20 20 30 78 36 43 2c 20   0x0142,  0x6C, 
b2d0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
b2e0: 20 7d 2c 20 20 2f 2a 20 c5 82 20 74 6f 20 6c 20   },  /* .. to l 
b2f0: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 33 2c 20 20  */.  { 0x0143,  
b300: 30 78 34 45 2c 20 30 78 30 30 2c 20 30 78 30 30  0x4E, 0x00, 0x00
b310: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 83  , 0x00 },  /* ..
b320: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
b330: 31 34 34 2c 20 20 30 78 36 45 2c 20 30 78 30 30  144,  0x6E, 0x00
b340: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
b350: 20 2f 2a 20 c5 84 20 74 6f 20 6e 20 2a 2f 0a 20   /* .. to n */. 
b360: 20 7b 20 30 78 30 31 34 35 2c 20 20 30 78 34 45   { 0x0145,  0x4E
b370: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
b380: 30 30 20 7d 2c 20 20 2f 2a 20 c5 85 20 74 6f 20  00 },  /* .. to 
b390: 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 36 2c  N */.  { 0x0146,
b3a0: 20 20 30 78 36 45 2c 20 30 78 30 30 2c 20 30 78    0x6E, 0x00, 0x
b3b0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b3c0: c5 86 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30  .. to n */.  { 0
b3d0: 78 30 31 34 37 2c 20 20 30 78 34 45 2c 20 30 78  x0147,  0x4E, 0x
b3e0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
b3f0: 2c 20 20 2f 2a 20 c5 87 20 74 6f 20 4e 20 2a 2f  ,  /* .. to N */
b400: 0a 20 20 7b 20 30 78 30 31 34 38 2c 20 20 30 78  .  { 0x0148,  0x
b410: 36 45 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  6E, 0x00, 0x00, 
b420: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 88 20 74  0x00 },  /* .. t
b430: 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34  o n */.  { 0x014
b440: 39 2c 20 20 30 78 32 37 2c 20 30 78 36 45 2c 20  9,  0x27, 0x6E, 
b450: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b460: 2a 20 c5 89 20 74 6f 20 27 6e 20 2a 2f 0a 20 20  * .. to 'n */.  
b470: 7b 20 30 78 30 31 34 41 2c 20 20 30 78 34 45 2c  { 0x014A,  0x4E,
b480: 20 30 78 34 37 2c 20 30 78 30 30 2c 20 30 78 30   0x47, 0x00, 0x0
b490: 30 20 7d 2c 20 20 2f 2a 20 c5 8a 20 74 6f 20 4e  0 },  /* .. to N
b4a0: 47 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 42 2c  G */.  { 0x014B,
b4b0: 20 20 30 78 36 45 2c 20 30 78 36 37 2c 20 30 78    0x6E, 0x67, 0x
b4c0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b4d0: c5 8b 20 74 6f 20 6e 67 20 2a 2f 0a 20 20 7b 20  .. to ng */.  { 
b4e0: 30 78 30 31 34 43 2c 20 20 30 78 34 46 2c 20 30  0x014C,  0x4F, 0
b4f0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
b500: 7d 2c 20 20 2f 2a 20 c5 8c 20 74 6f 20 4f 20 2a  },  /* .. to O *
b510: 2f 0a 20 20 7b 20 30 78 30 31 34 44 2c 20 20 30  /.  { 0x014D,  0
b520: 78 36 46 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x6F, 0x00, 0x00,
b530: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8d 20   0x00 },  /* .. 
b540: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to o */.  { 0x01
b550: 34 45 2c 20 20 30 78 34 46 2c 20 30 78 30 30 2c  4E,  0x4F, 0x00,
b560: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b570: 2f 2a 20 c5 8e 20 74 6f 20 4f 20 2a 2f 0a 20 20  /* .. to O */.  
b580: 7b 20 30 78 30 31 34 46 2c 20 20 30 78 36 46 2c  { 0x014F,  0x6F,
b590: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
b5a0: 30 20 7d 2c 20 20 2f 2a 20 c5 8f 20 74 6f 20 6f  0 },  /* .. to o
b5b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 30 2c 20   */.  { 0x0150, 
b5c0: 20 30 78 34 46 2c 20 30 78 30 30 2c 20 30 78 30   0x4F, 0x00, 0x0
b5d0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
b5e0: 90 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
b5f0: 30 31 35 31 2c 20 20 30 78 36 46 2c 20 30 78 30  0151,  0x6F, 0x0
b600: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
b610: 20 20 2f 2a 20 c5 91 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
b620: 20 20 7b 20 30 78 30 31 35 32 2c 20 20 30 78 34    { 0x0152,  0x4
b630: 46 2c 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30  F, 0x45, 0x00, 0
b640: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 92 20 74 6f  x00 },  /* .. to
b650: 20 4f 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35   OE */.  { 0x015
b660: 33 2c 20 20 30 78 36 46 2c 20 30 78 36 35 2c 20  3,  0x6F, 0x65, 
b670: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
b680: 2a 20 c5 93 20 74 6f 20 6f 65 20 2a 2f 0a 20 20  * .. to oe */.  
b690: 7b 20 30 78 30 31 35 34 2c 20 20 30 78 35 32 2c  { 0x0154,  0x52,
b6a0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
b6b0: 30 20 7d 2c 20 20 2f 2a 20 c5 94 20 74 6f 20 52  0 },  /* .. to R
b6c0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 35 2c 20   */.  { 0x0155, 
b6d0: 20 30 78 37 32 2c 20 30 78 30 30 2c 20 30 78 30   0x72, 0x00, 0x0
b6e0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
b6f0: 95 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30 78  . to r */.  { 0x
b700: 30 31 35 36 2c 20 20 30 78 35 32 2c 20 30 78 30  0156,  0x52, 0x0
b710: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
b720: 20 20 2f 2a 20 c5 96 20 74 6f 20 52 20 2a 2f 0a    /* .. to R */.
b730: 20 20 7b 20 30 78 30 31 35 37 2c 20 20 30 78 37    { 0x0157,  0x7
b740: 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  2, 0x00, 0x00, 0
b750: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 97 20 74 6f  x00 },  /* .. to
b760: 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 38   r */.  { 0x0158
b770: 2c 20 20 30 78 35 32 2c 20 30 78 30 30 2c 20 30  ,  0x52, 0x00, 0
b780: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
b790: 20 c5 98 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20   .. to R */.  { 
b7a0: 30 78 30 31 35 39 2c 20 20 30 78 37 32 2c 20 30  0x0159,  0x72, 0
b7b0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
b7c0: 7d 2c 20 20 2f 2a 20 c5 99 20 74 6f 20 72 20 2a  },  /* .. to r *
b7d0: 2f 0a 20 20 7b 20 30 78 30 31 35 41 2c 20 20 30  /.  { 0x015A,  0
b7e0: 78 35 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x53, 0x00, 0x00,
b7f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9a 20   0x00 },  /* .. 
b800: 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to S */.  { 0x01
b810: 35 42 2c 20 20 30 78 37 33 2c 20 30 78 30 30 2c  5B,  0x73, 0x00,
b820: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b830: 2f 2a 20 c5 9b 20 74 6f 20 73 20 2a 2f 0a 20 20  /* .. to s */.  
b840: 7b 20 30 78 30 31 35 43 2c 20 20 30 78 35 33 2c  { 0x015C,  0x53,
b850: 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30   0x68, 0x00, 0x0
b860: 30 20 7d 2c 20 20 2f 2a 20 c5 9c 20 74 6f 20 53  0 },  /* .. to S
b870: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 44 2c  h */.  { 0x015D,
b880: 20 20 30 78 37 33 2c 20 30 78 36 38 2c 20 30 78    0x73, 0x68, 0x
b890: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
b8a0: c5 9d 20 74 6f 20 73 68 20 2a 2f 0a 20 20 7b 20  .. to sh */.  { 
b8b0: 30 78 30 31 35 45 2c 20 20 30 78 35 33 2c 20 30  0x015E,  0x53, 0
b8c0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
b8d0: 7d 2c 20 20 2f 2a 20 c5 9e 20 74 6f 20 53 20 2a  },  /* .. to S *
b8e0: 2f 0a 20 20 7b 20 30 78 30 31 35 46 2c 20 20 30  /.  { 0x015F,  0
b8f0: 78 37 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x73, 0x00, 0x00,
b900: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 9f 20   0x00 },  /* .. 
b910: 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to s */.  { 0x01
b920: 36 30 2c 20 20 30 78 35 33 2c 20 30 78 30 30 2c  60,  0x53, 0x00,
b930: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
b940: 2f 2a 20 c5 a0 20 74 6f 20 53 20 2a 2f 0a 20 20  /* .. to S */.  
b950: 7b 20 30 78 30 31 36 31 2c 20 20 30 78 37 33 2c  { 0x0161,  0x73,
b960: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
b970: 30 20 7d 2c 20 20 2f 2a 20 c5 a1 20 74 6f 20 73  0 },  /* .. to s
b980: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 32 2c 20   */.  { 0x0162, 
b990: 20 30 78 35 34 2c 20 30 78 30 30 2c 20 30 78 30   0x54, 0x00, 0x0
b9a0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
b9b0: a2 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78  . to T */.  { 0x
b9c0: 30 31 36 33 2c 20 20 30 78 37 34 2c 20 30 78 30  0163,  0x74, 0x0
b9d0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
b9e0: 20 20 2f 2a 20 c5 a3 20 74 6f 20 74 20 2a 2f 0a    /* .. to t */.
b9f0: 20 20 7b 20 30 78 30 31 36 34 2c 20 20 30 78 35    { 0x0164,  0x5
ba00: 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  4, 0x00, 0x00, 0
ba10: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a4 20 74 6f  x00 },  /* .. to
ba20: 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 35   T */.  { 0x0165
ba30: 2c 20 20 30 78 37 34 2c 20 30 78 30 30 2c 20 30  ,  0x74, 0x00, 0
ba40: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
ba50: 20 c5 a5 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20   .. to t */.  { 
ba60: 30 78 30 31 36 36 2c 20 20 30 78 35 34 2c 20 30  0x0166,  0x54, 0
ba70: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
ba80: 7d 2c 20 20 2f 2a 20 c5 a6 20 74 6f 20 54 20 2a  },  /* .. to T *
ba90: 2f 0a 20 20 7b 20 30 78 30 31 36 37 2c 20 20 30  /.  { 0x0167,  0
baa0: 78 37 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x74, 0x00, 0x00,
bab0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a7 20   0x00 },  /* .. 
bac0: 74 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to t */.  { 0x01
bad0: 36 38 2c 20 20 30 78 35 35 2c 20 30 78 30 30 2c  68,  0x55, 0x00,
bae0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
baf0: 2f 2a 20 c5 a8 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
bb00: 7b 20 30 78 30 31 36 39 2c 20 20 30 78 37 35 2c  { 0x0169,  0x75,
bb10: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
bb20: 30 20 7d 2c 20 20 2f 2a 20 c5 a9 20 74 6f 20 75  0 },  /* .. to u
bb30: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 41 2c 20   */.  { 0x016A, 
bb40: 20 30 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30   0x55, 0x00, 0x0
bb50: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
bb60: aa 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
bb70: 30 31 36 42 2c 20 20 30 78 37 35 2c 20 30 78 30  016B,  0x75, 0x0
bb80: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
bb90: 20 20 2f 2a 20 c5 ab 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
bba0: 20 20 7b 20 30 78 30 31 36 43 2c 20 20 30 78 35    { 0x016C,  0x5
bbb0: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
bbc0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ac 20 74 6f  x00 },  /* .. to
bbd0: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 44   U */.  { 0x016D
bbe0: 2c 20 20 30 78 37 35 2c 20 30 78 30 30 2c 20 30  ,  0x75, 0x00, 0
bbf0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
bc00: 20 c5 ad 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
bc10: 30 78 30 31 36 45 2c 20 20 30 78 35 35 2c 20 30  0x016E,  0x55, 0
bc20: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
bc30: 7d 2c 20 20 2f 2a 20 c5 ae 20 74 6f 20 55 20 2a  },  /* .. to U *
bc40: 2f 0a 20 20 7b 20 30 78 30 31 36 46 2c 20 20 30  /.  { 0x016F,  0
bc50: 78 37 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x75, 0x00, 0x00,
bc60: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 af 20   0x00 },  /* .. 
bc70: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to u */.  { 0x01
bc80: 37 30 2c 20 20 30 78 35 35 2c 20 30 78 30 30 2c  70,  0x55, 0x00,
bc90: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
bca0: 2f 2a 20 c5 b0 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
bcb0: 7b 20 30 78 30 31 37 31 2c 20 20 30 78 37 35 2c  { 0x0171,  0x75,
bcc0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
bcd0: 30 20 7d 2c 20 20 2f 2a 20 c5 b1 20 74 6f 20 75  0 },  /* .. to u
bce0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 32 2c 20   */.  { 0x0172, 
bcf0: 20 30 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30   0x55, 0x00, 0x0
bd00: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
bd10: b2 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
bd20: 30 31 37 33 2c 20 20 30 78 37 35 2c 20 30 78 30  0173,  0x75, 0x0
bd30: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
bd40: 20 20 2f 2a 20 c5 b3 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
bd50: 20 20 7b 20 30 78 30 31 37 34 2c 20 20 30 78 35    { 0x0174,  0x5
bd60: 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  7, 0x00, 0x00, 0
bd70: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b4 20 74 6f  x00 },  /* .. to
bd80: 20 57 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 35   W */.  { 0x0175
bd90: 2c 20 20 30 78 37 37 2c 20 30 78 30 30 2c 20 30  ,  0x77, 0x00, 0
bda0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
bdb0: 20 c5 b5 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20   .. to w */.  { 
bdc0: 30 78 30 31 37 36 2c 20 20 30 78 35 39 2c 20 30  0x0176,  0x59, 0
bdd0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
bde0: 7d 2c 20 20 2f 2a 20 c5 b6 20 74 6f 20 59 20 2a  },  /* .. to Y *
bdf0: 2f 0a 20 20 7b 20 30 78 30 31 37 37 2c 20 20 30  /.  { 0x0177,  0
be00: 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x79, 0x00, 0x00,
be10: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b7 20   0x00 },  /* .. 
be20: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to y */.  { 0x01
be30: 37 38 2c 20 20 30 78 35 39 2c 20 30 78 30 30 2c  78,  0x59, 0x00,
be40: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
be50: 2f 2a 20 c5 b8 20 74 6f 20 59 20 2a 2f 0a 20 20  /* .. to Y */.  
be60: 7b 20 30 78 30 31 37 39 2c 20 20 30 78 35 41 2c  { 0x0179,  0x5A,
be70: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
be80: 30 20 7d 2c 20 20 2f 2a 20 c5 b9 20 74 6f 20 5a  0 },  /* .. to Z
be90: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 41 2c 20   */.  { 0x017A, 
bea0: 20 30 78 37 41 2c 20 30 78 30 30 2c 20 30 78 30   0x7A, 0x00, 0x0
beb0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  0, 0x00 },  /* .
bec0: ba 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78  . to z */.  { 0x
bed0: 30 31 37 42 2c 20 20 30 78 35 41 2c 20 30 78 30  017B,  0x5A, 0x0
bee0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
bef0: 20 20 2f 2a 20 c5 bb 20 74 6f 20 5a 20 2a 2f 0a    /* .. to Z */.
bf00: 20 20 7b 20 30 78 30 31 37 43 2c 20 20 30 78 37    { 0x017C,  0x7
bf10: 41 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  A, 0x00, 0x00, 0
bf20: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bc 20 74 6f  x00 },  /* .. to
bf30: 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 44   z */.  { 0x017D
bf40: 2c 20 20 30 78 35 41 2c 20 30 78 30 30 2c 20 30  ,  0x5A, 0x00, 0
bf50: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
bf60: 20 c5 bd 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20   .. to Z */.  { 
bf70: 30 78 30 31 37 45 2c 20 20 30 78 37 41 2c 20 30  0x017E,  0x7A, 0
bf80: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
bf90: 7d 2c 20 20 2f 2a 20 c5 be 20 74 6f 20 7a 20 2a  },  /* .. to z *
bfa0: 2f 0a 20 20 7b 20 30 78 30 31 37 46 2c 20 20 30  /.  { 0x017F,  0
bfb0: 78 37 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x73, 0x00, 0x00,
bfc0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bf 20   0x00 },  /* .. 
bfd0: 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to s */.  { 0x01
bfe0: 39 32 2c 20 20 30 78 36 36 2c 20 30 78 30 30 2c  92,  0x66, 0x00,
bff0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
c000: 2f 2a 20 c6 92 20 74 6f 20 66 20 2a 2f 0a 20 20  /* .. to f */.  
c010: 7b 20 30 78 30 32 31 38 2c 20 20 30 78 35 33 2c  { 0x0218,  0x53,
c020: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
c030: 30 20 7d 2c 20 20 2f 2a 20 c8 98 20 74 6f 20 53  0 },  /* .. to S
c040: 20 2a 2f 0a 20 20 7b 20 30 78 30 32 31 39 2c 20   */.  { 0x0219, 
c050: 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30 78 30   0x73, 0x00, 0x0
c060: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8  0, 0x00 },  /* .
c070: 99 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
c080: 30 32 31 41 2c 20 20 30 78 35 34 2c 20 30 78 30  021A,  0x54, 0x0
c090: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
c0a0: 20 20 2f 2a 20 c8 9a 20 74 6f 20 54 20 2a 2f 0a    /* .. to T */.
c0b0: 20 20 7b 20 30 78 30 32 31 42 2c 20 20 30 78 37    { 0x021B,  0x7
c0c0: 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  4, 0x00, 0x00, 0
c0d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9b 20 74 6f  x00 },  /* .. to
c0e0: 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 36   t */.  { 0x0386
c0f0: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 2c 20 30  ,  0x41, 0x00, 0
c100: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
c110: 20 ce 86 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
c120: 30 78 30 33 38 38 2c 20 20 30 78 34 35 2c 20 30  0x0388,  0x45, 0
c130: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
c140: 7d 2c 20 20 2f 2a 20 ce 88 20 74 6f 20 45 20 2a  },  /* .. to E *
c150: 2f 0a 20 20 7b 20 30 78 30 33 38 39 2c 20 20 30  /.  { 0x0389,  0
c160: 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x49, 0x00, 0x00,
c170: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 89 20   0x00 },  /* .. 
c180: 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to I */.  { 0x03
c190: 38 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c  8A,  0x49, 0x00,
c1a0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
c1b0: 2f 2a 20 ce 8a 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
c1c0: 7b 20 30 78 30 33 38 43 2c 20 20 30 78 34 66 2c  { 0x038C,  0x4f,
c1d0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
c1e0: 30 20 7d 2c 20 20 2f 2a 20 ce 8c 20 74 6f 20 4f  0 },  /* .. to O
c1f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 45 2c 20   */.  { 0x038E, 
c200: 20 30 78 35 39 2c 20 30 78 30 30 2c 20 30 78 30   0x59, 0x00, 0x0
c210: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  0, 0x00 },  /* .
c220: 8e 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78  . to Y */.  { 0x
c230: 30 33 38 46 2c 20 20 30 78 34 66 2c 20 30 78 30  038F,  0x4f, 0x0
c240: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
c250: 20 20 2f 2a 20 ce 8f 20 74 6f 20 4f 20 2a 2f 0a    /* .. to O */.
c260: 20 20 7b 20 30 78 30 33 39 30 2c 20 20 30 78 36    { 0x0390,  0x6
c270: 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  9, 0x00, 0x00, 0
c280: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 90 20 74 6f  x00 },  /* .. to
c290: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 31   i */.  { 0x0391
c2a0: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 2c 20 30  ,  0x41, 0x00, 0
c2b0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
c2c0: 20 ce 91 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
c2d0: 30 78 30 33 39 32 2c 20 20 30 78 34 32 2c 20 30  0x0392,  0x42, 0
c2e0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
c2f0: 7d 2c 20 20 2f 2a 20 ce 92 20 74 6f 20 42 20 2a  },  /* .. to B *
c300: 2f 0a 20 20 7b 20 30 78 30 33 39 33 2c 20 20 30  /.  { 0x0393,  0
c310: 78 34 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x47, 0x00, 0x00,
c320: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 93 20   0x00 },  /* .. 
c330: 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to G */.  { 0x03
c340: 39 34 2c 20 20 30 78 34 34 2c 20 30 78 30 30 2c  94,  0x44, 0x00,
c350: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
c360: 2f 2a 20 ce 94 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
c370: 7b 20 30 78 30 33 39 35 2c 20 20 30 78 34 35 2c  { 0x0395,  0x45,
c380: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
c390: 30 20 7d 2c 20 20 2f 2a 20 ce 95 20 74 6f 20 45  0 },  /* .. to E
c3a0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 36 2c 20   */.  { 0x0396, 
c3b0: 20 30 78 35 61 2c 20 30 78 30 30 2c 20 30 78 30   0x5a, 0x00, 0x0
c3c0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  0, 0x00 },  /* .
c3d0: 96 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78  . to Z */.  { 0x
c3e0: 30 33 39 37 2c 20 20 30 78 34 39 2c 20 30 78 30  0397,  0x49, 0x0
c3f0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
c400: 20 20 2f 2a 20 ce 97 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
c410: 20 20 7b 20 30 78 30 33 39 38 2c 20 20 30 78 35    { 0x0398,  0x5
c420: 34 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20 30  4, 0x68, 0x00, 0
c430: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 98 20 74 6f  x00 },  /* .. to
c440: 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39   Th */.  { 0x039
c450: 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20  9,  0x49, 0x00, 
c460: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c470: 2a 20 ce 99 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
c480: 20 30 78 30 33 39 41 2c 20 20 30 78 34 62 2c 20   0x039A,  0x4b, 
c490: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
c4a0: 20 7d 2c 20 20 2f 2a 20 ce 9a 20 74 6f 20 4b 20   },  /* .. to K 
c4b0: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 42 2c 20 20  */.  { 0x039B,  
c4c0: 30 78 34 63 2c 20 30 78 30 30 2c 20 30 78 30 30  0x4c, 0x00, 0x00
c4d0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9b  , 0x00 },  /* ..
c4e0: 20 74 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30   to L */.  { 0x0
c4f0: 33 39 43 2c 20 20 30 78 34 64 2c 20 30 78 30 30  39C,  0x4d, 0x00
c500: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c510: 20 2f 2a 20 ce 9c 20 74 6f 20 4d 20 2a 2f 0a 20   /* .. to M */. 
c520: 20 7b 20 30 78 30 33 39 44 2c 20 20 30 78 34 65   { 0x039D,  0x4e
c530: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c540: 30 30 20 7d 2c 20 20 2f 2a 20 ce 9d 20 74 6f 20  00 },  /* .. to 
c550: 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 45 2c  N */.  { 0x039E,
c560: 20 20 30 78 35 38 2c 20 30 78 30 30 2c 20 30 78    0x58, 0x00, 0x
c570: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
c580: ce 9e 20 74 6f 20 58 20 2a 2f 0a 20 20 7b 20 30  .. to X */.  { 0
c590: 78 30 33 39 46 2c 20 20 30 78 34 66 2c 20 30 78  x039F,  0x4f, 0x
c5a0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
c5b0: 2c 20 20 2f 2a 20 ce 9f 20 74 6f 20 4f 20 2a 2f  ,  /* .. to O */
c5c0: 0a 20 20 7b 20 30 78 30 33 41 30 2c 20 20 30 78  .  { 0x03A0,  0x
c5d0: 35 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  50, 0x00, 0x00, 
c5e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a0 20 74  0x00 },  /* .. t
c5f0: 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o P */.  { 0x03A
c600: 31 2c 20 20 30 78 35 32 2c 20 30 78 30 30 2c 20  1,  0x52, 0x00, 
c610: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c620: 2a 20 ce a1 20 74 6f 20 52 20 2a 2f 0a 20 20 7b  * .. to R */.  {
c630: 20 30 78 30 33 41 33 2c 20 20 30 78 35 33 2c 20   0x03A3,  0x53, 
c640: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
c650: 20 7d 2c 20 20 2f 2a 20 ce a3 20 74 6f 20 53 20   },  /* .. to S 
c660: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 34 2c 20 20  */.  { 0x03A4,  
c670: 30 78 35 34 2c 20 30 78 30 30 2c 20 30 78 30 30  0x54, 0x00, 0x00
c680: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a4  , 0x00 },  /* ..
c690: 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30   to T */.  { 0x0
c6a0: 33 41 35 2c 20 20 30 78 35 39 2c 20 30 78 30 30  3A5,  0x59, 0x00
c6b0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c6c0: 20 2f 2a 20 ce a5 20 74 6f 20 59 20 2a 2f 0a 20   /* .. to Y */. 
c6d0: 20 7b 20 30 78 30 33 41 36 2c 20 20 30 78 34 36   { 0x03A6,  0x46
c6e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c6f0: 30 30 20 7d 2c 20 20 2f 2a 20 ce a6 20 74 6f 20  00 },  /* .. to 
c700: 46 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 37 2c  F */.  { 0x03A7,
c710: 20 20 30 78 34 33 2c 20 30 78 36 38 2c 20 30 78    0x43, 0x68, 0x
c720: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
c730: ce a7 20 74 6f 20 43 68 20 2a 2f 0a 20 20 7b 20  .. to Ch */.  { 
c740: 30 78 30 33 41 38 2c 20 20 30 78 35 30 2c 20 30  0x03A8,  0x50, 0
c750: 78 37 33 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x73, 0x00, 0x00 
c760: 7d 2c 20 20 2f 2a 20 ce a8 20 74 6f 20 50 73 20  },  /* .. to Ps 
c770: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 39 2c 20 20  */.  { 0x03A9,  
c780: 30 78 34 66 2c 20 30 78 30 30 2c 20 30 78 30 30  0x4f, 0x00, 0x00
c790: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a9  , 0x00 },  /* ..
c7a0: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
c7b0: 33 41 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30  3AA,  0x49, 0x00
c7c0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c7d0: 20 2f 2a 20 ce aa 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
c7e0: 20 7b 20 30 78 30 33 41 42 2c 20 20 30 78 35 39   { 0x03AB,  0x59
c7f0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c800: 30 30 20 7d 2c 20 20 2f 2a 20 ce ab 20 74 6f 20  00 },  /* .. to 
c810: 59 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 43 2c  Y */.  { 0x03AC,
c820: 20 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78    0x61, 0x00, 0x
c830: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
c840: ce ac 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30  .. to a */.  { 0
c850: 78 30 33 41 44 2c 20 20 30 78 36 35 2c 20 30 78  x03AD,  0x65, 0x
c860: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
c870: 2c 20 20 2f 2a 20 ce ad 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
c880: 0a 20 20 7b 20 30 78 30 33 41 45 2c 20 20 30 78  .  { 0x03AE,  0x
c890: 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  69, 0x00, 0x00, 
c8a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ae 20 74  0x00 },  /* .. t
c8b0: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o i */.  { 0x03A
c8c0: 46 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c 20  F,  0x69, 0x00, 
c8d0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
c8e0: 2a 20 ce af 20 74 6f 20 69 20 2a 2f 0a 20 20 7b  * .. to i */.  {
c8f0: 20 30 78 30 33 42 31 2c 20 20 30 78 36 31 2c 20   0x03B1,  0x61, 
c900: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
c910: 20 7d 2c 20 20 2f 2a 20 ce b1 20 74 6f 20 61 20   },  /* .. to a 
c920: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 32 2c 20 20  */.  { 0x03B2,  
c930: 30 78 36 32 2c 20 30 78 30 30 2c 20 30 78 30 30  0x62, 0x00, 0x00
c940: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b2  , 0x00 },  /* ..
c950: 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78 30   to b */.  { 0x0
c960: 33 42 33 2c 20 20 30 78 36 37 2c 20 30 78 30 30  3B3,  0x67, 0x00
c970: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
c980: 20 2f 2a 20 ce b3 20 74 6f 20 67 20 2a 2f 0a 20   /* .. to g */. 
c990: 20 7b 20 30 78 30 33 42 34 2c 20 20 30 78 36 34   { 0x03B4,  0x64
c9a0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
c9b0: 30 30 20 7d 2c 20 20 2f 2a 20 ce b4 20 74 6f 20  00 },  /* .. to 
c9c0: 64 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 35 2c  d */.  { 0x03B5,
c9d0: 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30 78    0x65, 0x00, 0x
c9e0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
c9f0: ce b5 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
ca00: 78 30 33 42 36 2c 20 20 30 78 37 61 2c 20 30 78  x03B6,  0x7a, 0x
ca10: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
ca20: 2c 20 20 2f 2a 20 ce b6 20 74 6f 20 7a 20 2a 2f  ,  /* .. to z */
ca30: 0a 20 20 7b 20 30 78 30 33 42 37 2c 20 20 30 78  .  { 0x03B7,  0x
ca40: 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  69, 0x00, 0x00, 
ca50: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b7 20 74  0x00 },  /* .. t
ca60: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o i */.  { 0x03B
ca70: 38 2c 20 20 30 78 37 34 2c 20 30 78 36 38 2c 20  8,  0x74, 0x68, 
ca80: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
ca90: 2a 20 ce b8 20 74 6f 20 74 68 20 2a 2f 0a 20 20  * .. to th */.  
caa0: 7b 20 30 78 30 33 42 39 2c 20 20 30 78 36 39 2c  { 0x03B9,  0x69,
cab0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
cac0: 30 20 7d 2c 20 20 2f 2a 20 ce b9 20 74 6f 20 69  0 },  /* .. to i
cad0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 41 2c 20   */.  { 0x03BA, 
cae0: 20 30 78 36 62 2c 20 30 78 30 30 2c 20 30 78 30   0x6b, 0x00, 0x0
caf0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  0, 0x00 },  /* .
cb00: ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78  . to k */.  { 0x
cb10: 30 33 42 42 2c 20 20 30 78 36 63 2c 20 30 78 30  03BB,  0x6c, 0x0
cb20: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
cb30: 20 20 2f 2a 20 ce bb 20 74 6f 20 6c 20 2a 2f 0a    /* .. to l */.
cb40: 20 20 7b 20 30 78 30 33 42 43 2c 20 20 30 78 36    { 0x03BC,  0x6
cb50: 64 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  d, 0x00, 0x00, 0
cb60: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bc 20 74 6f  x00 },  /* .. to
cb70: 20 6d 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 44   m */.  { 0x03BD
cb80: 2c 20 20 30 78 36 65 2c 20 30 78 30 30 2c 20 30  ,  0x6e, 0x00, 0
cb90: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
cba0: 20 ce bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20   .. to n */.  { 
cbb0: 30 78 30 33 42 45 2c 20 20 30 78 37 38 2c 20 30  0x03BE,  0x78, 0
cbc0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
cbd0: 7d 2c 20 20 2f 2a 20 ce be 20 74 6f 20 78 20 2a  },  /* .. to x *
cbe0: 2f 0a 20 20 7b 20 30 78 30 33 42 46 2c 20 20 30  /.  { 0x03BF,  0
cbf0: 78 36 66 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x6f, 0x00, 0x00,
cc00: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bf 20   0x00 },  /* .. 
cc10: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to o */.  { 0x03
cc20: 43 30 2c 20 20 30 78 37 30 2c 20 30 78 30 30 2c  C0,  0x70, 0x00,
cc30: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
cc40: 2f 2a 20 cf 80 20 74 6f 20 70 20 2a 2f 0a 20 20  /* .. to p */.  
cc50: 7b 20 30 78 30 33 43 31 2c 20 20 30 78 37 32 2c  { 0x03C1,  0x72,
cc60: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
cc70: 30 20 7d 2c 20 20 2f 2a 20 cf 81 20 74 6f 20 72  0 },  /* .. to r
cc80: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 33 2c 20   */.  { 0x03C3, 
cc90: 20 30 78 37 33 2c 20 30 78 30 30 2c 20 30 78 30   0x73, 0x00, 0x0
cca0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  0, 0x00 },  /* .
ccb0: 83 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
ccc0: 30 33 43 34 2c 20 20 30 78 37 34 2c 20 30 78 30  03C4,  0x74, 0x0
ccd0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
cce0: 20 20 2f 2a 20 cf 84 20 74 6f 20 74 20 2a 2f 0a    /* .. to t */.
ccf0: 20 20 7b 20 30 78 30 33 43 35 2c 20 20 30 78 37    { 0x03C5,  0x7
cd00: 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  9, 0x00, 0x00, 0
cd10: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 85 20 74 6f  x00 },  /* .. to
cd20: 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 36   y */.  { 0x03C6
cd30: 2c 20 20 30 78 36 36 2c 20 30 78 30 30 2c 20 30  ,  0x66, 0x00, 0
cd40: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
cd50: 20 cf 86 20 74 6f 20 66 20 2a 2f 0a 20 20 7b 20   .. to f */.  { 
cd60: 30 78 30 33 43 37 2c 20 20 30 78 36 33 2c 20 30  0x03C7,  0x63, 0
cd70: 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x68, 0x00, 0x00 
cd80: 7d 2c 20 20 2f 2a 20 cf 87 20 74 6f 20 63 68 20  },  /* .. to ch 
cd90: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 38 2c 20 20  */.  { 0x03C8,  
cda0: 30 78 37 30 2c 20 30 78 37 33 2c 20 30 78 30 30  0x70, 0x73, 0x00
cdb0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 88  , 0x00 },  /* ..
cdc0: 20 74 6f 20 70 73 20 2a 2f 0a 20 20 7b 20 30 78   to ps */.  { 0x
cdd0: 30 33 43 39 2c 20 20 30 78 36 66 2c 20 30 78 30  03C9,  0x6f, 0x0
cde0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
cdf0: 20 20 2f 2a 20 cf 89 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
ce00: 20 20 7b 20 30 78 30 33 43 41 2c 20 20 30 78 36    { 0x03CA,  0x6
ce10: 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  9, 0x00, 0x00, 0
ce20: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8a 20 74 6f  x00 },  /* .. to
ce30: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 42   i */.  { 0x03CB
ce40: 2c 20 20 30 78 37 39 2c 20 30 78 30 30 2c 20 30  ,  0x79, 0x00, 0
ce50: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
ce60: 20 cf 8b 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20   .. to y */.  { 
ce70: 30 78 30 33 43 43 2c 20 20 30 78 36 66 2c 20 30  0x03CC,  0x6f, 0
ce80: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
ce90: 7d 2c 20 20 2f 2a 20 cf 8c 20 74 6f 20 6f 20 2a  },  /* .. to o *
cea0: 2f 0a 20 20 7b 20 30 78 30 33 43 44 2c 20 20 30  /.  { 0x03CD,  0
ceb0: 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x79, 0x00, 0x00,
cec0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8d 20   0x00 },  /* .. 
ced0: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to y */.  { 0x03
cee0: 43 45 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c  CE,  0x69, 0x00,
cef0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
cf00: 2f 2a 20 cf 8e 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
cf10: 7b 20 30 78 30 34 30 30 2c 20 20 30 78 34 35 2c  { 0x0400,  0x45,
cf20: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
cf30: 30 20 7d 2c 20 20 2f 2a 20 d0 80 20 74 6f 20 45  0 },  /* .. to E
cf40: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 31 2c 20   */.  { 0x0401, 
cf50: 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30 78 30   0x45, 0x00, 0x0
cf60: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
cf70: 81 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
cf80: 30 34 30 32 2c 20 20 30 78 34 34 2c 20 30 78 30  0402,  0x44, 0x0
cf90: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
cfa0: 20 20 2f 2a 20 d0 82 20 74 6f 20 44 20 2a 2f 0a    /* .. to D */.
cfb0: 20 20 7b 20 30 78 30 34 30 33 2c 20 20 30 78 34    { 0x0403,  0x4
cfc0: 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  7, 0x00, 0x00, 0
cfd0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 83 20 74 6f  x00 },  /* .. to
cfe0: 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 34   G */.  { 0x0404
cff0: 2c 20 20 30 78 34 35 2c 20 30 78 30 30 2c 20 30  ,  0x45, 0x00, 0
d000: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d010: 20 d0 84 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
d020: 30 78 30 34 30 35 2c 20 20 30 78 35 61 2c 20 30  0x0405,  0x5a, 0
d030: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d040: 7d 2c 20 20 2f 2a 20 d0 85 20 74 6f 20 5a 20 2a  },  /* .. to Z *
d050: 2f 0a 20 20 7b 20 30 78 30 34 30 36 2c 20 20 30  /.  { 0x0406,  0
d060: 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x49, 0x00, 0x00,
d070: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 86 20   0x00 },  /* .. 
d080: 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to I */.  { 0x04
d090: 30 37 2c 20 20 30 78 34 39 2c 20 30 78 30 30 2c  07,  0x49, 0x00,
d0a0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
d0b0: 2f 2a 20 d0 87 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
d0c0: 7b 20 30 78 30 34 30 38 2c 20 20 30 78 34 61 2c  { 0x0408,  0x4a,
d0d0: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
d0e0: 30 20 7d 2c 20 20 2f 2a 20 d0 88 20 74 6f 20 4a  0 },  /* .. to J
d0f0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 39 2c 20   */.  { 0x0409, 
d100: 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78 30   0x49, 0x00, 0x0
d110: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
d120: 89 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
d130: 30 34 30 41 2c 20 20 30 78 34 65 2c 20 30 78 30  040A,  0x4e, 0x0
d140: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
d150: 20 20 2f 2a 20 d0 8a 20 74 6f 20 4e 20 2a 2f 0a    /* .. to N */.
d160: 20 20 7b 20 30 78 30 34 30 42 2c 20 20 30 78 34    { 0x040B,  0x4
d170: 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  4, 0x00, 0x00, 0
d180: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8b 20 74 6f  x00 },  /* .. to
d190: 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 43   D */.  { 0x040C
d1a0: 2c 20 20 30 78 34 62 2c 20 30 78 30 30 2c 20 30  ,  0x4b, 0x00, 0
d1b0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d1c0: 20 d0 8c 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20   .. to K */.  { 
d1d0: 30 78 30 34 30 44 2c 20 20 30 78 34 39 2c 20 30  0x040D,  0x49, 0
d1e0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d1f0: 7d 2c 20 20 2f 2a 20 d0 8d 20 74 6f 20 49 20 2a  },  /* .. to I *
d200: 2f 0a 20 20 7b 20 30 78 30 34 30 45 2c 20 20 30  /.  { 0x040E,  0
d210: 78 35 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x55, 0x00, 0x00,
d220: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8e 20   0x00 },  /* .. 
d230: 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to U */.  { 0x04
d240: 30 46 2c 20 20 30 78 34 34 2c 20 30 78 30 30 2c  0F,  0x44, 0x00,
d250: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
d260: 2f 2a 20 d0 8f 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
d270: 7b 20 30 78 30 34 31 30 2c 20 20 30 78 34 31 2c  { 0x0410,  0x41,
d280: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
d290: 30 20 7d 2c 20 20 2f 2a 20 d0 90 20 74 6f 20 41  0 },  /* .. to A
d2a0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 31 2c 20   */.  { 0x0411, 
d2b0: 20 30 78 34 32 2c 20 30 78 30 30 2c 20 30 78 30   0x42, 0x00, 0x0
d2c0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
d2d0: 91 20 74 6f 20 42 20 2a 2f 0a 20 20 7b 20 30 78  . to B */.  { 0x
d2e0: 30 34 31 32 2c 20 20 30 78 35 36 2c 20 30 78 30  0412,  0x56, 0x0
d2f0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
d300: 20 20 2f 2a 20 d0 92 20 74 6f 20 56 20 2a 2f 0a    /* .. to V */.
d310: 20 20 7b 20 30 78 30 34 31 33 2c 20 20 30 78 34    { 0x0413,  0x4
d320: 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  7, 0x00, 0x00, 0
d330: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 93 20 74 6f  x00 },  /* .. to
d340: 20 47 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 34   G */.  { 0x0414
d350: 2c 20 20 30 78 34 34 2c 20 30 78 30 30 2c 20 30  ,  0x44, 0x00, 0
d360: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d370: 20 d0 94 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20   .. to D */.  { 
d380: 30 78 30 34 31 35 2c 20 20 30 78 34 35 2c 20 30  0x0415,  0x45, 0
d390: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d3a0: 7d 2c 20 20 2f 2a 20 d0 95 20 74 6f 20 45 20 2a  },  /* .. to E *
d3b0: 2f 0a 20 20 7b 20 30 78 30 34 31 36 2c 20 20 30  /.  { 0x0416,  0
d3c0: 78 35 61 2c 20 30 78 36 38 2c 20 30 78 30 30 2c  x5a, 0x68, 0x00,
d3d0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 96 20   0x00 },  /* .. 
d3e0: 74 6f 20 5a 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Zh */.  { 0x0
d3f0: 34 31 37 2c 20 20 30 78 35 61 2c 20 30 78 30 30  417,  0x5a, 0x00
d400: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
d410: 20 2f 2a 20 d0 97 20 74 6f 20 5a 20 2a 2f 0a 20   /* .. to Z */. 
d420: 20 7b 20 30 78 30 34 31 38 2c 20 20 30 78 34 39   { 0x0418,  0x49
d430: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
d440: 30 30 20 7d 2c 20 20 2f 2a 20 d0 98 20 74 6f 20  00 },  /* .. to 
d450: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 39 2c  I */.  { 0x0419,
d460: 20 20 30 78 34 39 2c 20 30 78 30 30 2c 20 30 78    0x49, 0x00, 0x
d470: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
d480: d0 99 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30  .. to I */.  { 0
d490: 78 30 34 31 41 2c 20 20 30 78 34 62 2c 20 30 78  x041A,  0x4b, 0x
d4a0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
d4b0: 2c 20 20 2f 2a 20 d0 9a 20 74 6f 20 4b 20 2a 2f  ,  /* .. to K */
d4c0: 0a 20 20 7b 20 30 78 30 34 31 42 2c 20 20 30 78  .  { 0x041B,  0x
d4d0: 34 63 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  4c, 0x00, 0x00, 
d4e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9b 20 74  0x00 },  /* .. t
d4f0: 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o L */.  { 0x041
d500: 43 2c 20 20 30 78 34 64 2c 20 30 78 30 30 2c 20  C,  0x4d, 0x00, 
d510: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
d520: 2a 20 d0 9c 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b  * .. to M */.  {
d530: 20 30 78 30 34 31 44 2c 20 20 30 78 34 65 2c 20   0x041D,  0x4e, 
d540: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
d550: 20 7d 2c 20 20 2f 2a 20 d0 9d 20 74 6f 20 4e 20   },  /* .. to N 
d560: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 45 2c 20 20  */.  { 0x041E,  
d570: 30 78 34 66 2c 20 30 78 30 30 2c 20 30 78 30 30  0x4f, 0x00, 0x00
d580: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9e  , 0x00 },  /* ..
d590: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
d5a0: 34 31 46 2c 20 20 30 78 35 30 2c 20 30 78 30 30  41F,  0x50, 0x00
d5b0: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
d5c0: 20 2f 2a 20 d0 9f 20 74 6f 20 50 20 2a 2f 0a 20   /* .. to P */. 
d5d0: 20 7b 20 30 78 30 34 32 30 2c 20 20 30 78 35 32   { 0x0420,  0x52
d5e0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
d5f0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 a0 20 74 6f 20  00 },  /* .. to 
d600: 52 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 31 2c  R */.  { 0x0421,
d610: 20 20 30 78 35 33 2c 20 30 78 30 30 2c 20 30 78    0x53, 0x00, 0x
d620: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
d630: d0 a1 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30  .. to S */.  { 0
d640: 78 30 34 32 32 2c 20 20 30 78 35 34 2c 20 30 78  x0422,  0x54, 0x
d650: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
d660: 2c 20 20 2f 2a 20 d0 a2 20 74 6f 20 54 20 2a 2f  ,  /* .. to T */
d670: 0a 20 20 7b 20 30 78 30 34 32 33 2c 20 20 30 78  .  { 0x0423,  0x
d680: 35 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  55, 0x00, 0x00, 
d690: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a3 20 74  0x00 },  /* .. t
d6a0: 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32  o U */.  { 0x042
d6b0: 34 2c 20 20 30 78 34 36 2c 20 30 78 30 30 2c 20  4,  0x46, 0x00, 
d6c0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
d6d0: 2a 20 d0 a4 20 74 6f 20 46 20 2a 2f 0a 20 20 7b  * .. to F */.  {
d6e0: 20 30 78 30 34 32 35 2c 20 20 30 78 34 62 2c 20   0x0425,  0x4b, 
d6f0: 30 78 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30  0x68, 0x00, 0x00
d700: 20 7d 2c 20 20 2f 2a 20 d0 a5 20 74 6f 20 4b 68   },  /* .. to Kh
d710: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 36 2c 20   */.  { 0x0426, 
d720: 20 30 78 35 34 2c 20 30 78 36 33 2c 20 30 78 30   0x54, 0x63, 0x0
d730: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
d740: a6 20 74 6f 20 54 63 20 2a 2f 0a 20 20 7b 20 30  . to Tc */.  { 0
d750: 78 30 34 32 37 2c 20 20 30 78 34 33 2c 20 30 78  x0427,  0x43, 0x
d760: 36 38 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  68, 0x00, 0x00 }
d770: 2c 20 20 2f 2a 20 d0 a7 20 74 6f 20 43 68 20 2a  ,  /* .. to Ch *
d780: 2f 0a 20 20 7b 20 30 78 30 34 32 38 2c 20 20 30  /.  { 0x0428,  0
d790: 78 35 33 2c 20 30 78 36 38 2c 20 30 78 30 30 2c  x53, 0x68, 0x00,
d7a0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a8 20   0x00 },  /* .. 
d7b0: 74 6f 20 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Sh */.  { 0x0
d7c0: 34 32 39 2c 20 20 30 78 35 33 2c 20 30 78 36 38  429,  0x53, 0x68
d7d0: 2c 20 30 78 36 33 2c 20 30 78 36 38 20 7d 2c 20  , 0x63, 0x68 }, 
d7e0: 20 2f 2a 20 d0 a9 20 74 6f 20 53 68 63 68 20 2a   /* .. to Shch *
d7f0: 2f 0a 20 20 7b 20 30 78 30 34 32 41 2c 20 20 30  /.  { 0x042A,  0
d800: 78 36 31 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x61, 0x00, 0x00,
d810: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f   0x00 },  /*  to
d820: 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 42   A */.  { 0x042B
d830: 2c 20 20 30 78 35 39 2c 20 30 78 30 30 2c 20 30  ,  0x59, 0x00, 0
d840: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d850: 20 d0 ab 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20   .. to Y */.  { 
d860: 30 78 30 34 32 43 2c 20 20 30 78 35 39 2c 20 30  0x042C,  0x59, 0
d870: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
d880: 7d 2c 20 20 2f 2a 20 20 74 6f 20 59 20 2a 2f 0a  },  /*  to Y */.
d890: 20 20 7b 20 30 78 30 34 32 44 2c 20 20 30 78 34    { 0x042D,  0x4
d8a0: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
d8b0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ad 20 74 6f  x00 },  /* .. to
d8c0: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 45   E */.  { 0x042E
d8d0: 2c 20 20 30 78 34 39 2c 20 30 78 37 35 2c 20 30  ,  0x49, 0x75, 0
d8e0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
d8f0: 20 d0 ae 20 74 6f 20 49 75 20 2a 2f 0a 20 20 7b   .. to Iu */.  {
d900: 20 30 78 30 34 32 46 2c 20 20 30 78 34 39 2c 20   0x042F,  0x49, 
d910: 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78 30 30  0x61, 0x00, 0x00
d920: 20 7d 2c 20 20 2f 2a 20 d0 af 20 74 6f 20 49 61   },  /* .. to Ia
d930: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 30 2c 20   */.  { 0x0430, 
d940: 20 30 78 36 31 2c 20 30 78 30 30 2c 20 30 78 30   0x61, 0x00, 0x0
d950: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  0, 0x00 },  /* .
d960: b0 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78  . to a */.  { 0x
d970: 30 34 33 31 2c 20 20 30 78 36 32 2c 20 30 78 30  0431,  0x62, 0x0
d980: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
d990: 20 20 2f 2a 20 d0 b1 20 74 6f 20 62 20 2a 2f 0a    /* .. to b */.
d9a0: 20 20 7b 20 30 78 30 34 33 32 2c 20 20 30 78 37    { 0x0432,  0x7
d9b0: 36 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  6, 0x00, 0x00, 0
d9c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b2 20 74 6f  x00 },  /* .. to
d9d0: 20 76 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 33   v */.  { 0x0433
d9e0: 2c 20 20 30 78 36 37 2c 20 30 78 30 30 2c 20 30  ,  0x67, 0x00, 0
d9f0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
da00: 20 d0 b3 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20   .. to g */.  { 
da10: 30 78 30 34 33 34 2c 20 20 30 78 36 34 2c 20 30  0x0434,  0x64, 0
da20: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
da30: 7d 2c 20 20 2f 2a 20 d0 b4 20 74 6f 20 64 20 2a  },  /* .. to d *
da40: 2f 0a 20 20 7b 20 30 78 30 34 33 35 2c 20 20 30  /.  { 0x0435,  0
da50: 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x65, 0x00, 0x00,
da60: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b5 20   0x00 },  /* .. 
da70: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to e */.  { 0x04
da80: 33 36 2c 20 20 30 78 37 61 2c 20 30 78 36 38 2c  36,  0x7a, 0x68,
da90: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
daa0: 2f 2a 20 d0 b6 20 74 6f 20 7a 68 20 2a 2f 0a 20  /* .. to zh */. 
dab0: 20 7b 20 30 78 30 34 33 37 2c 20 20 30 78 37 61   { 0x0437,  0x7a
dac0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
dad0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 b7 20 74 6f 20  00 },  /* .. to 
dae0: 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 38 2c  z */.  { 0x0438,
daf0: 20 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78    0x69, 0x00, 0x
db00: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
db10: d0 b8 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
db20: 78 30 34 33 39 2c 20 20 30 78 36 39 2c 20 30 78  x0439,  0x69, 0x
db30: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
db40: 2c 20 20 2f 2a 20 d0 b9 20 74 6f 20 69 20 2a 2f  ,  /* .. to i */
db50: 0a 20 20 7b 20 30 78 30 34 33 41 2c 20 20 30 78  .  { 0x043A,  0x
db60: 36 62 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  6b, 0x00, 0x00, 
db70: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ba 20 74  0x00 },  /* .. t
db80: 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33  o k */.  { 0x043
db90: 42 2c 20 20 30 78 36 63 2c 20 30 78 30 30 2c 20  B,  0x6c, 0x00, 
dba0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
dbb0: 2a 20 d0 bb 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b  * .. to l */.  {
dbc0: 20 30 78 30 34 33 43 2c 20 20 30 78 36 64 2c 20   0x043C,  0x6d, 
dbd0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
dbe0: 20 7d 2c 20 20 2f 2a 20 d0 bc 20 74 6f 20 6d 20   },  /* .. to m 
dbf0: 2a 2f 0a 20 20 7b 20 30 78 30 34 33 44 2c 20 20  */.  { 0x043D,  
dc00: 30 78 36 65 2c 20 30 78 30 30 2c 20 30 78 30 30  0x6e, 0x00, 0x00
dc10: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bd  , 0x00 },  /* ..
dc20: 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30   to n */.  { 0x0
dc30: 34 33 45 2c 20 20 30 78 36 66 2c 20 30 78 30 30  43E,  0x6f, 0x00
dc40: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
dc50: 20 2f 2a 20 d0 be 20 74 6f 20 6f 20 2a 2f 0a 20   /* .. to o */. 
dc60: 20 7b 20 30 78 30 34 33 46 2c 20 20 30 78 37 30   { 0x043F,  0x70
dc70: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
dc80: 30 30 20 7d 2c 20 20 2f 2a 20 d0 bf 20 74 6f 20  00 },  /* .. to 
dc90: 70 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 30 2c  p */.  { 0x0440,
dca0: 20 20 30 78 37 32 2c 20 30 78 30 30 2c 20 30 78    0x72, 0x00, 0x
dcb0: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
dcc0: d1 80 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30  .. to r */.  { 0
dcd0: 78 30 34 34 31 2c 20 20 30 78 37 33 2c 20 30 78  x0441,  0x73, 0x
dce0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
dcf0: 2c 20 20 2f 2a 20 d1 81 20 74 6f 20 73 20 2a 2f  ,  /* .. to s */
dd00: 0a 20 20 7b 20 30 78 30 34 34 32 2c 20 20 30 78  .  { 0x0442,  0x
dd10: 37 34 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  74, 0x00, 0x00, 
dd20: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 82 20 74  0x00 },  /* .. t
dd30: 6f 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34  o t */.  { 0x044
dd40: 33 2c 20 20 30 78 37 35 2c 20 30 78 30 30 2c 20  3,  0x75, 0x00, 
dd50: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
dd60: 2a 20 d1 83 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
dd70: 20 30 78 30 34 34 34 2c 20 20 30 78 36 36 2c 20   0x0444,  0x66, 
dd80: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
dd90: 20 7d 2c 20 20 2f 2a 20 d1 84 20 74 6f 20 66 20   },  /* .. to f 
dda0: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 35 2c 20 20  */.  { 0x0445,  
ddb0: 30 78 36 62 2c 20 30 78 36 38 2c 20 30 78 30 30  0x6b, 0x68, 0x00
ddc0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 85  , 0x00 },  /* ..
ddd0: 20 74 6f 20 6b 68 20 2a 2f 0a 20 20 7b 20 30 78   to kh */.  { 0x
dde0: 30 34 34 36 2c 20 20 30 78 37 34 2c 20 30 78 36  0446,  0x74, 0x6
ddf0: 33 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  3, 0x00, 0x00 },
de00: 20 20 2f 2a 20 d1 86 20 74 6f 20 74 63 20 2a 2f    /* .. to tc */
de10: 0a 20 20 7b 20 30 78 30 34 34 37 2c 20 20 30 78  .  { 0x0447,  0x
de20: 36 33 2c 20 30 78 36 38 2c 20 30 78 30 30 2c 20  63, 0x68, 0x00, 
de30: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 87 20 74  0x00 },  /* .. t
de40: 6f 20 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34  o ch */.  { 0x04
de50: 34 38 2c 20 20 30 78 37 33 2c 20 30 78 36 38 2c  48,  0x73, 0x68,
de60: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
de70: 2f 2a 20 d1 88 20 74 6f 20 73 68 20 2a 2f 0a 20  /* .. to sh */. 
de80: 20 7b 20 30 78 30 34 34 39 2c 20 20 30 78 37 33   { 0x0449,  0x73
de90: 2c 20 30 78 36 38 2c 20 30 78 36 33 2c 20 30 78  , 0x68, 0x63, 0x
dea0: 36 38 20 7d 2c 20 20 2f 2a 20 d1 89 20 74 6f 20  68 },  /* .. to 
deb0: 73 68 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34  shch */.  { 0x04
dec0: 34 41 2c 20 20 30 78 36 31 2c 20 30 78 30 30 2c  4A,  0x61, 0x00,
ded0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
dee0: 2f 2a 20 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20  /*  to a */.  { 
def0: 30 78 30 34 34 42 2c 20 20 30 78 37 39 2c 20 30  0x044B,  0x79, 0
df00: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
df10: 7d 2c 20 20 2f 2a 20 d1 8b 20 74 6f 20 79 20 2a  },  /* .. to y *
df20: 2f 0a 20 20 7b 20 30 78 30 34 34 43 2c 20 20 30  /.  { 0x044C,  0
df30: 78 37 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x79, 0x00, 0x00,
df40: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f   0x00 },  /*  to
df50: 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 44   y */.  { 0x044D
df60: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 2c 20 30  ,  0x65, 0x00, 0
df70: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
df80: 20 d1 8d 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
df90: 30 78 30 34 34 45 2c 20 20 30 78 36 39 2c 20 30  0x044E,  0x69, 0
dfa0: 78 37 35 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x75, 0x00, 0x00 
dfb0: 7d 2c 20 20 2f 2a 20 d1 8e 20 74 6f 20 69 75 20  },  /* .. to iu 
dfc0: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 46 2c 20 20  */.  { 0x044F,  
dfd0: 30 78 36 39 2c 20 30 78 36 31 2c 20 30 78 30 30  0x69, 0x61, 0x00
dfe0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 8f  , 0x00 },  /* ..
dff0: 20 74 6f 20 69 61 20 2a 2f 0a 20 20 7b 20 30 78   to ia */.  { 0x
e000: 30 34 35 30 2c 20 20 30 78 36 35 2c 20 30 78 30  0450,  0x65, 0x0
e010: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
e020: 20 20 2f 2a 20 d1 90 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
e030: 20 20 7b 20 30 78 30 34 35 31 2c 20 20 30 78 36    { 0x0451,  0x6
e040: 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  5, 0x00, 0x00, 0
e050: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 91 20 74 6f  x00 },  /* .. to
e060: 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 32   e */.  { 0x0452
e070: 2c 20 20 30 78 36 34 2c 20 30 78 30 30 2c 20 30  ,  0x64, 0x00, 0
e080: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
e090: 20 d1 92 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20   .. to d */.  { 
e0a0: 30 78 30 34 35 33 2c 20 20 30 78 36 37 2c 20 30  0x0453,  0x67, 0
e0b0: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
e0c0: 7d 2c 20 20 2f 2a 20 d1 93 20 74 6f 20 67 20 2a  },  /* .. to g *
e0d0: 2f 0a 20 20 7b 20 30 78 30 34 35 34 2c 20 20 30  /.  { 0x0454,  0
e0e0: 78 36 35 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x65, 0x00, 0x00,
e0f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 94 20   0x00 },  /* .. 
e100: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to e */.  { 0x04
e110: 35 35 2c 20 20 30 78 37 61 2c 20 30 78 30 30 2c  55,  0x7a, 0x00,
e120: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e130: 2f 2a 20 d1 95 20 74 6f 20 7a 20 2a 2f 0a 20 20  /* .. to z */.  
e140: 7b 20 30 78 30 34 35 36 2c 20 20 30 78 36 39 2c  { 0x0456,  0x69,
e150: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
e160: 30 20 7d 2c 20 20 2f 2a 20 d1 96 20 74 6f 20 69  0 },  /* .. to i
e170: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 37 2c 20   */.  { 0x0457, 
e180: 20 30 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30   0x69, 0x00, 0x0
e190: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  0, 0x00 },  /* .
e1a0: 97 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
e1b0: 30 34 35 38 2c 20 20 30 78 36 61 2c 20 30 78 30  0458,  0x6a, 0x0
e1c0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
e1d0: 20 20 2f 2a 20 d1 98 20 74 6f 20 6a 20 2a 2f 0a    /* .. to j */.
e1e0: 20 20 7b 20 30 78 30 34 35 39 2c 20 20 30 78 36    { 0x0459,  0x6
e1f0: 39 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  9, 0x00, 0x00, 0
e200: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 99 20 74 6f  x00 },  /* .. to
e210: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 41   i */.  { 0x045A
e220: 2c 20 20 30 78 36 65 2c 20 30 78 30 30 2c 20 30  ,  0x6e, 0x00, 0
e230: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
e240: 20 d1 9a 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20   .. to n */.  { 
e250: 30 78 30 34 35 42 2c 20 20 30 78 36 34 2c 20 30  0x045B,  0x64, 0
e260: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
e270: 7d 2c 20 20 2f 2a 20 d1 9b 20 74 6f 20 64 20 2a  },  /* .. to d *
e280: 2f 0a 20 20 7b 20 30 78 30 34 35 43 2c 20 20 30  /.  { 0x045C,  0
e290: 78 36 62 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x6b, 0x00, 0x00,
e2a0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9c 20   0x00 },  /* .. 
e2b0: 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to k */.  { 0x04
e2c0: 35 44 2c 20 20 30 78 36 39 2c 20 30 78 30 30 2c  5D,  0x69, 0x00,
e2d0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e2e0: 2f 2a 20 d1 9d 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
e2f0: 7b 20 30 78 30 34 35 45 2c 20 20 30 78 37 35 2c  { 0x045E,  0x75,
e300: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
e310: 30 20 7d 2c 20 20 2f 2a 20 d1 9e 20 74 6f 20 75  0 },  /* .. to u
e320: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 46 2c 20   */.  { 0x045F, 
e330: 20 30 78 36 34 2c 20 30 78 30 30 2c 20 30 78 30   0x64, 0x00, 0x0
e340: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  0, 0x00 },  /* .
e350: 9f 20 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78  . to d */.  { 0x
e360: 31 45 30 32 2c 20 20 30 78 34 32 2c 20 30 78 30  1E02,  0x42, 0x0
e370: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
e380: 20 20 2f 2a 20 e1 b8 82 20 74 6f 20 42 20 2a 2f    /* ... to B */
e390: 0a 20 20 7b 20 30 78 31 45 30 33 2c 20 20 30 78  .  { 0x1E03,  0x
e3a0: 36 32 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  62, 0x00, 0x00, 
e3b0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 83 20  0x00 },  /* ... 
e3c0: 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to b */.  { 0x1E
e3d0: 30 41 2c 20 20 30 78 34 34 2c 20 30 78 30 30 2c  0A,  0x44, 0x00,
e3e0: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e3f0: 2f 2a 20 e1 b8 8a 20 74 6f 20 44 20 2a 2f 0a 20  /* ... to D */. 
e400: 20 7b 20 30 78 31 45 30 42 2c 20 20 30 78 36 34   { 0x1E0B,  0x64
e410: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
e420: 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 8b 20 74 6f  00 },  /* ... to
e430: 20 64 20 2a 2f 0a 20 20 7b 20 30 78 31 45 31 45   d */.  { 0x1E1E
e440: 2c 20 20 30 78 34 36 2c 20 30 78 30 30 2c 20 30  ,  0x46, 0x00, 0
e450: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
e460: 20 e1 b8 9e 20 74 6f 20 46 20 2a 2f 0a 20 20 7b   ... to F */.  {
e470: 20 30 78 31 45 31 46 2c 20 20 30 78 36 36 2c 20   0x1E1F,  0x66, 
e480: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
e490: 20 7d 2c 20 20 2f 2a 20 e1 b8 9f 20 74 6f 20 66   },  /* ... to f
e4a0: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 34 30 2c 20   */.  { 0x1E40, 
e4b0: 20 30 78 34 44 2c 20 30 78 30 30 2c 20 30 78 30   0x4D, 0x00, 0x0
e4c0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  0, 0x00 },  /* .
e4d0: b9 80 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b 20 30  .. to M */.  { 0
e4e0: 78 31 45 34 31 2c 20 20 30 78 36 44 2c 20 30 78  x1E41,  0x6D, 0x
e4f0: 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
e500: 2c 20 20 2f 2a 20 e1 b9 81 20 74 6f 20 6d 20 2a  ,  /* ... to m *
e510: 2f 0a 20 20 7b 20 30 78 31 45 35 36 2c 20 20 30  /.  { 0x1E56,  0
e520: 78 35 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x50, 0x00, 0x00,
e530: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 96   0x00 },  /* ...
e540: 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 31   to P */.  { 0x1
e550: 45 35 37 2c 20 20 30 78 37 30 2c 20 30 78 30 30  E57,  0x70, 0x00
e560: 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20  , 0x00, 0x00 }, 
e570: 20 2f 2a 20 e1 b9 97 20 74 6f 20 70 20 2a 2f 0a   /* ... to p */.
e580: 20 20 7b 20 30 78 31 45 36 30 2c 20 20 30 78 35    { 0x1E60,  0x5
e590: 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  3, 0x00, 0x00, 0
e5a0: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 a0 20 74  x00 },  /* ... t
e5b0: 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36  o S */.  { 0x1E6
e5c0: 31 2c 20 20 30 78 37 33 2c 20 30 78 30 30 2c 20  1,  0x73, 0x00, 
e5d0: 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x00, 0x00 },  /
e5e0: 2a 20 e1 b9 a1 20 74 6f 20 73 20 2a 2f 0a 20 20  * ... to s */.  
e5f0: 7b 20 30 78 31 45 36 41 2c 20 20 30 78 35 34 2c  { 0x1E6A,  0x54,
e600: 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
e610: 30 20 7d 2c 20 20 2f 2a 20 e1 b9 aa 20 74 6f 20  0 },  /* ... to 
e620: 54 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 42 2c  T */.  { 0x1E6B,
e630: 20 20 30 78 37 34 2c 20 30 78 30 30 2c 20 30 78    0x74, 0x00, 0x
e640: 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  00, 0x00 },  /* 
e650: e1 b9 ab 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20  ... to t */.  { 
e660: 30 78 31 45 38 30 2c 20 20 30 78 35 37 2c 20 30  0x1E80,  0x57, 0
e670: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
e680: 7d 2c 20 20 2f 2a 20 e1 ba 80 20 74 6f 20 57 20  },  /* ... to W 
e690: 2a 2f 0a 20 20 7b 20 30 78 31 45 38 31 2c 20 20  */.  { 0x1E81,  
e6a0: 30 78 37 37 2c 20 30 78 30 30 2c 20 30 78 30 30  0x77, 0x00, 0x00
e6b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba  , 0x00 },  /* ..
e6c0: 81 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78  . to w */.  { 0x
e6d0: 31 45 38 32 2c 20 20 30 78 35 37 2c 20 30 78 30  1E82,  0x57, 0x0
e6e0: 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c  0, 0x00, 0x00 },
e6f0: 20 20 2f 2a 20 e1 ba 82 20 74 6f 20 57 20 2a 2f    /* ... to W */
e700: 0a 20 20 7b 20 30 78 31 45 38 33 2c 20 20 30 78  .  { 0x1E83,  0x
e710: 37 37 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  77, 0x00, 0x00, 
e720: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 83 20  0x00 },  /* ... 
e730: 74 6f 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to w */.  { 0x1E
e740: 38 34 2c 20 20 30 78 35 37 2c 20 30 78 30 30 2c  84,  0x57, 0x00,
e750: 20 30 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20   0x00, 0x00 },  
e760: 2f 2a 20 e1 ba 84 20 74 6f 20 57 20 2a 2f 0a 20  /* ... to W */. 
e770: 20 7b 20 30 78 31 45 38 35 2c 20 20 30 78 37 37   { 0x1E85,  0x77
e780: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
e790: 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 85 20 74 6f  00 },  /* ... to
e7a0: 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31 45 46 32   w */.  { 0x1EF2
e7b0: 2c 20 20 30 78 35 39 2c 20 30 78 30 30 2c 20 30  ,  0x59, 0x00, 0
e7c0: 78 30 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x00, 0x00 },  /*
e7d0: 20 e1 bb b2 20 74 6f 20 59 20 2a 2f 0a 20 20 7b   ... to Y */.  {
e7e0: 20 30 78 31 45 46 33 2c 20 20 30 78 37 39 2c 20   0x1EF3,  0x79, 
e7f0: 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
e800: 20 7d 2c 20 20 2f 2a 20 e1 bb b3 20 74 6f 20 79   },  /* ... to y
e810: 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 30 2c 20   */.  { 0xFB00, 
e820: 20 30 78 36 36 2c 20 30 78 36 36 2c 20 30 78 30   0x66, 0x66, 0x0
e830: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ef  0, 0x00 },  /* .
e840: ac 80 20 74 6f 20 66 66 20 2a 2f 0a 20 20 7b 20  .. to ff */.  { 
e850: 30 78 46 42 30 31 2c 20 20 30 78 36 36 2c 20 30  0xFB01,  0x66, 0
e860: 78 36 39 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x69, 0x00, 0x00 
e870: 7d 2c 20 20 2f 2a 20 ef ac 81 20 74 6f 20 66 69  },  /* ... to fi
e880: 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 32 2c 20   */.  { 0xFB02, 
e890: 20 30 78 36 36 2c 20 30 78 36 43 2c 20 30 78 30   0x66, 0x6C, 0x0
e8a0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ef  0, 0x00 },  /* .
e8b0: ac 82 20 74 6f 20 66 6c 20 2a 2f 0a 20 20 7b 20  .. to fl */.  { 
e8c0: 30 78 46 42 30 35 2c 20 20 30 78 37 33 2c 20 30  0xFB05,  0x73, 0
e8d0: 78 37 34 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x74, 0x00, 0x00 
e8e0: 7d 2c 20 20 2f 2a 20 ef ac 85 20 74 6f 20 73 74  },  /* ... to st
e8f0: 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 36 2c 20   */.  { 0xFB06, 
e900: 20 30 78 37 33 2c 20 30 78 37 34 2c 20 30 78 30   0x73, 0x74, 0x0
e910: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ef  0, 0x00 },  /* .
e920: ac 86 20 74 6f 20 73 74 20 2a 2f 0a 7d 3b 0a 0a  .. to st */.};..
e930: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 72 61  static const Tra
e940: 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 2a 73 70  nsliteration *sp
e950: 65 6c 6c 66 69 78 46 69 6e 64 54 72 61 6e 73 6c  ellfixFindTransl
e960: 69 74 28 69 6e 74 20 63 2c 20 69 6e 74 20 2a 70  it(int c, int *p
e970: 78 54 6f 70 29 7b 0a 20 20 2a 70 78 54 6f 70 20  xTop){.  *pxTop 
e980: 3d 20 28 73 69 7a 65 6f 66 28 74 72 61 6e 73 6c  = (sizeof(transl
e990: 69 74 29 2f 73 69 7a 65 6f 66 28 74 72 61 6e 73  it)/sizeof(trans
e9a0: 6c 69 74 5b 30 5d 29 29 20 2d 20 31 3b 0a 20 20  lit[0])) - 1;.  
e9b0: 72 65 74 75 72 6e 20 74 72 61 6e 73 6c 69 74 3b  return translit;
e9c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
e9d0: 74 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  t the input stri
e9e0: 6e 67 20 66 72 6f 6d 20 55 54 46 2d 38 20 69 6e  ng from UTF-8 in
e9f0: 74 6f 20 70 75 72 65 20 41 53 43 49 49 20 62 79  to pure ASCII by
ea00: 20 63 6f 6e 76 65 72 74 69 6e 67 0a 2a 2a 20 61   converting.** a
ea10: 6c 6c 20 6e 6f 6e 2d 41 53 43 49 49 20 63 68 61  ll non-ASCII cha
ea20: 72 61 63 74 65 72 73 20 74 6f 20 73 6f 6d 65 20  racters to some 
ea30: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 63  combination of c
ea40: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
ea50: 0a 2a 2a 20 41 53 43 49 49 20 73 75 62 73 65 74  .** ASCII subset
ea60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
ea70: 72 6e 65 64 20 73 74 72 69 6e 67 20 6d 69 67 68  rned string migh
ea80: 74 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 63  t contain more c
ea90: 68 61 72 61 63 74 65 72 73 20 74 68 61 6e 20 74  haracters than t
eaa0: 68 65 20 69 6e 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  he input..**.** 
eab0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
eac0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
ead0: 67 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 71 6c  g comes from sql
eae0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
eaf0: 64 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66  d.** should be f
eb00: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
eb10: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  er..*/.static un
eb20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 72 61  signed char *tra
eb30: 6e 73 6c 69 74 65 72 61 74 65 28 63 6f 6e 73 74  nsliterate(const
eb40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
eb50: 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20  zIn, int nIn){. 
eb60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
eb70: 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zOut = sqlite3_m
eb80: 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2a 34 20 2b  alloc64( nIn*4 +
eb90: 20 31 20 29 3b 0a 20 20 69 6e 74 20 63 2c 20 73   1 );.  int c, s
eba0: 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69 66 28 20 7a  z, nOut;.  if( z
ebb0: 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Out==0 ) return 
ebc0: 30 3b 0a 20 20 6e 4f 75 74 20 3d 20 30 3b 0a 20  0;.  nOut = 0;. 
ebd0: 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b   while( nIn>0 ){
ebe0: 0a 20 20 20 20 63 20 3d 20 75 74 66 38 52 65 61  .    c = utf8Rea
ebf0: 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20 26 73 7a 29  d(zIn, nIn, &sz)
ec00: 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 73 7a 3b  ;.    zIn += sz;
ec10: 0a 20 20 20 20 6e 49 6e 20 2d 3d 20 73 7a 3b 0a  .    nIn -= sz;.
ec20: 20 20 20 20 69 66 28 20 63 3c 3d 31 32 37 20 29      if( c<=127 )
ec30: 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f 75  {.      zOut[nOu
ec40: 74 2b 2b 5d 20 3d 20 28 75 6e 73 69 67 6e 65 64  t++] = (unsigned
ec50: 20 63 68 61 72 29 63 3b 0a 20 20 20 20 7d 65 6c   char)c;.    }el
ec60: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 54  se{.      int xT
ec70: 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a 20 20 20  op, xBtm, x;.   
ec80: 20 20 20 63 6f 6e 73 74 20 54 72 61 6e 73 6c 69     const Transli
ec90: 74 65 72 61 74 69 6f 6e 20 2a 74 62 6c 20 3d 20  teration *tbl = 
eca0: 73 70 65 6c 6c 66 69 78 46 69 6e 64 54 72 61 6e  spellfixFindTran
ecb0: 73 6c 69 74 28 63 2c 20 26 78 54 6f 70 29 3b 0a  slit(c, &xTop);.
ecc0: 20 20 20 20 20 20 78 42 74 6d 20 3d 20 30 3b 0a        xBtm = 0;.
ecd0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 54 6f        while( xTo
ece0: 70 3e 3d 78 42 74 6d 20 29 7b 0a 20 20 20 20 20  p>=xBtm ){.     
ecf0: 20 20 20 78 20 3d 20 28 78 54 6f 70 20 2b 20 78     x = (xTop + x
ed00: 42 74 6d 29 2f 32 3b 0a 20 20 20 20 20 20 20 20  Btm)/2;.        
ed10: 69 66 28 20 74 62 6c 5b 78 5d 2e 63 46 72 6f 6d  if( tbl[x].cFrom
ed20: 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==c ){.         
ed30: 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20   zOut[nOut++] = 
ed40: 74 62 6c 5b 78 5d 2e 63 54 6f 30 3b 0a 20 20 20  tbl[x].cTo0;.   
ed50: 20 20 20 20 20 20 20 69 66 28 20 74 62 6c 5b 78         if( tbl[x
ed60: 5d 2e 63 54 6f 31 20 29 7b 0a 20 20 20 20 20 20  ].cTo1 ){.      
ed70: 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74 2b        zOut[nOut+
ed80: 2b 5d 20 3d 20 74 62 6c 5b 78 5d 2e 63 54 6f 31  +] = tbl[x].cTo1
ed90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
eda0: 28 20 74 62 6c 5b 78 5d 2e 63 54 6f 32 20 29 7b  ( tbl[x].cTo2 ){
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
edc0: 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 62  Out[nOut++] = tb
edd0: 6c 5b 78 5d 2e 63 54 6f 32 3b 0a 20 20 20 20 20  l[x].cTo2;.     
ede0: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 62 6c           if( tbl
edf0: 5b 78 5d 2e 63 54 6f 33 20 29 7b 0a 20 20 20 20  [x].cTo3 ){.    
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74              zOut
ee10: 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 62 6c 5b 78  [nOut++] = tbl[x
ee20: 5d 2e 63 54 6f 33 3b 0a 20 20 20 20 20 20 20 20  ].cTo3;.        
ee30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ee40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ee50: 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
ee60: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
ee70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
ee80: 65 20 69 66 28 20 74 62 6c 5b 78 5d 2e 63 46 72  e if( tbl[x].cFr
ee90: 6f 6d 3e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  om>c ){.        
eea0: 20 20 78 54 6f 70 20 3d 20 78 2d 31 3b 0a 20 20    xTop = x-1;.  
eeb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eec0: 20 20 20 20 20 20 20 78 42 74 6d 20 3d 20 78 2b         xBtm = x+
eed0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
eee0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
eef0: 20 29 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20   ) zOut[nOut++] 
ef00: 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 7d  = '?';.    }.  }
ef10: 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 5d 20 3d 20  .  zOut[nOut] = 
ef20: 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4f 75 74  0;.  return zOut
ef30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
ef40: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
ef50: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
ef60: 65 20 73 68 6f 72 74 65 73 74 20 70 72 65 66 69  e shortest prefi
ef70: 78 20 6f 66 20 74 68 65 20 69 6e 70 75 74 0a 2a  x of the input.*
ef80: 2a 20 73 74 72 69 6e 67 20 74 68 61 74 20 74 72  * string that tr
ef90: 61 6e 73 6c 69 74 65 72 61 74 65 73 20 74 6f 20  ansliterates to 
efa0: 61 6e 20 41 53 43 49 49 20 73 74 72 69 6e 67 20  an ASCII string 
efb0: 6e 54 72 61 6e 73 20 62 79 74 65 73 20 6f 72 20  nTrans bytes or 
efc0: 6c 6f 6e 67 65 72 2e 0a 2a 2a 20 4f 72 2c 20 69  longer..** Or, i
efd0: 66 20 74 68 65 20 74 72 61 6e 73 6c 69 74 65 72  f the transliter
efe0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 70  ation of the inp
eff0: 75 74 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  ut string is les
f000: 73 20 74 68 61 6e 20 6e 54 72 61 6e 73 0a 2a 2a  s than nTrans.**
f010: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
f020: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  return the numbe
f030: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
f040: 69 6e 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  in the input str
f050: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
f060: 6e 74 20 74 72 61 6e 73 6c 65 6e 5f 74 6f 5f 63  nt translen_to_c
f070: 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61  harlen(const cha
f080: 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 2c  r *zIn, int nIn,
f090: 20 69 6e 74 20 6e 54 72 61 6e 73 29 7b 0a 20 20   int nTrans){.  
f0a0: 69 6e 74 20 69 2c 20 63 2c 20 73 7a 2c 20 6e 4f  int i, c, sz, nO
f0b0: 75 74 3b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b  ut;.  int nChar;
f0c0: 0a 0a 20 20 69 20 3d 20 6e 4f 75 74 20 3d 20 30  ..  i = nOut = 0
f0d0: 3b 0a 20 20 66 6f 72 28 6e 43 68 61 72 3d 30 3b  ;.  for(nChar=0;
f0e0: 20 69 3c 6e 49 6e 20 26 26 20 6e 4f 75 74 3c 6e   i<nIn && nOut<n
f0f0: 54 72 61 6e 73 3b 20 6e 43 68 61 72 2b 2b 29 7b  Trans; nChar++){
f100: 0a 20 20 20 20 63 20 3d 20 75 74 66 38 52 65 61  .    c = utf8Rea
f110: 64 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  d((const unsigne
f120: 64 20 63 68 61 72 20 2a 29 26 7a 49 6e 5b 69 5d  d char *)&zIn[i]
f130: 2c 20 6e 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20  , nIn-i, &sz);. 
f140: 20 20 20 69 20 2b 3d 20 73 7a 3b 0a 0a 20 20 20     i += sz;..   
f150: 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 69 66 28   nOut++;.    if(
f160: 20 63 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 20   c>=128 ){.     
f170: 20 69 6e 74 20 78 54 6f 70 2c 20 78 42 74 6d 2c   int xTop, xBtm,
f180: 20 78 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   x;.      const 
f190: 54 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20  Transliteration 
f1a0: 2a 74 62 6c 20 3d 20 73 70 65 6c 6c 66 69 78 46  *tbl = spellfixF
f1b0: 69 6e 64 54 72 61 6e 73 6c 69 74 28 63 2c 20 26  indTranslit(c, &
f1c0: 78 54 6f 70 29 3b 0a 20 20 20 20 20 20 78 42 74  xTop);.      xBt
f1d0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  m = 0;.      whi
f1e0: 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20 29  le( xTop>=xBtm )
f1f0: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 78  {.        x = (x
f200: 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a 20  Top + xBtm)/2;. 
f210: 20 20 20 20 20 20 20 69 66 28 20 74 62 6c 5b 78         if( tbl[x
f220: 5d 2e 63 46 72 6f 6d 3d 3d 63 20 29 7b 0a 20 20  ].cFrom==c ){.  
f230: 20 20 20 20 20 20 20 20 69 66 28 20 74 62 6c 5b          if( tbl[
f240: 78 5d 2e 63 54 6f 31 20 29 7b 0a 20 20 20 20 20  x].cTo1 ){.     
f250: 20 20 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20         nOut++;. 
f260: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74             if( t
f270: 62 6c 5b 78 5d 2e 63 54 6f 32 20 29 7b 0a 20 20  bl[x].cTo2 ){.  
f280: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74              nOut
f290: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
f2a0: 20 20 69 66 28 20 74 62 6c 5b 78 5d 2e 63 54 6f    if( tbl[x].cTo
f2b0: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
f2c0: 20 20 20 20 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20       nOut++;.   
f2d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
f2e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f2f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f310: 7d 65 6c 73 65 20 69 66 28 20 74 62 6c 5b 78 5d  }else if( tbl[x]
f320: 2e 63 46 72 6f 6d 3e 63 20 29 7b 0a 20 20 20 20  .cFrom>c ){.    
f330: 20 20 20 20 20 20 78 54 6f 70 20 3d 20 78 2d 31        xTop = x-1
f340: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
f350: 0a 20 20 20 20 20 20 20 20 20 20 78 42 74 6d 20  .          xBtm 
f360: 3d 20 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  = x+1;.        }
f370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f380: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 43 68   }..  return nCh
f390: 61 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20  ar;.}.../*.**   
f3a0: 20 73 70 65 6c 6c 66 69 78 31 5f 74 72 61 6e 73   spellfix1_trans
f3b0: 6c 69 74 28 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e  lit(X).**.** Con
f3c0: 76 65 72 74 20 61 20 73 74 72 69 6e 67 20 74 68  vert a string th
f3d0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d  at contains non-
f3e0: 41 53 43 49 49 20 52 6f 6d 61 6e 20 63 68 61 72  ASCII Roman char
f3f0: 61 63 74 65 72 73 20 69 6e 74 6f 20 0a 2a 2a 20  acters into .** 
f400: 70 75 72 65 20 41 53 43 49 49 2e 0a 2a 2f 0a 73  pure ASCII..*/.s
f410: 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73  tatic void trans
f420: 6c 69 74 65 72 61 74 65 53 71 6c 46 75 6e 63 28  literateSqlFunc(
f430: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
f440: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
f450: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
f460: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
f470: 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
f480: 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20  ned char *zIn = 
f490: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f4a0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
f4b0: 6e 74 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33  nt nIn = sqlite3
f4c0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
f4d0: 76 5b 30 5d 29 3b 0a 20 20 75 6e 73 69 67 6e 65  v[0]);.  unsigne
f4e0: 64 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 74  d char *zOut = t
f4f0: 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a 49 6e  ransliterate(zIn
f500: 2c 20 6e 49 6e 29 3b 0a 20 20 69 66 28 20 7a 4f  , nIn);.  if( zO
f510: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ut==0 ){.    sql
f520: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
f530: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
f540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
f550: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
f560: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
f570: 72 2a 29 7a 4f 75 74 2c 20 2d 31 2c 20 73 71 6c  r*)zOut, -1, sql
f580: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a  ite3_free);.  }.
f590: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70 65 6c  }../*.**    spel
f5a0: 6c 66 69 78 31 5f 73 63 72 69 70 74 63 6f 64 65  lfix1_scriptcode
f5b0: 28 58 29 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f  (X).**.** Try to
f5c0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
f5d0: 6f 6d 69 6e 61 6e 74 20 73 63 72 69 70 74 20 75  ominant script u
f5e0: 73 65 64 20 62 79 20 74 68 65 20 77 6f 72 64 20  sed by the word 
f5f0: 58 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  X and return.** 
f600: 69 74 73 20 49 53 4f 20 31 35 39 32 34 20 6e 75  its ISO 15924 nu
f610: 6d 65 72 69 63 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  meric code..**.*
f620: 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d  * The current im
f630: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 6e 6c  plementation onl
f640: 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20 74 68  y understands th
f650: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 72 69  e following scri
f660: 70 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 32 31  pts:.**.**    21
f670: 35 20 20 28 4c 61 74 69 6e 29 0a 2a 2a 20 20 20  5  (Latin).**   
f680: 20 32 32 30 20 20 28 43 79 72 69 6c 6c 69 63 29   220  (Cyrillic)
f690: 0a 2a 2a 20 20 20 20 32 30 30 20 20 28 47 72 65  .**    200  (Gre
f6a0: 65 6b 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ek).**.** This r
f6b0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
f6c0: 72 6e 20 39 39 38 20 69 66 20 74 68 65 20 69 6e  rn 998 if the in
f6d0: 70 75 74 20 58 20 63 6f 6e 74 61 69 6e 73 20 63  put X contains c
f6e0: 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d 0a 2a  haracters from.*
f6f0: 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 6f 66  * two or more of
f700: 20 74 68 65 20 61 62 6f 76 65 20 73 63 72 69 70   the above scrip
f710: 74 73 20 6f 72 20 39 39 39 20 69 66 20 58 20 63  ts or 999 if X c
f720: 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 68 61 72 61  ontains no chara
f730: 63 74 65 72 73 0a 2a 2a 20 66 72 6f 6d 20 61 6e  cters.** from an
f740: 79 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 73  y of the above s
f750: 63 72 69 70 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  cripts..*/.stati
f760: 63 20 76 6f 69 64 20 73 63 72 69 70 74 43 6f 64  c void scriptCod
f770: 65 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  eSqlFunc(.  sqli
f780: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
f790: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
f7a0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
f7b0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
f7c0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
f7d0: 72 20 2a 7a 49 6e 20 3d 20 73 71 6c 69 74 65 33  r *zIn = sqlite3
f7e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
f7f0: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 49 6e 20  [0]);.  int nIn 
f800: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
f810: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
f820: 20 20 69 6e 74 20 63 2c 20 73 7a 3b 0a 20 20 69    int c, sz;.  i
f830: 6e 74 20 73 63 72 69 70 74 4d 61 73 6b 20 3d 20  nt scriptMask = 
f840: 30 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  0;.  int res;.  
f850: 69 6e 74 20 73 65 65 6e 44 69 67 69 74 20 3d 20  int seenDigit = 
f860: 30 3b 0a 23 20 64 65 66 69 6e 65 20 53 43 52 49  0;.# define SCRI
f870: 50 54 5f 4c 41 54 49 4e 20 20 20 20 20 20 20 30  PT_LATIN       0
f880: 78 30 30 30 31 0a 23 20 64 65 66 69 6e 65 20 53  x0001.# define S
f890: 43 52 49 50 54 5f 43 59 52 49 4c 4c 49 43 20 20  CRIPT_CYRILLIC  
f8a0: 20 20 30 78 30 30 30 32 0a 23 20 64 65 66 69 6e    0x0002.# defin
f8b0: 65 20 53 43 52 49 50 54 5f 47 52 45 45 4b 20 20  e SCRIPT_GREEK  
f8c0: 20 20 20 20 20 30 78 30 30 30 34 0a 23 20 64 65       0x0004.# de
f8d0: 66 69 6e 65 20 53 43 52 49 50 54 5f 48 45 42 52  fine SCRIPT_HEBR
f8e0: 45 57 20 20 20 20 20 20 30 78 30 30 30 38 0a 23  EW      0x0008.#
f8f0: 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f 41   define SCRIPT_A
f900: 52 41 42 49 43 20 20 20 20 20 20 30 78 30 30 31  RABIC      0x001
f910: 30 0a 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e  0..  while( nIn>
f920: 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66  0 ){.    c = utf
f930: 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20  8Read(zIn, nIn, 
f940: 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d  &sz);.    zIn +=
f950: 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20   sz;.    nIn -= 
f960: 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c 30 78  sz;.    if( c<0x
f970: 30 32 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  02af ){.      if
f980: 28 20 63 3e 3d 30 78 38 30 20 7c 7c 20 6d 69 64  ( c>=0x80 || mid
f990: 43 6c 61 73 73 5b 63 26 30 78 37 66 5d 3c 43 43  Class[c&0x7f]<CC
f9a0: 4c 41 53 53 5f 44 49 47 49 54 20 29 7b 0a 20 20  LASS_DIGIT ){.  
f9b0: 20 20 20 20 20 20 73 63 72 69 70 74 4d 61 73 6b        scriptMask
f9c0: 20 7c 3d 20 53 43 52 49 50 54 5f 4c 41 54 49 4e   |= SCRIPT_LATIN
f9d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f9e0: 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27  ( c>='0' && c<='
f9f0: 39 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  9' ){.        se
fa00: 65 6e 44 69 67 69 74 20 3d 20 31 3b 0a 20 20 20  enDigit = 1;.   
fa10: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
fa20: 66 28 20 63 3e 3d 30 78 30 34 30 30 20 26 26 20  f( c>=0x0400 && 
fa30: 63 3c 3d 30 78 30 34 66 66 20 29 7b 0a 20 20 20  c<=0x04ff ){.   
fa40: 20 20 20 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d     scriptMask |=
fa50: 20 53 43 52 49 50 54 5f 43 59 52 49 4c 4c 49 43   SCRIPT_CYRILLIC
fa60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fa70: 63 3e 3d 30 78 30 33 38 36 20 26 26 20 63 3c 3d  c>=0x0386 && c<=
fa80: 30 78 30 33 63 65 20 29 7b 0a 20 20 20 20 20 20  0x03ce ){.      
fa90: 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53 43  scriptMask |= SC
faa0: 52 49 50 54 5f 47 52 45 45 4b 3b 0a 20 20 20 20  RIPT_GREEK;.    
fab0: 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 30 78 30  }else if( c>=0x0
fac0: 35 39 30 20 26 26 20 63 3c 3d 30 78 30 35 66 66  590 && c<=0x05ff
fad0: 20 29 7b 0a 20 20 20 20 20 20 73 63 72 69 70 74   ){.      script
fae0: 4d 61 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 48  Mask |= SCRIPT_H
faf0: 45 42 52 45 57 3b 0a 20 20 20 20 7d 65 6c 73 65  EBREW;.    }else
fb00: 20 69 66 28 20 63 3e 3d 30 78 30 36 30 30 20 26   if( c>=0x0600 &
fb10: 26 20 63 3c 3d 30 78 30 36 66 66 20 29 7b 0a 20  & c<=0x06ff ){. 
fb20: 20 20 20 20 20 73 63 72 69 70 74 4d 61 73 6b 20       scriptMask 
fb30: 7c 3d 20 53 43 52 49 50 54 5f 41 52 41 42 49 43  |= SCRIPT_ARABIC
fb40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
fb50: 28 20 73 63 72 69 70 74 4d 61 73 6b 3d 3d 30 20  ( scriptMask==0 
fb60: 26 26 20 73 65 65 6e 44 69 67 69 74 20 29 20 73  && seenDigit ) s
fb70: 63 72 69 70 74 4d 61 73 6b 20 3d 20 53 43 52 49  criptMask = SCRI
fb80: 50 54 5f 4c 41 54 49 4e 3b 0a 20 20 73 77 69 74  PT_LATIN;.  swit
fb90: 63 68 28 20 73 63 72 69 70 74 4d 61 73 6b 20 29  ch( scriptMask )
fba0: 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 20 20 20  {.    case 0:   
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
fbc0: 20 3d 20 39 39 39 3b 20 62 72 65 61 6b 3b 0a 20   = 999; break;. 
fbd0: 20 20 20 63 61 73 65 20 53 43 52 49 50 54 5f 4c     case SCRIPT_L
fbe0: 41 54 49 4e 3a 20 20 20 20 20 72 65 73 20 3d 20  ATIN:     res = 
fbf0: 32 31 35 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  215; break;.    
fc00: 63 61 73 65 20 53 43 52 49 50 54 5f 43 59 52 49  case SCRIPT_CYRI
fc10: 4c 4c 49 43 3a 20 20 72 65 73 20 3d 20 32 32 30  LLIC:  res = 220
fc20: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
fc30: 65 20 53 43 52 49 50 54 5f 47 52 45 45 4b 3a 20  e SCRIPT_GREEK: 
fc40: 20 20 20 20 72 65 73 20 3d 20 32 30 30 3b 20 62      res = 200; b
fc50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
fc60: 43 52 49 50 54 5f 48 45 42 52 45 57 3a 20 20 20  CRIPT_HEBREW:   
fc70: 20 72 65 73 20 3d 20 31 32 35 3b 20 62 72 65 61   res = 125; brea
fc80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 43 52 49  k;.    case SCRI
fc90: 50 54 5f 41 52 41 42 49 43 3a 20 20 20 20 72 65  PT_ARABIC:    re
fca0: 73 20 3d 20 31 36 30 3b 20 62 72 65 61 6b 3b 0a  s = 160; break;.
fcb0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
fcc0: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d             res =
fcd0: 20 39 39 38 3b 20 62 72 65 61 6b 3b 0a 20 20 7d   998; break;.  }
fce0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
fcf0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 72  t_int(context, r
fd00: 65 73 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 74  es);.}../* End t
fd10: 72 61 6e 73 6c 69 74 65 72 61 74 65 0a 2a 2a 2a  ransliterate.***
fd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
fd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fdb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
fdc0: 67 69 6e 20 73 70 65 6c 6c 66 69 78 31 20 76 69  gin spellfix1 vi
fdd0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rtual table..*/.
fde0: 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67  ./* Maximum leng
fdf0: 74 68 20 6f 66 20 61 20 70 68 6f 6e 65 68 61 73  th of a phonehas
fe00: 68 20 75 73 65 64 20 66 6f 72 20 71 75 65 72 79  h used for query
fe10: 69 6e 67 20 74 68 65 20 73 68 61 64 6f 77 20 74  ing the shadow t
fe20: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
fe30: 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48  SPELLFIX_MX_HASH
fe40: 20 20 33 32 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d    32../* Maximum
fe50: 20 6e 75 6d 62 65 72 20 6f 66 20 68 61 73 68 20   number of hash 
fe60: 73 74 72 69 6e 67 73 20 74 6f 20 65 78 61 6d 69  strings to exami
fe70: 6e 65 20 70 65 72 20 71 75 65 72 79 20 2a 2f 0a  ne per query */.
fe80: 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
fe90: 5f 4d 58 5f 52 55 4e 20 20 20 31 0a 0a 74 79 70  _MX_RUN   1..typ
fea0: 65 64 65 66 20 73 74 72 75 63 74 20 73 70 65 6c  edef struct spel
feb0: 6c 66 69 78 31 5f 76 74 61 62 20 73 70 65 6c 6c  lfix1_vtab spell
fec0: 66 69 78 31 5f 76 74 61 62 3b 0a 74 79 70 65 64  fix1_vtab;.typed
fed0: 65 66 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66  ef struct spellf
fee0: 69 78 31 5f 63 75 72 73 6f 72 20 73 70 65 6c 6c  ix1_cursor spell
fef0: 66 69 78 31 5f 63 75 72 73 6f 72 3b 0a 0a 2f 2a  fix1_cursor;../*
ff00: 20 46 75 7a 7a 79 2d 73 65 61 72 63 68 20 76 69   Fuzzy-search vi
ff10: 72 74 75 61 6c 20 74 61 62 6c 65 20 6f 62 6a 65  rtual table obje
ff20: 63 74 20 2a 2f 0a 73 74 72 75 63 74 20 73 70 65  ct */.struct spe
ff30: 6c 6c 66 69 78 31 5f 76 74 61 62 20 7b 0a 20 20  llfix1_vtab {.  
ff40: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 62 61 73  sqlite3_vtab bas
ff50: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61  e;         /* Ba
ff60: 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20  se class - must 
ff70: 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 71  be first */.  sq
ff80: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
ff90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
ffa0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
ffb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 4e 61  */.  char *zDbNa
ffc0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
ffd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61 62  /* Name of datab
ffe0: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 69 73  ase holding this
fff0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72   table */.  char
10000 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 3b 20 20 20   *zTableName;   
10010 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10020 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  f the virtual ta
10030 62 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ble */.  char *z
10040 43 6f 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20  CostTable;      
10050 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 6f 6c      /* Table hol
10060 64 69 6e 67 20 65 64 69 74 2d 64 69 73 74 61 6e  ding edit-distan
10070 63 65 20 63 6f 73 74 20 6e 75 6d 62 65 72 73 20  ce cost numbers 
10080 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  */.  EditDist3Co
10090 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 33 3b 20  nfig *pConfig3; 
100a0 2f 2a 20 50 61 72 73 65 64 20 65 64 69 74 20 64  /* Parsed edit d
100b0 69 73 74 61 6e 63 65 20 63 6f 73 74 73 20 2a 2f  istance costs */
100c0 0a 7d 3b 0a 0a 2f 2a 20 46 75 7a 7a 79 2d 73 65  .};../* Fuzzy-se
100d0 61 72 63 68 20 63 75 72 73 6f 72 20 6f 62 6a 65  arch cursor obje
100e0 63 74 20 2a 2f 0a 73 74 72 75 63 74 20 73 70 65  ct */.struct spe
100f0 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 7b 0a  llfix1_cursor {.
10100 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
10110 75 72 73 6f 72 20 62 61 73 65 3b 20 20 20 20 2f  ursor base;    /
10120 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d 20 6d  * Base class - m
10130 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a  ust be first */.
10140 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62    spellfix1_vtab
10150 20 2a 70 56 54 61 62 3b 20 20 20 20 20 20 20 2f   *pVTab;       /
10160 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 77  * The table to w
10170 68 69 63 68 20 74 68 69 73 20 63 75 72 73 6f 72  hich this cursor
10180 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 63 68   belongs */.  ch
10190 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 20 20 20  ar *zPattern;   
101a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 68             /* rh
101b0 73 20 6f 66 20 4d 41 54 43 48 20 63 6c 61 75 73  s of MATCH claus
101c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 4e 75  e */.  int idxNu
101d0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
101e0 20 20 20 20 2f 2a 20 69 64 78 4e 75 6d 20 76 61      /* idxNum va
101f0 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 78 46  lue passed to xF
10200 69 6c 74 65 72 28 29 20 2a 2f 0a 20 20 69 6e 74  ilter() */.  int
10210 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
10220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10230 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 63  ber of rows of c
10240 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
10250 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
10260 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10270 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  er of allocated 
10280 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rows */.  int iR
10290 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
102a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
102b0 74 20 72 6f 77 20 6f 66 20 63 6f 6e 74 65 6e 74  t row of content
102c0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b   */.  int iLang;
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
102f0 68 65 20 6c 61 6e 67 69 64 3d 20 63 6f 6e 73 74  he langid= const
10300 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  raint */.  int i
10310 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
10320 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
10330 20 6f 66 20 74 68 65 20 74 6f 70 3d 20 63 6f 6e   of the top= con
10340 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  straint */.  int
10350 20 69 53 63 6f 70 65 3b 20 20 20 20 20 20 20 20   iScope;        
10360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
10370 75 65 20 6f 66 20 74 68 65 20 73 63 6f 70 65 3d  ue of the scope=
10380 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
10390 20 69 6e 74 20 6e 53 65 61 72 63 68 3b 20 20 20   int nSearch;   
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
103b0 20 4e 75 6d 62 65 72 20 6f 66 20 76 6f 63 61 62   Number of vocab
103c0 75 6c 61 72 79 20 69 74 65 6d 73 20 63 68 65 63  ulary items chec
103d0 6b 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ked */.  sqlite3
103e0 5f 73 74 6d 74 20 2a 70 46 75 6c 6c 53 63 61 6e  _stmt *pFullScan
103f0 3b 20 20 20 20 20 2f 2a 20 53 68 61 64 6f 77 20  ;     /* Shadow 
10400 71 75 65 72 79 20 66 6f 72 20 61 20 66 75 6c 6c  query for a full
10410 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
10420 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78   struct spellfix
10430 31 5f 72 6f 77 20 7b 20 20 20 20 20 20 20 2f 2a  1_row {       /*
10440 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   For each row of
10450 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
10460 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
10470 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  owid;         /*
10480 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   Rowid for this 
10490 72 6f 77 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  row */.    char 
104a0 2a 7a 57 6f 72 64 3b 20 20 20 20 20 20 20 20 20  *zWord;         
104b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
104c0 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a 2f   for this row */
104d0 0a 20 20 20 20 69 6e 74 20 69 52 61 6e 6b 3b 20  .    int iRank; 
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 2f 2a 20 52 61 6e 6b 20 66 6f 72 20 74     /* Rank for t
10500 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  his row */.    i
10510 6e 74 20 69 44 69 73 74 61 6e 63 65 3b 20 20 20  nt iDistance;   
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10530 44 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 70 61  Distance from pa
10540 74 74 65 72 6e 20 66 6f 72 20 74 68 69 73 20 72  ttern for this r
10550 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53  ow */.    int iS
10560 63 6f 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  core;           
10570 20 20 20 20 20 20 20 20 2f 2a 20 53 63 6f 72 65          /* Score
10580 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 2a 2f 0a   for sorting */.
10590 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c 65      int iMatchle
105a0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
105b0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6d 61    /* Value of ma
105c0 74 63 68 6c 65 6e 20 63 6f 6c 75 6d 6e 20 28 6f  tchlen column (o
105d0 72 20 2d 31 29 20 2a 2f 0a 20 20 20 20 63 68 61  r -1) */.    cha
105e0 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46 49 58  r zHash[SPELLFIX
105f0 5f 4d 58 5f 48 41 53 48 5d 3b 20 2f 2a 20 74 68  _MX_HASH]; /* th
10600 65 20 70 68 6f 6e 65 68 61 73 68 20 75 73 65 64  e phonehash used
10610 20 66 6f 72 20 74 68 69 73 20 6d 61 74 63 68 20   for this match 
10620 2a 2f 0a 20 20 7d 20 2a 61 3b 20 0a 7d 3b 0a 0a  */.  } *a; .};..
10630 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
10640 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20  one or more SQL 
10650 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f 6d 20  statements from 
10660 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
10670 67 20 67 69 76 65 6e 0a 2a 2a 20 61 6e 64 20 74  g given.** and t
10680 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 6f  hen evaluate tho
10690 73 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 54  se statements. T
106a0 68 65 20 73 75 63 63 65 73 73 20 63 6f 64 65 20  he success code 
106b0 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
106c0 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a 2a 2a 20 49  to *pRc..**.** I
106d0 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74 69 61  f *pRc is initia
106e0 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65  lly non-zero the
106f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
10700 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10710 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66  atic void spellf
10720 69 78 31 44 62 45 78 65 63 28 0a 20 20 69 6e 74  ix1DbExec(.  int
10730 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
10740 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63      /* Success c
10750 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
10760 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10770 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77  /* Database in w
10780 68 69 63 68 20 74 6f 20 72 75 6e 20 53 51 4c 20  hich to run SQL 
10790 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
107a0 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 2f 2a 20 46  *zFormat,   /* F
107b0 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72  ormat string for
107c0 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20   SQL */.  ...   
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107e0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
107f0 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
10800 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69  ng */.){.  va_li
10810 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
10820 53 71 6c 3b 0a 20 20 69 66 28 20 2a 70 52 63 20  Sql;.  if( *pRc 
10830 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73  ) return;.  va_s
10840 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
10850 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
10860 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
10870 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
10880 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
10890 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Sql==0 ){.    *p
108a0 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
108b0 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
108c0 2a 70 52 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  *pRc = sqlite3_e
108d0 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
108e0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
108f0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
10900 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 44 69    }.}../*.** xDi
10910 73 63 6f 6e 6e 65 63 74 2f 78 44 65 73 74 72 6f  sconnect/xDestro
10920 79 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 65  y method for the
10930 20 66 75 7a 7a 79 2d 73 65 61 72 63 68 20 6d 6f   fuzzy-search mo
10940 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
10950 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 55 6e 69  int spellfix1Uni
10960 6e 69 74 28 69 6e 74 20 69 73 44 65 73 74 72 6f  nit(int isDestro
10970 79 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  y, sqlite3_vtab 
10980 2a 70 56 54 61 62 29 7b 0a 20 20 73 70 65 6c 6c  *pVTab){.  spell
10990 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28  fix1_vtab *p = (
109a0 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29  spellfix1_vtab*)
109b0 70 56 54 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVTab;.  int rc 
109c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
109d0 66 28 20 69 73 44 65 73 74 72 6f 79 20 29 7b 0a  f( isDestroy ){.
109e0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
109f0 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 70 65  = p->db;.    spe
10a00 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63  llfix1DbExec(&rc
10a10 2c 20 64 62 2c 20 22 44 52 4f 50 20 54 41 42 4c  , db, "DROP TABL
10a20 45 20 49 46 20 45 58 49 53 54 53 20 5c 22 25 77  E IF EXISTS \"%w
10a30 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22  \".\"%w_vocab\""
10a40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10a50 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20      p->zDbName, 
10a60 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  p->zTableName);.
10a70 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
10a80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
10a90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
10aa0 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20  TableName);.    
10ab0 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44  editDist3ConfigD
10ac0 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69 67  elete(p->pConfig
10ad0 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  3);.    sqlite3_
10ae0 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54 61 62  free(p->zCostTab
10af0 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
10b00 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20  _free(p);.  }.  
10b10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
10b20 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
10b30 31 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69  1Disconnect(sqli
10b40 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 29  te3_vtab *pVTab)
10b50 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c  {.  return spell
10b60 66 69 78 31 55 6e 69 6e 69 74 28 30 2c 20 70 56  fix1Uninit(0, pV
10b70 54 61 62 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Tab);.}.static i
10b80 6e 74 20 73 70 65 6c 6c 66 69 78 31 44 65 73 74  nt spellfix1Dest
10b90 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61 62  roy(sqlite3_vtab
10ba0 20 2a 70 56 54 61 62 29 7b 0a 20 20 72 65 74 75   *pVTab){.  retu
10bb0 72 6e 20 73 70 65 6c 6c 66 69 78 31 55 6e 69 6e  rn spellfix1Unin
10bc0 69 74 28 31 2c 20 70 56 54 61 62 29 3b 0a 7d 0a  it(1, pVTab);.}.
10bd0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  ./*.** Make a co
10be0 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 2e 20  py of a string. 
10bf0 20 52 65 6d 6f 76 65 20 6c 65 61 64 69 6e 67 20   Remove leading 
10c00 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
10c10 74 65 73 70 61 63 65 0a 2a 2a 20 61 6e 64 20 64  tespace.** and d
10c20 65 71 75 6f 74 65 20 69 74 2e 0a 2a 2f 0a 73 74  equote it..*/.st
10c30 61 74 69 63 20 63 68 61 72 20 2a 73 70 65 6c 6c  atic char *spell
10c40 66 69 78 31 44 65 71 75 6f 74 65 28 63 6f 6e 73  fix1Dequote(cons
10c50 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20  t char *zIn){.  
10c60 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e  char *zOut;.  in
10c70 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
10c80 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61  ;.  while( isspa
10c90 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
10ca0 72 29 7a 49 6e 5b 30 5d 29 20 29 20 7a 49 6e 2b  r)zIn[0]) ) zIn+
10cb0 2b 3b 0a 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  +;.  zOut = sqli
10cc0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
10cd0 2c 20 7a 49 6e 29 3b 0a 20 20 69 66 28 20 7a 4f  , zIn);.  if( zO
10ce0 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ut==0 ) return 0
10cf0 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29 73 74 72  ;.  i = (int)str
10d00 6c 65 6e 28 7a 4f 75 74 29 3b 0a 23 69 66 20 30  len(zOut);.#if 0
10d10 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
10d20 77 69 6c 6c 20 6e 65 76 65 72 20 6c 65 61 76 65  will never leave
10d30 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
10d40 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  nd */.  while( i
10d50 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 4f  >0 && isspace(zO
10d60 75 74 5b 69 2d 31 5d 29 20 29 7b 20 69 2d 2d 3b  ut[i-1]) ){ i--;
10d70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 4f 75 74   }.#endif.  zOut
10d80 5b 69 5d 20 3d 20 30 3b 0a 20 20 63 20 3d 20 7a  [i] = 0;.  c = z
10d90 4f 75 74 5b 30 5d 3b 0a 20 20 69 66 28 20 63 3d  Out[0];.  if( c=
10da0 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27 20  ='\'' || c=='"' 
10db0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20  ){.    for(i=1, 
10dc0 6a 3d 30 3b 20 41 4c 57 41 59 53 28 7a 4f 75 74  j=0; ALWAYS(zOut
10dd0 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [i]); i++){.    
10de0 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 4f    zOut[j++] = zO
10df0 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ut[i];.      if(
10e00 20 7a 4f 75 74 5b 69 5d 3d 3d 63 20 29 7b 0a 20   zOut[i]==c ){. 
10e10 20 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74 5b         if( zOut[
10e20 69 2b 31 5d 3d 3d 63 20 29 7b 0a 20 20 20 20 20  i+1]==c ){.     
10e30 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
10e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10e50 20 20 20 7a 4f 75 74 5b 6a 2d 31 5d 20 3d 20 30     zOut[j-1] = 0
10e60 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
10e70 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10e80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10e90 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a   return zOut;.}.
10ea0 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6e 6e 65 63 74  ../*.** xConnect
10eb0 2f 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64 20  /xCreate method 
10ec0 66 6f 72 20 74 68 65 20 73 70 65 6c 6c 66 69 78  for the spellfix
10ed0 31 20 6d 6f 64 75 6c 65 2e 20 41 72 67 75 6d 65  1 module. Argume
10ee0 6e 74 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  nts are:.**.**  
10ef0 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f   argv[0]   -> mo
10f00 64 75 6c 65 20 6e 61 6d 65 20 20 28 22 73 70 65  dule name  ("spe
10f10 6c 6c 66 69 78 31 22 29 0a 2a 2a 20 20 20 61 72  llfix1").**   ar
10f20 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61 62  gv[1]   -> datab
10f30 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72  ase name.**   ar
10f40 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c 65  gv[2]   -> table
10f50 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b   name.**   argv[
10f60 33 5d 2e 2e 20 2d 3e 20 6f 70 74 69 6f 6e 61 6c  3].. -> optional
10f70 20 61 72 67 75 6d 65 6e 74 73 20 28 69 2e 65 2e   arguments (i.e.
10f80 20 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62 6c   "edit_cost_tabl
10f90 65 22 20 70 61 72 61 6d 65 74 65 72 29 0a 2a 2f  e" parameter).*/
10fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
10fb0 6c 66 69 78 31 49 6e 69 74 28 0a 20 20 69 6e 74  lfix1Init(.  int
10fc0 20 69 73 43 72 65 61 74 65 2c 0a 20 20 73 71 6c   isCreate,.  sql
10fd0 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
10fe0 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
10ff0 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
11000 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
11010 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
11020 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  Tab,.  char **pz
11030 45 72 72 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69  Err.){.  spellfi
11040 78 31 5f 76 74 61 62 20 2a 70 4e 65 77 20 3d 20  x1_vtab *pNew = 
11050 30 3b 0a 20 20 2f 2a 20 63 6f 6e 73 74 20 63 68  0;.  /* const ch
11060 61 72 20 2a 7a 4d 6f 64 75 6c 65 20 3d 20 61 72  ar *zModule = ar
11070 67 76 5b 30 5d 3b 20 2f 2f 20 6e 6f 74 20 75 73  gv[0]; // not us
11080 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
11090 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 61 72  ar *zDbName = ar
110a0 67 76 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  gv[1];.  const c
110b0 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 20  har *zTableName 
110c0 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74  = argv[2];.  int
110d0 20 6e 44 62 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nDbName;.  int 
110e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
110f0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 44 62 4e    int i;..  nDbN
11100 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
11110 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 70 4e  n(zDbName);.  pN
11120 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
11130 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
11140 4e 65 77 29 20 2b 20 6e 44 62 4e 61 6d 65 20 2b  New) + nDbName +
11150 20 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d   1);.  if( pNew=
11160 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
11170 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11180 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
11190 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
111a0 28 2a 70 4e 65 77 29 29 3b 0a 20 20 20 20 70 4e  (*pNew));.    pN
111b0 65 77 2d 3e 7a 44 62 4e 61 6d 65 20 3d 20 28 63  ew->zDbName = (c
111c0 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
111d0 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e     memcpy(pNew->
111e0 7a 44 62 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  zDbName, zDbName
111f0 2c 20 6e 44 62 4e 61 6d 65 2b 31 29 3b 0a 20 20  , nDbName+1);.  
11200 20 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e 61    pNew->zTableNa
11210 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  me = sqlite3_mpr
11220 69 6e 74 66 28 22 25 73 22 2c 20 7a 54 61 62 6c  intf("%s", zTabl
11230 65 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  eName);.    pNew
11240 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69  ->db = db;.    i
11250 66 28 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e  f( pNew->zTableN
11260 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
11270 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11280 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
11290 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
112a0 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62  _declare_vtab(db
112b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 43  , .           "C
112c0 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 77 6f  REATE TABLE x(wo
112d0 72 64 2c 72 61 6e 6b 2c 64 69 73 74 61 6e 63 65  rd,rank,distance
112e0 2c 6c 61 6e 67 69 64 2c 20 22 0a 20 20 20 20 20  ,langid, ".     
112f0 20 20 20 20 20 20 22 73 63 6f 72 65 2c 20 6d 61        "score, ma
11300 74 63 68 6c 65 6e 2c 20 70 68 6f 6e 65 68 61 73  tchlen, phonehas
11310 68 20 48 49 44 44 45 4e 2c 20 22 0a 20 20 20 20  h HIDDEN, ".    
11320 20 20 20 20 20 20 20 22 74 6f 70 20 48 49 44 44         "top HIDD
11330 45 4e 2c 20 73 63 6f 70 65 20 48 49 44 44 45 4e  EN, scope HIDDEN
11340 2c 20 73 72 63 68 63 6e 74 20 48 49 44 44 45 4e  , srchcnt HIDDEN
11350 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
11360 73 6f 75 6e 64 73 6c 69 6b 65 20 48 49 44 44 45  soundslike HIDDE
11370 4e 2c 20 63 6f 6d 6d 61 6e 64 20 48 49 44 44 45  N, command HIDDE
11380 4e 29 22 0a 20 20 20 20 20 20 29 3b 0a 23 64 65  N)".      );.#de
11390 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  fine SPELLFIX_CO
113a0 4c 5f 57 4f 52 44 20 20 20 20 20 20 20 20 20 20  L_WORD          
113b0 20 20 30 0a 23 64 65 66 69 6e 65 20 53 50 45 4c    0.#define SPEL
113c0 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b 20 20 20  LFIX_COL_RANK   
113d0 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
113e0 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  ne SPELLFIX_COL_
113f0 44 49 53 54 41 4e 43 45 20 20 20 20 20 20 20 20  DISTANCE        
11400 32 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46  2.#define SPELLF
11410 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20 20 20  IX_COL_LANGID   
11420 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65         3.#define
11430 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43   SPELLFIX_COL_SC
11440 4f 52 45 20 20 20 20 20 20 20 20 20 20 20 34 0a  ORE           4.
11450 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
11460 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45 4e 20 20 20  _COL_MATCHLEN   
11470 20 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 53       5.#define S
11480 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e  PELLFIX_COL_PHON
11490 45 48 41 53 48 20 20 20 20 20 20 20 36 0a 23 64  EHASH       6.#d
114a0 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43  efine SPELLFIX_C
114b0 4f 4c 5f 54 4f 50 20 20 20 20 20 20 20 20 20 20  OL_TOP          
114c0 20 20 20 37 0a 23 64 65 66 69 6e 65 20 53 50 45     7.#define SPE
114d0 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 20  LLFIX_COL_SCOPE 
114e0 20 20 20 20 20 20 20 20 20 20 38 0a 23 64 65 66            8.#def
114f0 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
11500 5f 53 52 43 48 43 4e 54 20 20 20 20 20 20 20 20  _SRCHCNT        
11510 20 39 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c   9.#define SPELL
11520 46 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49  FIX_COL_SOUNDSLI
11530 4b 45 20 20 20 20 20 31 30 0a 23 64 65 66 69 6e  KE     10.#defin
11540 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43  e SPELLFIX_COL_C
11550 4f 4d 4d 41 4e 44 20 20 20 20 20 20 20 20 31 31  OMMAND        11
11560 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
11570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11580 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
11590 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65    spellfix1DbExe
115a0 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20  c(&rc, db,.     
115b0 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
115c0 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
115d0 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
115e0 62 5c 22 28 5c 6e 22 0a 20 20 20 20 20 20 20 20  b\"(\n".        
115f0 20 22 20 20 69 64 20 49 4e 54 45 47 45 52 20 50   "  id INTEGER P
11600 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20  RIMARY KEY,\n". 
11610 20 20 20 20 20 20 20 20 22 20 20 72 61 6e 6b 20          "  rank 
11620 49 4e 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  INT,\n".        
11630 20 22 20 20 6c 61 6e 67 69 64 20 49 4e 54 2c 5c   "  langid INT,\
11640 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 77  n".         "  w
11650 6f 72 64 20 54 45 58 54 2c 5c 6e 22 0a 20 20 20  ord TEXT,\n".   
11660 20 20 20 20 20 20 22 20 20 6b 31 20 54 45 58 54        "  k1 TEXT
11670 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20  ,\n".         " 
11680 20 6b 32 20 54 45 58 54 5c 6e 22 0a 20 20 20 20   k2 TEXT\n".    
11690 20 20 20 20 20 22 29 3b 5c 6e 22 2c 0a 20 20 20       ");\n",.   
116a0 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a        zDbName, z
116b0 54 61 62 6c 65 4e 61 6d 65 0a 20 20 20 20 20 20  TableName.      
116c0 29 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c 66 69  );.      spellfi
116d0 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  x1DbExec(&rc, db
116e0 2c 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41  ,.         "CREA
116f0 54 45 20 49 4e 44 45 58 20 49 46 20 4e 4f 54 20  TE INDEX IF NOT 
11700 45 58 49 53 54 53 20 5c 22 25 77 5c 22 2e 5c 22  EXISTS \"%w\".\"
11710 25 77 5f 76 6f 63 61 62 5f 69 6e 64 65 78 5f 6c  %w_vocab_index_l
11720 61 6e 67 69 64 5f 6b 32 5c 22 20 22 0a 20 20 20  angid_k2\" ".   
11730 20 20 20 20 20 20 20 20 20 22 4f 4e 20 5c 22 25           "ON \"%
11740 77 5f 76 6f 63 61 62 5c 22 28 6c 61 6e 67 69 64  w_vocab\"(langid
11750 2c 6b 32 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,k2);",.        
11760 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 6c 65   zDbName, zTable
11770 4e 61 6d 65 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  Name, zTableName
11780 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
11790 20 20 20 20 66 6f 72 28 69 3d 33 3b 20 72 63 3d      for(i=3; rc=
117a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
117b0 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
117c0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 72    if( strncmp(ar
117d0 67 76 5b 69 5d 2c 22 65 64 69 74 5f 63 6f 73 74  gv[i],"edit_cost
117e0 5f 74 61 62 6c 65 3d 22 2c 31 36 29 3d 3d 30 20  _table=",16)==0 
117f0 26 26 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61  && pNew->zCostTa
11800 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble==0 ){.      
11810 20 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62    pNew->zCostTab
11820 6c 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 44 65  le = spellfix1De
11830 71 75 6f 74 65 28 26 61 72 67 76 5b 69 5d 5b 31  quote(&argv[i][1
11840 36 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6]);.        if(
11850 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62 6c   pNew->zCostTabl
11860 65 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  e==0 ) rc = SQLI
11870 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11880 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
11890 20 20 7d 0a 20 20 20 20 20 20 2a 70 7a 45 72 72    }.      *pzErr
118a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
118b0 74 66 28 22 62 61 64 20 61 72 67 75 6d 65 6e 74  tf("bad argument
118c0 20 74 6f 20 73 70 65 6c 6c 66 69 78 31 28 29 3a   to spellfix1():
118d0 20 5c 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69   \"%s\"", argv[i
118e0 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  ]);.      rc = S
118f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 0a 20 20  QLITE_ERROR; .  
11900 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
11910 63 20 26 26 20 70 4e 65 77 20 29 7b 0a 20 20 20  c && pNew ){.   
11920 20 2a 70 70 56 54 61 62 20 3d 20 30 3b 0a 20 20   *ppVTab = 0;.  
11930 20 20 73 70 65 6c 6c 66 69 78 31 55 6e 69 6e 69    spellfix1Unini
11940 74 28 30 2c 20 26 70 4e 65 77 2d 3e 62 61 73 65  t(0, &pNew->base
11950 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11960 2a 70 70 56 54 61 62 20 3d 20 28 73 71 6c 69 74  *ppVTab = (sqlit
11970 65 33 5f 76 74 61 62 20 2a 29 70 4e 65 77 3b 0a  e3_vtab *)pNew;.
11980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 43  .}../*.** The xC
119a0 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43 72 65 61  onnect and xCrea
119b0 74 65 20 6d 65 74 68 6f 64 73 0a 2a 2f 0a 73 74  te methods.*/.st
119c0 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69  atic int spellfi
119d0 78 31 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c  x1Connect(.  sql
119e0 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
119f0 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
11a00 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
11a10 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
11a20 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
11a30 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  Tab,.  char **pz
11a40 45 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Err.){.  return 
11a50 73 70 65 6c 6c 66 69 78 31 49 6e 69 74 28 30 2c  spellfix1Init(0,
11a60 20 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c   db, pAux, argc,
11a70 20 61 72 67 76 2c 20 70 70 56 54 61 62 2c 20 70   argv, ppVTab, p
11a80 7a 45 72 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zErr);.}.static 
11a90 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 72 65  int spellfix1Cre
11aa0 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
11ab0 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78  db,.  void *pAux
11ac0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  ,.  int argc, co
11ad0 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a  nst char *const*
11ae0 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argv,.  sqlite3_
11af0 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a 20  vtab **ppVTab,. 
11b00 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
11b10 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c 66  .  return spellf
11b20 69 78 31 49 6e 69 74 28 31 2c 20 64 62 2c 20 70  ix1Init(1, db, p
11b30 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c  Aux, argc, argv,
11b40 20 70 70 56 54 61 62 2c 20 70 7a 45 72 72 29 3b   ppVTab, pzErr);
11b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
11b60 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  all of the conte
11b70 6e 74 20 66 72 6f 6d 20 61 20 63 75 72 73 6f 72  nt from a cursor
11b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b90 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43   spellfix1ResetC
11ba0 75 72 73 6f 72 28 73 70 65 6c 6c 66 69 78 31 5f  ursor(spellfix1_
11bb0 63 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  cursor *pCur){. 
11bc0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
11bd0 30 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b  0; i<pCur->nRow;
11be0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
11bf0 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 5b  e3_free(pCur->a[
11c00 69 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20 7d 0a 20  i].zWord);.  }. 
11c10 20 70 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 30 3b   pCur->nRow = 0;
11c20 0a 20 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20  .  pCur->iRow = 
11c30 30 3b 0a 20 20 70 43 75 72 2d 3e 6e 53 65 61 72  0;.  pCur->nSear
11c40 63 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  ch = 0;.  if( pC
11c50 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b  ur->pFullScan ){
11c60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
11c70 61 6c 69 7a 65 28 70 43 75 72 2d 3e 70 46 75 6c  alize(pCur->pFul
11c80 6c 53 63 61 6e 29 3b 0a 20 20 20 20 70 43 75 72  lScan);.    pCur
11c90 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 3d 20 30 3b  ->pFullScan = 0;
11ca0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
11cb0 73 69 7a 65 20 74 68 65 20 63 75 72 73 6f 72 20  size the cursor 
11cc0 74 6f 20 68 6f 6c 64 20 75 70 20 74 6f 20 4e 20  to hold up to N 
11cd0 72 6f 77 73 20 6f 66 20 63 6f 6e 74 65 6e 74 0a  rows of content.
11ce0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
11cf0 70 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75  pellfix1ResizeCu
11d00 72 73 6f 72 28 73 70 65 6c 6c 66 69 78 31 5f 63  rsor(spellfix1_c
11d10 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
11d20 20 4e 29 7b 0a 20 20 73 74 72 75 63 74 20 73 70   N){.  struct sp
11d30 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 61 4e 65  ellfix1_row *aNe
11d40 77 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d  w;.  assert( N>=
11d50 70 43 75 72 2d 3e 6e 52 6f 77 20 29 3b 0a 20 20  pCur->nRow );.  
11d60 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  aNew = sqlite3_r
11d70 65 61 6c 6c 6f 63 36 34 28 70 43 75 72 2d 3e 61  ealloc64(pCur->a
11d80 2c 20 73 69 7a 65 6f 66 28 70 43 75 72 2d 3e 61  , sizeof(pCur->a
11d90 5b 30 5d 29 2a 4e 29 3b 0a 20 20 69 66 28 20 61  [0])*N);.  if( a
11da0 4e 65 77 3d 3d 30 20 26 26 20 4e 3e 30 20 29 7b  New==0 && N>0 ){
11db0 0a 20 20 20 20 73 70 65 6c 6c 66 69 78 31 52 65  .    spellfix1Re
11dc0 73 65 74 43 75 72 73 6f 72 28 70 43 75 72 29 3b  setCursor(pCur);
11dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
11de0 65 28 70 43 75 72 2d 3e 61 29 3b 0a 20 20 20 20  e(pCur->a);.    
11df0 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  pCur->nAlloc = 0
11e00 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 20 3d 20  ;.    pCur->a = 
11e10 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
11e20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 4e  pCur->nAlloc = N
11e30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 20 3d 20  ;.    pCur->a = 
11e40 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  aNew;.  }.}.../*
11e50 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 75 7a 7a  .** Close a fuzz
11e60 79 2d 73 65 61 72 63 68 20 63 75 72 73 6f 72 2e  y-search cursor.
11e70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
11e80 70 65 6c 6c 66 69 78 31 43 6c 6f 73 65 28 73 71  pellfix1Close(sq
11e90 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
11ea0 72 20 2a 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c  r *cur){.  spell
11eb0 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75  fix1_cursor *pCu
11ec0 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63  r = (spellfix1_c
11ed0 75 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73  ursor *)cur;.  s
11ee0 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72  pellfix1ResetCur
11ef0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 73 70 65  sor(pCur);.  spe
11f00 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75 72 73  llfix1ResizeCurs
11f10 6f 72 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 73  or(pCur, 0);.  s
11f20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
11f30 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 73  ->zPattern);.  s
11f40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
11f50 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11f60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 64 65 66 69 6e  TE_OK;.}..#defin
11f70 65 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  e SPELLFIX_IDXNU
11f80 4d 5f 4d 41 54 43 48 20 20 30 78 30 31 20 20 20  M_MATCH  0x01   
11f90 20 20 20 20 20 20 2f 2a 20 77 6f 72 64 20 4d 41        /* word MA
11fa0 54 43 48 20 24 73 74 72 20 2a 2f 0a 23 64 65 66  TCH $str */.#def
11fb0 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49 44 58  ine SPELLFIX_IDX
11fc0 4e 55 4d 5f 4c 41 4e 47 49 44 20 30 78 30 32 20  NUM_LANGID 0x02 
11fd0 20 20 20 20 20 20 20 20 2f 2a 20 6c 61 6e 67 69          /* langi
11fe0 64 20 3d 3d 20 24 6c 61 6e 67 69 64 20 2a 2f 0a  d == $langid */.
11ff0 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
12000 5f 49 44 58 4e 55 4d 5f 54 4f 50 20 20 20 20 30  _IDXNUM_TOP    0
12010 78 30 34 20 20 20 20 20 20 20 20 20 2f 2a 20 74  x04         /* t
12020 6f 70 20 3d 20 24 74 6f 70 20 2a 2f 0a 23 64 65  op = $top */.#de
12030 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49 44  fine SPELLFIX_ID
12040 58 4e 55 4d 5f 53 43 4f 50 45 20 20 30 78 30 38  XNUM_SCOPE  0x08
12050 20 20 20 20 20 20 20 20 20 2f 2a 20 73 63 6f 70           /* scop
12060 65 20 3d 20 24 73 63 6f 70 65 20 2a 2f 0a 23 64  e = $scope */.#d
12070 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49  efine SPELLFIX_I
12080 44 58 4e 55 4d 5f 44 49 53 54 4c 54 20 30 78 31  DXNUM_DISTLT 0x1
12090 30 20 20 20 20 20 20 20 20 20 2f 2a 20 64 69 73  0         /* dis
120a0 74 61 6e 63 65 20 3c 20 24 64 69 73 74 61 6e 63  tance < $distanc
120b0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 45  e */.#define SPE
120c0 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44 49 53  LLFIX_IDXNUM_DIS
120d0 54 4c 45 20 30 78 32 30 20 20 20 20 20 20 20 20  TLE 0x20        
120e0 20 2f 2a 20 64 69 73 74 61 6e 63 65 20 3c 3d 20   /* distance <= 
120f0 24 64 69 73 74 61 6e 63 65 20 2a 2f 0a 23 64 65  $distance */.#de
12100 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49 44  fine SPELLFIX_ID
12110 58 4e 55 4d 5f 52 4f 57 49 44 20 20 30 78 34 30  XNUM_ROWID  0x40
12120 20 20 20 20 20 20 20 20 20 2f 2a 20 72 6f 77 69           /* rowi
12130 64 20 3d 20 24 72 6f 77 69 64 20 2a 2f 0a 23 64  d = $rowid */.#d
12140 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49  efine SPELLFIX_I
12150 44 58 4e 55 4d 5f 44 49 53 54 20 20 20 28 30 78  DXNUM_DIST   (0x
12160 31 30 7c 30 78 32 30 29 20 20 2f 2a 20 44 49 53  10|0x20)  /* DIS
12170 54 4c 54 20 61 6e 64 20 44 49 53 54 4c 45 20 2a  TLT and DISTLE *
12180 2f 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  /../*.**.** The 
12190 70 6c 61 6e 20 6e 75 6d 62 65 72 20 69 73 20 61  plan number is a
121a0 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20   bitmask of the 
121b0 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
121c0 2a 20 76 61 6c 75 65 73 20 64 65 66 69 6e 65 64  * values defined
121d0 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  .** above..**.**
121e0 20 66 69 6c 74 65 72 2e 61 72 67 76 5b 2a 5d 20   filter.argv[*] 
121f0 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 73 20  values contains 
12200 24 73 74 72 2c 20 24 6c 61 6e 67 69 64 2c 20 24  $str, $langid, $
12210 74 6f 70 2c 20 24 73 63 6f 70 65 20 61 6e 64 20  top, $scope and 
12220 24 72 6f 77 69 64 0a 2a 2a 20 69 66 20 73 70 65  $rowid.** if spe
12230 63 69 66 69 65 64 20 61 6e 64 20 69 6e 20 74 68  cified and in th
12240 61 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  at order..*/.sta
12250 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
12260 31 42 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74  1BestIndex(sqlit
12270 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71  e3_vtab *tab, sq
12280 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
12290 20 2a 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 69   *pIdxInfo){.  i
122a0 6e 74 20 69 50 6c 61 6e 20 3d 20 30 3b 0a 20 20  nt iPlan = 0;.  
122b0 69 6e 74 20 69 4c 61 6e 67 54 65 72 6d 20 3d 20  int iLangTerm = 
122c0 2d 31 3b 0a 20 20 69 6e 74 20 69 54 6f 70 54 65  -1;.  int iTopTe
122d0 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  rm = -1;.  int i
122e0 53 63 6f 70 65 54 65 72 6d 20 3d 20 2d 31 3b 0a  ScopeTerm = -1;.
122f0 20 20 69 6e 74 20 69 44 69 73 74 54 65 72 6d 20    int iDistTerm 
12300 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 52 6f 77  = -1;.  int iRow
12310 69 64 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69  idTerm = -1;.  i
12320 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 73 74  nt i;.  const st
12330 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
12340 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
12350 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 43  Constraint;.  pC
12360 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
12370 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
12380 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
12390 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
123a0 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e  raint; i++, pCon
123b0 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20  straint++){.    
123c0 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
123d0 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e  >usable==0 ) con
123e0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 54  tinue;..    /* T
123f0 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
12400 3a 20 20 77 6f 72 64 20 4d 41 54 43 48 20 24 73  :  word MATCH $s
12410 74 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69  tr */.    if( (i
12420 50 6c 61 6e 20 26 20 53 50 45 4c 4c 46 49 58 5f  Plan & SPELLFIX_
12430 49 44 58 4e 55 4d 5f 4d 41 54 43 48 29 3d 3d 30  IDXNUM_MATCH)==0
12440 20 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74   .     && pConst
12450 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  raint->iColumn==
12460 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52  SPELLFIX_COL_WOR
12470 44 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74  D.     && pConst
12480 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54  raint->op==SQLIT
12490 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
124a0 4e 54 5f 4d 41 54 43 48 0a 20 20 20 20 29 7b 0a  NT_MATCH.    ){.
124b0 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 53        iPlan |= S
124c0 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 4d  PELLFIX_IDXNUM_M
124d0 41 54 43 48 3b 0a 20 20 20 20 20 20 70 49 64 78  ATCH;.      pIdx
124e0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
124f0 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e  tUsage[i].argvIn
12500 64 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  dex = 1;.      p
12510 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
12520 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
12530 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 1;.    }..  
12540 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68    /* Terms of th
12550 65 20 66 6f 72 6d 3a 20 20 6c 61 6e 67 69 64 20  e form:  langid 
12560 3d 20 24 6c 61 6e 67 69 64 20 20 2a 2f 0a 20 20  = $langid  */.  
12570 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20 53    if( (iPlan & S
12580 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 4c  PELLFIX_IDXNUM_L
12590 41 4e 47 49 44 29 3d 3d 30 0a 20 20 20 20 20 26  ANGID)==0.     &
125a0 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  & pConstraint->i
125b0 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58  Column==SPELLFIX
125c0 5f 43 4f 4c 5f 4c 41 4e 47 49 44 0a 20 20 20 20  _COL_LANGID.    
125d0 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
125e0 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
125f0 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a  X_CONSTRAINT_EQ.
12600 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c      ){.      iPl
12610 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f 49  an |= SPELLFIX_I
12620 44 58 4e 55 4d 5f 4c 41 4e 47 49 44 3b 0a 20 20  DXNUM_LANGID;.  
12630 20 20 20 20 69 4c 61 6e 67 54 65 72 6d 20 3d 20      iLangTerm = 
12640 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  i;.    }..    /*
12650 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   Terms of the fo
12660 72 6d 3a 20 20 74 6f 70 20 3d 20 24 74 6f 70 20  rm:  top = $top 
12670 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61  */.    if( (iPla
12680 6e 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58  n & SPELLFIX_IDX
12690 4e 55 4d 5f 54 4f 50 29 3d 3d 30 0a 20 20 20 20  NUM_TOP)==0.    
126a0 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
126b0 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46  >iColumn==SPELLF
126c0 49 58 5f 43 4f 4c 5f 54 4f 50 0a 20 20 20 20 20  IX_COL_TOP.     
126d0 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
126e0 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
126f0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20  _CONSTRAINT_EQ. 
12700 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61     ){.      iPla
12710 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f 49 44  n |= SPELLFIX_ID
12720 58 4e 55 4d 5f 54 4f 50 3b 0a 20 20 20 20 20 20  XNUM_TOP;.      
12730 69 54 6f 70 54 65 72 6d 20 3d 20 69 3b 0a 20 20  iTopTerm = i;.  
12740 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d    }..    /* Term
12750 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20  s of the form:  
12760 73 63 6f 70 65 20 3d 20 24 73 63 6f 70 65 20 2a  scope = $scope *
12770 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e  /.    if( (iPlan
12780 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e   & SPELLFIX_IDXN
12790 55 4d 5f 53 43 4f 50 45 29 3d 3d 30 0a 20 20 20  UM_SCOPE)==0.   
127a0 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
127b0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c  ->iColumn==SPELL
127c0 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 0a 20 20  FIX_COL_SCOPE.  
127d0 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e     && pConstrain
127e0 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t->op==SQLITE_IN
127f0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
12800 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  Q.    ){.      i
12810 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58  Plan |= SPELLFIX
12820 5f 49 44 58 4e 55 4d 5f 53 43 4f 50 45 3b 0a 20  _IDXNUM_SCOPE;. 
12830 20 20 20 20 20 69 53 63 6f 70 65 54 65 72 6d 20       iScopeTerm 
12840 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = i;.    }..    
12850 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  /* Terms of the 
12860 66 6f 72 6d 3a 20 20 64 69 73 74 61 6e 63 65 20  form:  distance 
12870 3c 20 24 64 69 73 74 20 6f 72 20 64 69 73 74 61  < $dist or dista
12880 6e 63 65 20 3c 3d 20 24 64 69 73 74 20 2a 2f 0a  nce <= $dist */.
12890 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26      if( (iPlan &
128a0 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
128b0 5f 44 49 53 54 29 3d 3d 30 0a 20 20 20 20 20 26  _DIST)==0.     &
128c0 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  & pConstraint->i
128d0 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58  Column==SPELLFIX
128e0 5f 43 4f 4c 5f 44 49 53 54 41 4e 43 45 0a 20 20  _COL_DISTANCE.  
128f0 20 20 20 26 26 20 28 70 43 6f 6e 73 74 72 61 69     && (pConstrai
12900 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49  nt->op==SQLITE_I
12910 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
12920 4c 54 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  LT.          || 
12930 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
12940 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
12950 4e 53 54 52 41 49 4e 54 5f 4c 45 29 0a 20 20 20  NSTRAINT_LE).   
12960 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
12970 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53  onstraint->op==S
12980 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
12990 54 52 41 49 4e 54 5f 4c 54 20 29 7b 0a 20 20 20  TRAINT_LT ){.   
129a0 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 53 50       iPlan |= SP
129b0 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44 49  ELLFIX_IDXNUM_DI
129c0 53 54 4c 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  STLT;.      }els
129d0 65 7b 0a 20 20 20 20 20 20 20 20 69 50 6c 61 6e  e{.        iPlan
129e0 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f 49 44 58   |= SPELLFIX_IDX
129f0 4e 55 4d 5f 44 49 53 54 4c 45 3b 0a 20 20 20 20  NUM_DISTLE;.    
12a00 20 20 7d 0a 20 20 20 20 20 20 69 44 69 73 74 54    }.      iDistT
12a10 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a  erm = i;.    }..
12a20 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20      /* Terms of 
12a30 74 68 65 20 66 6f 72 6d 3a 20 20 64 69 73 74 61  the form:  dista
12a40 6e 63 65 20 3c 20 24 64 69 73 74 20 6f 72 20 64  nce < $dist or d
12a50 69 73 74 61 6e 63 65 20 3c 3d 20 24 64 69 73 74  istance <= $dist
12a60 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c   */.    if( (iPl
12a70 61 6e 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44  an & SPELLFIX_ID
12a80 58 4e 55 4d 5f 52 4f 57 49 44 29 3d 3d 30 0a 20  XNUM_ROWID)==0. 
12a90 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69      && pConstrai
12aa0 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20  nt->iColumn<0.  
12ab0 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e     && pConstrain
12ac0 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t->op==SQLITE_IN
12ad0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45  DEX_CONSTRAINT_E
12ae0 51 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  Q.    ){.      i
12af0 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46 49 58  Plan |= SPELLFIX
12b00 5f 49 44 58 4e 55 4d 5f 52 4f 57 49 44 3b 0a 20  _IDXNUM_ROWID;. 
12b10 20 20 20 20 20 69 52 6f 77 69 64 54 65 72 6d 20       iRowidTerm 
12b20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = i;.    }.  }. 
12b30 20 69 66 28 20 69 50 6c 61 6e 26 53 50 45 4c 4c   if( iPlan&SPELL
12b40 46 49 58 5f 49 44 58 4e 55 4d 5f 4d 41 54 43 48  FIX_IDXNUM_MATCH
12b50 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
12b60 3d 20 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 2;.    pIdxInf
12b70 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 69 50 6c 61  o->idxNum = iPla
12b80 6e 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  n;.    if( pIdxI
12b90 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d 31  nfo->nOrderBy==1
12ba0 0a 20 20 20 20 20 26 26 20 70 49 64 78 49 6e 66  .     && pIdxInf
12bb0 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e 69  o->aOrderBy[0].i
12bc0 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58  Column==SPELLFIX
12bd0 5f 43 4f 4c 5f 53 43 4f 52 45 0a 20 20 20 20 20  _COL_SCORE.     
12be0 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  && pIdxInfo->aOr
12bf0 64 65 72 42 79 5b 30 5d 2e 64 65 73 63 3d 3d 30  derBy[0].desc==0
12c00 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 49  .    ){.      pI
12c10 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
12c20 6f 6e 73 75 6d 65 64 20 3d 20 31 3b 20 20 2f 2a  onsumed = 1;  /*
12c30 20 44 65 66 61 75 6c 74 20 6f 72 64 65 72 20 62   Default order b
12c40 79 20 69 53 63 6f 72 65 20 2a 2f 0a 20 20 20 20  y iScore */.    
12c50 7d 0a 20 20 20 20 69 66 28 20 69 50 6c 61 6e 26  }.    if( iPlan&
12c60 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
12c70 4c 41 4e 47 49 44 20 29 7b 0a 20 20 20 20 20 20  LANGID ){.      
12c80 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
12c90 72 61 69 6e 74 55 73 61 67 65 5b 69 4c 61 6e 67  raintUsage[iLang
12ca0 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20  Term].argvIndex 
12cb0 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70  = idx++;.      p
12cc0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
12cd0 61 69 6e 74 55 73 61 67 65 5b 69 4c 61 6e 67 54  aintUsage[iLangT
12ce0 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  erm].omit = 1;. 
12cf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c     }.    if( iPl
12d00 61 6e 26 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e  an&SPELLFIX_IDXN
12d10 55 4d 5f 54 4f 50 20 29 7b 0a 20 20 20 20 20 20  UM_TOP ){.      
12d20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
12d30 72 61 69 6e 74 55 73 61 67 65 5b 69 54 6f 70 54  raintUsage[iTopT
12d40 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  erm].argvIndex =
12d50 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49   idx++;.      pI
12d60 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
12d70 69 6e 74 55 73 61 67 65 5b 69 54 6f 70 54 65 72  intUsage[iTopTer
12d80 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20  m].omit = 1;.   
12d90 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c 61 6e   }.    if( iPlan
12da0 26 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d  &SPELLFIX_IDXNUM
12db0 5f 53 43 4f 50 45 20 29 7b 0a 20 20 20 20 20 20  _SCOPE ){.      
12dc0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
12dd0 72 61 69 6e 74 55 73 61 67 65 5b 69 53 63 6f 70  raintUsage[iScop
12de0 65 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78  eTerm].argvIndex
12df0 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20   = idx++;.      
12e00 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
12e10 72 61 69 6e 74 55 73 61 67 65 5b 69 53 63 6f 70  raintUsage[iScop
12e20 65 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b  eTerm].omit = 1;
12e30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
12e40 50 6c 61 6e 26 53 50 45 4c 4c 46 49 58 5f 49 44  Plan&SPELLFIX_ID
12e50 58 4e 55 4d 5f 44 49 53 54 20 29 7b 0a 20 20 20  XNUM_DIST ){.   
12e60 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
12e70 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 44  nstraintUsage[iD
12e80 69 73 74 54 65 72 6d 5d 2e 61 72 67 76 49 6e 64  istTerm].argvInd
12e90 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20 20 20  ex = idx++;.    
12ea0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
12eb0 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 44 69  straintUsage[iDi
12ec0 73 74 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31  stTerm].omit = 1
12ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 64 78  ;.    }.    pIdx
12ee0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
12ef0 6f 73 74 20 3d 20 31 65 35 3b 0a 20 20 7d 65 6c  ost = 1e5;.  }el
12f00 73 65 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20  se if( (iPlan & 
12f10 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
12f20 52 4f 57 49 44 29 20 29 7b 0a 20 20 20 20 70 49  ROWID) ){.    pI
12f30 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
12f40 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
12f50 5f 52 4f 57 49 44 3b 0a 20 20 20 20 70 49 64 78  _ROWID;.    pIdx
12f60 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
12f70 74 55 73 61 67 65 5b 69 52 6f 77 69 64 54 65 72  tUsage[iRowidTer
12f80 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 31  m].argvIndex = 1
12f90 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
12fa0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
12fb0 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e 6f 6d 69  [iRowidTerm].omi
12fc0 74 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49  t = 1;.    pIdxI
12fd0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
12fe0 73 74 20 3d 20 35 3b 0a 20 20 7d 65 6c 73 65 7b  st = 5;.  }else{
12ff0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
13000 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70  dxNum = 0;.    p
13010 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
13020 65 64 43 6f 73 74 20 3d 20 31 65 35 30 3b 0a 20  edCost = 1e50;. 
13030 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13040 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13050 4f 70 65 6e 20 61 20 6e 65 77 20 66 75 7a 7a 79  Open a new fuzzy
13060 2d 73 65 61 72 63 68 20 63 75 72 73 6f 72 2e 0a  -search cursor..
13070 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
13080 65 6c 6c 66 69 78 31 4f 70 65 6e 28 73 71 6c 69  ellfix1Open(sqli
13090 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c  te3_vtab *pVTab,
130a0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
130b0 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29  rsor **ppCursor)
130c0 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74  {.  spellfix1_vt
130d0 61 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69  ab *p = (spellfi
130e0 78 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b 0a  x1_vtab*)pVTab;.
130f0 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73    spellfix1_curs
13100 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75 72  or *pCur;.  pCur
13110 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
13120 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 75  c64( sizeof(*pCu
13130 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
13140 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13150 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
13160 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69 7a  set(pCur, 0, siz
13170 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70  eof(*pCur));.  p
13180 43 75 72 2d 3e 70 56 54 61 62 20 3d 20 70 3b 0a  Cur->pVTab = p;.
13190 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70    *ppCursor = &p
131a0 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74  Cur->base;.  ret
131b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
131c0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 61  ../*.** Adjust a
131d0 20 64 69 73 74 61 6e 63 65 20 6d 65 61 73 75 72   distance measur
131e0 65 6d 65 6e 74 20 62 79 20 74 68 65 20 77 6f 72  ement by the wor
131f0 64 73 20 72 61 6e 6b 20 69 6e 20 6f 72 64 65 72  ds rank in order
13200 20 74 6f 20 73 68 6f 77 0a 2a 2a 20 70 72 65 66   to show.** pref
13210 65 72 65 6e 63 65 20 74 6f 20 63 6f 6d 6d 6f 6e  erence to common
13220 20 77 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69   words..*/.stati
13230 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 53  c int spellfix1S
13240 63 6f 72 65 28 69 6e 74 20 69 44 69 73 74 61 6e  core(int iDistan
13250 63 65 2c 20 69 6e 74 20 69 52 61 6e 6b 29 7b 0a  ce, int iRank){.
13260 20 20 69 6e 74 20 69 4c 6f 67 32 3b 0a 20 20 66    int iLog2;.  f
13270 6f 72 28 69 4c 6f 67 32 3d 30 3b 20 69 52 61 6e  or(iLog2=0; iRan
13280 6b 3e 30 3b 20 69 4c 6f 67 32 2b 2b 2c 20 69 52  k>0; iLog2++, iR
13290 61 6e 6b 3e 3e 3d 31 29 7b 7d 0a 20 20 72 65 74  ank>>=1){}.  ret
132a0 75 72 6e 20 69 44 69 73 74 61 6e 63 65 20 2b 20  urn iDistance + 
132b0 33 32 20 2d 20 69 4c 6f 67 32 3b 0a 7d 0a 0a 2f  32 - iLog2;.}../
132c0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
132d0 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 6f   spellfix1_row o
132e0 62 6a 65 63 74 73 20 66 6f 72 20 73 6f 72 74 69  bjects for sorti
132f0 6e 67 20 70 75 72 70 6f 73 65 73 20 69 6e 20 71  ng purposes in q
13300 73 6f 72 74 28 29 20 73 75 63 68 0a 2a 2a 20 74  sort() such.** t
13310 68 61 74 20 74 68 65 79 20 73 6f 72 74 20 69 6e  hat they sort in
13320 20 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65 61   order of increa
13330 73 69 6e 67 20 64 69 73 74 61 6e 63 65 2e 0a 2a  sing distance..*
13340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
13350 49 54 45 5f 43 44 45 43 4c 20 73 70 65 6c 6c 66  ITE_CDECL spellf
13360 69 78 31 52 6f 77 43 6f 6d 70 61 72 65 28 63 6f  ix1RowCompare(co
13370 6e 73 74 20 76 6f 69 64 20 2a 41 2c 20 63 6f 6e  nst void *A, con
13380 73 74 20 76 6f 69 64 20 2a 42 29 7b 0a 20 20 63  st void *B){.  c
13390 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70 65 6c  onst struct spel
133a0 6c 66 69 78 31 5f 72 6f 77 20 2a 61 20 3d 20 28  lfix1_row *a = (
133b0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70 65  const struct spe
133c0 6c 6c 66 69 78 31 5f 72 6f 77 2a 29 41 3b 0a 20  llfix1_row*)A;. 
133d0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70   const struct sp
133e0 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 62 20 3d  ellfix1_row *b =
133f0 20 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73   (const struct s
13400 70 65 6c 6c 66 69 78 31 5f 72 6f 77 2a 29 42 3b  pellfix1_row*)B;
13410 0a 20 20 72 65 74 75 72 6e 20 61 2d 3e 69 53 63  .  return a->iSc
13420 6f 72 65 20 2d 20 62 2d 3e 69 53 63 6f 72 65 3b  ore - b->iScore;
13430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  .}../*.** A stru
13440 63 74 75 72 65 20 75 73 65 64 20 74 6f 20 70 61  cture used to pa
13450 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ss information f
13460 72 6f 6d 20 73 70 65 6c 6c 66 69 78 31 46 69 6c  rom spellfix1Fil
13470 74 65 72 46 6f 72 4d 61 74 63 68 28 29 0a 2a 2a  terForMatch().**
13480 20 69 6e 74 6f 20 73 70 65 6c 6c 66 69 78 31 52   into spellfix1R
13490 75 6e 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 74 79  unQuery()..*/.ty
134a0 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 61 74  pedef struct Mat
134b0 63 68 51 75 65 72 79 20 7b 0a 20 20 73 70 65 6c  chQuery {.  spel
134c0 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
134d0 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur;          /* 
134e0 54 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  The cursor being
134f0 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 73 71   queried */.  sq
13500 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
13510 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
13520 2a 20 73 68 61 64 6f 77 20 74 61 62 6c 65 20 71  * shadow table q
13530 75 65 72 79 20 73 74 61 74 6d 65 6e 74 20 2a 2f  uery statment */
13540 0a 20 20 63 68 61 72 20 7a 48 61 73 68 5b 53 50  .  char zHash[SP
13550 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 5d 3b  ELLFIX_MX_HASH];
13560 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
13570 6e 74 20 70 68 6f 6e 65 68 61 73 68 20 66 6f 72  nt phonehash for
13580 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 63   zPattern */.  c
13590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74  onst char *zPatt
135a0 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ern;            
135b0 2f 2a 20 54 72 61 6e 73 6c 69 74 65 72 61 74 65  /* Transliterate
135c0 64 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2a  d input string *
135d0 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e  /.  int nPattern
135e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
135f0 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
13600 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20  f zPattern */.  
13610 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  EditDist3FromStr
13620 69 6e 67 20 2a 70 4d 61 74 63 68 53 74 72 33 3b  ing *pMatchStr3;
13630 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 75 6e 69   /* Original uni
13640 63 6f 64 65 20 73 74 72 69 6e 67 20 2a 2f 0a 20  code string */. 
13650 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   EditDist3Config
13660 20 2a 70 43 6f 6e 66 69 67 33 3b 20 20 20 20 20   *pConfig3;     
13670 20 20 2f 2a 20 45 64 69 74 2d 64 69 73 74 61 6e    /* Edit-distan
13680 63 65 20 63 6f 73 74 20 63 6f 65 66 66 69 63 69  ce cost coeffici
13690 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ents */.  const 
136a0 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70  EditDist3Lang *p
136b0 4c 61 6e 67 3b 20 20 20 20 20 20 2f 2a 20 54 68  Lang;      /* Th
136c0 65 20 73 65 6c 65 63 74 65 64 20 6c 61 6e 67 75  e selected langu
136d0 61 67 65 20 63 6f 65 66 66 69 63 69 65 6e 74 73  age coefficients
136e0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b   */.  int iLang;
136f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13700 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61         /* The la
13710 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20 20 69  nguage id */.  i
13720 6e 74 20 69 53 63 6f 70 65 3b 20 20 20 20 20 20  nt iScope;      
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13740 2f 2a 20 44 65 66 61 75 6c 74 20 73 63 6f 70 65  /* Default scope
13750 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 61 78 44 69   */.  int iMaxDi
13760 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
13770 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
13780 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69 74 20 64  m allowed edit d
13790 69 73 74 61 6e 63 65 2c 20 6f 72 20 2d 31 20 2a  istance, or -1 *
137a0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137c0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
137d0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 75 6e  de */.  int nRun
137e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
137f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13800 70 72 69 6f 72 20 72 75 6e 73 20 66 6f 72 20 74  prior runs for t
13810 68 65 20 73 61 6d 65 20 7a 50 61 74 74 65 72 6e  he same zPattern
13820 20 2a 2f 0a 20 20 63 68 61 72 20 61 7a 50 72 69   */.  char azPri
13830 6f 72 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52  or[SPELLFIX_MX_R
13840 55 4e 5d 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  UN][SPELLFIX_MX_
13850 48 41 53 48 5d 3b 20 20 2f 2a 20 50 72 69 6f 72  HASH];  /* Prior
13860 20 68 61 73 68 65 73 20 2a 2f 0a 7d 20 4d 61 74   hashes */.} Mat
13870 63 68 51 75 65 72 79 3b 0a 0a 2f 2a 0a 2a 2a 20  chQuery;../*.** 
13880 52 75 6e 20 61 20 71 75 65 72 79 20 6c 6f 6f 6b  Run a query look
13890 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74  ing for the best
138a0 20 6d 61 74 63 68 65 73 20 61 67 61 69 6e 73 74   matches against
138b0 20 7a 50 61 74 74 65 72 6e 20 75 73 69 6e 67 0a   zPattern using.
138c0 2a 2a 20 7a 48 61 73 68 20 61 73 20 74 68 65 20  ** zHash as the 
138d0 63 68 61 72 61 63 74 65 72 20 63 6c 61 73 73 20  character class 
138e0 73 65 65 64 20 68 61 73 68 2e 0a 2a 2f 0a 73 74  seed hash..*/.st
138f0 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66  atic void spellf
13900 69 78 31 52 75 6e 51 75 65 72 79 28 4d 61 74 63  ix1RunQuery(Matc
13910 68 51 75 65 72 79 20 2a 70 2c 20 63 6f 6e 73 74  hQuery *p, const
13920 20 63 68 61 72 20 2a 7a 51 75 65 72 79 2c 20 69   char *zQuery, i
13930 6e 74 20 6e 51 75 65 72 79 29 7b 0a 20 20 63 6f  nt nQuery){.  co
13940 6e 73 74 20 63 68 61 72 20 2a 7a 4b 31 3b 0a 20  nst char *zK1;. 
13950 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
13960 72 64 3b 0a 20 20 69 6e 74 20 69 44 69 73 74 3b  rd;.  int iDist;
13970 0a 20 20 69 6e 74 20 69 52 61 6e 6b 3b 0a 20 20  .  int iRank;.  
13980 69 6e 74 20 69 53 63 6f 72 65 3b 0a 20 20 69 6e  int iScore;.  in
13990 74 20 69 57 6f 72 73 74 20 3d 20 30 3b 0a 20 20  t iWorst = 0;.  
139a0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 69  int idx;.  int i
139b0 64 78 57 6f 72 73 74 20 3d 20 2d 31 3b 0a 20 20  dxWorst = -1;.  
139c0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 63  int i;.  int iSc
139d0 6f 70 65 20 3d 20 70 2d 3e 69 53 63 6f 70 65 3b  ope = p->iScope;
139e0 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  .  spellfix1_cur
139f0 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d 3e 70  sor *pCur = p->p
13a00 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  Cur;.  sqlite3_s
13a10 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 2d 3e  tmt *pStmt = p->
13a20 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 7a 48  pStmt;.  char zH
13a30 61 73 68 31 5b 53 50 45 4c 4c 46 49 58 5f 4d 58  ash1[SPELLFIX_MX
13a40 5f 48 41 53 48 5d 3b 0a 20 20 63 68 61 72 20 7a  _HASH];.  char z
13a50 48 61 73 68 32 5b 53 50 45 4c 4c 46 49 58 5f 4d  Hash2[SPELLFIX_M
13a60 58 5f 48 41 53 48 5d 3b 0a 20 20 63 68 61 72 20  X_HASH];.  char 
13a70 2a 7a 43 6c 61 73 73 3b 0a 20 20 69 6e 74 20 6e  *zClass;.  int n
13a80 43 6c 61 73 73 3b 0a 20 20 69 6e 74 20 72 63 3b  Class;.  int rc;
13a90 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 61 3d  ..  if( pCur->a=
13aa0 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 20 72 65  =0 || p->rc ) re
13ab0 74 75 72 6e 3b 20 20 20 2f 2a 20 50 72 69 6f 72  turn;   /* Prior
13ac0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
13ad0 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  on failure */.  
13ae0 7a 43 6c 61 73 73 20 3d 20 28 63 68 61 72 2a 29  zClass = (char*)
13af0 70 68 6f 6e 65 74 69 63 48 61 73 68 28 28 75 6e  phoneticHash((un
13b00 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 51 75  signed char*)zQu
13b10 65 72 79 2c 20 6e 51 75 65 72 79 29 3b 0a 20 20  ery, nQuery);.  
13b20 69 66 28 20 7a 43 6c 61 73 73 3d 3d 30 20 29 7b  if( zClass==0 ){
13b30 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
13b40 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72  ITE_NOMEM;.    r
13b50 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e 43 6c  eturn;.  }.  nCl
13b60 61 73 73 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ass = (int)strle
13b70 6e 28 7a 43 6c 61 73 73 29 3b 0a 20 20 69 66 28  n(zClass);.  if(
13b80 20 6e 43 6c 61 73 73 3e 53 50 45 4c 4c 46 49 58   nClass>SPELLFIX
13b90 5f 4d 58 5f 48 41 53 48 2d 32 20 29 7b 0a 20 20  _MX_HASH-2 ){.  
13ba0 20 20 6e 43 6c 61 73 73 20 3d 20 53 50 45 4c 4c    nClass = SPELL
13bb0 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 3b 0a 20  FIX_MX_HASH-2;. 
13bc0 20 20 20 7a 43 6c 61 73 73 5b 6e 43 6c 61 73 73     zClass[nClass
13bd0 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  ] = 0;.  }.  if(
13be0 20 6e 43 6c 61 73 73 3c 3d 69 53 63 6f 70 65 20   nClass<=iScope 
13bf0 29 7b 0a 20 20 20 20 69 66 28 20 6e 43 6c 61 73  ){.    if( nClas
13c00 73 3e 32 20 29 7b 0a 20 20 20 20 20 20 69 53 63  s>2 ){.      iSc
13c10 6f 70 65 20 3d 20 6e 43 6c 61 73 73 2d 31 3b 0a  ope = nClass-1;.
13c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c30 20 69 53 63 6f 70 65 20 3d 20 6e 43 6c 61 73 73   iScope = nClass
13c40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65  ;.    }.  }.  me
13c50 6d 63 70 79 28 7a 48 61 73 68 31 2c 20 7a 43 6c  mcpy(zHash1, zCl
13c60 61 73 73 2c 20 69 53 63 6f 70 65 29 3b 0a 20 20  ass, iScope);.  
13c70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6c  sqlite3_free(zCl
13c80 61 73 73 29 3b 0a 20 20 7a 48 61 73 68 31 5b 69  ass);.  zHash1[i
13c90 53 63 6f 70 65 5d 20 3d 20 30 3b 0a 20 20 6d 65  Scope] = 0;.  me
13ca0 6d 63 70 79 28 7a 48 61 73 68 32 2c 20 7a 48 61  mcpy(zHash2, zHa
13cb0 73 68 31 2c 20 69 53 63 6f 70 65 29 3b 0a 20 20  sh1, iScope);.  
13cc0 7a 48 61 73 68 32 5b 69 53 63 6f 70 65 5d 20 3d  zHash2[iScope] =
13cd0 20 27 5a 27 3b 0a 20 20 7a 48 61 73 68 32 5b 69   'Z';.  zHash2[i
13ce0 53 63 6f 70 65 2b 31 5d 20 3d 20 30 3b 0a 23 69  Scope+1] = 0;.#i
13cf0 66 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55  f SPELLFIX_MX_RU
13d00 4e 3e 31 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  N>1.  for(i=0; i
13d10 3c 70 2d 3e 6e 52 75 6e 3b 20 69 2b 2b 29 7b 0a  <p->nRun; i++){.
13d20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
13d30 2d 3e 61 7a 50 72 69 6f 72 5b 69 5d 2c 20 7a 48  ->azPrior[i], zH
13d40 61 73 68 31 29 3d 3d 30 20 29 20 72 65 74 75 72  ash1)==0 ) retur
13d50 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
13d60 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 75 6e 3c  assert( p->nRun<
13d70 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 20  SPELLFIX_MX_RUN 
13d80 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61  );.  memcpy(p->a
13d90 7a 50 72 69 6f 72 5b 70 2d 3e 6e 52 75 6e 2b 2b  zPrior[p->nRun++
13da0 5d 2c 20 7a 48 61 73 68 31 2c 20 69 53 63 6f 70  ], zHash1, iScop
13db0 65 2b 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  e+1);.  if( sqli
13dc0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
13dd0 74 6d 74 2c 20 31 2c 20 7a 48 61 73 68 31 2c 20  tmt, 1, zHash1, 
13de0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
13df0 43 29 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  C)==SQLITE_NOMEM
13e00 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 62  .   || sqlite3_b
13e10 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
13e20 32 2c 20 7a 48 61 73 68 32 2c 20 2d 31 2c 20 53  2, zHash2, -1, S
13e30 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3d 3d 53  QLITE_STATIC)==S
13e40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 29 7b  QLITE_NOMEM.  ){
13e50 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
13e60 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72  ITE_NOMEM;.    r
13e70 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 69 66 20 53  eturn;.  }.#if S
13e80 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 3e 31  PELLFIX_MX_RUN>1
13e90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
13ea0 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a  ur->nRow; i++){.
13eb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 5b      if( pCur->a[
13ec0 69 5d 2e 69 53 63 6f 72 65 3e 69 57 6f 72 73 74  i].iScore>iWorst
13ed0 20 29 7b 0a 20 20 20 20 20 20 69 57 6f 72 73 74   ){.      iWorst
13ee0 20 3d 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69 53   = pCur->a[i].iS
13ef0 63 6f 72 65 3b 0a 20 20 20 20 20 20 69 64 78 57  core;.      idxW
13f00 6f 72 73 74 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  orst = i;.    }.
13f10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69    }.#endif.  whi
13f20 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
13f30 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
13f40 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ROW ){.    int i
13f50 4d 61 74 63 68 6c 65 6e 20 3d 20 2d 31 3b 0a 20  Matchlen = -1;. 
13f60 20 20 20 69 52 61 6e 6b 20 3d 20 73 71 6c 69 74     iRank = sqlit
13f70 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
13f80 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 66 28  tmt, 2);.    if(
13f90 20 70 2d 3e 70 4d 61 74 63 68 53 74 72 33 20 29   p->pMatchStr3 )
13fa0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 6f 72  {.      int nWor
13fb0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
13fc0 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
13fd0 31 29 3b 0a 20 20 20 20 20 20 7a 57 6f 72 64 20  1);.      zWord 
13fe0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
13ff0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
14000 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
14010 20 20 20 20 69 44 69 73 74 20 3d 20 65 64 69 74      iDist = edit
14020 44 69 73 74 33 43 6f 72 65 28 70 2d 3e 70 4d 61  Dist3Core(p->pMa
14030 74 63 68 53 74 72 33 2c 20 7a 57 6f 72 64 2c 20  tchStr3, zWord, 
14040 6e 57 6f 72 64 2c 20 70 2d 3e 70 4c 61 6e 67 2c  nWord, p->pLang,
14050 20 26 69 4d 61 74 63 68 6c 65 6e 29 3b 0a 20 20   &iMatchlen);.  
14060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
14070 4b 31 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  K1 = (const char
14080 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
14090 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33 29 3b  _text(pStmt, 3);
140a0 0a 20 20 20 20 20 20 69 66 28 20 7a 4b 31 3d 3d  .      if( zK1==
140b0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
140c0 20 20 20 20 69 44 69 73 74 20 3d 20 65 64 69 74      iDist = edit
140d0 64 69 73 74 31 28 70 2d 3e 7a 50 61 74 74 65 72  dist1(p->zPatter
140e0 6e 2c 20 7a 4b 31 2c 20 30 29 3b 0a 20 20 20 20  n, zK1, 0);.    
140f0 7d 0a 20 20 20 20 69 66 28 20 69 44 69 73 74 3c  }.    if( iDist<
14100 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
14110 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
14120 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14130 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 6e 53    }.    pCur->nS
14140 65 61 72 63 68 2b 2b 3b 0a 20 20 20 20 0a 20 20  earch++;.    .  
14150 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
14160 20 61 20 22 64 69 73 74 61 6e 63 65 20 3c 20 24   a "distance < $
14170 64 69 73 74 22 20 6f 72 20 22 64 69 73 74 61 6e  dist" or "distan
14180 63 65 20 3c 3d 20 24 64 69 73 74 22 20 63 6f 6e  ce <= $dist" con
14190 73 74 72 61 69 6e 74 2c 0a 20 20 20 20 2a 2a 20  straint,.    ** 
141a0 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 72 6f  check if this ro
141b0 77 20 6d 65 65 74 73 20 69 74 2e 20 49 66 20 6e  w meets it. If n
141c0 6f 74 2c 20 6a 75 6d 70 20 62 61 63 6b 20 75 70  ot, jump back up
141d0 20 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74   to the top of t
141e0 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 74  he.    ** loop t
141f0 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 6e 65  o process the ne
14200 78 74 20 72 6f 77 2e 20 4f 74 68 65 72 77 69 73  xt row. Otherwis
14210 65 2c 20 69 66 20 74 68 65 20 72 6f 77 20 64 6f  e, if the row do
14220 65 73 20 6d 61 74 63 68 20 74 68 65 0a 20 20 20  es match the.   
14230 20 2a 2a 20 64 69 73 74 61 6e 63 65 20 63 6f 6e   ** distance con
14240 73 74 72 61 69 6e 74 2c 20 63 68 65 63 6b 20 69  straint, check i
14250 66 20 74 68 65 20 70 43 75 72 2d 3e 61 5b 5d 20  f the pCur->a[] 
14260 61 72 72 61 79 20 69 73 20 61 6c 72 65 61 64 79  array is already
14270 20 66 75 6c 6c 2e 0a 20 20 20 20 2a 2a 20 49 66   full..    ** If
14280 20 69 74 20 69 73 20 61 6e 64 20 6e 6f 20 65 78   it is and no ex
14290 70 6c 69 63 69 74 20 22 74 6f 70 20 3d 20 3f 22  plicit "top = ?"
142a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 61 73 20   constraint was 
142b0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a 20  present in the. 
142c0 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 67 72 6f     ** query, gro
142d0 77 20 74 68 65 20 61 72 72 61 79 20 74 6f 20 65  w the array to e
142e0 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 20 72  nsure there is r
142f0 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65 77 20  oom for the new 
14300 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 61 73  entry. */.    as
14310 73 65 72 74 28 20 28 70 2d 3e 69 4d 61 78 44 69  sert( (p->iMaxDi
14320 73 74 3e 3d 30 29 3d 3d 28 28 70 43 75 72 2d 3e  st>=0)==((pCur->
14330 69 64 78 4e 75 6d 20 26 20 53 50 45 4c 4c 46 49  idxNum & SPELLFI
14340 58 5f 49 44 58 4e 55 4d 5f 44 49 53 54 29 20 3f  X_IDXNUM_DIST) ?
14350 20 31 20 3a 20 30 29 20 29 3b 0a 20 20 20 20 69   1 : 0) );.    i
14360 66 28 20 70 2d 3e 69 4d 61 78 44 69 73 74 3e 3d  f( p->iMaxDist>=
14370 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
14380 44 69 73 74 3e 70 2d 3e 69 4d 61 78 44 69 73 74  Dist>p->iMaxDist
14390 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
143a0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f     if( pCur->nRo
143b0 77 3e 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20  w>=pCur->nAlloc 
143c0 26 26 20 28 70 43 75 72 2d 3e 69 64 78 4e 75 6d  && (pCur->idxNum
143d0 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e   & SPELLFIX_IDXN
143e0 55 4d 5f 54 4f 50 29 3d 3d 30 20 29 7b 0a 20 20  UM_TOP)==0 ){.  
143f0 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31 52        spellfix1R
14400 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75 72  esizeCursor(pCur
14410 2c 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 2a 32  , pCur->nAlloc*2
14420 20 2b 20 31 30 29 3b 0a 20 20 20 20 20 20 20 20   + 10);.        
14430 69 66 28 20 70 43 75 72 2d 3e 61 3d 3d 30 20 29  if( pCur->a==0 )
14440 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14450 20 20 20 20 7d 0a 0a 20 20 20 20 69 53 63 6f 72      }..    iScor
14460 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 53 63 6f  e = spellfix1Sco
14470 72 65 28 69 44 69 73 74 2c 69 52 61 6e 6b 29 3b  re(iDist,iRank);
14480 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e  .    if( pCur->n
14490 52 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63  Row<pCur->nAlloc
144a0 20 29 7b 0a 20 20 20 20 20 20 69 64 78 20 3d 20   ){.      idx = 
144b0 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20  pCur->nRow;.    
144c0 7d 65 6c 73 65 20 69 66 28 20 69 53 63 6f 72 65  }else if( iScore
144d0 3c 69 57 6f 72 73 74 20 29 7b 0a 20 20 20 20 20  <iWorst ){.     
144e0 20 69 64 78 20 3d 20 69 64 78 57 6f 72 73 74 3b   idx = idxWorst;
144f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14500 72 65 65 28 70 43 75 72 2d 3e 61 5b 69 64 78 5d  ree(pCur->a[idx]
14510 2e 7a 57 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c  .zWord);.    }el
14520 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  se{.      contin
14530 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ue;.    }..    p
14540 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72  Cur->a[idx].zWor
14550 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  d = sqlite3_mpri
14560 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
14570 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
14580 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66  tmt, 1));.    if
14590 28 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a  ( pCur->a[idx].z
145a0 57 6f 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Word==0 ){.     
145b0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
145c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 62 72 65  NOMEM;.      bre
145d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ak;.    }.    pC
145e0 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 52 6f 77 69  ur->a[idx].iRowi
145f0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
14600 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
14610 30 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b  0);.    pCur->a[
14620 69 64 78 5d 2e 69 52 61 6e 6b 20 3d 20 69 52 61  idx].iRank = iRa
14630 6e 6b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b  nk;.    pCur->a[
14640 69 64 78 5d 2e 69 44 69 73 74 61 6e 63 65 20 3d  idx].iDistance =
14650 20 69 44 69 73 74 3b 0a 20 20 20 20 70 43 75 72   iDist;.    pCur
14660 2d 3e 61 5b 69 64 78 5d 2e 69 53 63 6f 72 65 20  ->a[idx].iScore 
14670 3d 20 69 53 63 6f 72 65 3b 0a 20 20 20 20 70 43  = iScore;.    pC
14680 75 72 2d 3e 61 5b 69 64 78 5d 2e 69 4d 61 74 63  ur->a[idx].iMatc
14690 68 6c 65 6e 20 3d 20 69 4d 61 74 63 68 6c 65 6e  hlen = iMatchlen
146a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 75  ;.    memcpy(pCu
146b0 72 2d 3e 61 5b 69 64 78 5d 2e 7a 48 61 73 68 2c  r->a[idx].zHash,
146c0 20 7a 48 61 73 68 31 2c 20 69 53 63 6f 70 65 2b   zHash1, iScope+
146d0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  1);.    if( pCur
146e0 2d 3e 6e 52 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c  ->nRow<pCur->nAl
146f0 6c 6f 63 20 29 20 70 43 75 72 2d 3e 6e 52 6f 77  loc ) pCur->nRow
14700 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  ++;.    if( pCur
14710 2d 3e 6e 52 6f 77 3d 3d 70 43 75 72 2d 3e 6e 41  ->nRow==pCur->nA
14720 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 57  lloc ){.      iW
14730 6f 72 73 74 20 3d 20 70 43 75 72 2d 3e 61 5b 30  orst = pCur->a[0
14740 5d 2e 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20  ].iScore;.      
14750 69 64 78 57 6f 72 73 74 20 3d 20 30 3b 0a 20 20  idxWorst = 0;.  
14760 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70      for(i=1; i<p
14770 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b  Cur->nRow; i++){
14780 0a 20 20 20 20 20 20 20 20 69 53 63 6f 72 65 20  .        iScore 
14790 3d 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69 53 63  = pCur->a[i].iSc
147a0 6f 72 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ore;.        if(
147b0 20 69 57 6f 72 73 74 3c 69 53 63 6f 72 65 20 29   iWorst<iScore )
147c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 57 6f 72  {.          iWor
147d0 73 74 20 3d 20 69 53 63 6f 72 65 3b 0a 20 20 20  st = iScore;.   
147e0 20 20 20 20 20 20 20 69 64 78 57 6f 72 73 74 20         idxWorst 
147f0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = i;.        }. 
14800 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14810 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
14820 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
14830 69 66 28 20 72 63 20 29 20 70 2d 3e 72 63 20 3d  if( rc ) p->rc =
14840 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
14850 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  is version of th
14860 65 20 78 46 69 6c 74 65 72 20 6d 65 74 68 6f 64  e xFilter method
14870 20 77 6f 72 6b 20 69 66 20 74 68 65 20 4d 41 54   work if the MAT
14880 43 48 20 74 65 72 6d 20 69 73 20 70 72 65 73 65  CH term is prese
14890 6e 74 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  nt.** and we are
148a0 20 64 6f 69 6e 67 20 61 20 73 63 61 6e 2e 0a 2a   doing a scan..*
148b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
148c0 6c 6c 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d  llfix1FilterForM
148d0 61 74 63 68 28 0a 20 20 73 70 65 6c 6c 66 69 78  atch(.  spellfix
148e0 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a  1_cursor *pCur,.
148f0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
14900 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
14910 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 4e  gv.){.  int idxN
14920 75 6d 20 3d 20 70 43 75 72 2d 3e 69 64 78 4e 75  um = pCur->idxNu
14930 6d 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  m;.  const unsig
14940 6e 65 64 20 63 68 61 72 20 2a 7a 4d 61 74 63 68  ned char *zMatch
14950 54 68 69 73 3b 20 20 20 2f 2a 20 52 48 53 20 6f  This;   /* RHS o
14960 66 20 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72  f the MATCH oper
14970 61 74 6f 72 20 2a 2f 0a 20 20 45 64 69 74 44 69  ator */.  EditDi
14980 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70  st3FromString *p
14990 4d 61 74 63 68 53 74 72 33 20 3d 20 30 3b 20 2f  MatchStr3 = 0; /
149a0 2a 20 7a 4d 61 74 63 68 54 68 69 73 20 61 73 20  * zMatchThis as 
149b0 61 6e 20 65 64 69 74 64 69 73 74 20 73 74 72 69  an editdist stri
149c0 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ng */.  char *zP
149d0 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20  attern;         
149e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
149f0 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20 6f 66  ansliteration of
14a00 20 7a 4d 61 74 63 68 54 68 69 73 20 2a 2f 0a 20   zMatchThis */. 
14a10 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20 20   int nPattern;  
14a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a30 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
14a40 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69   zPattern */.  i
14a50 6e 74 20 69 4c 69 6d 69 74 20 3d 20 32 30 3b 20  nt iLimit = 20; 
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 20 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20    /* Max number 
14a80 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70 75  of rows of outpu
14a90 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63 6f 70  t */.  int iScop
14aa0 65 20 3d 20 33 3b 20 20 20 20 20 20 20 20 20 20  e = 3;          
14ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
14ac0 20 74 68 69 73 20 6d 61 6e 79 20 63 68 61 72 61   this many chara
14ad0 63 74 65 72 73 20 6f 66 20 7a 43 6c 61 73 73 20  cters of zClass 
14ae0 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d  */.  int iLang =
14af0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14b00 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75          /* Langu
14b10 61 67 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  age code */.  ch
14b20 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
14b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b40 20 2f 2a 20 53 51 4c 20 6f 66 20 73 68 61 64 6f   /* SQL of shado
14b50 77 20 74 61 62 6c 65 20 71 75 65 72 79 20 2a 2f  w table query */
14b60 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14b70 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20  *pStmt = 0;     
14b80 20 20 20 20 20 20 2f 2a 20 53 68 61 64 6f 77 20        /* Shadow 
14b90 74 61 62 6c 65 20 71 75 65 72 79 20 2a 2f 0a 20  table query */. 
14ba0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
14bd0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 20  de */.  int idx 
14be0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
14bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
14c00 78 74 20 61 76 61 69 6c 61 62 6c 65 20 66 69 6c  xt available fil
14c10 74 65 72 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  ter parameter */
14c20 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  .  spellfix1_vta
14c30 62 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 56 54  b *p = pCur->pVT
14c40 61 62 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  ab;   /* The vir
14c50 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20  tual table that 
14c60 6f 77 6e 73 20 70 43 75 72 20 2a 2f 0a 20 20 4d  owns pCur */.  M
14c70 61 74 63 68 51 75 65 72 79 20 78 3b 20 20 20 20  atchQuery x;    
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 2f 2a 20 46 6f 72 20 70 61 73 73 69 6e 67    /* For passing
14ca0 20 69 6e 66 6f 20 74 6f 20 52 75 6e 51 75 65 72   info to RunQuer
14cb0 79 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 61  y() */..  /* Loa
14cc0 64 20 74 68 65 20 63 6f 73 74 20 74 61 62 6c 65  d the cost table
14cd0 20 69 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   if we have not 
14ce0 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 73 6f 20  already done so 
14cf0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 73  */.  if( p->zCos
14d00 74 54 61 62 6c 65 21 3d 30 20 26 26 20 70 2d 3e  tTable!=0 && p->
14d10 70 43 6f 6e 66 69 67 33 3d 3d 30 20 29 7b 0a 20  pConfig3==0 ){. 
14d20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d     p->pConfig3 =
14d30 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
14d40 34 28 20 73 69 7a 65 6f 66 28 70 2d 3e 70 43 6f  4( sizeof(p->pCo
14d50 6e 66 69 67 33 5b 30 5d 29 20 29 3b 0a 20 20 20  nfig3[0]) );.   
14d60 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 33   if( p->pConfig3
14d70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
14d80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d  ITE_NOMEM;.    m
14d90 65 6d 73 65 74 28 70 2d 3e 70 43 6f 6e 66 69 67  emset(p->pConfig
14da0 33 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  3, 0, sizeof(p->
14db0 70 43 6f 6e 66 69 67 33 5b 30 5d 29 29 3b 0a 20  pConfig3[0]));. 
14dc0 20 20 20 72 63 20 3d 20 65 64 69 74 44 69 73 74     rc = editDist
14dd0 33 43 6f 6e 66 69 67 4c 6f 61 64 28 70 2d 3e 70  3ConfigLoad(p->p
14de0 43 6f 6e 66 69 67 33 2c 20 70 2d 3e 64 62 2c 20  Config3, p->db, 
14df0 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b 0a  p->zCostTable);.
14e00 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
14e10 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6d 65  urn rc;.  }.  me
14e20 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a 65  mset(&x, 0, size
14e30 6f 66 28 78 29 29 3b 0a 20 20 78 2e 69 53 63 6f  of(x));.  x.iSco
14e40 70 65 20 3d 20 33 3b 20 20 2f 2a 20 44 65 66 61  pe = 3;  /* Defa
14e50 75 6c 74 20 73 63 6f 70 65 20 69 66 20 6e 6f 6e  ult scope if non
14e60 65 20 73 70 65 63 69 66 69 65 64 20 62 79 20 22  e specified by "
14e70 57 48 45 52 45 20 73 63 6f 70 65 3d 4e 22 20 2a  WHERE scope=N" *
14e80 2f 0a 20 20 78 2e 69 4d 61 78 44 69 73 74 20 3d  /.  x.iMaxDist =
14e90 20 2d 31 3b 20 20 20 2f 2a 20 4d 61 78 69 6d 75   -1;   /* Maximu
14ea0 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69 74 20 64  m allowed edit d
14eb0 69 73 74 61 6e 63 65 20 2a 2f 0a 0a 20 20 69 66  istance */..  if
14ec0 28 20 69 64 78 4e 75 6d 26 32 20 29 7b 0a 20 20  ( idxNum&2 ){.  
14ed0 20 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74 65    iLang = sqlite
14ee0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
14ef0 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 7d 0a 20 20  [idx++]);.  }.  
14f00 69 66 28 20 69 64 78 4e 75 6d 26 34 20 29 7b 0a  if( idxNum&4 ){.
14f10 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 73 71 6c      iLimit = sql
14f20 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
14f30 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 20  rgv[idx++]);.   
14f40 20 69 66 28 20 69 4c 69 6d 69 74 3c 31 20 29 20   if( iLimit<1 ) 
14f50 69 4c 69 6d 69 74 20 3d 20 31 3b 0a 20 20 7d 0a  iLimit = 1;.  }.
14f60 20 20 69 66 28 20 69 64 78 4e 75 6d 26 38 20 29    if( idxNum&8 )
14f70 7b 0a 20 20 20 20 78 2e 69 53 63 6f 70 65 20 3d  {.    x.iScope =
14f80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
14f90 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29 3b  nt(argv[idx++]);
14fa0 0a 20 20 20 20 69 66 28 20 78 2e 69 53 63 6f 70  .    if( x.iScop
14fb0 65 3c 31 20 29 20 78 2e 69 53 63 6f 70 65 20 3d  e<1 ) x.iScope =
14fc0 20 31 3b 0a 20 20 20 20 69 66 28 20 78 2e 69 53   1;.    if( x.iS
14fd0 63 6f 70 65 3e 53 50 45 4c 4c 46 49 58 5f 4d 58  cope>SPELLFIX_MX
14fe0 5f 48 41 53 48 2d 32 20 29 20 78 2e 69 53 63 6f  _HASH-2 ) x.iSco
14ff0 70 65 20 3d 20 53 50 45 4c 4c 46 49 58 5f 4d 58  pe = SPELLFIX_MX
15000 5f 48 41 53 48 2d 32 3b 0a 20 20 7d 0a 20 20 69  _HASH-2;.  }.  i
15010 66 28 20 69 64 78 4e 75 6d 26 28 31 36 7c 33 32  f( idxNum&(16|32
15020 29 20 29 7b 0a 20 20 20 20 78 2e 69 4d 61 78 44  ) ){.    x.iMaxD
15030 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ist = sqlite3_va
15040 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78  lue_int(argv[idx
15050 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 64  ++]);.    if( id
15060 78 4e 75 6d 26 31 36 20 29 20 78 2e 69 4d 61 78  xNum&16 ) x.iMax
15070 44 69 73 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20  Dist--;.    if( 
15080 78 2e 69 4d 61 78 44 69 73 74 3c 30 20 29 20 78  x.iMaxDist<0 ) x
15090 2e 69 4d 61 78 44 69 73 74 20 3d 20 30 3b 0a 20  .iMaxDist = 0;. 
150a0 20 7d 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65   }.  spellfix1Re
150b0 73 65 74 43 75 72 73 6f 72 28 70 43 75 72 29 3b  setCursor(pCur);
150c0 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 69  .  spellfix1Resi
150d0 7a 65 43 75 72 73 6f 72 28 70 43 75 72 2c 20 69  zeCursor(pCur, i
150e0 4c 69 6d 69 74 29 3b 0a 20 20 7a 4d 61 74 63 68  Limit);.  zMatch
150f0 54 68 69 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  This = sqlite3_v
15100 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
15110 5d 29 3b 0a 20 20 69 66 28 20 7a 4d 61 74 63 68  ]);.  if( zMatch
15120 54 68 69 73 3d 3d 30 20 29 20 72 65 74 75 72 6e  This==0 ) return
15130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
15140 28 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 29 7b  ( p->pConfig3 ){
15150 0a 20 20 20 20 78 2e 70 4c 61 6e 67 20 3d 20 65  .    x.pLang = e
15160 64 69 74 44 69 73 74 33 46 69 6e 64 4c 61 6e 67  ditDist3FindLang
15170 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 69 4c  (p->pConfig3, iL
15180 61 6e 67 29 3b 0a 20 20 20 20 70 4d 61 74 63 68  ang);.    pMatch
15190 53 74 72 33 20 3d 20 65 64 69 74 44 69 73 74 33  Str3 = editDist3
151a0 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 78 2e  FromStringNew(x.
151b0 70 4c 61 6e 67 2c 20 28 63 6f 6e 73 74 20 63 68  pLang, (const ch
151c0 61 72 2a 29 7a 4d 61 74 63 68 54 68 69 73 2c 20  ar*)zMatchThis, 
151d0 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  -1);.    if( pMa
151e0 74 63 68 53 74 72 33 3d 3d 30 20 29 7b 0a 20 20  tchStr3==0 ){.  
151f0 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49 54      x.rc = SQLIT
15200 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
15210 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78 69 74 3b  oto filter_exit;
15220 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15230 20 20 20 20 78 2e 70 4c 61 6e 67 20 3d 20 30 3b      x.pLang = 0;
15240 0a 20 20 7d 0a 20 20 7a 50 61 74 74 65 72 6e 20  .  }.  zPattern 
15250 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c 69  = (char*)transli
15260 74 65 72 61 74 65 28 7a 4d 61 74 63 68 54 68 69  terate(zMatchThi
15270 73 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  s, sqlite3_value
15280 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 29  _bytes(argv[0]))
15290 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
152a0 28 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 29  (pCur->zPattern)
152b0 3b 0a 20 20 70 43 75 72 2d 3e 7a 50 61 74 74 65  ;.  pCur->zPatte
152c0 72 6e 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a 20  rn = zPattern;. 
152d0 20 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30   if( zPattern==0
152e0 20 29 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20 53   ){.    x.rc = S
152f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15300 20 67 6f 74 6f 20 66 69 6c 74 65 72 5f 65 78 69   goto filter_exi
15310 74 3b 0a 20 20 7d 0a 20 20 6e 50 61 74 74 65 72  t;.  }.  nPatter
15320 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
15330 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 69 66 28  zPattern);.  if(
15340 20 7a 50 61 74 74 65 72 6e 5b 6e 50 61 74 74 65   zPattern[nPatte
15350 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 20 6e 50 61  rn-1]=='*' ) nPa
15360 74 74 65 72 6e 2d 2d 3b 0a 20 20 7a 53 71 6c 20  ttern--;.  zSql 
15370 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15380 66 28 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20  f(.     "SELECT 
15390 69 64 2c 20 77 6f 72 64 2c 20 72 61 6e 6b 2c 20  id, word, rank, 
153a0 63 6f 61 6c 65 73 63 65 28 6b 31 2c 77 6f 72 64  coalesce(k1,word
153b0 29 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20  )".     "  FROM 
153c0 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61  \"%w\".\"%w_voca
153d0 62 5c 22 22 0a 20 20 20 20 20 22 20 57 48 45 52  b\"".     " WHER
153e0 45 20 6c 61 6e 67 69 64 3d 25 64 20 41 4e 44 20  E langid=%d AND 
153f0 6b 32 3e 3d 3f 31 20 41 4e 44 20 6b 32 3c 3f 32  k2>=?1 AND k2<?2
15400 22 2c 0a 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61  ",.     p->zDbNa
15410 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
15420 65 2c 20 69 4c 61 6e 67 0a 20 20 29 3b 0a 20 20  e, iLang.  );.  
15430 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
15440 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49 54 45     x.rc = SQLITE
15450 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 53 74 6d  _NOMEM;.    pStm
15460 74 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  t = 0;.    goto 
15470 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20 20 7d  filter_exit;.  }
15480 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15490 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
154a0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
154b0 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
154c0 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
154d0 70 43 75 72 2d 3e 69 4c 61 6e 67 20 3d 20 69 4c  pCur->iLang = iL
154e0 61 6e 67 3b 0a 20 20 78 2e 70 43 75 72 20 3d 20  ang;.  x.pCur = 
154f0 70 43 75 72 3b 0a 20 20 78 2e 70 53 74 6d 74 20  pCur;.  x.pStmt 
15500 3d 20 70 53 74 6d 74 3b 0a 20 20 78 2e 7a 50 61  = pStmt;.  x.zPa
15510 74 74 65 72 6e 20 3d 20 7a 50 61 74 74 65 72 6e  ttern = zPattern
15520 3b 0a 20 20 78 2e 6e 50 61 74 74 65 72 6e 20 3d  ;.  x.nPattern =
15530 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20 78 2e 70   nPattern;.  x.p
15540 4d 61 74 63 68 53 74 72 33 20 3d 20 70 4d 61 74  MatchStr3 = pMat
15550 63 68 53 74 72 33 3b 0a 20 20 78 2e 69 4c 61 6e  chStr3;.  x.iLan
15560 67 20 3d 20 69 4c 61 6e 67 3b 0a 20 20 78 2e 72  g = iLang;.  x.r
15570 63 20 3d 20 72 63 3b 0a 20 20 78 2e 70 43 6f 6e  c = rc;.  x.pCon
15580 66 69 67 33 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  fig3 = p->pConfi
15590 67 33 3b 0a 20 20 69 66 28 20 78 2e 72 63 3d 3d  g3;.  if( x.rc==
155a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
155b0 20 73 70 65 6c 6c 66 69 78 31 52 75 6e 51 75 65   spellfix1RunQue
155c0 72 79 28 26 78 2c 20 7a 50 61 74 74 65 72 6e 2c  ry(&x, zPattern,
155d0 20 6e 50 61 74 74 65 72 6e 29 3b 0a 20 20 7d 0a   nPattern);.  }.
155e0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 61 20 29  .  if( pCur->a )
155f0 7b 0a 20 20 20 20 71 73 6f 72 74 28 70 43 75 72  {.    qsort(pCur
15600 2d 3e 61 2c 20 70 43 75 72 2d 3e 6e 52 6f 77 2c  ->a, pCur->nRow,
15610 20 73 69 7a 65 6f 66 28 70 43 75 72 2d 3e 61 5b   sizeof(pCur->a[
15620 30 5d 29 2c 20 73 70 65 6c 6c 66 69 78 31 52 6f  0]), spellfix1Ro
15630 77 43 6f 6d 70 61 72 65 29 3b 0a 20 20 20 20 70  wCompare);.    p
15640 43 75 72 2d 3e 69 54 6f 70 20 3d 20 69 4c 69 6d  Cur->iTop = iLim
15650 69 74 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 53  it;.    pCur->iS
15660 63 6f 70 65 20 3d 20 69 53 63 6f 70 65 3b 0a 20  cope = iScope;. 
15670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 2e 72 63   }else{.    x.rc
15680 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
15690 0a 20 20 7d 0a 0a 66 69 6c 74 65 72 5f 65 78 69  .  }..filter_exi
156a0 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  t:.  sqlite3_fin
156b0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
156c0 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  editDist3FromStr
156d0 69 6e 67 44 65 6c 65 74 65 28 70 4d 61 74 63 68  ingDelete(pMatch
156e0 53 74 72 33 29 3b 0a 20 20 72 65 74 75 72 6e 20  Str3);.  return 
156f0 78 2e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  x.rc;.}../*.** T
15700 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 78  his version of x
15710 46 69 6c 74 65 72 20 68 61 6e 64 6c 65 73 20 61  Filter handles a
15720 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e   full-table scan
15730 20 63 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20   case.*/.static 
15740 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 46 69 6c  int spellfix1Fil
15750 74 65 72 46 6f 72 46 75 6c 6c 53 63 61 6e 28 0a  terForFullScan(.
15760 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73    spellfix1_curs
15770 6f 72 20 2a 70 43 75 72 2c 0a 20 20 69 6e 74 20  or *pCur,.  int 
15780 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
15790 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
157a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
157b0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 64 78 4e  E_OK;.  int idxN
157c0 75 6d 20 3d 20 70 43 75 72 2d 3e 69 64 78 4e 75  um = pCur->idxNu
157d0 6d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  m;.  char *zSql;
157e0 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  .  spellfix1_vta
157f0 62 20 2a 70 56 54 61 62 20 3d 20 70 43 75 72 2d  b *pVTab = pCur-
15800 3e 70 56 54 61 62 3b 0a 20 20 73 70 65 6c 6c 66  >pVTab;.  spellf
15810 69 78 31 52 65 73 65 74 43 75 72 73 6f 72 28 70  ix1ResetCursor(p
15820 43 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Cur);.  assert( 
15830 69 64 78 4e 75 6d 3d 3d 30 20 7c 7c 20 69 64 78  idxNum==0 || idx
15840 4e 75 6d 3d 3d 36 34 20 29 3b 0a 20 20 7a 53 71  Num==64 );.  zSq
15850 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
15860 6e 74 66 28 0a 20 20 20 20 20 22 53 45 4c 45 43  ntf(.     "SELEC
15870 54 20 77 6f 72 64 2c 20 72 61 6e 6b 2c 20 4e 55  T word, rank, NU
15880 4c 4c 2c 20 6c 61 6e 67 69 64 2c 20 69 64 20 46  LL, langid, id F
15890 52 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f  ROM \"%w\".\"%w_
158a0 76 6f 63 61 62 5c 22 25 73 22 2c 0a 20 20 20 20  vocab\"%s",.    
158b0 20 70 56 54 61 62 2d 3e 7a 44 62 4e 61 6d 65 2c   pVTab->zDbName,
158c0 20 70 56 54 61 62 2d 3e 7a 54 61 62 6c 65 4e 61   pVTab->zTableNa
158d0 6d 65 2c 0a 20 20 20 20 20 28 28 69 64 78 4e 75  me,.     ((idxNu
158e0 6d 20 26 20 36 34 29 20 3f 20 22 20 57 48 45 52  m & 64) ? " WHER
158f0 45 20 72 6f 77 69 64 3d 3f 22 20 3a 20 22 22 29  E rowid=?" : "")
15900 0a 20 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  .  );.  if( zSql
15910 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
15920 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
15930 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
15940 65 5f 76 32 28 70 56 54 61 62 2d 3e 64 62 2c 20  e_v2(pVTab->db, 
15950 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72 2d  zSql, -1, &pCur-
15960 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 30 29 3b 0a  >pFullScan, 0);.
15970 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
15980 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Sql);.  if( rc==
15990 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 64  SQLITE_OK && (id
159a0 78 4e 75 6d 20 26 20 36 34 29 20 29 7b 0a 20 20  xNum & 64) ){.  
159b0 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d    assert( argc==
159c0 31 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  1 );.    rc = sq
159d0 6c 69 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65  lite3_bind_value
159e0 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e  (pCur->pFullScan
159f0 2c 20 31 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20  , 1, argv[0]);. 
15a00 20 7d 0a 20 20 70 43 75 72 2d 3e 6e 52 6f 77 20   }.  pCur->nRow 
15a10 3d 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30  = pCur->iRow = 0
15a20 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15a30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
15a40 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
15a50 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 29 3b  Cur->pFullScan);
15a60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15a70 49 54 45 5f 52 4f 57 20 29 7b 20 70 43 75 72 2d  ITE_ROW ){ pCur-
15a80 3e 69 52 6f 77 20 3d 20 2d 31 3b 20 72 63 20 3d  >iRow = -1; rc =
15a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20   SQLITE_OK; }.  
15aa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15ab0 5f 44 4f 4e 45 20 29 7b 20 72 63 20 3d 20 53 51  _DONE ){ rc = SQ
15ac0 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 7d 65 6c  LITE_OK; }.  }el
15ad0 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 52  se{.    pCur->iR
15ae0 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ow = 0;.  }.  re
15af0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
15b00 2a 2a 20 43 61 6c 6c 65 64 20 74 6f 20 22 72 65  ** Called to "re
15b10 77 69 6e 64 22 20 61 20 63 75 72 73 6f 72 20 62  wind" a cursor b
15b20 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
15b30 6e 69 6e 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20  ning so that.** 
15b40 69 74 20 73 74 61 72 74 73 20 69 74 73 20 6f 75  it starts its ou
15b50 74 70 75 74 20 6f 76 65 72 20 61 67 61 69 6e 2e  tput over again.
15b60 20 20 41 6c 77 61 79 73 20 63 61 6c 6c 65 64 20    Always called 
15b70 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 0a 2a 2a  at least once.**
15b80 20 70 72 69 6f 72 20 74 6f 20 61 6e 79 20 73 70   prior to any sp
15b90 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c 20 73  ellfix1Column, s
15ba0 70 65 6c 6c 66 69 78 31 52 6f 77 69 64 2c 20 6f  pellfix1Rowid, o
15bb0 72 20 73 70 65 6c 6c 66 69 78 31 45 6f 66 20 63  r spellfix1Eof c
15bc0 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  all..*/.static i
15bd0 6e 74 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74  nt spellfix1Filt
15be0 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  er(.  sqlite3_vt
15bf0 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20  ab_cursor *cur, 
15c00 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63  .  int idxNum, c
15c10 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74  onst char *idxSt
15c20 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73  r,.  int argc, s
15c30 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
15c40 72 67 76 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69  rgv.){.  spellfi
15c50 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20  x1_cursor *pCur 
15c60 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  = (spellfix1_cur
15c70 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 69 6e 74  sor *)cur;.  int
15c80 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78   rc;.  pCur->idx
15c90 4e 75 6d 20 3d 20 69 64 78 4e 75 6d 3b 0a 20 20  Num = idxNum;.  
15ca0 69 66 28 20 69 64 78 4e 75 6d 20 26 20 31 20 29  if( idxNum & 1 )
15cb0 7b 0a 20 20 20 20 72 63 20 3d 20 73 70 65 6c 6c  {.    rc = spell
15cc0 66 69 78 31 46 69 6c 74 65 72 46 6f 72 4d 61 74  fix1FilterForMat
15cd0 63 68 28 70 43 75 72 2c 20 61 72 67 63 2c 20 61  ch(pCur, argc, a
15ce0 72 67 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rgv);.  }else{. 
15cf0 20 20 20 72 63 20 3d 20 73 70 65 6c 6c 66 69 78     rc = spellfix
15d00 31 46 69 6c 74 65 72 46 6f 72 46 75 6c 6c 53 63  1FilterForFullSc
15d10 61 6e 28 70 43 75 72 2c 20 61 72 67 63 2c 20 61  an(pCur, argc, a
15d20 72 67 76 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rgv);.  }.  retu
15d30 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
15d40 20 41 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   Advance a curso
15d50 72 20 74 6f 20 69 74 73 20 6e 65 78 74 20 72 6f  r to its next ro
15d60 77 20 6f 66 20 6f 75 74 70 75 74 0a 2a 2f 0a 73  w of output.*/.s
15d70 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
15d80 69 78 31 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  ix1Next(sqlite3_
15d90 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
15da0 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63  ){.  spellfix1_c
15db0 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73  ursor *pCur = (s
15dc0 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
15dd0 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20 72 63 20  *)cur;.  int rc 
15de0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15df0 66 28 20 70 43 75 72 2d 3e 69 52 6f 77 20 3c 20  f( pCur->iRow < 
15e00 70 43 75 72 2d 3e 6e 52 6f 77 20 29 7b 0a 20 20  pCur->nRow ){.  
15e10 20 20 69 66 28 20 70 43 75 72 2d 3e 70 46 75 6c    if( pCur->pFul
15e20 6c 53 63 61 6e 20 29 7b 0a 20 20 20 20 20 20 72  lScan ){.      r
15e30 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
15e40 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e  (pCur->pFullScan
15e50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15e60 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 70 43  =SQLITE_ROW ) pC
15e70 75 72 2d 3e 69 52 6f 77 20 3d 20 70 43 75 72 2d  ur->iRow = pCur-
15e80 3e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  >nRow;.      if(
15e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc==SQLITE_ROW 
15ea0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
15eb0 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
15ec0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
15ed0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 52 6f 77        pCur->iRow
15ee0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
15ef0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15f00 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
15f10 69 66 20 77 65 20 61 72 65 20 61 74 20 74 68 65  if we are at the
15f20 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 0a 2a 2f 0a   end-of-file.*/.
15f30 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
15f40 66 69 78 31 45 6f 66 28 73 71 6c 69 74 65 33 5f  fix1Eof(sqlite3_
15f50 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
15f60 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63  ){.  spellfix1_c
15f70 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73  ursor *pCur = (s
15f80 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
15f90 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20  *)cur;.  return 
15fa0 70 43 75 72 2d 3e 69 52 6f 77 3e 3d 70 43 75 72  pCur->iRow>=pCur
15fb0 2d 3e 6e 52 6f 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->nRow;.}../*.**
15fc0 20 52 65 74 75 72 6e 20 63 6f 6c 75 6d 6e 73 20   Return columns 
15fd0 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
15fe0 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
15ff0 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 6f 6c  int spellfix1Col
16000 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  umn(.  sqlite3_v
16010 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
16020 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
16030 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 69  xt *ctx,.  int i
16040 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  .){.  spellfix1_
16050 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
16060 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
16070 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70 43 75  *)cur;.  if( pCu
16080 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b 0a  r->pFullScan ){.
16090 20 20 20 20 69 66 28 20 69 3c 3d 53 50 45 4c 4c      if( i<=SPELL
160a0 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20 29  FIX_COL_LANGID )
160b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
160c0 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
160d0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
160e0 5f 76 61 6c 75 65 28 70 43 75 72 2d 3e 70 46 75  _value(pCur->pFu
160f0 6c 6c 53 63 61 6e 2c 20 69 29 29 3b 0a 20 20 20  llScan, i));.   
16100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
16110 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
16120 6c 28 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20  l(ctx);.    }.  
16130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16140 4f 4b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  OK;.  }.  switch
16150 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ( i ){.    case 
16160 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52  SPELLFIX_COL_WOR
16170 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
16180 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
16190 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72  tx, pCur->a[pCur
161a0 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64 2c 20 2d  ->iRow].zWord, -
161b0 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
161c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
161d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
161e0 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b  PELLFIX_COL_RANK
161f0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
16200 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
16210 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e  , pCur->a[pCur->
16220 69 52 6f 77 5d 2e 69 52 61 6e 6b 29 3b 0a 20 20  iRow].iRank);.  
16230 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16240 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
16250 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e 43 45 3a  IX_COL_DISTANCE:
16260 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16270 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c  _result_int(ctx,
16280 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69   pCur->a[pCur->i
16290 52 6f 77 5d 2e 69 44 69 73 74 61 6e 63 65 29 3b  Row].iDistance);
162a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
162b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45    }.    case SPE
162c0 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44  LLFIX_COL_LANGID
162d0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
162e0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
162f0 2c 20 70 43 75 72 2d 3e 69 4c 61 6e 67 29 3b 0a  , pCur->iLang);.
16300 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16310 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c   }.    case SPEL
16320 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 3a 20  LFIX_COL_SCORE: 
16330 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
16340 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20  result_int(ctx, 
16350 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52  pCur->a[pCur->iR
16360 6f 77 5d 2e 69 53 63 6f 72 65 29 3b 0a 20 20 20  ow].iScore);.   
16370 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16380 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49      case SPELLFI
16390 58 5f 43 4f 4c 5f 4d 41 54 43 48 4c 45 4e 3a 20  X_COL_MATCHLEN: 
163a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61 74  {.      int iMat
163b0 63 68 6c 65 6e 20 3d 20 70 43 75 72 2d 3e 61 5b  chlen = pCur->a[
163c0 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 4d 61 74  pCur->iRow].iMat
163d0 63 68 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  chlen;.      if(
163e0 20 69 4d 61 74 63 68 6c 65 6e 3c 30 20 29 7b 0a   iMatchlen<0 ){.
163f0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61 74          int nPat
16400 74 65 72 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  tern = (int)strl
16410 65 6e 28 70 43 75 72 2d 3e 7a 50 61 74 74 65 72  en(pCur->zPatter
16420 6e 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  n);.        char
16430 20 2a 7a 57 6f 72 64 20 3d 20 70 43 75 72 2d 3e   *zWord = pCur->
16440 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a 57  a[pCur->iRow].zW
16450 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
16460 20 6e 57 6f 72 64 20 3d 20 28 69 6e 74 29 73 74   nWord = (int)st
16470 72 6c 65 6e 28 7a 57 6f 72 64 29 3b 0a 0a 20 20  rlen(zWord);..  
16480 20 20 20 20 20 20 69 66 28 20 6e 50 61 74 74 65        if( nPatte
16490 72 6e 3e 30 20 26 26 20 70 43 75 72 2d 3e 7a 50  rn>0 && pCur->zP
164a0 61 74 74 65 72 6e 5b 6e 50 61 74 74 65 72 6e 2d  attern[nPattern-
164b0 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20  1]=='*' ){.     
164c0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 72 61 6e       char *zTran
164d0 73 6c 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  slit;.          
164e0 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
164f0 20 20 20 7a 54 72 61 6e 73 6c 69 74 20 3d 20 28     zTranslit = (
16500 63 68 61 72 20 2a 29 74 72 61 6e 73 6c 69 74 65  char *)translite
16510 72 61 74 65 28 28 75 6e 73 69 67 6e 65 64 20 63  rate((unsigned c
16520 68 61 72 20 2a 29 7a 57 6f 72 64 2c 20 6e 57 6f  har *)zWord, nWo
16530 72 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rd);.          i
16540 66 28 20 21 7a 54 72 61 6e 73 6c 69 74 20 29 20  f( !zTranslit ) 
16550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
16560 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  MEM;.          r
16570 65 73 20 3d 20 65 64 69 74 64 69 73 74 31 28 70  es = editdist1(p
16580 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 2c 20 7a  Cur->zPattern, z
16590 54 72 61 6e 73 6c 69 74 2c 20 26 69 4d 61 74 63  Translit, &iMatc
165a0 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  hlen);.         
165b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
165c0 72 61 6e 73 6c 69 74 29 3b 0a 20 20 20 20 20 20  ranslit);.      
165d0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20      if( res<0 ) 
165e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
165f0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  MEM;.          i
16600 4d 61 74 63 68 6c 65 6e 20 3d 20 74 72 61 6e 73  Matchlen = trans
16610 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65 6e 28 7a  len_to_charlen(z
16620 57 6f 72 64 2c 20 6e 57 6f 72 64 2c 20 69 4d 61  Word, nWord, iMa
16630 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  tchlen);.       
16640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16650 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 75 74    iMatchlen = ut
16660 66 38 43 68 61 72 6c 65 6e 28 7a 57 6f 72 64 2c  f8Charlen(zWord,
16670 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 20   nWord);.       
16680 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
16690 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
166a0 5f 69 6e 74 28 63 74 78 2c 20 69 4d 61 74 63 68  _int(ctx, iMatch
166b0 6c 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  len);.      brea
166c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
166d0 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50  e SPELLFIX_COL_P
166e0 48 4f 4e 45 48 41 53 48 3a 20 7b 0a 20 20 20 20  HONEHASH: {.    
166f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
16700 5f 74 65 78 74 28 63 74 78 2c 20 70 43 75 72 2d  _text(ctx, pCur-
16710 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a  >a[pCur->iRow].z
16720 48 61 73 68 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Hash, -1, SQLITE
16730 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
16740 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16750 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43   case SPELLFIX_C
16760 4f 4c 5f 54 4f 50 3a 20 7b 0a 20 20 20 20 20 20  OL_TOP: {.      
16770 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
16780 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 69 54  nt(ctx, pCur->iT
16790 6f 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  op);.      break
167a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
167b0 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43   SPELLFIX_COL_SC
167c0 4f 50 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  OPE: {.      sql
167d0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
167e0 63 74 78 2c 20 70 43 75 72 2d 3e 69 53 63 6f 70  ctx, pCur->iScop
167f0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
16800 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16810 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52 43  SPELLFIX_COL_SRC
16820 48 43 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  HCNT: {.      sq
16830 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
16840 28 63 74 78 2c 20 70 43 75 72 2d 3e 6e 53 65 61  (ctx, pCur->nSea
16850 72 63 68 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rch);.      brea
16860 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
16870 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
16880 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c  lite3_result_nul
16890 6c 28 63 74 78 29 3b 0a 20 20 20 20 20 20 62 72  l(ctx);.      br
168a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
168b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
168c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
168d0 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rowid..*/.static
168e0 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 6f   int spellfix1Ro
168f0 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  wid(sqlite3_vtab
16900 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71  _cursor *cur, sq
16910 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
16920 69 64 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  id){.  spellfix1
16930 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
16940 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
16950 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70 43  r*)cur;.  if( pC
16960 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b  ur->pFullScan ){
16970 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 73  .    *pRowid = s
16980 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
16990 74 36 34 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53  t64(pCur->pFullS
169a0 63 61 6e 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65  can, 4);.  }else
169b0 7b 0a 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20  {.    *pRowid = 
169c0 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52  pCur->a[pCur->iR
169d0 6f 77 5d 2e 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  ow].iRowid;.  }.
169e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
169f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
16a00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
16a10 6c 6c 65 64 20 62 79 20 74 68 65 20 78 55 70 64  lled by the xUpd
16a20 61 74 65 28 29 20 6d 65 74 68 6f 64 2e 20 49 74  ate() method. It
16a30 20 72 65 74 75 72 6e 73 20 61 20 73 74 72 69 6e   returns a strin
16a40 67 0a 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20  g.** containing 
16a50 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 6d 6f 64  the conflict mod
16a60 65 20 74 68 61 74 20 78 55 70 64 61 74 65 28 29  e that xUpdate()
16a70 20 73 68 6f 75 6c 64 20 75 73 65 20 66 6f 72 20   should use for 
16a80 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6f  the current.** o
16a90 70 65 72 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66  peration. One of
16aa0 3a 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 22 49  : "ROLLBACK", "I
16ab0 47 4e 4f 52 45 22 2c 20 22 41 42 4f 52 54 22 20  GNORE", "ABORT" 
16ac0 6f 72 20 22 52 45 50 4c 41 43 45 22 2e 0a 2a 2f  or "REPLACE"..*/
16ad0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
16ae0 61 72 20 2a 73 70 65 6c 6c 66 69 78 31 47 65 74  ar *spellfix1Get
16af0 43 6f 6e 66 6c 69 63 74 28 73 71 6c 69 74 65 33  Conflict(sqlite3
16b00 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
16b10 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f  const char *azCo
16b20 6e 66 6c 69 63 74 5b 5d 20 3d 20 7b 0a 20 20 20  nflict[] = {.   
16b30 20 2f 2a 20 4e 6f 74 65 3a 20 49 6e 73 74 65 61   /* Note: Instea
16b40 64 20 6f 66 20 22 46 41 49 4c 22 20 2d 20 22 41  d of "FAIL" - "A
16b50 42 4f 52 54 22 2e 20 2a 2f 0a 20 20 20 20 22 52  BORT". */.    "R
16b60 4f 4c 4c 42 41 43 4b 22 2c 20 22 49 47 4e 4f 52  OLLBACK", "IGNOR
16b70 45 22 2c 20 22 41 42 4f 52 54 22 2c 20 22 41 42  E", "ABORT", "AB
16b80 4f 52 54 22 2c 20 22 52 45 50 4c 41 43 45 22 0a  ORT", "REPLACE".
16b90 20 20 7d 3b 0a 20 20 69 6e 74 20 65 43 6f 6e 66    };.  int eConf
16ba0 6c 69 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  lict = sqlite3_v
16bb0 74 61 62 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28  tab_on_conflict(
16bc0 64 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  db);..  assert( 
16bd0 65 43 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54  eConflict==SQLIT
16be0 45 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 43  E_ROLLBACK || eC
16bf0 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f  onflict==SQLITE_
16c00 49 47 4e 4f 52 45 0a 20 20 20 20 20 20 20 7c 7c  IGNORE.       ||
16c10 20 65 43 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49   eConflict==SQLI
16c20 54 45 5f 46 41 49 4c 20 7c 7c 20 65 43 6f 6e 66  TE_FAIL || eConf
16c30 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  lict==SQLITE_ABO
16c40 52 54 0a 20 20 20 20 20 20 20 7c 7c 20 65 43 6f  RT.       || eCo
16c50 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f 52  nflict==SQLITE_R
16c60 45 50 4c 41 43 45 0a 20 20 29 3b 0a 20 20 61 73  EPLACE.  );.  as
16c70 73 65 72 74 28 20 53 51 4c 49 54 45 5f 52 4f 4c  sert( SQLITE_ROL
16c80 4c 42 41 43 4b 3d 3d 31 20 29 3b 0a 20 20 61 73  LBACK==1 );.  as
16c90 73 65 72 74 28 20 53 51 4c 49 54 45 5f 49 47 4e  sert( SQLITE_IGN
16ca0 4f 52 45 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65  ORE==2 );.  asse
16cb0 72 74 28 20 53 51 4c 49 54 45 5f 46 41 49 4c 3d  rt( SQLITE_FAIL=
16cc0 3d 33 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =3 );.  assert( 
16cd0 53 51 4c 49 54 45 5f 41 42 4f 52 54 3d 3d 34 20  SQLITE_ABORT==4 
16ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
16cf0 49 54 45 5f 52 45 50 4c 41 43 45 3d 3d 35 20 29  ITE_REPLACE==5 )
16d00 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f  ;..  return azCo
16d10 6e 66 6c 69 63 74 5b 65 43 6f 6e 66 6c 69 63 74  nflict[eConflict
16d20 2d 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  -1];.}../*.** Th
16d30 65 20 78 55 70 64 61 74 65 28 29 20 6d 65 74 68  e xUpdate() meth
16d40 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  od..*/.static in
16d50 74 20 73 70 65 6c 6c 66 69 78 31 55 70 64 61 74  t spellfix1Updat
16d60 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  e(.  sqlite3_vta
16d70 62 20 2a 70 56 54 61 62 2c 0a 20 20 69 6e 74 20  b *pVTab,.  int 
16d80 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
16d90 76 61 6c 75 65 20 2a 2a 61 72 67 76 2c 0a 20 20  value **argv,.  
16da0 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
16db0 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63  owid.){.  int rc
16dc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16dd0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72 6f  sqlite3_int64 ro
16de0 77 69 64 2c 20 6e 65 77 52 6f 77 69 64 3b 0a 20  wid, newRowid;. 
16df0 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20   spellfix1_vtab 
16e00 2a 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f  *p = (spellfix1_
16e10 76 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 73  vtab*)pVTab;.  s
16e20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
16e30 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d  db;..  if( argc=
16e40 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 64  =1 ){.    /* A d
16e50 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
16e60 6f 6e 20 74 68 65 20 72 6f 77 69 64 20 67 69 76  on the rowid giv
16e70 65 6e 20 62 79 20 61 72 67 76 5b 30 5d 20 2a 2f  en by argv[0] */
16e80 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 2a 70 52  .    rowid = *pR
16e90 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
16ea0 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
16eb0 30 5d 29 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69  0]);.    spellfi
16ec0 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  x1DbExec(&rc, db
16ed0 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c  , "DELETE FROM \
16ee0 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62  "%w\".\"%w_vocab
16ef0 5c 22 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  \" ".           
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f10 22 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22  " WHERE id=%lld"
16f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16f30 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20      p->zDbName, 
16f40 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 72  p->zTableName, r
16f50 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
16f60 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
16f70 65 64 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d  ed char *zWord =
16f80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
16f90 65 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49  ext(argv[SPELLFI
16fa0 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a  X_COL_WORD+2]);.
16fb0 20 20 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20      int nWord = 
16fc0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
16fd0 74 65 73 28 61 72 67 76 5b 53 50 45 4c 4c 46 49  tes(argv[SPELLFI
16fe0 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a  X_COL_WORD+2]);.
16ff0 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20      int iLang = 
17000 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
17010 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  t(argv[SPELLFIX_
17020 43 4f 4c 5f 4c 41 4e 47 49 44 2b 32 5d 29 3b 0a  COL_LANGID+2]);.
17030 20 20 20 20 69 6e 74 20 69 52 61 6e 6b 20 3d 20      int iRank = 
17040 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
17050 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f  t(argv[SPELLFIX_
17060 43 4f 4c 5f 52 41 4e 4b 2b 32 5d 29 3b 0a 20 20  COL_RANK+2]);.  
17070 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
17080 20 63 68 61 72 20 2a 7a 53 6f 75 6e 64 73 6c 69   char *zSoundsli
17090 6b 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  ke =.           
170a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
170b0 78 74 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  xt(argv[SPELLFIX
170c0 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b  _COL_SOUNDSLIKE+
170d0 32 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 53 6f  2]);.    int nSo
170e0 75 6e 64 73 6c 69 6b 65 20 3d 20 73 71 6c 69 74  undslike = sqlit
170f0 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
17100 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  rgv[SPELLFIX_COL
17110 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d 29 3b  _SOUNDSLIKE+2]);
17120 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b 31 2c 20  .    char *zK1, 
17130 2a 7a 4b 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b  *zK2;.    int i;
17140 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20  .    char c;.   
17150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
17160 6e 66 6c 69 63 74 20 3d 20 73 70 65 6c 6c 66 69  nflict = spellfi
17170 78 31 47 65 74 43 6f 6e 66 6c 69 63 74 28 64 62  x1GetConflict(db
17180 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 57 6f 72  );..    if( zWor
17190 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
171a0 20 49 6e 73 65 72 74 73 20 6f 66 20 74 68 65 20   Inserts of the 
171b0 66 6f 72 6d 3a 20 20 49 4e 53 45 52 54 20 49 4e  form:  INSERT IN
171c0 54 4f 20 74 61 62 6c 65 28 63 6f 6d 6d 61 6e 64  TO table(command
171d0 29 20 56 41 4c 55 45 53 28 27 78 79 7a 7a 79 27  ) VALUES('xyzzy'
171e0 29 3b 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73  );.      ** caus
171f0 65 20 7a 57 6f 72 64 20 74 6f 20 62 65 20 4e 55  e zWord to be NU
17200 4c 4c 2c 20 73 6f 20 77 65 20 6c 6f 6f 6b 20 61  LL, so we look a
17210 74 20 74 68 65 20 22 63 6f 6d 6d 61 6e 64 22 20  t the "command" 
17220 63 6f 6c 75 6d 6e 20 74 6f 20 73 65 65 0a 20 20  column to see.  
17230 20 20 20 20 2a 2a 20 77 68 61 74 20 73 70 65 63      ** what spec
17240 69 61 6c 20 61 63 74 69 6f 6e 73 20 74 6f 20 74  ial actions to t
17250 61 6b 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ake */.      con
17260 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20  st char *zCmd = 
17270 0a 20 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74  .         (const
17280 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
17290 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 53  alue_text(argv[S
172a0 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43 4f 4d 4d  PELLFIX_COL_COMM
172b0 41 4e 44 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  AND+2]);.      i
172c0 66 28 20 7a 43 6d 64 3d 3d 30 20 29 7b 0a 20 20  f( zCmd==0 ){.  
172d0 20 20 20 20 20 20 70 56 54 61 62 2d 3e 7a 45 72        pVTab->zEr
172e0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
172f0 70 72 69 6e 74 66 28 22 4e 4f 54 20 4e 55 4c 4c  printf("NOT NULL
17300 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
17310 65 64 3a 20 25 73 2e 77 6f 72 64 22 2c 0a 20 20  ed: %s.word",.  
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 20 20 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65         p->zTable
17350 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Name);.        r
17360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
17370 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3b  STRAINT_NOTNULL;
17380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17390 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22  f( strcmp(zCmd,"
173a0 72 65 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20  reset")==0 ){.  
173b0 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74        /* Reset t
173c0 68 65 20 20 65 64 69 74 20 63 6f 73 74 20 74 61  he  edit cost ta
173d0 62 6c 65 20 28 69 66 20 74 68 65 72 65 20 69 73  ble (if there is
173e0 20 6f 6e 65 29 2e 20 2a 2f 0a 20 20 20 20 20 20   one). */.      
173f0 20 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69    editDist3Confi
17400 67 44 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66  gDelete(p->pConf
17410 69 67 33 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  ig3);.        p-
17420 3e 70 43 6f 6e 66 69 67 33 20 3d 20 30 3b 0a 20  >pConfig3 = 0;. 
17430 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
17440 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
17450 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
17460 6d 70 28 7a 43 6d 64 2c 22 65 64 69 74 5f 63 6f  mp(zCmd,"edit_co
17470 73 74 5f 74 61 62 6c 65 3d 22 2c 31 36 29 3d 3d  st_table=",16)==
17480 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 64 69  0 ){.        edi
17490 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65  tDist3ConfigDele
174a0 74 65 28 70 2d 3e 70 43 6f 6e 66 69 67 33 29 3b  te(p->pConfig3);
174b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 43 6f 6e  .        p->pCon
174c0 66 69 67 33 20 3d 20 30 3b 0a 20 20 20 20 20 20  fig3 = 0;.      
174d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
174e0 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20  ->zCostTable);. 
174f0 20 20 20 20 20 20 20 70 2d 3e 7a 43 6f 73 74 54         p->zCostT
17500 61 62 6c 65 20 3d 20 73 70 65 6c 6c 66 69 78 31  able = spellfix1
17510 44 65 71 75 6f 74 65 28 7a 43 6d 64 2b 31 36 29  Dequote(zCmd+16)
17520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
17530 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d 30 20 29  >zCostTable==0 )
17540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
17550 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 69 66  OMEM;.        if
17560 28 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 5b  ( p->zCostTable[
17570 30 5d 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  0]==0 || sqlite3
17580 5f 73 74 72 69 63 6d 70 28 70 2d 3e 7a 43 6f 73  _stricmp(p->zCos
17590 74 54 61 62 6c 65 2c 22 6e 75 6c 6c 22 29 3d 3d  tTable,"null")==
175a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
175b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
175c0 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  CostTable);.    
175d0 20 20 20 20 20 20 70 2d 3e 7a 43 6f 73 74 54 61        p->zCostTa
175e0 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
175f0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
17600 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
17610 20 20 20 7d 0a 20 20 20 20 20 20 70 56 54 61 62     }.      pVTab
17620 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
17630 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 6b  te3_mprintf("unk
17640 6e 6f 77 6e 20 76 61 6c 75 65 20 66 6f 72 20 25  nown value for %
17650 73 2e 63 6f 6d 6d 61 6e 64 3a 20 5c 22 25 77 5c  s.command: \"%w\
17660 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54             p->zT
17690 61 62 6c 65 4e 61 6d 65 2c 20 7a 43 6d 64 29 3b  ableName, zCmd);
176a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
176b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
176c0 7d 0a 20 20 20 20 69 66 28 20 69 52 61 6e 6b 3c  }.    if( iRank<
176d0 31 20 29 20 69 52 61 6e 6b 20 3d 20 31 3b 0a 20  1 ) iRank = 1;. 
176e0 20 20 20 69 66 28 20 7a 53 6f 75 6e 64 73 6c 69     if( zSoundsli
176f0 6b 65 20 29 7b 0a 20 20 20 20 20 20 7a 4b 31 20  ke ){.      zK1 
17700 3d 20 28 63 68 61 72 2a 29 74 72 61 6e 73 6c 69  = (char*)transli
17710 74 65 72 61 74 65 28 7a 53 6f 75 6e 64 73 6c 69  terate(zSoundsli
17720 6b 65 2c 20 6e 53 6f 75 6e 64 73 6c 69 6b 65 29  ke, nSoundslike)
17730 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17740 20 20 20 7a 4b 31 20 3d 20 28 63 68 61 72 2a 29     zK1 = (char*)
17750 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 7a 57  transliterate(zW
17760 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20  ord, nWord);.   
17770 20 7d 0a 20 20 20 20 69 66 28 20 7a 4b 31 3d 3d   }.    if( zK1==
17780 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
17790 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 66 6f 72  E_NOMEM;.    for
177a0 28 69 3d 30 3b 20 28 63 20 3d 20 7a 4b 31 5b 69  (i=0; (c = zK1[i
177b0 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
177c0 20 20 20 20 69 66 28 20 63 3e 3d 27 41 27 20 26      if( c>='A' &
177d0 26 20 63 3c 3d 27 5a 27 20 29 20 7a 4b 31 5b 69  & c<='Z' ) zK1[i
177e0 5d 20 2b 3d 20 27 61 27 20 2d 20 27 41 27 3b 0a  ] += 'a' - 'A';.
177f0 20 20 20 20 7d 0a 20 20 20 20 7a 4b 32 20 3d 20      }.    zK2 = 
17800 28 63 68 61 72 2a 29 70 68 6f 6e 65 74 69 63 48  (char*)phoneticH
17810 61 73 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67  ash((const unsig
17820 6e 65 64 20 63 68 61 72 2a 29 7a 4b 31 2c 20 69  ned char*)zK1, i
17830 29 3b 0a 20 20 20 20 69 66 28 20 7a 4b 32 3d 3d  );.    if( zK2==
17840 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
17850 65 33 5f 66 72 65 65 28 7a 4b 31 29 3b 0a 20 20  e3_free(zK1);.  
17860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17870 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
17880 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
17890 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
178a0 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20  ])==SQLITE_NULL 
178b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
178c0 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
178d0 61 72 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45  argv[1])==SQLITE
178e0 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  _NULL ){.       
178f0 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63   spellfix1DbExec
17900 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20  (&rc, db,.      
17910 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
17920 20 49 4e 54 4f 20 5c 22 25 77 5c 22 2e 5c 22 25   INTO \"%w\".\"%
17930 77 5f 76 6f 63 61 62 5c 22 28 72 61 6e 6b 2c 6c  w_vocab\"(rank,l
17940 61 6e 67 69 64 2c 77 6f 72 64 2c 6b 31 2c 6b 32  angid,word,k1,k2
17950 29 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ".            
17960 20 20 20 22 56 41 4c 55 45 53 28 25 64 2c 25 64     "VALUES(%d,%d
17970 2c 25 51 2c 6e 75 6c 6c 69 66 28 25 51 2c 25 51  ,%Q,nullif(%Q,%Q
17980 29 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20  ),%Q)",.        
17990 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d         p->zDbNam
179a0 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65  e, p->zTableName
179b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
179c0 20 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20 7a   iRank, iLang, z
179d0 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 57 6f 72 64  Word, zK1, zWord
179e0 2c 20 7a 4b 32 0a 20 20 20 20 20 20 20 20 29 3b  , zK2.        );
179f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17a00 20 20 20 20 20 20 6e 65 77 52 6f 77 69 64 20 3d        newRowid =
17a10 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
17a20 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a 20  nt64(argv[1]);. 
17a30 20 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31         spellfix1
17a40 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a  DbExec(&rc, db,.
17a50 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53              "INS
17a60 45 52 54 20 4f 52 20 25 73 20 49 4e 54 4f 20 5c  ERT OR %s INTO \
17a70 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62  "%w\".\"%w_vocab
17a80 5c 22 28 69 64 2c 72 61 6e 6b 2c 6c 61 6e 67 69  \"(id,rank,langi
17a90 64 2c 77 6f 72 64 2c 6b 31 2c 6b 32 29 20 22 0a  d,word,k1,k2) ".
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 22 56 41 4c              "VAL
17ab0 55 45 53 28 25 6c 6c 64 2c 25 64 2c 25 64 2c 25  UES(%lld,%d,%d,%
17ac0 51 2c 6e 75 6c 6c 69 66 28 25 51 2c 25 51 29 2c  Q,nullif(%Q,%Q),
17ad0 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %Q)",.          
17ae0 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 70 2d 3e    zConflict, p->
17af0 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62  zDbName, p->zTab
17b00 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  leName,.        
17b10 20 20 20 20 6e 65 77 52 6f 77 69 64 2c 20 69 52      newRowid, iR
17b20 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20 7a 57 6f 72  ank, iLang, zWor
17b30 64 2c 20 7a 4b 31 2c 20 7a 57 6f 72 64 2c 20 7a  d, zK1, zWord, z
17b40 4b 32 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  K2.        );.  
17b50 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 6f      }.      *pRo
17b60 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61  wid = sqlite3_la
17b70 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
17b80 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  db);.    }else{.
17b90 20 20 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71        rowid = sq
17ba0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
17bb0 34 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  4(argv[0]);.    
17bc0 20 20 6e 65 77 52 6f 77 69 64 20 3d 20 2a 70 52    newRowid = *pR
17bd0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
17be0 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
17bf0 31 5d 29 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c  1]);.      spell
17c00 66 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20  fix1DbExec(&rc, 
17c10 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
17c20 20 22 55 50 44 41 54 45 20 4f 52 20 25 73 20 5c   "UPDATE OR %s \
17c30 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62  "%w\".\"%w_vocab
17c40 5c 22 20 53 45 54 20 69 64 3d 25 6c 6c 64 2c 20  \" SET id=%lld, 
17c50 72 61 6e 6b 3d 25 64 2c 20 6c 61 6e 67 69 64 3d  rank=%d, langid=
17c60 25 64 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20  %d,".           
17c70 20 20 22 20 77 6f 72 64 3d 25 51 2c 20 6b 31 3d    " word=%Q, k1=
17c80 6e 75 6c 6c 69 66 28 25 51 2c 25 51 29 2c 20 6b  nullif(%Q,%Q), k
17c90 32 3d 25 51 20 57 48 45 52 45 20 69 64 3d 25 6c  2=%Q WHERE id=%l
17ca0 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ld",.           
17cb0 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 70 2d 3e    zConflict, p->
17cc0 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62  zDbName, p->zTab
17cd0 6c 65 4e 61 6d 65 2c 20 6e 65 77 52 6f 77 69 64  leName, newRowid
17ce0 2c 20 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 0a  , iRank, iLang,.
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 57 6f               zWo
17d00 72 64 2c 20 7a 4b 31 2c 20 7a 57 6f 72 64 2c 20  rd, zK1, zWord, 
17d10 7a 4b 32 2c 20 72 6f 77 69 64 0a 20 20 20 20 20  zK2, rowid.     
17d20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
17d30 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b 31 29 3b  lite3_free(zK1);
17d40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17d50 65 28 7a 4b 32 29 3b 0a 20 20 7d 0a 20 20 72 65  e(zK2);.  }.  re
17d60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17d70 2a 20 52 65 6e 61 6d 65 20 74 68 65 20 73 70 65  * Rename the spe
17d80 6c 6c 66 69 78 31 20 74 61 62 6c 65 2e 0a 2a 2f  llfix1 table..*/
17d90 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
17da0 6c 66 69 78 31 52 65 6e 61 6d 65 28 73 71 6c 69  lfix1Rename(sqli
17db0 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 2c  te3_vtab *pVTab,
17dc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
17dd0 77 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  w){.  spellfix1_
17de0 76 74 61 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c  vtab *p = (spell
17df0 66 69 78 31 5f 76 74 61 62 2a 29 70 56 54 61 62  fix1_vtab*)pVTab
17e00 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
17e10 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
17e20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17e30 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 20   char *zNewName 
17e40 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
17e50 66 28 22 25 73 22 2c 20 7a 4e 65 77 29 3b 0a 20  f("%s", zNew);. 
17e60 20 69 66 28 20 7a 4e 65 77 4e 61 6d 65 3d 3d 30   if( zNewName==0
17e70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17e80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
17e90 0a 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78  .  spellfix1DbEx
17ea0 65 63 28 26 72 63 2c 20 64 62 2c 20 0a 20 20 20  ec(&rc, db, .   
17eb0 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 5c    "ALTER TABLE \
17ec0 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62  "%w\".\"%w_vocab
17ed0 5c 22 20 52 45 4e 41 4d 45 20 54 4f 20 5c 22 25  \" RENAME TO \"%
17ee0 77 5f 76 6f 63 61 62 5c 22 22 2c 0a 20 20 20 20  w_vocab\"",.    
17ef0 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e   p->zDbName, p->
17f00 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 4e 65 77  zTableName, zNew
17f10 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66 28 20  Name.  );.  if( 
17f20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17f30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17f40 65 28 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29  e(p->zTableName)
17f50 3b 0a 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e  ;.    p->zTableN
17f60 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a  ame = zNewName;.
17f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
17f80 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 4e 61  ite3_free(zNewNa
17f90 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
17fa0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
17fb0 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  A virtual table 
17fc0 6d 6f 64 75 6c 65 20 74 68 61 74 20 70 72 6f 76  module that prov
17fd0 69 64 65 73 20 66 75 7a 7a 79 20 73 65 61 72 63  ides fuzzy searc
17fe0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  h..*/.static sql
17ff0 69 74 65 33 5f 6d 6f 64 75 6c 65 20 73 70 65 6c  ite3_module spel
18000 6c 66 69 78 31 4d 6f 64 75 6c 65 20 3d 20 7b 0a  lfix1Module = {.
18010 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
18020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
18030 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 70 65 6c  ersion */.  spel
18040 6c 66 69 78 31 43 72 65 61 74 65 2c 20 20 20 20  lfix1Create,    
18050 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20       /* xCreate 
18060 2d 20 68 61 6e 64 6c 65 20 43 52 45 41 54 45 20  - handle CREATE 
18070 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 2a 2f  VIRTUAL TABLE */
18080 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 6f 6e 6e  .  spellfix1Conn
18090 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ect,        /* x
180a0 43 6f 6e 6e 65 63 74 20 2d 20 72 65 63 6f 6e 6e  Connect - reconn
180b0 65 63 74 65 64 20 74 6f 20 61 6e 20 65 78 69 73  ected to an exis
180c0 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ting table */.  
180d0 73 70 65 6c 6c 66 69 78 31 42 65 73 74 49 6e 64  spellfix1BestInd
180e0 65 78 2c 20 20 20 20 20 20 2f 2a 20 78 42 65 73  ex,      /* xBes
180f0 74 49 6e 64 65 78 20 2d 20 66 69 67 75 72 65 20  tIndex - figure 
18100 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20 61 20  out how to do a 
18110 71 75 65 72 79 20 2a 2f 0a 20 20 73 70 65 6c 6c  query */.  spell
18120 66 69 78 31 44 69 73 63 6f 6e 6e 65 63 74 2c 20  fix1Disconnect, 
18130 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65      /* xDisconne
18140 63 74 20 2d 20 63 6c 6f 73 65 20 61 20 63 6f 6e  ct - close a con
18150 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 70 65  nection */.  spe
18160 6c 6c 66 69 78 31 44 65 73 74 72 6f 79 2c 20 20  llfix1Destroy,  
18170 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f        /* xDestro
18180 79 20 2d 20 68 61 6e 64 6c 65 20 44 52 4f 50 20  y - handle DROP 
18190 54 41 42 4c 45 20 2a 2f 0a 20 20 73 70 65 6c 6c  TABLE */.  spell
181a0 66 69 78 31 4f 70 65 6e 2c 20 20 20 20 20 20 20  fix1Open,       
181b0 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f      /* xOpen - o
181c0 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  pen a cursor */.
181d0 20 20 73 70 65 6c 6c 66 69 78 31 43 6c 6f 73 65    spellfix1Close
181e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43  ,          /* xC
181f0 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63  lose - close a c
18200 75 72 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c  ursor */.  spell
18210 66 69 78 31 46 69 6c 74 65 72 2c 20 20 20 20 20  fix1Filter,     
18220 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d      /* xFilter -
18230 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20   configure scan 
18240 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
18250 20 73 70 65 6c 6c 66 69 78 31 4e 65 78 74 2c 20   spellfix1Next, 
18260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
18270 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63  xt - advance a c
18280 75 72 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c  ursor */.  spell
18290 66 69 78 31 45 6f 66 2c 20 20 20 20 20 20 20 20  fix1Eof,        
182a0 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68      /* xEof - ch
182b0 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73  eck for end of s
182c0 63 61 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  can */.  spellfi
182d0 78 31 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  x1Column,       
182e0 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72    /* xColumn - r
182f0 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 73 70  ead data */.  sp
18300 65 6c 6c 66 69 78 31 52 6f 77 69 64 2c 20 20 20  ellfix1Rowid,   
18310 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64         /* xRowid
18320 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
18330 20 20 73 70 65 6c 6c 66 69 78 31 55 70 64 61 74    spellfix1Updat
18340 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55  e,         /* xU
18350 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20  pdate */.  0,   
18360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18370 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f      /* xBegin */
18380 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
18390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
183a0 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20  Sync */.  0,    
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183c0 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f     /* xCommit */
183d0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
183e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
183f0 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c  Rollback */.  0,
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d         /* xFindM
18420 65 74 68 6f 64 20 2a 2f 0a 20 20 73 70 65 6c 6c  ethod */.  spell
18430 66 69 78 31 52 65 6e 61 6d 65 2c 20 20 20 20 20  fix1Rename,     
18440 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a      /* xRename *
18450 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  /.};../*.** Regi
18460 73 74 65 72 20 74 68 65 20 76 61 72 69 6f 75 73  ster the various
18470 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74   functions and t
18480 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
18490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
184a0 73 70 65 6c 6c 66 69 78 31 52 65 67 69 73 74 65  spellfix1Registe
184b0 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  r(sqlite3 *db){.
184c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
184d0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
184e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
184f0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
18500 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 74 72 61  , "spellfix1_tra
18510 6e 73 6c 69 74 22 2c 20 31 2c 0a 20 20 20 20 20  nslit", 1,.     
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18540 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44 45 54  _UTF8|SQLITE_DET
18550 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 20  ERMINISTIC, 0,. 
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
18580 72 61 6e 73 6c 69 74 65 72 61 74 65 53 71 6c 46  ransliterateSqlF
18590 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  unc, 0, 0);.  if
185a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
185b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
185c0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
185d0 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69  ion(db, "spellfi
185e0 78 31 5f 65 64 69 74 64 69 73 74 22 2c 20 32 2c  x1_editdist", 2,
185f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18610 20 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51    SQLITE_UTF8|SQ
18620 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
18630 49 43 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  IC, 0,.         
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18650 20 20 20 20 20 20 20 20 20 65 64 69 74 64 69 73           editdis
18660 74 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  tSqlFunc, 0, 0);
18670 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
18680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18690 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
186a0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
186b0 20 22 73 70 65 6c 6c 66 69 78 31 5f 70 68 6f 6e   "spellfix1_phon
186c0 65 68 61 73 68 22 2c 20 31 2c 0a 20 20 20 20 20  ehash", 1,.     
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
186f0 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44  TE_UTF8|SQLITE_D
18700 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
18710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 20 70 68 6f 6e 65 74 69 63 48 61 73 68 53     phoneticHashS
18740 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
18750 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
18760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
18770 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
18780 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
18790 73 70 65 6c 6c 66 69 78 31 5f 73 63 72 69 70 74  spellfix1_script
187a0 63 6f 64 65 22 2c 20 31 2c 0a 20 20 20 20 20 20  code", 1,.      
187b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187c0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
187d0 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44  TE_UTF8|SQLITE_D
187e0 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
187f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18810 20 20 20 73 63 72 69 70 74 43 6f 64 65 53 71 6c     scriptCodeSql
18820 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
18830 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
18850 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
18860 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73 70 65 6c  module(db, "spel
18870 6c 66 69 78 31 22 2c 20 26 73 70 65 6c 6c 66 69  lfix1", &spellfi
18880 78 31 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20  x1Module, 0);.  
18890 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
188a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
188b0 3d 20 65 64 69 74 44 69 73 74 33 49 6e 73 74 61  = editDist3Insta
188c0 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ll(db);.  }..  /
188d0 2a 20 56 65 72 69 66 79 20 73 61 6e 69 74 79 20  * Verify sanity 
188e0 6f 66 20 74 68 65 20 74 72 61 6e 73 6c 69 74 5b  of the translit[
188f0 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  ] table */.  for
18900 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 74  (i=0; i<sizeof(t
18910 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65 6f 66 28  ranslit)/sizeof(
18920 74 72 61 6e 73 6c 69 74 5b 30 5d 29 2d 31 3b 20  translit[0])-1; 
18930 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
18940 28 20 74 72 61 6e 73 6c 69 74 5b 69 5d 2e 63 46  ( translit[i].cF
18950 72 6f 6d 3c 74 72 61 6e 73 6c 69 74 5b 69 2b 31  rom<translit[i+1
18960 5d 2e 63 46 72 6f 6d 20 29 3b 0a 20 20 7d 0a 0a  ].cFrom );.  }..
18970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18980 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
18990 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
189a0 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 74  LE */../*.** Ext
189b0 65 6e 73 69 6f 6e 20 6c 6f 61 64 20 66 75 6e 63  ension load func
189c0 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  tion..*/.#ifdef 
189d0 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65  _WIN32.__declspe
189e0 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e  c(dllexport).#en
189f0 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  dif.int sqlite3_
18a00 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28 0a 20  spellfix_init(. 
18a10 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
18a20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
18a30 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  , .  const sqlit
18a40 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20  e3_api_routines 
18a50 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54  *pApi.){.  SQLIT
18a60 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
18a70 32 28 70 41 70 69 29 3b 0a 23 69 66 6e 64 65 66  2(pApi);.#ifndef
18a80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
18a90 54 55 41 4c 54 41 42 4c 45 0a 20 20 72 65 74 75  TUALTABLE.  retu
18aa0 72 6e 20 73 70 65 6c 6c 66 69 78 31 52 65 67 69  rn spellfix1Regi
18ab0 73 74 65 72 28 64 62 29 3b 0a 23 65 6e 64 69 66  ster(db);.#endif
18ac0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18ad0 5f 4f 4b 3b 0a 7d 0a                             _OK;.}.