/ Hex Artifact Content
Login

Artifact 56739fab8c2ed6a9e2dac5592a88d281a999c43b:


0000: 2f 2a 0a 2a 2a 20 32 30 31 32 20 41 70 72 69 6c  /*.** 2012 April
0010: 20 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   10.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f  **.**.** This mo
0180: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  dule implements 
0190: 74 68 65 20 73 70 65 6c 6c 66 69 78 31 20 56 49  the spellfix1 VI
01a0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 68 61 74  RTUAL TABLE that
01b0: 20 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20   can be used.** 
01c0: 74 6f 20 73 65 61 72 63 68 20 61 20 6c 61 72 67  to search a larg
01d0: 65 20 76 6f 63 61 62 75 6c 61 72 79 20 66 6f 72  e vocabulary for
01e0: 20 63 6c 6f 73 65 20 6d 61 74 63 68 65 73 2e 20   close matches. 
01f0: 20 53 65 65 20 73 65 70 61 72 61 74 65 0a 2a 2a   See separate.**
0200: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 28   documentation (
0210: 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
0220: 65 2e 6f 72 67 2f 73 70 65 6c 6c 66 69 78 31 2e  e.org/spellfix1.
0230: 68 74 6d 6c 29 20 66 6f 72 20 64 65 74 61 69 6c  html) for detail
0240: 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  s..*/.#include "
0250: 73 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 53 51  sqlite3ext.h".SQ
0260: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
0270: 4e 49 54 31 0a 0a 23 69 66 6e 64 65 66 20 53 51  NIT1..#ifndef SQ
0280: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0290: 4e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 74 72  N.# include <str
02a0: 69 6e 67 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ing.h>.# include
02b0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 20 69 6e 63   <stdio.h>.# inc
02c0: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02d0: 23 20 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  # include <asser
02e0: 74 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 41 4c  t.h>.# define AL
02f0: 57 41 59 53 28 58 29 20 20 31 0a 23 20 64 65 66  WAYS(X)  1.# def
0300: 69 6e 65 20 4e 45 56 45 52 28 58 29 20 20 20 30  ine NEVER(X)   0
0310: 0a 20 20 74 79 70 65 64 65 66 20 75 6e 73 69 67  .  typedef unsig
0320: 6e 65 64 20 63 68 61 72 20 75 38 3b 0a 20 20 74  ned char u8;.  t
0330: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0340: 73 68 6f 72 74 20 75 31 36 3b 0a 23 65 6e 64 69  short u16;.#endi
0350: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70  f.#include <ctyp
0360: 65 2e 68 3e 0a 0a 23 69 66 6e 64 65 66 20 53 51  e.h>..#ifndef SQ
0370: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
0380: 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20 43 68  LTABLE../*.** Ch
0390: 61 72 61 63 74 65 72 20 63 6c 61 73 73 65 73 20  aracter classes 
03a0: 66 6f 72 20 41 53 43 49 49 20 63 68 61 72 61 63  for ASCII charac
03b0: 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 20  ters:.**.**   0 
03c0: 20 20 27 27 20 20 20 20 20 20 20 20 53 69 6c 65    ''        Sile
03d0: 6e 74 20 6c 65 74 74 65 72 73 3a 20 20 20 48 20  nt letters:   H 
03e0: 57 0a 2a 2a 20 20 20 31 20 20 20 27 41 27 20 20  W.**   1   'A'  
03f0: 20 20 20 20 20 41 6e 79 20 76 6f 77 65 6c 3a 20       Any vowel: 
0400: 20 20 41 20 45 20 49 20 4f 20 55 20 28 59 29 0a    A E I O U (Y).
0410: 2a 2a 20 20 20 32 20 20 20 27 42 27 20 20 20 20  **   2   'B'    
0420: 20 20 20 41 20 62 69 6c 61 62 65 61 6c 20 73 74     A bilabeal st
0430: 6f 70 20 6f 72 20 66 72 69 63 61 74 69 76 65 3a  op or fricative:
0440: 20 20 42 20 46 20 50 20 56 20 57 0a 2a 2a 20 20    B F P V W.**  
0450: 20 33 20 20 20 27 43 27 20 20 20 20 20 20 20 4f   3   'C'       O
0460: 74 68 65 72 20 66 72 69 63 61 74 69 76 65 73 20  ther fricatives 
0470: 6f 72 20 62 61 63 6b 20 73 74 6f 70 73 3a 20 20  or back stops:  
0480: 43 20 47 20 4a 20 4b 20 51 20 53 20 58 20 5a 0a  C G J K Q S X Z.
0490: 2a 2a 20 20 20 34 20 20 20 27 44 27 20 20 20 20  **   4   'D'    
04a0: 20 20 20 41 6c 76 65 6f 6c 61 72 20 73 74 6f 70     Alveolar stop
04b0: 73 3a 20 20 44 20 54 0a 2a 2a 20 20 20 35 20 20  s:  D T.**   5  
04c0: 20 27 48 27 20 20 20 20 20 20 20 4c 65 74 74 65   'H'       Lette
04d0: 72 20 48 20 61 74 20 74 68 65 20 62 65 67 69 6e  r H at the begin
04e0: 6e 69 6e 67 20 6f 66 20 61 20 77 6f 72 64 0a 2a  ning of a word.*
04f0: 2a 20 20 20 36 20 20 20 27 4c 27 20 20 20 20 20  *   6   'L'     
0500: 20 20 47 6c 69 64 65 3a 20 20 4c 0a 2a 2a 20 20    Glide:  L.**  
0510: 20 37 20 20 20 27 52 27 20 20 20 20 20 20 20 53   7   'R'       S
0520: 65 6d 69 76 6f 77 65 6c 3a 20 20 52 0a 2a 2a 20  emivowel:  R.** 
0530: 20 20 38 20 20 20 27 4d 27 20 20 20 20 20 20 20    8   'M'       
0540: 4e 61 73 61 6c 73 3a 20 20 4d 20 4e 0a 2a 2a 20  Nasals:  M N.** 
0550: 20 20 39 20 20 20 27 59 27 20 20 20 20 20 20 20    9   'Y'       
0560: 4c 65 74 74 65 72 20 59 20 61 74 20 74 68 65 20  Letter Y at the 
0570: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 77  beginning of a w
0580: 6f 72 64 2e 0a 2a 2a 20 20 20 31 30 20 20 27 39  ord..**   10  '9
0590: 27 20 20 20 20 20 20 20 44 69 67 69 74 73 3a 20  '       Digits: 
05a0: 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37 20  0 1 2 3 4 5 6 7 
05b0: 38 20 39 0a 2a 2a 20 20 20 31 31 20 20 27 20 27  8 9.**   11  ' '
05c0: 20 20 20 20 20 20 20 57 68 69 74 65 20 73 70 61         White spa
05d0: 63 65 0a 2a 2a 20 20 20 31 32 20 20 27 3f 27 20  ce.**   12  '?' 
05e0: 20 20 20 20 20 20 4f 74 68 65 72 2e 0a 2a 2f 0a        Other..*/.
05f0: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 53  #define CCLASS_S
0600: 49 4c 45 4e 54 20 20 20 20 20 20 20 20 20 30 0a  ILENT         0.
0610: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 56  #define CCLASS_V
0620: 4f 57 45 4c 20 20 20 20 20 20 20 20 20 20 31 0a  OWEL          1.
0630: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 42  #define CCLASS_B
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 0a                2.
0650: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 43  #define CCLASS_C
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 0a                3.
0670: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 44  #define CCLASS_D
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 0a                4.
0690: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 48  #define CCLASS_H
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 0a                5.
06b0: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 4c  #define CCLASS_L
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 0a                6.
06d0: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 52  #define CCLASS_R
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 37 0a                7.
06f0: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 4d  #define CCLASS_M
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 0a                8.
0710: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 59  #define CCLASS_Y
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39 0a                9.
0730: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 44  #define CCLASS_D
0740: 49 47 49 54 20 20 20 20 20 20 20 20 20 31 30 0a  IGIT         10.
0750: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 53  #define CCLASS_S
0760: 50 41 43 45 20 20 20 20 20 20 20 20 20 31 31 0a  PACE         11.
0770: 23 64 65 66 69 6e 65 20 43 43 4c 41 53 53 5f 4f  #define CCLASS_O
0780: 54 48 45 52 20 20 20 20 20 20 20 20 20 31 32 0a  THER         12.
0790: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
07a0: 77 69 6e 67 20 74 61 62 6c 65 20 67 69 76 65 73  wing table gives
07b0: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 63   the character c
07c0: 6c 61 73 73 20 66 6f 72 20 6e 6f 6e 2d 69 6e 69  lass for non-ini
07d0: 74 69 61 6c 20 41 53 43 49 49 0a 2a 2a 20 63 68  tial ASCII.** ch
07e0: 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
07f0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
0800: 65 64 20 63 68 61 72 20 6d 69 64 43 6c 61 73 73  ed char midClass
0810: 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 20 20 2a 2f 20  [] = {. /*   */ 
0820: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0830: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0840: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0850: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0860: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0870: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
0880: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0890: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
08a0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
08b0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
08c0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
08d0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
08e0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
08f0: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53  /*   */ CCLASS_S
0900: 50 41 43 45 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  PACE,    /*   */
0910: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0920: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0930: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0940: 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 20 20 20  CCLASS_SPACE,   
0950: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0960: 53 50 41 43 45 2c 20 20 20 2f 2a 20 20 20 2a 2f  SPACE,   /*   */
0970: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0980: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0990: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
09a0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
09b0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
09c0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
09d0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
09e0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
09f0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0a00: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0a10: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0a20: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
0a30: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0a40: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0a50: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0a60: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0a70: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0a80: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0a90: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0aa0: 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /*   */ CCLASS_O
0ab0: 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a 2f  THER,    /*   */
0ac0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0ad0: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0ae0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20  OTHER,. /*   */ 
0af0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0b00: 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41 53 53 5f   /*   */ CCLASS_
0b10: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 20 20 2a 2f  OTHER,   /*   */
0b20: 20 43 43 4c 41 53 53 5f 53 50 41 43 45 2c 0a 20   CCLASS_SPACE,. 
0b30: 2f 2a 20 21 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* ! */ CCLASS_O
0b40: 54 48 45 52 2c 20 20 20 20 2f 2a 20 22 20 2a 2f  THER,    /* " */
0b50: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0b60: 20 2f 2a 20 23 20 2a 2f 20 43 43 4c 41 53 53 5f   /* # */ CCLASS_
0b70: 4f 54 48 45 52 2c 0a 20 2f 2a 20 24 20 2a 2f 20  OTHER,. /* $ */ 
0b80: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0b90: 20 2f 2a 20 25 20 2a 2f 20 43 43 4c 41 53 53 5f   /* % */ CCLASS_
0ba0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 26 20 2a 2f  OTHER,   /* & */
0bb0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0bc0: 2f 2a 20 27 20 2a 2f 20 43 43 4c 41 53 53 5f 53  /* ' */ CCLASS_S
0bd0: 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 28 20 2a 2f  ILENT,   /* ( */
0be0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0bf0: 20 2f 2a 20 29 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ) */ CCLASS_
0c00: 4f 54 48 45 52 2c 0a 20 2f 2a 20 2a 20 2a 2f 20  OTHER,. /* * */ 
0c10: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0c20: 20 2f 2a 20 2b 20 2a 2f 20 43 43 4c 41 53 53 5f   /* + */ CCLASS_
0c30: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 2c 20 2a 2f  OTHER,   /* , */
0c40: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0c50: 2f 2a 20 2d 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* - */ CCLASS_O
0c60: 54 48 45 52 2c 20 20 20 20 2f 2a 20 2e 20 2a 2f  THER,    /* . */
0c70: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0c80: 20 2f 2a 20 2f 20 2a 2f 20 43 43 4c 41 53 53 5f   /* / */ CCLASS_
0c90: 4f 54 48 45 52 2c 0a 20 2f 2a 20 30 20 2a 2f 20  OTHER,. /* 0 */ 
0ca0: 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20  CCLASS_DIGIT,   
0cb0: 20 2f 2a 20 31 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 1 */ CCLASS_
0cc0: 44 49 47 49 54 2c 20 20 20 2f 2a 20 32 20 2a 2f  DIGIT,   /* 2 */
0cd0: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20   CCLASS_DIGIT,. 
0ce0: 2f 2a 20 33 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* 3 */ CCLASS_D
0cf0: 49 47 49 54 2c 20 20 20 20 2f 2a 20 34 20 2a 2f  IGIT,    /* 4 */
0d00: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20   CCLASS_DIGIT,  
0d10: 20 2f 2a 20 35 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 5 */ CCLASS_
0d20: 44 49 47 49 54 2c 0a 20 2f 2a 20 36 20 2a 2f 20  DIGIT,. /* 6 */ 
0d30: 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 20 20 20  CCLASS_DIGIT,   
0d40: 20 2f 2a 20 37 20 2a 2f 20 43 43 4c 41 53 53 5f   /* 7 */ CCLASS_
0d50: 44 49 47 49 54 2c 20 20 20 2f 2a 20 38 20 2a 2f  DIGIT,   /* 8 */
0d60: 20 43 43 4c 41 53 53 5f 44 49 47 49 54 2c 0a 20   CCLASS_DIGIT,. 
0d70: 2f 2a 20 39 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* 9 */ CCLASS_D
0d80: 49 47 49 54 2c 20 20 20 20 2f 2a 20 3a 20 2a 2f  IGIT,    /* : */
0d90: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0da0: 20 2f 2a 20 3b 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ; */ CCLASS_
0db0: 4f 54 48 45 52 2c 0a 20 2f 2a 20 3c 20 2a 2f 20  OTHER,. /* < */ 
0dc0: 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20 20  CCLASS_OTHER,   
0dd0: 20 2f 2a 20 3d 20 2a 2f 20 43 43 4c 41 53 53 5f   /* = */ CCLASS_
0de0: 4f 54 48 45 52 2c 20 20 20 2f 2a 20 3e 20 2a 2f  OTHER,   /* > */
0df0: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a 20   CCLASS_OTHER,. 
0e00: 2f 2a 20 3f 20 2a 2f 20 43 43 4c 41 53 53 5f 4f  /* ? */ CCLASS_O
0e10: 54 48 45 52 2c 20 20 20 20 2f 2a 20 40 20 2a 2f  THER,    /* @ */
0e20: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
0e30: 20 2f 2a 20 41 20 2a 2f 20 43 43 4c 41 53 53 5f   /* A */ CCLASS_
0e40: 56 4f 57 45 4c 2c 0a 20 2f 2a 20 42 20 2a 2f 20  VOWEL,. /* B */ 
0e50: 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20  CCLASS_B,       
0e60: 20 2f 2a 20 43 20 2a 2f 20 43 43 4c 41 53 53 5f   /* C */ CCLASS_
0e70: 43 2c 20 20 20 20 20 20 20 2f 2a 20 44 20 2a 2f  C,       /* D */
0e80: 20 43 43 4c 41 53 53 5f 44 2c 0a 20 2f 2a 20 45   CCLASS_D,. /* E
0e90: 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c   */ CCLASS_VOWEL
0ea0: 2c 20 20 20 20 2f 2a 20 46 20 2a 2f 20 43 43 4c  ,    /* F */ CCL
0eb0: 41 53 53 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_B,       /* 
0ec0: 47 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20  G */ CCLASS_C,. 
0ed0: 2f 2a 20 48 20 2a 2f 20 43 43 4c 41 53 53 5f 53  /* H */ CCLASS_S
0ee0: 49 4c 45 4e 54 2c 20 20 20 2f 2a 20 49 20 2a 2f  ILENT,   /* I */
0ef0: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
0f00: 20 2f 2a 20 4a 20 2a 2f 20 43 43 4c 41 53 53 5f   /* J */ CCLASS_
0f10: 43 2c 0a 20 2f 2a 20 4b 20 2a 2f 20 43 43 4c 41  C,. /* K */ CCLA
0f20: 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_C,        /* 
0f30: 4c 20 2a 2f 20 43 43 4c 41 53 53 5f 4c 2c 20 20  L */ CCLASS_L,  
0f40: 20 20 20 20 20 2f 2a 20 4d 20 2a 2f 20 43 43 4c       /* M */ CCL
0f50: 41 53 53 5f 4d 2c 0a 20 2f 2a 20 4e 20 2a 2f 20  ASS_M,. /* N */ 
0f60: 43 43 4c 41 53 53 5f 4d 2c 20 20 20 20 20 20 20  CCLASS_M,       
0f70: 20 2f 2a 20 4f 20 2a 2f 20 43 43 4c 41 53 53 5f   /* O */ CCLASS_
0f80: 56 4f 57 45 4c 2c 20 20 20 2f 2a 20 50 20 2a 2f  VOWEL,   /* P */
0f90: 20 43 43 4c 41 53 53 5f 42 2c 0a 20 2f 2a 20 51   CCLASS_B,. /* Q
0fa0: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
0fb0: 20 20 20 20 20 2f 2a 20 52 20 2a 2f 20 43 43 4c       /* R */ CCL
0fc0: 41 53 53 5f 52 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_R,       /* 
0fd0: 53 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20  S */ CCLASS_C,. 
0fe0: 2f 2a 20 54 20 2a 2f 20 43 43 4c 41 53 53 5f 44  /* T */ CCLASS_D
0ff0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 20 2a 2f  ,        /* U */
1000: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
1010: 20 2f 2a 20 56 20 2a 2f 20 43 43 4c 41 53 53 5f   /* V */ CCLASS_
1020: 42 2c 0a 20 2f 2a 20 57 20 2a 2f 20 43 43 4c 41  B,. /* W */ CCLA
1030: 53 53 5f 42 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_B,        /* 
1040: 58 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20  X */ CCLASS_C,  
1050: 20 20 20 20 20 2f 2a 20 59 20 2a 2f 20 43 43 4c       /* Y */ CCL
1060: 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 5a  ASS_VOWEL,. /* Z
1070: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
1080: 20 20 20 20 20 2f 2a 20 5b 20 2a 2f 20 43 43 4c       /* [ */ CCL
1090: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
10a0: 5c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  \ */ CCLASS_OTHE
10b0: 52 2c 0a 20 2f 2a 20 5d 20 2a 2f 20 43 43 4c 41  R,. /* ] */ CCLA
10c0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
10d0: 5e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ^ */ CCLASS_OTHE
10e0: 52 2c 20 20 20 2f 2a 20 5f 20 2a 2f 20 43 43 4c  R,   /* _ */ CCL
10f0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 60  ASS_OTHER,. /* `
1100: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1110: 2c 20 20 20 20 2f 2a 20 61 20 2a 2f 20 43 43 4c  ,    /* a */ CCL
1120: 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20  ASS_VOWEL,   /* 
1130: 62 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20  b */ CCLASS_B,. 
1140: 2f 2a 20 63 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* c */ CCLASS_C
1150: 2c 20 20 20 20 20 20 20 20 2f 2a 20 64 20 2a 2f  ,        /* d */
1160: 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20 20 20   CCLASS_D,      
1170: 20 2f 2a 20 65 20 2a 2f 20 43 43 4c 41 53 53 5f   /* e */ CCLASS_
1180: 56 4f 57 45 4c 2c 0a 20 2f 2a 20 66 20 2a 2f 20  VOWEL,. /* f */ 
1190: 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20  CCLASS_B,       
11a0: 20 2f 2a 20 67 20 2a 2f 20 43 43 4c 41 53 53 5f   /* g */ CCLASS_
11b0: 43 2c 20 20 20 20 20 20 20 2f 2a 20 68 20 2a 2f  C,       /* h */
11c0: 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c 0a   CCLASS_SILENT,.
11d0: 20 2f 2a 20 69 20 2a 2f 20 43 43 4c 41 53 53 5f   /* i */ CCLASS_
11e0: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 6a 20 2a  VOWEL,    /* j *
11f0: 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20  / CCLASS_C,     
1200: 20 20 2f 2a 20 6b 20 2a 2f 20 43 43 4c 41 53 53    /* k */ CCLASS
1210: 5f 43 2c 0a 20 2f 2a 20 6c 20 2a 2f 20 43 43 4c  _C,. /* l */ CCL
1220: 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_L,        /*
1230: 20 6d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 20   m */ CCLASS_M, 
1240: 20 20 20 20 20 20 2f 2a 20 6e 20 2a 2f 20 43 43        /* n */ CC
1250: 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 6f 20 2a 2f  LASS_M,. /* o */
1260: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
1270: 20 20 2f 2a 20 70 20 2a 2f 20 43 43 4c 41 53 53    /* p */ CCLASS
1280: 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 71 20 2a  _B,       /* q *
1290: 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20  / CCLASS_C,. /* 
12a0: 72 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c 20 20  r */ CCLASS_R,  
12b0: 20 20 20 20 20 20 2f 2a 20 73 20 2a 2f 20 43 43        /* s */ CC
12c0: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a  LASS_C,       /*
12d0: 20 74 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a   t */ CCLASS_D,.
12e0: 20 2f 2a 20 75 20 2a 2f 20 43 43 4c 41 53 53 5f   /* u */ CCLASS_
12f0: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 76 20 2a  VOWEL,    /* v *
1300: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
1310: 20 20 2f 2a 20 77 20 2a 2f 20 43 43 4c 41 53 53    /* w */ CCLASS
1320: 5f 42 2c 0a 20 2f 2a 20 78 20 2a 2f 20 43 43 4c  _B,. /* x */ CCL
1330: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_C,        /*
1340: 20 79 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57   y */ CCLASS_VOW
1350: 45 4c 2c 20 20 20 2f 2a 20 7a 20 2a 2f 20 43 43  EL,   /* z */ CC
1360: 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 7b 20 2a 2f  LASS_C,. /* { */
1370: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
1380: 20 20 2f 2a 20 7c 20 2a 2f 20 43 43 4c 41 53 53    /* | */ CCLASS
1390: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 7d 20 2a  _OTHER,   /* } *
13a0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
13b0: 20 2f 2a 20 7e 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ~ */ CCLASS_
13c0: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a  OTHER,    /*   *
13d0: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
13e0: 20 20 0a 7d 3b 0a 2f 2a 20 0a 2a 2a 20 54 68 69    .};./* .** Thi
13f0: 73 20 74 61 62 6c 65 73 20 67 69 76 65 73 20 74  s tables gives t
1400: 68 65 20 63 68 61 72 61 63 74 65 72 20 63 6c 61  he character cla
1410: 73 73 20 66 6f 72 20 41 53 43 49 49 20 63 68 61  ss for ASCII cha
1420: 72 61 63 74 65 72 73 20 74 68 61 74 20 66 6f 72  racters that for
1430: 6d 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  m the.** initial
1440: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 61 20   character of a 
1450: 77 6f 72 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  word.  The only 
1460: 64 69 66 66 65 72 65 6e 63 65 20 66 72 6f 6d 20  difference from 
1470: 6d 69 64 43 6c 61 73 73 20 69 73 20 77 69 74 68  midClass is with
1480: 0a 2a 2a 20 74 68 65 20 6c 65 74 74 65 72 73 20  .** the letters 
1490: 48 2c 20 57 2c 20 61 6e 64 20 59 2e 0a 2a 2f 0a  H, W, and Y..*/.
14a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
14b0: 69 67 6e 65 64 20 63 68 61 72 20 69 6e 69 74 43  igned char initC
14c0: 6c 61 73 73 5b 5d 20 3d 20 7b 0a 20 2f 2a 20 20  lass[] = {. /*  
14d0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
14e0: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
14f0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1500: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1510: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1520: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1530: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1540: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1550: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
1560: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1570: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
1580: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1590: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
15a0: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
15b0: 53 53 5f 53 50 41 43 45 2c 20 20 20 20 2f 2a 20  SS_SPACE,    /* 
15c0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
15d0: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
15e0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
15f0: 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43 45   */ CCLASS_SPACE
1600: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
1610: 41 53 53 5f 53 50 41 43 45 2c 20 20 20 2f 2a 20  ASS_SPACE,   /* 
1620: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1630: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1640: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1650: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1660: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1670: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
1680: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1690: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
16a0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
16b0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
16c0: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
16d0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
16e0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
16f0: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1700: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
1710: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1720: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
1730: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1740: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1750: 52 2c 0a 20 2f 2a 20 20 20 2a 2f 20 43 43 4c 41  R,. /*   */ CCLA
1760: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1770: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45    */ CCLASS_OTHE
1780: 52 2c 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  R,   /*   */ CCL
1790: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 20  ASS_OTHER,. /*  
17a0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
17b0: 2c 20 20 20 20 2f 2a 20 20 20 2a 2f 20 43 43 4c  ,    /*   */ CCL
17c0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
17d0: 20 20 2a 2f 20 43 43 4c 41 53 53 5f 53 50 41 43    */ CCLASS_SPAC
17e0: 45 2c 0a 20 2f 2a 20 21 20 2a 2f 20 43 43 4c 41  E,. /* ! */ CCLA
17f0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1800: 22 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  " */ CCLASS_OTHE
1810: 52 2c 20 20 20 2f 2a 20 23 20 2a 2f 20 43 43 4c  R,   /* # */ CCL
1820: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 24  ASS_OTHER,. /* $
1830: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1840: 2c 20 20 20 20 2f 2a 20 25 20 2a 2f 20 43 43 4c  ,    /* % */ CCL
1850: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1860: 26 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  & */ CCLASS_OTHE
1870: 52 2c 0a 20 2f 2a 20 27 20 2a 2f 20 43 43 4c 41  R,. /* ' */ CCLA
1880: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1890: 28 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ( */ CCLASS_OTHE
18a0: 52 2c 20 20 20 2f 2a 20 29 20 2a 2f 20 43 43 4c  R,   /* ) */ CCL
18b0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 2a  ASS_OTHER,. /* *
18c0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
18d0: 2c 20 20 20 20 2f 2a 20 2b 20 2a 2f 20 43 43 4c  ,    /* + */ CCL
18e0: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
18f0: 2c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  , */ CCLASS_OTHE
1900: 52 2c 0a 20 2f 2a 20 2d 20 2a 2f 20 43 43 4c 41  R,. /* - */ CCLA
1910: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1920: 2e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  . */ CCLASS_OTHE
1930: 52 2c 20 20 20 2f 2a 20 2f 20 2a 2f 20 43 43 4c  R,   /* / */ CCL
1940: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 30  ASS_OTHER,. /* 0
1950: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54   */ CCLASS_DIGIT
1960: 2c 20 20 20 20 2f 2a 20 31 20 2a 2f 20 43 43 4c  ,    /* 1 */ CCL
1970: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20  ASS_DIGIT,   /* 
1980: 32 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  2 */ CCLASS_DIGI
1990: 54 2c 0a 20 2f 2a 20 33 20 2a 2f 20 43 43 4c 41  T,. /* 3 */ CCLA
19a0: 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20  SS_DIGIT,    /* 
19b0: 34 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  4 */ CCLASS_DIGI
19c0: 54 2c 20 20 20 2f 2a 20 35 20 2a 2f 20 43 43 4c  T,   /* 5 */ CCL
19d0: 41 53 53 5f 44 49 47 49 54 2c 0a 20 2f 2a 20 36  ASS_DIGIT,. /* 6
19e0: 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49 54   */ CCLASS_DIGIT
19f0: 2c 20 20 20 20 2f 2a 20 37 20 2a 2f 20 43 43 4c  ,    /* 7 */ CCL
1a00: 41 53 53 5f 44 49 47 49 54 2c 20 20 20 2f 2a 20  ASS_DIGIT,   /* 
1a10: 38 20 2a 2f 20 43 43 4c 41 53 53 5f 44 49 47 49  8 */ CCLASS_DIGI
1a20: 54 2c 0a 20 2f 2a 20 39 20 2a 2f 20 43 43 4c 41  T,. /* 9 */ CCLA
1a30: 53 53 5f 44 49 47 49 54 2c 20 20 20 20 2f 2a 20  SS_DIGIT,    /* 
1a40: 3a 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  : */ CCLASS_OTHE
1a50: 52 2c 20 20 20 2f 2a 20 3b 20 2a 2f 20 43 43 4c  R,   /* ; */ CCL
1a60: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 3c  ASS_OTHER,. /* <
1a70: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1a80: 2c 20 20 20 20 2f 2a 20 3d 20 2a 2f 20 43 43 4c  ,    /* = */ CCL
1a90: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1aa0: 3e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  > */ CCLASS_OTHE
1ab0: 52 2c 0a 20 2f 2a 20 3f 20 2a 2f 20 43 43 4c 41  R,. /* ? */ CCLA
1ac0: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1ad0: 40 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  @ */ CCLASS_OTHE
1ae0: 52 2c 20 20 20 2f 2a 20 41 20 2a 2f 20 43 43 4c  R,   /* A */ CCL
1af0: 41 53 53 5f 56 4f 57 45 4c 2c 0a 20 2f 2a 20 42  ASS_VOWEL,. /* B
1b00: 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20   */ CCLASS_B,   
1b10: 20 20 20 20 20 2f 2a 20 43 20 2a 2f 20 43 43 4c       /* C */ CCL
1b20: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a 20  ASS_C,       /* 
1b30: 44 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a 20  D */ CCLASS_D,. 
1b40: 2f 2a 20 45 20 2a 2f 20 43 43 4c 41 53 53 5f 56  /* E */ CCLASS_V
1b50: 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 46 20 2a 2f  OWEL,    /* F */
1b60: 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20   CCLASS_B,      
1b70: 20 2f 2a 20 47 20 2a 2f 20 43 43 4c 41 53 53 5f   /* G */ CCLASS_
1b80: 43 2c 0a 20 2f 2a 20 48 20 2a 2f 20 43 43 4c 41  C,. /* H */ CCLA
1b90: 53 53 5f 53 49 4c 45 4e 54 2c 20 20 20 2f 2a 20  SS_SILENT,   /* 
1ba0: 49 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  I */ CCLASS_VOWE
1bb0: 4c 2c 20 20 20 2f 2a 20 4a 20 2a 2f 20 43 43 4c  L,   /* J */ CCL
1bc0: 41 53 53 5f 43 2c 0a 20 2f 2a 20 4b 20 2a 2f 20  ASS_C,. /* K */ 
1bd0: 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20  CCLASS_C,       
1be0: 20 2f 2a 20 4c 20 2a 2f 20 43 43 4c 41 53 53 5f   /* L */ CCLASS_
1bf0: 4c 2c 20 20 20 20 20 20 20 2f 2a 20 4d 20 2a 2f  L,       /* M */
1c00: 20 43 43 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 4e   CCLASS_M,. /* N
1c10: 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 20 20 20   */ CCLASS_M,   
1c20: 20 20 20 20 20 2f 2a 20 4f 20 2a 2f 20 43 43 4c       /* O */ CCL
1c30: 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20  ASS_VOWEL,   /* 
1c40: 50 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20  P */ CCLASS_B,. 
1c50: 2f 2a 20 51 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* Q */ CCLASS_C
1c60: 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 20 2a 2f  ,        /* R */
1c70: 20 43 43 4c 41 53 53 5f 52 2c 20 20 20 20 20 20   CCLASS_R,      
1c80: 20 2f 2a 20 53 20 2a 2f 20 43 43 4c 41 53 53 5f   /* S */ CCLASS_
1c90: 43 2c 0a 20 2f 2a 20 54 20 2a 2f 20 43 43 4c 41  C,. /* T */ CCLA
1ca0: 53 53 5f 44 2c 20 20 20 20 20 20 20 20 2f 2a 20  SS_D,        /* 
1cb0: 55 20 2a 2f 20 43 43 4c 41 53 53 5f 56 4f 57 45  U */ CCLASS_VOWE
1cc0: 4c 2c 20 20 20 2f 2a 20 56 20 2a 2f 20 43 43 4c  L,   /* V */ CCL
1cd0: 41 53 53 5f 42 2c 0a 20 2f 2a 20 57 20 2a 2f 20  ASS_B,. /* W */ 
1ce0: 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20  CCLASS_B,       
1cf0: 20 2f 2a 20 58 20 2a 2f 20 43 43 4c 41 53 53 5f   /* X */ CCLASS_
1d00: 43 2c 20 20 20 20 20 20 20 2f 2a 20 59 20 2a 2f  C,       /* Y */
1d10: 20 43 43 4c 41 53 53 5f 59 2c 0a 20 2f 2a 20 5a   CCLASS_Y,. /* Z
1d20: 20 2a 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20   */ CCLASS_C,   
1d30: 20 20 20 20 20 2f 2a 20 5b 20 2a 2f 20 43 43 4c       /* [ */ CCL
1d40: 41 53 53 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20  ASS_OTHER,   /* 
1d50: 5c 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  \ */ CCLASS_OTHE
1d60: 52 2c 0a 20 2f 2a 20 5d 20 2a 2f 20 43 43 4c 41  R,. /* ] */ CCLA
1d70: 53 53 5f 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20  SS_OTHER,    /* 
1d80: 5e 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45  ^ */ CCLASS_OTHE
1d90: 52 2c 20 20 20 2f 2a 20 5f 20 2a 2f 20 43 43 4c  R,   /* _ */ CCL
1da0: 41 53 53 5f 4f 54 48 45 52 2c 0a 20 2f 2a 20 60  ASS_OTHER,. /* `
1db0: 20 2a 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52   */ CCLASS_OTHER
1dc0: 2c 20 20 20 20 2f 2a 20 61 20 2a 2f 20 43 43 4c  ,    /* a */ CCL
1dd0: 41 53 53 5f 56 4f 57 45 4c 2c 20 20 20 2f 2a 20  ASS_VOWEL,   /* 
1de0: 62 20 2a 2f 20 43 43 4c 41 53 53 5f 42 2c 0a 20  b */ CCLASS_B,. 
1df0: 2f 2a 20 63 20 2a 2f 20 43 43 4c 41 53 53 5f 43  /* c */ CCLASS_C
1e00: 2c 20 20 20 20 20 20 20 20 2f 2a 20 64 20 2a 2f  ,        /* d */
1e10: 20 43 43 4c 41 53 53 5f 44 2c 20 20 20 20 20 20   CCLASS_D,      
1e20: 20 2f 2a 20 65 20 2a 2f 20 43 43 4c 41 53 53 5f   /* e */ CCLASS_
1e30: 56 4f 57 45 4c 2c 0a 20 2f 2a 20 66 20 2a 2f 20  VOWEL,. /* f */ 
1e40: 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20 20 20  CCLASS_B,       
1e50: 20 2f 2a 20 67 20 2a 2f 20 43 43 4c 41 53 53 5f   /* g */ CCLASS_
1e60: 43 2c 20 20 20 20 20 20 20 2f 2a 20 68 20 2a 2f  C,       /* h */
1e70: 20 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54 2c 0a   CCLASS_SILENT,.
1e80: 20 2f 2a 20 69 20 2a 2f 20 43 43 4c 41 53 53 5f   /* i */ CCLASS_
1e90: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 6a 20 2a  VOWEL,    /* j *
1ea0: 2f 20 43 43 4c 41 53 53 5f 43 2c 20 20 20 20 20  / CCLASS_C,     
1eb0: 20 20 2f 2a 20 6b 20 2a 2f 20 43 43 4c 41 53 53    /* k */ CCLASS
1ec0: 5f 43 2c 0a 20 2f 2a 20 6c 20 2a 2f 20 43 43 4c  _C,. /* l */ CCL
1ed0: 41 53 53 5f 4c 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_L,        /*
1ee0: 20 6d 20 2a 2f 20 43 43 4c 41 53 53 5f 4d 2c 20   m */ CCLASS_M, 
1ef0: 20 20 20 20 20 20 2f 2a 20 6e 20 2a 2f 20 43 43        /* n */ CC
1f00: 4c 41 53 53 5f 4d 2c 0a 20 2f 2a 20 6f 20 2a 2f  LASS_M,. /* o */
1f10: 20 43 43 4c 41 53 53 5f 56 4f 57 45 4c 2c 20 20   CCLASS_VOWEL,  
1f20: 20 20 2f 2a 20 70 20 2a 2f 20 43 43 4c 41 53 53    /* p */ CCLASS
1f30: 5f 42 2c 20 20 20 20 20 20 20 2f 2a 20 71 20 2a  _B,       /* q *
1f40: 2f 20 43 43 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20  / CCLASS_C,. /* 
1f50: 72 20 2a 2f 20 43 43 4c 41 53 53 5f 52 2c 20 20  r */ CCLASS_R,  
1f60: 20 20 20 20 20 20 2f 2a 20 73 20 2a 2f 20 43 43        /* s */ CC
1f70: 4c 41 53 53 5f 43 2c 20 20 20 20 20 20 20 2f 2a  LASS_C,       /*
1f80: 20 74 20 2a 2f 20 43 43 4c 41 53 53 5f 44 2c 0a   t */ CCLASS_D,.
1f90: 20 2f 2a 20 75 20 2a 2f 20 43 43 4c 41 53 53 5f   /* u */ CCLASS_
1fa0: 56 4f 57 45 4c 2c 20 20 20 20 2f 2a 20 76 20 2a  VOWEL,    /* v *
1fb0: 2f 20 43 43 4c 41 53 53 5f 42 2c 20 20 20 20 20  / CCLASS_B,     
1fc0: 20 20 2f 2a 20 77 20 2a 2f 20 43 43 4c 41 53 53    /* w */ CCLASS
1fd0: 5f 42 2c 0a 20 2f 2a 20 78 20 2a 2f 20 43 43 4c  _B,. /* x */ CCL
1fe0: 41 53 53 5f 43 2c 20 20 20 20 20 20 20 20 2f 2a  ASS_C,        /*
1ff0: 20 79 20 2a 2f 20 43 43 4c 41 53 53 5f 59 2c 20   y */ CCLASS_Y, 
2000: 20 20 20 20 20 20 2f 2a 20 7a 20 2a 2f 20 43 43        /* z */ CC
2010: 4c 41 53 53 5f 43 2c 0a 20 2f 2a 20 7b 20 2a 2f  LASS_C,. /* { */
2020: 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20 20   CCLASS_OTHER,  
2030: 20 20 2f 2a 20 7c 20 2a 2f 20 43 43 4c 41 53 53    /* | */ CCLASS
2040: 5f 4f 54 48 45 52 2c 20 20 20 2f 2a 20 7d 20 2a  _OTHER,   /* } *
2050: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 0a  / CCLASS_OTHER,.
2060: 20 2f 2a 20 7e 20 2a 2f 20 43 43 4c 41 53 53 5f   /* ~ */ CCLASS_
2070: 4f 54 48 45 52 2c 20 20 20 20 2f 2a 20 20 20 2a  OTHER,    /*   *
2080: 2f 20 43 43 4c 41 53 53 5f 4f 54 48 45 52 2c 20  / CCLASS_OTHER, 
2090: 20 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70    .};../*.** Map
20a0: 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 63 68  ping from the ch
20b0: 61 72 61 63 74 65 72 20 63 6c 61 73 73 20 6e 75  aracter class nu
20c0: 6d 62 65 72 20 28 30 2d 31 33 29 20 74 6f 20 61  mber (0-13) to a
20d0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 65 61 63 68   symbol for each
20e0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 63 6c  .** character cl
20f0: 61 73 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ass.  Note that 
2100: 69 6e 69 74 43 6c 61 73 73 5b 5d 20 63 61 6e 20  initClass[] can 
2110: 62 65 20 75 73 65 64 20 74 6f 20 6d 61 70 20 74  be used to map t
2120: 68 65 20 63 6c 61 73 73 0a 2a 2a 20 73 79 6d 62  he class.** symb
2130: 6f 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ol back into the
2140: 20 63 6c 61 73 73 20 6e 75 6d 62 65 72 2e 0a 2a   class number..*
2150: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
2160: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61  nsigned char cla
2170: 73 73 4e 61 6d 65 5b 5d 20 3d 20 22 2e 41 42 43  ssName[] = ".ABC
2180: 44 48 4c 52 4d 59 39 20 3f 22 3b 0a 0a 2f 2a 0a  DHLRMY9 ?";../*.
2190: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 22 70  ** Generate a "p
21a0: 68 6f 6e 65 74 69 63 20 68 61 73 68 22 20 66 72  honetic hash" fr
21b0: 6f 6d 20 61 20 73 74 72 69 6e 67 20 6f 66 20 41  om a string of A
21c0: 53 43 49 49 20 63 68 61 72 61 63 74 65 72 73 0a  SCII characters.
21d0: 2a 2a 20 69 6e 20 7a 49 6e 5b 30 2e 2e 6e 49 6e  ** in zIn[0..nIn
21e0: 2d 31 5d 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4d  -1]..**.**   * M
21f0: 61 70 20 63 68 61 72 61 63 74 65 72 73 20 62 79  ap characters by
2200: 20 63 68 61 72 61 63 74 65 72 20 63 6c 61 73 73   character class
2210: 20 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76   as defined abov
2220: 65 2e 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 64  e..**   * Omit d
2230: 6f 75 62 6c 65 2d 6c 65 74 74 65 72 73 0a 2a 2a  ouble-letters.**
2240: 20 20 20 2a 20 4f 6d 69 74 20 76 6f 77 65 6c 73     * Omit vowels
2250: 20 62 65 73 69 64 65 20 52 20 61 6e 64 20 4c 0a   beside R and L.
2260: 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 54 20 77 68  **   * Omit T wh
2270: 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 43  en followed by C
2280: 48 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 57 20  H.**   * Omit W 
2290: 77 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79  when followed by
22a0: 20 52 0a 2a 2a 20 20 20 2a 20 4f 6d 69 74 20 44   R.**   * Omit D
22b0: 20 77 68 65 6e 20 66 6f 6c 6c 6f 77 65 64 20 62   when followed b
22c0: 79 20 4a 20 6f 72 20 47 0a 2a 2a 20 20 20 2a 20  y J or G.**   * 
22d0: 4f 6d 69 74 20 4b 20 69 6e 20 4b 4e 20 6f 72 20  Omit K in KN or 
22e0: 47 20 69 6e 20 47 4e 20 61 74 20 74 68 65 20 62  G in GN at the b
22f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 77 6f  eginning of a wo
2300: 72 64 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  rd.**.** Space t
2310: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c  o hold the resul
2320: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  t is obtained fr
2330: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
2340: 63 28 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  c().**.** Return
2350: 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20   NULL if memory 
2360: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2370: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e  .  .*/.static un
2380: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 68 6f  signed char *pho
2390: 6e 65 74 69 63 48 61 73 68 28 63 6f 6e 73 74 20  neticHash(const 
23a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
23b0: 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20  In, int nIn){.  
23c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
23d0: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Out = sqlite3_ma
23e0: 6c 6c 6f 63 28 20 6e 49 6e 20 2b 20 31 20 29 3b  lloc( nIn + 1 );
23f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2400: 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  nOut = 0;.  char
2410: 20 63 50 72 65 76 20 3d 20 30 78 37 37 3b 0a 20   cPrev = 0x77;. 
2420: 20 63 68 61 72 20 63 50 72 65 76 58 20 3d 20 30   char cPrevX = 0
2430: 78 37 37 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  x77;.  const uns
2440: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 43 6c 61  igned char *aCla
2450: 73 73 20 3d 20 69 6e 69 74 43 6c 61 73 73 3b 0a  ss = initClass;.
2460: 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29  .  if( zOut==0 )
2470: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
2480: 20 6e 49 6e 3e 32 20 29 7b 0a 20 20 20 20 73 77   nIn>2 ){.    sw
2490: 69 74 63 68 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a  itch( zIn[0] ){.
24a0: 20 20 20 20 20 20 63 61 73 65 20 27 67 27 3a 20        case 'g': 
24b0: 0a 20 20 20 20 20 20 63 61 73 65 20 27 6b 27 3a  .      case 'k':
24c0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   {.        if( z
24d0: 49 6e 5b 31 5d 3d 3d 27 6e 27 20 29 7b 20 7a 49  In[1]=='n' ){ zI
24e0: 6e 2b 2b 3b 20 6e 49 6e 2d 2d 3b 20 7d 0a 20 20  n++; nIn--; }.  
24f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2500: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 3b   for(i=0; i<nIn;
2520: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67   i++){.    unsig
2530: 6e 65 64 20 63 68 61 72 20 63 20 3d 20 7a 49 6e  ned char c = zIn
2540: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69 2b 31  [i];.    if( i+1
2550: 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  <nIn ){.      if
2560: 28 20 63 3d 3d 27 77 27 20 26 26 20 7a 49 6e 5b  ( c=='w' && zIn[
2570: 69 2b 31 5d 3d 3d 27 72 27 20 29 20 63 6f 6e 74  i+1]=='r' ) cont
2580: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
2590: 63 3d 3d 27 64 27 20 26 26 20 28 7a 49 6e 5b 69  c=='d' && (zIn[i
25a0: 2b 31 5d 3d 3d 27 6a 27 20 7c 7c 20 7a 49 6e 5b  +1]=='j' || zIn[
25b0: 69 2b 31 5d 3d 3d 27 67 27 29 20 29 20 63 6f 6e  i+1]=='g') ) con
25c0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
25d0: 20 69 2b 32 3c 6e 49 6e 20 29 7b 0a 20 20 20 20   i+2<nIn ){.    
25e0: 20 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26      if( c=='t' &
25f0: 26 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 63 27 20  & zIn[i+1]=='c' 
2600: 26 26 20 7a 49 6e 5b 69 2b 32 5d 3d 3d 27 68 27  && zIn[i+2]=='h'
2610: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
2630: 20 3d 20 61 43 6c 61 73 73 5b 63 26 30 78 37 66   = aClass[c&0x7f
2640: 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 43 43  ];.    if( c==CC
2650: 4c 41 53 53 5f 53 50 41 43 45 20 29 20 63 6f 6e  LASS_SPACE ) con
2660: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 63  tinue;.    if( c
2670: 3d 3d 43 43 4c 41 53 53 5f 4f 54 48 45 52 20 26  ==CCLASS_OTHER &
2680: 26 20 63 50 72 65 76 21 3d 43 43 4c 41 53 53 5f  & cPrev!=CCLASS_
2690: 44 49 47 49 54 20 29 20 63 6f 6e 74 69 6e 75 65  DIGIT ) continue
26a0: 3b 0a 20 20 20 20 61 43 6c 61 73 73 20 3d 20 6d  ;.    aClass = m
26b0: 69 64 43 6c 61 73 73 3b 0a 20 20 20 20 69 66 28  idClass;.    if(
26c0: 20 63 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c   c==CCLASS_VOWEL
26d0: 20 26 26 20 28 63 50 72 65 76 58 3d 3d 43 43 4c   && (cPrevX==CCL
26e0: 41 53 53 5f 52 20 7c 7c 20 63 50 72 65 76 58 3d  ASS_R || cPrevX=
26f0: 3d 43 43 4c 41 53 53 5f 4c 29 20 29 7b 0a 20 20  =CCLASS_L) ){.  
2700: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f       continue; /
2710: 2a 20 4e 6f 20 76 6f 77 65 6c 73 20 62 65 73 69  * No vowels besi
2720: 64 65 20 4c 20 6f 72 20 52 20 2a 2f 20 0a 20 20  de L or R */ .  
2730: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 63 3d 3d    }.    if( (c==
2740: 43 43 4c 41 53 53 5f 52 20 7c 7c 20 63 3d 3d 43  CCLASS_R || c==C
2750: 43 4c 41 53 53 5f 4c 29 20 26 26 20 63 50 72 65  CLASS_L) && cPre
2760: 76 58 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c  vX==CCLASS_VOWEL
2770: 20 29 7b 0a 20 20 20 20 20 20 20 6e 4f 75 74 2d   ){.       nOut-
2780: 2d 3b 20 20 20 2f 2a 20 4e 6f 20 76 6f 77 65 6c  -;   /* No vowel
2790: 73 20 62 65 73 69 64 65 20 4c 20 6f 72 20 52 20  s beside L or R 
27a0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 50 72  */.    }.    cPr
27b0: 65 76 20 3d 20 63 3b 0a 20 20 20 20 69 66 28 20  ev = c;.    if( 
27c0: 63 3d 3d 43 43 4c 41 53 53 5f 53 49 4c 45 4e 54  c==CCLASS_SILENT
27d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
27e0: 20 63 50 72 65 76 58 20 3d 20 63 3b 0a 20 20 20   cPrevX = c;.   
27f0: 20 63 20 3d 20 63 6c 61 73 73 4e 61 6d 65 5b 63   c = className[c
2800: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ];.    assert( n
2810: 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Out>=0 );.    if
2820: 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 63 21 3d  ( nOut==0 || c!=
2830: 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 29 20 7a  zOut[nOut-1] ) z
2840: 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 63 3b  Out[nOut++] = c;
2850: 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74  .  }.  zOut[nOut
2860: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
2870: 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zOut;.}../*.** T
2880: 68 69 73 20 69 73 20 61 6e 20 53 51 4c 20 66 75  his is an SQL fu
2890: 6e 63 74 69 6f 6e 20 77 72 61 70 70 65 72 20 61  nction wrapper a
28a0: 72 6f 75 6e 64 20 70 68 6f 6e 65 74 69 63 48 61  round phoneticHa
28b0: 73 68 28 29 2e 20 20 53 65 65 0a 2a 2a 20 74 68  sh().  See.** th
28c0: 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
28d0: 20 70 68 6f 6e 65 74 69 63 48 61 73 68 28 29 20   phoneticHash() 
28e0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
28f0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
2900: 74 61 74 69 63 20 76 6f 69 64 20 70 68 6f 6e 65  tatic void phone
2910: 74 69 63 48 61 73 68 53 71 6c 46 75 6e 63 28 0a  ticHashSqlFunc(.
2920: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2930: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
2940: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
2950: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
2960: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
2970: 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a 20 20  ed char *zIn;.  
2980: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2990: 4f 75 74 3b 0a 0a 20 20 7a 49 6e 20 3d 20 73 71  Out;..  zIn = sq
29a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
29b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
29c0: 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e   zIn==0 ) return
29d0: 3b 0a 20 20 7a 4f 75 74 20 3d 20 70 68 6f 6e 65  ;.  zOut = phone
29e0: 74 69 63 48 61 73 68 28 7a 49 6e 2c 20 73 71 6c  ticHash(zIn, sql
29f0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2a00: 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20 69 66  (argv[0]));.  if
2a10: 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  ( zOut==0 ){.   
2a20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2a30: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74  error_nomem(cont
2a40: 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ext);.  }else{. 
2a50: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2a60: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
2a70: 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20 2d 31 2c  (char*)zOut, -1,
2a80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
2a90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
2aa0: 75 72 6e 20 74 68 65 20 63 68 61 72 61 63 74 65  urn the characte
2ab0: 72 20 63 6c 61 73 73 20 6e 75 6d 62 65 72 20 66  r class number f
2ac0: 6f 72 20 61 20 63 68 61 72 61 63 74 65 72 20 67  or a character g
2ad0: 69 76 65 6e 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  iven its.** cont
2ae0: 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ext..*/.static c
2af0: 68 61 72 20 63 68 61 72 61 63 74 65 72 43 6c 61  har characterCla
2b00: 73 73 28 63 68 61 72 20 63 50 72 65 76 2c 20 63  ss(char cPrev, c
2b10: 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75 72 6e  har c){.  return
2b20: 20 63 50 72 65 76 3d 3d 30 20 3f 20 69 6e 69 74   cPrev==0 ? init
2b30: 43 6c 61 73 73 5b 63 26 30 78 37 66 5d 20 3a 20  Class[c&0x7f] : 
2b40: 6d 69 64 43 6c 61 73 73 5b 63 26 30 78 37 66 5d  midClass[c&0x7f]
2b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2b60: 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 69 6e  n the cost of in
2b70: 73 65 72 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  serting or delet
2b80: 69 6e 67 20 63 68 61 72 61 63 74 65 72 20 63 20  ing character c 
2b90: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 66  immediately.** f
2ba0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 61 63 74  ollowing charact
2bb0: 65 72 20 63 50 72 65 76 2e 20 20 49 66 20 63 50  er cPrev.  If cP
2bc0: 72 65 76 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  rev==0, that mea
2bd0: 6e 73 20 63 20 69 73 20 74 68 65 20 66 69 72 73  ns c is the firs
2be0: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 6f  t.** character o
2bf0: 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a 73  f the word..*/.s
2c00: 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74  tatic int insert
2c10: 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63 68 61  OrDeleteCost(cha
2c20: 72 20 63 50 72 65 76 2c 20 63 68 61 72 20 63 2c  r cPrev, char c,
2c30: 20 63 68 61 72 20 63 4e 65 78 74 29 7b 0a 20 20   char cNext){.  
2c40: 63 68 61 72 20 63 6c 61 73 73 43 20 3d 20 63 68  char classC = ch
2c50: 61 72 61 63 74 65 72 43 6c 61 73 73 28 63 50 72  aracterClass(cPr
2c60: 65 76 2c 20 63 29 3b 0a 20 20 63 68 61 72 20 63  ev, c);.  char c
2c70: 6c 61 73 73 43 70 72 65 76 3b 0a 0a 20 20 69 66  lassCprev;..  if
2c80: 28 20 63 6c 61 73 73 43 3d 3d 43 43 4c 41 53 53  ( classC==CCLASS
2c90: 5f 53 49 4c 45 4e 54 20 29 7b 0a 20 20 20 20 2f  _SILENT ){.    /
2ca0: 2a 20 49 6e 73 65 72 74 20 6f 72 20 64 65 6c 65  * Insert or dele
2cb0: 74 65 20 22 73 69 6c 65 6e 74 22 20 63 68 61 72  te "silent" char
2cc0: 61 63 74 65 72 73 20 73 75 63 68 20 61 73 20 48  acters such as H
2cd0: 20 6f 72 20 57 20 2a 2f 0a 20 20 20 20 72 65 74   or W */.    ret
2ce0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2cf0: 20 63 50 72 65 76 3d 3d 63 20 29 7b 0a 20 20 20   cPrev==c ){.   
2d00: 20 2f 2a 20 52 65 70 65 61 74 65 64 20 63 68 61   /* Repeated cha
2d10: 72 61 63 74 65 72 73 2c 20 6f 72 20 6d 69 73 73  racters, or miss
2d20: 20 61 20 72 65 70 65 61 74 20 2a 2f 0a 20 20 20   a repeat */.   
2d30: 20 72 65 74 75 72 6e 20 31 30 3b 0a 20 20 7d 0a   return 10;.  }.
2d40: 20 20 69 66 28 20 63 6c 61 73 73 43 3d 3d 43 43    if( classC==CC
2d50: 4c 41 53 53 5f 56 4f 57 45 4c 20 26 26 20 28 63  LASS_VOWEL && (c
2d60: 50 72 65 76 3d 3d 27 72 27 20 7c 7c 20 63 4e 65  Prev=='r' || cNe
2d70: 78 74 3d 3d 27 72 27 29 20 29 7b 0a 20 20 20 20  xt=='r') ){.    
2d80: 72 65 74 75 72 6e 20 32 30 3b 20 20 2f 2a 20 49  return 20;  /* I
2d90: 6e 73 65 72 74 20 61 20 76 6f 77 65 6c 20 62 65  nsert a vowel be
2da0: 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 27 72  fore or after 'r
2db0: 27 20 2a 2f 0a 20 20 7d 0a 20 20 63 6c 61 73 73  ' */.  }.  class
2dc0: 43 70 72 65 76 20 3d 20 63 68 61 72 61 63 74 65  Cprev = characte
2dd0: 72 43 6c 61 73 73 28 63 50 72 65 76 2c 20 63 50  rClass(cPrev, cP
2de0: 72 65 76 29 3b 0a 20 20 69 66 28 20 63 6c 61 73  rev);.  if( clas
2df0: 73 43 3d 3d 63 6c 61 73 73 43 70 72 65 76 20 29  sC==classCprev )
2e00: 7b 0a 20 20 20 20 69 66 28 20 63 6c 61 73 73 43  {.    if( classC
2e10: 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c 20 29  ==CCLASS_VOWEL )
2e20: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76  {.      /* Remov
2e30: 65 20 6f 72 20 61 64 64 20 61 20 6e 65 77 20 76  e or add a new v
2e40: 6f 77 65 6c 20 74 6f 20 61 20 76 6f 77 65 6c 20  owel to a vowel 
2e50: 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20 20 20 20  cluster */.     
2e60: 20 72 65 74 75 72 6e 20 31 35 3b 0a 20 20 20 20   return 15;.    
2e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2e80: 52 65 6d 6f 76 65 20 6f 72 20 61 64 64 20 61 20  Remove or add a 
2e90: 63 6f 6e 73 6f 6e 61 6e 74 20 6e 6f 74 20 69 6e  consonant not in
2ea0: 20 74 68 65 20 73 61 6d 65 20 63 6c 61 73 73 20   the same class 
2eb0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
2ec0: 35 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  50;.    }.  }.. 
2ed0: 20 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20 63 68   /* any other ch
2ee0: 61 72 61 63 74 65 72 20 69 6e 73 65 72 74 69 6f  aracter insertio
2ef0: 6e 20 6f 72 20 64 65 6c 65 74 69 6f 6e 20 2a 2f  n or deletion */
2f00: 0a 20 20 72 65 74 75 72 6e 20 31 30 30 3b 0a 7d  .  return 100;.}
2f10: 0a 0a 2f 2a 0a 2a 2a 20 44 69 76 69 64 65 20 74  ../*.** Divide t
2f20: 68 65 20 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73  he insertion cos
2f30: 74 20 62 79 20 74 68 69 73 20 66 61 63 74 6f 72  t by this factor
2f40: 20 77 68 65 6e 20 61 70 70 65 6e 64 69 6e 67 20   when appending 
2f50: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
2f60: 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a 23 64   the word..*/.#d
2f70: 65 66 69 6e 65 20 46 49 4e 41 4c 5f 49 4e 53 5f  efine FINAL_INS_
2f80: 43 4f 53 54 5f 44 49 56 20 20 34 0a 0a 2f 2a 0a  COST_DIV  4../*.
2f90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
2fa0: 73 74 20 6f 66 20 73 75 62 73 74 69 74 75 74 69  st of substituti
2fb0: 6e 67 20 63 54 6f 20 69 6e 20 70 6c 61 63 65 20  ng cTo in place 
2fc0: 6f 66 20 63 46 72 6f 6d 20 61 73 73 75 6d 69 6e  of cFrom assumin
2fd0: 67 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  g.** the previou
2fe0: 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20 63  s character is c
2ff0: 50 72 65 76 2e 20 20 49 66 20 63 50 72 65 76 3d  Prev.  If cPrev=
3000: 3d 30 20 74 68 65 6e 20 63 54 6f 20 69 73 20 74  =0 then cTo is t
3010: 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 68 61 72  he first.** char
3020: 61 63 74 65 72 20 6f 66 20 74 68 65 20 77 6f 72  acter of the wor
3030: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
3040: 20 73 75 62 73 74 69 74 75 74 65 43 6f 73 74 28   substituteCost(
3050: 63 68 61 72 20 63 50 72 65 76 2c 20 63 68 61 72  char cPrev, char
3060: 20 63 46 72 6f 6d 2c 20 63 68 61 72 20 63 54 6f   cFrom, char cTo
3070: 29 7b 0a 20 20 63 68 61 72 20 63 6c 61 73 73 46  ){.  char classF
3080: 72 6f 6d 2c 20 63 6c 61 73 73 54 6f 3b 0a 20 20  rom, classTo;.  
3090: 69 66 28 20 63 46 72 6f 6d 3d 3d 63 54 6f 20 29  if( cFrom==cTo )
30a0: 7b 0a 20 20 20 20 2f 2a 20 45 78 61 63 74 20 6d  {.    /* Exact m
30b0: 61 74 63 68 20 2a 2f 0a 20 20 20 20 72 65 74 75  atch */.    retu
30c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
30d0: 63 46 72 6f 6d 3d 3d 28 63 54 6f 5e 30 78 32 30  cFrom==(cTo^0x20
30e0: 29 20 26 26 20 28 28 63 54 6f 3e 3d 27 41 27 20  ) && ((cTo>='A' 
30f0: 26 26 20 63 54 6f 3c 3d 27 5a 27 29 20 7c 7c 20  && cTo<='Z') || 
3100: 28 63 54 6f 3e 3d 27 61 27 20 26 26 20 63 54 6f  (cTo>='a' && cTo
3110: 3c 3d 27 7a 27 29 29 20 29 7b 0a 20 20 20 20 2f  <='z')) ){.    /
3120: 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e  * differ only in
3130: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 72 65 74   case */.    ret
3140: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63 6c 61  urn 0;.  }.  cla
3150: 73 73 46 72 6f 6d 20 3d 20 63 68 61 72 61 63 74  ssFrom = charact
3160: 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c 20 63  erClass(cPrev, c
3170: 46 72 6f 6d 29 3b 0a 20 20 63 6c 61 73 73 54 6f  From);.  classTo
3180: 20 3d 20 63 68 61 72 61 63 74 65 72 43 6c 61 73   = characterClas
3190: 73 28 63 50 72 65 76 2c 20 63 54 6f 29 3b 0a 20  s(cPrev, cTo);. 
31a0: 20 69 66 28 20 63 6c 61 73 73 46 72 6f 6d 3d 3d   if( classFrom==
31b0: 63 6c 61 73 73 54 6f 20 29 7b 0a 20 20 20 20 2f  classTo ){.    /
31c0: 2a 20 53 61 6d 65 20 63 68 61 72 61 63 74 65 72  * Same character
31d0: 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 72 65   class */.    re
31e0: 74 75 72 6e 20 34 30 3b 0a 20 20 7d 0a 20 20 69  turn 40;.  }.  i
31f0: 66 28 20 63 6c 61 73 73 46 72 6f 6d 3e 3d 43 43  f( classFrom>=CC
3200: 4c 41 53 53 5f 42 20 26 26 20 63 6c 61 73 73 46  LASS_B && classF
3210: 72 6f 6d 3c 3d 43 43 4c 41 53 53 5f 59 0a 20 20  rom<=CCLASS_Y.  
3220: 20 20 20 20 26 26 20 63 6c 61 73 73 54 6f 3e 3d      && classTo>=
3230: 43 43 4c 41 53 53 5f 42 20 26 26 20 63 6c 61 73  CCLASS_B && clas
3240: 73 54 6f 3c 3d 43 43 4c 41 53 53 5f 59 20 29 7b  sTo<=CCLASS_Y ){
3250: 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
3260: 66 72 6f 6d 20 6f 6e 65 20 63 6f 6e 73 6f 6e 61  from one consona
3270: 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72 2c 20 62  nt to another, b
3280: 75 74 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  ut in a differen
3290: 74 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20 72  t class */.    r
32a0: 65 74 75 72 6e 20 37 35 3b 0a 20 20 7d 0a 20 20  eturn 75;.  }.  
32b0: 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 73 75 62  /* Any other sub
32c0: 73 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 72 65  sitution */.  re
32d0: 74 75 72 6e 20 31 30 30 3b 0a 7d 0a 0a 2f 2a 0a  turn 100;.}../*.
32e0: 2a 2a 20 47 69 76 65 6e 20 74 77 6f 20 73 74 72  ** Given two str
32f0: 69 6e 67 73 20 7a 41 20 61 6e 64 20 7a 42 20 77  ings zA and zB w
3300: 68 69 63 68 20 61 72 65 20 70 75 72 65 20 41 53  hich are pure AS
3310: 43 49 49 2c 20 72 65 74 75 72 6e 20 74 68 65 20  CII, return the 
3320: 63 6f 73 74 0a 2a 2a 20 6f 66 20 74 72 61 6e 73  cost.** of trans
3330: 66 6f 72 6d 69 6e 67 20 7a 41 20 69 6e 74 6f 20  forming zA into 
3340: 7a 42 2e 20 20 49 66 20 7a 41 20 65 6e 64 73 20  zB.  If zA ends 
3350: 77 69 74 68 20 27 2a 27 20 61 73 73 75 6d 65 20  with '*' assume 
3360: 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 61 20  that it is.** a 
3370: 70 72 65 66 69 78 20 6f 66 20 7a 42 20 61 6e 64  prefix of zB and
3380: 20 67 69 76 65 20 6f 6e 6c 79 20 6d 69 6e 69 6d   give only minim
3390: 61 6c 20 70 65 6e 61 6c 74 79 20 66 6f 72 20 65  al penalty for e
33a0: 78 74 72 61 20 63 68 61 72 61 63 74 65 72 73 0a  xtra characters.
33b0: 2a 2a 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66  ** on the end of
33c0: 20 7a 42 2e 0a 2a 2a 0a 2a 2a 20 53 6d 61 6c 6c   zB..**.** Small
33d0: 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 61 6e 20  er numbers mean 
33e0: 61 20 63 6c 6f 73 65 72 20 6d 61 74 63 68 2e 0a  a closer match..
33f0: 2a 2a 0a 2a 2a 20 4e 65 67 61 74 69 76 65 20 76  **.** Negative v
3400: 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 61  alues indicate a
3410: 6e 20 65 72 72 6f 72 3a 0a 2a 2a 20 20 20 20 2d  n error:.**    -
3420: 31 20 20 4f 6e 65 20 6f 66 20 74 68 65 20 69 6e  1  One of the in
3430: 70 75 74 73 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  puts is NULL.** 
3440: 20 20 20 2d 32 20 20 4e 6f 6e 2d 41 53 43 49 49     -2  Non-ASCII
3450: 20 63 68 61 72 61 63 74 65 72 73 20 6f 6e 20 69   characters on i
3460: 6e 70 75 74 0a 2a 2a 20 20 20 20 2d 33 20 20 55  nput.**    -3  U
3470: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
3480: 65 20 6d 65 6d 6f 72 79 20 0a 2a 2a 0a 2a 2a 20  e memory .**.** 
3490: 49 66 20 70 6e 4d 61 74 63 68 20 69 73 20 6e 6f  If pnMatch is no
34a0: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a 70 6e  t NULL, then *pn
34b0: 4d 61 74 63 68 20 69 73 20 73 65 74 20 74 6f 20  Match is set to 
34c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
34d0: 74 65 73 0a 2a 2a 20 6f 66 20 7a 42 20 74 68 61  tes.** of zB tha
34e0: 74 20 6d 61 74 63 68 65 64 20 74 68 65 20 70 61  t matched the pa
34f0: 74 74 65 72 6e 20 69 6e 20 7a 41 2e 20 49 66 20  ttern in zA. If 
3500: 7a 41 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  zA does not end 
3510: 77 69 74 68 20 61 20 27 2a 27 2c 0a 2a 2a 20 74  with a '*',.** t
3520: 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65 20 69  hen this value i
3530: 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e 75 6d  s always the num
3540: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
3550: 7a 42 20 28 69 2e 65 2e 20 73 74 72 6c 65 6e 28  zB (i.e. strlen(
3560: 7a 42 29 29 2e 0a 2a 2a 20 49 66 20 7a 41 20 64  zB))..** If zA d
3570: 6f 65 73 20 65 6e 64 20 69 6e 20 61 20 27 2a 27  oes end in a '*'
3580: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
3590: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
35a0: 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 0a 2a   in the prefix.*
35b0: 2a 20 6f 66 20 7a 42 20 74 68 61 74 20 77 61 73  * of zB that was
35c0: 20 64 65 65 6d 65 64 20 74 6f 20 6d 61 74 63 68   deemed to match
35d0: 20 7a 41 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   zA..*/.static i
35e0: 6e 74 20 65 64 69 74 64 69 73 74 31 28 63 6f 6e  nt editdist1(con
35f0: 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e  st char *zA, con
3600: 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 69 6e 74  st char *zB, int
3610: 20 2a 70 6e 4d 61 74 63 68 29 7b 0a 20 20 69 6e   *pnMatch){.  in
3620: 74 20 6e 41 2c 20 6e 42 3b 20 20 20 20 20 20 20  t nA, nB;       
3630: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3640: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
3650: 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a 2f  zA[] and zB[] */
3660: 0a 20 20 69 6e 74 20 78 41 2c 20 78 42 3b 20 20  .  int xA, xB;  
3670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3680: 70 20 63 6f 75 6e 74 65 72 73 20 66 6f 72 20 7a  p counters for z
3690: 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a 2f 0a  A[] and zB[] */.
36a0: 20 20 63 68 61 72 20 63 41 2c 20 63 42 3b 20 20    char cA, cB;  
36b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
36c0: 65 6e 74 20 63 68 61 72 61 63 74 65 72 20 6f 66  ent character of
36d0: 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20 20   zA and zB */.  
36e0: 63 68 61 72 20 63 41 70 72 65 76 2c 20 63 42 70  char cAprev, cBp
36f0: 72 65 76 3b 20 20 20 2f 2a 20 50 72 65 76 69 6f  rev;   /* Previo
3700: 75 73 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  us character of 
3710: 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20 20 63  zA and zB */.  c
3720: 68 61 72 20 63 41 6e 65 78 74 2c 20 63 42 6e 65  har cAnext, cBne
3730: 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 63 68  xt;   /* Next ch
3740: 61 72 61 63 74 65 72 20 69 6e 20 7a 41 20 61 6e  aracter in zA an
3750: 64 20 7a 42 20 2a 2f 0a 20 20 69 6e 74 20 64 3b  d zB */.  int d;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 2f 2a 20 4e 6f 72 74 68 2d 77 65 73 74 20 63   /* North-west c
3780: 6f 73 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  ost value */.  i
3790: 6e 74 20 64 63 20 3d 20 30 3b 20 20 20 20 20 20  nt dc = 0;      
37a0: 20 20 20 20 20 20 2f 2a 20 4e 6f 72 74 68 2d 77        /* North-w
37b0: 65 73 74 20 63 68 61 72 61 63 74 65 72 20 76 61  est character va
37c0: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  lue */.  int res
37d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37e0: 2f 2a 20 46 69 6e 61 6c 20 72 65 73 75 6c 74 20  /* Final result 
37f0: 2a 2f 0a 20 20 69 6e 74 20 2a 6d 3b 20 20 20 20  */.  int *m;    
3800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3810: 68 65 20 63 6f 73 74 20 6d 61 74 72 69 78 20 2a  he cost matrix *
3820: 2f 0a 20 20 63 68 61 72 20 2a 63 78 3b 20 20 20  /.  char *cx;   
3830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3840: 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68 61 72  rresponding char
3850: 61 63 74 65 72 20 76 61 6c 75 65 73 20 2a 2f 0a  acter values */.
3860: 20 20 69 6e 74 20 2a 74 6f 46 72 65 65 20 3d 20    int *toFree = 
3870: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 6c 6c  0;       /* Mall
3880: 6f 63 65 64 20 73 70 61 63 65 20 2a 2f 0a 20 20  oced space */.  
3890: 69 6e 74 20 6d 53 74 61 63 6b 5b 36 30 2b 31 35  int mStack[60+15
38a0: 5d 3b 20 20 20 20 20 2f 2a 20 53 74 61 63 6b 20  ];     /* Stack 
38b0: 73 70 61 63 65 20 74 6f 20 75 73 65 20 69 66 20  space to use if 
38c0: 6e 6f 74 20 74 6f 6f 20 6d 75 63 68 20 69 73 20  not too much is 
38d0: 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  needed */.  int 
38e0: 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 0a 20 20 2f  nMatch = 0;..  /
38f0: 2a 20 45 61 72 6c 79 20 6f 75 74 20 69 66 20 65  * Early out if e
3900: 69 74 68 65 72 20 69 6e 70 75 74 20 69 73 20 4e  ither input is N
3910: 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 7a 41 3d  ULL */.  if( zA=
3920: 3d 30 20 7c 7c 20 7a 42 3d 3d 30 20 29 20 72 65  =0 || zB==0 ) re
3930: 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 2f 2a 20 53  turn -1;..  /* S
3940: 6b 69 70 20 61 6e 79 20 63 6f 6d 6d 6f 6e 20 70  kip any common p
3950: 72 65 66 69 78 20 2a 2f 0a 20 20 77 68 69 6c 65  refix */.  while
3960: 28 20 7a 41 5b 30 5d 20 26 26 20 7a 41 5b 30 5d  ( zA[0] && zA[0]
3970: 3d 3d 7a 42 5b 30 5d 20 29 7b 20 64 63 20 3d 20  ==zB[0] ){ dc = 
3980: 7a 41 5b 30 5d 3b 20 7a 41 2b 2b 3b 20 7a 42 2b  zA[0]; zA++; zB+
3990: 2b 3b 20 6e 4d 61 74 63 68 2b 2b 3b 20 7d 0a 20  +; nMatch++; }. 
39a0: 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29 20 2a   if( pnMatch ) *
39b0: 70 6e 4d 61 74 63 68 20 3d 20 6e 4d 61 74 63 68  pnMatch = nMatch
39c0: 3b 0a 20 20 69 66 28 20 7a 41 5b 30 5d 3d 3d 30  ;.  if( zA[0]==0
39d0: 20 26 26 20 7a 42 5b 30 5d 3d 3d 30 20 29 20 72   && zB[0]==0 ) r
39e0: 65 74 75 72 6e 20 30 3b 0a 0a 23 69 66 20 30 0a  eturn 0;..#if 0.
39f0: 20 20 70 72 69 6e 74 66 28 22 41 3d 5c 22 25 73    printf("A=\"%s
3a00: 5c 22 20 42 3d 5c 22 25 73 5c 22 20 64 63 3d 25  \" B=\"%s\" dc=%
3a10: 63 5c 6e 22 2c 20 7a 41 2c 20 7a 42 2c 20 64 63  c\n", zA, zB, dc
3a20: 3f 64 63 3a 27 20 27 29 3b 0a 23 65 6e 64 69 66  ?dc:' ');.#endif
3a30: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 69 6e  ..  /* Verify in
3a40: 70 75 74 20 73 74 72 69 6e 67 73 20 61 6e 64 20  put strings and 
3a50: 6d 65 61 73 75 72 65 20 74 68 65 69 72 20 6c 65  measure their le
3a60: 6e 67 74 68 73 20 2a 2f 0a 20 20 66 6f 72 28 6e  ngths */.  for(n
3a70: 41 3d 30 3b 20 7a 41 5b 6e 41 5d 3b 20 6e 41 2b  A=0; zA[nA]; nA+
3a80: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 41 5b 6e  +){.    if( zA[n
3a90: 41 5d 26 30 78 38 30 20 29 20 72 65 74 75 72 6e  A]&0x80 ) return
3aa0: 20 2d 32 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e   -2;.  }.  for(n
3ab0: 42 3d 30 3b 20 7a 42 5b 6e 42 5d 3b 20 6e 42 2b  B=0; zB[nB]; nB+
3ac0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 42 5b 6e  +){.    if( zB[n
3ad0: 42 5d 26 30 78 38 30 20 29 20 72 65 74 75 72 6e  B]&0x80 ) return
3ae0: 20 2d 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   -2;.  }..  /* S
3af0: 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
3b00: 67 20 69 66 20 65 69 74 68 65 72 20 73 74 72 69  g if either stri
3b10: 6e 67 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20  ng is empty */. 
3b20: 20 69 66 28 20 6e 41 3d 3d 30 20 29 7b 0a 20 20   if( nA==0 ){.  
3b30: 20 20 63 42 70 72 65 76 20 3d 20 64 63 3b 0a 20    cBprev = dc;. 
3b40: 20 20 20 66 6f 72 28 78 42 3d 72 65 73 3d 30 3b     for(xB=res=0;
3b50: 20 28 63 42 20 3d 20 7a 42 5b 78 42 5d 29 21 3d   (cB = zB[xB])!=
3b60: 30 3b 20 78 42 2b 2b 29 7b 0a 20 20 20 20 20 20  0; xB++){.      
3b70: 72 65 73 20 2b 3d 20 69 6e 73 65 72 74 4f 72 44  res += insertOrD
3b80: 65 6c 65 74 65 43 6f 73 74 28 63 42 70 72 65 76  eleteCost(cBprev
3b90: 2c 20 63 42 2c 20 7a 42 5b 78 42 2b 31 5d 29 2f  , cB, zB[xB+1])/
3ba0: 46 49 4e 41 4c 5f 49 4e 53 5f 43 4f 53 54 5f 44  FINAL_INS_COST_D
3bb0: 49 56 3b 0a 20 20 20 20 20 20 63 42 70 72 65 76  IV;.      cBprev
3bc0: 20 3d 20 63 42 3b 0a 20 20 20 20 7d 0a 20 20 20   = cB;.    }.   
3bd0: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d   return res;.  }
3be0: 0a 20 20 69 66 28 20 6e 42 3d 3d 30 20 29 7b 0a  .  if( nB==0 ){.
3bf0: 20 20 20 20 63 41 70 72 65 76 20 3d 20 64 63 3b      cAprev = dc;
3c00: 0a 20 20 20 20 66 6f 72 28 78 41 3d 72 65 73 3d  .    for(xA=res=
3c10: 30 3b 20 28 63 41 20 3d 20 7a 41 5b 78 41 5d 29  0; (cA = zA[xA])
3c20: 21 3d 30 3b 20 78 41 2b 2b 29 7b 0a 20 20 20 20  !=0; xA++){.    
3c30: 20 20 72 65 73 20 2b 3d 20 69 6e 73 65 72 74 4f    res += insertO
3c40: 72 44 65 6c 65 74 65 43 6f 73 74 28 63 41 70 72  rDeleteCost(cApr
3c50: 65 76 2c 20 63 41 2c 20 7a 41 5b 78 41 2b 31 5d  ev, cA, zA[xA+1]
3c60: 29 3b 0a 20 20 20 20 20 20 63 41 70 72 65 76 20  );.      cAprev 
3c70: 3d 20 63 41 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = cA;.    }.    
3c80: 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d 0a  return res;.  }.
3c90: 0a 20 20 2f 2a 20 41 20 69 73 20 61 20 70 72 65  .  /* A is a pre
3ca0: 66 69 78 20 6f 66 20 42 20 2a 2f 0a 20 20 69 66  fix of B */.  if
3cb0: 28 20 7a 41 5b 30 5d 3d 3d 27 2a 27 20 26 26 20  ( zA[0]=='*' && 
3cc0: 7a 41 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75 72  zA[1]==0 ) retur
3cd0: 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  n 0;..  /* Alloc
3ce0: 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
3cf0: 7a 65 20 74 68 65 20 57 61 67 6e 65 72 20 6d 61  ze the Wagner ma
3d00: 74 72 69 78 20 2a 2f 0a 20 20 69 66 28 20 6e 42  trix */.  if( nB
3d10: 3c 28 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b 29  <(sizeof(mStack)
3d20: 2a 34 29 2f 28 73 69 7a 65 6f 66 28 6d 53 74 61  *4)/(sizeof(mSta
3d30: 63 6b 5b 30 5d 29 2a 35 29 20 29 7b 0a 20 20 20  ck[0])*5) ){.   
3d40: 20 6d 20 3d 20 6d 53 74 61 63 6b 3b 0a 20 20 7d   m = mStack;.  }
3d50: 65 6c 73 65 7b 0a 20 20 20 20 6d 20 3d 20 74 6f  else{.    m = to
3d60: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Free = sqlite3_m
3d70: 61 6c 6c 6f 63 28 20 28 6e 42 2b 31 29 2a 35 2a  alloc( (nB+1)*5*
3d80: 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 2f 34 20 29  sizeof(m[0])/4 )
3d90: 3b 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29  ;.    if( m==0 )
3da0: 20 72 65 74 75 72 6e 20 2d 33 3b 0a 20 20 7d 0a   return -3;.  }.
3db0: 20 20 63 78 20 3d 20 28 63 68 61 72 2a 29 26 6d    cx = (char*)&m
3dc0: 5b 6e 42 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 43 6f  [nB+1];..  /* Co
3dd0: 6d 70 75 74 65 20 74 68 65 20 57 61 67 6e 65 72  mpute the Wagner
3de0: 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 2a   edit distance *
3df0: 2f 0a 20 20 6d 5b 30 5d 20 3d 20 30 3b 0a 20 20  /.  m[0] = 0;.  
3e00: 63 78 5b 30 5d 20 3d 20 64 63 3b 0a 20 20 63 42  cx[0] = dc;.  cB
3e10: 70 72 65 76 20 3d 20 64 63 3b 0a 20 20 66 6f 72  prev = dc;.  for
3e20: 28 78 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78  (xB=1; xB<=nB; x
3e30: 42 2b 2b 29 7b 0a 20 20 20 20 63 42 6e 65 78 74  B++){.    cBnext
3e40: 20 3d 20 7a 42 5b 78 42 5d 3b 0a 20 20 20 20 63   = zB[xB];.    c
3e50: 42 20 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20  B = zB[xB-1];.  
3e60: 20 20 63 78 5b 78 42 5d 20 3d 20 63 42 3b 0a 20    cx[xB] = cB;. 
3e70: 20 20 20 6d 5b 78 42 5d 20 3d 20 6d 5b 78 42 2d     m[xB] = m[xB-
3e80: 31 5d 20 2b 20 69 6e 73 65 72 74 4f 72 44 65 6c  1] + insertOrDel
3e90: 65 74 65 43 6f 73 74 28 63 42 70 72 65 76 2c 20  eteCost(cBprev, 
3ea0: 63 42 2c 20 63 42 6e 65 78 74 29 3b 0a 20 20 20  cB, cBnext);.   
3eb0: 20 63 42 70 72 65 76 20 3d 20 63 42 3b 0a 20 20   cBprev = cB;.  
3ec0: 7d 0a 20 20 63 41 70 72 65 76 20 3d 20 64 63 3b  }.  cAprev = dc;
3ed0: 0a 20 20 66 6f 72 28 78 41 3d 31 3b 20 78 41 3c  .  for(xA=1; xA<
3ee0: 3d 6e 41 3b 20 78 41 2b 2b 29 7b 0a 20 20 20 20  =nA; xA++){.    
3ef0: 69 6e 74 20 6c 61 73 74 41 20 3d 20 28 78 41 3d  int lastA = (xA=
3f00: 3d 6e 41 29 3b 0a 20 20 20 20 63 41 20 3d 20 7a  =nA);.    cA = z
3f10: 41 5b 78 41 2d 31 5d 3b 0a 20 20 20 20 63 41 6e  A[xA-1];.    cAn
3f20: 65 78 74 20 3d 20 7a 41 5b 78 41 5d 3b 0a 20 20  ext = zA[xA];.  
3f30: 20 20 69 66 28 20 63 41 3d 3d 27 2a 27 20 26 26    if( cA=='*' &&
3f40: 20 6c 61 73 74 41 20 29 20 62 72 65 61 6b 3b 0a   lastA ) break;.
3f50: 20 20 20 20 64 20 3d 20 6d 5b 30 5d 3b 0a 20 20      d = m[0];.  
3f60: 20 20 64 63 20 3d 20 63 78 5b 30 5d 3b 0a 20 20    dc = cx[0];.  
3f70: 20 20 6d 5b 30 5d 20 3d 20 64 20 2b 20 69 6e 73    m[0] = d + ins
3f80: 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28  ertOrDeleteCost(
3f90: 63 41 70 72 65 76 2c 20 63 41 2c 20 63 41 6e 65  cAprev, cA, cAne
3fa0: 78 74 29 3b 0a 20 20 20 20 63 42 70 72 65 76 20  xt);.    cBprev 
3fb0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 78 42 3d  = 0;.    for(xB=
3fc0: 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b 2b 29  1; xB<=nB; xB++)
3fd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 74 61  {.      int tota
3fe0: 6c 43 6f 73 74 2c 20 69 6e 73 43 6f 73 74 2c 20  lCost, insCost, 
3ff0: 64 65 6c 43 6f 73 74 2c 20 73 75 62 43 6f 73 74  delCost, subCost
4000: 2c 20 6e 63 78 3b 0a 20 20 20 20 20 20 63 42 20  , ncx;.      cB 
4010: 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20 20 20  = zB[xB-1];.    
4020: 20 20 63 42 6e 65 78 74 20 3d 20 7a 42 5b 78 42    cBnext = zB[xB
4030: 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 73  ];..      /* Cos
4040: 74 20 74 6f 20 69 6e 73 65 72 74 20 63 42 20 2a  t to insert cB *
4050: 2f 0a 20 20 20 20 20 20 69 6e 73 43 6f 73 74 20  /.      insCost 
4060: 3d 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65  = insertOrDelete
4070: 43 6f 73 74 28 63 78 5b 78 42 2d 31 5d 2c 20 63  Cost(cx[xB-1], c
4080: 42 2c 20 63 42 6e 65 78 74 29 3b 0a 20 20 20 20  B, cBnext);.    
4090: 20 20 69 66 28 20 6c 61 73 74 41 20 29 20 69 6e    if( lastA ) in
40a0: 73 43 6f 73 74 20 2f 3d 20 46 49 4e 41 4c 5f 49  sCost /= FINAL_I
40b0: 4e 53 5f 43 4f 53 54 5f 44 49 56 3b 0a 0a 20 20  NS_COST_DIV;..  
40c0: 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f 20 64      /* Cost to d
40d0: 65 6c 65 74 65 20 63 41 20 2a 2f 0a 20 20 20 20  elete cA */.    
40e0: 20 20 64 65 6c 43 6f 73 74 20 3d 20 69 6e 73 65    delCost = inse
40f0: 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63  rtOrDeleteCost(c
4100: 78 5b 78 42 5d 2c 20 63 41 2c 20 63 42 6e 65 78  x[xB], cA, cBnex
4110: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  t);..      /* Co
4120: 73 74 20 74 6f 20 73 75 62 73 74 69 74 75 74 65  st to substitute
4130: 20 63 41 2d 3e 63 42 20 2a 2f 0a 20 20 20 20 20   cA->cB */.     
4140: 20 73 75 62 43 6f 73 74 20 3d 20 73 75 62 73 74   subCost = subst
4150: 69 74 75 74 65 43 6f 73 74 28 63 78 5b 78 42 2d  ituteCost(cx[xB-
4160: 31 5d 2c 20 63 41 2c 20 63 42 29 3b 0a 0a 20 20  1], cA, cB);..  
4170: 20 20 20 20 2f 2a 20 42 65 73 74 20 63 6f 73 74      /* Best cost
4180: 20 2a 2f 0a 20 20 20 20 20 20 74 6f 74 61 6c 43   */.      totalC
4190: 6f 73 74 20 3d 20 69 6e 73 43 6f 73 74 20 2b 20  ost = insCost + 
41a0: 6d 5b 78 42 2d 31 5d 3b 0a 20 20 20 20 20 20 6e  m[xB-1];.      n
41b0: 63 78 20 3d 20 63 42 3b 0a 20 20 20 20 20 20 69  cx = cB;.      i
41c0: 66 28 20 28 64 65 6c 43 6f 73 74 20 2b 20 6d 5b  f( (delCost + m[
41d0: 78 42 5d 29 3c 74 6f 74 61 6c 43 6f 73 74 20 29  xB])<totalCost )
41e0: 7b 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c 43  {.        totalC
41f0: 6f 73 74 20 3d 20 64 65 6c 43 6f 73 74 20 2b 20  ost = delCost + 
4200: 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20 20 20 6e  m[xB];.        n
4210: 63 78 20 3d 20 63 41 3b 0a 20 20 20 20 20 20 7d  cx = cA;.      }
4220: 0a 20 20 20 20 20 20 69 66 28 20 28 73 75 62 43  .      if( (subC
4230: 6f 73 74 20 2b 20 64 29 3c 74 6f 74 61 6c 43 6f  ost + d)<totalCo
4240: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f  st ){.        to
4250: 74 61 6c 43 6f 73 74 20 3d 20 73 75 62 43 6f 73  talCost = subCos
4260: 74 20 2b 20 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t + d;.      }..
4270: 23 69 66 20 30 0a 20 20 20 20 20 20 70 72 69 6e  #if 0.      prin
4280: 74 66 28 22 25 64 2c 25 64 20 64 3d 25 34 64 20  tf("%d,%d d=%4d 
4290: 75 3d 25 34 64 20 72 3d 25 34 64 20 64 63 3d 25  u=%4d r=%4d dc=%
42a0: 63 20 63 41 3d 25 63 20 63 42 3d 25 63 22 0a 20  c cA=%c cB=%c". 
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 69 6e              " in
42c0: 73 3d 25 34 64 20 64 65 6c 3d 25 34 64 20 73 75  s=%4d del=%4d su
42d0: 62 3d 25 34 64 20 74 3d 25 34 64 20 6e 63 78 3d  b=%4d t=%4d ncx=
42e0: 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %c\n",.         
42f0: 20 20 20 20 78 41 2c 20 78 42 2c 20 64 2c 20 6d      xA, xB, d, m
4300: 5b 78 42 5d 2c 20 6d 5b 78 42 2d 31 5d 2c 20 64  [xB], m[xB-1], d
4310: 63 3f 64 63 3a 27 20 27 2c 20 63 41 2c 20 63 42  c?dc:' ', cA, cB
4320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 69  ,.             i
4330: 6e 73 43 6f 73 74 2c 20 64 65 6c 43 6f 73 74 2c  nsCost, delCost,
4340: 20 73 75 62 43 6f 73 74 2c 20 74 6f 74 61 6c 43   subCost, totalC
4350: 6f 73 74 2c 20 6e 63 78 3f 6e 63 78 3a 27 20 27  ost, ncx?ncx:' '
4360: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
4370: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6d   /* Update the m
4380: 61 74 72 69 78 20 2a 2f 0a 20 20 20 20 20 20 64  atrix */.      d
4390: 20 3d 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20   = m[xB];.      
43a0: 64 63 20 3d 20 63 78 5b 78 42 5d 3b 0a 20 20 20  dc = cx[xB];.   
43b0: 20 20 20 6d 5b 78 42 5d 20 3d 20 74 6f 74 61 6c     m[xB] = total
43c0: 43 6f 73 74 3b 0a 20 20 20 20 20 20 63 78 5b 78  Cost;.      cx[x
43d0: 42 5d 20 3d 20 6e 63 78 3b 0a 20 20 20 20 20 20  B] = ncx;.      
43e0: 63 42 70 72 65 76 20 3d 20 63 42 3b 0a 20 20 20  cBprev = cB;.   
43f0: 20 7d 0a 20 20 20 20 63 41 70 72 65 76 20 3d 20   }.    cAprev = 
4400: 63 41 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72  cA;.  }..  /* Fr
4410: 65 65 20 74 68 65 20 77 61 67 6e 65 72 20 6d 61  ee the wagner ma
4420: 74 72 69 78 20 61 6e 64 20 72 65 74 75 72 6e 20  trix and return 
4430: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
4440: 69 66 28 20 63 41 3d 3d 27 2a 27 20 29 7b 0a 20  if( cA=='*' ){. 
4450: 20 20 20 72 65 73 20 3d 20 6d 5b 31 5d 3b 0a 20     res = m[1];. 
4460: 20 20 20 66 6f 72 28 78 42 3d 31 3b 20 78 42 3c     for(xB=1; xB<
4470: 3d 6e 42 3b 20 78 42 2b 2b 29 7b 0a 20 20 20 20  =nB; xB++){.    
4480: 20 20 69 66 28 20 6d 5b 78 42 5d 3c 72 65 73 20    if( m[xB]<res 
4490: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
44a0: 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20 20 20   m[xB];.        
44b0: 69 66 28 20 70 6e 4d 61 74 63 68 20 29 20 2a 70  if( pnMatch ) *p
44c0: 6e 4d 61 74 63 68 20 3d 20 78 42 2b 6e 4d 61 74  nMatch = xB+nMat
44d0: 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ch;.      }.    
44e0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
44f0: 65 73 20 3d 20 6d 5b 6e 42 5d 3b 0a 20 20 20 20  es = m[nB];.    
4500: 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  /* In the curren
4510: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
4520: 2c 20 70 6e 4d 61 74 63 68 20 69 73 20 61 6c 77  , pnMatch is alw
4530: 61 79 73 20 4e 55 4c 4c 20 69 66 20 7a 41 20 64  ays NULL if zA d
4540: 6f 65 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  oes.    ** not e
4550: 6e 64 20 69 6e 20 22 2a 22 20 2a 2f 0a 20 20 20  nd in "*" */.   
4560: 20 61 73 73 65 72 74 28 20 70 6e 4d 61 74 63 68   assert( pnMatch
4570: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ==0 );.  }.  sql
4580: 69 74 65 33 5f 66 72 65 65 28 74 6f 46 72 65 65  ite3_free(toFree
4590: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
45a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
45b0: 6f 6e 3a 20 20 20 20 65 64 69 74 64 69 73 74 28  on:    editdist(
45c0: 41 2c 42 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  A,B).**.** Retur
45d0: 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 72  n the cost of tr
45e0: 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74 72 69 6e  ansforming strin
45f0: 67 20 41 20 69 6e 74 6f 20 73 74 72 69 6e 67 20  g A into string 
4600: 42 2e 20 20 42 6f 74 68 20 73 74 72 69 6e 67 73  B.  Both strings
4610: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 70 75 72 65  .** must be pure
4620: 20 41 53 43 49 49 20 74 65 78 74 2e 20 20 49 66   ASCII text.  If
4630: 20 41 20 65 6e 64 73 20 77 69 74 68 20 27 2a 27   A ends with '*'
4640: 20 74 68 65 6e 20 69 74 20 69 73 20 61 73 73 75   then it is assu
4650: 6d 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 70  med to be.** a p
4660: 72 65 66 69 78 20 6f 66 20 42 20 61 6e 64 20 65  refix of B and e
4670: 78 74 72 61 20 63 68 61 72 61 63 74 65 72 73 20  xtra characters 
4680: 6f 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 42 20  on the end of B 
4690: 68 61 76 65 20 6d 69 6e 69 6d 61 6c 20 61 64 64  have minimal add
46a0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 63 6f 73 74 2e  itional.** cost.
46b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
46c0: 65 64 69 74 64 69 73 74 53 71 6c 46 75 6e 63 28  editdistSqlFunc(
46d0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
46e0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
46f0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
4700: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
4710: 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 65  ){.  int res = e
4720: 64 69 74 64 69 73 74 31 28 0a 20 20 20 20 20 20  ditdist1(.      
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
4740: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
4750: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
4760: 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20  gv[0]),.        
4770: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
4780: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
4790: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
47a0: 5b 31 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  [1]),.          
47b0: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
47c0: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
47d0: 20 69 66 28 20 72 65 73 3d 3d 28 2d 33 29 20 29   if( res==(-3) )
47e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
47f0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
4800: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
4810: 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d   }else if( res==
4820: 28 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 73 71  (-2) ){.      sq
4830: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
4840: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 6e 6f 6e  or(context, "non
4850: 2d 41 53 43 49 49 20 69 6e 70 75 74 20 74 6f 20  -ASCII input to 
4860: 65 64 69 74 64 69 73 74 28 29 22 2c 20 2d 31 29  editdist()", -1)
4870: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4880: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4890: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
48a0: 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20 74 6f 20   "NULL input to 
48b0: 65 64 69 74 64 69 73 74 28 29 22 2c 20 2d 31 29  editdist()", -1)
48c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
48d0: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65   .    sqlite3_re
48e0: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
48f0: 2c 20 72 65 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , res);.  }.}../
4900: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 69 78  * End of the fix
4910: 65 64 2d 63 6f 73 74 20 65 64 69 74 20 64 69 73  ed-cost edit dis
4920: 74 61 6e 63 65 20 69 6d 70 6c 65 6d 65 6e 74 61  tance implementa
4930: 74 69 6f 6e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion.***********
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4980: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 0a 2a 2a 20 42 65 67 69 6e 3a 20 43 6f 6e 66  *.** Begin: Conf
49e0: 69 67 75 72 61 62 6c 65 20 63 6f 73 74 20 75 6e  igurable cost un
49f0: 69 63 6f 64 65 20 65 64 69 74 20 64 69 73 74 61  icode edit dista
4a00: 6e 63 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2f 0a  nce routines.*/.
4a10: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
4a20: 72 61 74 69 6f 6e 20 6f 66 20 73 74 72 75 63 74  ration of struct
4a30: 75 72 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  ures */.typedef 
4a40: 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33  struct EditDist3
4a50: 43 6f 73 74 20 45 64 69 74 44 69 73 74 33 43 6f  Cost EditDist3Co
4a60: 73 74 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  st;.typedef stru
4a70: 63 74 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66  ct EditDist3Conf
4a80: 69 67 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66  ig EditDist3Conf
4a90: 69 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ig;.typedef stru
4aa0: 63 74 20 45 64 69 74 44 69 73 74 33 50 6f 69 6e  ct EditDist3Poin
4ab0: 74 20 45 64 69 74 44 69 73 74 33 50 6f 69 6e 74  t EditDist3Point
4ac0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
4ad0: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 20 45   EditDist3From E
4ae0: 64 69 74 44 69 73 74 33 46 72 6f 6d 3b 0a 74 79  ditDist3From;.ty
4af0: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69  pedef struct Edi
4b00: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
4b10: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74   EditDist3FromSt
4b20: 72 69 6e 67 3b 0a 74 79 70 65 64 65 66 20 73 74  ring;.typedef st
4b30: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54 6f  ruct EditDist3To
4b40: 20 45 64 69 74 44 69 73 74 33 54 6f 3b 0a 74 79   EditDist3To;.ty
4b50: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 64 69  pedef struct Edi
4b60: 74 44 69 73 74 33 54 6f 53 74 72 69 6e 67 20 45  tDist3ToString E
4b70: 64 69 74 44 69 73 74 33 54 6f 53 74 72 69 6e 67  ditDist3ToString
4b80: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
4b90: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 45   EditDist3Lang E
4ba0: 64 69 74 44 69 73 74 33 4c 61 6e 67 3b 0a 0a 0a  ditDist3Lang;...
4bb0: 2f 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 69  /*.** An entry i
4bc0: 6e 20 74 68 65 20 65 64 69 74 20 63 6f 73 74 20  n the edit cost 
4bd0: 74 61 62 6c 65 0a 2a 2f 0a 73 74 72 75 63 74 20  table.*/.struct 
4be0: 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 7b 0a  EditDist3Cost {.
4bf0: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
4c00: 2a 70 4e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e  *pNext;     /* N
4c10: 65 78 74 20 63 6f 73 74 20 65 6c 65 6d 65 6e 74  ext cost element
4c20: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 6f 6d 3b 20   */.  u8 nFrom; 
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4c50: 65 73 20 69 6e 20 61 46 72 6f 6d 20 2a 2f 0a 20  es in aFrom */. 
4c60: 20 75 38 20 6e 54 6f 3b 20 20 20 20 20 20 20 20   u8 nTo;        
4c70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4c80: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
4c90: 20 61 54 6f 20 2a 2f 0a 20 20 75 31 36 20 69 43   aTo */.  u16 iC
4ca0: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
4cb0: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74      /* Cost of t
4cc0: 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  his transformati
4cd0: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 61 5b 34  on */.  char a[4
4ce0: 5d 20 20 20 20 3b 20 20 20 20 20 20 20 20 20 20  ]    ;          
4cf0: 20 20 2f 2a 20 46 52 4f 4d 20 73 74 72 69 6e 67    /* FROM string
4d00: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 54 4f 20   followed by TO 
4d10: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 2f 2a 20 41  string */.  /* A
4d20: 64 64 69 74 69 6f 6e 61 6c 20 54 4f 20 61 6e 64  dditional TO and
4d30: 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 62 79 74   FROM string byt
4d40: 65 73 20 61 70 70 65 6e 64 65 64 20 61 73 20 6e  es appended as n
4d50: 65 63 65 73 73 61 72 79 20 2a 2f 0a 7d 3b 0a 0a  ecessary */.};..
4d60: 2f 2a 0a 2a 2a 20 45 64 69 74 20 63 6f 73 74 73  /*.** Edit costs
4d70: 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
4d80: 72 20 6c 61 6e 67 75 61 67 65 20 49 44 20 0a 2a  r language ID .*
4d90: 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44 69 73  /.struct EditDis
4da0: 74 33 4c 61 6e 67 20 7b 0a 20 20 69 6e 74 20 69  t3Lang {.  int i
4db0: 4c 61 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20  Lang;           
4dc0: 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20 49 44    /* Language ID
4dd0: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 73 43 6f   */.  int iInsCo
4de0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
4df0: 44 65 66 61 75 6c 74 20 69 6e 73 65 72 74 69 6f  Default insertio
4e00: 6e 20 63 6f 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n cost */.  int 
4e10: 69 44 65 6c 43 6f 73 74 3b 20 20 20 20 20 20 20  iDelCost;       
4e20: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 64 65     /* Default de
4e30: 6c 65 74 69 6f 6e 20 63 6f 73 74 20 2a 2f 0a 20  letion cost */. 
4e40: 20 69 6e 74 20 69 53 75 62 43 6f 73 74 3b 20 20   int iSubCost;  
4e50: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
4e60: 6c 74 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  lt substitution 
4e70: 63 6f 73 74 20 2a 2f 0a 20 20 45 64 69 74 44 69  cost */.  EditDi
4e80: 73 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 3b 20  st3Cost *pCost; 
4e90: 20 2f 2a 20 43 6f 73 74 73 20 2a 2f 0a 7d 3b 0a   /* Costs */.};.
4ea0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  ../*.** The defa
4eb0: 75 6c 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e  ult EditDist3Lan
4ec0: 67 20 6f 62 6a 65 63 74 2c 20 77 69 74 68 20 64  g object, with d
4ed0: 65 66 61 75 6c 74 20 63 6f 73 74 73 2e 0a 2a 2f  efault costs..*/
4ee0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 45 64  .static const Ed
4ef0: 69 74 44 69 73 74 33 4c 61 6e 67 20 65 64 69 74  itDist3Lang edit
4f00: 44 69 73 74 33 4c 61 6e 67 20 3d 20 7b 20 30 2c  Dist3Lang = { 0,
4f10: 20 31 30 30 2c 20 31 30 30 2c 20 31 35 30 2c 20   100, 100, 150, 
4f20: 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  0 };../*.** Comp
4f30: 6c 65 74 65 20 63 6f 6e 66 69 67 75 72 61 74 69  lete configurati
4f40: 6f 6e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69  on.*/.struct Edi
4f50: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 7b 0a 20  tDist3Config {. 
4f60: 20 69 6e 74 20 6e 4c 61 6e 67 3b 20 20 20 20 20   int nLang;     
4f70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4f80: 72 20 6f 66 20 6c 61 6e 67 75 61 67 65 20 49 44  r of language ID
4f90: 73 2e 20 20 53 69 7a 65 20 6f 66 20 61 5b 5d 20  s.  Size of a[] 
4fa0: 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 4c 61  */.  EditDist3La
4fb0: 6e 67 20 2a 61 3b 20 20 20 20 20 20 2f 2a 20 4f  ng *a;      /* O
4fc0: 6e 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74  ne for each dist
4fd0: 69 6e 63 74 20 6c 61 6e 67 75 61 67 65 20 49 44  inct language ID
4fe0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 78   */.};../*.** Ex
4ff0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
5000: 61 62 6f 75 74 20 65 61 63 68 20 63 68 61 72 61  about each chara
5010: 63 74 65 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  cter in the FROM
5020: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 72 75   string..*/.stru
5030: 63 74 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  ct EditDist3From
5040: 20 7b 0a 20 20 69 6e 74 20 6e 53 75 62 73 74 3b   {.  int nSubst;
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5060: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 73 74   Number of subst
5070: 69 74 75 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74  itution cost ent
5080: 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ries */.  int nD
5090: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
50a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
50b0: 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65 6e  deletion cost en
50c0: 74 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tries */.  int n
50d0: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
50e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
50f0: 20 62 79 74 65 73 20 69 6e 20 74 68 69 73 20 63   bytes in this c
5100: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 45 64  haracter */.  Ed
5110: 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 61 70  itDist3Cost **ap
5120: 53 75 62 73 74 3b 20 2f 2a 20 41 72 72 61 79 20  Subst; /* Array 
5130: 6f 66 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  of substitution 
5140: 63 6f 73 74 73 20 66 6f 72 20 74 68 69 73 20 65  costs for this e
5150: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 64 69 74  lement */.  Edit
5160: 44 69 73 74 33 43 6f 73 74 20 2a 2a 61 70 44 65  Dist3Cost **apDe
5170: 6c 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  l;   /* Array of
5180: 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65   deletion cost e
5190: 6e 74 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ntries */.};../*
51a0: 0a 2a 2a 20 41 20 70 72 65 63 6f 6d 70 69 6c 65  .** A precompile
51b0: 64 20 46 52 4f 4d 20 73 74 72 69 6e 67 2e 0a 2a  d FROM string..*
51c0: 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** In the commo
51d0: 6e 20 63 61 73 65 20 77 65 20 65 78 70 65 63 74  n case we expect
51e0: 20 74 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67   the FROM string
51f0: 20 74 6f 20 62 65 20 72 65 75 73 65 64 20 6d 75   to be reused mu
5200: 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 2a 2a  ltiple times..**
5210: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
5220: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
5230: 20 77 69 6c 6c 20 62 65 20 74 6f 20 6d 65 61 73   will be to meas
5240: 75 72 65 20 74 68 65 20 65 64 69 74 20 64 69 73  ure the edit dis
5250: 74 61 6e 63 65 0a 2a 2a 20 66 72 6f 6d 20 61 20  tance.** from a 
5260: 73 69 6e 67 6c 65 20 6f 72 69 67 69 6e 20 73 74  single origin st
5270: 72 69 6e 67 20 74 6f 20 6d 75 6c 74 69 70 6c 65  ring to multiple
5280: 20 74 61 72 67 65 74 20 73 74 72 69 6e 67 73 2e   target strings.
5290: 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44  .*/.struct EditD
52a0: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 7b  ist3FromString {
52b0: 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
52d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
52e0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 73 74 72   of the FROM str
52f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ing */.  int n; 
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5320: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
5330: 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f 0a   FROM string */.
5340: 20 20 69 6e 74 20 69 73 50 72 65 66 69 78 3b 20    int isPrefix; 
5350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
5360: 75 65 20 69 66 20 65 6e 64 73 20 77 69 74 68 20  ue if ends with 
5370: 27 2a 27 20 63 68 61 72 61 63 74 65 72 20 2a 2f  '*' character */
5380: 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  .  EditDist3From
5390: 20 2a 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 45   *a;        /* E
53a0: 78 74 72 61 20 69 6e 66 6f 20 61 62 6f 75 74 20  xtra info about 
53b0: 65 61 63 68 20 63 68 61 72 20 6f 66 20 74 68 65  each char of the
53c0: 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f 0a   FROM string */.
53d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 20  };../*.** Extra 
53e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
53f0: 74 20 65 61 63 68 20 63 68 61 72 61 63 74 65 72  t each character
5400: 20 69 6e 20 74 68 65 20 54 4f 20 73 74 72 69 6e   in the TO strin
5410: 67 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69  g..*/.struct Edi
5420: 74 44 69 73 74 33 54 6f 20 7b 0a 20 20 69 6e 74  tDist3To {.  int
5430: 20 6e 49 6e 73 3b 20 20 20 20 20 20 20 20 20 20   nIns;          
5440: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5450: 6f 66 20 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73  of insertion cos
5460: 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 69  t entries */.  i
5470: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
5480: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5490: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
54a0: 69 73 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  is character */.
54b0: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
54c0: 2a 2a 61 70 49 6e 73 3b 20 20 20 2f 2a 20 41 72  **apIns;   /* Ar
54d0: 72 61 79 20 6f 66 20 64 65 6c 65 74 69 6f 6e 20  ray of deletion 
54e0: 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a  cost entries */.
54f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 72 65 63  };../*.** A prec
5500: 6f 6d 70 69 6c 65 64 20 46 52 4f 4d 20 73 74 72  ompiled FROM str
5510: 69 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64  ing.*/.struct Ed
5520: 69 74 44 69 73 74 33 54 6f 53 74 72 69 6e 67 20  itDist3ToString 
5530: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  {.  char *z;    
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5550: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  The complete tex
5560: 74 20 6f 66 20 74 68 65 20 54 4f 20 73 74 72 69  t of the TO stri
5570: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ng */.  int n;  
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
55a0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
55b0: 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 45  TO string */.  E
55c0: 64 69 74 44 69 73 74 33 54 6f 20 2a 61 3b 20 20  ditDist3To *a;  
55d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
55e0: 20 69 6e 66 6f 20 61 62 6f 75 74 20 65 61 63 68   info about each
55f0: 20 63 68 61 72 20 6f 66 20 74 68 65 20 54 4f 20   char of the TO 
5600: 73 74 72 69 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  string */.};../*
5610: 0a 2a 2a 20 43 6c 65 61 72 20 6f 72 20 64 65 6c  .** Clear or del
5620: 65 74 65 20 61 6e 20 69 6e 73 74 61 6e 63 65 20  ete an instance 
5630: 6f 66 20 74 68 65 20 6f 62 6a 65 63 74 20 74 68  of the object th
5640: 61 74 20 72 65 63 6f 72 64 73 20 61 6c 6c 20 65  at records all e
5650: 64 69 74 2d 64 69 73 74 61 6e 63 65 0a 2a 2a 20  dit-distance.** 
5660: 77 65 69 67 68 74 73 2e 0a 2a 2f 0a 73 74 61 74  weights..*/.stat
5670: 69 63 20 76 6f 69 64 20 65 64 69 74 44 69 73 74  ic void editDist
5680: 33 43 6f 6e 66 69 67 43 6c 65 61 72 28 45 64 69  3ConfigClear(Edi
5690: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 29  tDist3Config *p)
56a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
56b0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
56c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
56d0: 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nLang; i++){.   
56e0: 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a   EditDist3Cost *
56f0: 70 43 6f 73 74 2c 20 2a 70 4e 65 78 74 3b 0a 20  pCost, *pNext;. 
5700: 20 20 20 70 43 6f 73 74 20 3d 20 70 2d 3e 61 5b     pCost = p->a[
5710: 69 5d 2e 70 43 6f 73 74 3b 0a 20 20 20 20 77 68  i].pCost;.    wh
5720: 69 6c 65 28 20 70 43 6f 73 74 20 29 7b 0a 20 20  ile( pCost ){.  
5730: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 43 6f 73      pNext = pCos
5740: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
5750: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 6f  sqlite3_free(pCo
5760: 73 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  st);.      pCost
5770: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a   = pNext;.    }.
5780: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
5790: 65 65 28 70 2d 3e 61 29 3b 0a 20 20 6d 65 6d 73  ee(p->a);.  mems
57a0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
57b0: 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  *p));.}.static v
57c0: 6f 69 64 20 65 64 69 74 44 69 73 74 33 43 6f 6e  oid editDist3Con
57d0: 66 69 67 44 65 6c 65 74 65 28 76 6f 69 64 20 2a  figDelete(void *
57e0: 70 49 6e 29 7b 0a 20 20 45 64 69 74 44 69 73 74  pIn){.  EditDist
57f0: 33 43 6f 6e 66 69 67 20 2a 70 20 3d 20 28 45 64  3Config *p = (Ed
5800: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 2a 29 70  itDist3Config*)p
5810: 49 6e 3b 0a 20 20 65 64 69 74 44 69 73 74 33 43  In;.  editDist3C
5820: 6f 6e 66 69 67 43 6c 65 61 72 28 70 29 3b 0a 20  onfigClear(p);. 
5830: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
5840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
5850: 61 6c 6c 20 65 64 69 74 2d 64 69 73 74 61 6e 63  all edit-distanc
5860: 65 20 77 65 69 67 68 74 73 20 66 72 6f 6d 20 61  e weights from a
5870: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
5880: 63 20 69 6e 74 20 65 64 69 74 44 69 73 74 33 43  c int editDist3C
5890: 6f 6e 66 69 67 4c 6f 61 64 28 0a 20 20 45 64 69  onfigLoad(.  Edi
58a0: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 2c  tDist3Config *p,
58b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 64 69        /* The edi
58c0: 74 20 64 69 73 74 61 6e 63 65 20 63 6f 6e 66 69  t distance confi
58d0: 67 75 72 61 74 69 6f 6e 20 74 6f 20 6c 6f 61 64  guration to load
58e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
58f0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
5900: 20 4c 6f 61 64 20 66 72 6f 6d 20 74 68 69 73 20   Load from this 
5910: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
5920: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
5930: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
5940: 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20   the table from 
5950: 77 68 69 63 68 20 74 6f 20 6c 6f 61 64 20 2a 2f  which to load */
5960: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5970: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
5980: 20 72 63 2c 20 72 63 32 3b 0a 20 20 63 68 61 72   rc, rc2;.  char
5990: 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 69 4c   *zSql;.  int iL
59a0: 61 6e 67 50 72 65 76 20 3d 20 2d 39 39 39 39 3b  angPrev = -9999;
59b0: 0a 20 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  .  EditDist3Lang
59c0: 20 2a 70 4c 61 6e 67 20 3d 20 30 3b 0a 0a 20 20   *pLang = 0;..  
59d0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
59e0: 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 69  printf("SELECT i
59f0: 4c 61 6e 67 2c 20 63 46 72 6f 6d 2c 20 63 54 6f  Lang, cFrom, cTo
5a00: 2c 20 69 43 6f 73 74 22 0a 20 20 20 20 20 20 20  , iCost".       
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 22 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20    " FROM \"%w\" 
5a30: 57 48 45 52 45 20 69 4c 61 6e 67 3e 3d 30 20 4f  WHERE iLang>=0 O
5a40: 52 44 45 52 20 42 59 20 69 4c 61 6e 67 22 2c 20  RDER BY iLang", 
5a50: 7a 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 7a  zTable);.  if( z
5a60: 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
5a70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5a80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
5a90: 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  pare(db, zSql, -
5aa0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
5ac0: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
5ad0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 65 64 69  return rc;.  edi
5ae0: 74 44 69 73 74 33 43 6f 6e 66 69 67 43 6c 65 61  tDist3ConfigClea
5af0: 72 28 70 29 3b 0a 20 20 77 68 69 6c 65 28 20 73  r(p);.  while( s
5b00: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
5b10: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
5b20: 7b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e 67 20  {.    int iLang 
5b30: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
5b40: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
5b50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5b60: 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63  zFrom = (const c
5b70: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
5b80: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
5b90: 31 29 3b 0a 20 20 20 20 69 6e 74 20 6e 46 72 6f  1);.    int nFro
5ba0: 6d 20 3d 20 7a 46 72 6f 6d 20 3f 20 73 71 6c 69  m = zFrom ? sqli
5bb0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
5bc0: 28 70 53 74 6d 74 2c 20 31 29 20 3a 20 30 3b 0a  (pStmt, 1) : 0;.
5bd0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5be0: 7a 54 6f 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zTo = (const cha
5bf0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5c00: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29  n_text(pStmt, 2)
5c10: 3b 0a 20 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20  ;.    int nTo = 
5c20: 7a 54 6f 20 3f 20 73 71 6c 69 74 65 33 5f 63 6f  zTo ? sqlite3_co
5c30: 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
5c40: 2c 20 32 29 20 3a 20 30 3b 0a 20 20 20 20 69 6e  , 2) : 0;.    in
5c50: 74 20 69 43 6f 73 74 20 3d 20 73 71 6c 69 74 65  t iCost = sqlite
5c60: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
5c70: 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 61 73 73  mt, 3);..    ass
5c80: 65 72 74 28 20 7a 46 72 6f 6d 21 3d 30 20 7c 7c  ert( zFrom!=0 ||
5c90: 20 6e 46 72 6f 6d 3d 3d 30 20 29 3b 0a 20 20 20   nFrom==0 );.   
5ca0: 20 61 73 73 65 72 74 28 20 7a 54 6f 21 3d 30 20   assert( zTo!=0 
5cb0: 7c 7c 20 6e 54 6f 3d 3d 30 20 29 3b 0a 20 20 20  || nTo==0 );.   
5cc0: 20 69 66 28 20 6e 46 72 6f 6d 3e 31 30 30 20 7c   if( nFrom>100 |
5cd0: 7c 20 6e 54 6f 3e 31 30 30 20 29 20 63 6f 6e 74  | nTo>100 ) cont
5ce0: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 69 43  inue;.    if( iC
5cf0: 6f 73 74 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65  ost<0 ) continue
5d00: 3b 0a 20 20 20 20 69 66 28 20 70 4c 61 6e 67 3d  ;.    if( pLang=
5d10: 3d 30 20 7c 7c 20 69 4c 61 6e 67 21 3d 69 4c 61  =0 || iLang!=iLa
5d20: 6e 67 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  ngPrev ){.      
5d30: 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70  EditDist3Lang *p
5d40: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  New;.      pNew 
5d50: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
5d60: 63 28 70 2d 3e 61 2c 20 28 70 2d 3e 6e 4c 61 6e  c(p->a, (p->nLan
5d70: 67 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  g+1)*sizeof(p->a
5d80: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
5d90: 20 70 4e 65 77 3d 3d 30 20 29 7b 20 72 63 20 3d   pNew==0 ){ rc =
5da0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 20 62   SQLITE_NOMEM; b
5db0: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 70 2d  reak; }.      p-
5dc0: 3e 61 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  >a = pNew;.     
5dd0: 20 70 4c 61 6e 67 20 3d 20 26 70 2d 3e 61 5b 70   pLang = &p->a[p
5de0: 2d 3e 6e 4c 61 6e 67 5d 3b 0a 20 20 20 20 20 20  ->nLang];.      
5df0: 70 2d 3e 6e 4c 61 6e 67 2b 2b 3b 0a 20 20 20 20  p->nLang++;.    
5e00: 20 20 70 4c 61 6e 67 2d 3e 69 4c 61 6e 67 20 3d    pLang->iLang =
5e10: 20 69 4c 61 6e 67 3b 0a 20 20 20 20 20 20 70 4c   iLang;.      pL
5e20: 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 20 3d 20  ang->iInsCost = 
5e30: 31 30 30 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67  100;.      pLang
5e40: 2d 3e 69 44 65 6c 43 6f 73 74 20 3d 20 31 30 30  ->iDelCost = 100
5e50: 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  ;.      pLang->i
5e60: 53 75 62 43 6f 73 74 20 3d 20 31 35 30 3b 0a 20  SubCost = 150;. 
5e70: 20 20 20 20 20 70 4c 61 6e 67 2d 3e 70 43 6f 73       pLang->pCos
5e80: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 4c 61  t = 0;.      iLa
5e90: 6e 67 50 72 65 76 20 3d 20 69 4c 61 6e 67 3b 0a  ngPrev = iLang;.
5ea0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
5eb0: 72 6f 6d 3d 3d 31 20 26 26 20 7a 46 72 6f 6d 5b  rom==1 && zFrom[
5ec0: 30 5d 3d 3d 27 3f 27 20 26 26 20 6e 54 6f 3d 3d  0]=='?' && nTo==
5ed0: 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67  0 ){.      pLang
5ee0: 2d 3e 69 44 65 6c 43 6f 73 74 20 3d 20 69 43 6f  ->iDelCost = iCo
5ef0: 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  st;.    }else if
5f00: 28 20 6e 46 72 6f 6d 3d 3d 30 20 26 26 20 6e 54  ( nFrom==0 && nT
5f10: 6f 3d 3d 31 20 26 26 20 7a 54 6f 5b 30 5d 3d 3d  o==1 && zTo[0]==
5f20: 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 70 4c 61  '?' ){.      pLa
5f30: 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 20 3d 20 69  ng->iInsCost = i
5f40: 43 6f 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Cost;.    }else 
5f50: 69 66 28 20 6e 46 72 6f 6d 3d 3d 31 20 26 26 20  if( nFrom==1 && 
5f60: 6e 54 6f 3d 3d 31 20 26 26 20 7a 46 72 6f 6d 5b  nTo==1 && zFrom[
5f70: 30 5d 3d 3d 27 3f 27 20 26 26 20 7a 54 6f 5b 30  0]=='?' && zTo[0
5f80: 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='?' ){.      
5f90: 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73 74 20  pLang->iSubCost 
5fa0: 3d 20 69 43 6f 73 74 3b 0a 20 20 20 20 7d 65 6c  = iCost;.    }el
5fb0: 73 65 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69  se{.      EditDi
5fc0: 73 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 3b 0a  st3Cost *pCost;.
5fd0: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61        int nExtra
5fe0: 20 3d 20 6e 46 72 6f 6d 20 2b 20 6e 54 6f 20 2d   = nFrom + nTo -
5ff0: 20 34 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 45   4;.      if( nE
6000: 78 74 72 61 3c 30 20 29 20 6e 45 78 74 72 61 20  xtra<0 ) nExtra 
6010: 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  = 0;.      pCost
6020: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
6030: 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74  c( sizeof(*pCost
6040: 29 20 2b 20 6e 45 78 74 72 61 20 29 3b 0a 20 20  ) + nExtra );.  
6050: 20 20 20 20 69 66 28 20 70 43 6f 73 74 3d 3d 30      if( pCost==0
6060: 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   ){ rc = SQLITE_
6070: 4e 4f 4d 45 4d 3b 20 62 72 65 61 6b 3b 20 7d 0a  NOMEM; break; }.
6080: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 46 72        pCost->nFr
6090: 6f 6d 20 3d 20 6e 46 72 6f 6d 3b 0a 20 20 20 20  om = nFrom;.    
60a0: 20 20 70 43 6f 73 74 2d 3e 6e 54 6f 20 3d 20 6e    pCost->nTo = n
60b0: 54 6f 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  To;.      pCost-
60c0: 3e 69 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a  >iCost = iCost;.
60d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f        memcpy(pCo
60e0: 73 74 2d 3e 61 2c 20 7a 46 72 6f 6d 2c 20 6e 46  st->a, zFrom, nF
60f0: 72 6f 6d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rom);.      memc
6100: 70 79 28 70 43 6f 73 74 2d 3e 61 20 2b 20 6e 46  py(pCost->a + nF
6110: 72 6f 6d 2c 20 7a 54 6f 2c 20 6e 54 6f 29 3b 0a  rom, zTo, nTo);.
6120: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 4e 65        pCost->pNe
6130: 78 74 20 3d 20 70 4c 61 6e 67 2d 3e 70 43 6f 73  xt = pLang->pCos
6140: 74 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e  t;.      pLang->
6150: 70 43 6f 73 74 20 3d 20 70 43 6f 73 74 3b 20 0a  pCost = pCost; .
6160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 32 20      }.  }.  rc2 
6170: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
6180: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
6190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
61a0: 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 72 65 74   rc = rc2;.  ret
61b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
61c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
61d0: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 6f 66  th (in bytes) of
61e0: 20 61 20 75 74 66 2d 38 20 63 68 61 72 61 63 74   a utf-8 charact
61f0: 65 72 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 61  er.  Or return a
6200: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 6f 66 20 4e   maximum.** of N
6210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6220: 75 74 66 38 4c 65 6e 28 75 6e 73 69 67 6e 65 64  utf8Len(unsigned
6230: 20 63 68 61 72 20 63 2c 20 69 6e 74 20 4e 29 7b   char c, int N){
6240: 0a 20 20 69 6e 74 20 6c 65 6e 20 3d 20 31 3b 0a  .  int len = 1;.
6250: 20 20 69 66 28 20 63 3e 30 78 37 66 20 29 7b 0a    if( c>0x7f ){.
6260: 20 20 20 20 69 66 28 20 28 63 26 30 78 65 30 29      if( (c&0xe0)
6270: 3d 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  ==0xc0 ){.      
6280: 6c 65 6e 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  len = 2;.    }el
6290: 73 65 20 69 66 28 20 28 63 26 30 78 66 30 29 3d  se if( (c&0xf0)=
62a0: 3d 30 78 65 30 20 29 7b 0a 20 20 20 20 20 20 6c  =0xe0 ){.      l
62b0: 65 6e 20 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  en = 3;.    }els
62c0: 65 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 34  e{.      len = 4
62d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
62e0: 28 20 6c 65 6e 3e 4e 20 29 20 6c 65 6e 20 3d 20  ( len>N ) len = 
62f0: 4e 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  N;.  return len;
6300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6310: 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29   TRUE (non-zero)
6320: 20 69 66 20 74 68 65 20 54 6f 20 73 69 64 65 20   if the To side 
6330: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 73  of the given cos
6340: 74 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65  t matches.** the
6350: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 0a 2a   given string..*
6360: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 74  /.static int mat
6370: 63 68 54 6f 28 45 64 69 74 44 69 73 74 33 43 6f  chTo(EditDist3Co
6380: 73 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  st *p, const cha
6390: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
63a0: 69 66 28 20 70 2d 3e 6e 54 6f 3e 6e 20 29 20 72  if( p->nTo>n ) r
63b0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
63c0: 74 72 6e 63 6d 70 28 70 2d 3e 61 2b 70 2d 3e 6e  trncmp(p->a+p->n
63d0: 46 72 6f 6d 2c 20 7a 2c 20 70 2d 3e 6e 54 6f 29  From, z, p->nTo)
63e0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
63f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
6400: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
6410: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74   (non-zero) if t
6420: 68 65 20 46 72 6f 6d 20 73 69 64 65 20 6f 66 20  he From side of 
6430: 74 68 65 20 67 69 76 65 6e 20 63 6f 73 74 20 6d  the given cost m
6440: 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20 67 69  atches.** the gi
6450: 76 65 6e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ven string..*/.s
6460: 74 61 74 69 63 20 69 6e 74 20 6d 61 74 63 68 46  tatic int matchF
6470: 72 6f 6d 28 45 64 69 74 44 69 73 74 33 43 6f 73  rom(EditDist3Cos
6480: 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  t *p, const char
6490: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 61   *z, int n){.  a
64a0: 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 6f 6d 3c  ssert( p->nFrom<
64b0: 3d 6e 20 29 3b 0a 20 20 69 66 28 20 73 74 72 6e  =n );.  if( strn
64c0: 63 6d 70 28 70 2d 3e 61 2c 20 7a 2c 20 70 2d 3e  cmp(p->a, z, p->
64d0: 6e 46 72 6f 6d 29 21 3d 30 20 29 20 72 65 74 75  nFrom)!=0 ) retu
64e0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31  rn 0;.  return 1
64f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6500: 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
6510: 29 20 6f 66 20 74 68 65 20 6e 65 78 74 20 46 52  ) of the next FR
6520: 4f 4d 20 63 68 61 72 61 63 74 65 72 20 61 6e 64  OM character and
6530: 20 74 68 65 20 6e 65 78 74 20 54 4f 0a 2a 2a 20   the next TO.** 
6540: 63 68 61 72 61 63 74 65 72 20 61 72 65 20 74 68  character are th
6550: 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e same..*/.stati
6560: 63 20 69 6e 74 20 6d 61 74 63 68 46 72 6f 6d 54  c int matchFromT
6570: 6f 28 0a 20 20 45 64 69 74 44 69 73 74 33 46 72  o(.  EditDist3Fr
6580: 6f 6d 53 74 72 69 6e 67 20 2a 70 53 74 72 2c 20  omString *pStr, 
6590: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 74   /* Left hand st
65a0: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 31  ring */.  int n1
65b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
65c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
65d0: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 63 68 61  f comparison cha
65e0: 72 61 63 74 65 72 20 6f 6e 20 74 68 65 20 6c 65  racter on the le
65f0: 66 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ft */.  const ch
6600: 61 72 20 2a 7a 32 2c 20 20 20 20 20 20 20 20 20  ar *z2,         
6610: 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e      /* Right-han
6620: 64 6c 20 63 6f 6d 70 61 72 69 73 6f 6e 20 63 68  dl comparison ch
6630: 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74  aracter */.  int
6640: 20 6e 32 20 20 20 20 20 20 20 20 20 20 20 20 20   n2             
6650: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
6660: 73 20 72 65 6d 61 69 6e 69 6e 67 20 69 6e 20 7a  s remaining in z
6670: 32 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  2[] */.){.  int 
6680: 62 31 20 3d 20 70 53 74 72 2d 3e 61 5b 6e 31 5d  b1 = pStr->a[n1]
6690: 2e 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 62 31  .nByte;.  if( b1
66a0: 3e 6e 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >n2 ) return 0;.
66b0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 53 74    if( memcmp(pSt
66c0: 72 2d 3e 7a 2b 6e 31 2c 20 7a 32 2c 20 62 31 29  r->z+n1, z2, b1)
66d0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
66e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
66f0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 45  *.** Delete an E
6700: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
6710: 6e 67 20 6f 62 6a 65 63 63 74 0a 2a 2f 0a 73 74  ng objecct.*/.st
6720: 61 74 69 63 20 76 6f 69 64 20 65 64 69 74 44 69  atic void editDi
6730: 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c  st3FromStringDel
6740: 65 74 65 28 45 64 69 74 44 69 73 74 33 46 72 6f  ete(EditDist3Fro
6750: 6d 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69  mString *p){.  i
6760: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 20 29 7b  nt i;.  if( p ){
6770: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6780: 70 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  p->n; i++){.    
6790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
67a0: 2d 3e 61 5b 69 5d 2e 61 70 44 65 6c 29 3b 0a 20  ->a[i].apDel);. 
67b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
67c0: 65 28 70 2d 3e 61 5b 69 5d 2e 61 70 53 75 62 73  e(p->a[i].apSubs
67d0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
67e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
67f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
6800: 74 65 20 61 20 45 64 69 74 44 69 73 74 33 46 72  te a EditDist3Fr
6810: 6f 6d 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 2e  omString object.
6820: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 64 69 74 44  .*/.static EditD
6830: 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a  ist3FromString *
6840: 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  editDist3FromStr
6850: 69 6e 67 4e 65 77 28 0a 20 20 63 6f 6e 73 74 20  ingNew(.  const 
6860: 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70  EditDist3Lang *p
6870: 4c 61 6e 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Lang,.  const ch
6880: 61 72 20 2a 7a 2c 0a 20 20 69 6e 74 20 6e 0a 29  ar *z,.  int n.)
6890: 7b 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f  {.  EditDist3Fro
68a0: 6d 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20  mString *pStr;. 
68b0: 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a   EditDist3Cost *
68c0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  p;.  int i;..  i
68d0: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
68e0: 20 30 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20   0;.  if( n<0 ) 
68f0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
6900: 7a 29 3b 0a 20 20 70 53 74 72 20 3d 20 73 71 6c  z);.  pStr = sql
6910: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
6920: 65 6f 66 28 2a 70 53 74 72 29 20 2b 20 73 69 7a  eof(*pStr) + siz
6930: 65 6f 66 28 70 53 74 72 2d 3e 61 5b 30 5d 29 2a  eof(pStr->a[0])*
6940: 6e 20 2b 20 6e 20 2b 20 31 20 29 3b 0a 20 20 69  n + n + 1 );.  i
6950: 66 28 20 70 53 74 72 3d 3d 30 20 29 20 72 65 74  f( pStr==0 ) ret
6960: 75 72 6e 20 30 3b 0a 20 20 70 53 74 72 2d 3e 61  urn 0;.  pStr->a
6970: 20 3d 20 28 45 64 69 74 44 69 73 74 33 46 72 6f   = (EditDist3Fro
6980: 6d 2a 29 26 70 53 74 72 5b 31 5d 3b 0a 20 20 6d  m*)&pStr[1];.  m
6990: 65 6d 73 65 74 28 70 53 74 72 2d 3e 61 2c 20 30  emset(pStr->a, 0
69a0: 2c 20 73 69 7a 65 6f 66 28 70 53 74 72 2d 3e 61  , sizeof(pStr->a
69b0: 5b 30 5d 29 2a 6e 29 3b 0a 20 20 70 53 74 72 2d  [0])*n);.  pStr-
69c0: 3e 6e 20 3d 20 6e 3b 0a 20 20 70 53 74 72 2d 3e  >n = n;.  pStr->
69d0: 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 53 74 72  z = (char*)&pStr
69e0: 2d 3e 61 5b 6e 5d 3b 0a 20 20 6d 65 6d 63 70 79  ->a[n];.  memcpy
69f0: 28 70 53 74 72 2d 3e 7a 2c 20 7a 2c 20 6e 2b 31  (pStr->z, z, n+1
6a00: 29 3b 0a 20 20 69 66 28 20 6e 20 26 26 20 7a 5b  );.  if( n && z[
6a10: 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20  n-1]=='*' ){.   
6a20: 20 70 53 74 72 2d 3e 69 73 50 72 65 66 69 78 20   pStr->isPrefix 
6a30: 3d 20 31 3b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  = 1;.    n--;.  
6a40: 20 20 70 53 74 72 2d 3e 6e 2d 2d 3b 0a 20 20 20    pStr->n--;.   
6a50: 20 70 53 74 72 2d 3e 7a 5b 6e 5d 20 3d 20 30 3b   pStr->z[n] = 0;
6a60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
6a70: 74 72 2d 3e 69 73 50 72 65 66 69 78 20 3d 20 30  tr->isPrefix = 0
6a80: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
6a90: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
6aa0: 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 20 2a   EditDist3From *
6ab0: 70 46 72 6f 6d 20 3d 20 26 70 53 74 72 2d 3e 61  pFrom = &pStr->a
6ac0: 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  [i];.    memset(
6ad0: 70 46 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pFrom, 0, sizeof
6ae0: 28 2a 70 46 72 6f 6d 29 29 3b 0a 20 20 20 20 70  (*pFrom));.    p
6af0: 46 72 6f 6d 2d 3e 6e 42 79 74 65 20 3d 20 75 74  From->nByte = ut
6b00: 66 38 4c 65 6e 28 28 75 6e 73 69 67 6e 65 64 20  f8Len((unsigned 
6b10: 63 68 61 72 29 7a 5b 69 5d 2c 20 6e 2d 69 29 3b  char)z[i], n-i);
6b20: 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 61 6e 67  .    for(p=pLang
6b30: 2d 3e 70 43 6f 73 74 3b 20 70 3b 20 70 3d 70 2d  ->pCost; p; p=p-
6b40: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 45  >pNext){.      E
6b50: 64 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 61  ditDist3Cost **a
6b60: 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28 20  pNew;.      if( 
6b70: 69 2b 70 2d 3e 6e 46 72 6f 6d 3e 6e 20 29 20 63  i+p->nFrom>n ) c
6b80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
6b90: 66 28 20 6d 61 74 63 68 46 72 6f 6d 28 70 2c 20  f( matchFrom(p, 
6ba0: 7a 2b 69 2c 20 6e 2d 69 29 3d 3d 30 20 29 20 63  z+i, n-i)==0 ) c
6bb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
6bc0: 66 28 20 70 2d 3e 6e 54 6f 3d 3d 30 20 29 7b 0a  f( p->nTo==0 ){.
6bd0: 20 20 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20          apNew = 
6be0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
6bf0: 70 46 72 6f 6d 2d 3e 61 70 44 65 6c 2c 0a 20 20  pFrom->apDel,.  
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
6c20: 7a 65 6f 66 28 2a 61 70 4e 65 77 29 2a 28 70 46  zeof(*apNew)*(pF
6c30: 72 6f 6d 2d 3e 6e 44 65 6c 2b 31 29 29 3b 0a 20  rom->nDel+1));. 
6c40: 20 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77         if( apNew
6c50: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
6c60: 20 20 20 20 20 70 46 72 6f 6d 2d 3e 61 70 44 65       pFrom->apDe
6c70: 6c 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20  l = apNew;.     
6c80: 20 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e     apNew[pFrom->
6c90: 6e 44 65 6c 2b 2b 5d 20 3d 20 70 3b 0a 20 20 20  nDel++] = p;.   
6ca0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6cb0: 20 20 61 70 4e 65 77 20 3d 20 73 71 6c 69 74 65    apNew = sqlite
6cc0: 33 5f 72 65 61 6c 6c 6f 63 28 70 46 72 6f 6d 2d  3_realloc(pFrom-
6cd0: 3e 61 70 53 75 62 73 74 2c 0a 20 20 20 20 20 20  >apSubst,.      
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
6d00: 28 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f 6d 2d  (*apNew)*(pFrom-
6d10: 3e 6e 53 75 62 73 74 2b 31 29 29 3b 0a 20 20 20  >nSubst+1));.   
6d20: 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d       if( apNew==
6d30: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
6d40: 20 20 20 70 46 72 6f 6d 2d 3e 61 70 53 75 62 73     pFrom->apSubs
6d50: 74 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20  t = apNew;.     
6d60: 20 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e     apNew[pFrom->
6d70: 6e 53 75 62 73 74 2b 2b 5d 20 3d 20 70 3b 0a 20  nSubst++] = p;. 
6d80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6d90: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
6da0: 65 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72  editDist3FromStr
6db0: 69 6e 67 44 65 6c 65 74 65 28 70 53 74 72 29 3b  ingDelete(pStr);
6dc0: 0a 20 20 20 20 20 20 70 53 74 72 20 3d 20 30 3b  .      pStr = 0;
6dd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6de0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6df0: 20 70 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pStr;.}../*.** 
6e00: 55 70 64 61 74 65 20 65 6e 74 72 79 20 6d 5b 69  Update entry m[i
6e10: 5d 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  ] such that it i
6e20: 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 66  s the minimum of
6e30: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
6e40: 75 65 0a 2a 2a 20 61 6e 64 20 6d 5b 6a 5d 2b 69  ue.** and m[j]+i
6e50: 43 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Cost..**.** If t
6e60: 68 65 20 69 43 6f 73 74 20 69 73 20 31 2c 30 30  he iCost is 1,00
6e70: 30 2c 30 30 30 20 6f 72 20 67 72 65 61 74 65 72  0,000 or greater
6e80: 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20  , then consider 
6e90: 74 68 65 20 63 6f 73 74 20 74 6f 20 62 65 0a 2a  the cost to be.*
6ea0: 2a 20 69 6e 66 69 6e 69 74 65 20 61 6e 64 20 73  * infinite and s
6eb0: 6b 69 70 20 74 68 65 20 75 70 64 61 74 65 2e 0a  kip the update..
6ec0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
6ed0: 70 64 61 74 65 43 6f 73 74 28 0a 20 20 75 6e 73  pdateCost(.  uns
6ee0: 69 67 6e 65 64 20 69 6e 74 20 2a 6d 2c 0a 20 20  igned int *m,.  
6ef0: 69 6e 74 20 69 2c 0a 20 20 69 6e 74 20 6a 2c 0a  int i,.  int j,.
6f00: 20 20 69 6e 74 20 69 43 6f 73 74 0a 29 7b 0a 20    int iCost.){. 
6f10: 20 61 73 73 65 72 74 28 20 69 43 6f 73 74 3e 3d   assert( iCost>=
6f20: 30 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 73 74  0 );.  if( iCost
6f30: 3c 31 30 30 30 30 20 29 7b 0a 20 20 20 20 75 6e  <10000 ){.    un
6f40: 73 69 67 6e 65 64 20 69 6e 74 20 62 20 3d 20 6d  signed int b = m
6f50: 5b 6a 5d 20 2b 20 69 43 6f 73 74 3b 0a 20 20 20  [j] + iCost;.   
6f60: 20 69 66 28 20 62 3c 6d 5b 69 5d 20 29 20 6d 5b   if( b<m[i] ) m[
6f70: 69 5d 20 3d 20 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f  i] = b;.  }.}../
6f80: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 65 64  * Compute the ed
6f90: 69 74 20 64 69 73 74 61 6e 63 65 20 62 65 74 77  it distance betw
6fa0: 65 65 6e 20 74 77 6f 20 73 74 72 69 6e 67 73 2e  een two strings.
6fb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
6fc0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
6fd0: 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
6fe0: 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ber which is the
6ff0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
7000: 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69 73  ** If pnMatch is
7010: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
7020: 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74 20  *pnMatch is set 
7030: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
7040: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 28   characters.** (
7050: 6e 6f 74 20 62 79 74 65 73 29 20 69 6e 20 7a 32  not bytes) in z2
7060: 20 74 68 61 74 20 6d 61 74 63 68 65 64 20 74 68   that matched th
7070: 65 20 73 65 61 72 63 68 20 70 61 74 74 65 72 6e  e search pattern
7080: 20 69 6e 20 2a 70 46 72 6f 6d 2e 20 49 66 20 70   in *pFrom. If p
7090: 46 72 6f 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  From does.** not
70a0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 61 74   contain the pat
70b0: 74 65 72 6e 20 66 6f 72 20 61 20 70 72 65 66 69  tern for a prefi
70c0: 78 2d 73 65 61 72 63 68 2c 20 74 68 65 6e 20 74  x-search, then t
70d0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
70e0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63  e number.** of c
70f0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 32 2e  haracters in z2.
7100: 20 49 66 20 70 46 72 6f 6d 20 64 6f 65 73 20 63   If pFrom does c
7110: 6f 6e 74 61 69 6e 20 61 20 70 72 65 66 69 78 20  ontain a prefix 
7120: 73 65 61 72 63 68 20 70 61 74 74 65 72 6e 2c 20  search pattern, 
7130: 74 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 74 68  then.** it is th
7140: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
7150: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 70 72  acters in the pr
7160: 65 66 69 78 20 6f 66 20 7a 32 20 74 68 61 74 20  efix of z2 that 
7170: 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20 0a 2a  was deemed to .*
7180: 2a 20 6d 61 74 63 68 20 70 46 72 6f 6d 2e 0a 2a  * match pFrom..*
7190: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69  /.static int edi
71a0: 74 44 69 73 74 33 43 6f 72 65 28 0a 20 20 45 64  tDist3Core(.  Ed
71b0: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
71c0: 67 20 2a 70 46 72 6f 6d 2c 20 20 2f 2a 20 54 68  g *pFrom,  /* Th
71d0: 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f  e FROM string */
71e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
71f0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
7200: 2f 2a 20 54 68 65 20 54 4f 20 73 74 72 69 6e 67  /* The TO string
7210: 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 20 20   */.  int n2,   
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
7240: 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f  the TO string */
7250: 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73  .  const EditDis
7260: 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 20 20  t3Lang *pLang,  
7270: 2f 2a 20 45 64 69 74 20 77 65 69 67 68 74 73 20  /* Edit weights 
7280: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
7290: 20 6c 61 6e 67 75 61 67 65 20 49 44 20 2a 2f 0a   language ID */.
72a0: 20 20 69 6e 74 20 2a 70 6e 4d 61 74 63 68 20 20    int *pnMatch  
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72c0: 2a 20 4f 55 54 3a 20 43 68 61 72 61 63 74 65 72  * OUT: Character
72d0: 73 20 69 6e 20 6d 61 74 63 68 65 64 20 70 72 65  s in matched pre
72e0: 66 69 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  fix */.){.  int 
72f0: 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 31 2c 20  k, n;.  int i1, 
7300: 62 31 3b 0a 20 20 69 6e 74 20 69 32 2c 20 62 32  b1;.  int i2, b2
7310: 3b 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f  ;.  EditDist3Fro
7320: 6d 53 74 72 69 6e 67 20 66 20 3d 20 2a 70 46 72  mString f = *pFr
7330: 6f 6d 3b 0a 20 20 45 64 69 74 44 69 73 74 33 54  om;.  EditDist3T
7340: 6f 20 2a 61 32 3b 0a 20 20 75 6e 73 69 67 6e 65  o *a2;.  unsigne
7350: 64 20 69 6e 74 20 2a 6d 3b 0a 20 20 69 6e 74 20  d int *m;.  int 
7360: 73 7a 52 6f 77 3b 0a 20 20 45 64 69 74 44 69 73  szRow;.  EditDis
7370: 74 33 43 6f 73 74 20 2a 70 3b 0a 20 20 69 6e 74  t3Cost *p;.  int
7380: 20 72 65 73 3b 0a 0a 20 20 2f 2a 20 61 6c 6c 6f   res;..  /* allo
7390: 63 61 74 65 20 74 68 65 20 57 61 67 6e 65 72 20  cate the Wagner 
73a0: 6d 61 74 72 69 78 20 61 6e 64 20 74 68 65 20 61  matrix and the a
73b0: 54 6f 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 74  To[] array for t
73c0: 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a  he TO string */.
73d0: 20 20 6e 20 3d 20 28 66 2e 6e 2b 31 29 2a 28 6e    n = (f.n+1)*(n
73e0: 32 2b 31 29 3b 0a 20 20 6e 20 3d 20 28 6e 2b 31  2+1);.  n = (n+1
73f0: 29 26 7e 31 3b 0a 20 20 6d 20 3d 20 73 71 6c 69  )&~1;.  m = sqli
7400: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2a 73 69  te3_malloc( n*si
7410: 7a 65 6f 66 28 6d 5b 30 5d 29 20 2b 20 73 69 7a  zeof(m[0]) + siz
7420: 65 6f 66 28 61 32 5b 30 5d 29 2a 6e 32 20 29 3b  eof(a2[0])*n2 );
7430: 0a 20 20 69 66 28 20 6d 3d 3d 30 20 29 20 72 65  .  if( m==0 ) re
7440: 74 75 72 6e 20 2d 31 3b 20 20 20 20 20 20 20 20  turn -1;        
7450: 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 6d 65      /* Out of me
7460: 6d 6f 72 79 20 2a 2f 0a 20 20 61 32 20 3d 20 28  mory */.  a2 = (
7470: 45 64 69 74 44 69 73 74 33 54 6f 2a 29 26 6d 5b  EditDist3To*)&m[
7480: 6e 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 32 2c  n];.  memset(a2,
7490: 20 30 2c 20 73 69 7a 65 6f 66 28 61 32 5b 30 5d   0, sizeof(a2[0]
74a0: 29 2a 6e 32 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  )*n2);..  /* Fil
74b0: 6c 20 69 6e 20 74 68 65 20 61 31 5b 5d 20 6d 61  l in the a1[] ma
74c0: 74 72 69 78 20 66 6f 72 20 61 6c 6c 20 63 68 61  trix for all cha
74d0: 72 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 54  racters of the T
74e0: 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 66 6f  O string */.  fo
74f0: 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b 20 69  r(i2=0; i2<n2; i
7500: 32 2b 2b 29 7b 0a 20 20 20 20 61 32 5b 69 32 5d  2++){.    a2[i2]
7510: 2e 6e 42 79 74 65 20 3d 20 75 74 66 38 4c 65 6e  .nByte = utf8Len
7520: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
7530: 7a 32 5b 69 32 5d 2c 20 6e 32 2d 69 32 29 3b 0a  z2[i2], n2-i2);.
7540: 20 20 20 20 66 6f 72 28 70 3d 70 4c 61 6e 67 2d      for(p=pLang-
7550: 3e 70 43 6f 73 74 3b 20 70 3b 20 70 3d 70 2d 3e  >pCost; p; p=p->
7560: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 45 64  pNext){.      Ed
7570: 69 74 44 69 73 74 33 43 6f 73 74 20 2a 2a 61 70  itDist3Cost **ap
7580: 4e 65 77 3b 0a 20 20 20 20 20 20 69 66 28 20 70  New;.      if( p
7590: 2d 3e 6e 46 72 6f 6d 3e 30 20 29 20 63 6f 6e 74  ->nFrom>0 ) cont
75a0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
75b0: 69 32 2b 70 2d 3e 6e 54 6f 3e 6e 32 20 29 20 63  i2+p->nTo>n2 ) c
75c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
75d0: 66 28 20 6d 61 74 63 68 54 6f 28 70 2c 20 7a 32  f( matchTo(p, z2
75e0: 2b 69 32 2c 20 6e 32 2d 69 32 29 3d 3d 30 20 29  +i2, n2-i2)==0 )
75f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7600: 20 61 32 5b 69 32 5d 2e 6e 49 6e 73 2b 2b 3b 0a   a2[i2].nIns++;.
7610: 20 20 20 20 20 20 61 70 4e 65 77 20 3d 20 73 71        apNew = sq
7620: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 32  lite3_realloc(a2
7630: 5b 69 32 5d 2e 61 70 49 6e 73 2c 20 73 69 7a 65  [i2].apIns, size
7640: 6f 66 28 2a 61 70 4e 65 77 29 2a 61 32 5b 69 32  of(*apNew)*a2[i2
7650: 5d 2e 6e 49 6e 73 29 3b 0a 20 20 20 20 20 20 69  ].nIns);.      i
7660: 66 28 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  f( apNew==0 ){. 
7670: 20 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31 3b         res = -1;
7680: 20 20 2f 2a 20 4f 75 74 20 6f 66 20 6d 65 6d 6f    /* Out of memo
7690: 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  ry */.        go
76a0: 74 6f 20 65 64 69 74 44 69 73 74 33 41 62 6f 72  to editDist3Abor
76b0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
76c0: 20 61 32 5b 69 32 5d 2e 61 70 49 6e 73 20 3d 20   a2[i2].apIns = 
76d0: 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 32 5b  apNew;.      a2[
76e0: 69 32 5d 2e 61 70 49 6e 73 5b 61 32 5b 69 32 5d  i2].apIns[a2[i2]
76f0: 2e 6e 49 6e 73 2d 31 5d 20 3d 20 70 3b 0a 20 20  .nIns-1] = p;.  
7700: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
7710: 65 70 61 72 65 20 74 6f 20 63 6f 6d 70 75 74 65  epare to compute
7720: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 65 64 69   the minimum edi
7730: 74 20 64 69 73 74 61 6e 63 65 20 2a 2f 0a 20 20  t distance */.  
7740: 73 7a 52 6f 77 20 3d 20 66 2e 6e 2b 31 3b 0a 20  szRow = f.n+1;. 
7750: 20 6d 65 6d 73 65 74 28 6d 2c 20 30 78 30 31 2c   memset(m, 0x01,
7760: 20 28 6e 32 2b 31 29 2a 73 7a 52 6f 77 2a 73 69   (n2+1)*szRow*si
7770: 7a 65 6f 66 28 6d 5b 30 5d 29 29 3b 0a 20 20 6d  zeof(m[0]));.  m
7780: 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  [0] = 0;..  /* F
7790: 69 72 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  irst fill in the
77a0: 20 74 6f 70 2d 72 6f 77 20 6f 66 20 74 68 65 20   top-row of the 
77b0: 6d 61 74 72 69 78 20 77 69 74 68 20 46 52 4f 4d  matrix with FROM
77c0: 20 64 65 6c 65 74 69 6f 6e 20 63 6f 73 74 73 20   deletion costs 
77d0: 2a 2f 0a 20 20 66 6f 72 28 69 31 3d 30 3b 20 69  */.  for(i1=0; i
77e0: 31 3c 66 2e 6e 3b 20 69 31 20 2b 3d 20 62 31 29  1<f.n; i1 += b1)
77f0: 7b 0a 20 20 20 20 62 31 20 3d 20 66 2e 61 5b 69  {.    b1 = f.a[i
7800: 31 5d 2e 6e 42 79 74 65 3b 0a 20 20 20 20 75 70  1].nByte;.    up
7810: 64 61 74 65 43 6f 73 74 28 6d 2c 20 69 31 2b 62  dateCost(m, i1+b
7820: 31 2c 20 69 31 2c 20 70 4c 61 6e 67 2d 3e 69 44  1, i1, pLang->iD
7830: 65 6c 43 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72  elCost);.    for
7840: 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e  (k=0; k<f.a[i1].
7850: 6e 44 65 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  nDel; k++){.    
7860: 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70    p = f.a[i1].ap
7870: 44 65 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 75 70  Del[k];.      up
7880: 64 61 74 65 43 6f 73 74 28 6d 2c 20 69 31 2b 70  dateCost(m, i1+p
7890: 2d 3e 6e 46 72 6f 6d 2c 20 69 31 2c 20 70 2d 3e  ->nFrom, i1, p->
78a0: 69 43 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  iCost);.    }.  
78b0: 7d 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  }..  /* Fill in 
78c0: 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 72  all subsequent r
78d0: 6f 77 73 2c 20 74 6f 70 2d 74 6f 2d 62 6f 74 74  ows, top-to-bott
78e0: 6f 6d 2c 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68  om, left-to-righ
78f0: 74 20 2a 2f 0a 20 20 66 6f 72 28 69 32 3d 30 3b  t */.  for(i2=0;
7900: 20 69 32 3c 6e 32 3b 20 69 32 20 2b 3d 20 62 32   i2<n2; i2 += b2
7910: 29 7b 0a 20 20 20 20 69 6e 74 20 72 78 3b 20 20  ){.    int rx;  
7920: 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20      /* Starting 
7930: 69 6e 64 65 78 20 66 6f 72 20 63 75 72 72 65 6e  index for curren
7940: 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  t row */.    int
7950: 20 72 78 70 3b 20 20 20 20 20 2f 2a 20 53 74 61   rxp;     /* Sta
7960: 72 74 69 6e 67 20 69 6e 64 65 78 20 66 6f 72 20  rting index for 
7970: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
7980: 20 20 20 20 62 32 20 3d 20 61 32 5b 69 32 5d 2e      b2 = a2[i2].
7990: 6e 42 79 74 65 3b 0a 20 20 20 20 72 78 20 3d 20  nByte;.    rx = 
79a0: 73 7a 52 6f 77 2a 28 69 32 2b 62 32 29 3b 0a 20  szRow*(i2+b2);. 
79b0: 20 20 20 72 78 70 20 3d 20 73 7a 52 6f 77 2a 69     rxp = szRow*i
79c0: 32 3b 0a 20 20 20 20 75 70 64 61 74 65 43 6f 73  2;.    updateCos
79d0: 74 28 6d 2c 20 72 78 2c 20 72 78 70 2c 20 70 4c  t(m, rx, rxp, pL
79e0: 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 29 3b 0a  ang->iInsCost);.
79f0: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 61      for(k=0; k<a
7a00: 32 5b 69 32 5d 2e 6e 49 6e 73 3b 20 6b 2b 2b 29  2[i2].nIns; k++)
7a10: 7b 0a 20 20 20 20 20 20 70 20 3d 20 61 32 5b 69  {.      p = a2[i
7a20: 32 5d 2e 61 70 49 6e 73 5b 6b 5d 3b 0a 20 20 20  2].apIns[k];.   
7a30: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
7a40: 20 73 7a 52 6f 77 2a 28 69 32 2b 70 2d 3e 6e 54   szRow*(i2+p->nT
7a50: 6f 29 2c 20 72 78 70 2c 20 70 2d 3e 69 43 6f 73  o), rxp, p->iCos
7a60: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  t);.    }.    fo
7a70: 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20  r(i1=0; i1<f.n; 
7a80: 69 31 2b 3d 62 31 29 7b 0a 20 20 20 20 20 20 69  i1+=b1){.      i
7a90: 6e 74 20 63 78 3b 20 20 20 20 2f 2a 20 49 6e 64  nt cx;    /* Ind
7aa0: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65  ex of current ce
7ab0: 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ll */.      int 
7ac0: 63 78 70 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20  cxp;   /* Index 
7ad0: 6f 66 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  of cell immediat
7ae0: 65 6c 79 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ely to the left 
7af0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 78 64  */.      int cxd
7b00: 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  ;   /* Index of 
7b10: 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
7b20: 20 61 6e 64 20 6f 6e 65 20 72 6f 77 20 61 62 6f   and one row abo
7b30: 76 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ve */.      int 
7b40: 63 78 75 3b 20 20 20 2f 2a 20 49 6e 64 65 78 20  cxu;   /* Index 
7b50: 6f 66 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  of cell immediat
7b60: 65 6c 79 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20  ely above */.   
7b70: 20 20 20 62 31 20 3d 20 66 2e 61 5b 69 31 5d 2e     b1 = f.a[i1].
7b80: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 63 78 70  nByte;.      cxp
7b90: 20 3d 20 72 78 20 2b 20 69 31 3b 0a 20 20 20 20   = rx + i1;.    
7ba0: 20 20 63 78 20 3d 20 63 78 70 20 2b 20 62 31 3b    cx = cxp + b1;
7bb0: 0a 20 20 20 20 20 20 63 78 64 20 3d 20 72 78 70  .      cxd = rxp
7bc0: 20 2b 20 69 31 3b 0a 20 20 20 20 20 20 63 78 75   + i1;.      cxu
7bd0: 20 3d 20 63 78 64 20 2b 20 62 31 3b 0a 20 20 20   = cxd + b1;.   
7be0: 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c     updateCost(m,
7bf0: 20 63 78 2c 20 63 78 70 2c 20 70 4c 61 6e 67 2d   cx, cxp, pLang-
7c00: 3e 69 44 65 6c 43 6f 73 74 29 3b 0a 20 20 20 20  >iDelCost);.    
7c10: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61    for(k=0; k<f.a
7c20: 5b 69 31 5d 2e 6e 44 65 6c 3b 20 6b 2b 2b 29 7b  [i1].nDel; k++){
7c30: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66 2e 61  .        p = f.a
7c40: 5b 69 31 5d 2e 61 70 44 65 6c 5b 6b 5d 3b 0a 20  [i1].apDel[k];. 
7c50: 20 20 20 20 20 20 20 75 70 64 61 74 65 43 6f 73         updateCos
7c60: 74 28 6d 2c 20 63 78 70 2b 70 2d 3e 6e 46 72 6f  t(m, cxp+p->nFro
7c70: 6d 2c 20 63 78 70 2c 20 70 2d 3e 69 43 6f 73 74  m, cxp, p->iCost
7c80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7c90: 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63   updateCost(m, c
7ca0: 78 2c 20 63 78 75 2c 20 70 4c 61 6e 67 2d 3e 69  x, cxu, pLang->i
7cb0: 49 6e 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  InsCost);.      
7cc0: 69 66 28 20 6d 61 74 63 68 46 72 6f 6d 54 6f 28  if( matchFromTo(
7cd0: 26 66 2c 20 69 31 2c 20 7a 32 2b 69 32 2c 20 6e  &f, i1, z2+i2, n
7ce0: 32 2d 69 32 29 20 29 7b 0a 20 20 20 20 20 20 20  2-i2) ){.       
7cf0: 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63   updateCost(m, c
7d00: 78 2c 20 63 78 64 2c 20 30 29 3b 0a 20 20 20 20  x, cxd, 0);.    
7d10: 20 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65    }.      update
7d20: 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 64 2c  Cost(m, cx, cxd,
7d30: 20 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73 74   pLang->iSubCost
7d40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  );.      for(k=0
7d50: 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 53 75 62  ; k<f.a[i1].nSub
7d60: 73 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  st; k++){.      
7d70: 20 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70    p = f.a[i1].ap
7d80: 53 75 62 73 74 5b 6b 5d 3b 0a 20 20 20 20 20 20  Subst[k];.      
7d90: 20 20 69 66 28 20 6d 61 74 63 68 54 6f 28 70 2c    if( matchTo(p,
7da0: 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29 20 29   z2+i2, n2-i2) )
7db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 64 61  {.          upda
7dc0: 74 65 43 6f 73 74 28 6d 2c 20 63 78 64 2b 70 2d  teCost(m, cxd+p-
7dd0: 3e 6e 46 72 6f 6d 2b 73 7a 52 6f 77 2a 70 2d 3e  >nFrom+szRow*p->
7de0: 6e 54 6f 2c 20 63 78 64 2c 20 70 2d 3e 69 43 6f  nTo, cxd, p->iCo
7df0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
7e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7e10: 0a 0a 23 69 66 20 30 20 20 2f 2a 20 45 6e 61 62  ..#if 0  /* Enab
7e20: 6c 65 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  le for debugging
7e30: 20 2a 2f 0a 20 20 70 72 69 6e 74 66 28 22 20 20   */.  printf("  
7e40: 20 20 20 20 20 20 20 5e 22 29 3b 0a 20 20 66 6f         ^");.  fo
7e50: 72 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20  r(i1=0; i1<f.n; 
7e60: 69 31 2b 2b 29 20 70 72 69 6e 74 66 28 22 20 25  i1++) printf(" %
7e70: 63 2d 25 32 78 22 2c 20 66 2e 7a 5b 69 31 5d 2c  c-%2x", f.z[i1],
7e80: 20 66 2e 7a 5b 69 31 5d 26 30 78 66 66 29 3b 0a   f.z[i1]&0xff);.
7e90: 20 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 5e    printf("\n   ^
7ea0: 3a 22 29 3b 0a 20 20 66 6f 72 28 69 31 3d 30 3b  :");.  for(i1=0;
7eb0: 20 69 31 3c 73 7a 52 6f 77 3b 20 69 31 2b 2b 29   i1<szRow; i1++)
7ec0: 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 6d 5b  {.    int v = m[
7ed0: 69 31 5d 3b 0a 20 20 20 20 69 66 28 20 76 3e 39  i1];.    if( v>9
7ee0: 39 39 39 20 29 20 70 72 69 6e 74 66 28 22 20 2a  999 ) printf(" *
7ef0: 2a 2a 2a 22 29 3b 0a 20 20 20 20 65 6c 73 65 20  ***");.    else 
7f00: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
7f10: 20 25 34 64 22 2c 20 76 29 3b 0a 20 20 7d 0a 20   %4d", v);.  }. 
7f20: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
7f30: 20 66 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32   for(i2=0; i2<n2
7f40: 3b 20 69 32 2b 2b 29 7b 0a 20 20 20 20 70 72 69  ; i2++){.    pri
7f50: 6e 74 66 28 22 25 63 2d 25 30 32 78 3a 22 2c 20  ntf("%c-%02x:", 
7f60: 7a 32 5b 69 32 5d 2c 20 7a 32 5b 69 32 5d 26 30  z2[i2], z2[i2]&0
7f70: 78 66 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 31  xff);.    for(i1
7f80: 3d 30 3b 20 69 31 3c 73 7a 52 6f 77 3b 20 69 31  =0; i1<szRow; i1
7f90: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  ++){.      int v
7fa0: 20 3d 20 6d 5b 28 69 32 2b 31 29 2a 73 7a 52 6f   = m[(i2+1)*szRo
7fb0: 77 2b 69 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  w+i1];.      if(
7fc0: 20 76 3e 39 39 39 39 20 29 20 70 72 69 6e 74 66   v>9999 ) printf
7fd0: 28 22 20 2a 2a 2a 2a 22 29 3b 0a 20 20 20 20 20  (" ****");.     
7fe0: 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 70 72   else         pr
7ff0: 69 6e 74 66 28 22 20 25 34 64 22 2c 20 76 29 3b  intf(" %4d", v);
8000: 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
8010: 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e  f("\n");.  }.#en
8020: 64 69 66 0a 0a 20 20 2f 2a 20 46 72 65 65 20 6d  dif..  /* Free m
8030: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
8040: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  s and return the
8050: 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 72 65 73   result */.  res
8060: 20 3d 20 28 69 6e 74 29 6d 5b 73 7a 52 6f 77 2a   = (int)m[szRow*
8070: 28 6e 32 2b 31 29 2d 31 5d 3b 0a 20 20 6e 20 3d  (n2+1)-1];.  n =
8080: 20 6e 32 3b 0a 20 20 69 66 28 20 66 2e 69 73 50   n2;.  if( f.isP
8090: 72 65 66 69 78 20 29 7b 0a 20 20 20 20 66 6f 72  refix ){.    for
80a0: 28 69 32 3d 31 3b 20 69 32 3c 3d 6e 32 3b 20 69  (i2=1; i2<=n2; i
80b0: 32 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  2++){.      int 
80c0: 62 20 3d 20 6d 5b 73 7a 52 6f 77 2a 69 32 2d 31  b = m[szRow*i2-1
80d0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 62 3c 3d  ];.      if( b<=
80e0: 72 65 73 20 29 7b 20 0a 20 20 20 20 20 20 20 20  res ){ .        
80f0: 72 65 73 20 3d 20 62 3b 0a 20 20 20 20 20 20 20  res = b;.       
8100: 20 6e 20 3d 20 69 32 20 2d 20 31 3b 0a 20 20 20   n = i2 - 1;.   
8110: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8120: 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29 7b 0a   if( pnMatch ){.
8130: 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d      int nExtra =
8140: 20 30 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b   0;.    for(k=0;
8150: 20 6b 3c 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20   k<n; k++){.    
8160: 20 20 69 66 28 20 28 7a 32 5b 6b 5d 20 26 20 30    if( (z2[k] & 0
8170: 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 45 78  xc0)==0x80 ) nEx
8180: 74 72 61 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  tra++;.    }.   
8190: 20 2a 70 6e 4d 61 74 63 68 20 3d 20 6e 20 2d 20   *pnMatch = n - 
81a0: 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 65 64 69  nExtra;.  }..edi
81b0: 74 44 69 73 74 33 41 62 6f 72 74 3a 0a 20 20 66  tDist3Abort:.  f
81c0: 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b 20  or(i2=0; i2<n2; 
81d0: 69 32 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66 72  i2++) sqlite3_fr
81e0: 65 65 28 61 32 5b 69 32 5d 2e 61 70 49 6e 73 29  ee(a2[i2].apIns)
81f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
8200: 28 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (m);.  return re
8210: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  s;.}../*.** Get 
8220: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 45  an appropriate E
8230: 64 69 74 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a  ditDist3Lang obj
8240: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ect..*/.static c
8250: 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c 61  onst EditDist3La
8260: 6e 67 20 2a 65 64 69 74 44 69 73 74 33 46 69 6e  ng *editDist3Fin
8270: 64 4c 61 6e 67 28 0a 20 20 45 64 69 74 44 69 73  dLang(.  EditDis
8280: 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  t3Config *pConfi
8290: 67 2c 0a 20 20 69 6e 74 20 69 4c 61 6e 67 0a 29  g,.  int iLang.)
82a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
82b0: 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
82c0: 3e 6e 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20  >nLang; i++){.  
82d0: 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
82e0: 5b 69 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61 6e 67  [i].iLang==iLang
82f0: 20 29 20 72 65 74 75 72 6e 20 26 70 43 6f 6e 66   ) return &pConf
8300: 69 67 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ig->a[i];.  }.  
8310: 72 65 74 75 72 6e 20 26 65 64 69 74 44 69 73 74  return &editDist
8320: 33 4c 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  3Lang;.}../*.** 
8330: 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65 64 69  Function:    edi
8340: 74 64 69 73 74 33 28 41 2c 42 2c 69 4c 61 6e 67  tdist3(A,B,iLang
8350: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
8360: 20 20 65 64 69 74 64 69 73 74 33 28 74 61 62 6c    editdist3(tabl
8370: 65 6e 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52 65 74  ename).**.** Ret
8380: 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
8390: 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74 72  transforming str
83a0: 69 6e 67 20 41 20 69 6e 74 6f 20 73 74 72 69 6e  ing A into strin
83b0: 67 20 42 20 75 73 69 6e 67 20 65 64 69 74 0a 2a  g B using edit.*
83c0: 2a 20 77 65 69 67 68 74 73 20 66 6f 72 20 69 4c  * weights for iL
83d0: 61 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ang..**.** The s
83e0: 65 63 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61 64 73  econd form loads
83f0: 20 65 64 69 74 20 77 65 69 67 68 74 73 20 69 6e   edit weights in
8400: 74 6f 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 61  to memory from a
8410: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
8420: 63 20 76 6f 69 64 20 65 64 69 74 44 69 73 74 33  c void editDist3
8430: 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  SqlFunc(.  sqlit
8440: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
8450: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
8460: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8470: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 45 64 69   **argv.){.  Edi
8480: 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43  tDist3Config *pC
8490: 6f 6e 66 69 67 20 3d 20 28 45 64 69 74 44 69 73  onfig = (EditDis
84a0: 74 33 43 6f 6e 66 69 67 2a 29 73 71 6c 69 74 65  t3Config*)sqlite
84b0: 33 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74  3_user_data(cont
84c0: 65 78 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  ext);.  sqlite3 
84d0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
84e0: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
84f0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 69 6e 74 20  context);.  int 
8500: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  rc;.  if( argc==
8510: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  1 ){.    const c
8520: 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20 28 63  har *zTable = (c
8530: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
8540: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8550: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 72 63 20 3d  gv[0]);.    rc =
8560: 20 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   editDist3Config
8570: 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20 64 62  Load(pConfig, db
8580: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
8590: 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 5f  f( rc ) sqlite3_
85a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
85b0: 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a  e(context, rc);.
85c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
85d0: 73 74 20 63 68 61 72 20 2a 7a 41 20 3d 20 28 63  st char *zA = (c
85e0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
85f0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8600: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 63 6f 6e 73  gv[0]);.    cons
8610: 74 20 63 68 61 72 20 2a 7a 42 20 3d 20 28 63 6f  t char *zB = (co
8620: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
8630: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8640: 76 5b 31 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e  v[1]);.    int n
8650: 41 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  A = sqlite3_valu
8660: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
8670: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 20 3d 20 73  ;.    int nB = s
8680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
8690: 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20  es(argv[1]);.   
86a0: 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 61 72 67   int iLang = arg
86b0: 63 3d 3d 33 20 3f 20 73 71 6c 69 74 65 33 5f 76  c==3 ? sqlite3_v
86c0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d  alue_int(argv[2]
86d0: 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  ) : 0;.    const
86e0: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a   EditDist3Lang *
86f0: 70 4c 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74  pLang = editDist
8700: 33 46 69 6e 64 4c 61 6e 67 28 70 43 6f 6e 66 69  3FindLang(pConfi
8710: 67 2c 20 69 4c 61 6e 67 29 3b 0a 20 20 20 20 45  g, iLang);.    E
8720: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
8730: 6e 67 20 2a 70 46 72 6f 6d 3b 0a 20 20 20 20 69  ng *pFrom;.    i
8740: 6e 74 20 64 69 73 74 3b 0a 0a 20 20 20 20 70 46  nt dist;..    pF
8750: 72 6f 6d 20 3d 20 65 64 69 74 44 69 73 74 33 46  rom = editDist3F
8760: 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28 70 4c 61  romStringNew(pLa
8770: 6e 67 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20 20 20  ng, zA, nA);.   
8780: 20 69 66 28 20 70 46 72 6f 6d 3d 3d 30 20 29 7b   if( pFrom==0 ){
8790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
87a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
87b0: 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  m(context);.    
87c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
87d0: 20 20 20 20 64 69 73 74 20 3d 20 65 64 69 74 44      dist = editD
87e0: 69 73 74 33 43 6f 72 65 28 70 46 72 6f 6d 2c 20  ist3Core(pFrom, 
87f0: 7a 42 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c 20 30  zB, nB, pLang, 0
8800: 29 3b 0a 20 20 20 20 65 64 69 74 44 69 73 74 33  );.    editDist3
8810: 46 72 6f 6d 53 74 72 69 6e 67 44 65 6c 65 74 65  FromStringDelete
8820: 28 70 46 72 6f 6d 29 3b 0a 20 20 20 20 69 66 28  (pFrom);.    if(
8830: 20 64 69 73 74 3d 3d 28 2d 31 29 20 29 7b 0a 20   dist==(-1) ){. 
8840: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8850: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
8860: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65  context);.    }e
8870: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8880: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
8890: 6e 74 65 78 74 2c 20 64 69 73 74 29 3b 0a 20 20  ntext, dist);.  
88a0: 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a    }.  } .}../*.*
88b0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 65  * Register the e
88c0: 64 69 74 44 69 73 74 33 20 66 75 6e 63 74 69 6f  ditDist3 functio
88d0: 6e 20 77 69 74 68 20 53 51 4c 69 74 65 0a 2a 2f  n with SQLite.*/
88e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74  .static int edit
88f0: 44 69 73 74 33 49 6e 73 74 61 6c 6c 28 73 71 6c  Dist3Install(sql
8900: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
8910: 20 72 63 3b 0a 20 20 45 64 69 74 44 69 73 74 33   rc;.  EditDist3
8920: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
8930: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
8940: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66 69  ( sizeof(*pConfi
8950: 67 29 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e  g) );.  if( pCon
8960: 66 69 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  fig==0 ) return 
8970: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8980: 6d 65 6d 73 65 74 28 70 43 6f 6e 66 69 67 2c 20  memset(pConfig, 
8990: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66  0, sizeof(*pConf
89a0: 69 67 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ig));.  rc = sql
89b0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
89c0: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69  tion_v2(db, "edi
89d0: 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20  tdist3",.       
89e0: 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45         2, SQLITE
89f0: 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69 67 2c 20  _UTF8, pConfig, 
8a00: 65 64 69 74 44 69 73 74 33 53 71 6c 46 75 6e 63  editDist3SqlFunc
8a10: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
8a20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8a30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8a40: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8a50: 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69 74  ion_v2(db, "edit
8a60: 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20 20  dist3",.        
8a70: 20 20 20 20 20 20 20 20 33 2c 20 53 51 4c 49 54          3, SQLIT
8a80: 45 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69 67 2c  E_UTF8, pConfig,
8a90: 20 65 64 69 74 44 69 73 74 33 53 71 6c 46 75 6e   editDist3SqlFun
8aa0: 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  c, 0, 0, 0);.  }
8ab0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8ac0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
8ad0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8ae0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
8af0: 22 65 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20  "editdist3",.   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
8b10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 43 6f  SQLITE_UTF8, pCo
8b20: 6e 66 69 67 2c 20 65 64 69 74 44 69 73 74 33 53  nfig, editDist3S
8b30: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 2c 0a 20 20  qlFunc, 0, 0,.  
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
8b50: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c  itDist3ConfigDel
8b60: 65 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ete);.  }else{. 
8b70: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8b80: 70 43 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 20 20  pConfig);.  }.  
8b90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20  return rc;.}./* 
8ba0: 45 6e 64 20 63 6f 6e 66 69 67 75 72 61 62 6c 65  End configurable
8bb0: 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64   cost unicode ed
8bc0: 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74  it distance rout
8bd0: 69 6e 65 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ines.***********
8be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c20: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
8c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8c70: 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 72 61 6e  **.** Begin tran
8c80: 73 6c 69 74 65 72 61 74 65 20 75 6e 69 63 6f 64  sliterate unicod
8c90: 65 2d 74 6f 2d 61 73 63 69 69 20 69 6d 70 6c 65  e-to-ascii imple
8ca0: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2f 0a 0a 23 69  mentation.*/..#i
8cb0: 66 20 21 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  f !SQLITE_AMALGA
8cc0: 4d 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  MATION./*.** Thi
8cd0: 73 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69  s lookup table i
8ce0: 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 64  s used to help d
8cf0: 65 63 6f 64 65 20 74 68 65 20 66 69 72 73 74 20  ecode the first 
8d00: 62 79 74 65 20 6f 66 0a 2a 2a 20 61 20 6d 75 6c  byte of.** a mul
8d10: 74 69 2d 62 79 74 65 20 55 54 46 38 20 63 68 61  ti-byte UTF8 cha
8d20: 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
8d30: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8d40: 20 63 68 61 72 20 73 71 6c 69 74 65 33 55 74 66   char sqlite3Utf
8d50: 38 54 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20  8Trans1[] = {.  
8d60: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32  0x00, 0x01, 0x02
8d70: 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78  , 0x03, 0x04, 0x
8d80: 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a  05, 0x06, 0x07,.
8d90: 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78    0x08, 0x09, 0x
8da0: 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20  0a, 0x0b, 0x0c, 
8db0: 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66  0x0d, 0x0e, 0x0f
8dc0: 2c 0a 20 20 30 78 31 30 2c 20 30 78 31 31 2c 20  ,.  0x10, 0x11, 
8dd0: 30 78 31 32 2c 20 30 78 31 33 2c 20 30 78 31 34  0x12, 0x13, 0x14
8de0: 2c 20 30 78 31 35 2c 20 30 78 31 36 2c 20 30 78  , 0x15, 0x16, 0x
8df0: 31 37 2c 0a 20 20 30 78 31 38 2c 20 30 78 31 39  17,.  0x18, 0x19
8e00: 2c 20 30 78 31 61 2c 20 30 78 31 62 2c 20 30 78  , 0x1a, 0x1b, 0x
8e10: 31 63 2c 20 30 78 31 64 2c 20 30 78 31 65 2c 20  1c, 0x1d, 0x1e, 
8e20: 30 78 31 66 2c 0a 20 20 30 78 30 30 2c 20 30 78  0x1f,.  0x00, 0x
8e30: 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20  01, 0x02, 0x03, 
8e40: 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36  0x04, 0x05, 0x06
8e50: 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20  , 0x07,.  0x08, 
8e60: 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62  0x09, 0x0a, 0x0b
8e70: 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78  , 0x0c, 0x0d, 0x
8e80: 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 30 30  0e, 0x0f,.  0x00
8e90: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
8ea0: 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20  03, 0x04, 0x05, 
8eb0: 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78  0x06, 0x07,.  0x
8ec0: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20  00, 0x01, 0x02, 
8ed0: 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 31  0x03, 0x00, 0x01
8ee0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d 3b  , 0x00, 0x00,.};
8ef0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
8f00: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
8f10: 6f 66 20 74 68 65 20 66 69 72 73 74 20 55 54 46  of the first UTF
8f20: 2d 38 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  -8 character in 
8f30: 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  the string..*/.s
8f40: 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 52 65  tatic int utf8Re
8f50: 61 64 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ad(const unsigne
8f60: 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  d char *z, int n
8f70: 2c 20 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a 20  , int *pSize){. 
8f80: 20 69 6e 74 20 63 2c 20 69 3b 0a 0a 20 20 2f 2a   int c, i;..  /*
8f90: 20 41 6c 6c 20 63 61 6c 6c 65 72 73 20 74 6f 20   All callers to 
8fa0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 28 69 6e  this routine (in
8fb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
8fc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 0a 20 20 2a  lementation).  *
8fd0: 2a 20 61 6c 77 61 79 73 20 68 61 76 65 20 6e 3e  * always have n>
8fe0: 30 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  0. */.  if( NEVE
8ff0: 52 28 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 63  R(n==0) ){.    c
9000: 20 3d 20 69 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   = i = 0;.  }els
9010: 65 7b 0a 20 20 20 20 63 20 3d 20 7a 5b 30 5d 3b  e{.    c = z[0];
9020: 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
9030: 69 66 28 20 63 3e 3d 30 78 63 30 20 29 7b 0a 20  if( c>=0xc0 ){. 
9040: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
9050: 55 74 66 38 54 72 61 6e 73 31 5b 63 2d 30 78 63  Utf8Trans1[c-0xc
9060: 30 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  0];.      while(
9070: 20 69 3c 6e 20 26 26 20 28 7a 5b 69 5d 20 26 20   i<n && (z[i] & 
9080: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20  0xc0)==0x80 ){. 
9090: 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36         c = (c<<6
90a0: 29 20 2b 20 28 30 78 33 66 20 26 20 7a 5b 69 2b  ) + (0x3f & z[i+
90b0: 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +]);.      }.   
90c0: 20 7d 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20   }.  }.  *pSize 
90d0: 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  = i;.  return c;
90e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
90f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9100: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
9110: 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 69 6e   utf-8 string in
9120: 20 74 68 65 20 6e 49 6e 20 62 79 74 65 0a 2a 2a   the nIn byte.**
9130: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
9140: 74 6f 20 62 79 20 7a 49 6e 2e 0a 2a 2f 0a 73 74  to by zIn..*/.st
9150: 61 74 69 63 20 69 6e 74 20 75 74 66 38 43 68 61  atic int utf8Cha
9160: 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  rlen(const char 
9170: 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a  *zIn, int nIn){.
9180: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
9190: 43 68 61 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Char = 0;.  for(
91a0: 69 3d 30 3b 20 69 3c 6e 49 6e 3b 20 6e 43 68 61  i=0; i<nIn; nCha
91b0: 72 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  r++){.    int sz
91c0: 3b 0a 20 20 20 20 75 74 66 38 52 65 61 64 28 28  ;.    utf8Read((
91d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
91e0: 68 61 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e  har *)&zIn[i], n
91f0: 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20  In-i, &sz);.    
9200: 69 20 2b 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 72  i += sz;.  }.  r
9210: 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a  eturn nChar;.}..
9220: 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f 66 20 74  /*.** Table of t
9230: 72 61 6e 73 6c 61 74 69 6f 6e 73 20 66 72 6f 6d  ranslations from
9240: 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
9250: 65 72 73 20 69 6e 74 6f 20 41 53 43 49 49 2e 0a  ers into ASCII..
9260: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9270: 73 74 72 75 63 74 20 7b 0a 20 75 6e 73 69 67 6e  struct {. unsign
9280: 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 46 72  ed short int cFr
9290: 6f 6d 3b 0a 20 75 6e 73 69 67 6e 65 64 20 63 68  om;. unsigned ch
92a0: 61 72 20 63 54 6f 30 2c 20 63 54 6f 31 3b 0a 7d  ar cTo0, cTo1;.}
92b0: 20 74 72 61 6e 73 6c 69 74 5b 5d 20 3d 20 7b 0a   translit[] = {.
92c0: 20 20 7b 20 30 78 30 30 41 30 2c 20 20 30 78 32    { 0x00A0,  0x2
92d0: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c2  0, 0x00 },  /* .
92e0: a0 20 74 6f 20 20 20 2a 2f 0a 20 20 7b 20 30 78  . to   */.  { 0x
92f0: 30 30 42 35 2c 20 20 30 78 37 35 2c 20 30 78 30  00B5,  0x75, 0x0
9300: 30 20 7d 2c 20 20 2f 2a 20 c2 b5 20 74 6f 20 75  0 },  /* .. to u
9310: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 30 2c 20   */.  { 0x00C0, 
9320: 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20   0x41, 0x00 },  
9330: 2f 2a 20 c3 80 20 74 6f 20 41 20 2a 2f 0a 20 20  /* .. to A */.  
9340: 7b 20 30 78 30 30 43 31 2c 20 20 30 78 34 31 2c  { 0x00C1,  0x41,
9350: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 81 20   0x00 },  /* .. 
9360: 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to A */.  { 0x00
9370: 43 32 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20  C2,  0x41, 0x00 
9380: 7d 2c 20 20 2f 2a 20 c3 82 20 74 6f 20 41 20 2a  },  /* .. to A *
9390: 2f 0a 20 20 7b 20 30 78 30 30 43 33 2c 20 20 30  /.  { 0x00C3,  0
93a0: 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x41, 0x00 },  /*
93b0: 20 c3 83 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
93c0: 30 78 30 30 43 34 2c 20 20 30 78 34 31 2c 20 30  0x00C4,  0x41, 0
93d0: 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 84 20 74 6f  x65 },  /* .. to
93e0: 20 41 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43   Ae */.  { 0x00C
93f0: 35 2c 20 20 30 78 34 31 2c 20 30 78 36 31 20 7d  5,  0x41, 0x61 }
9400: 2c 20 20 2f 2a 20 c3 85 20 74 6f 20 41 61 20 2a  ,  /* .. to Aa *
9410: 2f 0a 20 20 7b 20 30 78 30 30 43 36 2c 20 20 30  /.  { 0x00C6,  0
9420: 78 34 31 2c 20 30 78 34 35 20 7d 2c 20 20 2f 2a  x41, 0x45 },  /*
9430: 20 c3 86 20 74 6f 20 41 45 20 2a 2f 0a 20 20 7b   .. to AE */.  {
9440: 20 30 78 30 30 43 37 2c 20 20 30 78 34 33 2c 20   0x00C7,  0x43, 
9450: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 87 20 74  0x00 },  /* .. t
9460: 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43  o C */.  { 0x00C
9470: 38 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  8,  0x45, 0x00 }
9480: 2c 20 20 2f 2a 20 c3 88 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
9490: 0a 20 20 7b 20 30 78 30 30 43 39 2c 20 20 30 78  .  { 0x00C9,  0x
94a0: 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  45, 0x00 },  /* 
94b0: c3 89 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
94c0: 78 30 30 43 41 2c 20 20 30 78 34 35 2c 20 30 78  x00CA,  0x45, 0x
94d0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 8a 20 74 6f 20  00 },  /* .. to 
94e0: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 42 2c  E */.  { 0x00CB,
94f0: 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20    0x45, 0x00 }, 
9500: 20 2f 2a 20 c3 8b 20 74 6f 20 45 20 2a 2f 0a 20   /* .. to E */. 
9510: 20 7b 20 30 78 30 30 43 43 2c 20 20 30 78 34 39   { 0x00CC,  0x49
9520: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8c  , 0x00 },  /* ..
9530: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
9540: 30 43 44 2c 20 20 30 78 34 39 2c 20 30 78 30 30  0CD,  0x49, 0x00
9550: 20 7d 2c 20 20 2f 2a 20 c3 8d 20 74 6f 20 49 20   },  /* .. to I 
9560: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 45 2c 20 20  */.  { 0x00CE,  
9570: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
9580: 2a 20 c3 8e 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
9590: 20 30 78 30 30 43 46 2c 20 20 30 78 34 39 2c 20   0x00CF,  0x49, 
95a0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8f 20 74  0x00 },  /* .. t
95b0: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44  o I */.  { 0x00D
95c0: 30 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d  0,  0x44, 0x00 }
95d0: 2c 20 20 2f 2a 20 c3 90 20 74 6f 20 44 20 2a 2f  ,  /* .. to D */
95e0: 0a 20 20 7b 20 30 78 30 30 44 31 2c 20 20 30 78  .  { 0x00D1,  0x
95f0: 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4E, 0x00 },  /* 
9600: c3 91 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30  .. to N */.  { 0
9610: 78 30 30 44 32 2c 20 20 30 78 34 46 2c 20 30 78  x00D2,  0x4F, 0x
9620: 30 30 20 7d 2c 20 20 2f 2a 20 c3 92 20 74 6f 20  00 },  /* .. to 
9630: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 33 2c  O */.  { 0x00D3,
9640: 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c 20    0x4F, 0x00 }, 
9650: 20 2f 2a 20 c3 93 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
9660: 20 7b 20 30 78 30 30 44 34 2c 20 20 30 78 34 46   { 0x00D4,  0x4F
9670: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 94  , 0x00 },  /* ..
9680: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
9690: 30 44 35 2c 20 20 30 78 34 46 2c 20 30 78 30 30  0D5,  0x4F, 0x00
96a0: 20 7d 2c 20 20 2f 2a 20 c3 95 20 74 6f 20 4f 20   },  /* .. to O 
96b0: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 36 2c 20 20  */.  { 0x00D6,  
96c0: 30 78 34 46 2c 20 30 78 36 35 20 7d 2c 20 20 2f  0x4F, 0x65 },  /
96d0: 2a 20 c3 96 20 74 6f 20 4f 65 20 2a 2f 0a 20 20  * .. to Oe */.  
96e0: 7b 20 30 78 30 30 44 37 2c 20 20 30 78 37 38 2c  { 0x00D7,  0x78,
96f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 97 20   0x00 },  /* .. 
9700: 74 6f 20 78 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to x */.  { 0x00
9710: 44 38 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20  D8,  0x4F, 0x00 
9720: 7d 2c 20 20 2f 2a 20 c3 98 20 74 6f 20 4f 20 2a  },  /* .. to O *
9730: 2f 0a 20 20 7b 20 30 78 30 30 44 39 2c 20 20 30  /.  { 0x00D9,  0
9740: 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x55, 0x00 },  /*
9750: 20 c3 99 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20   .. to U */.  { 
9760: 30 78 30 30 44 41 2c 20 20 30 78 35 35 2c 20 30  0x00DA,  0x55, 0
9770: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9a 20 74 6f  x00 },  /* .. to
9780: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 42   U */.  { 0x00DB
9790: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
97a0: 20 20 2f 2a 20 c3 9b 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
97b0: 20 20 7b 20 30 78 30 30 44 43 2c 20 20 30 78 35    { 0x00DC,  0x5
97c0: 35 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3  5, 0x65 },  /* .
97d0: 9c 20 74 6f 20 55 65 20 2a 2f 0a 20 20 7b 20 30  . to Ue */.  { 0
97e0: 78 30 30 44 44 2c 20 20 30 78 35 39 2c 20 30 78  x00DD,  0x59, 0x
97f0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 9d 20 74 6f 20  00 },  /* .. to 
9800: 59 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 45 2c  Y */.  { 0x00DE,
9810: 20 20 30 78 35 34 2c 20 30 78 36 38 20 7d 2c 20    0x54, 0x68 }, 
9820: 20 2f 2a 20 c3 9e 20 74 6f 20 54 68 20 2a 2f 0a   /* .. to Th */.
9830: 20 20 7b 20 30 78 30 30 44 46 2c 20 20 30 78 37    { 0x00DF,  0x7
9840: 33 2c 20 30 78 37 33 20 7d 2c 20 20 2f 2a 20 c3  3, 0x73 },  /* .
9850: 9f 20 74 6f 20 73 73 20 2a 2f 0a 20 20 7b 20 30  . to ss */.  { 0
9860: 78 30 30 45 30 2c 20 20 30 78 36 31 2c 20 30 78  x00E0,  0x61, 0x
9870: 30 30 20 7d 2c 20 20 2f 2a 20 c3 a0 20 74 6f 20  00 },  /* .. to 
9880: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 31 2c  a */.  { 0x00E1,
9890: 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20    0x61, 0x00 }, 
98a0: 20 2f 2a 20 c3 a1 20 74 6f 20 61 20 2a 2f 0a 20   /* .. to a */. 
98b0: 20 7b 20 30 78 30 30 45 32 2c 20 20 30 78 36 31   { 0x00E2,  0x61
98c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a2  , 0x00 },  /* ..
98d0: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
98e0: 30 45 33 2c 20 20 30 78 36 31 2c 20 30 78 30 30  0E3,  0x61, 0x00
98f0: 20 7d 2c 20 20 2f 2a 20 c3 a3 20 74 6f 20 61 20   },  /* .. to a 
9900: 2a 2f 0a 20 20 7b 20 30 78 30 30 45 34 2c 20 20  */.  { 0x00E4,  
9910: 30 78 36 31 2c 20 30 78 36 35 20 7d 2c 20 20 2f  0x61, 0x65 },  /
9920: 2a 20 c3 a4 20 74 6f 20 61 65 20 2a 2f 0a 20 20  * .. to ae */.  
9930: 7b 20 30 78 30 30 45 35 2c 20 20 30 78 36 31 2c  { 0x00E5,  0x61,
9940: 20 30 78 36 31 20 7d 2c 20 20 2f 2a 20 c3 a5 20   0x61 },  /* .. 
9950: 74 6f 20 61 61 20 2a 2f 0a 20 20 7b 20 30 78 30  to aa */.  { 0x0
9960: 30 45 36 2c 20 20 30 78 36 31 2c 20 30 78 36 35  0E6,  0x61, 0x65
9970: 20 7d 2c 20 20 2f 2a 20 c3 a6 20 74 6f 20 61 65   },  /* .. to ae
9980: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 37 2c 20   */.  { 0x00E7, 
9990: 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x63, 0x00 },  
99a0: 2f 2a 20 c3 a7 20 74 6f 20 63 20 2a 2f 0a 20 20  /* .. to c */.  
99b0: 7b 20 30 78 30 30 45 38 2c 20 20 30 78 36 35 2c  { 0x00E8,  0x65,
99c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a8 20   0x00 },  /* .. 
99d0: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to e */.  { 0x00
99e0: 45 39 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20  E9,  0x65, 0x00 
99f0: 7d 2c 20 20 2f 2a 20 c3 a9 20 74 6f 20 65 20 2a  },  /* .. to e *
9a00: 2f 0a 20 20 7b 20 30 78 30 30 45 41 2c 20 20 30  /.  { 0x00EA,  0
9a10: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
9a20: 20 c3 aa 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
9a30: 30 78 30 30 45 42 2c 20 20 30 78 36 35 2c 20 30  0x00EB,  0x65, 0
9a40: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ab 20 74 6f  x00 },  /* .. to
9a50: 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 43   e */.  { 0x00EC
9a60: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
9a70: 20 20 2f 2a 20 c3 ac 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
9a80: 20 20 7b 20 30 78 30 30 45 44 2c 20 20 30 78 36    { 0x00ED,  0x6
9a90: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  9, 0x00 },  /* .
9aa0: ad 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
9ab0: 30 30 45 45 2c 20 20 30 78 36 39 2c 20 30 78 30  00EE,  0x69, 0x0
9ac0: 30 20 7d 2c 20 20 2f 2a 20 c3 ae 20 74 6f 20 69  0 },  /* .. to i
9ad0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 46 2c 20   */.  { 0x00EF, 
9ae0: 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x69, 0x00 },  
9af0: 2f 2a 20 c3 af 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
9b00: 7b 20 30 78 30 30 46 30 2c 20 20 30 78 36 34 2c  { 0x00F0,  0x64,
9b10: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b0 20   0x00 },  /* .. 
9b20: 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to d */.  { 0x00
9b30: 46 31 2c 20 20 30 78 36 45 2c 20 30 78 30 30 20  F1,  0x6E, 0x00 
9b40: 7d 2c 20 20 2f 2a 20 c3 b1 20 74 6f 20 6e 20 2a  },  /* .. to n *
9b50: 2f 0a 20 20 7b 20 30 78 30 30 46 32 2c 20 20 30  /.  { 0x00F2,  0
9b60: 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6F, 0x00 },  /*
9b70: 20 c3 b2 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
9b80: 30 78 30 30 46 33 2c 20 20 30 78 36 46 2c 20 30  0x00F3,  0x6F, 0
9b90: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b3 20 74 6f  x00 },  /* .. to
9ba0: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 34   o */.  { 0x00F4
9bb0: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c  ,  0x6F, 0x00 },
9bc0: 20 20 2f 2a 20 c3 b4 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
9bd0: 20 20 7b 20 30 78 30 30 46 35 2c 20 20 30 78 36    { 0x00F5,  0x6
9be0: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  F, 0x00 },  /* .
9bf0: b5 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
9c00: 30 30 46 36 2c 20 20 30 78 36 46 2c 20 30 78 36  00F6,  0x6F, 0x6
9c10: 35 20 7d 2c 20 20 2f 2a 20 c3 b6 20 74 6f 20 6f  5 },  /* .. to o
9c20: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 37 2c  e */.  { 0x00F7,
9c30: 20 20 30 78 33 41 2c 20 30 78 30 30 20 7d 2c 20    0x3A, 0x00 }, 
9c40: 20 2f 2a 20 c3 b7 20 74 6f 20 3a 20 2a 2f 0a 20   /* .. to : */. 
9c50: 20 7b 20 30 78 30 30 46 38 2c 20 20 30 78 36 46   { 0x00F8,  0x6F
9c60: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b8  , 0x00 },  /* ..
9c70: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
9c80: 30 46 39 2c 20 20 30 78 37 35 2c 20 30 78 30 30  0F9,  0x75, 0x00
9c90: 20 7d 2c 20 20 2f 2a 20 c3 b9 20 74 6f 20 75 20   },  /* .. to u 
9ca0: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 41 2c 20 20  */.  { 0x00FA,  
9cb0: 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x75, 0x00 },  /
9cc0: 2a 20 c3 ba 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
9cd0: 20 30 78 30 30 46 42 2c 20 20 30 78 37 35 2c 20   0x00FB,  0x75, 
9ce0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bb 20 74  0x00 },  /* .. t
9cf0: 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46  o u */.  { 0x00F
9d00: 43 2c 20 20 30 78 37 35 2c 20 30 78 36 35 20 7d  C,  0x75, 0x65 }
9d10: 2c 20 20 2f 2a 20 c3 bc 20 74 6f 20 75 65 20 2a  ,  /* .. to ue *
9d20: 2f 0a 20 20 7b 20 30 78 30 30 46 44 2c 20 20 30  /.  { 0x00FD,  0
9d30: 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x79, 0x00 },  /*
9d40: 20 c3 bd 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20   .. to y */.  { 
9d50: 30 78 30 30 46 45 2c 20 20 30 78 37 34 2c 20 30  0x00FE,  0x74, 0
9d60: 78 36 38 20 7d 2c 20 20 2f 2a 20 c3 be 20 74 6f  x68 },  /* .. to
9d70: 20 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46   th */.  { 0x00F
9d80: 46 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d  F,  0x79, 0x00 }
9d90: 2c 20 20 2f 2a 20 c3 bf 20 74 6f 20 79 20 2a 2f  ,  /* .. to y */
9da0: 0a 20 20 7b 20 30 78 30 31 30 30 2c 20 20 30 78  .  { 0x0100,  0x
9db0: 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  41, 0x00 },  /* 
9dc0: c4 80 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30  .. to A */.  { 0
9dd0: 78 30 31 30 31 2c 20 20 30 78 36 31 2c 20 30 78  x0101,  0x61, 0x
9de0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 81 20 74 6f 20  00 },  /* .. to 
9df0: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 32 2c  a */.  { 0x0102,
9e00: 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20    0x41, 0x00 }, 
9e10: 20 2f 2a 20 c4 82 20 74 6f 20 41 20 2a 2f 0a 20   /* .. to A */. 
9e20: 20 7b 20 30 78 30 31 30 33 2c 20 20 30 78 36 31   { 0x0103,  0x61
9e30: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 83  , 0x00 },  /* ..
9e40: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
9e50: 31 30 34 2c 20 20 30 78 34 31 2c 20 30 78 30 30  104,  0x41, 0x00
9e60: 20 7d 2c 20 20 2f 2a 20 c4 84 20 74 6f 20 41 20   },  /* .. to A 
9e70: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 35 2c 20 20  */.  { 0x0105,  
9e80: 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x61, 0x00 },  /
9e90: 2a 20 c4 85 20 74 6f 20 61 20 2a 2f 0a 20 20 7b  * .. to a */.  {
9ea0: 20 30 78 30 31 30 36 2c 20 20 30 78 34 33 2c 20   0x0106,  0x43, 
9eb0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 86 20 74  0x00 },  /* .. t
9ec0: 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o C */.  { 0x010
9ed0: 37 2c 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d  7,  0x63, 0x00 }
9ee0: 2c 20 20 2f 2a 20 c4 87 20 74 6f 20 63 20 2a 2f  ,  /* .. to c */
9ef0: 0a 20 20 7b 20 30 78 30 31 30 38 2c 20 20 30 78  .  { 0x0108,  0x
9f00: 34 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  43, 0x68 },  /* 
9f10: c4 88 20 74 6f 20 43 68 20 2a 2f 0a 20 20 7b 20  .. to Ch */.  { 
9f20: 30 78 30 31 30 39 2c 20 20 30 78 36 33 2c 20 30  0x0109,  0x63, 0
9f30: 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 89 20 74 6f  x68 },  /* .. to
9f40: 20 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30   ch */.  { 0x010
9f50: 41 2c 20 20 30 78 34 33 2c 20 30 78 30 30 20 7d  A,  0x43, 0x00 }
9f60: 2c 20 20 2f 2a 20 c4 8a 20 74 6f 20 43 20 2a 2f  ,  /* .. to C */
9f70: 0a 20 20 7b 20 30 78 30 31 30 42 2c 20 20 30 78  .  { 0x010B,  0x
9f80: 36 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  63, 0x00 },  /* 
9f90: c4 8b 20 74 6f 20 63 20 2a 2f 0a 20 20 7b 20 30  .. to c */.  { 0
9fa0: 78 30 31 30 43 2c 20 20 30 78 34 33 2c 20 30 78  x010C,  0x43, 0x
9fb0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 8c 20 74 6f 20  00 },  /* .. to 
9fc0: 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 44 2c  C */.  { 0x010D,
9fd0: 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20    0x63, 0x00 }, 
9fe0: 20 2f 2a 20 c4 8d 20 74 6f 20 63 20 2a 2f 0a 20   /* .. to c */. 
9ff0: 20 7b 20 30 78 30 31 30 45 2c 20 20 30 78 34 34   { 0x010E,  0x44
a000: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8e  , 0x00 },  /* ..
a010: 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30   to D */.  { 0x0
a020: 31 30 46 2c 20 20 30 78 36 34 2c 20 30 78 30 30  10F,  0x64, 0x00
a030: 20 7d 2c 20 20 2f 2a 20 c4 8f 20 74 6f 20 64 20   },  /* .. to d 
a040: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 30 2c 20 20  */.  { 0x0110,  
a050: 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x44, 0x00 },  /
a060: 2a 20 c4 90 20 74 6f 20 44 20 2a 2f 0a 20 20 7b  * .. to D */.  {
a070: 20 30 78 30 31 31 31 2c 20 20 30 78 36 34 2c 20   0x0111,  0x64, 
a080: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 91 20 74  0x00 },  /* .. t
a090: 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o d */.  { 0x011
a0a0: 32 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  2,  0x45, 0x00 }
a0b0: 2c 20 20 2f 2a 20 c4 92 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
a0c0: 0a 20 20 7b 20 30 78 30 31 31 33 2c 20 20 30 78  .  { 0x0113,  0x
a0d0: 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  65, 0x00 },  /* 
a0e0: c4 93 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
a0f0: 78 30 31 31 34 2c 20 20 30 78 34 35 2c 20 30 78  x0114,  0x45, 0x
a100: 30 30 20 7d 2c 20 20 2f 2a 20 c4 94 20 74 6f 20  00 },  /* .. to 
a110: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 35 2c  E */.  { 0x0115,
a120: 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20    0x65, 0x00 }, 
a130: 20 2f 2a 20 c4 95 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
a140: 20 7b 20 30 78 30 31 31 36 2c 20 20 30 78 34 35   { 0x0116,  0x45
a150: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 96  , 0x00 },  /* ..
a160: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
a170: 31 31 37 2c 20 20 30 78 36 35 2c 20 30 78 30 30  117,  0x65, 0x00
a180: 20 7d 2c 20 20 2f 2a 20 c4 97 20 74 6f 20 65 20   },  /* .. to e 
a190: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 38 2c 20 20  */.  { 0x0118,  
a1a0: 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x45, 0x00 },  /
a1b0: 2a 20 c4 98 20 74 6f 20 45 20 2a 2f 0a 20 20 7b  * .. to E */.  {
a1c0: 20 30 78 30 31 31 39 2c 20 20 30 78 36 35 2c 20   0x0119,  0x65, 
a1d0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 99 20 74  0x00 },  /* .. t
a1e0: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o e */.  { 0x011
a1f0: 41 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  A,  0x45, 0x00 }
a200: 2c 20 20 2f 2a 20 c4 9a 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
a210: 0a 20 20 7b 20 30 78 30 31 31 42 2c 20 20 30 78  .  { 0x011B,  0x
a220: 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  65, 0x00 },  /* 
a230: c4 9b 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
a240: 78 30 31 31 43 2c 20 20 30 78 34 37 2c 20 30 78  x011C,  0x47, 0x
a250: 36 38 20 7d 2c 20 20 2f 2a 20 c4 9c 20 74 6f 20  68 },  /* .. to 
a260: 47 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 44  Gh */.  { 0x011D
a270: 2c 20 20 30 78 36 37 2c 20 30 78 36 38 20 7d 2c  ,  0x67, 0x68 },
a280: 20 20 2f 2a 20 c4 9d 20 74 6f 20 67 68 20 2a 2f    /* .. to gh */
a290: 0a 20 20 7b 20 30 78 30 31 31 45 2c 20 20 30 78  .  { 0x011E,  0x
a2a0: 34 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  47, 0x00 },  /* 
a2b0: c4 9e 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30  .. to G */.  { 0
a2c0: 78 30 31 31 46 2c 20 20 30 78 36 37 2c 20 30 78  x011F,  0x67, 0x
a2d0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 9f 20 74 6f 20  00 },  /* .. to 
a2e0: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 30 2c  g */.  { 0x0120,
a2f0: 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c 20    0x47, 0x00 }, 
a300: 20 2f 2a 20 c4 a0 20 74 6f 20 47 20 2a 2f 0a 20   /* .. to G */. 
a310: 20 7b 20 30 78 30 31 32 31 2c 20 20 30 78 36 37   { 0x0121,  0x67
a320: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a1  , 0x00 },  /* ..
a330: 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30   to g */.  { 0x0
a340: 31 32 32 2c 20 20 30 78 34 37 2c 20 30 78 30 30  122,  0x47, 0x00
a350: 20 7d 2c 20 20 2f 2a 20 c4 a2 20 74 6f 20 47 20   },  /* .. to G 
a360: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 33 2c 20 20  */.  { 0x0123,  
a370: 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x67, 0x00 },  /
a380: 2a 20 c4 a3 20 74 6f 20 67 20 2a 2f 0a 20 20 7b  * .. to g */.  {
a390: 20 30 78 30 31 32 34 2c 20 20 30 78 34 38 2c 20   0x0124,  0x48, 
a3a0: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 a4 20 74  0x68 },  /* .. t
a3b0: 6f 20 48 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o Hh */.  { 0x01
a3c0: 32 35 2c 20 20 30 78 36 38 2c 20 30 78 36 38 20  25,  0x68, 0x68 
a3d0: 7d 2c 20 20 2f 2a 20 c4 a5 20 74 6f 20 68 68 20  },  /* .. to hh 
a3e0: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 36 2c 20 20  */.  { 0x0126,  
a3f0: 30 78 34 38 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x48, 0x00 },  /
a400: 2a 20 c4 a6 20 74 6f 20 48 20 2a 2f 0a 20 20 7b  * .. to H */.  {
a410: 20 30 78 30 31 32 37 2c 20 20 30 78 36 38 2c 20   0x0127,  0x68, 
a420: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a7 20 74  0x00 },  /* .. t
a430: 6f 20 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o h */.  { 0x012
a440: 38 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  8,  0x49, 0x00 }
a450: 2c 20 20 2f 2a 20 c4 a8 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
a460: 0a 20 20 7b 20 30 78 30 31 32 39 2c 20 20 30 78  .  { 0x0129,  0x
a470: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
a480: c4 a9 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
a490: 78 30 31 32 41 2c 20 20 30 78 34 39 2c 20 30 78  x012A,  0x49, 0x
a4a0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 aa 20 74 6f 20  00 },  /* .. to 
a4b0: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 42 2c  I */.  { 0x012B,
a4c0: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
a4d0: 20 2f 2a 20 c4 ab 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
a4e0: 20 7b 20 30 78 30 31 32 43 2c 20 20 30 78 34 39   { 0x012C,  0x49
a4f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ac  , 0x00 },  /* ..
a500: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
a510: 31 32 44 2c 20 20 30 78 36 39 2c 20 30 78 30 30  12D,  0x69, 0x00
a520: 20 7d 2c 20 20 2f 2a 20 c4 ad 20 74 6f 20 69 20   },  /* .. to i 
a530: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 45 2c 20 20  */.  { 0x012E,  
a540: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
a550: 2a 20 c4 ae 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
a560: 20 30 78 30 31 32 46 2c 20 20 30 78 36 39 2c 20   0x012F,  0x69, 
a570: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 af 20 74  0x00 },  /* .. t
a580: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o i */.  { 0x013
a590: 30 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  0,  0x49, 0x00 }
a5a0: 2c 20 20 2f 2a 20 c4 b0 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
a5b0: 0a 20 20 7b 20 30 78 30 31 33 31 2c 20 20 30 78  .  { 0x0131,  0x
a5c0: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
a5d0: c4 b1 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
a5e0: 78 30 31 33 32 2c 20 20 30 78 34 39 2c 20 30 78  x0132,  0x49, 0x
a5f0: 34 41 20 7d 2c 20 20 2f 2a 20 c4 b2 20 74 6f 20  4A },  /* .. to 
a600: 49 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 33  IJ */.  { 0x0133
a610: 2c 20 20 30 78 36 39 2c 20 30 78 36 41 20 7d 2c  ,  0x69, 0x6A },
a620: 20 20 2f 2a 20 c4 b3 20 74 6f 20 69 6a 20 2a 2f    /* .. to ij */
a630: 0a 20 20 7b 20 30 78 30 31 33 34 2c 20 20 30 78  .  { 0x0134,  0x
a640: 34 41 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  4A, 0x68 },  /* 
a650: c4 b4 20 74 6f 20 4a 68 20 2a 2f 0a 20 20 7b 20  .. to Jh */.  { 
a660: 30 78 30 31 33 35 2c 20 20 30 78 36 41 2c 20 30  0x0135,  0x6A, 0
a670: 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 b5 20 74 6f  x68 },  /* .. to
a680: 20 6a 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33   jh */.  { 0x013
a690: 36 2c 20 20 30 78 34 42 2c 20 30 78 30 30 20 7d  6,  0x4B, 0x00 }
a6a0: 2c 20 20 2f 2a 20 c4 b6 20 74 6f 20 4b 20 2a 2f  ,  /* .. to K */
a6b0: 0a 20 20 7b 20 30 78 30 31 33 37 2c 20 20 30 78  .  { 0x0137,  0x
a6c0: 36 42 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6B, 0x00 },  /* 
a6d0: c4 b7 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30  .. to k */.  { 0
a6e0: 78 30 31 33 38 2c 20 20 30 78 36 42 2c 20 30 78  x0138,  0x6B, 0x
a6f0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 b8 20 74 6f 20  00 },  /* .. to 
a700: 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 39 2c  k */.  { 0x0139,
a710: 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d 2c 20    0x4C, 0x00 }, 
a720: 20 2f 2a 20 c4 b9 20 74 6f 20 4c 20 2a 2f 0a 20   /* .. to L */. 
a730: 20 7b 20 30 78 30 31 33 41 2c 20 20 30 78 36 43   { 0x013A,  0x6C
a740: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ba  , 0x00 },  /* ..
a750: 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30   to l */.  { 0x0
a760: 31 33 42 2c 20 20 30 78 34 43 2c 20 30 78 30 30  13B,  0x4C, 0x00
a770: 20 7d 2c 20 20 2f 2a 20 c4 bb 20 74 6f 20 4c 20   },  /* .. to L 
a780: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 43 2c 20 20  */.  { 0x013C,  
a790: 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6C, 0x00 },  /
a7a0: 2a 20 c4 bc 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b  * .. to l */.  {
a7b0: 20 30 78 30 31 33 44 2c 20 20 30 78 34 43 2c 20   0x013D,  0x4C, 
a7c0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 bd 20 74  0x00 },  /* .. t
a7d0: 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o L */.  { 0x013
a7e0: 45 2c 20 20 30 78 36 43 2c 20 30 78 30 30 20 7d  E,  0x6C, 0x00 }
a7f0: 2c 20 20 2f 2a 20 c4 be 20 74 6f 20 6c 20 2a 2f  ,  /* .. to l */
a800: 0a 20 20 7b 20 30 78 30 31 33 46 2c 20 20 30 78  .  { 0x013F,  0x
a810: 34 43 2c 20 30 78 32 45 20 7d 2c 20 20 2f 2a 20  4C, 0x2E },  /* 
a820: c4 bf 20 74 6f 20 4c 2e 20 2a 2f 0a 20 20 7b 20  .. to L. */.  { 
a830: 30 78 30 31 34 30 2c 20 20 30 78 36 43 2c 20 30  0x0140,  0x6C, 0
a840: 78 32 45 20 7d 2c 20 20 2f 2a 20 c5 80 20 74 6f  x2E },  /* .. to
a850: 20 6c 2e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34   l. */.  { 0x014
a860: 31 2c 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d  1,  0x4C, 0x00 }
a870: 2c 20 20 2f 2a 20 c5 81 20 74 6f 20 4c 20 2a 2f  ,  /* .. to L */
a880: 0a 20 20 7b 20 30 78 30 31 34 32 2c 20 20 30 78  .  { 0x0142,  0x
a890: 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6C, 0x00 },  /* 
a8a0: c5 82 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30  .. to l */.  { 0
a8b0: 78 30 31 34 33 2c 20 20 30 78 34 45 2c 20 30 78  x0143,  0x4E, 0x
a8c0: 30 30 20 7d 2c 20 20 2f 2a 20 c5 83 20 74 6f 20  00 },  /* .. to 
a8d0: 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 34 2c  N */.  { 0x0144,
a8e0: 20 20 30 78 36 45 2c 20 30 78 30 30 20 7d 2c 20    0x6E, 0x00 }, 
a8f0: 20 2f 2a 20 c5 84 20 74 6f 20 6e 20 2a 2f 0a 20   /* .. to n */. 
a900: 20 7b 20 30 78 30 31 34 35 2c 20 20 30 78 34 45   { 0x0145,  0x4E
a910: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 85  , 0x00 },  /* ..
a920: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
a930: 31 34 36 2c 20 20 30 78 36 45 2c 20 30 78 30 30  146,  0x6E, 0x00
a940: 20 7d 2c 20 20 2f 2a 20 c5 86 20 74 6f 20 6e 20   },  /* .. to n 
a950: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 37 2c 20 20  */.  { 0x0147,  
a960: 30 78 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4E, 0x00 },  /
a970: 2a 20 c5 87 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b  * .. to N */.  {
a980: 20 30 78 30 31 34 38 2c 20 20 30 78 36 45 2c 20   0x0148,  0x6E, 
a990: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 88 20 74  0x00 },  /* .. t
a9a0: 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34  o n */.  { 0x014
a9b0: 39 2c 20 20 30 78 32 37 2c 20 30 78 36 45 20 7d  9,  0x27, 0x6E }
a9c0: 2c 20 20 2f 2a 20 c5 89 20 74 6f 20 27 6e 20 2a  ,  /* .. to 'n *
a9d0: 2f 0a 20 20 7b 20 30 78 30 31 34 41 2c 20 20 30  /.  { 0x014A,  0
a9e0: 78 34 45 2c 20 30 78 34 37 20 7d 2c 20 20 2f 2a  x4E, 0x47 },  /*
a9f0: 20 c5 8a 20 74 6f 20 4e 47 20 2a 2f 0a 20 20 7b   .. to NG */.  {
aa00: 20 30 78 30 31 34 42 2c 20 20 30 78 36 45 2c 20   0x014B,  0x6E, 
aa10: 30 78 36 37 20 7d 2c 20 20 2f 2a 20 c5 8b 20 74  0x67 },  /* .. t
aa20: 6f 20 6e 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o ng */.  { 0x01
aa30: 34 43 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20  4C,  0x4F, 0x00 
aa40: 7d 2c 20 20 2f 2a 20 c5 8c 20 74 6f 20 4f 20 2a  },  /* .. to O *
aa50: 2f 0a 20 20 7b 20 30 78 30 31 34 44 2c 20 20 30  /.  { 0x014D,  0
aa60: 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6F, 0x00 },  /*
aa70: 20 c5 8d 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
aa80: 30 78 30 31 34 45 2c 20 20 30 78 34 46 2c 20 30  0x014E,  0x4F, 0
aa90: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8e 20 74 6f  x00 },  /* .. to
aaa0: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 46   O */.  { 0x014F
aab0: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c  ,  0x6F, 0x00 },
aac0: 20 20 2f 2a 20 c5 8f 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
aad0: 20 20 7b 20 30 78 30 31 35 30 2c 20 20 30 78 34    { 0x0150,  0x4
aae0: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  F, 0x00 },  /* .
aaf0: 90 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
ab00: 30 31 35 31 2c 20 20 30 78 36 46 2c 20 30 78 30  0151,  0x6F, 0x0
ab10: 30 20 7d 2c 20 20 2f 2a 20 c5 91 20 74 6f 20 6f  0 },  /* .. to o
ab20: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 32 2c 20   */.  { 0x0152, 
ab30: 20 30 78 34 46 2c 20 30 78 34 35 20 7d 2c 20 20   0x4F, 0x45 },  
ab40: 2f 2a 20 c5 92 20 74 6f 20 4f 45 20 2a 2f 0a 20  /* .. to OE */. 
ab50: 20 7b 20 30 78 30 31 35 33 2c 20 20 30 78 36 46   { 0x0153,  0x6F
ab60: 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c5 93  , 0x65 },  /* ..
ab70: 20 74 6f 20 6f 65 20 2a 2f 0a 20 20 7b 20 30 78   to oe */.  { 0x
ab80: 30 31 35 34 2c 20 20 30 78 35 32 2c 20 30 78 30  0154,  0x52, 0x0
ab90: 30 20 7d 2c 20 20 2f 2a 20 c5 94 20 74 6f 20 52  0 },  /* .. to R
aba0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 35 2c 20   */.  { 0x0155, 
abb0: 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x72, 0x00 },  
abc0: 2f 2a 20 c5 95 20 74 6f 20 72 20 2a 2f 0a 20 20  /* .. to r */.  
abd0: 7b 20 30 78 30 31 35 36 2c 20 20 30 78 35 32 2c  { 0x0156,  0x52,
abe0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 96 20   0x00 },  /* .. 
abf0: 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to R */.  { 0x01
ac00: 35 37 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20  57,  0x72, 0x00 
ac10: 7d 2c 20 20 2f 2a 20 c5 97 20 74 6f 20 72 20 2a  },  /* .. to r *
ac20: 2f 0a 20 20 7b 20 30 78 30 31 35 38 2c 20 20 30  /.  { 0x0158,  0
ac30: 78 35 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x52, 0x00 },  /*
ac40: 20 c5 98 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20   .. to R */.  { 
ac50: 30 78 30 31 35 39 2c 20 20 30 78 37 32 2c 20 30  0x0159,  0x72, 0
ac60: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 99 20 74 6f  x00 },  /* .. to
ac70: 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 41   r */.  { 0x015A
ac80: 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c  ,  0x53, 0x00 },
ac90: 20 20 2f 2a 20 c5 9a 20 74 6f 20 53 20 2a 2f 0a    /* .. to S */.
aca0: 20 20 7b 20 30 78 30 31 35 42 2c 20 20 30 78 37    { 0x015B,  0x7
acb0: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  3, 0x00 },  /* .
acc0: 9b 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
acd0: 30 31 35 43 2c 20 20 30 78 35 33 2c 20 30 78 36  015C,  0x53, 0x6
ace0: 38 20 7d 2c 20 20 2f 2a 20 c5 9c 20 74 6f 20 53  8 },  /* .. to S
acf0: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 44 2c  h */.  { 0x015D,
ad00: 20 20 30 78 37 33 2c 20 30 78 36 38 20 7d 2c 20    0x73, 0x68 }, 
ad10: 20 2f 2a 20 c5 9d 20 74 6f 20 73 68 20 2a 2f 0a   /* .. to sh */.
ad20: 20 20 7b 20 30 78 30 31 35 45 2c 20 20 30 78 35    { 0x015E,  0x5
ad30: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  3, 0x00 },  /* .
ad40: 9e 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78  . to S */.  { 0x
ad50: 30 31 35 46 2c 20 20 30 78 37 33 2c 20 30 78 30  015F,  0x73, 0x0
ad60: 30 20 7d 2c 20 20 2f 2a 20 c5 9f 20 74 6f 20 73  0 },  /* .. to s
ad70: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 30 2c 20   */.  { 0x0160, 
ad80: 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x53, 0x00 },  
ad90: 2f 2a 20 c5 a0 20 74 6f 20 53 20 2a 2f 0a 20 20  /* .. to S */.  
ada0: 7b 20 30 78 30 31 36 31 2c 20 20 30 78 37 33 2c  { 0x0161,  0x73,
adb0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a1 20   0x00 },  /* .. 
adc0: 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to s */.  { 0x01
add0: 36 32 2c 20 20 30 78 35 34 2c 20 30 78 30 30 20  62,  0x54, 0x00 
ade0: 7d 2c 20 20 2f 2a 20 c5 a2 20 74 6f 20 54 20 2a  },  /* .. to T *
adf0: 2f 0a 20 20 7b 20 30 78 30 31 36 33 2c 20 20 30  /.  { 0x0163,  0
ae00: 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x74, 0x00 },  /*
ae10: 20 c5 a3 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20   .. to t */.  { 
ae20: 30 78 30 31 36 34 2c 20 20 30 78 35 34 2c 20 30  0x0164,  0x54, 0
ae30: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a4 20 74 6f  x00 },  /* .. to
ae40: 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 35   T */.  { 0x0165
ae50: 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c  ,  0x74, 0x00 },
ae60: 20 20 2f 2a 20 c5 a5 20 74 6f 20 74 20 2a 2f 0a    /* .. to t */.
ae70: 20 20 7b 20 30 78 30 31 36 36 2c 20 20 30 78 35    { 0x0166,  0x5
ae80: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  4, 0x00 },  /* .
ae90: a6 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78  . to T */.  { 0x
aea0: 30 31 36 37 2c 20 20 30 78 37 34 2c 20 30 78 30  0167,  0x74, 0x0
aeb0: 30 20 7d 2c 20 20 2f 2a 20 c5 a7 20 74 6f 20 74  0 },  /* .. to t
aec0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 38 2c 20   */.  { 0x0168, 
aed0: 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x55, 0x00 },  
aee0: 2f 2a 20 c5 a8 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
aef0: 7b 20 30 78 30 31 36 39 2c 20 20 30 78 37 35 2c  { 0x0169,  0x75,
af00: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a9 20   0x00 },  /* .. 
af10: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to u */.  { 0x01
af20: 36 41 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  6A,  0x55, 0x00 
af30: 7d 2c 20 20 2f 2a 20 c5 aa 20 74 6f 20 55 20 2a  },  /* .. to U *
af40: 2f 0a 20 20 7b 20 30 78 30 31 36 42 2c 20 20 30  /.  { 0x016B,  0
af50: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
af60: 20 c5 ab 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
af70: 30 78 30 31 36 43 2c 20 20 30 78 35 35 2c 20 30  0x016C,  0x55, 0
af80: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ac 20 74 6f  x00 },  /* .. to
af90: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 44   U */.  { 0x016D
afa0: 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c  ,  0x75, 0x00 },
afb0: 20 20 2f 2a 20 c5 ad 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
afc0: 20 20 7b 20 30 78 30 31 36 45 2c 20 20 30 78 35    { 0x016E,  0x5
afd0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  5, 0x00 },  /* .
afe0: ae 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
aff0: 30 31 36 46 2c 20 20 30 78 37 35 2c 20 30 78 30  016F,  0x75, 0x0
b000: 30 20 7d 2c 20 20 2f 2a 20 c5 af 20 74 6f 20 75  0 },  /* .. to u
b010: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 30 2c 20   */.  { 0x0170, 
b020: 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x55, 0x00 },  
b030: 2f 2a 20 c5 b0 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
b040: 7b 20 30 78 30 31 37 31 2c 20 20 30 78 37 35 2c  { 0x0171,  0x75,
b050: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b1 20   0x00 },  /* .. 
b060: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to u */.  { 0x01
b070: 37 32 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  72,  0x55, 0x00 
b080: 7d 2c 20 20 2f 2a 20 c5 b2 20 74 6f 20 55 20 2a  },  /* .. to U *
b090: 2f 0a 20 20 7b 20 30 78 30 31 37 33 2c 20 20 30  /.  { 0x0173,  0
b0a0: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
b0b0: 20 c5 b3 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
b0c0: 30 78 30 31 37 34 2c 20 20 30 78 35 37 2c 20 30  0x0174,  0x57, 0
b0d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b4 20 74 6f  x00 },  /* .. to
b0e0: 20 57 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 35   W */.  { 0x0175
b0f0: 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20 7d 2c  ,  0x77, 0x00 },
b100: 20 20 2f 2a 20 c5 b5 20 74 6f 20 77 20 2a 2f 0a    /* .. to w */.
b110: 20 20 7b 20 30 78 30 31 37 36 2c 20 20 30 78 35    { 0x0176,  0x5
b120: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  9, 0x00 },  /* .
b130: b6 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78  . to Y */.  { 0x
b140: 30 31 37 37 2c 20 20 30 78 37 39 2c 20 30 78 30  0177,  0x79, 0x0
b150: 30 20 7d 2c 20 20 2f 2a 20 c5 b7 20 74 6f 20 79  0 },  /* .. to y
b160: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 38 2c 20   */.  { 0x0178, 
b170: 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x59, 0x00 },  
b180: 2f 2a 20 c5 b8 20 74 6f 20 59 20 2a 2f 0a 20 20  /* .. to Y */.  
b190: 7b 20 30 78 30 31 37 39 2c 20 20 30 78 35 41 2c  { 0x0179,  0x5A,
b1a0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b9 20   0x00 },  /* .. 
b1b0: 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to Z */.  { 0x01
b1c0: 37 41 2c 20 20 30 78 37 41 2c 20 30 78 30 30 20  7A,  0x7A, 0x00 
b1d0: 7d 2c 20 20 2f 2a 20 c5 ba 20 74 6f 20 7a 20 2a  },  /* .. to z *
b1e0: 2f 0a 20 20 7b 20 30 78 30 31 37 42 2c 20 20 30  /.  { 0x017B,  0
b1f0: 78 35 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x5A, 0x00 },  /*
b200: 20 c5 bb 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20   .. to Z */.  { 
b210: 30 78 30 31 37 43 2c 20 20 30 78 37 41 2c 20 30  0x017C,  0x7A, 0
b220: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bc 20 74 6f  x00 },  /* .. to
b230: 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 44   z */.  { 0x017D
b240: 2c 20 20 30 78 35 41 2c 20 30 78 30 30 20 7d 2c  ,  0x5A, 0x00 },
b250: 20 20 2f 2a 20 c5 bd 20 74 6f 20 5a 20 2a 2f 0a    /* .. to Z */.
b260: 20 20 7b 20 30 78 30 31 37 45 2c 20 20 30 78 37    { 0x017E,  0x7
b270: 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  A, 0x00 },  /* .
b280: be 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78  . to z */.  { 0x
b290: 30 31 37 46 2c 20 20 30 78 37 33 2c 20 30 78 30  017F,  0x73, 0x0
b2a0: 30 20 7d 2c 20 20 2f 2a 20 c5 bf 20 74 6f 20 73  0 },  /* .. to s
b2b0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 39 32 2c 20   */.  { 0x0192, 
b2c0: 20 30 78 36 36 2c 20 30 78 30 30 20 7d 2c 20 20   0x66, 0x00 },  
b2d0: 2f 2a 20 c6 92 20 74 6f 20 66 20 2a 2f 0a 20 20  /* .. to f */.  
b2e0: 7b 20 30 78 30 32 31 38 2c 20 20 30 78 35 33 2c  { 0x0218,  0x53,
b2f0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 98 20   0x00 },  /* .. 
b300: 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 32  to S */.  { 0x02
b310: 31 39 2c 20 20 30 78 37 33 2c 20 30 78 30 30 20  19,  0x73, 0x00 
b320: 7d 2c 20 20 2f 2a 20 c8 99 20 74 6f 20 73 20 2a  },  /* .. to s *
b330: 2f 0a 20 20 7b 20 30 78 30 32 31 41 2c 20 20 30  /.  { 0x021A,  0
b340: 78 35 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x54, 0x00 },  /*
b350: 20 c8 9a 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20   .. to T */.  { 
b360: 30 78 30 32 31 42 2c 20 20 30 78 37 34 2c 20 30  0x021B,  0x74, 0
b370: 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9b 20 74 6f  x00 },  /* .. to
b380: 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 36   t */.  { 0x0386
b390: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
b3a0: 20 20 2f 2a 20 ce 86 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
b3b0: 20 20 7b 20 30 78 30 33 38 38 2c 20 20 30 78 34    { 0x0388,  0x4
b3c0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  5, 0x00 },  /* .
b3d0: 88 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
b3e0: 30 33 38 39 2c 20 20 30 78 34 39 2c 20 30 78 30  0389,  0x49, 0x0
b3f0: 30 20 7d 2c 20 20 2f 2a 20 ce 89 20 74 6f 20 49  0 },  /* .. to I
b400: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 41 2c 20   */.  { 0x038A, 
b410: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
b420: 2f 2a 20 ce 8a 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
b430: 7b 20 30 78 30 33 38 43 2c 20 20 30 78 34 66 2c  { 0x038C,  0x4f,
b440: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 8c 20   0x00 },  /* .. 
b450: 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to O */.  { 0x03
b460: 38 45 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20  8E,  0x59, 0x00 
b470: 7d 2c 20 20 2f 2a 20 ce 8e 20 74 6f 20 59 20 2a  },  /* .. to Y *
b480: 2f 0a 20 20 7b 20 30 78 30 33 38 46 2c 20 20 30  /.  { 0x038F,  0
b490: 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4f, 0x00 },  /*
b4a0: 20 ce 8f 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
b4b0: 30 78 30 33 39 30 2c 20 20 30 78 36 39 2c 20 30  0x0390,  0x69, 0
b4c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 90 20 74 6f  x00 },  /* .. to
b4d0: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 31   i */.  { 0x0391
b4e0: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
b4f0: 20 20 2f 2a 20 ce 91 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
b500: 20 20 7b 20 30 78 30 33 39 32 2c 20 20 30 78 34    { 0x0392,  0x4
b510: 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  2, 0x00 },  /* .
b520: 92 20 74 6f 20 42 20 2a 2f 0a 20 20 7b 20 30 78  . to B */.  { 0x
b530: 30 33 39 33 2c 20 20 30 78 34 37 2c 20 30 78 30  0393,  0x47, 0x0
b540: 30 20 7d 2c 20 20 2f 2a 20 ce 93 20 74 6f 20 47  0 },  /* .. to G
b550: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 34 2c 20   */.  { 0x0394, 
b560: 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x44, 0x00 },  
b570: 2f 2a 20 ce 94 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
b580: 7b 20 30 78 30 33 39 35 2c 20 20 30 78 34 35 2c  { 0x0395,  0x45,
b590: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 95 20   0x00 },  /* .. 
b5a0: 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to E */.  { 0x03
b5b0: 39 36 2c 20 20 30 78 35 61 2c 20 30 78 30 30 20  96,  0x5a, 0x00 
b5c0: 7d 2c 20 20 2f 2a 20 ce 96 20 74 6f 20 5a 20 2a  },  /* .. to Z *
b5d0: 2f 0a 20 20 7b 20 30 78 30 33 39 37 2c 20 20 30  /.  { 0x0397,  0
b5e0: 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x49, 0x00 },  /*
b5f0: 20 ce 97 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20   .. to I */.  { 
b600: 30 78 30 33 39 38 2c 20 20 30 78 35 34 2c 20 30  0x0398,  0x54, 0
b610: 78 36 38 20 7d 2c 20 20 2f 2a 20 ce 98 20 74 6f  x68 },  /* .. to
b620: 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39   Th */.  { 0x039
b630: 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  9,  0x49, 0x00 }
b640: 2c 20 20 2f 2a 20 ce 99 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
b650: 0a 20 20 7b 20 30 78 30 33 39 41 2c 20 20 30 78  .  { 0x039A,  0x
b660: 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4b, 0x00 },  /* 
b670: ce 9a 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30  .. to K */.  { 0
b680: 78 30 33 39 42 2c 20 20 30 78 34 63 2c 20 30 78  x039B,  0x4c, 0x
b690: 30 30 20 7d 2c 20 20 2f 2a 20 ce 9b 20 74 6f 20  00 },  /* .. to 
b6a0: 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 43 2c  L */.  { 0x039C,
b6b0: 20 20 30 78 34 64 2c 20 30 78 30 30 20 7d 2c 20    0x4d, 0x00 }, 
b6c0: 20 2f 2a 20 ce 9c 20 74 6f 20 4d 20 2a 2f 0a 20   /* .. to M */. 
b6d0: 20 7b 20 30 78 30 33 39 44 2c 20 20 30 78 34 65   { 0x039D,  0x4e
b6e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9d  , 0x00 },  /* ..
b6f0: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
b700: 33 39 45 2c 20 20 30 78 35 38 2c 20 30 78 30 30  39E,  0x58, 0x00
b710: 20 7d 2c 20 20 2f 2a 20 ce 9e 20 74 6f 20 58 20   },  /* .. to X 
b720: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 46 2c 20 20  */.  { 0x039F,  
b730: 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4f, 0x00 },  /
b740: 2a 20 ce 9f 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b  * .. to O */.  {
b750: 20 30 78 30 33 41 30 2c 20 20 30 78 35 30 2c 20   0x03A0,  0x50, 
b760: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a0 20 74  0x00 },  /* .. t
b770: 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o P */.  { 0x03A
b780: 31 2c 20 20 30 78 35 32 2c 20 30 78 30 30 20 7d  1,  0x52, 0x00 }
b790: 2c 20 20 2f 2a 20 ce a1 20 74 6f 20 52 20 2a 2f  ,  /* .. to R */
b7a0: 0a 20 20 7b 20 30 78 30 33 41 33 2c 20 20 30 78  .  { 0x03A3,  0x
b7b0: 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  53, 0x00 },  /* 
b7c0: ce a3 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30  .. to S */.  { 0
b7d0: 78 30 33 41 34 2c 20 20 30 78 35 34 2c 20 30 78  x03A4,  0x54, 0x
b7e0: 30 30 20 7d 2c 20 20 2f 2a 20 ce a4 20 74 6f 20  00 },  /* .. to 
b7f0: 54 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 35 2c  T */.  { 0x03A5,
b800: 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20    0x59, 0x00 }, 
b810: 20 2f 2a 20 ce a5 20 74 6f 20 59 20 2a 2f 0a 20   /* .. to Y */. 
b820: 20 7b 20 30 78 30 33 41 36 2c 20 20 30 78 34 36   { 0x03A6,  0x46
b830: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a6  , 0x00 },  /* ..
b840: 20 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78 30   to F */.  { 0x0
b850: 33 41 37 2c 20 20 30 78 34 33 2c 20 30 78 36 38  3A7,  0x43, 0x68
b860: 20 7d 2c 20 20 2f 2a 20 ce a7 20 74 6f 20 43 68   },  /* .. to Ch
b870: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 38 2c 20   */.  { 0x03A8, 
b880: 20 30 78 35 30 2c 20 30 78 37 33 20 7d 2c 20 20   0x50, 0x73 },  
b890: 2f 2a 20 ce a8 20 74 6f 20 50 73 20 2a 2f 0a 20  /* .. to Ps */. 
b8a0: 20 7b 20 30 78 30 33 41 39 2c 20 20 30 78 34 66   { 0x03A9,  0x4f
b8b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a9  , 0x00 },  /* ..
b8c0: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
b8d0: 33 41 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30  3AA,  0x49, 0x00
b8e0: 20 7d 2c 20 20 2f 2a 20 ce aa 20 74 6f 20 49 20   },  /* .. to I 
b8f0: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 42 2c 20 20  */.  { 0x03AB,  
b900: 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x59, 0x00 },  /
b910: 2a 20 ce ab 20 74 6f 20 59 20 2a 2f 0a 20 20 7b  * .. to Y */.  {
b920: 20 30 78 30 33 41 43 2c 20 20 30 78 36 31 2c 20   0x03AC,  0x61, 
b930: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ac 20 74  0x00 },  /* .. t
b940: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o a */.  { 0x03A
b950: 44 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d  D,  0x65, 0x00 }
b960: 2c 20 20 2f 2a 20 ce ad 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
b970: 0a 20 20 7b 20 30 78 30 33 41 45 2c 20 20 30 78  .  { 0x03AE,  0x
b980: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
b990: ce ae 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
b9a0: 78 30 33 41 46 2c 20 20 30 78 36 39 2c 20 30 78  x03AF,  0x69, 0x
b9b0: 30 30 20 7d 2c 20 20 2f 2a 20 ce af 20 74 6f 20  00 },  /* .. to 
b9c0: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 31 2c  i */.  { 0x03B1,
b9d0: 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20    0x61, 0x00 }, 
b9e0: 20 2f 2a 20 ce b1 20 74 6f 20 61 20 2a 2f 0a 20   /* .. to a */. 
b9f0: 20 7b 20 30 78 30 33 42 32 2c 20 20 30 78 36 32   { 0x03B2,  0x62
ba00: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b2  , 0x00 },  /* ..
ba10: 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78 30   to b */.  { 0x0
ba20: 33 42 33 2c 20 20 30 78 36 37 2c 20 30 78 30 30  3B3,  0x67, 0x00
ba30: 20 7d 2c 20 20 2f 2a 20 ce b3 20 74 6f 20 67 20   },  /* .. to g 
ba40: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 34 2c 20 20  */.  { 0x03B4,  
ba50: 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x64, 0x00 },  /
ba60: 2a 20 ce b4 20 74 6f 20 64 20 2a 2f 0a 20 20 7b  * .. to d */.  {
ba70: 20 30 78 30 33 42 35 2c 20 20 30 78 36 35 2c 20   0x03B5,  0x65, 
ba80: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b5 20 74  0x00 },  /* .. t
ba90: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o e */.  { 0x03B
baa0: 36 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20 7d  6,  0x7a, 0x00 }
bab0: 2c 20 20 2f 2a 20 ce b6 20 74 6f 20 7a 20 2a 2f  ,  /* .. to z */
bac0: 0a 20 20 7b 20 30 78 30 33 42 37 2c 20 20 30 78  .  { 0x03B7,  0x
bad0: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
bae0: ce b7 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
baf0: 78 30 33 42 38 2c 20 20 30 78 37 34 2c 20 30 78  x03B8,  0x74, 0x
bb00: 36 38 20 7d 2c 20 20 2f 2a 20 ce b8 20 74 6f 20  68 },  /* .. to 
bb10: 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 39  th */.  { 0x03B9
bb20: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
bb30: 20 20 2f 2a 20 ce b9 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
bb40: 20 20 7b 20 30 78 30 33 42 41 2c 20 20 30 78 36    { 0x03BA,  0x6
bb50: 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  b, 0x00 },  /* .
bb60: ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78  . to k */.  { 0x
bb70: 30 33 42 42 2c 20 20 30 78 36 63 2c 20 30 78 30  03BB,  0x6c, 0x0
bb80: 30 20 7d 2c 20 20 2f 2a 20 ce bb 20 74 6f 20 6c  0 },  /* .. to l
bb90: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 43 2c 20   */.  { 0x03BC, 
bba0: 20 30 78 36 64 2c 20 30 78 30 30 20 7d 2c 20 20   0x6d, 0x00 },  
bbb0: 2f 2a 20 ce bc 20 74 6f 20 6d 20 2a 2f 0a 20 20  /* .. to m */.  
bbc0: 7b 20 30 78 30 33 42 44 2c 20 20 30 78 36 65 2c  { 0x03BD,  0x6e,
bbd0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bd 20   0x00 },  /* .. 
bbe0: 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to n */.  { 0x03
bbf0: 42 45 2c 20 20 30 78 37 38 2c 20 30 78 30 30 20  BE,  0x78, 0x00 
bc00: 7d 2c 20 20 2f 2a 20 ce be 20 74 6f 20 78 20 2a  },  /* .. to x *
bc10: 2f 0a 20 20 7b 20 30 78 30 33 42 46 2c 20 20 30  /.  { 0x03BF,  0
bc20: 78 36 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6f, 0x00 },  /*
bc30: 20 ce bf 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
bc40: 30 78 30 33 43 30 2c 20 20 30 78 37 30 2c 20 30  0x03C0,  0x70, 0
bc50: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 80 20 74 6f  x00 },  /* .. to
bc60: 20 70 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 31   p */.  { 0x03C1
bc70: 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c  ,  0x72, 0x00 },
bc80: 20 20 2f 2a 20 cf 81 20 74 6f 20 72 20 2a 2f 0a    /* .. to r */.
bc90: 20 20 7b 20 30 78 30 33 43 33 2c 20 20 30 78 37    { 0x03C3,  0x7
bca0: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  3, 0x00 },  /* .
bcb0: 83 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
bcc0: 30 33 43 34 2c 20 20 30 78 37 34 2c 20 30 78 30  03C4,  0x74, 0x0
bcd0: 30 20 7d 2c 20 20 2f 2a 20 cf 84 20 74 6f 20 74  0 },  /* .. to t
bce0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 35 2c 20   */.  { 0x03C5, 
bcf0: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
bd00: 2f 2a 20 cf 85 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
bd10: 7b 20 30 78 30 33 43 36 2c 20 20 30 78 36 36 2c  { 0x03C6,  0x66,
bd20: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 86 20   0x00 },  /* .. 
bd30: 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to f */.  { 0x03
bd40: 43 37 2c 20 20 30 78 36 33 2c 20 30 78 36 38 20  C7,  0x63, 0x68 
bd50: 7d 2c 20 20 2f 2a 20 cf 87 20 74 6f 20 63 68 20  },  /* .. to ch 
bd60: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 38 2c 20 20  */.  { 0x03C8,  
bd70: 30 78 37 30 2c 20 30 78 37 33 20 7d 2c 20 20 2f  0x70, 0x73 },  /
bd80: 2a 20 cf 88 20 74 6f 20 70 73 20 2a 2f 0a 20 20  * .. to ps */.  
bd90: 7b 20 30 78 30 33 43 39 2c 20 20 30 78 36 66 2c  { 0x03C9,  0x6f,
bda0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 89 20   0x00 },  /* .. 
bdb0: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to o */.  { 0x03
bdc0: 43 41 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  CA,  0x69, 0x00 
bdd0: 7d 2c 20 20 2f 2a 20 cf 8a 20 74 6f 20 69 20 2a  },  /* .. to i *
bde0: 2f 0a 20 20 7b 20 30 78 30 33 43 42 2c 20 20 30  /.  { 0x03CB,  0
bdf0: 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x79, 0x00 },  /*
be00: 20 cf 8b 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20   .. to y */.  { 
be10: 30 78 30 33 43 43 2c 20 20 30 78 36 66 2c 20 30  0x03CC,  0x6f, 0
be20: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8c 20 74 6f  x00 },  /* .. to
be30: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 44   o */.  { 0x03CD
be40: 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c  ,  0x79, 0x00 },
be50: 20 20 2f 2a 20 cf 8d 20 74 6f 20 79 20 2a 2f 0a    /* .. to y */.
be60: 20 20 7b 20 30 78 30 33 43 45 2c 20 20 30 78 36    { 0x03CE,  0x6
be70: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  9, 0x00 },  /* .
be80: 8e 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
be90: 30 34 30 30 2c 20 20 30 78 34 35 2c 20 30 78 30  0400,  0x45, 0x0
bea0: 30 20 7d 2c 20 20 2f 2a 20 d0 80 20 74 6f 20 45  0 },  /* .. to E
beb0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 31 2c 20   */.  { 0x0401, 
bec0: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
bed0: 2f 2a 20 d0 81 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
bee0: 7b 20 30 78 30 34 30 32 2c 20 20 30 78 34 34 2c  { 0x0402,  0x44,
bef0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 82 20   0x00 },  /* .. 
bf00: 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to D */.  { 0x04
bf10: 30 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20  03,  0x47, 0x00 
bf20: 7d 2c 20 20 2f 2a 20 d0 83 20 74 6f 20 47 20 2a  },  /* .. to G *
bf30: 2f 0a 20 20 7b 20 30 78 30 34 30 34 2c 20 20 30  /.  { 0x0404,  0
bf40: 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x45, 0x00 },  /*
bf50: 20 d0 84 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
bf60: 30 78 30 34 30 35 2c 20 20 30 78 35 61 2c 20 30  0x0405,  0x5a, 0
bf70: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 85 20 74 6f  x00 },  /* .. to
bf80: 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 36   Z */.  { 0x0406
bf90: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
bfa0: 20 20 2f 2a 20 d0 86 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
bfb0: 20 20 7b 20 30 78 30 34 30 37 2c 20 20 30 78 34    { 0x0407,  0x4
bfc0: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  9, 0x00 },  /* .
bfd0: 87 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
bfe0: 30 34 30 38 2c 20 20 30 78 34 61 2c 20 30 78 30  0408,  0x4a, 0x0
bff0: 30 20 7d 2c 20 20 2f 2a 20 d0 88 20 74 6f 20 4a  0 },  /* .. to J
c000: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 39 2c 20   */.  { 0x0409, 
c010: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
c020: 2f 2a 20 d0 89 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
c030: 7b 20 30 78 30 34 30 41 2c 20 20 30 78 34 65 2c  { 0x040A,  0x4e,
c040: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8a 20   0x00 },  /* .. 
c050: 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to N */.  { 0x04
c060: 30 42 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20  0B,  0x44, 0x00 
c070: 7d 2c 20 20 2f 2a 20 d0 8b 20 74 6f 20 44 20 2a  },  /* .. to D *
c080: 2f 0a 20 20 7b 20 30 78 30 34 30 43 2c 20 20 30  /.  { 0x040C,  0
c090: 78 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4b, 0x00 },  /*
c0a0: 20 d0 8c 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20   .. to K */.  { 
c0b0: 30 78 30 34 30 44 2c 20 20 30 78 34 39 2c 20 30  0x040D,  0x49, 0
c0c0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8d 20 74 6f  x00 },  /* .. to
c0d0: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 45   I */.  { 0x040E
c0e0: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
c0f0: 20 20 2f 2a 20 d0 8e 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
c100: 20 20 7b 20 30 78 30 34 30 46 2c 20 20 30 78 34    { 0x040F,  0x4
c110: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  4, 0x00 },  /* .
c120: 8f 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78  . to D */.  { 0x
c130: 30 34 31 30 2c 20 20 30 78 34 31 2c 20 30 78 30  0410,  0x41, 0x0
c140: 30 20 7d 2c 20 20 2f 2a 20 d0 90 20 74 6f 20 41  0 },  /* .. to A
c150: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 31 2c 20   */.  { 0x0411, 
c160: 20 30 78 34 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x42, 0x00 },  
c170: 2f 2a 20 d0 91 20 74 6f 20 42 20 2a 2f 0a 20 20  /* .. to B */.  
c180: 7b 20 30 78 30 34 31 32 2c 20 20 30 78 35 36 2c  { 0x0412,  0x56,
c190: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 92 20   0x00 },  /* .. 
c1a0: 74 6f 20 56 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to V */.  { 0x04
c1b0: 31 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20  13,  0x47, 0x00 
c1c0: 7d 2c 20 20 2f 2a 20 d0 93 20 74 6f 20 47 20 2a  },  /* .. to G *
c1d0: 2f 0a 20 20 7b 20 30 78 30 34 31 34 2c 20 20 30  /.  { 0x0414,  0
c1e0: 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x44, 0x00 },  /*
c1f0: 20 d0 94 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20   .. to D */.  { 
c200: 30 78 30 34 31 35 2c 20 20 30 78 34 35 2c 20 30  0x0415,  0x45, 0
c210: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 95 20 74 6f  x00 },  /* .. to
c220: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 36   E */.  { 0x0416
c230: 2c 20 20 30 78 35 61 2c 20 30 78 36 38 20 7d 2c  ,  0x5a, 0x68 },
c240: 20 20 2f 2a 20 d0 96 20 74 6f 20 5a 68 20 2a 2f    /* .. to Zh */
c250: 0a 20 20 7b 20 30 78 30 34 31 37 2c 20 20 30 78  .  { 0x0417,  0x
c260: 35 61 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  5a, 0x00 },  /* 
c270: d0 97 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30  .. to Z */.  { 0
c280: 78 30 34 31 38 2c 20 20 30 78 34 39 2c 20 30 78  x0418,  0x49, 0x
c290: 30 30 20 7d 2c 20 20 2f 2a 20 d0 98 20 74 6f 20  00 },  /* .. to 
c2a0: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 39 2c  I */.  { 0x0419,
c2b0: 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20    0x49, 0x00 }, 
c2c0: 20 2f 2a 20 d0 99 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
c2d0: 20 7b 20 30 78 30 34 31 41 2c 20 20 30 78 34 62   { 0x041A,  0x4b
c2e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9a  , 0x00 },  /* ..
c2f0: 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30   to K */.  { 0x0
c300: 34 31 42 2c 20 20 30 78 34 63 2c 20 30 78 30 30  41B,  0x4c, 0x00
c310: 20 7d 2c 20 20 2f 2a 20 d0 9b 20 74 6f 20 4c 20   },  /* .. to L 
c320: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 43 2c 20 20  */.  { 0x041C,  
c330: 30 78 34 64 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4d, 0x00 },  /
c340: 2a 20 d0 9c 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b  * .. to M */.  {
c350: 20 30 78 30 34 31 44 2c 20 20 30 78 34 65 2c 20   0x041D,  0x4e, 
c360: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9d 20 74  0x00 },  /* .. t
c370: 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o N */.  { 0x041
c380: 45 2c 20 20 30 78 34 66 2c 20 30 78 30 30 20 7d  E,  0x4f, 0x00 }
c390: 2c 20 20 2f 2a 20 d0 9e 20 74 6f 20 4f 20 2a 2f  ,  /* .. to O */
c3a0: 0a 20 20 7b 20 30 78 30 34 31 46 2c 20 20 30 78  .  { 0x041F,  0x
c3b0: 35 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  50, 0x00 },  /* 
c3c0: d0 9f 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30  .. to P */.  { 0
c3d0: 78 30 34 32 30 2c 20 20 30 78 35 32 2c 20 30 78  x0420,  0x52, 0x
c3e0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 a0 20 74 6f 20  00 },  /* .. to 
c3f0: 52 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 31 2c  R */.  { 0x0421,
c400: 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20    0x53, 0x00 }, 
c410: 20 2f 2a 20 d0 a1 20 74 6f 20 53 20 2a 2f 0a 20   /* .. to S */. 
c420: 20 7b 20 30 78 30 34 32 32 2c 20 20 30 78 35 34   { 0x0422,  0x54
c430: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a2  , 0x00 },  /* ..
c440: 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30   to T */.  { 0x0
c450: 34 32 33 2c 20 20 30 78 35 35 2c 20 30 78 30 30  423,  0x55, 0x00
c460: 20 7d 2c 20 20 2f 2a 20 d0 a3 20 74 6f 20 55 20   },  /* .. to U 
c470: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 34 2c 20 20  */.  { 0x0424,  
c480: 30 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x46, 0x00 },  /
c490: 2a 20 d0 a4 20 74 6f 20 46 20 2a 2f 0a 20 20 7b  * .. to F */.  {
c4a0: 20 30 78 30 34 32 35 2c 20 20 30 78 34 62 2c 20   0x0425,  0x4b, 
c4b0: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a5 20 74  0x68 },  /* .. t
c4c0: 6f 20 4b 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34  o Kh */.  { 0x04
c4d0: 32 36 2c 20 20 30 78 35 34 2c 20 30 78 36 33 20  26,  0x54, 0x63 
c4e0: 7d 2c 20 20 2f 2a 20 d0 a6 20 74 6f 20 54 63 20  },  /* .. to Tc 
c4f0: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 37 2c 20 20  */.  { 0x0427,  
c500: 30 78 34 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x43, 0x68 },  /
c510: 2a 20 d0 a7 20 74 6f 20 43 68 20 2a 2f 0a 20 20  * .. to Ch */.  
c520: 7b 20 30 78 30 34 32 38 2c 20 20 30 78 35 33 2c  { 0x0428,  0x53,
c530: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a8 20   0x68 },  /* .. 
c540: 74 6f 20 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Sh */.  { 0x0
c550: 34 32 39 2c 20 20 30 78 35 33 2c 20 30 78 36 38  429,  0x53, 0x68
c560: 20 7d 2c 20 20 2f 2a 20 d0 a9 20 74 6f 20 53 68   },  /* .. to Sh
c570: 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 41  ch */.  { 0x042A
c580: 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c  ,  0x61, 0x00 },
c590: 20 20 2f 2a 20 20 74 6f 20 41 20 2a 2f 0a 20 20    /*  to A */.  
c5a0: 7b 20 30 78 30 34 32 42 2c 20 20 30 78 35 39 2c  { 0x042B,  0x59,
c5b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ab 20   0x00 },  /* .. 
c5c0: 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to Y */.  { 0x04
c5d0: 32 43 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20  2C,  0x59, 0x00 
c5e0: 7d 2c 20 20 2f 2a 20 20 74 6f 20 59 20 2a 2f 0a  },  /*  to Y */.
c5f0: 20 20 7b 20 30 78 30 34 32 44 2c 20 20 30 78 34    { 0x042D,  0x4
c600: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  5, 0x00 },  /* .
c610: ad 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
c620: 30 34 32 45 2c 20 20 30 78 34 39 2c 20 30 78 37  042E,  0x49, 0x7
c630: 35 20 7d 2c 20 20 2f 2a 20 d0 ae 20 74 6f 20 49  5 },  /* .. to I
c640: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 46 2c  u */.  { 0x042F,
c650: 20 20 30 78 34 39 2c 20 30 78 36 31 20 7d 2c 20    0x49, 0x61 }, 
c660: 20 2f 2a 20 d0 af 20 74 6f 20 49 61 20 2a 2f 0a   /* .. to Ia */.
c670: 20 20 7b 20 30 78 30 34 33 30 2c 20 20 30 78 36    { 0x0430,  0x6
c680: 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  1, 0x00 },  /* .
c690: b0 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78  . to a */.  { 0x
c6a0: 30 34 33 31 2c 20 20 30 78 36 32 2c 20 30 78 30  0431,  0x62, 0x0
c6b0: 30 20 7d 2c 20 20 2f 2a 20 d0 b1 20 74 6f 20 62  0 },  /* .. to b
c6c0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 32 2c 20   */.  { 0x0432, 
c6d0: 20 30 78 37 36 2c 20 30 78 30 30 20 7d 2c 20 20   0x76, 0x00 },  
c6e0: 2f 2a 20 d0 b2 20 74 6f 20 76 20 2a 2f 0a 20 20  /* .. to v */.  
c6f0: 7b 20 30 78 30 34 33 33 2c 20 20 30 78 36 37 2c  { 0x0433,  0x67,
c700: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b3 20   0x00 },  /* .. 
c710: 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to g */.  { 0x04
c720: 33 34 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20  34,  0x64, 0x00 
c730: 7d 2c 20 20 2f 2a 20 d0 b4 20 74 6f 20 64 20 2a  },  /* .. to d *
c740: 2f 0a 20 20 7b 20 30 78 30 34 33 35 2c 20 20 30  /.  { 0x0435,  0
c750: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
c760: 20 d0 b5 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
c770: 30 78 30 34 33 36 2c 20 20 30 78 37 61 2c 20 30  0x0436,  0x7a, 0
c780: 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 b6 20 74 6f  x68 },  /* .. to
c790: 20 7a 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33   zh */.  { 0x043
c7a0: 37 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20 7d  7,  0x7a, 0x00 }
c7b0: 2c 20 20 2f 2a 20 d0 b7 20 74 6f 20 7a 20 2a 2f  ,  /* .. to z */
c7c0: 0a 20 20 7b 20 30 78 30 34 33 38 2c 20 20 30 78  .  { 0x0438,  0x
c7d0: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
c7e0: d0 b8 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
c7f0: 78 30 34 33 39 2c 20 20 30 78 36 39 2c 20 30 78  x0439,  0x69, 0x
c800: 30 30 20 7d 2c 20 20 2f 2a 20 d0 b9 20 74 6f 20  00 },  /* .. to 
c810: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 41 2c  i */.  { 0x043A,
c820: 20 20 30 78 36 62 2c 20 30 78 30 30 20 7d 2c 20    0x6b, 0x00 }, 
c830: 20 2f 2a 20 d0 ba 20 74 6f 20 6b 20 2a 2f 0a 20   /* .. to k */. 
c840: 20 7b 20 30 78 30 34 33 42 2c 20 20 30 78 36 63   { 0x043B,  0x6c
c850: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bb  , 0x00 },  /* ..
c860: 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30   to l */.  { 0x0
c870: 34 33 43 2c 20 20 30 78 36 64 2c 20 30 78 30 30  43C,  0x6d, 0x00
c880: 20 7d 2c 20 20 2f 2a 20 d0 bc 20 74 6f 20 6d 20   },  /* .. to m 
c890: 2a 2f 0a 20 20 7b 20 30 78 30 34 33 44 2c 20 20  */.  { 0x043D,  
c8a0: 30 78 36 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6e, 0x00 },  /
c8b0: 2a 20 d0 bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b  * .. to n */.  {
c8c0: 20 30 78 30 34 33 45 2c 20 20 30 78 36 66 2c 20   0x043E,  0x6f, 
c8d0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 be 20 74  0x00 },  /* .. t
c8e0: 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33  o o */.  { 0x043
c8f0: 46 2c 20 20 30 78 37 30 2c 20 30 78 30 30 20 7d  F,  0x70, 0x00 }
c900: 2c 20 20 2f 2a 20 d0 bf 20 74 6f 20 70 20 2a 2f  ,  /* .. to p */
c910: 0a 20 20 7b 20 30 78 30 34 34 30 2c 20 20 30 78  .  { 0x0440,  0x
c920: 37 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  72, 0x00 },  /* 
c930: d1 80 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30  .. to r */.  { 0
c940: 78 30 34 34 31 2c 20 20 30 78 37 33 2c 20 30 78  x0441,  0x73, 0x
c950: 30 30 20 7d 2c 20 20 2f 2a 20 d1 81 20 74 6f 20  00 },  /* .. to 
c960: 73 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 32 2c  s */.  { 0x0442,
c970: 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20    0x74, 0x00 }, 
c980: 20 2f 2a 20 d1 82 20 74 6f 20 74 20 2a 2f 0a 20   /* .. to t */. 
c990: 20 7b 20 30 78 30 34 34 33 2c 20 20 30 78 37 35   { 0x0443,  0x75
c9a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 83  , 0x00 },  /* ..
c9b0: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
c9c0: 34 34 34 2c 20 20 30 78 36 36 2c 20 30 78 30 30  444,  0x66, 0x00
c9d0: 20 7d 2c 20 20 2f 2a 20 d1 84 20 74 6f 20 66 20   },  /* .. to f 
c9e0: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 35 2c 20 20  */.  { 0x0445,  
c9f0: 30 78 36 62 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x6b, 0x68 },  /
ca00: 2a 20 d1 85 20 74 6f 20 6b 68 20 2a 2f 0a 20 20  * .. to kh */.  
ca10: 7b 20 30 78 30 34 34 36 2c 20 20 30 78 37 34 2c  { 0x0446,  0x74,
ca20: 20 30 78 36 33 20 7d 2c 20 20 2f 2a 20 d1 86 20   0x63 },  /* .. 
ca30: 74 6f 20 74 63 20 2a 2f 0a 20 20 7b 20 30 78 30  to tc */.  { 0x0
ca40: 34 34 37 2c 20 20 30 78 36 33 2c 20 30 78 36 38  447,  0x63, 0x68
ca50: 20 7d 2c 20 20 2f 2a 20 d1 87 20 74 6f 20 63 68   },  /* .. to ch
ca60: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 38 2c 20   */.  { 0x0448, 
ca70: 20 30 78 37 33 2c 20 30 78 36 38 20 7d 2c 20 20   0x73, 0x68 },  
ca80: 2f 2a 20 d1 88 20 74 6f 20 73 68 20 2a 2f 0a 20  /* .. to sh */. 
ca90: 20 7b 20 30 78 30 34 34 39 2c 20 20 30 78 37 33   { 0x0449,  0x73
caa0: 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d1 89  , 0x68 },  /* ..
cab0: 20 74 6f 20 73 68 63 68 20 2a 2f 0a 20 20 7b 20   to shch */.  { 
cac0: 30 78 30 34 34 41 2c 20 20 30 78 36 31 2c 20 30  0x044A,  0x61, 0
cad0: 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 61  x00 },  /*  to a
cae0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 42 2c 20   */.  { 0x044B, 
caf0: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
cb00: 2f 2a 20 d1 8b 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
cb10: 7b 20 30 78 30 34 34 43 2c 20 20 30 78 37 39 2c  { 0x044C,  0x79,
cb20: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f   0x00 },  /*  to
cb30: 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 44   y */.  { 0x044D
cb40: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
cb50: 20 20 2f 2a 20 d1 8d 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
cb60: 20 20 7b 20 30 78 30 34 34 45 2c 20 20 30 78 36    { 0x044E,  0x6
cb70: 39 2c 20 30 78 37 35 20 7d 2c 20 20 2f 2a 20 d1  9, 0x75 },  /* .
cb80: 8e 20 74 6f 20 69 75 20 2a 2f 0a 20 20 7b 20 30  . to iu */.  { 0
cb90: 78 30 34 34 46 2c 20 20 30 78 36 39 2c 20 30 78  x044F,  0x69, 0x
cba0: 36 31 20 7d 2c 20 20 2f 2a 20 d1 8f 20 74 6f 20  61 },  /* .. to 
cbb0: 69 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 30  ia */.  { 0x0450
cbc0: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
cbd0: 20 20 2f 2a 20 d1 90 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
cbe0: 20 20 7b 20 30 78 30 34 35 31 2c 20 20 30 78 36    { 0x0451,  0x6
cbf0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  5, 0x00 },  /* .
cc00: 91 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
cc10: 30 34 35 32 2c 20 20 30 78 36 34 2c 20 30 78 30  0452,  0x64, 0x0
cc20: 30 20 7d 2c 20 20 2f 2a 20 d1 92 20 74 6f 20 64  0 },  /* .. to d
cc30: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 33 2c 20   */.  { 0x0453, 
cc40: 20 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20 20   0x67, 0x00 },  
cc50: 2f 2a 20 d1 93 20 74 6f 20 67 20 2a 2f 0a 20 20  /* .. to g */.  
cc60: 7b 20 30 78 30 34 35 34 2c 20 20 30 78 36 35 2c  { 0x0454,  0x65,
cc70: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 94 20   0x00 },  /* .. 
cc80: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to e */.  { 0x04
cc90: 35 35 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20  55,  0x7a, 0x00 
cca0: 7d 2c 20 20 2f 2a 20 d1 95 20 74 6f 20 7a 20 2a  },  /* .. to z *
ccb0: 2f 0a 20 20 7b 20 30 78 30 34 35 36 2c 20 20 30  /.  { 0x0456,  0
ccc0: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
ccd0: 20 d1 96 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
cce0: 30 78 30 34 35 37 2c 20 20 30 78 36 39 2c 20 30  0x0457,  0x69, 0
ccf0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 97 20 74 6f  x00 },  /* .. to
cd00: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 38   i */.  { 0x0458
cd10: 2c 20 20 30 78 36 61 2c 20 30 78 30 30 20 7d 2c  ,  0x6a, 0x00 },
cd20: 20 20 2f 2a 20 d1 98 20 74 6f 20 6a 20 2a 2f 0a    /* .. to j */.
cd30: 20 20 7b 20 30 78 30 34 35 39 2c 20 20 30 78 36    { 0x0459,  0x6
cd40: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  9, 0x00 },  /* .
cd50: 99 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
cd60: 30 34 35 41 2c 20 20 30 78 36 65 2c 20 30 78 30  045A,  0x6e, 0x0
cd70: 30 20 7d 2c 20 20 2f 2a 20 d1 9a 20 74 6f 20 6e  0 },  /* .. to n
cd80: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 42 2c 20   */.  { 0x045B, 
cd90: 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x64, 0x00 },  
cda0: 2f 2a 20 d1 9b 20 74 6f 20 64 20 2a 2f 0a 20 20  /* .. to d */.  
cdb0: 7b 20 30 78 30 34 35 43 2c 20 20 30 78 36 62 2c  { 0x045C,  0x6b,
cdc0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9c 20   0x00 },  /* .. 
cdd0: 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to k */.  { 0x04
cde0: 35 44 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  5D,  0x69, 0x00 
cdf0: 7d 2c 20 20 2f 2a 20 d1 9d 20 74 6f 20 69 20 2a  },  /* .. to i *
ce00: 2f 0a 20 20 7b 20 30 78 30 34 35 45 2c 20 20 30  /.  { 0x045E,  0
ce10: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
ce20: 20 d1 9e 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
ce30: 30 78 30 34 35 46 2c 20 20 30 78 36 34 2c 20 30  0x045F,  0x64, 0
ce40: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9f 20 74 6f  x00 },  /* .. to
ce50: 20 64 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30 32   d */.  { 0x1E02
ce60: 2c 20 20 30 78 34 32 2c 20 30 78 30 30 20 7d 2c  ,  0x42, 0x00 },
ce70: 20 20 2f 2a 20 e1 b8 82 20 74 6f 20 42 20 2a 2f    /* ... to B */
ce80: 0a 20 20 7b 20 30 78 31 45 30 33 2c 20 20 30 78  .  { 0x1E03,  0x
ce90: 36 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  62, 0x00 },  /* 
cea0: e1 b8 83 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20  ... to b */.  { 
ceb0: 30 78 31 45 30 41 2c 20 20 30 78 34 34 2c 20 30  0x1E0A,  0x44, 0
cec0: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 8a 20 74  x00 },  /* ... t
ced0: 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30  o D */.  { 0x1E0
cee0: 42 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d  B,  0x64, 0x00 }
cef0: 2c 20 20 2f 2a 20 e1 b8 8b 20 74 6f 20 64 20 2a  ,  /* ... to d *
cf00: 2f 0a 20 20 7b 20 30 78 31 45 31 45 2c 20 20 30  /.  { 0x1E1E,  0
cf10: 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x46, 0x00 },  /*
cf20: 20 e1 b8 9e 20 74 6f 20 46 20 2a 2f 0a 20 20 7b   ... to F */.  {
cf30: 20 30 78 31 45 31 46 2c 20 20 30 78 36 36 2c 20   0x1E1F,  0x66, 
cf40: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 9f 20  0x00 },  /* ... 
cf50: 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to f */.  { 0x1E
cf60: 34 30 2c 20 20 30 78 34 44 2c 20 30 78 30 30 20  40,  0x4D, 0x00 
cf70: 7d 2c 20 20 2f 2a 20 e1 b9 80 20 74 6f 20 4d 20  },  /* ... to M 
cf80: 2a 2f 0a 20 20 7b 20 30 78 31 45 34 31 2c 20 20  */.  { 0x1E41,  
cf90: 30 78 36 44 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6D, 0x00 },  /
cfa0: 2a 20 e1 b9 81 20 74 6f 20 6d 20 2a 2f 0a 20 20  * ... to m */.  
cfb0: 7b 20 30 78 31 45 35 36 2c 20 20 30 78 35 30 2c  { 0x1E56,  0x50,
cfc0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 96   0x00 },  /* ...
cfd0: 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 31   to P */.  { 0x1
cfe0: 45 35 37 2c 20 20 30 78 37 30 2c 20 30 78 30 30  E57,  0x70, 0x00
cff0: 20 7d 2c 20 20 2f 2a 20 e1 b9 97 20 74 6f 20 70   },  /* ... to p
d000: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 30 2c 20   */.  { 0x1E60, 
d010: 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x53, 0x00 },  
d020: 2f 2a 20 e1 b9 a0 20 74 6f 20 53 20 2a 2f 0a 20  /* ... to S */. 
d030: 20 7b 20 30 78 31 45 36 31 2c 20 20 30 78 37 33   { 0x1E61,  0x73
d040: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9  , 0x00 },  /* ..
d050: a1 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
d060: 31 45 36 41 2c 20 20 30 78 35 34 2c 20 30 78 30  1E6A,  0x54, 0x0
d070: 30 20 7d 2c 20 20 2f 2a 20 e1 b9 aa 20 74 6f 20  0 },  /* ... to 
d080: 54 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 42 2c  T */.  { 0x1E6B,
d090: 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20    0x74, 0x00 }, 
d0a0: 20 2f 2a 20 e1 b9 ab 20 74 6f 20 74 20 2a 2f 0a   /* ... to t */.
d0b0: 20 20 7b 20 30 78 31 45 38 30 2c 20 20 30 78 35    { 0x1E80,  0x5
d0c0: 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  7, 0x00 },  /* .
d0d0: ba 80 20 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30  .. to W */.  { 0
d0e0: 78 31 45 38 31 2c 20 20 30 78 37 37 2c 20 30 78  x1E81,  0x77, 0x
d0f0: 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 81 20 74 6f  00 },  /* ... to
d100: 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 32   w */.  { 0x1E82
d110: 2c 20 20 30 78 35 37 2c 20 30 78 30 30 20 7d 2c  ,  0x57, 0x00 },
d120: 20 20 2f 2a 20 e1 ba 82 20 74 6f 20 57 20 2a 2f    /* ... to W */
d130: 0a 20 20 7b 20 30 78 31 45 38 33 2c 20 20 30 78  .  { 0x1E83,  0x
d140: 37 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  77, 0x00 },  /* 
d150: e1 ba 83 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20  ... to w */.  { 
d160: 30 78 31 45 38 34 2c 20 20 30 78 35 37 2c 20 30  0x1E84,  0x57, 0
d170: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 84 20 74  x00 },  /* ... t
d180: 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38  o W */.  { 0x1E8
d190: 35 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20 7d  5,  0x77, 0x00 }
d1a0: 2c 20 20 2f 2a 20 e1 ba 85 20 74 6f 20 77 20 2a  ,  /* ... to w *
d1b0: 2f 0a 20 20 7b 20 30 78 31 45 46 32 2c 20 20 30  /.  { 0x1EF2,  0
d1c0: 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x59, 0x00 },  /*
d1d0: 20 e1 bb b2 20 74 6f 20 59 20 2a 2f 0a 20 20 7b   ... to Y */.  {
d1e0: 20 30 78 31 45 46 33 2c 20 20 30 78 37 39 2c 20   0x1EF3,  0x79, 
d1f0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 bb b3 20  0x00 },  /* ... 
d200: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 46 42  to y */.  { 0xFB
d210: 30 30 2c 20 20 30 78 36 36 2c 20 30 78 36 36 20  00,  0x66, 0x66 
d220: 7d 2c 20 20 2f 2a 20 ef ac 80 20 74 6f 20 66 66  },  /* ... to ff
d230: 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 31 2c 20   */.  { 0xFB01, 
d240: 20 30 78 36 36 2c 20 30 78 36 39 20 7d 2c 20 20   0x66, 0x69 },  
d250: 2f 2a 20 ef ac 81 20 74 6f 20 66 69 20 2a 2f 0a  /* ... to fi */.
d260: 20 20 7b 20 30 78 46 42 30 32 2c 20 20 30 78 36    { 0xFB02,  0x6
d270: 36 2c 20 30 78 36 43 20 7d 2c 20 20 2f 2a 20 ef  6, 0x6C },  /* .
d280: ac 82 20 74 6f 20 66 6c 20 2a 2f 0a 20 20 7b 20  .. to fl */.  { 
d290: 30 78 46 42 30 35 2c 20 20 30 78 37 33 2c 20 30  0xFB05,  0x73, 0
d2a0: 78 37 34 20 7d 2c 20 20 2f 2a 20 ef ac 85 20 74  x74 },  /* ... t
d2b0: 6f 20 73 74 20 2a 2f 0a 20 20 7b 20 30 78 46 42  o st */.  { 0xFB
d2c0: 30 36 2c 20 20 30 78 37 33 2c 20 30 78 37 34 20  06,  0x73, 0x74 
d2d0: 7d 2c 20 20 2f 2a 20 ef ac 86 20 74 6f 20 73 74  },  /* ... to st
d2e0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
d2f0: 6e 76 65 72 74 20 74 68 65 20 69 6e 70 75 74 20  nvert the input 
d300: 73 74 72 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d  string from UTF-
d310: 38 20 69 6e 74 6f 20 70 75 72 65 20 41 53 43 49  8 into pure ASCI
d320: 49 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  I by converting.
d330: 2a 2a 20 61 6c 6c 20 6e 6f 6e 2d 41 53 43 49 49  ** all non-ASCII
d340: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 73   characters to s
d350: 6f 6d 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ome combination 
d360: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
d370: 20 74 68 65 0a 2a 2a 20 41 53 43 49 49 20 73 75   the.** ASCII su
d380: 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bset..**.** The 
d390: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
d3a0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 6d 6f  might contain mo
d3b0: 72 65 20 63 68 61 72 61 63 74 65 72 73 20 74 68  re characters th
d3c0: 61 6e 20 74 68 65 20 69 6e 70 75 74 2e 0a 2a 2a  an the input..**
d3d0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
d3e0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
d3f0: 74 72 69 6e 67 20 63 6f 6d 65 73 20 66 72 6f 6d  tring comes from
d400: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
d410: 29 20 61 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64 20  ) and.** should 
d420: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
d430: 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
d440: 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  c unsigned char 
d450: 2a 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 63  *transliterate(c
d460: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
d470: 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *zIn, int nIn
d480: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
d490: 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
d4a0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 49 6e 2a 34  e3_malloc( nIn*4
d4b0: 20 2b 20 31 20 29 3b 0a 20 20 69 6e 74 20 63 2c   + 1 );.  int c,
d4c0: 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69 66 28   sz, nOut;.  if(
d4d0: 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72   zOut==0 ) retur
d4e0: 6e 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20 30 3b  n 0;.  nOut = 0;
d4f0: 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20  .  while( nIn>0 
d500: 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66 38 52  ){.    c = utf8R
d510: 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20 26 73  ead(zIn, nIn, &s
d520: 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 73  z);.    zIn += s
d530: 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20 73 7a  z;.    nIn -= sz
d540: 3b 0a 20 20 20 20 69 66 28 20 63 3c 3d 31 32 37  ;.    if( c<=127
d550: 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74 5b 6e   ){.      zOut[n
d560: 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
d570: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
d580: 20 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a   xTop, xBtm, x;.
d590: 20 20 20 20 20 20 78 54 6f 70 20 3d 20 73 69 7a        xTop = siz
d5a0: 65 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69  eof(translit)/si
d5b0: 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d  zeof(translit[0]
d5c0: 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 78 42 74  ) - 1;.      xBt
d5d0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  m = 0;.      whi
d5e0: 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20 29  le( xTop>=xBtm )
d5f0: 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 78  {.        x = (x
d600: 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a 20  Top + xBtm)/2;. 
d610: 20 20 20 20 20 20 20 69 66 28 20 74 72 61 6e 73         if( trans
d620: 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20  lit[x].cFrom==c 
d630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 75  ){.          zOu
d640: 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61 6e  t[nOut++] = tran
d650: 73 6c 69 74 5b 78 5d 2e 63 54 6f 30 3b 0a 20 20  slit[x].cTo0;.  
d660: 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61 6e          if( tran
d670: 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 20 29 7b 0a  slit[x].cTo1 ){.
d680: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74              zOut
d690: 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61 6e 73  [nOut++] = trans
d6a0: 6c 69 74 5b 78 5d 2e 63 54 6f 31 3b 0a 20 20 20  lit[x].cTo1;.   
d6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
d6c0: 61 6e 20 65 78 74 72 61 20 22 63 68 22 20 61 66  an extra "ch" af
d6d0: 74 65 72 20 74 68 65 20 22 73 68 22 20 66 6f 72  ter the "sh" for
d6e0: 20 d0 a9 20 61 6e 64 20 d1 89 20 2a 2f 0a 20 20   .. and .. */.  
d6f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
d700: 3d 30 78 30 34 32 39 20 7c 7c 20 63 3d 3d 20 30  =0x0429 || c== 0
d710: 78 30 34 34 39 20 29 7b 0a 20 20 20 20 20 20 20  x0449 ){.       
d720: 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74         zOut[nOut
d730: 2b 2b 5d 20 3d 20 27 63 27 3b 0a 20 20 20 20 20  ++] = 'c';.     
d740: 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f           zOut[nO
d750: 75 74 2b 2b 5d 20 3d 20 27 68 27 3b 0a 20 20 20  ut++] = 'h';.   
d760: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d780: 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
d790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
d7a0: 20 7d 65 6c 73 65 20 69 66 28 20 74 72 61 6e 73   }else if( trans
d7b0: 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3e 63 20 29  lit[x].cFrom>c )
d7c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 54 6f 70  {.          xTop
d7d0: 20 3d 20 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   = x-1;.        
d7e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d7f0: 20 78 42 74 6d 20 3d 20 78 2b 31 3b 0a 20 20 20   xBtm = x+1;.   
d800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d810: 20 20 20 20 20 69 66 28 20 63 20 29 20 7a 4f 75       if( c ) zOu
d820: 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 27 3f 27 3b  t[nOut++] = '?';
d830: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4f 75  .    }.  }.  zOu
d840: 74 5b 6e 4f 75 74 5d 20 3d 20 30 3b 0a 20 20 72  t[nOut] = 0;.  r
d850: 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f  eturn zOut;.}../
d860: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
d870: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
d880: 74 65 72 73 20 69 6e 20 74 68 65 20 73 68 6f 72  ters in the shor
d890: 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74  test prefix of t
d8a0: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74 72 69  he input.** stri
d8b0: 6e 67 20 74 68 61 74 20 74 72 61 6e 73 6c 69 74  ng that translit
d8c0: 65 72 61 74 65 73 20 74 6f 20 61 6e 20 41 53 43  erates to an ASC
d8d0: 49 49 20 73 74 72 69 6e 67 20 6e 54 72 61 6e 73  II string nTrans
d8e0: 20 62 79 74 65 73 20 6f 72 20 6c 6f 6e 67 65 72   bytes or longer
d8f0: 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
d900: 74 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e 20  transliteration 
d910: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74 72  of the input str
d920: 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ing is less than
d930: 20 6e 54 72 61 6e 73 0a 2a 2a 20 62 79 74 65 73   nTrans.** bytes
d940: 20 69 6e 20 73 69 7a 65 2c 20 72 65 74 75 72 6e   in size, return
d950: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
d960: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
d970: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a   input string..*
d980: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  /.static int tra
d990: 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65 6e  nslen_to_charlen
d9a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
d9b0: 2c 20 69 6e 74 20 6e 49 6e 2c 20 69 6e 74 20 6e  , int nIn, int n
d9c0: 54 72 61 6e 73 29 7b 0a 20 20 69 6e 74 20 69 2c  Trans){.  int i,
d9d0: 20 63 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20   c, sz, nOut;.  
d9e0: 69 6e 74 20 6e 43 68 61 72 3b 0a 0a 20 20 69 20  int nChar;..  i 
d9f0: 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 66 6f  = nOut = 0;.  fo
da00: 72 28 6e 43 68 61 72 3d 30 3b 20 69 3c 6e 49 6e  r(nChar=0; i<nIn
da10: 20 26 26 20 6e 4f 75 74 3c 6e 54 72 61 6e 73 3b   && nOut<nTrans;
da20: 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 63   nChar++){.    c
da30: 20 3d 20 75 74 66 38 52 65 61 64 28 28 63 6f 6e   = utf8Read((con
da40: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
da50: 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49 6e 2d   *)&zIn[i], nIn-
da60: 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 20 2b  i, &sz);.    i +
da70: 3d 20 73 7a 3b 0a 0a 20 20 20 20 6e 4f 75 74 2b  = sz;..    nOut+
da80: 2b 3b 0a 20 20 20 20 69 66 28 20 63 3e 3d 31 32  +;.    if( c>=12
da90: 38 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  8 ){.      int x
daa0: 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a 20 20  Top, xBtm, x;.  
dab0: 20 20 20 20 78 54 6f 70 20 3d 20 73 69 7a 65 6f      xTop = sizeo
dac0: 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65  f(translit)/size
dad0: 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 20  of(translit[0]) 
dae0: 2d 20 31 3b 0a 20 20 20 20 20 20 78 42 74 6d 20  - 1;.      xBtm 
daf0: 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 0;.      while
db00: 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20 29 7b 0a  ( xTop>=xBtm ){.
db10: 20 20 20 20 20 20 20 20 78 20 3d 20 28 78 54 6f          x = (xTo
db20: 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a 20 20 20  p + xBtm)/2;.   
db30: 20 20 20 20 20 69 66 28 20 74 72 61 6e 73 6c 69       if( transli
db40: 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20 29 7b  t[x].cFrom==c ){
db50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 74  .          if( t
db60: 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 20  ranslit[x].cTo1 
db70: 29 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  ) nOut++;.      
db80: 20 20 20 20 69 66 28 20 63 3d 3d 30 78 30 34 32      if( c==0x042
db90: 39 20 7c 7c 20 63 3d 3d 20 30 78 30 34 34 39 20  9 || c== 0x0449 
dba0: 29 20 6e 4f 75 74 20 2b 3d 20 32 3b 0a 20 20 20  ) nOut += 2;.   
dbb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dbc0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dbd0: 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 46 72 6f  translit[x].cFro
dbe0: 6d 3e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  m>c ){.         
dbf0: 20 78 54 6f 70 20 3d 20 78 2d 31 3b 0a 20 20 20   xTop = x-1;.   
dc00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dc10: 20 20 20 20 20 20 78 42 74 6d 20 3d 20 78 2b 31        xBtm = x+1
dc20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dc30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
dc40: 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d   return nChar;.}
dc50: 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70 65 6c  .../*.**    spel
dc60: 6c 66 69 78 31 5f 74 72 61 6e 73 6c 69 74 28 58  lfix1_translit(X
dc70: 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ).**.** Convert 
dc80: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f  a string that co
dc90: 6e 74 61 69 6e 73 20 6e 6f 6e 2d 41 53 43 49 49  ntains non-ASCII
dca0: 20 52 6f 6d 61 6e 20 63 68 61 72 61 63 74 65 72   Roman character
dcb0: 73 20 69 6e 74 6f 20 0a 2a 2a 20 70 75 72 65 20  s into .** pure 
dcc0: 41 53 43 49 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  ASCII..*/.static
dcd0: 20 76 6f 69 64 20 74 72 61 6e 73 6c 69 74 65 72   void transliter
dce0: 61 74 65 53 71 6c 46 75 6e 63 28 0a 20 20 73 71  ateSqlFunc(.  sq
dcf0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
dd00: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
dd10: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
dd20: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
dd30: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
dd40: 68 61 72 20 2a 7a 49 6e 20 3d 20 73 71 6c 69 74  har *zIn = sqlit
dd50: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
dd60: 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 49  gv[0]);.  int nI
dd70: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
dd80: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
dd90: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
dda0: 72 20 2a 7a 4f 75 74 20 3d 20 74 72 61 6e 73 6c  r *zOut = transl
ddb0: 69 74 65 72 61 74 65 28 7a 49 6e 2c 20 6e 49 6e  iterate(zIn, nIn
ddc0: 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30  );.  if( zOut==0
ddd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dde0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
ddf0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  em(context);.  }
de00: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
de10: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
de20: 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a 4f  ntext, (char*)zO
de30: 75 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  ut, -1, sqlite3_
de40: 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  free);.  }.}../*
de50: 0a 2a 2a 20 20 20 20 73 70 65 6c 6c 66 69 78 31  .**    spellfix1
de60: 5f 73 63 72 69 70 74 63 6f 64 65 28 58 29 0a 2a  _scriptcode(X).*
de70: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 74 65  *.** Try to dete
de80: 72 6d 69 6e 65 20 74 68 65 20 64 6f 6d 69 6e 61  rmine the domina
de90: 6e 74 20 73 63 72 69 70 74 20 75 73 65 64 20 62  nt script used b
dea0: 79 20 74 68 65 20 77 6f 72 64 20 58 20 61 6e 64  y the word X and
deb0: 20 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20 49   return.** its I
dec0: 53 4f 20 31 35 39 32 34 20 6e 75 6d 65 72 69 63  SO 15924 numeric
ded0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   code..**.** The
dee0: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
def0: 6e 74 61 74 69 6f 6e 20 6f 6e 6c 79 20 75 6e 64  ntation only und
df00: 65 72 73 74 61 6e 64 73 20 74 68 65 20 66 6f 6c  erstands the fol
df10: 6c 6f 77 69 6e 67 20 73 63 72 69 70 74 73 3a 0a  lowing scripts:.
df20: 2a 2a 0a 2a 2a 20 20 20 20 32 31 35 20 20 28 4c  **.**    215  (L
df30: 61 74 69 6e 29 0a 2a 2a 20 20 20 20 32 32 30 20  atin).**    220 
df40: 20 28 43 79 72 69 6c 6c 69 63 29 0a 2a 2a 20 20   (Cyrillic).**  
df50: 20 20 32 30 30 20 20 28 47 72 65 65 6b 29 0a 2a    200  (Greek).*
df60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
df70: 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 39 39  e will return 99
df80: 38 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 58  8 if the input X
df90: 20 63 6f 6e 74 61 69 6e 73 20 63 68 61 72 61 63   contains charac
dfa0: 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f  ters from.** two
dfb0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
dfc0: 61 62 6f 76 65 20 73 63 72 69 70 74 73 20 6f 72  above scripts or
dfd0: 20 39 39 39 20 69 66 20 58 20 63 6f 6e 74 61 69   999 if X contai
dfe0: 6e 73 20 6e 6f 20 63 68 61 72 61 63 74 65 72 73  ns no characters
dff0: 0a 2a 2a 20 66 72 6f 6d 20 61 6e 79 20 6f 66 20  .** from any of 
e000: 74 68 65 20 61 62 6f 76 65 20 73 63 72 69 70 74  the above script
e010: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
e020: 64 20 73 63 72 69 70 74 43 6f 64 65 53 71 6c 46  d scriptCodeSqlF
e030: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
e040: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
e050: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
e060: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
e070: 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  rgv.){.  const u
e080: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
e090: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
e0a0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
e0b0: 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 73 71 6c  .  int nIn = sql
e0c0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
e0d0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74  (argv[0]);.  int
e0e0: 20 63 2c 20 73 7a 3b 0a 20 20 69 6e 74 20 73 63   c, sz;.  int sc
e0f0: 72 69 70 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  riptMask = 0;.  
e100: 69 6e 74 20 72 65 73 3b 0a 23 20 64 65 66 69 6e  int res;.# defin
e110: 65 20 53 43 52 49 50 54 5f 4c 41 54 49 4e 20 20  e SCRIPT_LATIN  
e120: 20 20 20 20 20 30 78 30 30 30 31 0a 23 20 64 65       0x0001.# de
e130: 66 69 6e 65 20 53 43 52 49 50 54 5f 43 59 52 49  fine SCRIPT_CYRI
e140: 4c 4c 49 43 20 20 20 20 30 78 30 30 30 32 0a 23  LLIC    0x0002.#
e150: 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f 47   define SCRIPT_G
e160: 52 45 45 4b 20 20 20 20 20 20 20 30 78 30 30 30  REEK       0x000
e170: 34 0a 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e  4..  while( nIn>
e180: 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66  0 ){.    c = utf
e190: 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20  8Read(zIn, nIn, 
e1a0: 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d  &sz);.    zIn +=
e1b0: 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20   sz;.    nIn -= 
e1c0: 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c 30 78  sz;.    if( c<0x
e1d0: 30 32 61 66 20 29 7b 0a 20 20 20 20 20 20 73 63  02af ){.      sc
e1e0: 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52 49  riptMask |= SCRI
e1f0: 50 54 5f 4c 41 54 49 4e 3b 0a 20 20 20 20 7d 65  PT_LATIN;.    }e
e200: 6c 73 65 20 69 66 28 20 63 3e 3d 30 78 30 34 30  lse if( c>=0x040
e210: 30 20 26 26 20 63 3c 3d 30 78 30 34 66 66 20 29  0 && c<=0x04ff )
e220: 7b 0a 20 20 20 20 20 20 73 63 72 69 70 74 4d 61  {.      scriptMa
e230: 73 6b 20 7c 3d 20 53 43 52 49 50 54 5f 43 59 52  sk |= SCRIPT_CYR
e240: 49 4c 4c 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65  ILLIC;.    }else
e250: 20 69 66 28 20 63 3e 3d 30 78 30 33 38 36 20 26   if( c>=0x0386 &
e260: 26 20 63 3c 3d 30 78 30 33 63 65 20 29 7b 0a 20  & c<=0x03ce ){. 
e270: 20 20 20 20 20 73 63 72 69 70 74 4d 61 73 6b 20       scriptMask 
e280: 7c 3d 20 53 43 52 49 50 54 5f 47 52 45 45 4b 3b  |= SCRIPT_GREEK;
e290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69  .    }.  }.  swi
e2a0: 74 63 68 28 20 73 63 72 69 70 74 4d 61 73 6b 20  tch( scriptMask 
e2b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 20 20  ){.    case 0:  
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
e2d0: 73 20 3d 20 39 39 39 3b 20 62 72 65 61 6b 3b 0a  s = 999; break;.
e2e0: 20 20 20 20 63 61 73 65 20 53 43 52 49 50 54 5f      case SCRIPT_
e2f0: 4c 41 54 49 4e 3a 20 20 20 20 20 72 65 73 20 3d  LATIN:     res =
e300: 20 32 31 35 3b 20 62 72 65 61 6b 3b 0a 20 20 20   215; break;.   
e310: 20 63 61 73 65 20 53 43 52 49 50 54 5f 43 59 52   case SCRIPT_CYR
e320: 49 4c 4c 49 43 3a 20 20 72 65 73 20 3d 20 32 32  ILLIC:  res = 22
e330: 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  0; break;.    ca
e340: 73 65 20 53 43 52 49 50 54 5f 47 52 45 45 4b 3a  se SCRIPT_GREEK:
e350: 20 20 20 20 20 72 65 73 20 3d 20 32 30 30 3b 20       res = 200; 
e360: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
e370: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  lt:             
e380: 20 20 72 65 73 20 3d 20 39 39 38 3b 20 62 72 65    res = 998; bre
e390: 61 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ak;.  }.  sqlite
e3a0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
e3b0: 74 65 78 74 2c 20 72 65 73 29 3b 0a 7d 0a 0a 2f  text, res);.}../
e3c0: 2a 20 45 6e 64 20 74 72 61 6e 73 6c 69 74 65 72  * End transliter
e3d0: 61 74 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ate.************
e3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e420: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
e430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e470: 2a 0a 2a 2a 20 42 65 67 69 6e 20 73 70 65 6c 6c  *.** Begin spell
e480: 66 69 78 31 20 76 69 72 74 75 61 6c 20 74 61 62  fix1 virtual tab
e490: 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 20 4d 61 78 69 6d  le..*/../* Maxim
e4a0: 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 70  um length of a p
e4b0: 68 6f 6e 65 68 61 73 68 20 75 73 65 64 20 66 6f  honehash used fo
e4c0: 72 20 71 75 65 72 79 69 6e 67 20 74 68 65 20 73  r querying the s
e4d0: 68 61 64 6f 77 20 74 61 62 6c 65 20 2a 2f 0a 23  hadow table */.#
e4e0: 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
e4f0: 4d 58 5f 48 41 53 48 20 20 38 0a 0a 2f 2a 20 4d  MX_HASH  8../* M
e500: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
e510: 20 68 61 73 68 20 73 74 72 69 6e 67 73 20 74 6f   hash strings to
e520: 20 65 78 61 6d 69 6e 65 20 70 65 72 20 71 75 65   examine per que
e530: 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  ry */.#define SP
e540: 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 20 20 20  ELLFIX_MX_RUN   
e550: 31 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  1..typedef struc
e560: 74 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62  t spellfix1_vtab
e570: 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 3b   spellfix1_vtab;
e580: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
e590: 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
e5a0: 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f   spellfix1_curso
e5b0: 72 3b 0a 0a 2f 2a 20 46 75 7a 7a 79 2d 73 65 61  r;../* Fuzzy-sea
e5c0: 72 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  rch virtual tabl
e5d0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75  e object */.stru
e5e0: 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  ct spellfix1_vta
e5f0: 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  b {.  sqlite3_vt
e600: 61 62 20 62 61 73 65 3b 20 20 20 20 20 20 20 20  ab base;        
e610: 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d   /* Base class -
e620: 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   must be first *
e630: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e650: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
e660: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ction */.  char 
e670: 2a 7a 44 62 4e 61 6d 65 3b 20 20 20 20 20 20 20  *zDbName;       
e680: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
e690: 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   database holdin
e6a0: 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  g this table */.
e6b0: 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61    char *zTableNa
e6c0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  me;          /* 
e6d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 72 74  Name of the virt
e6e0: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  ual table */.  c
e6f0: 68 61 72 20 2a 7a 43 6f 73 74 54 61 62 6c 65 3b  har *zCostTable;
e700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
e710: 6c 65 20 68 6f 6c 64 69 6e 67 20 65 64 69 74 2d  le holding edit-
e720: 64 69 73 74 61 6e 63 65 20 63 6f 73 74 20 6e 75  distance cost nu
e730: 6d 62 65 72 73 20 2a 2f 0a 20 20 45 64 69 74 44  mbers */.  EditD
e740: 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  ist3Config *pCon
e750: 66 69 67 33 3b 20 2f 2a 20 50 61 72 73 65 64 20  fig3; /* Parsed 
e760: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 63 6f  edit distance co
e770: 73 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 75  sts */.};../* Fu
e780: 7a 7a 79 2d 73 65 61 72 63 68 20 63 75 72 73 6f  zzy-search curso
e790: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 72 75  r object */.stru
e7a0: 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  ct spellfix1_cur
e7b0: 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
e7c0: 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
e7d0: 3b 20 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61  ;    /* Base cla
e7e0: 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72  ss - must be fir
e7f0: 73 74 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  st */.  spellfix
e800: 31 5f 76 74 61 62 20 2a 70 56 54 61 62 3b 20 20  1_vtab *pVTab;  
e810: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
e820: 65 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  e to which this 
e830: 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 2a  cursor belongs *
e840: 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 74 65  /.  char *zPatte
e850: 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rn;             
e860: 20 2f 2a 20 72 68 73 20 6f 66 20 4d 41 54 43 48   /* rhs of MATCH
e870: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
e880: 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20   nRow;          
e890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
e8a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 63  ber of rows of c
e8b0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
e8c0: 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
e8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e8e0: 65 72 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  er of allocated 
e8f0: 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rows */.  int iR
e900: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
e910: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
e920: 74 20 72 6f 77 20 6f 66 20 63 6f 6e 74 65 6e 74  t row of content
e930: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b   */.  int iLang;
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
e960: 68 65 20 6c 61 6e 67 69 64 3d 20 63 6f 6e 73 74  he langid= const
e970: 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  raint */.  int i
e980: 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
e990: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
e9a0: 20 6f 66 20 74 68 65 20 74 6f 70 3d 20 63 6f 6e   of the top= con
e9b0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  straint */.  int
e9c0: 20 69 53 63 6f 70 65 3b 20 20 20 20 20 20 20 20   iScope;        
e9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
e9e0: 75 65 20 6f 66 20 74 68 65 20 73 63 6f 70 65 3d  ue of the scope=
e9f0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20   constraint */. 
ea00: 20 69 6e 74 20 6e 53 65 61 72 63 68 3b 20 20 20   int nSearch;   
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea20: 20 4e 75 6d 62 65 72 20 6f 66 20 76 6f 63 61 62   Number of vocab
ea30: 75 6c 61 72 79 20 69 74 65 6d 73 20 63 68 65 63  ulary items chec
ea40: 6b 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ked */.  sqlite3
ea50: 5f 73 74 6d 74 20 2a 70 46 75 6c 6c 53 63 61 6e  _stmt *pFullScan
ea60: 3b 20 20 20 20 20 2f 2a 20 53 68 61 64 6f 77 20  ;     /* Shadow 
ea70: 71 75 65 72 79 20 66 6f 72 20 61 20 66 75 6c 6c  query for a full
ea80: 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20   table scan */. 
ea90: 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78   struct spellfix
eaa0: 31 5f 72 6f 77 20 7b 20 20 20 20 20 20 20 2f 2a  1_row {       /*
eab0: 20 46 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   For each row of
eac0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
ead0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
eae0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  owid;         /*
eaf0: 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   Rowid for this 
eb00: 72 6f 77 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  row */.    char 
eb10: 2a 7a 57 6f 72 64 3b 20 20 20 20 20 20 20 20 20  *zWord;         
eb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
eb30: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a 2f   for this row */
eb40: 0a 20 20 20 20 69 6e 74 20 69 52 61 6e 6b 3b 20  .    int iRank; 
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb60: 20 20 20 2f 2a 20 52 61 6e 6b 20 66 6f 72 20 74     /* Rank for t
eb70: 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  his row */.    i
eb80: 6e 74 20 69 44 69 73 74 61 6e 63 65 3b 20 20 20  nt iDistance;   
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eba0: 44 69 73 74 61 6e 63 65 20 66 72 6f 6d 20 70 61  Distance from pa
ebb0: 74 74 65 72 6e 20 66 6f 72 20 74 68 69 73 20 72  ttern for this r
ebc0: 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53  ow */.    int iS
ebd0: 63 6f 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  core;           
ebe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 6f 72 65          /* Score
ebf0: 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 2a 2f 0a   for sorting */.
ec00: 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c 65      int iMatchle
ec10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
ec20: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6d 61    /* Value of ma
ec30: 74 63 68 6c 65 6e 20 63 6f 6c 75 6d 6e 20 28 6f  tchlen column (o
ec40: 72 20 2d 31 29 20 2a 2f 0a 20 20 20 20 63 68 61  r -1) */.    cha
ec50: 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46 49 58  r zHash[SPELLFIX
ec60: 5f 4d 58 5f 48 41 53 48 5d 3b 20 2f 2a 20 74 68  _MX_HASH]; /* th
ec70: 65 20 70 68 6f 6e 65 68 61 73 68 20 75 73 65 64  e phonehash used
ec80: 20 66 6f 72 20 74 68 69 73 20 6d 61 74 63 68 20   for this match 
ec90: 2a 2f 0a 20 20 7d 20 2a 61 3b 20 0a 7d 3b 0a 0a  */.  } *a; .};..
eca0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
ecb0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 53 51 4c 20  one or more SQL 
ecc0: 73 74 61 74 65 6d 65 6e 74 73 20 66 72 6f 6d 20  statements from 
ecd0: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
ece0: 67 20 67 69 76 65 6e 0a 2a 2a 20 61 6e 64 20 74  g given.** and t
ecf0: 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 6f  hen evaluate tho
ed00: 73 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 54  se statements. T
ed10: 68 65 20 73 75 63 63 65 73 73 20 63 6f 64 65 20  he success code 
ed20: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
ed30: 74 6f 20 2a 70 52 63 2e 0a 2a 2a 0a 2a 2a 20 49  to *pRc..**.** I
ed40: 66 20 2a 70 52 63 20 69 73 20 69 6e 69 74 69 61  f *pRc is initia
ed50: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65  lly non-zero the
ed60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
ed70: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
ed80: 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c 66  atic void spellf
ed90: 69 78 31 44 62 45 78 65 63 28 0a 20 20 69 6e 74  ix1DbExec(.  int
eda0: 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
edb0: 20 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63      /* Success c
edc0: 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
edd0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
ede0: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77  /* Database in w
edf0: 68 69 63 68 20 74 6f 20 72 75 6e 20 53 51 4c 20  hich to run SQL 
ee00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
ee10: 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 2f 2a 20 46  *zFormat,   /* F
ee20: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 66 6f 72  ormat string for
ee30: 20 53 51 4c 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20   SQL */.  ...   
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
ee60: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
ee70: 6e 67 20 2a 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69  ng */.){.  va_li
ee80: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
ee90: 53 71 6c 3b 0a 20 20 69 66 28 20 2a 70 52 63 20  Sql;.  if( *pRc 
eea0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73  ) return;.  va_s
eeb0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
eec0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
eed0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
eee0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
eef0: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
ef00: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Sql==0 ){.    *p
ef10: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
ef20: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
ef30: 2a 70 52 63 20 3d 20 73 71 6c 69 74 65 33 5f 65  *pRc = sqlite3_e
ef40: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
ef50: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
ef60: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
ef70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 44 69    }.}../*.** xDi
ef80: 73 63 6f 6e 6e 65 63 74 2f 78 44 65 73 74 72 6f  sconnect/xDestro
ef90: 79 20 6d 65 74 68 6f 64 20 66 6f 72 20 74 68 65  y method for the
efa0: 20 66 75 7a 7a 79 2d 73 65 61 72 63 68 20 6d 6f   fuzzy-search mo
efb0: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
efc0: 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 55 6e 69  int spellfix1Uni
efd0: 6e 69 74 28 69 6e 74 20 69 73 44 65 73 74 72 6f  nit(int isDestro
efe0: 79 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  y, sqlite3_vtab 
eff0: 2a 70 56 54 61 62 29 7b 0a 20 20 73 70 65 6c 6c  *pVTab){.  spell
f000: 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d 20 28  fix1_vtab *p = (
f010: 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29  spellfix1_vtab*)
f020: 70 56 54 61 62 3b 0a 20 20 69 6e 74 20 72 63 20  pVTab;.  int rc 
f030: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
f040: 66 28 20 69 73 44 65 73 74 72 6f 79 20 29 7b 0a  f( isDestroy ){.
f050: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
f060: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 70 65  = p->db;.    spe
f070: 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63  llfix1DbExec(&rc
f080: 2c 20 64 62 2c 20 22 44 52 4f 50 20 54 41 42 4c  , db, "DROP TABL
f090: 45 20 49 46 20 45 58 49 53 54 53 20 5c 22 25 77  E IF EXISTS \"%w
f0a0: 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 22  \".\"%w_vocab\""
f0b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f0c0: 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20      p->zDbName, 
f0d0: 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 29 3b 0a  p->zTableName);.
f0e0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
f0f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
f100: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
f110: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20  TableName);.    
f120: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44  editDist3ConfigD
f130: 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69 67  elete(p->pConfig
f140: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  3);.    sqlite3_
f150: 66 72 65 65 28 70 2d 3e 7a 43 6f 73 74 54 61 62  free(p->zCostTab
f160: 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  le);.    sqlite3
f170: 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20  _free(p);.  }.  
f180: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
f190: 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
f1a0: 31 44 69 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69  1Disconnect(sqli
f1b0: 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62 29  te3_vtab *pVTab)
f1c0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c  {.  return spell
f1d0: 66 69 78 31 55 6e 69 6e 69 74 28 30 2c 20 70 56  fix1Uninit(0, pV
f1e0: 54 61 62 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Tab);.}.static i
f1f0: 6e 74 20 73 70 65 6c 6c 66 69 78 31 44 65 73 74  nt spellfix1Dest
f200: 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 74 61 62  roy(sqlite3_vtab
f210: 20 2a 70 56 54 61 62 29 7b 0a 20 20 72 65 74 75   *pVTab){.  retu
f220: 72 6e 20 73 70 65 6c 6c 66 69 78 31 55 6e 69 6e  rn spellfix1Unin
f230: 69 74 28 31 2c 20 70 56 54 61 62 29 3b 0a 7d 0a  it(1, pVTab);.}.
f240: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 63 6f  ./*.** Make a co
f250: 70 79 20 6f 66 20 61 20 73 74 72 69 6e 67 2e 20  py of a string. 
f260: 20 52 65 6d 6f 76 65 20 6c 65 61 64 69 6e 67 20   Remove leading 
f270: 61 6e 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69  and trailing whi
f280: 74 65 73 70 61 63 65 0a 2a 2a 20 61 6e 64 20 64  tespace.** and d
f290: 65 71 75 6f 74 65 20 69 74 2e 0a 2a 2f 0a 73 74  equote it..*/.st
f2a0: 61 74 69 63 20 63 68 61 72 20 2a 73 70 65 6c 6c  atic char *spell
f2b0: 66 69 78 31 44 65 71 75 6f 74 65 28 63 6f 6e 73  fix1Dequote(cons
f2c0: 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b 0a 20 20  t char *zIn){.  
f2d0: 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e  char *zOut;.  in
f2e0: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
f2f0: 3b 0a 20 20 77 68 69 6c 65 28 20 69 73 73 70 61  ;.  while( isspa
f300: 63 65 28 7a 49 6e 5b 30 5d 29 20 29 20 7a 49 6e  ce(zIn[0]) ) zIn
f310: 2b 2b 3b 0a 20 20 7a 4f 75 74 20 3d 20 73 71 6c  ++;.  zOut = sql
f320: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
f330: 22 2c 20 7a 49 6e 29 3b 0a 20 20 69 66 28 20 7a  ", zIn);.  if( z
f340: 4f 75 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Out==0 ) return 
f350: 30 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29 73 74  0;.  i = (int)st
f360: 72 6c 65 6e 28 7a 4f 75 74 29 3b 0a 23 69 66 20  rlen(zOut);.#if 
f370: 30 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72  0  /* The parser
f380: 20 77 69 6c 6c 20 6e 65 76 65 72 20 6c 65 61 76   will never leav
f390: 65 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20  e spaces at the 
f3a0: 65 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  end */.  while( 
f3b0: 69 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 7a  i>0 && isspace(z
f3c0: 4f 75 74 5b 69 2d 31 5d 29 20 29 7b 20 69 2d 2d  Out[i-1]) ){ i--
f3d0: 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 4f 75  ; }.#endif.  zOu
f3e0: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 63 20 3d 20  t[i] = 0;.  c = 
f3f0: 7a 4f 75 74 5b 30 5d 3b 0a 20 20 69 66 28 20 63  zOut[0];.  if( c
f400: 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27  =='\'' || c=='"'
f410: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c   ){.    for(i=1,
f420: 20 6a 3d 30 3b 20 41 4c 57 41 59 53 28 7a 4f 75   j=0; ALWAYS(zOu
f430: 74 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[i]); i++){.   
f440: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 7a     zOut[j++] = z
f450: 4f 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Out[i];.      if
f460: 28 20 7a 4f 75 74 5b 69 5d 3d 3d 63 20 29 7b 0a  ( zOut[i]==c ){.
f470: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74          if( zOut
f480: 5b 69 2b 31 5d 3d 3d 63 20 29 7b 0a 20 20 20 20  [i+1]==c ){.    
f490: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
f4a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f4b0: 20 20 20 20 7a 4f 75 74 5b 6a 2d 31 5d 20 3d 20      zOut[j-1] = 
f4c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
f4d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
f4e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f4f0: 20 20 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d    return zOut;.}
f500: 0a 0a 0a 2f 2a 0a 2a 2a 20 78 43 6f 6e 6e 65 63  .../*.** xConnec
f510: 74 2f 78 43 72 65 61 74 65 20 6d 65 74 68 6f 64  t/xCreate method
f520: 20 66 6f 72 20 74 68 65 20 73 70 65 6c 6c 66 69   for the spellfi
f530: 78 31 20 6d 6f 64 75 6c 65 2e 20 41 72 67 75 6d  x1 module. Argum
f540: 65 6e 74 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ents are:.**.** 
f550: 20 20 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d    argv[0]   -> m
f560: 6f 64 75 6c 65 20 6e 61 6d 65 20 20 28 22 73 70  odule name  ("sp
f570: 65 6c 6c 66 69 78 31 22 29 0a 2a 2a 20 20 20 61  ellfix1").**   a
f580: 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74 61  rgv[1]   -> data
f590: 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61  base name.**   a
f5a0: 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62 6c  rgv[2]   -> tabl
f5b0: 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76  e name.**   argv
f5c0: 5b 33 5d 2e 2e 20 2d 3e 20 6f 70 74 69 6f 6e 61  [3].. -> optiona
f5d0: 6c 20 61 72 67 75 6d 65 6e 74 73 20 28 69 2e 65  l arguments (i.e
f5e0: 2e 20 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62  . "edit_cost_tab
f5f0: 6c 65 22 20 70 61 72 61 6d 65 74 65 72 29 0a 2a  le" parameter).*
f600: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65  /.static int spe
f610: 6c 6c 66 69 78 31 49 6e 69 74 28 0a 20 20 69 6e  llfix1Init(.  in
f620: 74 20 69 73 43 72 65 61 74 65 2c 0a 20 20 73 71  t isCreate,.  sq
f630: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
f640: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
f650: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
f660: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
f670: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
f680: 56 54 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  VTab,.  char **p
f690: 7a 45 72 72 0a 29 7b 0a 20 20 73 70 65 6c 6c 66  zErr.){.  spellf
f6a0: 69 78 31 5f 76 74 61 62 20 2a 70 4e 65 77 20 3d  ix1_vtab *pNew =
f6b0: 20 30 3b 0a 20 20 2f 2a 20 63 6f 6e 73 74 20 63   0;.  /* const c
f6c0: 68 61 72 20 2a 7a 4d 6f 64 75 6c 65 20 3d 20 61  har *zModule = a
f6d0: 72 67 76 5b 30 5d 3b 20 2f 2f 20 6e 6f 74 20 75  rgv[0]; // not u
f6e0: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
f6f0: 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 61  har *zDbName = a
f700: 72 67 76 5b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20  rgv[1];.  const 
f710: 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65  char *zTableName
f720: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e   = argv[2];.  in
f730: 74 20 6e 44 62 4e 61 6d 65 3b 0a 20 20 69 6e 74  t nDbName;.  int
f740: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f750: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 44 62  .  int i;..  nDb
f760: 4e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  Name = (int)strl
f770: 65 6e 28 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 70  en(zDbName);.  p
f780: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  New = sqlite3_ma
f790: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
f7a0: 65 77 29 20 2b 20 6e 44 62 4e 61 6d 65 20 2b 20  ew) + nDbName + 
f7b0: 31 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  1);.  if( pNew==
f7c0: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
f7d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
f7e0: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
f7f0: 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
f800: 2a 70 4e 65 77 29 29 3b 0a 20 20 20 20 70 4e 65  *pNew));.    pNe
f810: 77 2d 3e 7a 44 62 4e 61 6d 65 20 3d 20 28 63 68  w->zDbName = (ch
f820: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
f830: 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a    memcpy(pNew->z
f840: 44 62 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 2c  DbName, zDbName,
f850: 20 6e 44 62 4e 61 6d 65 2b 31 29 3b 0a 20 20 20   nDbName+1);.   
f860: 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e 61 6d   pNew->zTableNam
f870: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
f880: 6e 74 66 28 22 25 73 22 2c 20 7a 54 61 62 6c 65  ntf("%s", zTable
f890: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Name);.    pNew-
f8a0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 69 66  >db = db;.    if
f8b0: 28 20 70 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e 61  ( pNew->zTableNa
f8c0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
f8d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f8e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f8f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
f900: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c  declare_vtab(db,
f910: 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 43 52   .           "CR
f920: 45 41 54 45 20 54 41 42 4c 45 20 78 28 77 6f 72  EATE TABLE x(wor
f930: 64 2c 72 61 6e 6b 2c 64 69 73 74 61 6e 63 65 2c  d,rank,distance,
f940: 6c 61 6e 67 69 64 2c 20 22 0a 20 20 20 20 20 20  langid, ".      
f950: 20 20 20 20 20 22 73 63 6f 72 65 2c 20 6d 61 74       "score, mat
f960: 63 68 6c 65 6e 2c 20 70 68 6f 6e 65 68 61 73 68  chlen, phonehash
f970: 20 48 49 44 44 45 4e 2c 20 22 0a 20 20 20 20 20   HIDDEN, ".     
f980: 20 20 20 20 20 20 22 74 6f 70 20 48 49 44 44 45        "top HIDDE
f990: 4e 2c 20 73 63 6f 70 65 20 48 49 44 44 45 4e 2c  N, scope HIDDEN,
f9a0: 20 73 72 63 68 63 6e 74 20 48 49 44 44 45 4e 2c   srchcnt HIDDEN,
f9b0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 73   ".           "s
f9c0: 6f 75 6e 64 73 6c 69 6b 65 20 48 49 44 44 45 4e  oundslike HIDDEN
f9d0: 2c 20 63 6f 6d 6d 61 6e 64 20 48 49 44 44 45 4e  , command HIDDEN
f9e0: 29 22 0a 20 20 20 20 20 20 29 3b 0a 23 64 65 66  )".      );.#def
f9f0: 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
fa00: 5f 57 4f 52 44 20 20 20 20 20 20 20 20 20 20 20  _WORD           
fa10: 20 30 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c   0.#define SPELL
fa20: 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b 20 20 20 20  FIX_COL_RANK    
fa30: 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e          1.#defin
fa40: 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44  e SPELLFIX_COL_D
fa50: 49 53 54 41 4e 43 45 20 20 20 20 20 20 20 20 32  ISTANCE        2
fa60: 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
fa70: 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20 20 20 20  X_COL_LANGID    
fa80: 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20        3.#define 
fa90: 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f  SPELLFIX_COL_SCO
faa0: 52 45 20 20 20 20 20 20 20 20 20 20 20 34 0a 23  RE           4.#
fab0: 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
fac0: 43 4f 4c 5f 4d 41 54 43 48 4c 45 4e 20 20 20 20  COL_MATCHLEN    
fad0: 20 20 20 20 35 0a 23 64 65 66 69 6e 65 20 53 50      5.#define SP
fae0: 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e 45  ELLFIX_COL_PHONE
faf0: 48 41 53 48 20 20 20 20 20 20 20 36 0a 23 64 65  HASH       6.#de
fb00: 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  fine SPELLFIX_CO
fb10: 4c 5f 54 4f 50 20 20 20 20 20 20 20 20 20 20 20  L_TOP           
fb20: 20 20 37 0a 23 64 65 66 69 6e 65 20 53 50 45 4c    7.#define SPEL
fb30: 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45 20 20  LFIX_COL_SCOPE  
fb40: 20 20 20 20 20 20 20 20 20 38 0a 23 64 65 66 69           8.#defi
fb50: 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  ne SPELLFIX_COL_
fb60: 53 52 43 48 43 4e 54 20 20 20 20 20 20 20 20 20  SRCHCNT         
fb70: 39 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46  9.#define SPELLF
fb80: 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b  IX_COL_SOUNDSLIK
fb90: 45 20 20 20 20 20 31 30 0a 23 64 65 66 69 6e 65  E     10.#define
fba0: 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43 4f   SPELLFIX_COL_CO
fbb0: 4d 4d 41 4e 44 20 20 20 20 20 20 20 20 31 31 0a  MMAND        11.
fbc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
fbd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
fbe0: 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 20  sCreate ){.     
fbf0: 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63   spellfix1DbExec
fc00: 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20  (&rc, db,.      
fc10: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
fc20: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 5c   IF NOT EXISTS \
fc30: 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62  "%w\".\"%w_vocab
fc40: 5c 22 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  \"(\n".         
fc50: 22 20 20 69 64 20 49 4e 54 45 47 45 52 20 50 52  "  id INTEGER PR
fc60: 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20  IMARY KEY,\n".  
fc70: 20 20 20 20 20 20 20 22 20 20 72 61 6e 6b 20 49         "  rank I
fc80: 4e 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  NT,\n".         
fc90: 22 20 20 6c 61 6e 67 69 64 20 49 4e 54 2c 5c 6e  "  langid INT,\n
fca0: 22 0a 20 20 20 20 20 20 20 20 20 22 20 20 77 6f  ".         "  wo
fcb0: 72 64 20 54 45 58 54 2c 5c 6e 22 0a 20 20 20 20  rd TEXT,\n".    
fcc0: 20 20 20 20 20 22 20 20 6b 31 20 54 45 58 54 2c       "  k1 TEXT,
fcd0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
fce0: 6b 32 20 54 45 58 54 5c 6e 22 0a 20 20 20 20 20  k2 TEXT\n".     
fcf0: 20 20 20 20 22 29 3b 5c 6e 22 2c 0a 20 20 20 20      ");\n",.    
fd00: 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54       zDbName, zT
fd10: 61 62 6c 65 4e 61 6d 65 0a 20 20 20 20 20 20 29  ableName.      )
fd20: 3b 0a 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78  ;.      spellfix
fd30: 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c  1DbExec(&rc, db,
fd40: 0a 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  .         "CREAT
fd50: 45 20 49 4e 44 45 58 20 49 46 20 4e 4f 54 20 45  E INDEX IF NOT E
fd60: 58 49 53 54 53 20 5c 22 25 77 5c 22 2e 5c 22 25  XISTS \"%w\".\"%
fd70: 77 5f 76 6f 63 61 62 5f 69 6e 64 65 78 5f 6c 61  w_vocab_index_la
fd80: 6e 67 69 64 5f 6b 32 5c 22 20 22 0a 20 20 20 20  ngid_k2\" ".    
fd90: 20 20 20 20 20 20 20 20 22 4f 4e 20 5c 22 25 77          "ON \"%w
fda0: 5f 76 6f 63 61 62 5c 22 28 6c 61 6e 67 69 64 2c  _vocab\"(langid,
fdb0: 6b 32 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20  k2);",.         
fdc0: 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 6c 65 4e  zDbName, zTableN
fdd0: 61 6d 65 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 0a  ame, zTableName.
fde0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
fdf0: 20 20 20 66 6f 72 28 69 3d 33 3b 20 72 63 3d 3d     for(i=3; rc==
fe00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 61  SQLITE_OK && i<a
fe10: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
fe20: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 72 67   if( strncmp(arg
fe30: 76 5b 69 5d 2c 22 65 64 69 74 5f 63 6f 73 74 5f  v[i],"edit_cost_
fe40: 74 61 62 6c 65 3d 22 2c 31 36 29 3d 3d 30 20 26  table=",16)==0 &
fe50: 26 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62  & pNew->zCostTab
fe60: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
fe70: 20 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62 6c   pNew->zCostTabl
fe80: 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 44 65 71  e = spellfix1Deq
fe90: 75 6f 74 65 28 26 61 72 67 76 5b 69 5d 5b 31 36  uote(&argv[i][16
fea0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
feb0: 70 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62 6c 65  pNew->zCostTable
fec0: 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
fed0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
fee0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
fef0: 20 7d 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20   }.      *pzErr 
ff00: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
ff10: 66 28 22 62 61 64 20 61 72 67 75 6d 65 6e 74 20  f("bad argument 
ff20: 74 6f 20 73 70 65 6c 6c 66 69 78 31 28 29 3a 20  to spellfix1(): 
ff30: 5c 22 25 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d  \"%s\"", argv[i]
ff40: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
ff50: 4c 49 54 45 5f 45 52 52 4f 52 3b 20 0a 20 20 20  LITE_ERROR; .   
ff60: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
ff70: 20 26 26 20 70 4e 65 77 20 29 7b 0a 20 20 20 20   && pNew ){.    
ff80: 2a 70 70 56 54 61 62 20 3d 20 30 3b 0a 20 20 20  *ppVTab = 0;.   
ff90: 20 73 70 65 6c 6c 66 69 78 31 55 6e 69 6e 69 74   spellfix1Uninit
ffa0: 28 30 2c 20 26 70 4e 65 77 2d 3e 62 61 73 65 29  (0, &pNew->base)
ffb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
ffc0: 70 70 56 54 61 62 20 3d 20 28 73 71 6c 69 74 65  ppVTab = (sqlite
ffd0: 33 5f 76 74 61 62 20 2a 29 70 4e 65 77 3b 0a 20  3_vtab *)pNew;. 
ffe0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
fff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 43 6f  }../*.** The xCo
10000 6e 6e 65 63 74 20 61 6e 64 20 78 43 72 65 61 74  nnect and xCreat
10010 65 20 6d 65 74 68 6f 64 73 0a 2a 2f 0a 73 74 61  e methods.*/.sta
10020 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
10030 31 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69  1Connect(.  sqli
10040 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
10050 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67  *pAux,.  int arg
10060 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  c, const char *c
10070 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c  onst*argv,.  sql
10080 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 54  ite3_vtab **ppVT
10090 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  ab,.  char **pzE
100a0 72 72 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  rr.){.  return s
100b0 70 65 6c 6c 66 69 78 31 49 6e 69 74 28 30 2c 20  pellfix1Init(0, 
100c0 64 62 2c 20 70 41 75 78 2c 20 61 72 67 63 2c 20  db, pAux, argc, 
100d0 61 72 67 76 2c 20 70 70 56 54 61 62 2c 20 70 7a  argv, ppVTab, pz
100e0 45 72 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  Err);.}.static i
100f0 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 72 65 61  nt spellfix1Crea
10100 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
10110 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c  b,.  void *pAux,
10120 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e  .  int argc, con
10130 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61  st char *const*a
10140 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgv,.  sqlite3_v
10150 74 61 62 20 2a 2a 70 70 56 54 61 62 2c 0a 20 20  tab **ppVTab,.  
10160 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
10170 20 20 72 65 74 75 72 6e 20 73 70 65 6c 6c 66 69    return spellfi
10180 78 31 49 6e 69 74 28 31 2c 20 64 62 2c 20 70 41  x1Init(1, db, pA
10190 75 78 2c 20 61 72 67 63 2c 20 61 72 67 76 2c 20  ux, argc, argv, 
101a0 70 70 56 54 61 62 2c 20 70 7a 45 72 72 29 3b 0a  ppVTab, pzErr);.
101b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  }../*.** Clear a
101c0 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  ll of the conten
101d0 74 20 66 72 6f 6d 20 61 20 63 75 72 73 6f 72 2e  t from a cursor.
101e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
101f0 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43 75  spellfix1ResetCu
10200 72 73 6f 72 28 73 70 65 6c 6c 66 69 78 31 5f 63  rsor(spellfix1_c
10210 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
10220 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
10230 3b 20 69 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20  ; i<pCur->nRow; 
10240 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
10250 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 5b 69  3_free(pCur->a[i
10260 5d 2e 7a 57 6f 72 64 29 3b 0a 20 20 7d 0a 20 20  ].zWord);.  }.  
10270 70 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a  pCur->nRow = 0;.
10280 20 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30    pCur->iRow = 0
10290 3b 0a 20 20 70 43 75 72 2d 3e 6e 53 65 61 72 63  ;.  pCur->nSearc
102a0 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  h = 0;.  if( pCu
102b0 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b 0a  r->pFullScan ){.
102c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
102d0 6c 69 7a 65 28 70 43 75 72 2d 3e 70 46 75 6c 6c  lize(pCur->pFull
102e0 53 63 61 6e 29 3b 0a 20 20 20 20 70 43 75 72 2d  Scan);.    pCur-
102f0 3e 70 46 75 6c 6c 53 63 61 6e 20 3d 20 30 3b 0a  >pFullScan = 0;.
10300 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
10310 69 7a 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ize the cursor t
10320 6f 20 68 6f 6c 64 20 75 70 20 74 6f 20 4e 20 72  o hold up to N r
10330 6f 77 73 20 6f 66 20 63 6f 6e 74 65 6e 74 0a 2a  ows of content.*
10340 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 70  /.static void sp
10350 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75 72  ellfix1ResizeCur
10360 73 6f 72 28 73 70 65 6c 6c 66 69 78 31 5f 63 75  sor(spellfix1_cu
10370 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
10380 4e 29 7b 0a 20 20 73 74 72 75 63 74 20 73 70 65  N){.  struct spe
10390 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 61 4e 65 77  llfix1_row *aNew
103a0 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 70  ;.  assert( N>=p
103b0 43 75 72 2d 3e 6e 52 6f 77 20 29 3b 0a 20 20 61  Cur->nRow );.  a
103c0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
103d0 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 61 2c 20 73  alloc(pCur->a, s
103e0 69 7a 65 6f 66 28 70 43 75 72 2d 3e 61 5b 30 5d  izeof(pCur->a[0]
103f0 29 2a 4e 29 3b 0a 20 20 69 66 28 20 61 4e 65 77  )*N);.  if( aNew
10400 3d 3d 30 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20  ==0 && N>0 ){.  
10410 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74    spellfix1Reset
10420 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
10430 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10440 43 75 72 2d 3e 61 29 3b 0a 20 20 20 20 70 43 75  Cur->a);.    pCu
10450 72 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  r->nAlloc = 0;. 
10460 20 20 20 70 43 75 72 2d 3e 61 20 3d 20 30 3b 0a     pCur->a = 0;.
10470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
10480 72 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 4e 3b 0a 20  r->nAlloc = N;. 
10490 20 20 20 70 43 75 72 2d 3e 61 20 3d 20 61 4e 65     pCur->a = aNe
104a0 77 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  w;.  }.}.../*.**
104b0 20 43 6c 6f 73 65 20 61 20 66 75 7a 7a 79 2d 73   Close a fuzzy-s
104c0 65 61 72 63 68 20 63 75 72 73 6f 72 2e 0a 2a 2f  earch cursor..*/
104d0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
104e0 6c 66 69 78 31 43 6c 6f 73 65 28 73 71 6c 69 74  lfix1Close(sqlit
104f0 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
10500 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  cur){.  spellfix
10510 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  1_cursor *pCur =
10520 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73   (spellfix1_curs
10530 6f 72 20 2a 29 63 75 72 3b 0a 20 20 73 70 65 6c  or *)cur;.  spel
10540 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f 72  lfix1ResetCursor
10550 28 70 43 75 72 29 3b 0a 20 20 73 70 65 6c 6c 66  (pCur);.  spellf
10560 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28  ix1ResizeCursor(
10570 70 43 75 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69  pCur, 0);.  sqli
10580 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 7a  te3_free(pCur->z
10590 50 61 74 74 65 72 6e 29 3b 0a 20 20 73 71 6c 69  Pattern);.  sqli
105a0 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a  te3_free(pCur);.
105b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
105c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  OK;.}../*.** Sea
105d0 72 63 68 20 66 6f 72 20 74 65 72 6d 73 20 6f 66  rch for terms of
105e0 20 74 68 65 73 65 20 66 6f 72 6d 73 3a 0a 2a 2a   these forms:.**
105f0 0a 2a 2a 20 20 20 28 41 29 20 20 20 20 77 6f 72  .**   (A)    wor
10600 64 20 4d 41 54 43 48 20 24 73 74 72 0a 2a 2a 20  d MATCH $str.** 
10610 20 20 28 42 29 20 20 20 20 6c 61 6e 67 69 64 20    (B)    langid 
10620 3d 3d 20 24 6c 61 6e 67 69 64 0a 2a 2a 20 20 20  == $langid.**   
10630 28 43 29 20 20 20 20 74 6f 70 20 3d 20 24 74 6f  (C)    top = $to
10640 70 0a 2a 2a 20 20 20 28 44 29 20 20 20 20 73 63  p.**   (D)    sc
10650 6f 70 65 20 3d 20 24 73 63 6f 70 65 0a 2a 2a 20  ope = $scope.** 
10660 20 20 28 45 29 20 20 20 20 64 69 73 74 61 6e 63    (E)    distanc
10670 65 20 3c 20 24 64 69 73 74 61 6e 63 65 0a 2a 2a  e < $distance.**
10680 20 20 20 28 46 29 20 20 20 20 64 69 73 74 61 6e     (F)    distan
10690 63 65 20 3c 3d 20 24 64 69 73 74 61 6e 63 65 0a  ce <= $distance.
106a0 2a 2a 20 20 20 28 47 29 20 20 20 20 72 6f 77 69  **   (G)    rowi
106b0 64 20 3d 20 24 72 6f 77 69 64 0a 2a 2a 0a 2a 2a  d = $rowid.**.**
106c0 20 54 68 65 20 70 6c 61 6e 20 6e 75 6d 62 65 72   The plan number
106d0 20 69 73 20 61 20 62 69 74 20 6d 61 73 6b 20 66   is a bit mask f
106e0 6f 72 6d 65 64 20 77 69 74 68 20 74 68 65 73 65  ormed with these
106f0 20 62 69 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30   bits:.**.**   0
10700 78 30 31 20 20 20 28 41 29 20 69 73 20 66 6f 75  x01   (A) is fou
10710 6e 64 0a 2a 2a 20 20 20 30 78 30 32 20 20 20 28  nd.**   0x02   (
10720 42 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a 20 20  B) is found.**  
10730 20 30 78 30 34 20 20 20 28 43 29 20 69 73 20 66   0x04   (C) is f
10740 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 30 38 20 20  ound.**   0x08  
10750 20 28 44 29 20 69 73 20 66 6f 75 6e 64 0a 2a 2a   (D) is found.**
10760 20 20 20 30 78 31 30 20 20 20 28 45 29 20 69 73     0x10   (E) is
10770 20 66 6f 75 6e 64 0a 2a 2a 20 20 20 30 78 32 30   found.**   0x20
10780 20 20 20 28 46 29 20 69 73 20 66 6f 75 6e 64 0a     (F) is found.
10790 2a 2a 20 20 20 30 78 34 30 20 20 20 28 47 29 20  **   0x40   (G) 
107a0 69 73 20 66 6f 75 6e 64 0a 2a 2a 0a 2a 2a 20 66  is found.**.** f
107b0 69 6c 74 65 72 2e 61 72 67 76 5b 2a 5d 20 76 61  ilter.argv[*] va
107c0 6c 75 65 73 20 63 6f 6e 74 61 69 6e 73 20 24 73  lues contains $s
107d0 74 72 2c 20 24 6c 61 6e 67 69 64 2c 20 24 74 6f  tr, $langid, $to
107e0 70 2c 20 24 73 63 6f 70 65 20 61 6e 64 20 24 72  p, $scope and $r
107f0 6f 77 69 64 0a 2a 2a 20 69 66 20 73 70 65 63 69  owid.** if speci
10800 66 69 65 64 20 61 6e 64 20 69 6e 20 74 68 61 74  fied and in that
10810 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
10820 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 42  c int spellfix1B
10830 65 73 74 49 6e 64 65 78 28 73 71 6c 69 74 65 33  estIndex(sqlite3
10840 5f 76 74 61 62 20 2a 74 61 62 2c 20 73 71 6c 69  _vtab *tab, sqli
10850 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
10860 70 49 64 78 49 6e 66 6f 29 7b 0a 20 20 69 6e 74  pIdxInfo){.  int
10870 20 69 50 6c 61 6e 20 3d 20 30 3b 0a 20 20 69 6e   iPlan = 0;.  in
10880 74 20 69 4c 61 6e 67 54 65 72 6d 20 3d 20 2d 31  t iLangTerm = -1
10890 3b 0a 20 20 69 6e 74 20 69 54 6f 70 54 65 72 6d  ;.  int iTopTerm
108a0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69 53 63   = -1;.  int iSc
108b0 6f 70 65 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20  opeTerm = -1;.  
108c0 69 6e 74 20 69 44 69 73 74 54 65 72 6d 20 3d 20  int iDistTerm = 
108d0 2d 31 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64  -1;.  int iRowid
108e0 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  Term = -1;.  int
108f0 20 69 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75   i;.  const stru
10900 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
10910 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  _constraint *pCo
10920 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 43 6f 6e  nstraint;.  pCon
10930 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
10940 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
10950 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
10960 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
10970 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74  int; i++, pConst
10980 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66  raint++){.    if
10990 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75  ( pConstraint->u
109a0 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69  sable==0 ) conti
109b0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 54 65 72  nue;..    /* Ter
109c0 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ms of the form: 
109d0 20 77 6f 72 64 20 4d 41 54 43 48 20 24 73 74 72   word MATCH $str
109e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c   */.    if( (iPl
109f0 61 6e 20 26 20 31 29 3d 3d 30 20 0a 20 20 20 20  an & 1)==0 .    
10a00 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
10a10 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46  >iColumn==SPELLF
10a20 49 58 5f 43 4f 4c 5f 57 4f 52 44 0a 20 20 20 20  IX_COL_WORD.    
10a30 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d   && pConstraint-
10a40 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
10a50 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
10a60 43 48 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  CH.    ){.      
10a70 69 50 6c 61 6e 20 7c 3d 20 31 3b 0a 20 20 20 20  iPlan |= 1;.    
10a80 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
10a90 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
10aa0 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20  argvIndex = 1;. 
10ab0 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61       pIdxInfo->a
10ac0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
10ad0 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20  i].omit = 1;.   
10ae0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73   }..    /* Terms
10af0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 6c   of the form:  l
10b00 61 6e 67 69 64 20 3d 20 24 6c 61 6e 67 69 64 20  angid = $langid 
10b10 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c   */.    if( (iPl
10b20 61 6e 20 26 20 32 29 3d 3d 30 0a 20 20 20 20 20  an & 2)==0.     
10b30 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
10b40 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49  iColumn==SPELLFI
10b50 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 0a 20 20 20  X_COL_LANGID.   
10b60 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
10b70 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
10b80 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
10b90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50  .    ){.      iP
10ba0 6c 61 6e 20 7c 3d 20 32 3b 0a 20 20 20 20 20 20  lan |= 2;.      
10bb0 69 4c 61 6e 67 54 65 72 6d 20 3d 20 69 3b 0a 20  iLangTerm = i;. 
10bc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72     }..    /* Ter
10bd0 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ms of the form: 
10be0 20 74 6f 70 20 3d 20 24 74 6f 70 20 2a 2f 0a 20   top = $top */. 
10bf0 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
10c00 34 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43  4)==0.     && pC
10c10 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
10c20 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  mn==SPELLFIX_COL
10c30 5f 54 4f 50 0a 20 20 20 20 20 26 26 20 70 43 6f  _TOP.     && pCo
10c40 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51  nstraint->op==SQ
10c50 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
10c60 52 41 49 4e 54 5f 45 51 0a 20 20 20 20 29 7b 0a  RAINT_EQ.    ){.
10c70 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 34        iPlan |= 4
10c80 3b 0a 20 20 20 20 20 20 69 54 6f 70 54 65 72 6d  ;.      iTopTerm
10c90 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = i;.    }..   
10ca0 20 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65   /* Terms of the
10cb0 20 66 6f 72 6d 3a 20 20 73 63 6f 70 65 20 3d 20   form:  scope = 
10cc0 24 73 63 6f 70 65 20 2a 2f 0a 20 20 20 20 69 66  $scope */.    if
10cd0 28 20 28 69 50 6c 61 6e 20 26 20 38 29 3d 3d 30  ( (iPlan & 8)==0
10ce0 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74 72  .     && pConstr
10cf0 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53  aint->iColumn==S
10d00 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50  PELLFIX_COL_SCOP
10d10 45 0a 20 20 20 20 20 26 26 20 70 43 6f 6e 73 74  E.     && pConst
10d20 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54  raint->op==SQLIT
10d30 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10d40 4e 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20 20 20  NT_EQ.    ){.   
10d50 20 20 20 69 50 6c 61 6e 20 7c 3d 20 38 3b 0a 20     iPlan |= 8;. 
10d60 20 20 20 20 20 69 53 63 6f 70 65 54 65 72 6d 20       iScopeTerm 
10d70 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = i;.    }..    
10d80 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  /* Terms of the 
10d90 66 6f 72 6d 3a 20 20 64 69 73 74 61 6e 63 65 20  form:  distance 
10da0 3c 20 24 64 69 73 74 20 6f 72 20 64 69 73 74 61  < $dist or dista
10db0 6e 63 65 20 3c 3d 20 24 64 69 73 74 20 2a 2f 0a  nce <= $dist */.
10dc0 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26      if( (iPlan &
10dd0 20 28 31 36 7c 33 32 29 29 3d 3d 30 0a 20 20 20   (16|32))==0.   
10de0 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74    && pConstraint
10df0 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c  ->iColumn==SPELL
10e00 46 49 58 5f 43 4f 4c 5f 44 49 53 54 41 4e 43 45  FIX_COL_DISTANCE
10e10 0a 20 20 20 20 20 26 26 20 28 70 43 6f 6e 73 74  .     && (pConst
10e20 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54  raint->op==SQLIT
10e30 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
10e40 4e 54 5f 4c 54 0a 20 20 20 20 20 20 20 20 20 20  NT_LT.          
10e50 7c 7c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  || pConstraint->
10e60 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
10e70 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 29 0a  _CONSTRAINT_LE).
10e80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c      ){.      iPl
10e90 61 6e 20 7c 3d 20 70 43 6f 6e 73 74 72 61 69 6e  an |= pConstrain
10ea0 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t->op==SQLITE_IN
10eb0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
10ec0 54 20 3f 20 31 36 20 3a 20 33 32 3b 0a 20 20 20  T ? 16 : 32;.   
10ed0 20 20 20 69 44 69 73 74 54 65 72 6d 20 3d 20 69     iDistTerm = i
10ee0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10ef0 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  Terms of the for
10f00 6d 3a 20 20 64 69 73 74 61 6e 63 65 20 3c 20 24  m:  distance < $
10f10 64 69 73 74 20 6f 72 20 64 69 73 74 61 6e 63 65  dist or distance
10f20 20 3c 3d 20 24 64 69 73 74 20 2a 2f 0a 20 20 20   <= $dist */.   
10f30 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20 36 34   if( (iPlan & 64
10f40 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43 6f  )==0.     && pCo
10f50 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d  nstraint->iColum
10f60 6e 3c 30 0a 20 20 20 20 20 26 26 20 70 43 6f 6e  n<0.     && pCon
10f70 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c  straint->op==SQL
10f80 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
10f90 41 49 4e 54 5f 45 51 0a 20 20 20 20 29 7b 0a 20  AINT_EQ.    ){. 
10fa0 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20 36 34       iPlan |= 64
10fb0 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 54 65  ;.      iRowidTe
10fc0 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20  rm = i;.    }.  
10fd0 7d 0a 20 20 69 66 28 20 69 50 6c 61 6e 26 31 20  }.  if( iPlan&1 
10fe0 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
10ff0 20 32 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   2;.    pIdxInfo
11000 2d 3e 69 64 78 4e 75 6d 20 3d 20 69 50 6c 61 6e  ->idxNum = iPlan
11010 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49 6e  ;.    if( pIdxIn
11020 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3d 3d 31 0a  fo->nOrderBy==1.
11030 20 20 20 20 20 26 26 20 70 49 64 78 49 6e 66 6f       && pIdxInfo
11040 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e 69 43  ->aOrderBy[0].iC
11050 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f  olumn==SPELLFIX_
11060 43 4f 4c 5f 53 43 4f 52 45 0a 20 20 20 20 20 26  COL_SCORE.     &
11070 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64  & pIdxInfo->aOrd
11080 65 72 42 79 5b 30 5d 2e 64 65 73 63 3d 3d 30 0a  erBy[0].desc==0.
11090 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 49 64      ){.      pId
110a0 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
110b0 6e 73 75 6d 65 64 20 3d 20 31 3b 20 20 2f 2a 20  nsumed = 1;  /* 
110c0 44 65 66 61 75 6c 74 20 6f 72 64 65 72 20 62 79  Default order by
110d0 20 69 53 63 6f 72 65 20 2a 2f 0a 20 20 20 20 7d   iScore */.    }
110e0 0a 20 20 20 20 69 66 28 20 69 50 6c 61 6e 26 32  .    if( iPlan&2
110f0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e   ){.      pIdxIn
11100 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
11110 73 61 67 65 5b 69 4c 61 6e 67 54 65 72 6d 5d 2e  sage[iLangTerm].
11120 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b  argvIndex = idx+
11130 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  +;.      pIdxInf
11140 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11150 61 67 65 5b 69 4c 61 6e 67 54 65 72 6d 5d 2e 6f  age[iLangTerm].o
11160 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  mit = 1;.    }. 
11170 20 20 20 69 66 28 20 69 50 6c 61 6e 26 34 20 29     if( iPlan&4 )
11180 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  {.      pIdxInfo
11190 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
111a0 67 65 5b 69 54 6f 70 54 65 72 6d 5d 2e 61 72 67  ge[iTopTerm].arg
111b0 76 49 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a  vIndex = idx++;.
111c0 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
111d0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
111e0 5b 69 54 6f 70 54 65 72 6d 5d 2e 6f 6d 69 74 20  [iTopTerm].omit 
111f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
11200 66 28 20 69 50 6c 61 6e 26 38 20 29 7b 0a 20 20  f( iPlan&8 ){.  
11210 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
11220 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
11230 53 63 6f 70 65 54 65 72 6d 5d 2e 61 72 67 76 49  ScopeTerm].argvI
11240 6e 64 65 78 20 3d 20 69 64 78 2b 2b 3b 0a 20 20  ndex = idx++;.  
11250 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
11260 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
11270 53 63 6f 70 65 54 65 72 6d 5d 2e 6f 6d 69 74 20  ScopeTerm].omit 
11280 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
11290 66 28 20 69 50 6c 61 6e 26 28 31 36 7c 33 32 29  f( iPlan&(16|32)
112a0 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e   ){.      pIdxIn
112b0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
112c0 73 61 67 65 5b 69 44 69 73 74 54 65 72 6d 5d 2e  sage[iDistTerm].
112d0 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78 2b  argvIndex = idx+
112e0 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  +;.      pIdxInf
112f0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
11300 61 67 65 5b 69 44 69 73 74 54 65 72 6d 5d 2e 6f  age[iDistTerm].o
11310 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  mit = 1;.    }. 
11320 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
11330 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 65 35  imatedCost = 1e5
11340 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 69  ;.  }else if( (i
11350 50 6c 61 6e 20 26 20 36 34 29 20 29 7b 0a 20 20  Plan & 64) ){.  
11360 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
11370 75 6d 20 3d 20 36 34 3b 0a 20 20 20 20 70 49 64  um = 64;.    pId
11380 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
11390 6e 74 55 73 61 67 65 5b 69 52 6f 77 69 64 54 65  ntUsage[iRowidTe
113a0 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  rm].argvIndex = 
113b0 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  1;.    pIdxInfo-
113c0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
113d0 65 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e 6f 6d  e[iRowidTerm].om
113e0 69 74 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78  it = 1;.    pIdx
113f0 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
11400 6f 73 74 20 3d 20 35 3b 0a 20 20 7d 65 6c 73 65  ost = 5;.  }else
11410 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
11420 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  idxNum = 0;.    
11430 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
11440 74 65 64 43 6f 73 74 20 3d 20 31 65 35 30 3b 0a  tedCost = 1e50;.
11450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
11460 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11470 20 4f 70 65 6e 20 61 20 6e 65 77 20 66 75 7a 7a   Open a new fuzz
11480 79 2d 73 65 61 72 63 68 20 63 75 72 73 6f 72 2e  y-search cursor.
11490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
114a0 70 65 6c 6c 66 69 78 31 4f 70 65 6e 28 73 71 6c  pellfix1Open(sql
114b0 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61 62  ite3_vtab *pVTab
114c0 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
114d0 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
114e0 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76  ){.  spellfix1_v
114f0 74 61 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66  tab *p = (spellf
11500 69 78 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b  ix1_vtab*)pVTab;
11510 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  .  spellfix1_cur
11520 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75  sor *pCur;.  pCu
11530 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
11540 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  oc( sizeof(*pCur
11550 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d  ) );.  if( pCur=
11560 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11570 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
11580 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69 7a 65  et(pCur, 0, size
11590 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 70 43  of(*pCur));.  pC
115a0 75 72 2d 3e 70 56 54 61 62 20 3d 20 70 3b 0a 20  ur->pVTab = p;. 
115b0 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43   *ppCursor = &pC
115c0 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75  ur->base;.  retu
115d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
115e0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 61 20  ./*.** Adjust a 
115f0 64 69 73 74 61 6e 63 65 20 6d 65 61 73 75 72 65  distance measure
11600 6d 65 6e 74 20 62 79 20 74 68 65 20 77 6f 72 64  ment by the word
11610 73 20 72 61 6e 6b 20 69 6e 20 6f 72 64 65 72 20  s rank in order 
11620 74 6f 20 73 68 6f 77 0a 2a 2a 20 70 72 65 66 65  to show.** prefe
11630 72 65 6e 63 65 20 74 6f 20 63 6f 6d 6d 6f 6e 20  rence to common 
11640 77 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  words..*/.static
11650 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 53 63   int spellfix1Sc
11660 6f 72 65 28 69 6e 74 20 69 44 69 73 74 61 6e 63  ore(int iDistanc
11670 65 2c 20 69 6e 74 20 69 52 61 6e 6b 29 7b 0a 20  e, int iRank){. 
11680 20 69 6e 74 20 69 4c 6f 67 32 3b 0a 20 20 66 6f   int iLog2;.  fo
11690 72 28 69 4c 6f 67 32 3d 30 3b 20 69 52 61 6e 6b  r(iLog2=0; iRank
116a0 3e 30 3b 20 69 4c 6f 67 32 2b 2b 2c 20 69 52 61  >0; iLog2++, iRa
116b0 6e 6b 3e 3e 3d 31 29 7b 7d 0a 20 20 72 65 74 75  nk>>=1){}.  retu
116c0 72 6e 20 69 44 69 73 74 61 6e 63 65 20 2b 20 33  rn iDistance + 3
116d0 32 20 2d 20 69 4c 6f 67 32 3b 0a 7d 0a 0a 2f 2a  2 - iLog2;.}../*
116e0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
116f0 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 6f 62  spellfix1_row ob
11700 6a 65 63 74 73 20 66 6f 72 20 73 6f 72 74 69 6e  jects for sortin
11710 67 20 70 75 72 70 6f 73 65 73 20 69 6e 20 71 73  g purposes in qs
11720 6f 72 74 28 29 20 73 75 63 68 0a 2a 2a 20 74 68  ort() such.** th
11730 61 74 20 74 68 65 79 20 73 6f 72 74 20 69 6e 20  at they sort in 
11740 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73  order of increas
11750 69 6e 67 20 64 69 73 74 61 6e 63 65 2e 0a 2a 2f  ing distance..*/
11760 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c  .static int spel
11770 6c 66 69 78 31 52 6f 77 43 6f 6d 70 61 72 65 28  lfix1RowCompare(
11780 63 6f 6e 73 74 20 76 6f 69 64 20 2a 41 2c 20 63  const void *A, c
11790 6f 6e 73 74 20 76 6f 69 64 20 2a 42 29 7b 0a 20  onst void *B){. 
117a0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 70   const struct sp
117b0 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 61 20 3d  ellfix1_row *a =
117c0 20 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73   (const struct s
117d0 70 65 6c 6c 66 69 78 31 5f 72 6f 77 2a 29 41 3b  pellfix1_row*)A;
117e0 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
117f0 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 20 2a 62  spellfix1_row *b
11800 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 75 63 74   = (const struct
11810 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f 77 2a 29   spellfix1_row*)
11820 42 3b 0a 20 20 72 65 74 75 72 6e 20 61 2d 3e 69  B;.  return a->i
11830 53 63 6f 72 65 20 2d 20 62 2d 3e 69 53 63 6f 72  Score - b->iScor
11840 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  e;.}../*.** A st
11850 72 75 63 74 75 72 65 20 75 73 65 64 20 74 6f 20  ructure used to 
11860 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
11870 20 66 72 6f 6d 20 73 70 65 6c 6c 66 69 78 31 46   from spellfix1F
11880 69 6c 74 65 72 46 6f 72 4d 61 74 63 68 28 29 0a  ilterForMatch().
11890 2a 2a 20 69 6e 74 6f 20 73 70 65 6c 6c 66 69 78  ** into spellfix
118a0 31 52 75 6e 51 75 65 72 79 28 29 2e 0a 2a 2f 0a  1RunQuery()..*/.
118b0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d  typedef struct M
118c0 61 74 63 68 51 75 65 72 79 20 7b 0a 20 20 73 70  atchQuery {.  sp
118d0 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
118e0 70 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 2f  pCur;          /
118f0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 62 65 69  * The cursor bei
11900 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
11910 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
11920 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
11930 20 2f 2a 20 73 68 61 64 6f 77 20 74 61 62 6c 65   /* shadow table
11940 20 71 75 65 72 79 20 73 74 61 74 6d 65 6e 74 20   query statment 
11950 2a 2f 0a 20 20 63 68 61 72 20 7a 48 61 73 68 5b  */.  char zHash[
11960 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48  SPELLFIX_MX_HASH
11970 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ];    /* The cur
11980 72 65 6e 74 20 70 68 6f 6e 65 68 61 73 68 20 66  rent phonehash f
11990 6f 72 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a 20  or zPattern */. 
119a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
119b0 74 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20  ttern;          
119c0 20 20 2f 2a 20 54 72 61 6e 73 6c 69 74 65 72 61    /* Translitera
119d0 74 65 64 20 69 6e 70 75 74 20 73 74 72 69 6e 67  ted input string
119e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 74 65   */.  int nPatte
119f0 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rn;             
11a00 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
11a10 20 6f 66 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a   of zPattern */.
11a20 20 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d 53    EditDist3FromS
11a30 74 72 69 6e 67 20 2a 70 4d 61 74 63 68 53 74 72  tring *pMatchStr
11a40 33 3b 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 75  3; /* Original u
11a50 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 2a 2f  nicode string */
11a60 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66  .  EditDist3Conf
11a70 69 67 20 2a 70 43 6f 6e 66 69 67 33 3b 20 20 20  ig *pConfig3;   
11a80 20 20 20 20 2f 2a 20 45 64 69 74 2d 64 69 73 74      /* Edit-dist
11a90 61 6e 63 65 20 63 6f 73 74 20 63 6f 65 66 66 69  ance cost coeffi
11aa0 63 69 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  cients */.  cons
11ab0 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20  t EditDist3Lang 
11ac0 2a 70 4c 61 6e 67 3b 20 20 20 20 20 20 2f 2a 20  *pLang;      /* 
11ad0 54 68 65 20 73 65 6c 65 63 74 65 64 20 6c 61 6e  The selected lan
11ae0 67 75 61 67 65 20 63 6f 65 66 66 69 63 69 65 6e  guage coefficien
11af0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 61 6e  ts */.  int iLan
11b00 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
11b10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11b20 6c 61 6e 67 75 61 67 65 20 69 64 20 2a 2f 0a 20  language id */. 
11b30 20 69 6e 74 20 69 53 63 6f 70 65 3b 20 20 20 20   int iScope;    
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 63 6f    /* Default sco
11b60 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 61 78  pe */.  int iMax
11b70 44 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Dist;           
11b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
11b90 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 65 64 69 74  mum allowed edit
11ba0 20 64 69 73 74 61 6e 63 65 2c 20 6f 72 20 2d 31   distance, or -1
11bb0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bd0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
11be0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  code */.  int nR
11bf0 75 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  un;             
11c00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11c10 66 20 70 72 69 6f 72 20 72 75 6e 73 20 66 6f 72  f prior runs for
11c20 20 74 68 65 20 73 61 6d 65 20 7a 50 61 74 74 65   the same zPatte
11c30 72 6e 20 2a 2f 0a 20 20 63 68 61 72 20 61 7a 50  rn */.  char azP
11c40 72 69 6f 72 5b 53 50 45 4c 4c 46 49 58 5f 4d 58  rior[SPELLFIX_MX
11c50 5f 52 55 4e 5d 5b 53 50 45 4c 4c 46 49 58 5f 4d  _RUN][SPELLFIX_M
11c60 58 5f 48 41 53 48 5d 3b 20 20 2f 2a 20 50 72 69  X_HASH];  /* Pri
11c70 6f 72 20 68 61 73 68 65 73 20 2a 2f 0a 7d 20 4d  or hashes */.} M
11c80 61 74 63 68 51 75 65 72 79 3b 0a 0a 2f 2a 0a 2a  atchQuery;../*.*
11c90 2a 20 52 75 6e 20 61 20 71 75 65 72 79 20 6c 6f  * Run a query lo
11ca0 6f 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65  oking for the be
11cb0 73 74 20 6d 61 74 63 68 65 73 20 61 67 61 69 6e  st matches again
11cc0 73 74 20 7a 50 61 74 74 65 72 6e 20 75 73 69 6e  st zPattern usin
11cd0 67 0a 2a 2a 20 7a 48 61 73 68 20 61 73 20 74 68  g.** zHash as th
11ce0 65 20 63 68 61 72 61 63 74 65 72 20 63 6c 61 73  e character clas
11cf0 73 20 73 65 65 64 20 68 61 73 68 2e 0a 2a 2f 0a  s seed hash..*/.
11d00 73 74 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c  static void spel
11d10 6c 66 69 78 31 52 75 6e 51 75 65 72 79 28 4d 61  lfix1RunQuery(Ma
11d20 74 63 68 51 75 65 72 79 20 2a 70 2c 20 63 6f 6e  tchQuery *p, con
11d30 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 2c  st char *zQuery,
11d40 20 69 6e 74 20 6e 51 75 65 72 79 29 7b 0a 20 20   int nQuery){.  
11d50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 31 3b  const char *zK1;
11d60 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11d70 57 6f 72 64 3b 0a 20 20 69 6e 74 20 69 44 69 73  Word;.  int iDis
11d80 74 3b 0a 20 20 69 6e 74 20 69 52 61 6e 6b 3b 0a  t;.  int iRank;.
11d90 20 20 69 6e 74 20 69 53 63 6f 72 65 3b 0a 20 20    int iScore;.  
11da0 69 6e 74 20 69 57 6f 72 73 74 20 3d 20 30 3b 0a  int iWorst = 0;.
11db0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
11dc0 20 69 64 78 57 6f 72 73 74 20 3d 20 2d 31 3b 0a   idxWorst = -1;.
11dd0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
11de0 53 63 6f 70 65 20 3d 20 70 2d 3e 69 53 63 6f 70  Scope = p->iScop
11df0 65 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63  e;.  spellfix1_c
11e00 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 2d  ursor *pCur = p-
11e10 3e 70 43 75 72 3b 0a 20 20 73 71 6c 69 74 65 33  >pCur;.  sqlite3
11e20 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70  _stmt *pStmt = p
11e30 2d 3e 70 53 74 6d 74 3b 0a 20 20 63 68 61 72 20  ->pStmt;.  char 
11e40 7a 48 61 73 68 31 5b 53 50 45 4c 4c 46 49 58 5f  zHash1[SPELLFIX_
11e50 4d 58 5f 48 41 53 48 5d 3b 0a 20 20 63 68 61 72  MX_HASH];.  char
11e60 20 7a 48 61 73 68 32 5b 53 50 45 4c 4c 46 49 58   zHash2[SPELLFIX
11e70 5f 4d 58 5f 48 41 53 48 5d 3b 0a 20 20 63 68 61  _MX_HASH];.  cha
11e80 72 20 2a 7a 43 6c 61 73 73 3b 0a 20 20 69 6e 74  r *zClass;.  int
11e90 20 6e 43 6c 61 73 73 3b 0a 20 20 69 6e 74 20 72   nClass;.  int r
11ea0 63 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  c;..  if( pCur->
11eb0 61 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 20  a==0 || p->rc ) 
11ec0 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 50 72 69  return;   /* Pri
11ed0 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  or memory alloca
11ee0 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 2a 2f 0a  tion failure */.
11ef0 20 20 7a 43 6c 61 73 73 20 3d 20 28 63 68 61 72    zClass = (char
11f00 2a 29 70 68 6f 6e 65 74 69 63 48 61 73 68 28 28  *)phoneticHash((
11f10 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
11f20 51 75 65 72 79 2c 20 6e 51 75 65 72 79 29 3b 0a  Query, nQuery);.
11f30 20 20 69 66 28 20 7a 43 6c 61 73 73 3d 3d 30 20    if( zClass==0 
11f40 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
11f50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11f60 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6e   return;.  }.  n
11f70 43 6c 61 73 73 20 3d 20 28 69 6e 74 29 73 74 72  Class = (int)str
11f80 6c 65 6e 28 7a 43 6c 61 73 73 29 3b 0a 20 20 69  len(zClass);.  i
11f90 66 28 20 6e 43 6c 61 73 73 3e 53 50 45 4c 4c 46  f( nClass>SPELLF
11fa0 49 58 5f 4d 58 5f 48 41 53 48 2d 32 20 29 7b 0a  IX_MX_HASH-2 ){.
11fb0 20 20 20 20 6e 43 6c 61 73 73 20 3d 20 53 50 45      nClass = SPE
11fc0 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48 2d 32 3b  LLFIX_MX_HASH-2;
11fd0 0a 20 20 20 20 7a 43 6c 61 73 73 5b 6e 43 6c 61  .    zClass[nCla
11fe0 73 73 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ss] = 0;.  }.  i
11ff0 66 28 20 6e 43 6c 61 73 73 3c 3d 69 53 63 6f 70  f( nClass<=iScop
12000 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 43 6c  e ){.    if( nCl
12010 61 73 73 3e 32 20 29 7b 0a 20 20 20 20 20 20 69  ass>2 ){.      i
12020 53 63 6f 70 65 20 3d 20 6e 43 6c 61 73 73 2d 31  Scope = nClass-1
12030 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12040 20 20 20 69 53 63 6f 70 65 20 3d 20 6e 43 6c 61     iScope = nCla
12050 73 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ss;.    }.  }.  
12060 6d 65 6d 63 70 79 28 7a 48 61 73 68 31 2c 20 7a  memcpy(zHash1, z
12070 43 6c 61 73 73 2c 20 69 53 63 6f 70 65 29 3b 0a  Class, iScope);.
12080 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12090 43 6c 61 73 73 29 3b 0a 20 20 7a 48 61 73 68 31  Class);.  zHash1
120a0 5b 69 53 63 6f 70 65 5d 20 3d 20 30 3b 0a 20 20  [iScope] = 0;.  
120b0 6d 65 6d 63 70 79 28 7a 48 61 73 68 32 2c 20 7a  memcpy(zHash2, z
120c0 48 61 73 68 31 2c 20 69 53 63 6f 70 65 29 3b 0a  Hash1, iScope);.
120d0 20 20 7a 48 61 73 68 32 5b 69 53 63 6f 70 65 5d    zHash2[iScope]
120e0 20 3d 20 27 5a 27 3b 0a 20 20 7a 48 61 73 68 32   = 'Z';.  zHash2
120f0 5b 69 53 63 6f 70 65 2b 31 5d 20 3d 20 30 3b 0a  [iScope+1] = 0;.
12100 23 69 66 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  #if SPELLFIX_MX_
12110 52 55 4e 3e 31 0a 20 20 66 6f 72 28 69 3d 30 3b  RUN>1.  for(i=0;
12120 20 69 3c 70 2d 3e 6e 52 75 6e 3b 20 69 2b 2b 29   i<p->nRun; i++)
12130 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
12140 28 70 2d 3e 61 7a 50 72 69 6f 72 5b 69 5d 2c 20  (p->azPrior[i], 
12150 7a 48 61 73 68 31 29 3d 3d 30 20 29 20 72 65 74  zHash1)==0 ) ret
12160 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
12170 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 75    assert( p->nRu
12180 6e 3c 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55  n<SPELLFIX_MX_RU
12190 4e 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d  N );.  memcpy(p-
121a0 3e 61 7a 50 72 69 6f 72 5b 70 2d 3e 6e 52 75 6e  >azPrior[p->nRun
121b0 2b 2b 5d 2c 20 7a 48 61 73 68 31 2c 20 69 53 63  ++], zHash1, iSc
121c0 6f 70 65 2b 31 29 3b 0a 20 20 69 66 28 20 73 71  ope+1);.  if( sq
121d0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
121e0 70 53 74 6d 74 2c 20 31 2c 20 7a 48 61 73 68 31  pStmt, 1, zHash1
121f0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
12200 54 49 43 29 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  TIC)==SQLITE_NOM
12210 45 4d 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  EM.   || sqlite3
12220 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
12230 2c 20 32 2c 20 7a 48 61 73 68 32 2c 20 2d 31 2c  , 2, zHash2, -1,
12240 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3d   SQLITE_STATIC)=
12250 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20  =SQLITE_NOMEM.  
12260 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
12270 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12280 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 69 66   return;.  }.#if
12290 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e   SPELLFIX_MX_RUN
122a0 3e 31 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  >1.  for(i=0; i<
122b0 70 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29  pCur->nRow; i++)
122c0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
122d0 61 5b 69 5d 2e 69 53 63 6f 72 65 3e 69 57 6f 72  a[i].iScore>iWor
122e0 73 74 20 29 7b 0a 20 20 20 20 20 20 69 57 6f 72  st ){.      iWor
122f0 73 74 20 3d 20 70 43 75 72 2d 3e 61 5b 69 5d 2e  st = pCur->a[i].
12300 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 69 64  iScore;.      id
12310 78 57 6f 72 73 74 20 3d 20 69 3b 0a 20 20 20 20  xWorst = i;.    
12320 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77  }.  }.#endif.  w
12330 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
12340 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
12350 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e 74  E_ROW ){.    int
12360 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 2d 31 3b   iMatchlen = -1;
12370 0a 20 20 20 20 69 52 61 6e 6b 20 3d 20 73 71 6c  .    iRank = sql
12380 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
12390 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69  pStmt, 2);.    i
123a0 66 28 20 70 2d 3e 70 4d 61 74 63 68 53 74 72 33  f( p->pMatchStr3
123b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 57   ){.      int nW
123c0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ord = sqlite3_co
123d0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
123e0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7a 57 6f 72  , 1);.      zWor
123f0 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
12400 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
12410 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  text(pStmt, 1);.
12420 20 20 20 20 20 20 69 44 69 73 74 20 3d 20 65 64        iDist = ed
12430 69 74 44 69 73 74 33 43 6f 72 65 28 70 2d 3e 70  itDist3Core(p->p
12440 4d 61 74 63 68 53 74 72 33 2c 20 7a 57 6f 72 64  MatchStr3, zWord
12450 2c 20 6e 57 6f 72 64 2c 20 70 2d 3e 70 4c 61 6e  , nWord, p->pLan
12460 67 2c 20 26 69 4d 61 74 63 68 6c 65 6e 29 3b 0a  g, &iMatchlen);.
12470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12480 20 7a 4b 31 20 3d 20 28 63 6f 6e 73 74 20 63 68   zK1 = (const ch
12490 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
124a0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33  mn_text(pStmt, 3
124b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4b 31  );.      if( zK1
124c0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
124d0 20 20 20 20 20 20 69 44 69 73 74 20 3d 20 65 64        iDist = ed
124e0 69 74 64 69 73 74 31 28 70 2d 3e 7a 50 61 74 74  itdist1(p->zPatt
124f0 65 72 6e 2c 20 7a 4b 31 2c 20 30 29 3b 0a 20 20  ern, zK1, 0);.  
12500 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 69 73    }.    if( iDis
12510 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  t<0 ){.      p->
12520 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
12530 4d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  M;.      break;.
12540 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
12550 6e 53 65 61 72 63 68 2b 2b 3b 0a 20 20 20 20 69  nSearch++;.    i
12560 53 63 6f 72 65 20 3d 20 73 70 65 6c 6c 66 69 78  Score = spellfix
12570 31 53 63 6f 72 65 28 69 44 69 73 74 2c 69 52 61  1Score(iDist,iRa
12580 6e 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nk);.    if( p->
12590 69 4d 61 78 44 69 73 74 3e 3d 30 20 29 7b 0a 20  iMaxDist>=0 ){. 
125a0 20 20 20 20 20 69 66 28 20 69 44 69 73 74 3e 70       if( iDist>p
125b0 2d 3e 69 4d 61 78 44 69 73 74 20 29 20 63 6f 6e  ->iMaxDist ) con
125c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
125d0 20 70 43 75 72 2d 3e 6e 52 6f 77 3e 3d 70 43 75   pCur->nRow>=pCu
125e0 72 2d 3e 6e 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20  r->nAlloc-1 ){. 
125f0 20 20 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31         spellfix1
12600 52 65 73 69 7a 65 43 75 72 73 6f 72 28 70 43 75  ResizeCursor(pCu
12610 72 2c 20 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 2a  r, pCur->nAlloc*
12620 32 20 2b 20 31 30 29 3b 0a 20 20 20 20 20 20 20  2 + 10);.       
12630 20 69 66 28 20 70 43 75 72 2d 3e 61 3d 3d 30 20   if( pCur->a==0 
12640 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
12650 0a 20 20 20 20 20 20 69 64 78 20 3d 20 70 43 75  .      idx = pCu
12660 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 7d 65 6c  r->nRow;.    }el
12670 73 65 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f  se if( pCur->nRo
12680 77 3c 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29  w<pCur->nAlloc )
12690 7b 0a 20 20 20 20 20 20 69 64 78 20 3d 20 70 43  {.      idx = pC
126a0 75 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 7d 65  ur->nRow;.    }e
126b0 6c 73 65 20 69 66 28 20 69 53 63 6f 72 65 3c 69  lse if( iScore<i
126c0 57 6f 72 73 74 20 29 7b 0a 20 20 20 20 20 20 69  Worst ){.      i
126d0 64 78 20 3d 20 69 64 78 57 6f 72 73 74 3b 0a 20  dx = idxWorst;. 
126e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
126f0 65 28 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a  e(pCur->a[idx].z
12700 57 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Word);.    }else
12710 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
12720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
12730 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64 20 3d  ->a[idx].zWord =
12740 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12750 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ("%s", sqlite3_c
12760 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
12770 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  , 1));.    if( p
12780 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72  Cur->a[idx].zWor
12790 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  d==0 ){.      p-
127a0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
127b0 45 4d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  EM;.      break;
127c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
127d0 3e 61 5b 69 64 78 5d 2e 69 52 6f 77 69 64 20 3d  >a[idx].iRowid =
127e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
127f0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b  int64(pStmt, 0);
12800 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78  .    pCur->a[idx
12810 5d 2e 69 52 61 6e 6b 20 3d 20 69 52 61 6e 6b 3b  ].iRank = iRank;
12820 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78  .    pCur->a[idx
12830 5d 2e 69 44 69 73 74 61 6e 63 65 20 3d 20 69 44  ].iDistance = iD
12840 69 73 74 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  ist;.    pCur->a
12850 5b 69 64 78 5d 2e 69 53 63 6f 72 65 20 3d 20 69  [idx].iScore = i
12860 53 63 6f 72 65 3b 0a 20 20 20 20 70 43 75 72 2d  Score;.    pCur-
12870 3e 61 5b 69 64 78 5d 2e 69 4d 61 74 63 68 6c 65  >a[idx].iMatchle
12880 6e 20 3d 20 69 4d 61 74 63 68 6c 65 6e 3b 0a 20  n = iMatchlen;. 
12890 20 20 20 6d 65 6d 63 70 79 28 70 43 75 72 2d 3e     memcpy(pCur->
128a0 61 5b 69 64 78 5d 2e 7a 48 61 73 68 2c 20 7a 48  a[idx].zHash, zH
128b0 61 73 68 31 2c 20 69 53 63 6f 70 65 2b 31 29 3b  ash1, iScope+1);
128c0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e  .    if( pCur->n
128d0 52 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63  Row<pCur->nAlloc
128e0 20 29 20 70 43 75 72 2d 3e 6e 52 6f 77 2b 2b 3b   ) pCur->nRow++;
128f0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e  .    if( pCur->n
12900 52 6f 77 3d 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f  Row==pCur->nAllo
12910 63 20 29 7b 0a 20 20 20 20 20 20 69 57 6f 72 73  c ){.      iWors
12920 74 20 3d 20 70 43 75 72 2d 3e 61 5b 30 5d 2e 69  t = pCur->a[0].i
12930 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 69 64 78  Score;.      idx
12940 57 6f 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  Worst = 0;.     
12950 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 43 75 72   for(i=1; i<pCur
12960 2d 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20  ->nRow; i++){.  
12970 20 20 20 20 20 20 69 53 63 6f 72 65 20 3d 20 70        iScore = p
12980 43 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72 65  Cur->a[i].iScore
12990 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 57  ;.        if( iW
129a0 6f 72 73 74 3c 69 53 63 6f 72 65 20 29 7b 0a 20  orst<iScore ){. 
129b0 20 20 20 20 20 20 20 20 20 69 57 6f 72 73 74 20           iWorst 
129c0 3d 20 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20  = iScore;.      
129d0 20 20 20 20 69 64 78 57 6f 72 73 74 20 3d 20 69      idxWorst = i
129e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
129f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
12a00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
12a10 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
12a20 20 72 63 20 29 20 70 2d 3e 72 63 20 3d 20 72 63   rc ) p->rc = rc
12a30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12a40 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 78  version of the x
12a50 46 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 77 6f  Filter method wo
12a60 72 6b 20 69 66 20 74 68 65 20 4d 41 54 43 48 20  rk if the MATCH 
12a70 74 65 72 6d 20 69 73 20 70 72 65 73 65 6e 74 0a  term is present.
12a80 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 64 6f  ** and we are do
12a90 69 6e 67 20 61 20 73 63 61 6e 2e 0a 2a 2f 0a 73  ing a scan..*/.s
12aa0 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
12ab0 69 78 31 46 69 6c 74 65 72 46 6f 72 4d 61 74 63  ix1FilterForMatc
12ac0 68 28 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63  h(.  spellfix1_c
12ad0 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 69  ursor *pCur,.  i
12ae0 6e 74 20 69 64 78 4e 75 6d 2c 0a 20 20 69 6e 74  nt idxNum,.  int
12af0 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
12b00 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
12b10 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
12b20 64 20 63 68 61 72 20 2a 7a 4d 61 74 63 68 54 68  d char *zMatchTh
12b30 69 73 3b 20 20 20 2f 2a 20 52 48 53 20 6f 66 20  is;   /* RHS of 
12b40 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
12b50 6f 72 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74  or */.  EditDist
12b60 33 46 72 6f 6d 53 74 72 69 6e 67 20 2a 70 4d 61  3FromString *pMa
12b70 74 63 68 53 74 72 33 20 3d 20 30 3b 20 2f 2a 20  tchStr3 = 0; /* 
12b80 7a 4d 61 74 63 68 54 68 69 73 20 61 73 20 61 6e  zMatchThis as an
12b90 20 65 64 69 74 64 69 73 74 20 73 74 72 69 6e 67   editdist string
12ba0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
12bb0 74 65 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tern;           
12bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e           /* Tran
12bd0 73 6c 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 7a  sliteration of z
12be0 4d 61 74 63 68 54 68 69 73 20 2a 2f 0a 20 20 69  MatchThis */.  i
12bf0 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20 20 20 20  nt nPattern;    
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c10 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a    /* Length of z
12c20 50 61 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74  Pattern */.  int
12c30 20 69 4c 69 6d 69 74 20 3d 20 32 30 3b 20 20 20   iLimit = 20;   
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 2f 2a 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66  /* Max number of
12c60 20 72 6f 77 73 20 6f 66 20 6f 75 74 70 75 74 20   rows of output 
12c70 2a 2f 0a 20 20 69 6e 74 20 69 53 63 6f 70 65 20  */.  int iScope 
12c80 3d 20 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 3;            
12c90 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
12ca0 68 69 73 20 6d 61 6e 79 20 63 68 61 72 61 63 74  his many charact
12cb0 65 72 73 20 6f 66 20 7a 43 6c 61 73 73 20 2a 2f  ers of zClass */
12cc0 0a 20 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 30  .  int iLang = 0
12cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12ce0 20 20 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67        /* Languag
12cf0 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  e code */.  char
12d00 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d20 2a 20 53 51 4c 20 6f 66 20 73 68 61 64 6f 77 20  * SQL of shadow 
12d30 74 61 62 6c 65 20 71 75 65 72 79 20 2a 2f 0a 20  table query */. 
12d40 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12d50 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Stmt = 0;       
12d60 20 20 20 20 2f 2a 20 53 68 61 64 6f 77 20 74 61      /* Shadow ta
12d70 62 6c 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ble query */.  i
12d80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
12db0 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 20 3d 20   */.  int idx = 
12dc0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
12dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
12de0 20 61 76 61 69 6c 61 62 6c 65 20 66 69 6c 74 65   available filte
12df0 72 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  r parameter */. 
12e00 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20   spellfix1_vtab 
12e10 2a 70 20 3d 20 70 43 75 72 2d 3e 70 56 54 61 62  *p = pCur->pVTab
12e20 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75  ;   /* The virtu
12e30 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 6f 77  al table that ow
12e40 6e 73 20 70 43 75 72 20 2a 2f 0a 20 20 4d 61 74  ns pCur */.  Mat
12e50 63 68 51 75 65 72 79 20 78 3b 20 20 20 20 20 20  chQuery x;      
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 2f 2a 20 46 6f 72 20 70 61 73 73 69 6e 67 20 69  /* For passing i
12e80 6e 66 6f 20 74 6f 20 52 75 6e 51 75 65 72 79 28  nfo to RunQuery(
12e90 29 20 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  ) */..  /* Load 
12ea0 74 68 65 20 63 6f 73 74 20 74 61 62 6c 65 20 69  the cost table i
12eb0 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c  f we have not al
12ec0 72 65 61 64 79 20 64 6f 6e 65 20 73 6f 20 2a 2f  ready done so */
12ed0 0a 20 20 69 66 28 20 70 2d 3e 7a 43 6f 73 74 54  .  if( p->zCostT
12ee0 61 62 6c 65 21 3d 30 20 26 26 20 70 2d 3e 70 43  able!=0 && p->pC
12ef0 6f 6e 66 69 67 33 3d 3d 30 20 29 7b 0a 20 20 20  onfig3==0 ){.   
12f00 20 70 2d 3e 70 43 6f 6e 66 69 67 33 20 3d 20 73   p->pConfig3 = s
12f10 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
12f20 69 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e 66 69 67  izeof(p->pConfig
12f30 33 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  3[0]) );.    if(
12f40 20 70 2d 3e 70 43 6f 6e 66 69 67 33 3d 3d 30 20   p->pConfig3==0 
12f50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12f60 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65  NOMEM;.    memse
12f70 74 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 30  t(p->pConfig3, 0
12f80 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e  , sizeof(p->pCon
12f90 66 69 67 33 5b 30 5d 29 29 3b 0a 20 20 20 20 72  fig3[0]));.    r
12fa0 63 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f 6e  c = editDist3Con
12fb0 66 69 67 4c 6f 61 64 28 70 2d 3e 70 43 6f 6e 66  figLoad(p->pConf
12fc0 69 67 33 2c 20 70 2d 3e 64 62 2c 20 70 2d 3e 7a  ig3, p->db, p->z
12fd0 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  CostTable);.    
12fe0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12ff0 72 63 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  rc;.  }.  memset
13000 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78  (&x, 0, sizeof(x
13010 29 29 3b 0a 20 20 78 2e 69 53 63 6f 70 65 20 3d  ));.  x.iScope =
13020 20 33 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20   3;  /* Default 
13030 73 63 6f 70 65 20 69 66 20 6e 6f 6e 65 20 73 70  scope if none sp
13040 65 63 69 66 69 65 64 20 62 79 20 22 57 48 45 52  ecified by "WHER
13050 45 20 73 63 6f 70 65 3d 4e 22 20 2a 2f 0a 20 20  E scope=N" */.  
13060 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 2d 31 3b  x.iMaxDist = -1;
13070 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
13080 6c 6f 77 65 64 20 65 64 69 74 20 64 69 73 74 61  lowed edit dista
13090 6e 63 65 20 2a 2f 0a 0a 20 20 69 66 28 20 69 64  nce */..  if( id
130a0 78 4e 75 6d 26 32 20 29 7b 0a 20 20 20 20 69 4c  xNum&2 ){.    iL
130b0 61 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ang = sqlite3_va
130c0 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78  lue_int(argv[idx
130d0 2b 2b 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ++]);.  }.  if( 
130e0 69 64 78 4e 75 6d 26 34 20 29 7b 0a 20 20 20 20  idxNum&4 ){.    
130f0 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  iLimit = sqlite3
13100 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
13110 69 64 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28  idx++]);.    if(
13120 20 69 4c 69 6d 69 74 3c 31 20 29 20 69 4c 69 6d   iLimit<1 ) iLim
13130 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  it = 1;.  }.  if
13140 28 20 69 64 78 4e 75 6d 26 38 20 29 7b 0a 20 20  ( idxNum&8 ){.  
13150 20 20 78 2e 69 53 63 6f 70 65 20 3d 20 73 71 6c    x.iScope = sql
13160 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
13170 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 20  rgv[idx++]);.   
13180 20 69 66 28 20 78 2e 69 53 63 6f 70 65 3c 31 20   if( x.iScope<1 
13190 29 20 78 2e 69 53 63 6f 70 65 20 3d 20 31 3b 0a  ) x.iScope = 1;.
131a0 20 20 20 20 69 66 28 20 78 2e 69 53 63 6f 70 65      if( x.iScope
131b0 3e 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53  >SPELLFIX_MX_HAS
131c0 48 2d 32 20 29 20 78 2e 69 53 63 6f 70 65 20 3d  H-2 ) x.iScope =
131d0 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53   SPELLFIX_MX_HAS
131e0 48 2d 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  H-2;.  }.  if( i
131f0 64 78 4e 75 6d 26 28 31 36 7c 33 32 29 20 29 7b  dxNum&(16|32) ){
13200 0a 20 20 20 20 78 2e 69 4d 61 78 44 69 73 74 20  .    x.iMaxDist 
13210 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13220 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29  int(argv[idx++])
13230 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 75 6d  ;.    if( idxNum
13240 26 31 36 20 29 20 78 2e 69 4d 61 78 44 69 73 74  &16 ) x.iMaxDist
13250 2d 2d 3b 0a 20 20 20 20 69 66 28 20 78 2e 69 4d  --;.    if( x.iM
13260 61 78 44 69 73 74 3c 30 20 29 20 78 2e 69 4d 61  axDist<0 ) x.iMa
13270 78 44 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  xDist = 0;.  }. 
13280 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43   spellfix1ResetC
13290 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 73  ursor(pCur);.  s
132a0 70 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75  pellfix1ResizeCu
132b0 72 73 6f 72 28 70 43 75 72 2c 20 69 4c 69 6d 69  rsor(pCur, iLimi
132c0 74 29 3b 0a 20 20 7a 4d 61 74 63 68 54 68 69 73  t);.  zMatchThis
132d0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
132e0 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
132f0 20 20 69 66 28 20 7a 4d 61 74 63 68 54 68 69 73    if( zMatchThis
13300 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13310 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
13320 3e 70 43 6f 6e 66 69 67 33 20 29 7b 0a 20 20 20  >pConfig3 ){.   
13330 20 78 2e 70 4c 61 6e 67 20 3d 20 65 64 69 74 44   x.pLang = editD
13340 69 73 74 33 46 69 6e 64 4c 61 6e 67 28 70 2d 3e  ist3FindLang(p->
13350 70 43 6f 6e 66 69 67 33 2c 20 69 4c 61 6e 67 29  pConfig3, iLang)
13360 3b 0a 20 20 20 20 70 4d 61 74 63 68 53 74 72 33  ;.    pMatchStr3
13370 20 3d 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d   = editDist3From
13380 53 74 72 69 6e 67 4e 65 77 28 78 2e 70 4c 61 6e  StringNew(x.pLan
13390 67 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  g, (const char*)
133a0 7a 4d 61 74 63 68 54 68 69 73 2c 20 2d 31 29 3b  zMatchThis, -1);
133b0 0a 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 53  .    if( pMatchS
133c0 74 72 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr3==0 ){.      
133d0 78 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  x.rc = SQLITE_NO
133e0 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
133f0 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20 20 20  filter_exit;.   
13400 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13410 78 2e 70 4c 61 6e 67 20 3d 20 30 3b 0a 20 20 7d  x.pLang = 0;.  }
13420 0a 20 20 7a 50 61 74 74 65 72 6e 20 3d 20 28 63  .  zPattern = (c
13430 68 61 72 2a 29 74 72 61 6e 73 6c 69 74 65 72 61  har*)translitera
13440 74 65 28 7a 4d 61 74 63 68 54 68 69 73 2c 20 73  te(zMatchThis, s
13450 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
13460 65 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20  es(argv[0]));.  
13470 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
13480 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  r->zPattern);.  
13490 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 20 3d  pCur->zPattern =
134a0 20 7a 50 61 74 74 65 72 6e 3b 0a 20 20 69 66 28   zPattern;.  if(
134b0 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a   zPattern==0 ){.
134c0 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49 54      x.rc = SQLIT
134d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
134e0 6f 20 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20  o filter_exit;. 
134f0 20 7d 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20   }.  nPattern = 
13500 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 50 61 74  (int)strlen(zPat
13510 74 65 72 6e 29 3b 0a 20 20 69 66 28 20 7a 50 61  tern);.  if( zPa
13520 74 74 65 72 6e 5b 6e 50 61 74 74 65 72 6e 2d 31  ttern[nPattern-1
13530 5d 3d 3d 27 2a 27 20 29 20 6e 50 61 74 74 65 72  ]=='*' ) nPatter
13540 6e 2d 2d 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  n--;.  zSql = sq
13550 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
13560 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 20      "SELECT id, 
13570 77 6f 72 64 2c 20 72 61 6e 6b 2c 20 6b 31 22 0a  word, rank, k1".
13580 20 20 20 20 20 22 20 20 46 52 4f 4d 20 5c 22 25       "  FROM \"%
13590 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22  w\".\"%w_vocab\"
135a0 22 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 6c  ".     " WHERE l
135b0 61 6e 67 69 64 3d 25 64 20 41 4e 44 20 6b 32 3e  angid=%d AND k2>
135c0 3d 3f 31 20 41 4e 44 20 6b 32 3c 3f 32 22 2c 0a  =?1 AND k2<?2",.
135d0 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c       p->zDbName,
135e0 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20   p->zTableName, 
135f0 69 4c 61 6e 67 0a 20 20 29 3b 0a 20 20 69 66 28  iLang.  );.  if(
13600 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
13610 78 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  x.rc = SQLITE_NO
13620 4d 45 4d 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  MEM;.    pStmt =
13630 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 66 69 6c   0;.    goto fil
13640 74 65 72 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  ter_exit;.  }.  
13650 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
13660 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
13670 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
13680 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
13690 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 70 43 75  ree(zSql);.  pCu
136a0 72 2d 3e 69 4c 61 6e 67 20 3d 20 69 4c 61 6e 67  r->iLang = iLang
136b0 3b 0a 20 20 78 2e 70 43 75 72 20 3d 20 70 43 75  ;.  x.pCur = pCu
136c0 72 3b 0a 20 20 78 2e 70 53 74 6d 74 20 3d 20 70  r;.  x.pStmt = p
136d0 53 74 6d 74 3b 0a 20 20 78 2e 7a 50 61 74 74 65  Stmt;.  x.zPatte
136e0 72 6e 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a 20  rn = zPattern;. 
136f0 20 78 2e 6e 50 61 74 74 65 72 6e 20 3d 20 6e 50   x.nPattern = nP
13700 61 74 74 65 72 6e 3b 0a 20 20 78 2e 70 4d 61 74  attern;.  x.pMat
13710 63 68 53 74 72 33 20 3d 20 70 4d 61 74 63 68 53  chStr3 = pMatchS
13720 74 72 33 3b 0a 20 20 78 2e 69 4c 61 6e 67 20 3d  tr3;.  x.iLang =
13730 20 69 4c 61 6e 67 3b 0a 20 20 78 2e 72 63 20 3d   iLang;.  x.rc =
13740 20 72 63 3b 0a 20 20 78 2e 70 43 6f 6e 66 69 67   rc;.  x.pConfig
13750 33 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 33 3b  3 = p->pConfig3;
13760 0a 20 20 69 66 28 20 78 2e 72 63 3d 3d 53 51 4c  .  if( x.rc==SQL
13770 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 70  ITE_OK ){.    sp
13780 65 6c 6c 66 69 78 31 52 75 6e 51 75 65 72 79 28  ellfix1RunQuery(
13790 26 78 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50  &x, zPattern, nP
137a0 61 74 74 65 72 6e 29 3b 0a 20 20 7d 0a 0a 20 20  attern);.  }..  
137b0 69 66 28 20 70 43 75 72 2d 3e 61 20 29 7b 0a 20  if( pCur->a ){. 
137c0 20 20 20 71 73 6f 72 74 28 70 43 75 72 2d 3e 61     qsort(pCur->a
137d0 2c 20 70 43 75 72 2d 3e 6e 52 6f 77 2c 20 73 69  , pCur->nRow, si
137e0 7a 65 6f 66 28 70 43 75 72 2d 3e 61 5b 30 5d 29  zeof(pCur->a[0])
137f0 2c 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 43 6f  , spellfix1RowCo
13800 6d 70 61 72 65 29 3b 0a 20 20 20 20 70 43 75 72  mpare);.    pCur
13810 2d 3e 69 54 6f 70 20 3d 20 69 4c 69 6d 69 74 3b  ->iTop = iLimit;
13820 0a 20 20 20 20 70 43 75 72 2d 3e 69 53 63 6f 70  .    pCur->iScop
13830 65 20 3d 20 69 53 63 6f 70 65 3b 0a 20 20 7d 65  e = iScope;.  }e
13840 6c 73 65 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20  lse{.    x.rc = 
13850 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13860 7d 0a 0a 66 69 6c 74 65 72 5f 65 78 69 74 3a 0a  }..filter_exit:.
13870 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
13880 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 65 64 69  ze(pStmt);.  edi
13890 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
138a0 44 65 6c 65 74 65 28 70 4d 61 74 63 68 53 74 72  Delete(pMatchStr
138b0 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 2e 72  3);.  return x.r
138c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
138d0 20 76 65 72 73 69 6f 6e 20 6f 66 20 78 46 69 6c   version of xFil
138e0 74 65 72 20 68 61 6e 64 6c 65 73 20 61 20 66 75  ter handles a fu
138f0 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 63 61  ll-table scan ca
13900 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
13910 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72   spellfix1Filter
13920 46 6f 72 46 75 6c 6c 53 63 61 6e 28 0a 20 20 73  ForFullScan(.  s
13930 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
13940 2a 70 43 75 72 2c 0a 20 20 69 6e 74 20 69 64 78  *pCur,.  int idx
13950 4e 75 6d 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Num,.  int argc,
13960 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
13970 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
13980 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13990 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
139a0 20 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20   spellfix1_vtab 
139b0 2a 70 56 54 61 62 20 3d 20 70 43 75 72 2d 3e 70  *pVTab = pCur->p
139c0 56 54 61 62 3b 0a 20 20 73 70 65 6c 6c 66 69 78  VTab;.  spellfix
139d0 31 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75  1ResetCursor(pCu
139e0 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  r);.  assert( id
139f0 78 4e 75 6d 3d 3d 30 20 7c 7c 20 69 64 78 4e 75  xNum==0 || idxNu
13a00 6d 3d 3d 36 34 20 29 3b 0a 20 20 7a 53 71 6c 20  m==64 );.  zSql 
13a10 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
13a20 66 28 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20  f(.     "SELECT 
13a30 77 6f 72 64 2c 20 72 61 6e 6b 2c 20 4e 55 4c 4c  word, rank, NULL
13a40 2c 20 6c 61 6e 67 69 64 2c 20 69 64 20 46 52 4f  , langid, id FRO
13a50 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f  M \"%w\".\"%w_vo
13a60 63 61 62 5c 22 25 73 22 2c 0a 20 20 20 20 20 70  cab\"%s",.     p
13a70 56 54 61 62 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70  VTab->zDbName, p
13a80 56 54 61 62 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65  VTab->zTableName
13a90 2c 0a 20 20 20 20 20 28 28 69 64 78 4e 75 6d 20  ,.     ((idxNum 
13aa0 26 20 36 34 29 20 3f 20 22 20 57 48 45 52 45 20  & 64) ? " WHERE 
13ab0 72 6f 77 69 64 3d 3f 22 20 3a 20 22 22 29 0a 20  rowid=?" : ""). 
13ac0 20 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d   );.  if( zSql==
13ad0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
13ae0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
13af0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
13b00 76 32 28 70 56 54 61 62 2d 3e 64 62 2c 20 7a 53  v2(pVTab->db, zS
13b10 71 6c 2c 20 2d 31 2c 20 26 70 43 75 72 2d 3e 70  ql, -1, &pCur->p
13b20 46 75 6c 6c 53 63 61 6e 2c 20 30 29 3b 0a 20 20  FullScan, 0);.  
13b30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
13b40 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  l);.  if( rc==SQ
13b50 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 64 78 4e  LITE_OK && (idxN
13b60 75 6d 20 26 20 36 34 29 20 29 7b 0a 20 20 20 20  um & 64) ){.    
13b70 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
13b80 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
13b90 74 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70  te3_bind_value(p
13ba0 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20  Cur->pFullScan, 
13bb0 31 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  1, argv[0]);.  }
13bc0 0a 20 20 70 43 75 72 2d 3e 6e 52 6f 77 20 3d 20  .  pCur->nRow = 
13bd0 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a  pCur->iRow = 0;.
13be0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
13c00 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75  sqlite3_step(pCu
13c10 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 29 3b 0a 20  r->pFullScan);. 
13c20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13c30 45 5f 52 4f 57 20 29 7b 20 70 43 75 72 2d 3e 69  E_ROW ){ pCur->i
13c40 52 6f 77 20 3d 20 2d 31 3b 20 72 63 20 3d 20 53  Row = -1; rc = S
13c50 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 20 20  QLITE_OK; }.    
13c60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
13c70 4f 4e 45 20 29 7b 20 72 63 20 3d 20 53 51 4c 49  ONE ){ rc = SQLI
13c80 54 45 5f 4f 4b 3b 20 7d 0a 20 20 7d 65 6c 73 65  TE_OK; }.  }else
13c90 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 52 6f 77  {.    pCur->iRow
13ca0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
13cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
13cc0 20 43 61 6c 6c 65 64 20 74 6f 20 22 72 65 77 69   Called to "rewi
13cd0 6e 64 22 20 61 20 63 75 72 73 6f 72 20 62 61 63  nd" a cursor bac
13ce0 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
13cf0 6e 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20 69 74  ng so that.** it
13d00 20 73 74 61 72 74 73 20 69 74 73 20 6f 75 74 70   starts its outp
13d10 75 74 20 6f 76 65 72 20 61 67 61 69 6e 2e 20 20  ut over again.  
13d20 41 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 61 74  Always called at
13d30 20 6c 65 61 73 74 20 6f 6e 63 65 0a 2a 2a 20 70   least once.** p
13d40 72 69 6f 72 20 74 6f 20 61 6e 79 20 73 70 65 6c  rior to any spel
13d50 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c 20 73 70 65  lfix1Column, spe
13d60 6c 6c 66 69 78 31 52 6f 77 69 64 2c 20 6f 72 20  llfix1Rowid, or 
13d70 73 70 65 6c 6c 66 69 78 31 45 6f 66 20 63 61 6c  spellfix1Eof cal
13d80 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
13d90 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72   spellfix1Filter
13da0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
13db0 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 0a 20  _cursor *cur, . 
13dc0 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e   int idxNum, con
13dd0 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c  st char *idxStr,
13de0 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  .  int argc, sql
13df0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
13e00 76 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  v.){.  spellfix1
13e10 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
13e20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
13e30 72 20 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20 72  r *)cur;.  int r
13e40 63 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 20  c;.  if( idxNum 
13e50 26 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  & 1 ){.    rc = 
13e60 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46  spellfix1FilterF
13e70 6f 72 4d 61 74 63 68 28 70 43 75 72 2c 20 69 64  orMatch(pCur, id
13e80 78 4e 75 6d 2c 20 61 72 67 63 2c 20 61 72 67 76  xNum, argc, argv
13e90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13ea0 72 63 20 3d 20 73 70 65 6c 6c 66 69 78 31 46 69  rc = spellfix1Fi
13eb0 6c 74 65 72 46 6f 72 46 75 6c 6c 53 63 61 6e 28  lterForFullScan(
13ec0 70 43 75 72 2c 20 69 64 78 4e 75 6d 2c 20 61 72  pCur, idxNum, ar
13ed0 67 63 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 20  gc, argv);.  }. 
13ee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
13ef0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 61 20  /*.** Advance a 
13f00 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 6e 65  cursor to its ne
13f10 78 74 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  xt row of output
13f20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13f30 70 65 6c 6c 66 69 78 31 4e 65 78 74 28 73 71 6c  pellfix1Next(sql
13f40 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
13f50 20 2a 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66   *cur){.  spellf
13f60 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
13f70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75   = (spellfix1_cu
13f80 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 69 6e  rsor *)cur;.  in
13f90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13fa0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 52  ;.  if( pCur->iR
13fb0 6f 77 20 3c 20 70 43 75 72 2d 3e 6e 52 6f 77 20  ow < pCur->nRow 
13fc0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
13fd0 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20  >pFullScan ){.  
13fe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13ff0 5f 73 74 65 70 28 70 43 75 72 2d 3e 70 46 75 6c  _step(pCur->pFul
14000 6c 53 63 61 6e 29 3b 0a 20 20 20 20 20 20 69 66  lScan);.      if
14010 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc!=SQLITE_ROW
14020 20 29 20 70 43 75 72 2d 3e 69 52 6f 77 20 3d 20   ) pCur->iRow = 
14030 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20  pCur->nRow;.    
14040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14050 5f 52 4f 57 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  _ROW || rc==SQLI
14060 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
14070 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
14080 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
14090 3e 69 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20  >iRow++;.    }. 
140a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
140b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
140c0 54 52 55 45 20 69 66 20 77 65 20 61 72 65 20 61  TRUE if we are a
140d0 74 20 74 68 65 20 65 6e 64 2d 6f 66 2d 66 69 6c  t the end-of-fil
140e0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
140f0 73 70 65 6c 6c 66 69 78 31 45 6f 66 28 73 71 6c  spellfix1Eof(sql
14100 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
14110 20 2a 63 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66   *cur){.  spellf
14120 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72  ix1_cursor *pCur
14130 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63 75   = (spellfix1_cu
14140 72 73 6f 72 20 2a 29 63 75 72 3b 0a 20 20 72 65  rsor *)cur;.  re
14150 74 75 72 6e 20 70 43 75 72 2d 3e 69 52 6f 77 3e  turn pCur->iRow>
14160 3d 70 43 75 72 2d 3e 6e 52 6f 77 3b 0a 7d 0a 0a  =pCur->nRow;.}..
14170 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 63 6f 6c  /*.** Return col
14180 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 75  umns from the cu
14190 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74  rrent row..*/.st
141a0 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69  atic int spellfi
141b0 78 31 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69  x1Column(.  sqli
141c0 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
141d0 2a 63 75 72 2c 0a 20 20 73 71 6c 69 74 65 33 5f  *cur,.  sqlite3_
141e0 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
141f0 69 6e 74 20 69 0a 29 7b 0a 20 20 73 70 65 6c 6c  int i.){.  spell
14200 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43 75  fix1_cursor *pCu
14210 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 63  r = (spellfix1_c
14220 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66  ursor*)cur;.  if
14230 28 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  ( pCur->pFullSca
14240 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 69 3c 3d  n ){.    if( i<=
14250 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c 41 4e  SPELLFIX_COL_LAN
14260 47 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  GID ){.      sql
14270 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
14280 65 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 63  e(ctx, sqlite3_c
14290 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 43 75 72  olumn_value(pCur
142a0 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 69 29 29  ->pFullScan, i))
142b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
142c0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
142d0 74 5f 6e 75 6c 6c 28 63 74 78 29 3b 0a 20 20 20  t_null(ctx);.   
142e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   }.    return SQ
142f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
14300 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20  witch( i ){.    
14310 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  case SPELLFIX_CO
14320 4c 5f 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20  L_WORD: {.      
14330 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
14340 65 78 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 61  ext(ctx, pCur->a
14350 5b 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a 57 6f  [pCur->iRow].zWo
14360 72 64 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  rd, -1, SQLITE_S
14370 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72  TATIC);.      br
14380 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
14390 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ase SPELLFIX_COL
143a0 5f 52 41 4e 4b 3a 20 7b 0a 20 20 20 20 20 20 73  _RANK: {.      s
143b0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
143c0 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70  t(ctx, pCur->a[p
143d0 43 75 72 2d 3e 69 52 6f 77 5d 2e 69 52 61 6e 6b  Cur->iRow].iRank
143e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
143f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14400 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49 53 54  PELLFIX_COL_DIST
14410 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ANCE: {.      sq
14420 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
14430 28 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43  (ctx, pCur->a[pC
14440 75 72 2d 3e 69 52 6f 77 5d 2e 69 44 69 73 74 61  ur->iRow].iDista
14450 6e 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  nce);.      brea
14460 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14470 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4c  e SPELLFIX_COL_L
14480 41 4e 47 49 44 3a 20 7b 0a 20 20 20 20 20 20 73  ANGID: {.      s
14490 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
144a0 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 69 4c 61  t(ctx, pCur->iLa
144b0 6e 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ng);.      break
144c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
144d0 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43   SPELLFIX_COL_SC
144e0 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ORE: {.      sql
144f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
14500 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b 70 43 75  ctx, pCur->a[pCu
14510 72 2d 3e 69 52 6f 77 5d 2e 69 53 63 6f 72 65 29  r->iRow].iScore)
14520 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14530 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50     }.    case SP
14540 45 4c 4c 46 49 58 5f 43 4f 4c 5f 4d 41 54 43 48  ELLFIX_COL_MATCH
14550 4c 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  LEN: {.      int
14560 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20 70 43 75   iMatchlen = pCu
14570 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d  r->a[pCur->iRow]
14580 2e 69 4d 61 74 63 68 6c 65 6e 3b 0a 20 20 20 20  .iMatchlen;.    
14590 20 20 69 66 28 20 69 4d 61 74 63 68 6c 65 6e 3c    if( iMatchlen<
145a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
145b0 20 6e 50 61 74 74 65 72 6e 20 3d 20 28 69 6e 74   nPattern = (int
145c0 29 73 74 72 6c 65 6e 28 70 43 75 72 2d 3e 7a 50  )strlen(pCur->zP
145d0 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 20  attern);.       
145e0 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 70   char *zWord = p
145f0 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f  Cur->a[pCur->iRo
14600 77 5d 2e 7a 57 6f 72 64 3b 0a 20 20 20 20 20 20  w].zWord;.      
14610 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 28 69    int nWord = (i
14620 6e 74 29 73 74 72 6c 65 6e 28 7a 57 6f 72 64 29  nt)strlen(zWord)
14630 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
14640 50 61 74 74 65 72 6e 3e 30 20 26 26 20 70 43 75  Pattern>0 && pCu
14650 72 2d 3e 7a 50 61 74 74 65 72 6e 5b 6e 50 61 74  r->zPattern[nPat
14660 74 65 72 6e 2d 31 5d 3d 3d 27 2a 27 20 29 7b 0a  tern-1]=='*' ){.
14670 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
14680 7a 54 72 61 6e 73 6c 69 74 3b 0a 20 20 20 20 20  zTranslit;.     
14690 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
146a0 20 20 20 20 20 20 20 20 7a 54 72 61 6e 73 6c 69          zTransli
146b0 74 20 3d 20 28 63 68 61 72 20 2a 29 74 72 61 6e  t = (char *)tran
146c0 73 6c 69 74 65 72 61 74 65 28 28 75 6e 73 69 67  sliterate((unsig
146d0 6e 65 64 20 63 68 61 72 20 2a 29 7a 57 6f 72 64  ned char *)zWord
146e0 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20 20 20  , nWord);.      
146f0 20 20 20 20 69 66 28 20 21 7a 54 72 61 6e 73 6c      if( !zTransl
14700 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
14710 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
14720 20 20 20 20 72 65 73 20 3d 20 65 64 69 74 64 69      res = editdi
14730 73 74 31 28 70 43 75 72 2d 3e 7a 50 61 74 74 65  st1(pCur->zPatte
14740 72 6e 2c 20 7a 54 72 61 6e 73 6c 69 74 2c 20 26  rn, zTranslit, &
14750 69 4d 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20  iMatchlen);.    
14760 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
14770 65 65 28 7a 54 72 61 6e 73 6c 69 74 29 3b 0a 20  ee(zTranslit);. 
14780 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73           if( res
14790 3c 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <0 ) return SQLI
147a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
147b0 20 20 20 20 69 4d 61 74 63 68 6c 65 6e 20 3d 20      iMatchlen = 
147c0 74 72 61 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61 72  translen_to_char
147d0 6c 65 6e 28 7a 57 6f 72 64 2c 20 6e 57 6f 72 64  len(zWord, nWord
147e0 2c 20 69 4d 61 74 63 68 6c 65 6e 29 3b 0a 20 20  , iMatchlen);.  
147f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14800 20 20 20 20 20 20 20 69 4d 61 74 63 68 6c 65 6e         iMatchlen
14810 20 3d 20 75 74 66 38 43 68 61 72 6c 65 6e 28 7a   = utf8Charlen(z
14820 57 6f 72 64 2c 20 6e 57 6f 72 64 29 3b 0a 20 20  Word, nWord);.  
14830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
14850 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 69  esult_int(ctx, i
14860 4d 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 20  Matchlen);.     
14870 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14880 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f    case SPELLFIX_
14890 43 4f 4c 5f 50 48 4f 4e 45 48 41 53 48 3a 20 7b  COL_PHONEHASH: {
148a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
148b0 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20  esult_text(ctx, 
148c0 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52  pCur->a[pCur->iR
148d0 6f 77 5d 2e 7a 48 61 73 68 2c 20 2d 31 2c 20 53  ow].zHash, -1, S
148e0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
148f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14900 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c  }.    case SPELL
14910 46 49 58 5f 43 4f 4c 5f 54 4f 50 3a 20 7b 0a 20  FIX_COL_TOP: {. 
14920 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
14930 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75  ult_int(ctx, pCu
14940 72 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20  r->iTop);.      
14950 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14960 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43   case SPELLFIX_C
14970 4f 4c 5f 53 43 4f 50 45 3a 20 7b 0a 20 20 20 20  OL_SCOPE: {.    
14980 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14990 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d 3e  _int(ctx, pCur->
149a0 69 53 63 6f 70 65 29 3b 0a 20 20 20 20 20 20 62  iScope);.      b
149b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
149c0 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f  case SPELLFIX_CO
149d0 4c 5f 53 52 43 48 43 4e 54 3a 20 7b 0a 20 20 20  L_SRCHCNT: {.   
149e0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
149f0 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75 72 2d  t_int(ctx, pCur-
14a00 3e 6e 53 65 61 72 63 68 29 3b 0a 20 20 20 20 20  >nSearch);.     
14a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14a20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
14a30 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
14a40 74 5f 6e 75 6c 6c 28 63 74 78 29 3b 0a 20 20 20  t_null(ctx);.   
14a50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14a60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
14a70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14a80 20 54 68 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73   The rowid..*/.s
14a90 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
14aa0 69 78 31 52 6f 77 69 64 28 73 71 6c 69 74 65 33  ix1Rowid(sqlite3
14ab0 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
14ac0 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
14ad0 2a 70 52 6f 77 69 64 29 7b 0a 20 20 73 70 65 6c  *pRowid){.  spel
14ae0 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 70 43  lfix1_cursor *pC
14af0 75 72 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f  ur = (spellfix1_
14b00 63 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69  cursor*)cur;.  i
14b10 66 28 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63  f( pCur->pFullSc
14b20 61 6e 20 29 7b 0a 20 20 20 20 2a 70 52 6f 77 69  an ){.    *pRowi
14b30 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
14b40 6d 6e 5f 69 6e 74 36 34 28 70 43 75 72 2d 3e 70  mn_int64(pCur->p
14b50 46 75 6c 6c 53 63 61 6e 2c 20 34 29 3b 0a 20 20  FullScan, 4);.  
14b60 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 6f 77  }else{.    *pRow
14b70 69 64 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75  id = pCur->a[pCu
14b80 72 2d 3e 69 52 6f 77 5d 2e 69 52 6f 77 69 64 3b  r->iRow].iRowid;
14b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
14ba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14bb0 2a 20 54 68 65 20 78 55 70 64 61 74 65 28 29 20  * The xUpdate() 
14bc0 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69  method..*/.stati
14bd0 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 55  c int spellfix1U
14be0 70 64 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33  pdate(.  sqlite3
14bf0 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 0a 20 20  _vtab *pVTab,.  
14c00 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
14c10 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
14c20 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ,.  sqlite_int64
14c30 20 2a 70 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e   *pRowid.){.  in
14c40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14c50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
14c60 34 20 72 6f 77 69 64 2c 20 6e 65 77 52 6f 77 69  4 rowid, newRowi
14c70 64 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76  d;.  spellfix1_v
14c80 74 61 62 20 2a 70 20 3d 20 28 73 70 65 6c 6c 66  tab *p = (spellf
14c90 69 78 31 5f 76 74 61 62 2a 29 70 56 54 61 62 3b  ix1_vtab*)pVTab;
14ca0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
14cb0 20 70 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 61   p->db;..  if( a
14cc0 72 67 63 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  rgc==1 ){.    /*
14cd0 20 41 20 64 65 6c 65 74 65 20 6f 70 65 72 61 74   A delete operat
14ce0 69 6f 6e 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  ion on the rowid
14cf0 20 67 69 76 65 6e 20 62 79 20 61 72 67 76 5b 30   given by argv[0
14d00 5d 20 2a 2f 0a 20 20 20 20 72 6f 77 69 64 20 3d  ] */.    rowid =
14d10 20 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74   *pRowid = sqlit
14d20 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
14d30 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 73 70 65  rgv[0]);.    spe
14d40 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72 63  llfix1DbExec(&rc
14d50 2c 20 64 62 2c 20 22 44 45 4c 45 54 45 20 46 52  , db, "DELETE FR
14d60 4f 4d 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76  OM \"%w\".\"%w_v
14d70 6f 63 61 62 5c 22 20 22 0a 20 20 20 20 20 20 20  ocab\" ".       
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d90 20 20 20 20 22 20 57 48 45 52 45 20 69 64 3d 25      " WHERE id=%
14da0 6c 6c 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lld",.          
14db0 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61          p->zDbNa
14dc0 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
14dd0 65 2c 20 72 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  e, rowid);.  }el
14de0 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  se{.    const un
14df0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 57 6f  signed char *zWo
14e00 72 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  rd = sqlite3_val
14e10 75 65 5f 74 65 78 74 28 61 72 67 76 5b 53 50 45  ue_text(argv[SPE
14e20 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32  LLFIX_COL_WORD+2
14e30 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72  ]);.    int nWor
14e40 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
14e50 65 5f 62 79 74 65 73 28 61 72 67 76 5b 53 50 45  e_bytes(argv[SPE
14e60 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 2b 32  LLFIX_COL_WORD+2
14e70 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 6e  ]);.    int iLan
14e80 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  g = sqlite3_valu
14e90 65 5f 69 6e 74 28 61 72 67 76 5b 53 50 45 4c 4c  e_int(argv[SPELL
14ea0 46 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 2b 32  FIX_COL_LANGID+2
14eb0 5d 29 3b 0a 20 20 20 20 69 6e 74 20 69 52 61 6e  ]);.    int iRan
14ec0 6b 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  k = sqlite3_valu
14ed0 65 5f 69 6e 74 28 61 72 67 76 5b 53 50 45 4c 4c  e_int(argv[SPELL
14ee0 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b 2b 32 5d 29  FIX_COL_RANK+2])
14ef0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
14f00 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 6f 75 6e  gned char *zSoun
14f10 64 73 6c 69 6b 65 20 3d 0a 20 20 20 20 20 20 20  dslike =.       
14f20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
14f30 65 5f 74 65 78 74 28 61 72 67 76 5b 53 50 45 4c  e_text(argv[SPEL
14f40 4c 46 49 58 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c  LFIX_COL_SOUNDSL
14f50 49 4b 45 2b 32 5d 29 3b 0a 20 20 20 20 69 6e 74  IKE+2]);.    int
14f60 20 6e 53 6f 75 6e 64 73 6c 69 6b 65 20 3d 20 73   nSoundslike = s
14f70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
14f80 65 73 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58  es(argv[SPELLFIX
14f90 5f 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b  _COL_SOUNDSLIKE+
14fa0 32 5d 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2]);.    char *z
14fb0 4b 31 2c 20 2a 7a 4b 32 3b 0a 20 20 20 20 69 6e  K1, *zK2;.    in
14fc0 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 63 3b  t i;.    char c;
14fd0 0a 0a 20 20 20 20 69 66 28 20 7a 57 6f 72 64 3d  ..    if( zWord=
14fe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
14ff0 6e 73 65 72 74 73 20 6f 66 20 74 68 65 20 66 6f  nserts of the fo
15000 72 6d 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  rm:  INSERT INTO
15010 20 74 61 62 6c 65 28 63 6f 6d 6d 61 6e 64 29 20   table(command) 
15020 56 41 4c 55 45 53 28 27 78 79 7a 7a 79 27 29 3b  VALUES('xyzzy');
15030 0a 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20  .      ** cause 
15040 7a 57 6f 72 64 20 74 6f 20 62 65 20 4e 55 4c 4c  zWord to be NULL
15050 2c 20 73 6f 20 77 65 20 6c 6f 6f 6b 20 61 74 20  , so we look at 
15060 74 68 65 20 22 63 6f 6d 6d 61 6e 64 22 20 63 6f  the "command" co
15070 6c 75 6d 6e 20 74 6f 20 73 65 65 0a 20 20 20 20  lumn to see.    
15080 20 20 2a 2a 20 77 68 61 74 20 73 70 65 63 69 61    ** what specia
15090 6c 20 61 63 74 69 6f 6e 73 20 74 6f 20 74 61 6b  l actions to tak
150a0 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
150b0 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 0a 20   char *zCmd = . 
150c0 20 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63          (const c
150d0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
150e0 75 65 5f 74 65 78 74 28 61 72 67 76 5b 53 50 45  ue_text(argv[SPE
150f0 4c 4c 46 49 58 5f 43 4f 4c 5f 43 4f 4d 4d 41 4e  LLFIX_COL_COMMAN
15100 44 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  D+2]);.      if(
15110 20 7a 43 6d 64 3d 3d 30 20 29 7b 0a 20 20 20 20   zCmd==0 ){.    
15120 20 20 20 20 70 56 54 61 62 2d 3e 7a 45 72 72 4d      pVTab->zErrM
15130 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
15140 69 6e 74 66 28 22 4e 4f 54 20 4e 55 4c 4c 20 63  intf("NOT NULL c
15150 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
15160 3a 20 25 73 2e 77 6f 72 64 22 2c 0a 20 20 20 20  : %s.word",.    
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15190 20 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61       p->zTableNa
151a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  me);.        ret
151b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
151c0 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3b 0a 20  RAINT_NOTNULL;. 
151d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
151e0 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 72 65   strcmp(zCmd,"re
151f0 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  set")==0 ){.    
15200 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65      /* Reset the
15210 20 20 65 64 69 74 20 63 6f 73 74 20 74 61 62 6c    edit cost tabl
15220 65 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6f  e (if there is o
15230 6e 65 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ne). */.        
15240 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44  editDist3ConfigD
15250 65 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69 67  elete(p->pConfig
15260 33 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  3);.        p->p
15270 43 6f 6e 66 69 67 33 20 3d 20 30 3b 0a 20 20 20  Config3 = 0;.   
15280 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15290 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
152a0 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
152b0 28 7a 43 6d 64 2c 22 65 64 69 74 5f 63 6f 73 74  (zCmd,"edit_cost
152c0 5f 74 61 62 6c 65 3d 22 2c 31 36 29 3d 3d 30 20  _table=",16)==0 
152d0 29 7b 0a 20 20 20 20 20 20 20 20 65 64 69 74 44  ){.        editD
152e0 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74 65  ist3ConfigDelete
152f0 28 70 2d 3e 70 43 6f 6e 66 69 67 33 29 3b 0a 20  (p->pConfig3);. 
15300 20 20 20 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69         p->pConfi
15310 67 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  g3 = 0;.        
15320 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
15330 7a 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20 20 20  zCostTable);.   
15340 20 20 20 20 20 70 2d 3e 7a 43 6f 73 74 54 61 62       p->zCostTab
15350 6c 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 44 65  le = spellfix1De
15360 71 75 6f 74 65 28 7a 43 6d 64 2b 31 36 29 3b 0a  quote(zCmd+16);.
15370 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a          if( p->z
15380 43 6f 73 74 54 61 62 6c 65 3d 3d 30 20 29 20 72  CostTable==0 ) r
15390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
153a0 45 4d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  EM;.        if( 
153b0 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 5b 30 5d  p->zCostTable[0]
153c0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73  ==0 || sqlite3_s
153d0 74 72 69 63 6d 70 28 70 2d 3e 7a 43 6f 73 74 54  tricmp(p->zCostT
153e0 61 62 6c 65 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20  able,"null")==0 
153f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
15400 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f  ite3_free(p->zCo
15410 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  stTable);.      
15420 20 20 20 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c      p->zCostTabl
15430 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
15440 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
15460 20 7d 0a 20 20 20 20 20 20 70 56 54 61 62 2d 3e   }.      pVTab->
15470 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
15480 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 6b 6e 6f  3_mprintf("unkno
15490 77 6e 20 76 61 6c 75 65 20 66 6f 72 20 25 73 2e  wn value for %s.
154a0 63 6f 6d 6d 61 6e 64 3a 20 5c 22 25 77 5c 22 22  command: \"%w\""
154b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154d0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 61 62           p->zTab
154e0 6c 65 4e 61 6d 65 2c 20 7a 43 6d 64 29 3b 0a 20  leName, zCmd);. 
154f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15500 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
15510 20 20 20 20 69 66 28 20 69 52 61 6e 6b 3c 31 20      if( iRank<1 
15520 29 20 69 52 61 6e 6b 20 3d 20 31 3b 0a 20 20 20  ) iRank = 1;.   
15530 20 69 66 28 20 7a 53 6f 75 6e 64 73 6c 69 6b 65   if( zSoundslike
15540 20 29 7b 0a 20 20 20 20 20 20 7a 4b 31 20 3d 20   ){.      zK1 = 
15550 28 63 68 61 72 2a 29 74 72 61 6e 73 6c 69 74 65  (char*)translite
15560 72 61 74 65 28 7a 53 6f 75 6e 64 73 6c 69 6b 65  rate(zSoundslike
15570 2c 20 6e 53 6f 75 6e 64 73 6c 69 6b 65 29 3b 0a  , nSoundslike);.
15580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15590 20 7a 4b 31 20 3d 20 28 63 68 61 72 2a 29 74 72   zK1 = (char*)tr
155a0 61 6e 73 6c 69 74 65 72 61 74 65 28 7a 57 6f 72  ansliterate(zWor
155b0 64 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20 7d  d, nWord);.    }
155c0 0a 20 20 20 20 69 66 28 20 7a 4b 31 3d 3d 30 20  .    if( zK1==0 
155d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
155e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 66 6f 72 28 69  NOMEM;.    for(i
155f0 3d 30 3b 20 28 63 20 3d 20 7a 4b 31 5b 69 5d 29  =0; (c = zK1[i])
15600 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
15610 20 20 69 66 28 20 63 3e 3d 27 41 27 20 26 26 20    if( c>='A' && 
15620 63 3c 3d 27 5a 27 20 29 20 7a 4b 31 5b 69 5d 20  c<='Z' ) zK1[i] 
15630 2b 3d 20 27 61 27 20 2d 20 27 41 27 3b 0a 20 20  += 'a' - 'A';.  
15640 20 20 7d 0a 20 20 20 20 7a 4b 32 20 3d 20 28 63    }.    zK2 = (c
15650 68 61 72 2a 29 70 68 6f 6e 65 74 69 63 48 61 73  har*)phoneticHas
15660 68 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  h((const unsigne
15670 64 20 63 68 61 72 2a 29 7a 4b 31 2c 20 69 29 3b  d char*)zK1, i);
15680 0a 20 20 20 20 69 66 28 20 7a 4b 32 3d 3d 30 20  .    if( zK2==0 
15690 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
156a0 5f 66 72 65 65 28 7a 4b 31 29 3b 0a 20 20 20 20  _free(zK1);.    
156b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
156c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
156d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c   if( sqlite3_val
156e0 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29  ue_type(argv[0])
156f0 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b  ==SQLITE_NULL ){
15700 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
15710 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
15720 67 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[1])==SQLITE_N
15730 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ULL ){.        s
15740 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26  pellfix1DbExec(&
15750 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 20 20  rc, db,.        
15760 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
15770 4e 54 4f 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f  NTO \"%w\".\"%w_
15780 76 6f 63 61 62 5c 22 28 72 61 6e 6b 2c 6c 61 6e  vocab\"(rank,lan
15790 67 69 64 2c 77 6f 72 64 2c 6b 31 2c 6b 32 29 20  gid,word,k1,k2) 
157a0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
157b0 20 22 56 41 4c 55 45 53 28 25 64 2c 25 64 2c 25   "VALUES(%d,%d,%
157c0 51 2c 25 51 2c 25 51 29 22 2c 0a 20 20 20 20 20  Q,%Q,%Q)",.     
157d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62            p->zDb
157e0 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e  Name, p->zTableN
157f0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
15800 20 20 20 20 69 52 61 6e 6b 2c 20 69 4c 61 6e 67      iRank, iLang
15810 2c 20 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 4b  , zWord, zK1, zK
15820 32 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  2.        );.   
15830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15840 20 20 6e 65 77 52 6f 77 69 64 20 3d 20 73 71 6c    newRowid = sql
15850 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
15860 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20  (argv[1]);.     
15870 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78     spellfix1DbEx
15880 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20  ec(&rc, db,.    
15890 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
158a0 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 2e 5c  RT INTO \"%w\".\
158b0 22 25 77 5f 76 6f 63 61 62 5c 22 28 69 64 2c 72  "%w_vocab\"(id,r
158c0 61 6e 6b 2c 6c 61 6e 67 69 64 2c 77 6f 72 64 2c  ank,langid,word,
158d0 6b 31 2c 6b 32 29 20 22 0a 20 20 20 20 20 20 20  k1,k2) ".       
158e0 20 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28          "VALUES(
158f0 25 6c 6c 64 2c 25 64 2c 25 64 2c 25 51 2c 25 51  %lld,%d,%d,%Q,%Q
15900 2c 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20  ,%Q)",.         
15910 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65        p->zDbName
15920 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c  , p->zTableName,
15930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15940 6e 65 77 52 6f 77 69 64 2c 20 69 52 61 6e 6b 2c  newRowid, iRank,
15950 20 69 4c 61 6e 67 2c 20 7a 57 6f 72 64 2c 20 7a   iLang, zWord, z
15960 4b 31 2c 20 7a 4b 32 0a 20 20 20 20 20 20 20 20  K1, zK2.        
15970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15980 20 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74   *pRowid = sqlit
15990 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
159a0 6f 77 69 64 28 64 62 29 3b 0a 20 20 20 20 7d 65  owid(db);.    }e
159b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 6f 77 69 64  lse{.      rowid
159c0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
159d0 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29 3b  _int64(argv[0]);
159e0 0a 20 20 20 20 20 20 6e 65 77 52 6f 77 69 64 20  .      newRowid 
159f0 3d 20 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69  = *pRowid = sqli
15a00 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
15a10 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20  argv[1]);.      
15a20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28  spellfix1DbExec(
15a30 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 20  &rc, db,.       
15a40 20 20 20 20 20 20 22 55 50 44 41 54 45 20 5c 22        "UPDATE \"
15a50 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c  %w\".\"%w_vocab\
15a60 22 20 53 45 54 20 69 64 3d 25 6c 6c 64 2c 20 72  " SET id=%lld, r
15a70 61 6e 6b 3d 25 64 2c 20 6c 61 6e 67 69 64 3d 25  ank=%d, langid=%
15a80 64 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  d,".            
15a90 20 22 20 77 6f 72 64 3d 25 51 2c 20 6b 31 3d 25   " word=%Q, k1=%
15aa0 51 2c 20 6b 32 3d 25 51 20 57 48 45 52 45 20 69  Q, k2=%Q WHERE i
15ab0 64 3d 25 6c 6c 64 22 2c 0a 20 20 20 20 20 20 20  d=%lld",.       
15ac0 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65        p->zDbName
15ad0 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c  , p->zTableName,
15ae0 20 6e 65 77 52 6f 77 69 64 2c 20 69 52 61 6e 6b   newRowid, iRank
15af0 2c 20 69 4c 61 6e 67 2c 0a 20 20 20 20 20 20 20  , iLang,.       
15b00 20 20 20 20 20 20 7a 57 6f 72 64 2c 20 7a 4b 31        zWord, zK1
15b10 2c 20 7a 4b 32 2c 20 72 6f 77 69 64 0a 20 20 20  , zK2, rowid.   
15b20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
15b30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4b 31  sqlite3_free(zK1
15b40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15b50 72 65 65 28 7a 4b 32 29 3b 0a 20 20 7d 0a 20 20  ree(zK2);.  }.  
15b60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15b70 0a 2a 2a 20 52 65 6e 61 6d 65 20 74 68 65 20 73  .** Rename the s
15b80 70 65 6c 6c 66 69 78 31 20 74 61 62 6c 65 2e 0a  pellfix1 table..
15b90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 70  */.static int sp
15ba0 65 6c 6c 66 69 78 31 52 65 6e 61 6d 65 28 73 71  ellfix1Rename(sq
15bb0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54 61  lite3_vtab *pVTa
15bc0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
15bd0 4e 65 77 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78  New){.  spellfix
15be0 31 5f 76 74 61 62 20 2a 70 20 3d 20 28 73 70 65  1_vtab *p = (spe
15bf0 6c 6c 66 69 78 31 5f 76 74 61 62 2a 29 70 56 54  llfix1_vtab*)pVT
15c00 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
15c10 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
15c20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15c30 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d  .  char *zNewNam
15c40 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
15c50 6e 74 66 28 22 25 73 22 2c 20 7a 4e 65 77 29 3b  ntf("%s", zNew);
15c60 0a 20 20 69 66 28 20 7a 4e 65 77 4e 61 6d 65 3d  .  if( zNewName=
15c70 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
15c80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15c90 20 7d 0a 20 20 73 70 65 6c 6c 66 69 78 31 44 62   }.  spellfix1Db
15ca0 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 0a 20  Exec(&rc, db, . 
15cb0 20 20 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45      "ALTER TABLE
15cc0 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63   \"%w\".\"%w_voc
15cd0 61 62 5c 22 20 52 45 4e 41 4d 45 20 54 4f 20 5c  ab\" RENAME TO \
15ce0 22 25 77 5f 76 6f 63 61 62 5c 22 22 2c 0a 20 20  "%w_vocab\"",.  
15cf0 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70     p->zDbName, p
15d00 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 4e  ->zTableName, zN
15d10 65 77 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 69 66  ewName.  );.  if
15d20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15d30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
15d40 72 65 65 28 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  ree(p->zTableNam
15d50 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 54 61 62 6c  e);.    p->zTabl
15d60 65 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65  eName = zNewName
15d70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
15d80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77  qlite3_free(zNew
15d90 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Name);.  }.  ret
15da0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
15db0 2a 20 41 20 76 69 72 74 75 61 6c 20 74 61 62 6c  * A virtual tabl
15dc0 65 20 6d 6f 64 75 6c 65 20 74 68 61 74 20 70 72  e module that pr
15dd0 6f 76 69 64 65 73 20 66 75 7a 7a 79 20 73 65 61  ovides fuzzy sea
15de0 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  rch..*/.static s
15df0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 73 70  qlite3_module sp
15e00 65 6c 6c 66 69 78 31 4d 6f 64 75 6c 65 20 3d 20  ellfix1Module = 
15e10 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  {.  0,          
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e30 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73 70  iVersion */.  sp
15e40 65 6c 6c 66 69 78 31 43 72 65 61 74 65 2c 20 20  ellfix1Create,  
15e50 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
15e60 65 20 2d 20 68 61 6e 64 6c 65 20 43 52 45 41 54  e - handle CREAT
15e70 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
15e80 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 6f  */.  spellfix1Co
15e90 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  nnect,        /*
15ea0 20 78 43 6f 6e 6e 65 63 74 20 2d 20 72 65 63 6f   xConnect - reco
15eb0 6e 6e 65 63 74 65 64 20 74 6f 20 61 6e 20 65 78  nnected to an ex
15ec0 69 73 74 69 6e 67 20 74 61 62 6c 65 20 2a 2f 0a  isting table */.
15ed0 20 20 73 70 65 6c 6c 66 69 78 31 42 65 73 74 49    spellfix1BestI
15ee0 6e 64 65 78 2c 20 20 20 20 20 20 2f 2a 20 78 42  ndex,      /* xB
15ef0 65 73 74 49 6e 64 65 78 20 2d 20 66 69 67 75 72  estIndex - figur
15f00 65 20 6f 75 74 20 68 6f 77 20 74 6f 20 64 6f 20  e out how to do 
15f10 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 70 65  a query */.  spe
15f20 6c 6c 66 69 78 31 44 69 73 63 6f 6e 6e 65 63 74  llfix1Disconnect
15f30 2c 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e  ,     /* xDiscon
15f40 6e 65 63 74 20 2d 20 63 6c 6f 73 65 20 61 20 63  nect - close a c
15f50 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73  onnection */.  s
15f60 70 65 6c 6c 66 69 78 31 44 65 73 74 72 6f 79 2c  pellfix1Destroy,
15f70 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74          /* xDest
15f80 72 6f 79 20 2d 20 68 61 6e 64 6c 65 20 44 52 4f  roy - handle DRO
15f90 50 20 54 41 42 4c 45 20 2a 2f 0a 20 20 73 70 65  P TABLE */.  spe
15fa0 6c 6c 66 69 78 31 4f 70 65 6e 2c 20 20 20 20 20  llfix1Open,     
15fb0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
15fc0 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
15fd0 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 6c 6f  /.  spellfix1Clo
15fe0 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
15ff0 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61  xClose - close a
16000 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 70 65   cursor */.  spe
16010 6c 6c 66 69 78 31 46 69 6c 74 65 72 2c 20 20 20  llfix1Filter,   
16020 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72        /* xFilter
16030 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61   - configure sca
16040 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  n constraints */
16050 0a 20 20 73 70 65 6c 6c 66 69 78 31 4e 65 78 74  .  spellfix1Next
16060 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
16070 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61  Next - advance a
16080 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 70 65   cursor */.  spe
16090 6c 6c 66 69 78 31 45 6f 66 2c 20 20 20 20 20 20  llfix1Eof,      
160a0 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20        /* xEof - 
160b0 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66  check for end of
160c0 20 73 63 61 6e 20 2a 2f 0a 20 20 73 70 65 6c 6c   scan */.  spell
160d0 66 69 78 31 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  fix1Column,     
160e0 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d      /* xColumn -
160f0 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
16100 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64 2c 20  spellfix1Rowid, 
16110 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
16120 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
16130 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 55 70 64  /.  spellfix1Upd
16140 61 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ate,         /* 
16150 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20  xUpdate */.  0, 
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20        /* xBegin 
16180 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161a0 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20   xSync */.  0,  
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20       /* xCommit 
161d0 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161f0 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20   xRollback */.  
16200 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
16210 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
16220 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 70 65  dMethod */.  spe
16230 6c 6c 66 69 78 31 52 65 6e 61 6d 65 2c 20 20 20  llfix1Rename,   
16240 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
16250 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   */.};../*.** Re
16260 67 69 73 74 65 72 20 74 68 65 20 76 61 72 69 6f  gister the vario
16270 75 73 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  us functions and
16280 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
16290 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
162a0 74 20 73 70 65 6c 6c 66 69 78 31 52 65 67 69 73  t spellfix1Regis
162b0 74 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ter(sqlite3 *db)
162c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
162d0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
162e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
162f0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
16300 64 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 74  db, "spellfix1_t
16310 72 61 6e 73 6c 69 74 22 2c 20 31 2c 20 53 51 4c  ranslit", 1, SQL
16320 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
16350 72 61 6e 73 6c 69 74 65 72 61 74 65 53 71 6c 46  ransliterateSqlF
16360 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  unc, 0, 0);.  if
16370 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16380 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16390 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
163a0 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69  ion(db, "spellfi
163b0 78 31 5f 65 64 69 74 64 69 73 74 22 2c 20 32 2c  x1_editdist", 2,
163c0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
163d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 65 64 69 74 64 69 73 74 53 71 6c 46 75     editdistSqlFu
16400 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  nc, 0, 0);.  }. 
16410 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16420 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
16430 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
16440 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c  nction(db, "spel
16450 6c 66 69 78 31 5f 70 68 6f 6e 65 68 61 73 68 22  lfix1_phonehash"
16460 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
16470 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 20 20 20 70 68 6f 6e 65 74 69 63 48         phoneticH
164a0 61 73 68 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30  ashSqlFunc, 0, 0
164b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
164c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
164d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
164e0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
164f0 62 2c 20 22 73 70 65 6c 6c 66 69 78 31 5f 73 63  b, "spellfix1_sc
16500 72 69 70 74 63 6f 64 65 22 2c 20 31 2c 20 53 51  riptcode", 1, SQ
16510 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
16520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16540 73 63 72 69 70 74 43 6f 64 65 53 71 6c 46 75 6e  scriptCodeSqlFun
16550 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  c, 0, 0);.  }.  
16560 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16570 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
16580 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
16590 75 6c 65 28 64 62 2c 20 22 73 70 65 6c 6c 66 69  ule(db, "spellfi
165a0 78 31 22 2c 20 26 73 70 65 6c 6c 66 69 78 31 4d  x1", &spellfix1M
165b0 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  odule, 0);.  }. 
165c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
165d0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65  OK ){.    rc = e
165e0 64 69 74 44 69 73 74 33 49 6e 73 74 61 6c 6c 28  ditDist3Install(
165f0 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56  db);.  }..  /* V
16600 65 72 69 66 79 20 73 61 6e 69 74 79 20 6f 66 20  erify sanity of 
16610 74 68 65 20 74 72 61 6e 73 6c 69 74 5b 5d 20 74  the translit[] t
16620 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  able */.  for(i=
16630 30 3b 20 69 3c 73 69 7a 65 6f 66 28 74 72 61 6e  0; i<sizeof(tran
16640 73 6c 69 74 29 2f 73 69 7a 65 6f 66 28 74 72 61  slit)/sizeof(tra
16650 6e 73 6c 69 74 5b 30 5d 29 2d 31 3b 20 69 2b 2b  nslit[0])-1; i++
16660 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 74  ){.    assert( t
16670 72 61 6e 73 6c 69 74 5b 69 5d 2e 63 46 72 6f 6d  ranslit[i].cFrom
16680 3c 74 72 61 6e 73 6c 69 74 5b 69 2b 31 5d 2e 63  <translit[i+1].c
16690 46 72 6f 6d 20 29 3b 0a 20 20 7d 0a 0a 20 20 72  From );.  }..  r
166a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
166b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
166c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
166d0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 73  */../*.** Extens
166e0 69 6f 6e 20 6c 6f 61 64 20 66 75 6e 63 74 69 6f  ion load functio
166f0 6e 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49  n..*/.#ifdef _WI
16700 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64  N32.__declspec(d
16710 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66  llexport).#endif
16720 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65  .int sqlite3_spe
16730 6c 6c 66 69 78 5f 69 6e 69 74 28 0a 20 20 73 71  llfix_init(.  sq
16740 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68  lite3 *db, .  ch
16750 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a  ar **pzErrMsg, .
16760 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
16770 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41  api_routines *pA
16780 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45 5f 45  pi.){.  SQLITE_E
16790 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70  XTENSION_INIT2(p
167a0 41 70 69 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Api);.#ifndef SQ
167b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
167c0 4c 54 41 42 4c 45 0a 20 20 72 65 74 75 72 6e 20  LTABLE.  return 
167d0 73 70 65 6c 6c 66 69 78 31 52 65 67 69 73 74 65  spellfix1Registe
167e0 72 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 20 20  r(db);.#endif.  
167f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16800 3b 0a 7d 0a                                      ;.}.