/ Hex Artifact Content
Login

Artifact a4723b6aff748a417b5091b68a46443265c40f0d:


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 36 34 28 20 6e 49 6e 20 2b 20 31 20  lloc64( nIn + 1 
23f0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
2400: 74 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 63 68  t nOut = 0;.  ch
2410: 61 72 20 63 50 72 65 76 20 3d 20 30 78 37 37 3b  ar cPrev = 0x77;
2420: 0a 20 20 63 68 61 72 20 63 50 72 65 76 58 20 3d  .  char cPrevX =
2430: 20 30 78 37 37 3b 0a 20 20 63 6f 6e 73 74 20 75   0x77;.  const u
2440: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 43  nsigned char *aC
2450: 6c 61 73 73 20 3d 20 69 6e 69 74 43 6c 61 73 73  lass = initClass
2460: 3b 0a 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30  ;..  if( zOut==0
2470: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
2480: 66 28 20 6e 49 6e 3e 32 20 29 7b 0a 20 20 20 20  f( nIn>2 ){.    
2490: 73 77 69 74 63 68 28 20 7a 49 6e 5b 30 5d 20 29  switch( zIn[0] )
24a0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 27 67 27  {.      case 'g'
24b0: 3a 20 0a 20 20 20 20 20 20 63 61 73 65 20 27 6b  : .      case 'k
24c0: 27 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ': {.        if(
24d0: 20 7a 49 6e 5b 31 5d 3d 3d 27 6e 27 20 29 7b 20   zIn[1]=='n' ){ 
24e0: 7a 49 6e 2b 2b 3b 20 6e 49 6e 2d 2d 3b 20 7d 0a  zIn++; nIn--; }.
24f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2510: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49  .  for(i=0; i<nI
2520: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73  n; i++){.    uns
2530: 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 7a  igned char c = z
2540: 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 69  In[i];.    if( i
2550: 2b 31 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 20 20  +1<nIn ){.      
2560: 69 66 28 20 63 3d 3d 27 77 27 20 26 26 20 7a 49  if( c=='w' && zI
2570: 6e 5b 69 2b 31 5d 3d 3d 27 72 27 20 29 20 63 6f  n[i+1]=='r' ) co
2580: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
2590: 28 20 63 3d 3d 27 64 27 20 26 26 20 28 7a 49 6e  ( c=='d' && (zIn
25a0: 5b 69 2b 31 5d 3d 3d 27 6a 27 20 7c 7c 20 7a 49  [i+1]=='j' || zI
25b0: 6e 5b 69 2b 31 5d 3d 3d 27 67 27 29 20 29 20 63  n[i+1]=='g') ) c
25c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
25d0: 66 28 20 69 2b 32 3c 6e 49 6e 20 29 7b 0a 20 20  f( i+2<nIn ){.  
25e0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 74 27        if( c=='t'
25f0: 20 26 26 20 7a 49 6e 5b 69 2b 31 5d 3d 3d 27 63   && zIn[i+1]=='c
2600: 27 20 26 26 20 7a 49 6e 5b 69 2b 32 5d 3d 3d 27  ' && zIn[i+2]=='
2610: 68 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  h' ) continue;. 
2620: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2630: 20 63 20 3d 20 61 43 6c 61 73 73 5b 63 26 30 78   c = aClass[c&0x
2640: 37 66 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  7f];.    if( c==
2650: 43 43 4c 41 53 53 5f 53 50 41 43 45 20 29 20 63  CCLASS_SPACE ) c
2660: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2670: 20 63 3d 3d 43 43 4c 41 53 53 5f 4f 54 48 45 52   c==CCLASS_OTHER
2680: 20 26 26 20 63 50 72 65 76 21 3d 43 43 4c 41 53   && cPrev!=CCLAS
2690: 53 5f 44 49 47 49 54 20 29 20 63 6f 6e 74 69 6e  S_DIGIT ) contin
26a0: 75 65 3b 0a 20 20 20 20 61 43 6c 61 73 73 20 3d  ue;.    aClass =
26b0: 20 6d 69 64 43 6c 61 73 73 3b 0a 20 20 20 20 69   midClass;.    i
26c0: 66 28 20 63 3d 3d 43 43 4c 41 53 53 5f 56 4f 57  f( c==CCLASS_VOW
26d0: 45 4c 20 26 26 20 28 63 50 72 65 76 58 3d 3d 43  EL && (cPrevX==C
26e0: 43 4c 41 53 53 5f 52 20 7c 7c 20 63 50 72 65 76  CLASS_R || cPrev
26f0: 58 3d 3d 43 43 4c 41 53 53 5f 4c 29 20 29 7b 0a  X==CCLASS_L) ){.
2700: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2710: 20 2f 2a 20 4e 6f 20 76 6f 77 65 6c 73 20 62 65   /* No vowels be
2720: 73 69 64 65 20 4c 20 6f 72 20 52 20 2a 2f 20 0a  side L or R */ .
2730: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 63      }.    if( (c
2740: 3d 3d 43 43 4c 41 53 53 5f 52 20 7c 7c 20 63 3d  ==CCLASS_R || c=
2750: 3d 43 43 4c 41 53 53 5f 4c 29 20 26 26 20 63 50  =CCLASS_L) && cP
2760: 72 65 76 58 3d 3d 43 43 4c 41 53 53 5f 56 4f 57  revX==CCLASS_VOW
2770: 45 4c 20 29 7b 0a 20 20 20 20 20 20 20 6e 4f 75  EL ){.       nOu
2780: 74 2d 2d 3b 20 20 20 2f 2a 20 4e 6f 20 76 6f 77  t--;   /* No vow
2790: 65 6c 73 20 62 65 73 69 64 65 20 4c 20 6f 72 20  els beside L or 
27a0: 52 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  R */.    }.    c
27b0: 50 72 65 76 20 3d 20 63 3b 0a 20 20 20 20 69 66  Prev = c;.    if
27c0: 28 20 63 3d 3d 43 43 4c 41 53 53 5f 53 49 4c 45  ( c==CCLASS_SILE
27d0: 4e 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  NT ) continue;. 
27e0: 20 20 20 63 50 72 65 76 58 20 3d 20 63 3b 0a 20     cPrevX = c;. 
27f0: 20 20 20 63 20 3d 20 63 6c 61 73 73 4e 61 6d 65     c = className
2800: 5b 63 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [c];.    assert(
2810: 20 6e 4f 75 74 3e 3d 30 20 29 3b 0a 20 20 20 20   nOut>=0 );.    
2820: 69 66 28 20 6e 4f 75 74 3d 3d 30 20 7c 7c 20 63  if( nOut==0 || c
2830: 21 3d 7a 4f 75 74 5b 6e 4f 75 74 2d 31 5d 20 29  !=zOut[nOut-1] )
2840: 20 7a 4f 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20   zOut[nOut++] = 
2850: 63 3b 0a 20 20 7d 0a 20 20 7a 4f 75 74 5b 6e 4f  c;.  }.  zOut[nO
2860: 75 74 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ut] = 0;.  retur
2870: 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zOut;.}../*.**
2880: 20 54 68 69 73 20 69 73 20 61 6e 20 53 51 4c 20   This is an SQL 
2890: 66 75 6e 63 74 69 6f 6e 20 77 72 61 70 70 65 72  function wrapper
28a0: 20 61 72 6f 75 6e 64 20 70 68 6f 6e 65 74 69 63   around phonetic
28b0: 48 61 73 68 28 29 2e 20 20 53 65 65 0a 2a 2a 20  Hash().  See.** 
28c0: 74 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20  the description 
28d0: 6f 66 20 70 68 6f 6e 65 74 69 63 48 61 73 68 28  of phoneticHash(
28e0: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
28f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
2900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 68 6f  .static void pho
2910: 6e 65 74 69 63 48 61 73 68 53 71 6c 46 75 6e 63  neticHashSqlFunc
2920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
2930: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
2940: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
2950: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
2960: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
2970: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 6e 3b 0a  gned char *zIn;.
2980: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2990: 2a 7a 4f 75 74 3b 0a 0a 20 20 7a 49 6e 20 3d 20  *zOut;..  zIn = 
29a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
29b0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
29c0: 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75  f( zIn==0 ) retu
29d0: 72 6e 3b 0a 20 20 7a 4f 75 74 20 3d 20 70 68 6f  rn;.  zOut = pho
29e0: 6e 65 74 69 63 48 61 73 68 28 7a 49 6e 2c 20 73  neticHash(zIn, s
29f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2a00: 65 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20  es(argv[0]));.  
2a10: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( zOut==0 ){. 
2a20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2a30: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
2a40: 6e 74 65 78 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  ntext);.  }else{
2a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2a60: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
2a70: 2c 20 28 63 68 61 72 2a 29 7a 4f 75 74 2c 20 2d  , (char*)zOut, -
2a80: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
2a90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
2aa0: 65 74 75 72 6e 20 74 68 65 20 63 68 61 72 61 63  eturn the charac
2ab0: 74 65 72 20 63 6c 61 73 73 20 6e 75 6d 62 65 72  ter class number
2ac0: 20 66 6f 72 20 61 20 63 68 61 72 61 63 74 65 72   for a character
2ad0: 20 67 69 76 65 6e 20 69 74 73 0a 2a 2a 20 63 6f   given its.** co
2ae0: 6e 74 65 78 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntext..*/.static
2af0: 20 63 68 61 72 20 63 68 61 72 61 63 74 65 72 43   char characterC
2b00: 6c 61 73 73 28 63 68 61 72 20 63 50 72 65 76 2c  lass(char cPrev,
2b10: 20 63 68 61 72 20 63 29 7b 0a 20 20 72 65 74 75   char c){.  retu
2b20: 72 6e 20 63 50 72 65 76 3d 3d 30 20 3f 20 69 6e  rn cPrev==0 ? in
2b30: 69 74 43 6c 61 73 73 5b 63 26 30 78 37 66 5d 20  itClass[c&0x7f] 
2b40: 3a 20 6d 69 64 43 6c 61 73 73 5b 63 26 30 78 37  : midClass[c&0x7
2b50: 66 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  f];.}../*.** Ret
2b60: 75 72 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20  urn the cost of 
2b70: 69 6e 73 65 72 74 69 6e 67 20 6f 72 20 64 65 6c  inserting or del
2b80: 65 74 69 6e 67 20 63 68 61 72 61 63 74 65 72 20  eting character 
2b90: 63 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  c immediately.**
2ba0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 61   following chara
2bb0: 63 74 65 72 20 63 50 72 65 76 2e 20 20 49 66 20  cter cPrev.  If 
2bc0: 63 50 72 65 76 3d 3d 30 2c 20 74 68 61 74 20 6d  cPrev==0, that m
2bd0: 65 61 6e 73 20 63 20 69 73 20 74 68 65 20 66 69  eans c is the fi
2be0: 72 73 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  rst.** character
2bf0: 20 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f   of the word..*/
2c00: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73 65  .static int inse
2c10: 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74 28 63  rtOrDeleteCost(c
2c20: 68 61 72 20 63 50 72 65 76 2c 20 63 68 61 72 20  har cPrev, char 
2c30: 63 2c 20 63 68 61 72 20 63 4e 65 78 74 29 7b 0a  c, char cNext){.
2c40: 20 20 63 68 61 72 20 63 6c 61 73 73 43 20 3d 20    char classC = 
2c50: 63 68 61 72 61 63 74 65 72 43 6c 61 73 73 28 63  characterClass(c
2c60: 50 72 65 76 2c 20 63 29 3b 0a 20 20 63 68 61 72  Prev, c);.  char
2c70: 20 63 6c 61 73 73 43 70 72 65 76 3b 0a 0a 20 20   classCprev;..  
2c80: 69 66 28 20 63 6c 61 73 73 43 3d 3d 43 43 4c 41  if( classC==CCLA
2c90: 53 53 5f 53 49 4c 45 4e 54 20 29 7b 0a 20 20 20  SS_SILENT ){.   
2ca0: 20 2f 2a 20 49 6e 73 65 72 74 20 6f 72 20 64 65   /* Insert or de
2cb0: 6c 65 74 65 20 22 73 69 6c 65 6e 74 22 20 63 68  lete "silent" ch
2cc0: 61 72 61 63 74 65 72 73 20 73 75 63 68 20 61 73  aracters such as
2cd0: 20 48 20 6f 72 20 57 20 2a 2f 0a 20 20 20 20 72   H or W */.    r
2ce0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2cf0: 66 28 20 63 50 72 65 76 3d 3d 63 20 29 7b 0a 20  f( cPrev==c ){. 
2d00: 20 20 20 2f 2a 20 52 65 70 65 61 74 65 64 20 63     /* Repeated c
2d10: 68 61 72 61 63 74 65 72 73 2c 20 6f 72 20 6d 69  haracters, or mi
2d20: 73 73 20 61 20 72 65 70 65 61 74 20 2a 2f 0a 20  ss a repeat */. 
2d30: 20 20 20 72 65 74 75 72 6e 20 31 30 3b 0a 20 20     return 10;.  
2d40: 7d 0a 20 20 69 66 28 20 63 6c 61 73 73 43 3d 3d  }.  if( classC==
2d50: 43 43 4c 41 53 53 5f 56 4f 57 45 4c 20 26 26 20  CCLASS_VOWEL && 
2d60: 28 63 50 72 65 76 3d 3d 27 72 27 20 7c 7c 20 63  (cPrev=='r' || c
2d70: 4e 65 78 74 3d 3d 27 72 27 29 20 29 7b 0a 20 20  Next=='r') ){.  
2d80: 20 20 72 65 74 75 72 6e 20 32 30 3b 20 20 2f 2a    return 20;  /*
2d90: 20 49 6e 73 65 72 74 20 61 20 76 6f 77 65 6c 20   Insert a vowel 
2da0: 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
2db0: 27 72 27 20 2a 2f 0a 20 20 7d 0a 20 20 63 6c 61  'r' */.  }.  cla
2dc0: 73 73 43 70 72 65 76 20 3d 20 63 68 61 72 61 63  ssCprev = charac
2dd0: 74 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c 20  terClass(cPrev, 
2de0: 63 50 72 65 76 29 3b 0a 20 20 69 66 28 20 63 6c  cPrev);.  if( cl
2df0: 61 73 73 43 3d 3d 63 6c 61 73 73 43 70 72 65 76  assC==classCprev
2e00: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 6c 61 73   ){.    if( clas
2e10: 73 43 3d 3d 43 43 4c 41 53 53 5f 56 4f 57 45 4c  sC==CCLASS_VOWEL
2e20: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d   ){.      /* Rem
2e30: 6f 76 65 20 6f 72 20 61 64 64 20 61 20 6e 65 77  ove or add a new
2e40: 20 76 6f 77 65 6c 20 74 6f 20 61 20 76 6f 77 65   vowel to a vowe
2e50: 6c 20 63 6c 75 73 74 65 72 20 2a 2f 0a 20 20 20  l cluster */.   
2e60: 20 20 20 72 65 74 75 72 6e 20 31 35 3b 0a 20 20     return 15;.  
2e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2e80: 2a 20 52 65 6d 6f 76 65 20 6f 72 20 61 64 64 20  * Remove or add 
2e90: 61 20 63 6f 6e 73 6f 6e 61 6e 74 20 6e 6f 74 20  a consonant not 
2ea0: 69 6e 20 74 68 65 20 73 61 6d 65 20 63 6c 61 73  in the same clas
2eb0: 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  s */.      retur
2ec0: 6e 20 35 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n 50;.    }.  }.
2ed0: 0a 20 20 2f 2a 20 61 6e 79 20 6f 74 68 65 72 20  .  /* any other 
2ee0: 63 68 61 72 61 63 74 65 72 20 69 6e 73 65 72 74  character insert
2ef0: 69 6f 6e 20 6f 72 20 64 65 6c 65 74 69 6f 6e 20  ion or deletion 
2f00: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 30 30 3b  */.  return 100;
2f10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 76 69 64 65  .}../*.** Divide
2f20: 20 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 20 63   the insertion c
2f30: 6f 73 74 20 62 79 20 74 68 69 73 20 66 61 63 74  ost by this fact
2f40: 6f 72 20 77 68 65 6e 20 61 70 70 65 6e 64 69 6e  or when appendin
2f50: 67 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20  g to the.** end 
2f60: 6f 66 20 74 68 65 20 77 6f 72 64 2e 0a 2a 2f 0a  of the word..*/.
2f70: 23 64 65 66 69 6e 65 20 46 49 4e 41 4c 5f 49 4e  #define FINAL_IN
2f80: 53 5f 43 4f 53 54 5f 44 49 56 20 20 34 0a 0a 2f  S_COST_DIV  4../
2f90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2fa0: 63 6f 73 74 20 6f 66 20 73 75 62 73 74 69 74 75  cost of substitu
2fb0: 74 69 6e 67 20 63 54 6f 20 69 6e 20 70 6c 61 63  ting cTo in plac
2fc0: 65 20 6f 66 20 63 46 72 6f 6d 20 61 73 73 75 6d  e of cFrom assum
2fd0: 69 6e 67 0a 2a 2a 20 74 68 65 20 70 72 65 76 69  ing.** the previ
2fe0: 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 69 73  ous character is
2ff0: 20 63 50 72 65 76 2e 20 20 49 66 20 63 50 72 65   cPrev.  If cPre
3000: 76 3d 3d 30 20 74 68 65 6e 20 63 54 6f 20 69 73  v==0 then cTo is
3010: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 68   the first.** ch
3020: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 77  aracter of the w
3030: 6f 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ord..*/.static i
3040: 6e 74 20 73 75 62 73 74 69 74 75 74 65 43 6f 73  nt substituteCos
3050: 74 28 63 68 61 72 20 63 50 72 65 76 2c 20 63 68  t(char cPrev, ch
3060: 61 72 20 63 46 72 6f 6d 2c 20 63 68 61 72 20 63  ar cFrom, char c
3070: 54 6f 29 7b 0a 20 20 63 68 61 72 20 63 6c 61 73  To){.  char clas
3080: 73 46 72 6f 6d 2c 20 63 6c 61 73 73 54 6f 3b 0a  sFrom, classTo;.
3090: 20 20 69 66 28 20 63 46 72 6f 6d 3d 3d 63 54 6f    if( cFrom==cTo
30a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 61 63 74   ){.    /* Exact
30b0: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 72 65   match */.    re
30c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
30d0: 28 20 63 46 72 6f 6d 3d 3d 28 63 54 6f 5e 30 78  ( cFrom==(cTo^0x
30e0: 32 30 29 20 26 26 20 28 28 63 54 6f 3e 3d 27 41  20) && ((cTo>='A
30f0: 27 20 26 26 20 63 54 6f 3c 3d 27 5a 27 29 20 7c  ' && cTo<='Z') |
3100: 7c 20 28 63 54 6f 3e 3d 27 61 27 20 26 26 20 63  | (cTo>='a' && c
3110: 54 6f 3c 3d 27 7a 27 29 29 20 29 7b 0a 20 20 20  To<='z')) ){.   
3120: 20 2f 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20   /* differ only 
3130: 69 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 72  in case */.    r
3140: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 63  eturn 0;.  }.  c
3150: 6c 61 73 73 46 72 6f 6d 20 3d 20 63 68 61 72 61  lassFrom = chara
3160: 63 74 65 72 43 6c 61 73 73 28 63 50 72 65 76 2c  cterClass(cPrev,
3170: 20 63 46 72 6f 6d 29 3b 0a 20 20 63 6c 61 73 73   cFrom);.  class
3180: 54 6f 20 3d 20 63 68 61 72 61 63 74 65 72 43 6c  To = characterCl
3190: 61 73 73 28 63 50 72 65 76 2c 20 63 54 6f 29 3b  ass(cPrev, cTo);
31a0: 0a 20 20 69 66 28 20 63 6c 61 73 73 46 72 6f 6d  .  if( classFrom
31b0: 3d 3d 63 6c 61 73 73 54 6f 20 29 7b 0a 20 20 20  ==classTo ){.   
31c0: 20 2f 2a 20 53 61 6d 65 20 63 68 61 72 61 63 74   /* Same charact
31d0: 65 72 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20 20  er class */.    
31e0: 72 65 74 75 72 6e 20 34 30 3b 0a 20 20 7d 0a 20  return 40;.  }. 
31f0: 20 69 66 28 20 63 6c 61 73 73 46 72 6f 6d 3e 3d   if( classFrom>=
3200: 43 43 4c 41 53 53 5f 42 20 26 26 20 63 6c 61 73  CCLASS_B && clas
3210: 73 46 72 6f 6d 3c 3d 43 43 4c 41 53 53 5f 59 0a  sFrom<=CCLASS_Y.
3220: 20 20 20 20 20 20 26 26 20 63 6c 61 73 73 54 6f        && classTo
3230: 3e 3d 43 43 4c 41 53 53 5f 42 20 26 26 20 63 6c  >=CCLASS_B && cl
3240: 61 73 73 54 6f 3c 3d 43 43 4c 41 53 53 5f 59 20  assTo<=CCLASS_Y 
3250: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ){.    /* Conver
3260: 74 20 66 72 6f 6d 20 6f 6e 65 20 63 6f 6e 73 6f  t from one conso
3270: 6e 61 6e 74 20 74 6f 20 61 6e 6f 74 68 65 72 2c  nant to another,
3280: 20 62 75 74 20 69 6e 20 61 20 64 69 66 66 65 72   but in a differ
3290: 65 6e 74 20 63 6c 61 73 73 20 2a 2f 0a 20 20 20  ent class */.   
32a0: 20 72 65 74 75 72 6e 20 37 35 3b 0a 20 20 7d 0a   return 75;.  }.
32b0: 20 20 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 73    /* Any other s
32c0: 75 62 73 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  ubsitution */.  
32d0: 72 65 74 75 72 6e 20 31 30 30 3b 0a 7d 0a 0a 2f  return 100;.}../
32e0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 77 6f 20 73  *.** Given two s
32f0: 74 72 69 6e 67 73 20 7a 41 20 61 6e 64 20 7a 42  trings zA and zB
3300: 20 77 68 69 63 68 20 61 72 65 20 70 75 72 65 20   which are pure 
3310: 41 53 43 49 49 2c 20 72 65 74 75 72 6e 20 74 68  ASCII, return th
3320: 65 20 63 6f 73 74 0a 2a 2a 20 6f 66 20 74 72 61  e cost.** of tra
3330: 6e 73 66 6f 72 6d 69 6e 67 20 7a 41 20 69 6e 74  nsforming zA int
3340: 6f 20 7a 42 2e 20 20 49 66 20 7a 41 20 65 6e 64  o zB.  If zA end
3350: 73 20 77 69 74 68 20 27 2a 27 20 61 73 73 75 6d  s with '*' assum
3360: 65 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  e that it is.** 
3370: 61 20 70 72 65 66 69 78 20 6f 66 20 7a 42 20 61  a prefix of zB a
3380: 6e 64 20 67 69 76 65 20 6f 6e 6c 79 20 6d 69 6e  nd give only min
3390: 69 6d 61 6c 20 70 65 6e 61 6c 74 79 20 66 6f 72  imal penalty for
33a0: 20 65 78 74 72 61 20 63 68 61 72 61 63 74 65 72   extra character
33b0: 73 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 6e 64 20  s.** on the end 
33c0: 6f 66 20 7a 42 2e 0a 2a 2a 0a 2a 2a 20 53 6d 61  of zB..**.** Sma
33d0: 6c 6c 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 61  ller numbers mea
33e0: 6e 20 61 20 63 6c 6f 73 65 72 20 6d 61 74 63 68  n a closer match
33f0: 2e 0a 2a 2a 0a 2a 2a 20 4e 65 67 61 74 69 76 65  ..**.** Negative
3400: 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
3410: 20 61 6e 20 65 72 72 6f 72 3a 0a 2a 2a 20 20 20   an error:.**   
3420: 20 2d 31 20 20 4f 6e 65 20 6f 66 20 74 68 65 20   -1  One of the 
3430: 69 6e 70 75 74 73 20 69 73 20 4e 55 4c 4c 0a 2a  inputs is NULL.*
3440: 2a 20 20 20 20 2d 32 20 20 4e 6f 6e 2d 41 53 43  *    -2  Non-ASC
3450: 49 49 20 63 68 61 72 61 63 74 65 72 73 20 6f 6e  II characters on
3460: 20 69 6e 70 75 74 0a 2a 2a 20 20 20 20 2d 33 20   input.**    -3 
3470: 20 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   Unable to alloc
3480: 61 74 65 20 6d 65 6d 6f 72 79 20 0a 2a 2a 0a 2a  ate memory .**.*
3490: 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69 73 20  * If pnMatch is 
34a0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 2a  not NULL, then *
34b0: 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74 20 74  pnMatch is set t
34c0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
34d0: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 7a 42 20 74  bytes.** of zB t
34e0: 68 61 74 20 6d 61 74 63 68 65 64 20 74 68 65 20  hat matched the 
34f0: 70 61 74 74 65 72 6e 20 69 6e 20 7a 41 2e 20 49  pattern in zA. I
3500: 66 20 7a 41 20 64 6f 65 73 20 6e 6f 74 20 65 6e  f zA does not en
3510: 64 20 77 69 74 68 20 61 20 27 2a 27 2c 0a 2a 2a  d with a '*',.**
3520: 20 74 68 65 6e 20 74 68 69 73 20 76 61 6c 75 65   then this value
3530: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e   is always the n
3540: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
3550: 6e 20 7a 42 20 28 69 2e 65 2e 20 73 74 72 6c 65  n zB (i.e. strle
3560: 6e 28 7a 42 29 29 2e 0a 2a 2a 20 49 66 20 7a 41  n(zB))..** If zA
3570: 20 64 6f 65 73 20 65 6e 64 20 69 6e 20 61 20 27   does end in a '
3580: 2a 27 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  *', then it is t
3590: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
35a0: 65 73 20 69 6e 20 74 68 65 20 70 72 65 66 69 78  es in the prefix
35b0: 0a 2a 2a 20 6f 66 20 7a 42 20 74 68 61 74 20 77  .** of zB that w
35c0: 61 73 20 64 65 65 6d 65 64 20 74 6f 20 6d 61 74  as deemed to mat
35d0: 63 68 20 7a 41 2e 0a 2a 2f 0a 73 74 61 74 69 63  ch zA..*/.static
35e0: 20 69 6e 74 20 65 64 69 74 64 69 73 74 31 28 63   int editdist1(c
35f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63  onst char *zA, c
3600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 69  onst char *zB, i
3610: 6e 74 20 2a 70 6e 4d 61 74 63 68 29 7b 0a 20 20  nt *pnMatch){.  
3620: 69 6e 74 20 6e 41 2c 20 6e 42 3b 20 20 20 20 20  int nA, nB;     
3630: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3640: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
3650: 6e 20 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20  n zA[] and zB[] 
3660: 2a 2f 0a 20 20 69 6e 74 20 78 41 2c 20 78 42 3b  */.  int xA, xB;
3670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3680: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 66 6f 72  oop counters for
3690: 20 7a 41 5b 5d 20 61 6e 64 20 7a 42 5b 5d 20 2a   zA[] and zB[] *
36a0: 2f 0a 20 20 63 68 61 72 20 63 41 20 3d 20 30 2c  /.  char cA = 0,
36b0: 20 63 42 3b 20 20 20 20 20 20 20 2f 2a 20 43 75   cB;       /* Cu
36c0: 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 20  rrent character 
36d0: 6f 66 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a  of zA and zB */.
36e0: 20 20 63 68 61 72 20 63 41 70 72 65 76 2c 20 63    char cAprev, c
36f0: 42 70 72 65 76 3b 20 20 20 2f 2a 20 50 72 65 76  Bprev;   /* Prev
3700: 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 6f  ious character o
3710: 66 20 7a 41 20 61 6e 64 20 7a 42 20 2a 2f 0a 20  f zA and zB */. 
3720: 20 63 68 61 72 20 63 41 6e 65 78 74 2c 20 63 42   char cAnext, cB
3730: 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
3740: 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 41 20  character in zA 
3750: 61 6e 64 20 7a 42 20 2a 2f 0a 20 20 69 6e 74 20  and zB */.  int 
3760: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3770: 20 20 20 2f 2a 20 4e 6f 72 74 68 2d 77 65 73 74     /* North-west
3780: 20 63 6f 73 74 20 76 61 6c 75 65 20 2a 2f 0a 20   cost value */. 
3790: 20 69 6e 74 20 64 63 20 3d 20 30 3b 20 20 20 20   int dc = 0;    
37a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 72 74 68          /* North
37b0: 2d 77 65 73 74 20 63 68 61 72 61 63 74 65 72 20  -west character 
37c0: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 72  value */.  int r
37d0: 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
37e0: 20 20 2f 2a 20 46 69 6e 61 6c 20 72 65 73 75 6c    /* Final resul
37f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 6d 3b 20 20  t */.  int *m;  
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3810: 20 54 68 65 20 63 6f 73 74 20 6d 61 74 72 69 78   The cost matrix
3820: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 78 3b 20   */.  char *cx; 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3840: 43 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63 68  Corresponding ch
3850: 61 72 61 63 74 65 72 20 76 61 6c 75 65 73 20 2a  aracter values *
3860: 2f 0a 20 20 69 6e 74 20 2a 74 6f 46 72 65 65 20  /.  int *toFree 
3870: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  = 0;       /* Ma
3880: 6c 6c 6f 63 65 64 20 73 70 61 63 65 20 2a 2f 0a  lloced space */.
3890: 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30    int nMatch = 0
38a0: 3b 0a 20 20 69 6e 74 20 6d 53 74 61 63 6b 5b 36  ;.  int mStack[6
38b0: 30 2b 31 35 5d 3b 20 20 20 20 20 2f 2a 20 53 74  0+15];     /* St
38c0: 61 63 6b 20 73 70 61 63 65 20 74 6f 20 75 73 65  ack space to use
38d0: 20 69 66 20 6e 6f 74 20 74 6f 6f 20 6d 75 63 68   if not too much
38e0: 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20   is needed */.. 
38f0: 20 2f 2a 20 45 61 72 6c 79 20 6f 75 74 20 69 66   /* Early out if
3900: 20 65 69 74 68 65 72 20 69 6e 70 75 74 20 69 73   either input is
3910: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 7a   NULL */.  if( z
3920: 41 3d 3d 30 20 7c 7c 20 7a 42 3d 3d 30 20 29 20  A==0 || zB==0 ) 
3930: 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 2f 2a  return -1;..  /*
3940: 20 53 6b 69 70 20 61 6e 79 20 63 6f 6d 6d 6f 6e   Skip any common
3950: 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 77 68 69   prefix */.  whi
3960: 6c 65 28 20 7a 41 5b 30 5d 20 26 26 20 7a 41 5b  le( zA[0] && zA[
3970: 30 5d 3d 3d 7a 42 5b 30 5d 20 29 7b 20 64 63 20  0]==zB[0] ){ dc 
3980: 3d 20 7a 41 5b 30 5d 3b 20 7a 41 2b 2b 3b 20 7a  = zA[0]; zA++; z
3990: 42 2b 2b 3b 20 6e 4d 61 74 63 68 2b 2b 3b 20 7d  B++; nMatch++; }
39a0: 0a 20 20 69 66 28 20 70 6e 4d 61 74 63 68 20 29  .  if( pnMatch )
39b0: 20 2a 70 6e 4d 61 74 63 68 20 3d 20 6e 4d 61 74   *pnMatch = nMat
39c0: 63 68 3b 0a 20 20 69 66 28 20 7a 41 5b 30 5d 3d  ch;.  if( zA[0]=
39d0: 3d 30 20 26 26 20 7a 42 5b 30 5d 3d 3d 30 20 29  =0 && zB[0]==0 )
39e0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 23 69 66 20   return 0;..#if 
39f0: 30 0a 20 20 70 72 69 6e 74 66 28 22 41 3d 5c 22  0.  printf("A=\"
3a00: 25 73 5c 22 20 42 3d 5c 22 25 73 5c 22 20 64 63  %s\" B=\"%s\" dc
3a10: 3d 25 63 5c 6e 22 2c 20 7a 41 2c 20 7a 42 2c 20  =%c\n", zA, zB, 
3a20: 64 63 3f 64 63 3a 27 20 27 29 3b 0a 23 65 6e 64  dc?dc:' ');.#end
3a30: 69 66 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  if..  /* Verify 
3a40: 69 6e 70 75 74 20 73 74 72 69 6e 67 73 20 61 6e  input strings an
3a50: 64 20 6d 65 61 73 75 72 65 20 74 68 65 69 72 20  d measure their 
3a60: 6c 65 6e 67 74 68 73 20 2a 2f 0a 20 20 66 6f 72  lengths */.  for
3a70: 28 6e 41 3d 30 3b 20 7a 41 5b 6e 41 5d 3b 20 6e  (nA=0; zA[nA]; n
3a80: 41 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 41  A++){.    if( zA
3a90: 5b 6e 41 5d 26 30 78 38 30 20 29 20 72 65 74 75  [nA]&0x80 ) retu
3aa0: 72 6e 20 2d 32 3b 0a 20 20 7d 0a 20 20 66 6f 72  rn -2;.  }.  for
3ab0: 28 6e 42 3d 30 3b 20 7a 42 5b 6e 42 5d 3b 20 6e  (nB=0; zB[nB]; n
3ac0: 42 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 42  B++){.    if( zB
3ad0: 5b 6e 42 5d 26 30 78 38 30 20 29 20 72 65 74 75  [nB]&0x80 ) retu
3ae0: 72 6e 20 2d 32 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn -2;.  }..  /*
3af0: 20 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73   Special process
3b00: 69 6e 67 20 69 66 20 65 69 74 68 65 72 20 73 74  ing if either st
3b10: 72 69 6e 67 20 69 73 20 65 6d 70 74 79 20 2a 2f  ring is empty */
3b20: 0a 20 20 69 66 28 20 6e 41 3d 3d 30 20 29 7b 0a  .  if( nA==0 ){.
3b30: 20 20 20 20 63 42 70 72 65 76 20 3d 20 28 63 68      cBprev = (ch
3b40: 61 72 29 64 63 3b 0a 20 20 20 20 66 6f 72 28 78  ar)dc;.    for(x
3b50: 42 3d 72 65 73 3d 30 3b 20 28 63 42 20 3d 20 7a  B=res=0; (cB = z
3b60: 42 5b 78 42 5d 29 21 3d 30 3b 20 78 42 2b 2b 29  B[xB])!=0; xB++)
3b70: 7b 0a 20 20 20 20 20 20 72 65 73 20 2b 3d 20 69  {.      res += i
3b80: 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73  nsertOrDeleteCos
3b90: 74 28 63 42 70 72 65 76 2c 20 63 42 2c 20 7a 42  t(cBprev, cB, zB
3ba0: 5b 78 42 2b 31 5d 29 2f 46 49 4e 41 4c 5f 49 4e  [xB+1])/FINAL_IN
3bb0: 53 5f 43 4f 53 54 5f 44 49 56 3b 0a 20 20 20 20  S_COST_DIV;.    
3bc0: 20 20 63 42 70 72 65 76 20 3d 20 63 42 3b 0a 20    cBprev = cB;. 
3bd0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
3be0: 72 65 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  res;.  }.  if( n
3bf0: 42 3d 3d 30 20 29 7b 0a 20 20 20 20 63 41 70 72  B==0 ){.    cApr
3c00: 65 76 20 3d 20 28 63 68 61 72 29 64 63 3b 0a 20  ev = (char)dc;. 
3c10: 20 20 20 66 6f 72 28 78 41 3d 72 65 73 3d 30 3b     for(xA=res=0;
3c20: 20 28 63 41 20 3d 20 7a 41 5b 78 41 5d 29 21 3d   (cA = zA[xA])!=
3c30: 30 3b 20 78 41 2b 2b 29 7b 0a 20 20 20 20 20 20  0; xA++){.      
3c40: 72 65 73 20 2b 3d 20 69 6e 73 65 72 74 4f 72 44  res += insertOrD
3c50: 65 6c 65 74 65 43 6f 73 74 28 63 41 70 72 65 76  eleteCost(cAprev
3c60: 2c 20 63 41 2c 20 7a 41 5b 78 41 2b 31 5d 29 3b  , cA, zA[xA+1]);
3c70: 0a 20 20 20 20 20 20 63 41 70 72 65 76 20 3d 20  .      cAprev = 
3c80: 63 41 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  cA;.    }.    re
3c90: 74 75 72 6e 20 72 65 73 3b 0a 20 20 7d 0a 0a 20  turn res;.  }.. 
3ca0: 20 2f 2a 20 41 20 69 73 20 61 20 70 72 65 66 69   /* A is a prefi
3cb0: 78 20 6f 66 20 42 20 2a 2f 0a 20 20 69 66 28 20  x of B */.  if( 
3cc0: 7a 41 5b 30 5d 3d 3d 27 2a 27 20 26 26 20 7a 41  zA[0]=='*' && zA
3cd0: 5b 31 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  [1]==0 ) return 
3ce0: 30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  0;..  /* Allocat
3cf0: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
3d00: 20 74 68 65 20 57 61 67 6e 65 72 20 6d 61 74 72   the Wagner matr
3d10: 69 78 20 2a 2f 0a 20 20 69 66 28 20 6e 42 3c 28  ix */.  if( nB<(
3d20: 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b 29 2a 34  sizeof(mStack)*4
3d30: 29 2f 28 73 69 7a 65 6f 66 28 6d 53 74 61 63 6b  )/(sizeof(mStack
3d40: 5b 30 5d 29 2a 35 29 20 29 7b 0a 20 20 20 20 6d  [0])*5) ){.    m
3d50: 20 3d 20 6d 53 74 61 63 6b 3b 0a 20 20 7d 65 6c   = mStack;.  }el
3d60: 73 65 7b 0a 20 20 20 20 6d 20 3d 20 74 6f 46 72  se{.    m = toFr
3d70: 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ee = sqlite3_mal
3d80: 6c 6f 63 36 34 28 20 28 6e 42 2b 31 29 2a 35 2a  loc64( (nB+1)*5*
3d90: 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 2f 34 20 29  sizeof(m[0])/4 )
3da0: 3b 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29  ;.    if( m==0 )
3db0: 20 72 65 74 75 72 6e 20 2d 33 3b 0a 20 20 7d 0a   return -3;.  }.
3dc0: 20 20 63 78 20 3d 20 28 63 68 61 72 2a 29 26 6d    cx = (char*)&m
3dd0: 5b 6e 42 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 43 6f  [nB+1];..  /* Co
3de0: 6d 70 75 74 65 20 74 68 65 20 57 61 67 6e 65 72  mpute the Wagner
3df0: 20 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 2a   edit distance *
3e00: 2f 0a 20 20 6d 5b 30 5d 20 3d 20 30 3b 0a 20 20  /.  m[0] = 0;.  
3e10: 63 78 5b 30 5d 20 3d 20 28 63 68 61 72 29 64 63  cx[0] = (char)dc
3e20: 3b 0a 20 20 63 42 70 72 65 76 20 3d 20 28 63 68  ;.  cBprev = (ch
3e30: 61 72 29 64 63 3b 0a 20 20 66 6f 72 28 78 42 3d  ar)dc;.  for(xB=
3e40: 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b 2b 29  1; xB<=nB; xB++)
3e50: 7b 0a 20 20 20 20 63 42 6e 65 78 74 20 3d 20 7a  {.    cBnext = z
3e60: 42 5b 78 42 5d 3b 0a 20 20 20 20 63 42 20 3d 20  B[xB];.    cB = 
3e70: 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20 20 20 63 78  zB[xB-1];.    cx
3e80: 5b 78 42 5d 20 3d 20 63 42 3b 0a 20 20 20 20 6d  [xB] = cB;.    m
3e90: 5b 78 42 5d 20 3d 20 6d 5b 78 42 2d 31 5d 20 2b  [xB] = m[xB-1] +
3ea0: 20 69 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43   insertOrDeleteC
3eb0: 6f 73 74 28 63 42 70 72 65 76 2c 20 63 42 2c 20  ost(cBprev, cB, 
3ec0: 63 42 6e 65 78 74 29 3b 0a 20 20 20 20 63 42 70  cBnext);.    cBp
3ed0: 72 65 76 20 3d 20 63 42 3b 0a 20 20 7d 0a 20 20  rev = cB;.  }.  
3ee0: 63 41 70 72 65 76 20 3d 20 28 63 68 61 72 29 64  cAprev = (char)d
3ef0: 63 3b 0a 20 20 66 6f 72 28 78 41 3d 31 3b 20 78  c;.  for(xA=1; x
3f00: 41 3c 3d 6e 41 3b 20 78 41 2b 2b 29 7b 0a 20 20  A<=nA; xA++){.  
3f10: 20 20 69 6e 74 20 6c 61 73 74 41 20 3d 20 28 78    int lastA = (x
3f20: 41 3d 3d 6e 41 29 3b 0a 20 20 20 20 63 41 20 3d  A==nA);.    cA =
3f30: 20 7a 41 5b 78 41 2d 31 5d 3b 0a 20 20 20 20 63   zA[xA-1];.    c
3f40: 41 6e 65 78 74 20 3d 20 7a 41 5b 78 41 5d 3b 0a  Anext = zA[xA];.
3f50: 20 20 20 20 69 66 28 20 63 41 3d 3d 27 2a 27 20      if( cA=='*' 
3f60: 26 26 20 6c 61 73 74 41 20 29 20 62 72 65 61 6b  && lastA ) break
3f70: 3b 0a 20 20 20 20 64 20 3d 20 6d 5b 30 5d 3b 0a  ;.    d = m[0];.
3f80: 20 20 20 20 64 63 20 3d 20 63 78 5b 30 5d 3b 0a      dc = cx[0];.
3f90: 20 20 20 20 6d 5b 30 5d 20 3d 20 64 20 2b 20 69      m[0] = d + i
3fa0: 6e 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73  nsertOrDeleteCos
3fb0: 74 28 63 41 70 72 65 76 2c 20 63 41 2c 20 63 41  t(cAprev, cA, cA
3fc0: 6e 65 78 74 29 3b 0a 20 20 20 20 63 42 70 72 65  next);.    cBpre
3fd0: 76 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 78  v = 0;.    for(x
3fe0: 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b  B=1; xB<=nB; xB+
3ff0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f  +){.      int to
4000: 74 61 6c 43 6f 73 74 2c 20 69 6e 73 43 6f 73 74  talCost, insCost
4010: 2c 20 64 65 6c 43 6f 73 74 2c 20 73 75 62 43 6f  , delCost, subCo
4020: 73 74 2c 20 6e 63 78 3b 0a 20 20 20 20 20 20 63  st, ncx;.      c
4030: 42 20 3d 20 7a 42 5b 78 42 2d 31 5d 3b 0a 20 20  B = zB[xB-1];.  
4040: 20 20 20 20 63 42 6e 65 78 74 20 3d 20 7a 42 5b      cBnext = zB[
4050: 78 42 5d 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  xB];..      /* C
4060: 6f 73 74 20 74 6f 20 69 6e 73 65 72 74 20 63 42  ost to insert cB
4070: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 73 43 6f 73   */.      insCos
4080: 74 20 3d 20 69 6e 73 65 72 74 4f 72 44 65 6c 65  t = insertOrDele
4090: 74 65 43 6f 73 74 28 63 78 5b 78 42 2d 31 5d 2c  teCost(cx[xB-1],
40a0: 20 63 42 2c 20 63 42 6e 65 78 74 29 3b 0a 20 20   cB, cBnext);.  
40b0: 20 20 20 20 69 66 28 20 6c 61 73 74 41 20 29 20      if( lastA ) 
40c0: 69 6e 73 43 6f 73 74 20 2f 3d 20 46 49 4e 41 4c  insCost /= FINAL
40d0: 5f 49 4e 53 5f 43 4f 53 54 5f 44 49 56 3b 0a 0a  _INS_COST_DIV;..
40e0: 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 74 6f        /* Cost to
40f0: 20 64 65 6c 65 74 65 20 63 41 20 2a 2f 0a 20 20   delete cA */.  
4100: 20 20 20 20 64 65 6c 43 6f 73 74 20 3d 20 69 6e      delCost = in
4110: 73 65 72 74 4f 72 44 65 6c 65 74 65 43 6f 73 74  sertOrDeleteCost
4120: 28 63 78 5b 78 42 5d 2c 20 63 41 2c 20 63 42 6e  (cx[xB], cA, cBn
4130: 65 78 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ext);..      /* 
4140: 43 6f 73 74 20 74 6f 20 73 75 62 73 74 69 74 75  Cost to substitu
4150: 74 65 20 63 41 2d 3e 63 42 20 2a 2f 0a 20 20 20  te cA->cB */.   
4160: 20 20 20 73 75 62 43 6f 73 74 20 3d 20 73 75 62     subCost = sub
4170: 73 74 69 74 75 74 65 43 6f 73 74 28 63 78 5b 78  stituteCost(cx[x
4180: 42 2d 31 5d 2c 20 63 41 2c 20 63 42 29 3b 0a 0a  B-1], cA, cB);..
4190: 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 63 6f        /* Best co
41a0: 73 74 20 2a 2f 0a 20 20 20 20 20 20 74 6f 74 61  st */.      tota
41b0: 6c 43 6f 73 74 20 3d 20 69 6e 73 43 6f 73 74 20  lCost = insCost 
41c0: 2b 20 6d 5b 78 42 2d 31 5d 3b 0a 20 20 20 20 20  + m[xB-1];.     
41d0: 20 6e 63 78 20 3d 20 63 42 3b 0a 20 20 20 20 20   ncx = cB;.     
41e0: 20 69 66 28 20 28 64 65 6c 43 6f 73 74 20 2b 20   if( (delCost + 
41f0: 6d 5b 78 42 5d 29 3c 74 6f 74 61 6c 43 6f 73 74  m[xB])<totalCost
4200: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 74 61   ){.        tota
4210: 6c 43 6f 73 74 20 3d 20 64 65 6c 43 6f 73 74 20  lCost = delCost 
4220: 2b 20 6d 5b 78 42 5d 3b 0a 20 20 20 20 20 20 20  + m[xB];.       
4230: 20 6e 63 78 20 3d 20 63 41 3b 0a 20 20 20 20 20   ncx = cA;.     
4240: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 75   }.      if( (su
4250: 62 43 6f 73 74 20 2b 20 64 29 3c 74 6f 74 61 6c  bCost + d)<total
4260: 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
4270: 74 6f 74 61 6c 43 6f 73 74 20 3d 20 73 75 62 43  totalCost = subC
4280: 6f 73 74 20 2b 20 64 3b 0a 20 20 20 20 20 20 7d  ost + d;.      }
4290: 0a 0a 23 69 66 20 30 0a 20 20 20 20 20 20 70 72  ..#if 0.      pr
42a0: 69 6e 74 66 28 22 25 64 2c 25 64 20 64 3d 25 34  intf("%d,%d d=%4
42b0: 64 20 75 3d 25 34 64 20 72 3d 25 34 64 20 64 63  d u=%4d r=%4d dc
42c0: 3d 25 63 20 63 41 3d 25 63 20 63 42 3d 25 63 22  =%c cA=%c cB=%c"
42d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20  .             " 
42e0: 69 6e 73 3d 25 34 64 20 64 65 6c 3d 25 34 64 20  ins=%4d del=%4d 
42f0: 73 75 62 3d 25 34 64 20 74 3d 25 34 64 20 6e 63  sub=%4d t=%4d nc
4300: 78 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20  x=%c\n",.       
4310: 20 20 20 20 20 20 78 41 2c 20 78 42 2c 20 64 2c        xA, xB, d,
4320: 20 6d 5b 78 42 5d 2c 20 6d 5b 78 42 2d 31 5d 2c   m[xB], m[xB-1],
4330: 20 64 63 3f 64 63 3a 27 20 27 2c 20 63 41 2c 20   dc?dc:' ', cA, 
4340: 63 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  cB,.            
4350: 20 69 6e 73 43 6f 73 74 2c 20 64 65 6c 43 6f 73   insCost, delCos
4360: 74 2c 20 73 75 62 43 6f 73 74 2c 20 74 6f 74 61  t, subCost, tota
4370: 6c 43 6f 73 74 2c 20 6e 63 78 3f 6e 63 78 3a 27  lCost, ncx?ncx:'
4380: 20 27 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20   ');.#endif..   
4390: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
43a0: 20 6d 61 74 72 69 78 20 2a 2f 0a 20 20 20 20 20   matrix */.     
43b0: 20 64 20 3d 20 6d 5b 78 42 5d 3b 0a 20 20 20 20   d = m[xB];.    
43c0: 20 20 64 63 20 3d 20 63 78 5b 78 42 5d 3b 0a 20    dc = cx[xB];. 
43d0: 20 20 20 20 20 6d 5b 78 42 5d 20 3d 20 74 6f 74       m[xB] = tot
43e0: 61 6c 43 6f 73 74 3b 0a 20 20 20 20 20 20 63 78  alCost;.      cx
43f0: 5b 78 42 5d 20 3d 20 28 63 68 61 72 29 6e 63 78  [xB] = (char)ncx
4400: 3b 0a 20 20 20 20 20 20 63 42 70 72 65 76 20 3d  ;.      cBprev =
4410: 20 63 42 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   cB;.    }.    c
4420: 41 70 72 65 76 20 3d 20 63 41 3b 0a 20 20 7d 0a  Aprev = cA;.  }.
4430: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 77  .  /* Free the w
4440: 61 67 6e 65 72 20 6d 61 74 72 69 78 20 61 6e 64  agner matrix and
4450: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   return the resu
4460: 6c 74 20 2a 2f 0a 20 20 69 66 28 20 63 41 3d 3d  lt */.  if( cA==
4470: 27 2a 27 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  '*' ){.    res =
4480: 20 6d 5b 31 5d 3b 0a 20 20 20 20 66 6f 72 28 78   m[1];.    for(x
4490: 42 3d 31 3b 20 78 42 3c 3d 6e 42 3b 20 78 42 2b  B=1; xB<=nB; xB+
44a0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6d 5b  +){.      if( m[
44b0: 78 42 5d 3c 72 65 73 20 29 7b 0a 20 20 20 20 20  xB]<res ){.     
44c0: 20 20 20 72 65 73 20 3d 20 6d 5b 78 42 5d 3b 0a     res = m[xB];.
44d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 4d 61          if( pnMa
44e0: 74 63 68 20 29 20 2a 70 6e 4d 61 74 63 68 20 3d  tch ) *pnMatch =
44f0: 20 78 42 2b 6e 4d 61 74 63 68 3b 0a 20 20 20 20   xB+nMatch;.    
4500: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
4510: 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 6d 5b 6e  e{.    res = m[n
4520: 42 5d 3b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68  B];.    /* In th
4530: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
4540: 65 6e 74 61 74 69 6f 6e 2c 20 70 6e 4d 61 74 63  entation, pnMatc
4550: 68 20 69 73 20 61 6c 77 61 79 73 20 4e 55 4c 4c  h is always NULL
4560: 20 69 66 20 7a 41 20 64 6f 65 73 0a 20 20 20 20   if zA does.    
4570: 2a 2a 20 6e 6f 74 20 65 6e 64 20 69 6e 20 22 2a  ** not end in "*
4580: 22 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  " */.    assert(
4590: 20 70 6e 4d 61 74 63 68 3d 3d 30 20 29 3b 0a 20   pnMatch==0 );. 
45a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
45b0: 65 28 74 6f 46 72 65 65 29 3b 0a 20 20 72 65 74  e(toFree);.  ret
45c0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
45d0: 2a 20 46 75 6e 63 74 69 6f 6e 3a 20 20 20 20 65  * Function:    e
45e0: 64 69 74 64 69 73 74 28 41 2c 42 29 0a 2a 2a 0a  ditdist(A,B).**.
45f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
4600: 73 74 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69  st of transformi
4610: 6e 67 20 73 74 72 69 6e 67 20 41 20 69 6e 74 6f  ng string A into
4620: 20 73 74 72 69 6e 67 20 42 2e 20 20 42 6f 74 68   string B.  Both
4630: 20 73 74 72 69 6e 67 73 0a 2a 2a 20 6d 75 73 74   strings.** must
4640: 20 62 65 20 70 75 72 65 20 41 53 43 49 49 20 74   be pure ASCII t
4650: 65 78 74 2e 20 20 49 66 20 41 20 65 6e 64 73 20  ext.  If A ends 
4660: 77 69 74 68 20 27 2a 27 20 74 68 65 6e 20 69 74  with '*' then it
4670: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62   is assumed to b
4680: 65 0a 2a 2a 20 61 20 70 72 65 66 69 78 20 6f 66  e.** a prefix of
4690: 20 42 20 61 6e 64 20 65 78 74 72 61 20 63 68 61   B and extra cha
46a0: 72 61 63 74 65 72 73 20 6f 6e 20 74 68 65 20 65  racters on the e
46b0: 6e 64 20 6f 66 20 42 20 68 61 76 65 20 6d 69 6e  nd of B have min
46c0: 69 6d 61 6c 20 61 64 64 69 74 69 6f 6e 61 6c 0a  imal additional.
46d0: 2a 2a 20 63 6f 73 74 2e 0a 2a 2f 0a 73 74 61 74  ** cost..*/.stat
46e0: 69 63 20 76 6f 69 64 20 65 64 69 74 64 69 73 74  ic void editdist
46f0: 53 71 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  SqlFunc(.  sqlit
4700: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
4710: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
4720: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
4730: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
4740: 20 72 65 73 20 3d 20 65 64 69 74 64 69 73 74 31   res = editdist1
4750: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
4760: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
4770: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
4780: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a  _text(argv[0]),.
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47a0: 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a      (const char*
47b0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
47c0: 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 0a 20 20  ext(argv[1]),.  
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 30 29 3b 0a 20 20 69 66 28 20 72 65 73 3c    0);.  if( res<
47f0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73  0 ){.    if( res
4800: 3d 3d 28 2d 33 29 20 29 7b 0a 20 20 20 20 20 20  ==(-3) ){.      
4810: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
4820: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
4830: 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  xt);.    }else i
4840: 66 28 20 72 65 73 3d 3d 28 2d 32 29 20 29 7b 0a  f( res==(-2) ){.
4850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4860: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
4870: 78 74 2c 20 22 6e 6f 6e 2d 41 53 43 49 49 20 69  xt, "non-ASCII i
4880: 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69 73 74  nput to editdist
4890: 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65  ()", -1);.    }e
48a0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
48b0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
48c0: 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69  context, "NULL i
48d0: 6e 70 75 74 20 74 6f 20 65 64 69 74 64 69 73 74  nput to editdist
48e0: 28 29 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ()", -1);.    }.
48f0: 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 73 71    }else{ .    sq
4900: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4910: 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b 0a  (context, res);.
4920: 20 20 7d 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66    }.}../* End of
4930: 20 74 68 65 20 66 69 78 65 64 2d 63 6f 73 74 20   the fixed-cost 
4940: 65 64 69 74 20 64 69 73 74 61 6e 63 65 20 69 6d  edit distance im
4950: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 2a  plementation.***
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4980: 2a 2a 2a 2a 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 0a 2a 2a 2a 2a  ***********.****
49b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67  *********.** Beg
4a00: 69 6e 3a 20 43 6f 6e 66 69 67 75 72 61 62 6c 65  in: Configurable
4a10: 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64   cost unicode ed
4a20: 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74  it distance rout
4a30: 69 6e 65 73 0a 2a 2f 0a 2f 2a 20 46 6f 72 77 61  ines.*/./* Forwa
4a40: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
4a50: 66 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  f structures */.
4a60: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
4a70: 64 69 74 44 69 73 74 33 43 6f 73 74 20 45 64 69  ditDist3Cost Edi
4a80: 74 44 69 73 74 33 43 6f 73 74 3b 0a 74 79 70 65  tDist3Cost;.type
4a90: 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44  def struct EditD
4aa0: 69 73 74 33 43 6f 6e 66 69 67 20 45 64 69 74 44  ist3Config EditD
4ab0: 69 73 74 33 43 6f 6e 66 69 67 3b 0a 74 79 70 65  ist3Config;.type
4ac0: 64 65 66 20 73 74 72 75 63 74 20 45 64 69 74 44  def struct EditD
4ad0: 69 73 74 33 50 6f 69 6e 74 20 45 64 69 74 44 69  ist3Point EditDi
4ae0: 73 74 33 50 6f 69 6e 74 3b 0a 74 79 70 65 64 65  st3Point;.typede
4af0: 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69 73  f struct EditDis
4b00: 74 33 46 72 6f 6d 20 45 64 69 74 44 69 73 74 33  t3From EditDist3
4b10: 46 72 6f 6d 3b 0a 74 79 70 65 64 65 66 20 73 74  From;.typedef st
4b20: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 46 72  ruct EditDist3Fr
4b30: 6f 6d 53 74 72 69 6e 67 20 45 64 69 74 44 69 73  omString EditDis
4b40: 74 33 46 72 6f 6d 53 74 72 69 6e 67 3b 0a 74 79  t3FromString;.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 20 45 64 69 74 44 69 73  tDist3To EditDis
4b70: 74 33 54 6f 3b 0a 74 79 70 65 64 65 66 20 73 74  t3To;.typedef st
4b80: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54 6f  ruct EditDist3To
4b90: 53 74 72 69 6e 67 20 45 64 69 74 44 69 73 74 33  String EditDist3
4ba0: 54 6f 53 74 72 69 6e 67 3b 0a 74 79 70 65 64 65  ToString;.typede
4bb0: 66 20 73 74 72 75 63 74 20 45 64 69 74 44 69 73  f struct EditDis
4bc0: 74 33 4c 61 6e 67 20 45 64 69 74 44 69 73 74 33  t3Lang EditDist3
4bd0: 4c 61 6e 67 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  Lang;.../*.** An
4be0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 65 64   entry in the ed
4bf0: 69 74 20 63 6f 73 74 20 74 61 62 6c 65 0a 2a 2f  it cost table.*/
4c00: 0a 73 74 72 75 63 74 20 45 64 69 74 44 69 73 74  .struct EditDist
4c10: 33 43 6f 73 74 20 7b 0a 20 20 45 64 69 74 44 69  3Cost {.  EditDi
4c20: 73 74 33 43 6f 73 74 20 2a 70 4e 65 78 74 3b 20  st3Cost *pNext; 
4c30: 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f 73 74      /* Next cost
4c40: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 38   element */.  u8
4c50: 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
4c60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4c70: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 46  r of bytes in aF
4c80: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 6e 54 6f 3b  rom */.  u8 nTo;
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4cb0: 62 79 74 65 73 20 69 6e 20 61 54 6f 20 2a 2f 0a  bytes in aTo */.
4cc0: 20 20 75 31 36 20 69 43 6f 73 74 3b 20 20 20 20    u16 iCost;    
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4ce0: 6f 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e  ost of this tran
4cf0: 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  sformation */.  
4d00: 63 68 61 72 20 61 5b 34 5d 20 20 20 20 3b 20 20  char a[4]    ;  
4d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52 4f            /* FRO
4d20: 4d 20 73 74 72 69 6e 67 20 66 6f 6c 6c 6f 77 65  M string followe
4d30: 64 20 62 79 20 54 4f 20 73 74 72 69 6e 67 20 2a  d by TO string *
4d40: 2f 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61  /.  /* Additiona
4d50: 6c 20 54 4f 20 61 6e 64 20 46 52 4f 4d 20 73 74  l TO and FROM st
4d60: 72 69 6e 67 20 62 79 74 65 73 20 61 70 70 65 6e  ring bytes appen
4d70: 64 65 64 20 61 73 20 6e 65 63 65 73 73 61 72 79  ded as necessary
4d80: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 64   */.};../*.** Ed
4d90: 69 74 20 63 6f 73 74 73 20 66 6f 72 20 61 20 70  it costs for a p
4da0: 61 72 74 69 63 75 6c 61 72 20 6c 61 6e 67 75 61  articular langua
4db0: 67 65 20 49 44 20 0a 2a 2f 0a 73 74 72 75 63 74  ge ID .*/.struct
4dc0: 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67 20 7b   EditDist3Lang {
4dd0: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20 20  .  int iLang;   
4de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 6e            /* Lan
4df0: 67 75 61 67 65 20 49 44 20 2a 2f 0a 20 20 69 6e  guage ID */.  in
4e00: 74 20 69 49 6e 73 43 6f 73 74 3b 20 20 20 20 20  t iInsCost;     
4e10: 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
4e20: 69 6e 73 65 72 74 69 6f 6e 20 63 6f 73 74 20 2a  insertion cost *
4e30: 2f 0a 20 20 69 6e 74 20 69 44 65 6c 43 6f 73 74  /.  int iDelCost
4e40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  ;          /* De
4e50: 66 61 75 6c 74 20 64 65 6c 65 74 69 6f 6e 20 63  fault deletion c
4e60: 6f 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ost */.  int iSu
4e70: 62 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  bCost;          
4e80: 2f 2a 20 44 65 66 61 75 6c 74 20 73 75 62 73 74  /* Default subst
4e90: 69 74 75 74 69 6f 6e 20 63 6f 73 74 20 2a 2f 0a  itution cost */.
4ea0: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
4eb0: 2a 70 43 6f 73 74 3b 20 20 2f 2a 20 43 6f 73 74  *pCost;  /* Cost
4ec0: 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.};.../*.** 
4ed0: 54 68 65 20 64 65 66 61 75 6c 74 20 45 64 69 74  The default Edit
4ee0: 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a 65 63 74  Dist3Lang object
4ef0: 2c 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 63  , with default c
4f00: 6f 73 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osts..*/.static 
4f10: 63 6f 6e 73 74 20 45 64 69 74 44 69 73 74 33 4c  const EditDist3L
4f20: 61 6e 67 20 65 64 69 74 44 69 73 74 33 4c 61 6e  ang editDist3Lan
4f30: 67 20 3d 20 7b 20 30 2c 20 31 30 30 2c 20 31 30  g = { 0, 100, 10
4f40: 30 2c 20 31 35 30 2c 20 30 20 7d 3b 0a 0a 2f 2a  0, 150, 0 };../*
4f50: 0a 2a 2a 20 43 6f 6d 70 6c 65 74 65 20 63 6f 6e  .** Complete con
4f60: 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  figuration.*/.st
4f70: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 43 6f  ruct EditDist3Co
4f80: 6e 66 69 67 20 7b 0a 20 20 69 6e 74 20 6e 4c 61  nfig {.  int nLa
4f90: 6e 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ng;             
4fa0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 61 6e  /* Number of lan
4fb0: 67 75 61 67 65 20 49 44 73 2e 20 20 53 69 7a 65  guage IDs.  Size
4fc0: 20 6f 66 20 61 5b 5d 20 2a 2f 0a 20 20 45 64 69   of a[] */.  Edi
4fd0: 74 44 69 73 74 33 4c 61 6e 67 20 2a 61 3b 20 20  tDist3Lang *a;  
4fe0: 20 20 20 20 2f 2a 20 4f 6e 65 20 66 6f 72 20 65      /* One for e
4ff0: 61 63 68 20 64 69 73 74 69 6e 63 74 20 6c 61 6e  ach distinct lan
5000: 67 75 61 67 65 20 49 44 20 2a 2f 0a 7d 3b 0a 0a  guage ID */.};..
5010: 2f 2a 0a 2a 2a 20 45 78 74 72 61 20 69 6e 66 6f  /*.** Extra info
5020: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 65 61  rmation about ea
5030: 63 68 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  ch character in 
5040: 74 68 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 2e  the FROM string.
5050: 0a 2a 2f 0a 73 74 72 75 63 74 20 45 64 69 74 44  .*/.struct EditD
5060: 69 73 74 33 46 72 6f 6d 20 7b 0a 20 20 69 6e 74  ist3From {.  int
5070: 20 6e 53 75 62 73 74 3b 20 20 20 20 20 20 20 20   nSubst;        
5080: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5090: 6f 66 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  of substitution 
50a0: 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f 0a  cost entries */.
50b0: 20 20 69 6e 74 20 6e 44 65 6c 3b 20 20 20 20 20    int nDel;     
50c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
50d0: 6d 62 65 72 20 6f 66 20 64 65 6c 65 74 69 6f 6e  mber of deletion
50e0: 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a 2f   cost entries */
50f0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
5100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5110: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
5120: 6e 20 74 68 69 73 20 63 68 61 72 61 63 74 65 72  n this character
5130: 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43   */.  EditDist3C
5140: 6f 73 74 20 2a 2a 61 70 53 75 62 73 74 3b 20 2f  ost **apSubst; /
5150: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 73 74  * Array of subst
5160: 69 74 75 74 69 6f 6e 20 63 6f 73 74 73 20 66 6f  itution costs fo
5170: 72 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a  r this element *
5180: 2f 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f 73  /.  EditDist3Cos
5190: 74 20 2a 2a 61 70 44 65 6c 3b 20 20 20 2f 2a 20  t **apDel;   /* 
51a0: 41 72 72 61 79 20 6f 66 20 64 65 6c 65 74 69 6f  Array of deletio
51b0: 6e 20 63 6f 73 74 20 65 6e 74 72 69 65 73 20 2a  n cost entries *
51c0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 72  /.};../*.** A pr
51d0: 65 63 6f 6d 70 69 6c 65 64 20 46 52 4f 4d 20 73  ecompiled FROM s
51e0: 74 72 69 6e 67 2e 0a 2a 0a 2a 2a 20 49 6e 20 74  tring..*.** In t
51f0: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
5200: 65 20 65 78 70 65 63 74 20 74 68 65 20 46 52 4f  e expect the FRO
5210: 4d 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 72  M string to be r
5220: 65 75 73 65 64 20 6d 75 6c 74 69 70 6c 65 20 74  eused multiple t
5230: 69 6d 65 73 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65  imes..** In othe
5240: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 6f 6d  r words, the com
5250: 6d 6f 6e 20 63 61 73 65 20 77 69 6c 6c 20 62 65  mon case will be
5260: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
5270: 65 64 69 74 20 64 69 73 74 61 6e 63 65 0a 2a 2a  edit distance.**
5280: 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 6f   from a single o
5290: 72 69 67 69 6e 20 73 74 72 69 6e 67 20 74 6f 20  rigin string to 
52a0: 6d 75 6c 74 69 70 6c 65 20 74 61 72 67 65 74 20  multiple target 
52b0: 73 74 72 69 6e 67 73 2e 0a 2a 2f 0a 73 74 72 75  strings..*/.stru
52c0: 63 74 20 45 64 69 74 44 69 73 74 33 46 72 6f 6d  ct EditDist3From
52d0: 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61 72 20  String {.  char 
52e0: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
52f0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
5300: 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
5310: 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  FROM string */. 
5320: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
5330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5340: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
5350: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 73 74  s in the FROM st
5360: 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ring */.  int is
5370: 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
5380: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 6e     /* True if en
5390: 64 73 20 77 69 74 68 20 27 2a 27 20 63 68 61 72  ds with '*' char
53a0: 61 63 74 65 72 20 2a 2f 0a 20 20 45 64 69 74 44  acter */.  EditD
53b0: 69 73 74 33 46 72 6f 6d 20 2a 61 3b 20 20 20 20  ist3From *a;    
53c0: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66      /* Extra inf
53d0: 6f 20 61 62 6f 75 74 20 65 61 63 68 20 63 68 61  o about each cha
53e0: 72 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 73 74  r of the FROM st
53f0: 72 69 6e 67 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ring */.};../*.*
5400: 2a 20 45 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  * Extra informat
5410: 69 6f 6e 20 61 62 6f 75 74 20 65 61 63 68 20 63  ion about each c
5420: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
5430: 54 4f 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  TO string..*/.st
5440: 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54 6f  ruct EditDist3To
5450: 20 7b 0a 20 20 69 6e 74 20 6e 49 6e 73 3b 20 20   {.  int nIns;  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5470: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 73 65 72   Number of inser
5480: 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74 72 69 65  tion cost entrie
5490: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  s */.  int nByte
54a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
54c0: 65 73 20 69 6e 20 74 68 69 73 20 63 68 61 72 61  es in this chara
54d0: 63 74 65 72 20 2a 2f 0a 20 20 45 64 69 74 44 69  cter */.  EditDi
54e0: 73 74 33 43 6f 73 74 20 2a 2a 61 70 49 6e 73 3b  st3Cost **apIns;
54f0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 64     /* Array of d
5500: 65 6c 65 74 69 6f 6e 20 63 6f 73 74 20 65 6e 74  eletion cost ent
5510: 72 69 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ries */.};../*.*
5520: 2a 20 41 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  * A precompiled 
5530: 46 52 4f 4d 20 73 74 72 69 6e 67 0a 2a 2f 0a 73  FROM string.*/.s
5540: 74 72 75 63 74 20 45 64 69 74 44 69 73 74 33 54  truct EditDist3T
5550: 6f 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61 72  oString {.  char
5560: 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
5570: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
5580: 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
5590: 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20   TO string */.  
55a0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
55b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
55c0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
55d0: 20 69 6e 20 74 68 65 20 54 4f 20 73 74 72 69 6e   in the TO strin
55e0: 67 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33  g */.  EditDist3
55f0: 54 6f 20 2a 61 3b 20 20 20 20 20 20 20 20 20 20  To *a;          
5600: 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f 20 61 62  /* Extra info ab
5610: 6f 75 74 20 65 61 63 68 20 63 68 61 72 20 6f 66  out each char of
5620: 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a   the TO string *
5630: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  /.};../*.** Clea
5640: 72 20 6f 72 20 64 65 6c 65 74 65 20 61 6e 20 69  r or delete an i
5650: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 6f  nstance of the o
5660: 62 6a 65 63 74 20 74 68 61 74 20 72 65 63 6f 72  bject that recor
5670: 64 73 20 61 6c 6c 20 65 64 69 74 2d 64 69 73 74  ds all edit-dist
5680: 61 6e 63 65 0a 2a 2a 20 77 65 69 67 68 74 73 2e  ance.** weights.
5690: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
56a0: 65 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43  editDist3ConfigC
56b0: 6c 65 61 72 28 45 64 69 74 44 69 73 74 33 43 6f  lear(EditDist3Co
56c0: 6e 66 69 67 20 2a 70 29 7b 0a 20 20 69 6e 74 20  nfig *p){.  int 
56d0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
56e0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
56f0: 30 3b 20 69 3c 70 2d 3e 6e 4c 61 6e 67 3b 20 69  0; i<p->nLang; i
5700: 2b 2b 29 7b 0a 20 20 20 20 45 64 69 74 44 69 73  ++){.    EditDis
5710: 74 33 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 2a  t3Cost *pCost, *
5720: 70 4e 65 78 74 3b 0a 20 20 20 20 70 43 6f 73 74  pNext;.    pCost
5730: 20 3d 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 73 74   = p->a[i].pCost
5740: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f  ;.    while( pCo
5750: 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  st ){.      pNex
5760: 74 20 3d 20 70 43 6f 73 74 2d 3e 70 4e 65 78 74  t = pCost->pNext
5770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5780: 66 72 65 65 28 70 43 6f 73 74 29 3b 0a 20 20 20  free(pCost);.   
5790: 20 20 20 70 43 6f 73 74 20 3d 20 70 4e 65 78 74     pCost = pNext
57a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
57b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 29  lite3_free(p->a)
57c0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
57d0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
57e0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
57f0: 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74  Dist3ConfigDelet
5800: 65 28 76 6f 69 64 20 2a 70 49 6e 29 7b 0a 20 20  e(void *pIn){.  
5810: 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 20  EditDist3Config 
5820: 2a 70 20 3d 20 28 45 64 69 74 44 69 73 74 33 43  *p = (EditDist3C
5830: 6f 6e 66 69 67 2a 29 70 49 6e 3b 0a 20 20 65 64  onfig*)pIn;.  ed
5840: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 43 6c 65  itDist3ConfigCle
5850: 61 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ar(p);.  sqlite3
5860: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _free(p);.}../*.
5870: 2a 2a 20 4c 6f 61 64 20 61 6c 6c 20 65 64 69 74  ** Load all edit
5880: 2d 64 69 73 74 61 6e 63 65 20 77 65 69 67 68 74  -distance weight
5890: 73 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 2e 0a  s from a table..
58a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64  */.static int ed
58b0: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c 6f 61  itDist3ConfigLoa
58c0: 64 28 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  d(.  EditDist3Co
58d0: 6e 66 69 67 20 2a 70 2c 20 20 20 20 20 20 2f 2a  nfig *p,      /*
58e0: 20 54 68 65 20 65 64 69 74 20 64 69 73 74 61 6e   The edit distan
58f0: 63 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ce configuration
5900: 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a 20 20 73 71   to load */.  sq
5910: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
5920: 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 66 72        /* Load fr
5930: 6f 6d 20 74 68 69 73 20 64 61 74 61 62 61 73 65  om this database
5940: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
5950: 20 2a 7a 54 61 62 6c 65 20 20 20 20 20 20 2f 2a   *zTable      /*
5960: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
5970: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  le from which to
5980: 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71   load */.){.  sq
5990: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
59a0: 74 3b 0a 20 20 69 6e 74 20 72 63 2c 20 72 63 32  t;.  int rc, rc2
59b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
59c0: 20 20 69 6e 74 20 69 4c 61 6e 67 50 72 65 76 20    int iLangPrev 
59d0: 3d 20 2d 39 39 39 39 3b 0a 20 20 45 64 69 74 44  = -9999;.  EditD
59e0: 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 20  ist3Lang *pLang 
59f0: 3d 20 30 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20 73  = 0;..  zSql = s
5a00: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
5a10: 53 45 4c 45 43 54 20 69 4c 61 6e 67 2c 20 63 46  SELECT iLang, cF
5a20: 72 6f 6d 2c 20 63 54 6f 2c 20 69 43 6f 73 74 22  rom, cTo, iCost"
5a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5a40: 20 20 20 20 20 20 20 20 20 20 22 20 46 52 4f 4d            " FROM
5a50: 20 5c 22 25 77 5c 22 20 57 48 45 52 45 20 69 4c   \"%w\" WHERE iL
5a60: 61 6e 67 3e 3d 30 20 4f 52 44 45 52 20 42 59 20  ang>=0 ORDER BY 
5a70: 69 4c 61 6e 67 22 2c 20 7a 54 61 62 6c 65 29 3b  iLang", zTable);
5a80: 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29  .  if( zSql==0 )
5a90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5aa0: 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OMEM;.  rc = sql
5ab0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
5ac0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
5ad0: 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
5ae0: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69  _free(zSql);.  i
5af0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5b00: 63 3b 0a 20 20 65 64 69 74 44 69 73 74 33 43 6f  c;.  editDist3Co
5b10: 6e 66 69 67 43 6c 65 61 72 28 70 29 3b 0a 20 20  nfigClear(p);.  
5b20: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
5b30: 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
5b40: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 6e  TE_ROW ){.    in
5b50: 74 20 69 4c 61 6e 67 20 3d 20 73 71 6c 69 74 65  t iLang = sqlite
5b60: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
5b70: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73  mt, 0);.    cons
5b80: 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20  t char *zFrom = 
5b90: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
5ba0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
5bb0: 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
5bc0: 69 6e 74 20 6e 46 72 6f 6d 20 3d 20 7a 46 72 6f  int nFrom = zFro
5bd0: 6d 20 3f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m ? sqlite3_colu
5be0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
5bf0: 31 29 20 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73  1) : 0;.    cons
5c00: 74 20 63 68 61 72 20 2a 7a 54 6f 20 3d 20 28 63  t char *zTo = (c
5c10: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5c20: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
5c30: 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e  Stmt, 2);.    in
5c40: 74 20 6e 54 6f 20 3d 20 7a 54 6f 20 3f 20 73 71  t nTo = zTo ? sq
5c50: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
5c60: 65 73 28 70 53 74 6d 74 2c 20 32 29 20 3a 20 30  es(pStmt, 2) : 0
5c70: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 73 74 20  ;.    int iCost 
5c80: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
5c90: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
5ca0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 72  .    assert( zFr
5cb0: 6f 6d 21 3d 30 20 7c 7c 20 6e 46 72 6f 6d 3d 3d  om!=0 || nFrom==
5cc0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5cd0: 20 7a 54 6f 21 3d 30 20 7c 7c 20 6e 54 6f 3d 3d   zTo!=0 || nTo==
5ce0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  0 );.    if( nFr
5cf0: 6f 6d 3e 31 30 30 20 7c 7c 20 6e 54 6f 3e 31 30  om>100 || nTo>10
5d00: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
5d10: 20 20 69 66 28 20 69 43 6f 73 74 3c 30 20 29 20    if( iCost<0 ) 
5d20: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
5d30: 28 20 70 4c 61 6e 67 3d 3d 30 20 7c 7c 20 69 4c  ( pLang==0 || iL
5d40: 61 6e 67 21 3d 69 4c 61 6e 67 50 72 65 76 20 29  ang!=iLangPrev )
5d50: 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69 73 74  {.      EditDist
5d60: 33 4c 61 6e 67 20 2a 70 4e 65 77 3b 0a 20 20 20  3Lang *pNew;.   
5d70: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
5d80: 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
5d90: 2c 20 28 70 2d 3e 6e 4c 61 6e 67 2b 31 29 2a 73  , (p->nLang+1)*s
5da0: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 29 3b  izeof(p->a[0]));
5db0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d  .      if( pNew=
5dc0: 3d 30 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54  =0 ){ rc = SQLIT
5dd0: 45 5f 4e 4f 4d 45 4d 3b 20 62 72 65 61 6b 3b 20  E_NOMEM; break; 
5de0: 7d 0a 20 20 20 20 20 20 70 2d 3e 61 20 3d 20 70  }.      p->a = p
5df0: 4e 65 77 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67  New;.      pLang
5e00: 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 4c 61 6e   = &p->a[p->nLan
5e10: 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 4c 61  g];.      p->nLa
5e20: 6e 67 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 61 6e  ng++;.      pLan
5e30: 67 2d 3e 69 4c 61 6e 67 20 3d 20 69 4c 61 6e 67  g->iLang = iLang
5e40: 3b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69  ;.      pLang->i
5e50: 49 6e 73 43 6f 73 74 20 3d 20 31 30 30 3b 0a 20  InsCost = 100;. 
5e60: 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 44 65 6c       pLang->iDel
5e70: 43 6f 73 74 20 3d 20 31 30 30 3b 0a 20 20 20 20  Cost = 100;.    
5e80: 20 20 70 4c 61 6e 67 2d 3e 69 53 75 62 43 6f 73    pLang->iSubCos
5e90: 74 20 3d 20 31 35 30 3b 0a 20 20 20 20 20 20 70  t = 150;.      p
5ea0: 4c 61 6e 67 2d 3e 70 43 6f 73 74 20 3d 20 30 3b  Lang->pCost = 0;
5eb0: 0a 20 20 20 20 20 20 69 4c 61 6e 67 50 72 65 76  .      iLangPrev
5ec0: 20 3d 20 69 4c 61 6e 67 3b 0a 20 20 20 20 7d 0a   = iLang;.    }.
5ed0: 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 31      if( nFrom==1
5ee0: 20 26 26 20 7a 46 72 6f 6d 5b 30 5d 3d 3d 27 3f   && zFrom[0]=='?
5ef0: 27 20 26 26 20 6e 54 6f 3d 3d 30 20 29 7b 0a 20  ' && nTo==0 ){. 
5f00: 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 44 65 6c       pLang->iDel
5f10: 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a 20 20  Cost = iCost;.  
5f20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 6f    }else if( nFro
5f30: 6d 3d 3d 30 20 26 26 20 6e 54 6f 3d 3d 31 20 26  m==0 && nTo==1 &
5f40: 26 20 7a 54 6f 5b 30 5d 3d 3d 27 3f 27 20 29 7b  & zTo[0]=='?' ){
5f50: 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d 3e 69 49  .      pLang->iI
5f60: 6e 73 43 6f 73 74 20 3d 20 69 43 6f 73 74 3b 0a  nsCost = iCost;.
5f70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
5f80: 72 6f 6d 3d 3d 31 20 26 26 20 6e 54 6f 3d 3d 31  rom==1 && nTo==1
5f90: 20 26 26 20 7a 46 72 6f 6d 5b 30 5d 3d 3d 27 3f   && zFrom[0]=='?
5fa0: 27 20 26 26 20 7a 54 6f 5b 30 5d 3d 3d 27 3f 27  ' && zTo[0]=='?'
5fb0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 61 6e 67 2d   ){.      pLang-
5fc0: 3e 69 53 75 62 43 6f 73 74 20 3d 20 69 43 6f 73  >iSubCost = iCos
5fd0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
5fe0: 20 20 20 20 45 64 69 74 44 69 73 74 33 43 6f 73      EditDist3Cos
5ff0: 74 20 2a 70 43 6f 73 74 3b 0a 20 20 20 20 20 20  t *pCost;.      
6000: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 6e 46 72  int nExtra = nFr
6010: 6f 6d 20 2b 20 6e 54 6f 20 2d 20 34 3b 0a 20 20  om + nTo - 4;.  
6020: 20 20 20 20 69 66 28 20 6e 45 78 74 72 61 3c 30      if( nExtra<0
6030: 20 29 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20   ) nExtra = 0;. 
6040: 20 20 20 20 20 70 43 6f 73 74 20 3d 20 73 71 6c       pCost = sql
6050: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
6060: 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 20 2b 20  izeof(*pCost) + 
6070: 6e 45 78 74 72 61 20 29 3b 0a 20 20 20 20 20 20  nExtra );.      
6080: 69 66 28 20 70 43 6f 73 74 3d 3d 30 20 29 7b 20  if( pCost==0 ){ 
6090: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
60a0: 4d 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  M; break; }.    
60b0: 20 20 70 43 6f 73 74 2d 3e 6e 46 72 6f 6d 20 3d    pCost->nFrom =
60c0: 20 28 75 38 29 6e 46 72 6f 6d 3b 0a 20 20 20 20   (u8)nFrom;.    
60d0: 20 20 70 43 6f 73 74 2d 3e 6e 54 6f 20 3d 20 28    pCost->nTo = (
60e0: 75 38 29 6e 54 6f 3b 0a 20 20 20 20 20 20 70 43  u8)nTo;.      pC
60f0: 6f 73 74 2d 3e 69 43 6f 73 74 20 3d 20 28 75 31  ost->iCost = (u1
6100: 36 29 69 43 6f 73 74 3b 0a 20 20 20 20 20 20 6d  6)iCost;.      m
6110: 65 6d 63 70 79 28 70 43 6f 73 74 2d 3e 61 2c 20  emcpy(pCost->a, 
6120: 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 29 3b 0a 20  zFrom, nFrom);. 
6130: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 43 6f 73       memcpy(pCos
6140: 74 2d 3e 61 20 2b 20 6e 46 72 6f 6d 2c 20 7a 54  t->a + nFrom, zT
6150: 6f 2c 20 6e 54 6f 29 3b 0a 20 20 20 20 20 20 70  o, nTo);.      p
6160: 43 6f 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 4c  Cost->pNext = pL
6170: 61 6e 67 2d 3e 70 43 6f 73 74 3b 0a 20 20 20 20  ang->pCost;.    
6180: 20 20 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 20 3d    pLang->pCost =
6190: 20 70 43 6f 73 74 3b 20 0a 20 20 20 20 7d 0a 20   pCost; .    }. 
61a0: 20 7d 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74   }.  rc2 = sqlit
61b0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
61c0: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
61d0: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
61e0: 63 32 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c2;.  return rc;
61f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6200: 20 74 68 65 20 6c 65 6e 67 74 68 20 28 69 6e 20   the length (in 
6210: 62 79 74 65 73 29 20 6f 66 20 61 20 75 74 66 2d  bytes) of a utf-
6220: 38 20 63 68 61 72 61 63 74 65 72 2e 20 20 4f 72  8 character.  Or
6230: 20 72 65 74 75 72 6e 20 61 20 6d 61 78 69 6d 75   return a maximu
6240: 6d 0a 2a 2a 20 6f 66 20 4e 2e 0a 2a 2f 0a 73 74  m.** of N..*/.st
6250: 61 74 69 63 20 69 6e 74 20 75 74 66 38 4c 65 6e  atic int utf8Len
6260: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  (unsigned char c
6270: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20  , int N){.  int 
6280: 6c 65 6e 20 3d 20 31 3b 0a 20 20 69 66 28 20 63  len = 1;.  if( c
6290: 3e 30 78 37 66 20 29 7b 0a 20 20 20 20 69 66 28  >0x7f ){.    if(
62a0: 20 28 63 26 30 78 65 30 29 3d 3d 30 78 63 30 20   (c&0xe0)==0xc0 
62b0: 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 32  ){.      len = 2
62c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
62d0: 28 63 26 30 78 66 30 29 3d 3d 30 78 65 30 20 29  (c&0xf0)==0xe0 )
62e0: 7b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 33 3b  {.      len = 3;
62f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6300: 20 20 6c 65 6e 20 3d 20 34 3b 0a 20 20 20 20 7d    len = 4;.    }
6310: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6e 3e 4e  .  }.  if( len>N
6320: 20 29 20 6c 65 6e 20 3d 20 4e 3b 0a 20 20 72 65   ) len = N;.  re
6330: 74 75 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a  turn len;.}../*.
6340: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  ** Return TRUE (
6350: 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
6360: 20 54 6f 20 73 69 64 65 20 6f 66 20 74 68 65 20   To side of the 
6370: 67 69 76 65 6e 20 63 6f 73 74 20 6d 61 74 63 68  given cost match
6380: 65 73 0a 2a 2a 20 74 68 65 20 67 69 76 65 6e 20  es.** the given 
6390: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
63a0: 63 20 69 6e 74 20 6d 61 74 63 68 54 6f 28 45 64  c int matchTo(Ed
63b0: 69 74 44 69 73 74 33 43 6f 73 74 20 2a 70 2c 20  itDist3Cost *p, 
63c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
63d0: 6e 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e  nt n){.  if( p->
63e0: 6e 54 6f 3e 6e 20 29 20 72 65 74 75 72 6e 20 30  nTo>n ) return 0
63f0: 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28  ;.  if( strncmp(
6400: 70 2d 3e 61 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 7a  p->a+p->nFrom, z
6410: 2c 20 70 2d 3e 6e 54 6f 29 21 3d 30 20 29 20 72  , p->nTo)!=0 ) r
6420: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
6430: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 1;.}../*.** Re
6440: 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
6450: 65 72 6f 29 20 69 66 20 74 68 65 20 46 72 6f 6d  ero) if the From
6460: 20 73 69 64 65 20 6f 66 20 74 68 65 20 67 69 76   side of the giv
6470: 65 6e 20 63 6f 73 74 20 6d 61 74 63 68 65 73 0a  en cost matches.
6480: 2a 2a 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ** the given str
6490: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
64a0: 6e 74 20 6d 61 74 63 68 46 72 6f 6d 28 45 64 69  nt matchFrom(Edi
64b0: 74 44 69 73 74 33 43 6f 73 74 20 2a 70 2c 20 63  tDist3Cost *p, c
64c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
64d0: 74 20 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t n){.  assert( 
64e0: 70 2d 3e 6e 46 72 6f 6d 3c 3d 6e 20 29 3b 0a 20  p->nFrom<=n );. 
64f0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 2d 3e   if( strncmp(p->
6500: 61 2c 20 7a 2c 20 70 2d 3e 6e 46 72 6f 6d 29 21  a, z, p->nFrom)!
6510: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
6520: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
6530: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
6540: 28 6e 6f 6e 2d 7a 65 72 6f 29 20 6f 66 20 74 68  (non-zero) of th
6550: 65 20 6e 65 78 74 20 46 52 4f 4d 20 63 68 61 72  e next FROM char
6560: 61 63 74 65 72 20 61 6e 64 20 74 68 65 20 6e 65  acter and the ne
6570: 78 74 20 54 4f 0a 2a 2a 20 63 68 61 72 61 63 74  xt TO.** charact
6580: 65 72 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e  er are the same.
6590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
65a0: 61 74 63 68 46 72 6f 6d 54 6f 28 0a 20 20 45 64  atchFromTo(.  Ed
65b0: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
65c0: 67 20 2a 70 53 74 72 2c 20 20 2f 2a 20 4c 65 66  g *pStr,  /* Lef
65d0: 74 20 68 61 6e 64 20 73 74 72 69 6e 67 20 2a 2f  t hand string */
65e0: 0a 20 20 69 6e 74 20 6e 31 2c 20 20 20 20 20 20  .  int n1,      
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6600: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6d 70 61  * Index of compa
6610: 72 69 73 6f 6e 20 63 68 61 72 61 63 74 65 72 20  rison character 
6620: 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
6630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 2c   const char *z2,
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6650: 52 69 67 68 74 2d 68 61 6e 64 6c 20 63 6f 6d 70  Right-handl comp
6660: 61 72 69 73 6f 6e 20 63 68 61 72 61 63 74 65 72  arison character
6670: 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 20 20 20 20   */.  int n2    
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 20 20 2f 2a 20 42 79 74 65 73 20 72 65 6d 61 69    /* Bytes remai
66a0: 6e 69 6e 67 20 69 6e 20 7a 32 5b 5d 20 2a 2f 0a  ning in z2[] */.
66b0: 29 7b 0a 20 20 69 6e 74 20 62 31 20 3d 20 70 53  ){.  int b1 = pS
66c0: 74 72 2d 3e 61 5b 6e 31 5d 2e 6e 42 79 74 65 3b  tr->a[n1].nByte;
66d0: 0a 20 20 69 66 28 20 62 31 3e 6e 32 20 29 20 72  .  if( b1>n2 ) r
66e0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6d  eturn 0;.  if( m
66f0: 65 6d 63 6d 70 28 70 53 74 72 2d 3e 7a 2b 6e 31  emcmp(pStr->z+n1
6700: 2c 20 7a 32 2c 20 62 31 29 21 3d 30 20 29 20 72  , z2, b1)!=0 ) r
6710: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
6720: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n 1;.}../*.** De
6730: 6c 65 74 65 20 61 6e 20 45 64 69 74 44 69 73 74  lete an EditDist
6740: 33 46 72 6f 6d 53 74 72 69 6e 67 20 6f 62 6a 65  3FromString obje
6750: 63 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  cct.*/.static vo
6760: 69 64 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d  id editDist3From
6770: 53 74 72 69 6e 67 44 65 6c 65 74 65 28 45 64 69  StringDelete(Edi
6780: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
6790: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
67a0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 66 6f   if( p ){.    fo
67b0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 3b 20 69  r(i=0; i<p->n; i
67c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
67d0: 65 33 5f 66 72 65 65 28 70 2d 3e 61 5b 69 5d 2e  e3_free(p->a[i].
67e0: 61 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 73 71  apDel);.      sq
67f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 5b  lite3_free(p->a[
6800: 69 5d 2e 61 70 53 75 62 73 74 29 3b 0a 20 20 20  i].apSubst);.   
6810: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
6820: 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
6830: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 45 64  *.** Create a Ed
6840: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
6850: 67 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  g object..*/.sta
6860: 74 69 63 20 45 64 69 74 44 69 73 74 33 46 72 6f  tic EditDist3Fro
6870: 6d 53 74 72 69 6e 67 20 2a 65 64 69 74 44 69 73  mString *editDis
6880: 74 33 46 72 6f 6d 53 74 72 69 6e 67 4e 65 77 28  t3FromStringNew(
6890: 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73  .  const EditDis
68a0: 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 0a 20  t3Lang *pLang,. 
68b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 0a   const char *z,.
68c0: 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 45 64 69    int n.){.  Edi
68d0: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
68e0: 20 2a 70 53 74 72 3b 0a 20 20 45 64 69 74 44 69   *pStr;.  EditDi
68f0: 73 74 33 43 6f 73 74 20 2a 70 3b 0a 20 20 69 6e  st3Cost *p;.  in
6900: 74 20 69 3b 0a 0a 20 20 69 66 28 20 7a 3d 3d 30  t i;..  if( z==0
6910: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
6920: 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 28 69 6e  f( n<0 ) n = (in
6930: 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 70  t)strlen(z);.  p
6940: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Str = sqlite3_ma
6950: 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
6960: 70 53 74 72 29 20 2b 20 73 69 7a 65 6f 66 28 70  pStr) + sizeof(p
6970: 53 74 72 2d 3e 61 5b 30 5d 29 2a 6e 20 2b 20 6e  Str->a[0])*n + n
6980: 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 53   + 1 );.  if( pS
6990: 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  tr==0 ) return 0
69a0: 3b 0a 20 20 70 53 74 72 2d 3e 61 20 3d 20 28 45  ;.  pStr->a = (E
69b0: 64 69 74 44 69 73 74 33 46 72 6f 6d 2a 29 26 70  ditDist3From*)&p
69c0: 53 74 72 5b 31 5d 3b 0a 20 20 6d 65 6d 73 65 74  Str[1];.  memset
69d0: 28 70 53 74 72 2d 3e 61 2c 20 30 2c 20 73 69 7a  (pStr->a, 0, siz
69e0: 65 6f 66 28 70 53 74 72 2d 3e 61 5b 30 5d 29 2a  eof(pStr->a[0])*
69f0: 6e 29 3b 0a 20 20 70 53 74 72 2d 3e 6e 20 3d 20  n);.  pStr->n = 
6a00: 6e 3b 0a 20 20 70 53 74 72 2d 3e 7a 20 3d 20 28  n;.  pStr->z = (
6a10: 63 68 61 72 2a 29 26 70 53 74 72 2d 3e 61 5b 6e  char*)&pStr->a[n
6a20: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 53 74 72  ];.  memcpy(pStr
6a30: 2d 3e 7a 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20  ->z, z, n+1);.  
6a40: 69 66 28 20 6e 20 26 26 20 7a 5b 6e 2d 31 5d 3d  if( n && z[n-1]=
6a50: 3d 27 2a 27 20 29 7b 0a 20 20 20 20 70 53 74 72  ='*' ){.    pStr
6a60: 2d 3e 69 73 50 72 65 66 69 78 20 3d 20 31 3b 0a  ->isPrefix = 1;.
6a70: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 70 53 74      n--;.    pSt
6a80: 72 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 70 53 74 72  r->n--;.    pStr
6a90: 2d 3e 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 7d 65  ->z[n] = 0;.  }e
6aa0: 6c 73 65 7b 0a 20 20 20 20 70 53 74 72 2d 3e 69  lse{.    pStr->i
6ab0: 73 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 7d  sPrefix = 0;.  }
6ac0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
6ad0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 64 69 74  ; i++){.    Edit
6ae0: 44 69 73 74 33 46 72 6f 6d 20 2a 70 46 72 6f 6d  Dist3From *pFrom
6af0: 20 3d 20 26 70 53 74 72 2d 3e 61 5b 69 5d 3b 0a   = &pStr->a[i];.
6b00: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 72 6f 6d      memset(pFrom
6b10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 72  , 0, sizeof(*pFr
6b20: 6f 6d 29 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  om));.    pFrom-
6b30: 3e 6e 42 79 74 65 20 3d 20 75 74 66 38 4c 65 6e  >nByte = utf8Len
6b40: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
6b50: 7a 5b 69 5d 2c 20 6e 2d 69 29 3b 0a 20 20 20 20  z[i], n-i);.    
6b60: 66 6f 72 28 70 3d 70 4c 61 6e 67 2d 3e 70 43 6f  for(p=pLang->pCo
6b70: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  st; p; p=p->pNex
6b80: 74 29 7b 0a 20 20 20 20 20 20 45 64 69 74 44 69  t){.      EditDi
6b90: 73 74 33 43 6f 73 74 20 2a 2a 61 70 4e 65 77 3b  st3Cost **apNew;
6ba0: 0a 20 20 20 20 20 20 69 66 28 20 69 2b 70 2d 3e  .      if( i+p->
6bb0: 6e 46 72 6f 6d 3e 6e 20 29 20 63 6f 6e 74 69 6e  nFrom>n ) contin
6bc0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61  ue;.      if( ma
6bd0: 74 63 68 46 72 6f 6d 28 70 2c 20 7a 2b 69 2c 20  tchFrom(p, z+i, 
6be0: 6e 2d 69 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  n-i)==0 ) contin
6bf0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ue;.      if( p-
6c00: 3e 6e 54 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >nTo==0 ){.     
6c10: 20 20 20 61 70 4e 65 77 20 3d 20 73 71 6c 69 74     apNew = sqlit
6c20: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 46 72  e3_realloc64(pFr
6c30: 6f 6d 2d 3e 61 70 44 65 6c 2c 0a 20 20 20 20 20  om->apDel,.     
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
6c60: 66 28 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f 6d  f(*apNew)*(pFrom
6c70: 2d 3e 6e 44 65 6c 2b 31 29 29 3b 0a 20 20 20 20  ->nDel+1));.    
6c80: 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30      if( apNew==0
6c90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6ca0: 20 20 70 46 72 6f 6d 2d 3e 61 70 44 65 6c 20 3d    pFrom->apDel =
6cb0: 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20   apNew;.        
6cc0: 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e 6e 44 65  apNew[pFrom->nDe
6cd0: 6c 2b 2b 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20  l++] = p;.      
6ce0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
6cf0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  pNew = sqlite3_r
6d00: 65 61 6c 6c 6f 63 36 34 28 70 46 72 6f 6d 2d 3e  ealloc64(pFrom->
6d10: 61 70 53 75 62 73 74 2c 0a 20 20 20 20 20 20 20  apSubst,.       
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d30: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
6d40: 2a 61 70 4e 65 77 29 2a 28 70 46 72 6f 6d 2d 3e  *apNew)*(pFrom->
6d50: 6e 53 75 62 73 74 2b 31 29 29 3b 0a 20 20 20 20  nSubst+1));.    
6d60: 20 20 20 20 69 66 28 20 61 70 4e 65 77 3d 3d 30      if( apNew==0
6d70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6d80: 20 20 70 46 72 6f 6d 2d 3e 61 70 53 75 62 73 74    pFrom->apSubst
6d90: 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 20 20   = apNew;.      
6da0: 20 20 61 70 4e 65 77 5b 70 46 72 6f 6d 2d 3e 6e    apNew[pFrom->n
6db0: 53 75 62 73 74 2b 2b 5d 20 3d 20 70 3b 0a 20 20  Subst++] = p;.  
6dc0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6dd0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 65  if( p ){.      e
6de0: 64 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69  ditDist3FromStri
6df0: 6e 67 44 65 6c 65 74 65 28 70 53 74 72 29 3b 0a  ngDelete(pStr);.
6e00: 20 20 20 20 20 20 70 53 74 72 20 3d 20 30 3b 0a        pStr = 0;.
6e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6e20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6e30: 70 53 74 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  pStr;.}../*.** U
6e40: 70 64 61 74 65 20 65 6e 74 72 79 20 6d 5b 69 5d  pdate entry m[i]
6e50: 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
6e60: 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 66 20   the minimum of 
6e70: 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
6e80: 65 0a 2a 2a 20 61 6e 64 20 6d 5b 6a 5d 2b 69 43  e.** and m[j]+iC
6e90: 6f 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ost..**.** If th
6ea0: 65 20 69 43 6f 73 74 20 69 73 20 31 2c 30 30 30  e iCost is 1,000
6eb0: 2c 30 30 30 20 6f 72 20 67 72 65 61 74 65 72 2c  ,000 or greater,
6ec0: 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
6ed0: 68 65 20 63 6f 73 74 20 74 6f 20 62 65 0a 2a 2a  he cost to be.**
6ee0: 20 69 6e 66 69 6e 69 74 65 20 61 6e 64 20 73 6b   infinite and sk
6ef0: 69 70 20 74 68 65 20 75 70 64 61 74 65 2e 0a 2a  ip the update..*
6f00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
6f10: 64 61 74 65 43 6f 73 74 28 0a 20 20 75 6e 73 69  dateCost(.  unsi
6f20: 67 6e 65 64 20 69 6e 74 20 2a 6d 2c 0a 20 20 69  gned int *m,.  i
6f30: 6e 74 20 69 2c 0a 20 20 69 6e 74 20 6a 2c 0a 20  nt i,.  int j,. 
6f40: 20 69 6e 74 20 69 43 6f 73 74 0a 29 7b 0a 20 20   int iCost.){.  
6f50: 61 73 73 65 72 74 28 20 69 43 6f 73 74 3e 3d 30  assert( iCost>=0
6f60: 20 29 3b 0a 20 20 69 66 28 20 69 43 6f 73 74 3c   );.  if( iCost<
6f70: 31 30 30 30 30 20 29 7b 0a 20 20 20 20 75 6e 73  10000 ){.    uns
6f80: 69 67 6e 65 64 20 69 6e 74 20 62 20 3d 20 6d 5b  igned int b = m[
6f90: 6a 5d 20 2b 20 69 43 6f 73 74 3b 0a 20 20 20 20  j] + iCost;.    
6fa0: 69 66 28 20 62 3c 6d 5b 69 5d 20 29 20 6d 5b 69  if( b<m[i] ) m[i
6fb0: 5d 20 3d 20 62 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ] = b;.  }.}../*
6fc0: 0a 2a 2a 20 48 6f 77 20 6d 75 63 68 20 73 74 61  .** How much sta
6fd0: 63 6b 20 73 70 61 63 65 20 28 69 6e 74 20 62 79  ck space (int by
6fe0: 74 65 73 29 20 74 6f 20 75 73 65 20 66 6f 72 20  tes) to use for 
6ff0: 57 61 67 6e 65 72 20 6d 61 74 72 69 78 20 69 6e  Wagner matrix in
7000: 20 0a 2a 2a 20 65 64 69 74 44 69 73 74 33 43 6f   .** editDist3Co
7010: 72 65 28 29 2e 20 20 49 66 20 6d 6f 72 65 20 73  re().  If more s
7020: 70 61 63 65 20 74 68 61 6e 20 74 68 69 73 20 69  pace than this i
7030: 73 20 72 65 71 75 69 72 65 64 2c 20 74 68 65 20  s required, the 
7040: 65 6e 74 69 72 65 0a 2a 2a 20 6d 61 74 72 69 78  entire.** matrix
7050: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
7060: 68 65 20 68 65 61 70 2e 20 20 54 6f 20 72 65 64  he heap.  To red
7070: 75 63 65 20 74 68 65 20 6c 6f 61 64 20 6f 6e 20  uce the load on 
7080: 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  the memory.** al
7090: 6c 6f 63 61 74 6f 72 2c 20 6d 61 6b 65 20 74 68  locator, make th
70a0: 69 73 20 76 61 6c 75 65 20 61 73 20 6c 61 72 67  is value as larg
70b0: 65 20 61 73 20 70 72 61 63 74 69 63 61 6c 20 66  e as practical f
70c0: 6f 72 20 74 68 65 0a 2a 2a 20 61 72 63 68 69 74  or the.** archit
70d0: 65 63 74 75 72 65 20 69 6e 20 75 73 65 2e 0a 2a  ecture in use..*
70e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
70f0: 5f 53 50 45 4c 4c 46 49 58 5f 53 54 41 43 4b 41  _SPELLFIX_STACKA
7100: 4c 4c 4f 43 5f 53 5a 0a 23 20 64 65 66 69 6e 65  LLOC_SZ.# define
7110: 20 53 51 4c 49 54 45 5f 53 50 45 4c 4c 46 49 58   SQLITE_SPELLFIX
7120: 5f 53 54 41 43 4b 41 4c 4c 4f 43 5f 53 5a 20 20  _STACKALLOC_SZ  
7130: 28 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f  (1024).#endif../
7140: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 65 64  * Compute the ed
7150: 69 74 20 64 69 73 74 61 6e 63 65 20 62 65 74 77  it distance betw
7160: 65 65 6e 20 74 77 6f 20 73 74 72 69 6e 67 73 2e  een two strings.
7170: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
7180: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
7190: 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  n a negative num
71a0: 62 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ber which is the
71b0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
71c0: 2a 2a 20 49 66 20 70 6e 4d 61 74 63 68 20 69 73  ** If pnMatch is
71d0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
71e0: 2a 70 6e 4d 61 74 63 68 20 69 73 20 73 65 74 20  *pnMatch is set 
71f0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
7200: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 28   characters.** (
7210: 6e 6f 74 20 62 79 74 65 73 29 20 69 6e 20 7a 32  not bytes) in z2
7220: 20 74 68 61 74 20 6d 61 74 63 68 65 64 20 74 68   that matched th
7230: 65 20 73 65 61 72 63 68 20 70 61 74 74 65 72 6e  e search pattern
7240: 20 69 6e 20 2a 70 46 72 6f 6d 2e 20 49 66 20 70   in *pFrom. If p
7250: 46 72 6f 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  From does.** not
7260: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 70 61 74   contain the pat
7270: 74 65 72 6e 20 66 6f 72 20 61 20 70 72 65 66 69  tern for a prefi
7280: 78 2d 73 65 61 72 63 68 2c 20 74 68 65 6e 20 74  x-search, then t
7290: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
72a0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 63  e number.** of c
72b0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 32 2e  haracters in z2.
72c0: 20 49 66 20 70 46 72 6f 6d 20 64 6f 65 73 20 63   If pFrom does c
72d0: 6f 6e 74 61 69 6e 20 61 20 70 72 65 66 69 78 20  ontain a prefix 
72e0: 73 65 61 72 63 68 20 70 61 74 74 65 72 6e 2c 20  search pattern, 
72f0: 74 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 74 68  then.** it is th
7300: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
7310: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 70 72  acters in the pr
7320: 65 66 69 78 20 6f 66 20 7a 32 20 74 68 61 74 20  efix of z2 that 
7330: 77 61 73 20 64 65 65 6d 65 64 20 74 6f 20 0a 2a  was deemed to .*
7340: 2a 20 6d 61 74 63 68 20 70 46 72 6f 6d 2e 0a 2a  * match pFrom..*
7350: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69  /.static int edi
7360: 74 44 69 73 74 33 43 6f 72 65 28 0a 20 20 45 64  tDist3Core(.  Ed
7370: 69 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e  itDist3FromStrin
7380: 67 20 2a 70 46 72 6f 6d 2c 20 20 2f 2a 20 54 68  g *pFrom,  /* Th
7390: 65 20 46 52 4f 4d 20 73 74 72 69 6e 67 20 2a 2f  e FROM string */
73a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
73b0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
73c0: 2f 2a 20 54 68 65 20 54 4f 20 73 74 72 69 6e 67  /* The TO string
73d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c 20 20 20   */.  int n2,   
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
7400: 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f  the TO string */
7410: 0a 20 20 63 6f 6e 73 74 20 45 64 69 74 44 69 73  .  const EditDis
7420: 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67 2c 20 20  t3Lang *pLang,  
7430: 2f 2a 20 45 64 69 74 20 77 65 69 67 68 74 73 20  /* Edit weights 
7440: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
7450: 20 6c 61 6e 67 75 61 67 65 20 49 44 20 2a 2f 0a   language ID */.
7460: 20 20 69 6e 74 20 2a 70 6e 4d 61 74 63 68 20 20    int *pnMatch  
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7480: 2a 20 4f 55 54 3a 20 43 68 61 72 61 63 74 65 72  * OUT: Character
7490: 73 20 69 6e 20 6d 61 74 63 68 65 64 20 70 72 65  s in matched pre
74a0: 66 69 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  fix */.){.  int 
74b0: 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 31 2c 20  k, n;.  int i1, 
74c0: 62 31 3b 0a 20 20 69 6e 74 20 69 32 2c 20 62 32  b1;.  int i2, b2
74d0: 3b 0a 20 20 45 64 69 74 44 69 73 74 33 46 72 6f  ;.  EditDist3Fro
74e0: 6d 53 74 72 69 6e 67 20 66 20 3d 20 2a 70 46 72  mString f = *pFr
74f0: 6f 6d 3b 0a 20 20 45 64 69 74 44 69 73 74 33 54  om;.  EditDist3T
7500: 6f 20 2a 61 32 3b 0a 20 20 75 6e 73 69 67 6e 65  o *a2;.  unsigne
7510: 64 20 69 6e 74 20 2a 6d 3b 0a 20 20 75 6e 73 69  d int *m;.  unsi
7520: 67 6e 65 64 20 69 6e 74 20 2a 70 54 6f 46 72 65  gned int *pToFre
7530: 65 3b 0a 20 20 69 6e 74 20 73 7a 52 6f 77 3b 0a  e;.  int szRow;.
7540: 20 20 45 64 69 74 44 69 73 74 33 43 6f 73 74 20    EditDist3Cost 
7550: 2a 70 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  *p;.  int res;. 
7560: 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20   sqlite3_uint64 
7570: 6e 42 79 74 65 3b 0a 20 20 75 6e 73 69 67 6e 65  nByte;.  unsigne
7580: 64 20 69 6e 74 20 73 74 61 63 6b 53 70 61 63 65  d int stackSpace
7590: 5b 53 51 4c 49 54 45 5f 53 50 45 4c 4c 46 49 58  [SQLITE_SPELLFIX
75a0: 5f 53 54 41 43 4b 41 4c 4c 4f 43 5f 53 5a 2f 73  _STACKALLOC_SZ/s
75b0: 69 7a 65 6f 66 28 75 6e 73 69 67 6e 65 64 20 69  izeof(unsigned i
75c0: 6e 74 29 5d 3b 0a 0a 20 20 2f 2a 20 61 6c 6c 6f  nt)];..  /* allo
75d0: 63 61 74 65 20 74 68 65 20 57 61 67 6e 65 72 20  cate the Wagner 
75e0: 6d 61 74 72 69 78 20 61 6e 64 20 74 68 65 20 61  matrix and the a
75f0: 54 6f 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 74  To[] array for t
7600: 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a 2f 0a  he TO string */.
7610: 20 20 6e 20 3d 20 28 66 2e 6e 2b 31 29 2a 28 6e    n = (f.n+1)*(n
7620: 32 2b 31 29 3b 0a 20 20 6e 20 3d 20 28 6e 2b 31  2+1);.  n = (n+1
7630: 29 26 7e 31 3b 0a 20 20 6e 42 79 74 65 20 3d 20  )&~1;.  nByte = 
7640: 6e 2a 73 69 7a 65 6f 66 28 6d 5b 30 5d 29 20 2b  n*sizeof(m[0]) +
7650: 20 73 69 7a 65 6f 66 28 61 32 5b 30 5d 29 2a 6e   sizeof(a2[0])*n
7660: 32 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 3d  2;.  if( nByte<=
7670: 73 69 7a 65 6f 66 28 73 74 61 63 6b 53 70 61 63  sizeof(stackSpac
7680: 65 29 20 29 7b 0a 20 20 20 20 6d 20 3d 20 73 74  e) ){.    m = st
7690: 61 63 6b 53 70 61 63 65 3b 0a 20 20 20 20 70 54  ackSpace;.    pT
76a0: 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  oFree = 0;.  }el
76b0: 73 65 7b 0a 20 20 20 20 6d 20 3d 20 70 54 6f 46  se{.    m = pToF
76c0: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ree = sqlite3_ma
76d0: 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 20 29 3b  lloc64( nByte );
76e0: 0a 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 20  .    if( m==0 ) 
76f0: 72 65 74 75 72 6e 20 2d 31 3b 20 20 20 20 20 20  return -1;      
7700: 20 20 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20        /* Out of 
7710: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 7d 0a 20 20  memory */.  }.  
7720: 61 32 20 3d 20 28 45 64 69 74 44 69 73 74 33 54  a2 = (EditDist3T
7730: 6f 2a 29 26 6d 5b 6e 5d 3b 0a 20 20 6d 65 6d 73  o*)&m[n];.  mems
7740: 65 74 28 61 32 2c 20 30 2c 20 73 69 7a 65 6f 66  et(a2, 0, sizeof
7750: 28 61 32 5b 30 5d 29 2a 6e 32 29 3b 0a 0a 20 20  (a2[0])*n2);..  
7760: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 61  /* Fill in the a
7770: 31 5b 5d 20 6d 61 74 72 69 78 20 66 6f 72 20 61  1[] matrix for a
7780: 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20 6f 66  ll characters of
7790: 20 74 68 65 20 54 4f 20 73 74 72 69 6e 67 20 2a   the TO string *
77a0: 2f 0a 20 20 66 6f 72 28 69 32 3d 30 3b 20 69 32  /.  for(i2=0; i2
77b0: 3c 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20 20 20 20  <n2; i2++){.    
77c0: 61 32 5b 69 32 5d 2e 6e 42 79 74 65 20 3d 20 75  a2[i2].nByte = u
77d0: 74 66 38 4c 65 6e 28 28 75 6e 73 69 67 6e 65 64  tf8Len((unsigned
77e0: 20 63 68 61 72 29 7a 32 5b 69 32 5d 2c 20 6e 32   char)z2[i2], n2
77f0: 2d 69 32 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d  -i2);.    for(p=
7800: 70 4c 61 6e 67 2d 3e 70 43 6f 73 74 3b 20 70 3b  pLang->pCost; p;
7810: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
7820: 20 20 20 20 45 64 69 74 44 69 73 74 33 43 6f 73      EditDist3Cos
7830: 74 20 2a 2a 61 70 4e 65 77 3b 0a 20 20 20 20 20  t **apNew;.     
7840: 20 69 66 28 20 70 2d 3e 6e 46 72 6f 6d 3e 30 20   if( p->nFrom>0 
7850: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7860: 20 20 69 66 28 20 69 32 2b 70 2d 3e 6e 54 6f 3e    if( i2+p->nTo>
7870: 6e 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  n2 ) continue;. 
7880: 20 20 20 20 20 69 66 28 20 6d 61 74 63 68 54 6f       if( matchTo
7890: 28 70 2c 20 7a 32 2b 69 32 2c 20 6e 32 2d 69 32  (p, z2+i2, n2-i2
78a0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
78b0: 0a 20 20 20 20 20 20 61 32 5b 69 32 5d 2e 6e 49  .      a2[i2].nI
78c0: 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 61 70 4e 65  ns++;.      apNe
78d0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
78e0: 6c 6f 63 36 34 28 61 32 5b 69 32 5d 2e 61 70 49  loc64(a2[i2].apI
78f0: 6e 73 2c 20 73 69 7a 65 6f 66 28 2a 61 70 4e 65  ns, sizeof(*apNe
7900: 77 29 2a 61 32 5b 69 32 5d 2e 6e 49 6e 73 29 3b  w)*a2[i2].nIns);
7910: 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
7920: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
7930: 65 73 20 3d 20 2d 31 3b 20 20 2f 2a 20 4f 75 74  es = -1;  /* Out
7940: 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
7950: 20 20 20 20 20 20 67 6f 74 6f 20 65 64 69 74 44        goto editD
7960: 69 73 74 33 41 62 6f 72 74 3b 0a 20 20 20 20 20  ist3Abort;.     
7970: 20 7d 0a 20 20 20 20 20 20 61 32 5b 69 32 5d 2e   }.      a2[i2].
7980: 61 70 49 6e 73 20 3d 20 61 70 4e 65 77 3b 0a 20  apIns = apNew;. 
7990: 20 20 20 20 20 61 32 5b 69 32 5d 2e 61 70 49 6e       a2[i2].apIn
79a0: 73 5b 61 32 5b 69 32 5d 2e 6e 49 6e 73 2d 31 5d  s[a2[i2].nIns-1]
79b0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = p;.    }.  }.
79c0: 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 6f  .  /* Prepare to
79d0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 69 6e   compute the min
79e0: 69 6d 75 6d 20 65 64 69 74 20 64 69 73 74 61 6e  imum edit distan
79f0: 63 65 20 2a 2f 0a 20 20 73 7a 52 6f 77 20 3d 20  ce */.  szRow = 
7a00: 66 2e 6e 2b 31 3b 0a 20 20 6d 65 6d 73 65 74 28  f.n+1;.  memset(
7a10: 6d 2c 20 30 78 30 31 2c 20 28 6e 32 2b 31 29 2a  m, 0x01, (n2+1)*
7a20: 73 7a 52 6f 77 2a 73 69 7a 65 6f 66 28 6d 5b 30  szRow*sizeof(m[0
7a30: 5d 29 29 3b 0a 20 20 6d 5b 30 5d 20 3d 20 30 3b  ]));.  m[0] = 0;
7a40: 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 66 69 6c  ..  /* First fil
7a50: 6c 20 69 6e 20 74 68 65 20 74 6f 70 2d 72 6f 77  l in the top-row
7a60: 20 6f 66 20 74 68 65 20 6d 61 74 72 69 78 20 77   of the matrix w
7a70: 69 74 68 20 46 52 4f 4d 20 64 65 6c 65 74 69 6f  ith FROM deletio
7a80: 6e 20 63 6f 73 74 73 20 2a 2f 0a 20 20 66 6f 72  n costs */.  for
7a90: 28 69 31 3d 30 3b 20 69 31 3c 66 2e 6e 3b 20 69  (i1=0; i1<f.n; i
7aa0: 31 20 2b 3d 20 62 31 29 7b 0a 20 20 20 20 62 31  1 += b1){.    b1
7ab0: 20 3d 20 66 2e 61 5b 69 31 5d 2e 6e 42 79 74 65   = f.a[i1].nByte
7ac0: 3b 0a 20 20 20 20 75 70 64 61 74 65 43 6f 73 74  ;.    updateCost
7ad0: 28 6d 2c 20 69 31 2b 62 31 2c 20 69 31 2c 20 70  (m, i1+b1, i1, p
7ae0: 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f 73 74 29 3b  Lang->iDelCost);
7af0: 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
7b00: 66 2e 61 5b 69 31 5d 2e 6e 44 65 6c 3b 20 6b 2b  f.a[i1].nDel; k+
7b10: 2b 29 7b 0a 20 20 20 20 20 20 70 20 3d 20 66 2e  +){.      p = f.
7b20: 61 5b 69 31 5d 2e 61 70 44 65 6c 5b 6b 5d 3b 0a  a[i1].apDel[k];.
7b30: 20 20 20 20 20 20 75 70 64 61 74 65 43 6f 73 74        updateCost
7b40: 28 6d 2c 20 69 31 2b 70 2d 3e 6e 46 72 6f 6d 2c  (m, i1+p->nFrom,
7b50: 20 69 31 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a   i1, p->iCost);.
7b60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7b70: 46 69 6c 6c 20 69 6e 20 61 6c 6c 20 73 75 62 73  Fill in all subs
7b80: 65 71 75 65 6e 74 20 72 6f 77 73 2c 20 74 6f 70  equent rows, top
7b90: 2d 74 6f 2d 62 6f 74 74 6f 6d 2c 20 6c 65 66 74  -to-bottom, left
7ba0: 2d 74 6f 2d 72 69 67 68 74 20 2a 2f 0a 20 20 66  -to-right */.  f
7bb0: 6f 72 28 69 32 3d 30 3b 20 69 32 3c 6e 32 3b 20  or(i2=0; i2<n2; 
7bc0: 69 32 20 2b 3d 20 62 32 29 7b 0a 20 20 20 20 69  i2 += b2){.    i
7bd0: 6e 74 20 72 78 3b 20 20 20 20 20 20 2f 2a 20 53  nt rx;      /* S
7be0: 74 61 72 74 69 6e 67 20 69 6e 64 65 78 20 66 6f  tarting index fo
7bf0: 72 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f  r current row */
7c00: 0a 20 20 20 20 69 6e 74 20 72 78 70 3b 20 20 20  .    int rxp;   
7c10: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 69 6e    /* Starting in
7c20: 64 65 78 20 66 6f 72 20 70 72 65 76 69 6f 75 73  dex for previous
7c30: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 62 32 20 3d   row */.    b2 =
7c40: 20 61 32 5b 69 32 5d 2e 6e 42 79 74 65 3b 0a 20   a2[i2].nByte;. 
7c50: 20 20 20 72 78 20 3d 20 73 7a 52 6f 77 2a 28 69     rx = szRow*(i
7c60: 32 2b 62 32 29 3b 0a 20 20 20 20 72 78 70 20 3d  2+b2);.    rxp =
7c70: 20 73 7a 52 6f 77 2a 69 32 3b 0a 20 20 20 20 75   szRow*i2;.    u
7c80: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 72 78 2c  pdateCost(m, rx,
7c90: 20 72 78 70 2c 20 70 4c 61 6e 67 2d 3e 69 49 6e   rxp, pLang->iIn
7ca0: 73 43 6f 73 74 29 3b 0a 20 20 20 20 66 6f 72 28  sCost);.    for(
7cb0: 6b 3d 30 3b 20 6b 3c 61 32 5b 69 32 5d 2e 6e 49  k=0; k<a2[i2].nI
7cc0: 6e 73 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ns; k++){.      
7cd0: 70 20 3d 20 61 32 5b 69 32 5d 2e 61 70 49 6e 73  p = a2[i2].apIns
7ce0: 5b 6b 5d 3b 0a 20 20 20 20 20 20 75 70 64 61 74  [k];.      updat
7cf0: 65 43 6f 73 74 28 6d 2c 20 73 7a 52 6f 77 2a 28  eCost(m, szRow*(
7d00: 69 32 2b 70 2d 3e 6e 54 6f 29 2c 20 72 78 70 2c  i2+p->nTo), rxp,
7d10: 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20   p->iCost);.    
7d20: 7d 0a 20 20 20 20 66 6f 72 28 69 31 3d 30 3b 20  }.    for(i1=0; 
7d30: 69 31 3c 66 2e 6e 3b 20 69 31 2b 3d 62 31 29 7b  i1<f.n; i1+=b1){
7d40: 0a 20 20 20 20 20 20 69 6e 74 20 63 78 3b 20 20  .      int cx;  
7d50: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75    /* Index of cu
7d60: 72 72 65 6e 74 20 63 65 6c 6c 20 2a 2f 0a 20 20  rrent cell */.  
7d70: 20 20 20 20 69 6e 74 20 63 78 70 3b 20 20 20 2f      int cxp;   /
7d80: 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20  * Index of cell 
7d90: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 74  immediately to t
7da0: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
7db0: 20 69 6e 74 20 63 78 64 3b 20 20 20 2f 2a 20 49   int cxd;   /* I
7dc0: 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20  ndex of cell to 
7dd0: 74 68 65 20 6c 65 66 74 20 61 6e 64 20 6f 6e 65  the left and one
7de0: 20 72 6f 77 20 61 62 6f 76 65 20 2a 2f 0a 20 20   row above */.  
7df0: 20 20 20 20 69 6e 74 20 63 78 75 3b 20 20 20 2f      int cxu;   /
7e00: 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20  * Index of cell 
7e10: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 62 6f 76  immediately abov
7e20: 65 20 2a 2f 0a 20 20 20 20 20 20 62 31 20 3d 20  e */.      b1 = 
7e30: 66 2e 61 5b 69 31 5d 2e 6e 42 79 74 65 3b 0a 20  f.a[i1].nByte;. 
7e40: 20 20 20 20 20 63 78 70 20 3d 20 72 78 20 2b 20       cxp = rx + 
7e50: 69 31 3b 0a 20 20 20 20 20 20 63 78 20 3d 20 63  i1;.      cx = c
7e60: 78 70 20 2b 20 62 31 3b 0a 20 20 20 20 20 20 63  xp + b1;.      c
7e70: 78 64 20 3d 20 72 78 70 20 2b 20 69 31 3b 0a 20  xd = rxp + i1;. 
7e80: 20 20 20 20 20 63 78 75 20 3d 20 63 78 64 20 2b       cxu = cxd +
7e90: 20 62 31 3b 0a 20 20 20 20 20 20 75 70 64 61 74   b1;.      updat
7ea0: 65 43 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 70  eCost(m, cx, cxp
7eb0: 2c 20 70 4c 61 6e 67 2d 3e 69 44 65 6c 43 6f 73  , pLang->iDelCos
7ec0: 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  t);.      for(k=
7ed0: 30 3b 20 6b 3c 66 2e 61 5b 69 31 5d 2e 6e 44 65  0; k<f.a[i1].nDe
7ee0: 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
7ef0: 20 70 20 3d 20 66 2e 61 5b 69 31 5d 2e 61 70 44   p = f.a[i1].apD
7f00: 65 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 75  el[k];.        u
7f10: 70 64 61 74 65 43 6f 73 74 28 6d 2c 20 63 78 70  pdateCost(m, cxp
7f20: 2b 70 2d 3e 6e 46 72 6f 6d 2c 20 63 78 70 2c 20  +p->nFrom, cxp, 
7f30: 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20 20 20  p->iCost);.     
7f40: 20 7d 0a 20 20 20 20 20 20 75 70 64 61 74 65 43   }.      updateC
7f50: 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 75 2c 20  ost(m, cx, cxu, 
7f60: 70 4c 61 6e 67 2d 3e 69 49 6e 73 43 6f 73 74 29  pLang->iInsCost)
7f70: 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63  ;.      if( matc
7f80: 68 46 72 6f 6d 54 6f 28 26 66 2c 20 69 31 2c 20  hFromTo(&f, i1, 
7f90: 7a 32 2b 69 32 2c 20 6e 32 2d 69 32 29 20 29 7b  z2+i2, n2-i2) ){
7fa0: 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 43  .        updateC
7fb0: 6f 73 74 28 6d 2c 20 63 78 2c 20 63 78 64 2c 20  ost(m, cx, cxd, 
7fc0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
7fd0: 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d 2c 20    updateCost(m, 
7fe0: 63 78 2c 20 63 78 64 2c 20 70 4c 61 6e 67 2d 3e  cx, cxd, pLang->
7ff0: 69 53 75 62 43 6f 73 74 29 3b 0a 20 20 20 20 20  iSubCost);.     
8000: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 66 2e 61 5b   for(k=0; k<f.a[
8010: 69 31 5d 2e 6e 53 75 62 73 74 3b 20 6b 2b 2b 29  i1].nSubst; k++)
8020: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 66 2e  {.        p = f.
8030: 61 5b 69 31 5d 2e 61 70 53 75 62 73 74 5b 6b 5d  a[i1].apSubst[k]
8040: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61  ;.        if( ma
8050: 74 63 68 54 6f 28 70 2c 20 7a 32 2b 69 32 2c 20  tchTo(p, z2+i2, 
8060: 6e 32 2d 69 32 29 20 29 7b 0a 20 20 20 20 20 20  n2-i2) ){.      
8070: 20 20 20 20 75 70 64 61 74 65 43 6f 73 74 28 6d      updateCost(m
8080: 2c 20 63 78 64 2b 70 2d 3e 6e 46 72 6f 6d 2b 73  , cxd+p->nFrom+s
8090: 7a 52 6f 77 2a 70 2d 3e 6e 54 6f 2c 20 63 78 64  zRow*p->nTo, cxd
80a0: 2c 20 70 2d 3e 69 43 6f 73 74 29 3b 0a 20 20 20  , p->iCost);.   
80b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
80c0: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 30 20     }.  }..#if 0 
80d0: 20 2f 2a 20 45 6e 61 62 6c 65 20 66 6f 72 20 64   /* Enable for d
80e0: 65 62 75 67 67 69 6e 67 20 2a 2f 0a 20 20 70 72  ebugging */.  pr
80f0: 69 6e 74 66 28 22 20 20 20 20 20 20 20 20 20 5e  intf("         ^
8100: 22 29 3b 0a 20 20 66 6f 72 28 69 31 3d 30 3b 20  ");.  for(i1=0; 
8110: 69 31 3c 66 2e 6e 3b 20 69 31 2b 2b 29 20 70 72  i1<f.n; i1++) pr
8120: 69 6e 74 66 28 22 20 25 63 2d 25 32 78 22 2c 20  intf(" %c-%2x", 
8130: 66 2e 7a 5b 69 31 5d 2c 20 66 2e 7a 5b 69 31 5d  f.z[i1], f.z[i1]
8140: 26 30 78 66 66 29 3b 0a 20 20 70 72 69 6e 74 66  &0xff);.  printf
8150: 28 22 5c 6e 20 20 20 5e 3a 22 29 3b 0a 20 20 66  ("\n   ^:");.  f
8160: 6f 72 28 69 31 3d 30 3b 20 69 31 3c 73 7a 52 6f  or(i1=0; i1<szRo
8170: 77 3b 20 69 31 2b 2b 29 7b 0a 20 20 20 20 69 6e  w; i1++){.    in
8180: 74 20 76 20 3d 20 6d 5b 69 31 5d 3b 0a 20 20 20  t v = m[i1];.   
8190: 20 69 66 28 20 76 3e 39 39 39 39 20 29 20 70 72   if( v>9999 ) pr
81a0: 69 6e 74 66 28 22 20 2a 2a 2a 2a 22 29 3b 0a 20  intf(" ****");. 
81b0: 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
81c0: 70 72 69 6e 74 66 28 22 20 25 34 64 22 2c 20 76  printf(" %4d", v
81d0: 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28  );.  }.  printf(
81e0: 22 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 32 3d  "\n");.  for(i2=
81f0: 30 3b 20 69 32 3c 6e 32 3b 20 69 32 2b 2b 29 7b  0; i2<n2; i2++){
8200: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 63 2d  .    printf("%c-
8210: 25 30 32 78 3a 22 2c 20 7a 32 5b 69 32 5d 2c 20  %02x:", z2[i2], 
8220: 7a 32 5b 69 32 5d 26 30 78 66 66 29 3b 0a 20 20  z2[i2]&0xff);.  
8230: 20 20 66 6f 72 28 69 31 3d 30 3b 20 69 31 3c 73    for(i1=0; i1<s
8240: 7a 52 6f 77 3b 20 69 31 2b 2b 29 7b 0a 20 20 20  zRow; i1++){.   
8250: 20 20 20 69 6e 74 20 76 20 3d 20 6d 5b 28 69 32     int v = m[(i2
8260: 2b 31 29 2a 73 7a 52 6f 77 2b 69 31 5d 3b 0a 20  +1)*szRow+i1];. 
8270: 20 20 20 20 20 69 66 28 20 76 3e 39 39 39 39 20       if( v>9999 
8280: 29 20 70 72 69 6e 74 66 28 22 20 2a 2a 2a 2a 22  ) printf(" ****"
8290: 29 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20  );.      else   
82a0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25        printf(" %
82b0: 34 64 22 2c 20 76 29 3b 0a 20 20 20 20 7d 0a 20  4d", v);.    }. 
82c0: 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
82d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
82e0: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 20 61 6c  * Free memory al
82f0: 6c 6f 63 61 74 69 6f 6e 73 20 61 6e 64 20 72 65  locations and re
8300: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
8310: 2a 2f 0a 20 20 72 65 73 20 3d 20 28 69 6e 74 29  */.  res = (int)
8320: 6d 5b 73 7a 52 6f 77 2a 28 6e 32 2b 31 29 2d 31  m[szRow*(n2+1)-1
8330: 5d 3b 0a 20 20 6e 20 3d 20 6e 32 3b 0a 20 20 69  ];.  n = n2;.  i
8340: 66 28 20 66 2e 69 73 50 72 65 66 69 78 20 29 7b  f( f.isPrefix ){
8350: 0a 20 20 20 20 66 6f 72 28 69 32 3d 31 3b 20 69  .    for(i2=1; i
8360: 32 3c 3d 6e 32 3b 20 69 32 2b 2b 29 7b 0a 20 20  2<=n2; i2++){.  
8370: 20 20 20 20 69 6e 74 20 62 20 3d 20 6d 5b 73 7a      int b = m[sz
8380: 52 6f 77 2a 69 32 2d 31 5d 3b 0a 20 20 20 20 20  Row*i2-1];.     
8390: 20 69 66 28 20 62 3c 3d 72 65 73 20 29 7b 20 0a   if( b<=res ){ .
83a0: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 62 3b          res = b;
83b0: 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 69 32 20  .        n = i2 
83c0: 2d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  - 1;.      }.   
83d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 4d   }.  }.  if( pnM
83e0: 61 74 63 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  atch ){.    int 
83f0: 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 20 20  nExtra = 0;.    
8400: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 3b 20 6b 2b  for(k=0; k<n; k+
8410: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a  +){.      if( (z
8420: 32 5b 6b 5d 20 26 20 30 78 63 30 29 3d 3d 30 78  2[k] & 0xc0)==0x
8430: 38 30 20 29 20 6e 45 78 74 72 61 2b 2b 3b 0a 20  80 ) nExtra++;. 
8440: 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4d 61 74 63     }.    *pnMatc
8450: 68 20 3d 20 6e 20 2d 20 6e 45 78 74 72 61 3b 0a  h = n - nExtra;.
8460: 20 20 7d 0a 0a 65 64 69 74 44 69 73 74 33 41 62    }..editDist3Ab
8470: 6f 72 74 3a 0a 20 20 66 6f 72 28 69 32 3d 30 3b  ort:.  for(i2=0;
8480: 20 69 32 3c 6e 32 3b 20 69 32 2b 2b 29 20 73 71   i2<n2; i2++) sq
8490: 6c 69 74 65 33 5f 66 72 65 65 28 61 32 5b 69 32  lite3_free(a2[i2
84a0: 5d 2e 61 70 49 6e 73 29 3b 0a 20 20 73 71 6c 69  ].apIns);.  sqli
84b0: 74 65 33 5f 66 72 65 65 28 70 54 6f 46 72 65 65  te3_free(pToFree
84c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
84d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
84e0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 45 64 69   appropriate Edi
84f0: 74 44 69 73 74 33 4c 61 6e 67 20 6f 62 6a 65 63  tDist3Lang objec
8500: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  t..*/.static con
8510: 73 74 20 45 64 69 74 44 69 73 74 33 4c 61 6e 67  st EditDist3Lang
8520: 20 2a 65 64 69 74 44 69 73 74 33 46 69 6e 64 4c   *editDist3FindL
8530: 61 6e 67 28 0a 20 20 45 64 69 74 44 69 73 74 33  ang(.  EditDist3
8540: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
8550: 0a 20 20 69 6e 74 20 69 4c 61 6e 67 0a 29 7b 0a  .  int iLang.){.
8560: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
8570: 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
8580: 4c 61 6e 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lang; i++){.    
8590: 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 5b 69  if( pConfig->a[i
85a0: 5d 2e 69 4c 61 6e 67 3d 3d 69 4c 61 6e 67 20 29  ].iLang==iLang )
85b0: 20 72 65 74 75 72 6e 20 26 70 43 6f 6e 66 69 67   return &pConfig
85c0: 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ->a[i];.  }.  re
85d0: 74 75 72 6e 20 26 65 64 69 74 44 69 73 74 33 4c  turn &editDist3L
85e0: 61 6e 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75  ang;.}../*.** Fu
85f0: 6e 63 74 69 6f 6e 3a 20 20 20 20 65 64 69 74 64  nction:    editd
8600: 69 73 74 33 28 41 2c 42 2c 69 4c 61 6e 67 29 0a  ist3(A,B,iLang).
8610: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
8620: 65 64 69 74 64 69 73 74 33 28 74 61 62 6c 65 6e  editdist3(tablen
8630: 61 6d 65 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ame).**.** Retur
8640: 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 72  n the cost of tr
8650: 61 6e 73 66 6f 72 6d 69 6e 67 20 73 74 72 69 6e  ansforming strin
8660: 67 20 41 20 69 6e 74 6f 20 73 74 72 69 6e 67 20  g A into string 
8670: 42 20 75 73 69 6e 67 20 65 64 69 74 0a 2a 2a 20  B using edit.** 
8680: 77 65 69 67 68 74 73 20 66 6f 72 20 69 4c 61 6e  weights for iLan
8690: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  g..**.** The sec
86a0: 6f 6e 64 20 66 6f 72 6d 20 6c 6f 61 64 73 20 65  ond form loads e
86b0: 64 69 74 20 77 65 69 67 68 74 73 20 69 6e 74 6f  dit weights into
86c0: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 61 20 74   memory from a t
86d0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
86e0: 76 6f 69 64 20 65 64 69 74 44 69 73 74 33 53 71  void editDist3Sq
86f0: 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  lFunc(.  sqlite3
8700: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
8710: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
8720: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8730: 2a 61 72 67 76 0a 29 7b 0a 20 20 45 64 69 74 44  *argv.){.  EditD
8740: 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  ist3Config *pCon
8750: 66 69 67 20 3d 20 28 45 64 69 74 44 69 73 74 33  fig = (EditDist3
8760: 43 6f 6e 66 69 67 2a 29 73 71 6c 69 74 65 33 5f  Config*)sqlite3_
8770: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
8780: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  t);.  sqlite3 *d
8790: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
87a0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f  ext_db_handle(co
87b0: 6e 74 65 78 74 29 3b 0a 20 20 69 6e 74 20 72 63  ntext);.  int rc
87c0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20  ;.  if( argc==1 
87d0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
87e0: 72 20 2a 7a 54 61 62 6c 65 20 3d 20 28 63 6f 6e  r *zTable = (con
87f0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
8800: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8810: 5b 30 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 65  [0]);.    rc = e
8820: 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 4c 6f  ditDist3ConfigLo
8830: 61 64 28 70 43 6f 6e 66 69 67 2c 20 64 62 2c 20  ad(pConfig, db, 
8840: 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28  zTable);.    if(
8850: 20 72 63 20 29 20 73 71 6c 69 74 65 33 5f 72 65   rc ) sqlite3_re
8860: 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
8870: 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20 20  context, rc);.  
8880: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
8890: 20 63 68 61 72 20 2a 7a 41 20 3d 20 28 63 6f 6e   char *zA = (con
88a0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
88b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
88c0: 5b 30 5d 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  [0]);.    const 
88d0: 63 68 61 72 20 2a 7a 42 20 3d 20 28 63 6f 6e 73  char *zB = (cons
88e0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
88f0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8900: 31 5d 29 3b 0a 20 20 20 20 69 6e 74 20 6e 41 20  1]);.    int nA 
8910: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
8920: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
8930: 20 20 20 20 69 6e 74 20 6e 42 20 3d 20 73 71 6c      int nB = sql
8940: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
8950: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69  (argv[1]);.    i
8960: 6e 74 20 69 4c 61 6e 67 20 3d 20 61 72 67 63 3d  nt iLang = argc=
8970: 3d 33 20 3f 20 73 71 6c 69 74 65 33 5f 76 61 6c  =3 ? sqlite3_val
8980: 75 65 5f 69 6e 74 28 61 72 67 76 5b 32 5d 29 20  ue_int(argv[2]) 
8990: 3a 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  : 0;.    const E
89a0: 64 69 74 44 69 73 74 33 4c 61 6e 67 20 2a 70 4c  ditDist3Lang *pL
89b0: 61 6e 67 20 3d 20 65 64 69 74 44 69 73 74 33 46  ang = editDist3F
89c0: 69 6e 64 4c 61 6e 67 28 70 43 6f 6e 66 69 67 2c  indLang(pConfig,
89d0: 20 69 4c 61 6e 67 29 3b 0a 20 20 20 20 45 64 69   iLang);.    Edi
89e0: 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
89f0: 20 2a 70 46 72 6f 6d 3b 0a 20 20 20 20 69 6e 74   *pFrom;.    int
8a00: 20 64 69 73 74 3b 0a 0a 20 20 20 20 70 46 72 6f   dist;..    pFro
8a10: 6d 20 3d 20 65 64 69 74 44 69 73 74 33 46 72 6f  m = editDist3Fro
8a20: 6d 53 74 72 69 6e 67 4e 65 77 28 70 4c 61 6e 67  mStringNew(pLang
8a30: 2c 20 7a 41 2c 20 6e 41 29 3b 0a 20 20 20 20 69  , zA, nA);.    i
8a40: 66 28 20 70 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( pFrom==0 ){. 
8a50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8a60: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
8a70: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
8a80: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8a90: 20 20 64 69 73 74 20 3d 20 65 64 69 74 44 69 73    dist = editDis
8aa0: 74 33 43 6f 72 65 28 70 46 72 6f 6d 2c 20 7a 42  t3Core(pFrom, zB
8ab0: 2c 20 6e 42 2c 20 70 4c 61 6e 67 2c 20 30 29 3b  , nB, pLang, 0);
8ac0: 0a 20 20 20 20 65 64 69 74 44 69 73 74 33 46 72  .    editDist3Fr
8ad0: 6f 6d 53 74 72 69 6e 67 44 65 6c 65 74 65 28 70  omStringDelete(p
8ae0: 46 72 6f 6d 29 3b 0a 20 20 20 20 69 66 28 20 64  From);.    if( d
8af0: 69 73 74 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ist==(-1) ){.   
8b00: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8b10: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
8b20: 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 65 6c 73  ntext);.    }els
8b30: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
8b40: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
8b50: 65 78 74 2c 20 64 69 73 74 29 3b 0a 20 20 20 20  ext, dist);.    
8b60: 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  }.  } .}../*.** 
8b70: 52 65 67 69 73 74 65 72 20 74 68 65 20 65 64 69  Register the edi
8b80: 74 44 69 73 74 33 20 66 75 6e 63 74 69 6f 6e 20  tDist3 function 
8b90: 77 69 74 68 20 53 51 4c 69 74 65 0a 2a 2f 0a 73  with SQLite.*/.s
8ba0: 74 61 74 69 63 20 69 6e 74 20 65 64 69 74 44 69  tatic int editDi
8bb0: 73 74 33 49 6e 73 74 61 6c 6c 28 73 71 6c 69 74  st3Install(sqlit
8bc0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
8bd0: 63 3b 0a 20 20 45 64 69 74 44 69 73 74 33 43 6f  c;.  EditDist3Co
8be0: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
8bf0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
8c00: 28 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66 69  ( sizeof(*pConfi
8c10: 67 29 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6e  g) );.  if( pCon
8c20: 66 69 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  fig==0 ) return 
8c30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8c40: 6d 65 6d 73 65 74 28 70 43 6f 6e 66 69 67 2c 20  memset(pConfig, 
8c50: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 6e 66  0, sizeof(*pConf
8c60: 69 67 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ig));.  rc = sql
8c70: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8c80: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69  tion_v2(db, "edi
8c90: 74 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20  tdist3",.       
8ca0: 20 20 20 20 20 20 20 32 2c 20 53 51 4c 49 54 45         2, SQLITE
8cb0: 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69 67 2c 20  _UTF8, pConfig, 
8cc0: 65 64 69 74 44 69 73 74 33 53 71 6c 46 75 6e 63  editDist3SqlFunc
8cd0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
8ce0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8cf0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8d00: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8d10: 69 6f 6e 5f 76 32 28 64 62 2c 20 22 65 64 69 74  ion_v2(db, "edit
8d20: 64 69 73 74 33 22 2c 0a 20 20 20 20 20 20 20 20  dist3",.        
8d30: 20 20 20 20 20 20 20 20 33 2c 20 53 51 4c 49 54          3, SQLIT
8d40: 45 5f 55 54 46 38 2c 20 70 43 6f 6e 66 69 67 2c  E_UTF8, pConfig,
8d50: 20 65 64 69 74 44 69 73 74 33 53 71 6c 46 75 6e   editDist3SqlFun
8d60: 63 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  c, 0, 0, 0);.  }
8d70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8d80: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
8d90: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8da0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
8db0: 22 65 64 69 74 64 69 73 74 33 22 2c 0a 20 20 20  "editdist3",.   
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
8dd0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 43 6f  SQLITE_UTF8, pCo
8de0: 6e 66 69 67 2c 20 65 64 69 74 44 69 73 74 33 53  nfig, editDist3S
8df0: 71 6c 46 75 6e 63 2c 20 30 2c 20 30 2c 0a 20 20  qlFunc, 0, 0,.  
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
8e10: 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c  itDist3ConfigDel
8e20: 65 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ete);.  }else{. 
8e30: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
8e40: 70 43 6f 6e 66 69 67 29 3b 0a 20 20 7d 0a 20 20  pConfig);.  }.  
8e50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 20  return rc;.}./* 
8e60: 45 6e 64 20 63 6f 6e 66 69 67 75 72 61 62 6c 65  End configurable
8e70: 20 63 6f 73 74 20 75 6e 69 63 6f 64 65 20 65 64   cost unicode ed
8e80: 69 74 20 64 69 73 74 61 6e 63 65 20 72 6f 75 74  it distance rout
8e90: 69 6e 65 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ines.***********
8ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ee0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
8ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f30: 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 72 61 6e  **.** Begin tran
8f40: 73 6c 69 74 65 72 61 74 65 20 75 6e 69 63 6f 64  sliterate unicod
8f50: 65 2d 74 6f 2d 61 73 63 69 69 20 69 6d 70 6c 65  e-to-ascii imple
8f60: 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2f 0a 0a 23 69  mentation.*/..#i
8f70: 66 20 21 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  f !SQLITE_AMALGA
8f80: 4d 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68 69  MATION./*.** Thi
8f90: 73 20 6c 6f 6f 6b 75 70 20 74 61 62 6c 65 20 69  s lookup table i
8fa0: 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 64  s used to help d
8fb0: 65 63 6f 64 65 20 74 68 65 20 66 69 72 73 74 20  ecode the first 
8fc0: 62 79 74 65 20 6f 66 0a 2a 2a 20 61 20 6d 75 6c  byte of.** a mul
8fd0: 74 69 2d 62 79 74 65 20 55 54 46 38 20 63 68 61  ti-byte UTF8 cha
8fe0: 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
8ff0: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
9000: 20 63 68 61 72 20 73 71 6c 69 74 65 33 55 74 66   char sqlite3Utf
9010: 38 54 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20  8Trans1[] = {.  
9020: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32  0x00, 0x01, 0x02
9030: 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78  , 0x03, 0x04, 0x
9040: 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a  05, 0x06, 0x07,.
9050: 20 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78    0x08, 0x09, 0x
9060: 30 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20  0a, 0x0b, 0x0c, 
9070: 30 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66  0x0d, 0x0e, 0x0f
9080: 2c 0a 20 20 30 78 31 30 2c 20 30 78 31 31 2c 20  ,.  0x10, 0x11, 
9090: 30 78 31 32 2c 20 30 78 31 33 2c 20 30 78 31 34  0x12, 0x13, 0x14
90a0: 2c 20 30 78 31 35 2c 20 30 78 31 36 2c 20 30 78  , 0x15, 0x16, 0x
90b0: 31 37 2c 0a 20 20 30 78 31 38 2c 20 30 78 31 39  17,.  0x18, 0x19
90c0: 2c 20 30 78 31 61 2c 20 30 78 31 62 2c 20 30 78  , 0x1a, 0x1b, 0x
90d0: 31 63 2c 20 30 78 31 64 2c 20 30 78 31 65 2c 20  1c, 0x1d, 0x1e, 
90e0: 30 78 31 66 2c 0a 20 20 30 78 30 30 2c 20 30 78  0x1f,.  0x00, 0x
90f0: 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20  01, 0x02, 0x03, 
9100: 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36  0x04, 0x05, 0x06
9110: 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20  , 0x07,.  0x08, 
9120: 30 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62  0x09, 0x0a, 0x0b
9130: 2c 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78  , 0x0c, 0x0d, 0x
9140: 30 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 30 30  0e, 0x0f,.  0x00
9150: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
9160: 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20  03, 0x04, 0x05, 
9170: 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78  0x06, 0x07,.  0x
9180: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20  00, 0x01, 0x02, 
9190: 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 31  0x03, 0x00, 0x01
91a0: 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d 3b  , 0x00, 0x00,.};
91b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
91c0: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
91d0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 55 54 46  of the first UTF
91e0: 2d 38 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  -8 character in 
91f0: 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  the string..*/.s
9200: 74 61 74 69 63 20 69 6e 74 20 75 74 66 38 52 65  tatic int utf8Re
9210: 61 64 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ad(const unsigne
9220: 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  d char *z, int n
9230: 2c 20 69 6e 74 20 2a 70 53 69 7a 65 29 7b 0a 20  , int *pSize){. 
9240: 20 69 6e 74 20 63 2c 20 69 3b 0a 0a 20 20 2f 2a   int c, i;..  /*
9250: 20 41 6c 6c 20 63 61 6c 6c 65 72 73 20 74 6f 20   All callers to 
9260: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 28 69 6e  this routine (in
9270: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
9280: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 0a 20 20 2a  lementation).  *
9290: 2a 20 61 6c 77 61 79 73 20 68 61 76 65 20 6e 3e  * always have n>
92a0: 30 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  0. */.  if( NEVE
92b0: 52 28 6e 3d 3d 30 29 20 29 7b 0a 20 20 20 20 63  R(n==0) ){.    c
92c0: 20 3d 20 69 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   = i = 0;.  }els
92d0: 65 7b 0a 20 20 20 20 63 20 3d 20 7a 5b 30 5d 3b  e{.    c = z[0];
92e0: 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
92f0: 69 66 28 20 63 3e 3d 30 78 63 30 20 29 7b 0a 20  if( c>=0xc0 ){. 
9300: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
9310: 55 74 66 38 54 72 61 6e 73 31 5b 63 2d 30 78 63  Utf8Trans1[c-0xc
9320: 30 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  0];.      while(
9330: 20 69 3c 6e 20 26 26 20 28 7a 5b 69 5d 20 26 20   i<n && (z[i] & 
9340: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20  0xc0)==0x80 ){. 
9350: 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36         c = (c<<6
9360: 29 20 2b 20 28 30 78 33 66 20 26 20 7a 5b 69 2b  ) + (0x3f & z[i+
9370: 2b 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +]);.      }.   
9380: 20 7d 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20   }.  }.  *pSize 
9390: 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  = i;.  return c;
93a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
93b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
93c0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
93d0: 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 69 6e   utf-8 string in
93e0: 20 74 68 65 20 6e 49 6e 20 62 79 74 65 0a 2a 2a   the nIn byte.**
93f0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
9400: 74 6f 20 62 79 20 7a 49 6e 2e 0a 2a 2f 0a 73 74  to by zIn..*/.st
9410: 61 74 69 63 20 69 6e 74 20 75 74 66 38 43 68 61  atic int utf8Cha
9420: 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  rlen(const char 
9430: 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a  *zIn, int nIn){.
9440: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
9450: 43 68 61 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Char = 0;.  for(
9460: 69 3d 30 3b 20 69 3c 6e 49 6e 3b 20 6e 43 68 61  i=0; i<nIn; nCha
9470: 72 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  r++){.    int sz
9480: 3b 0a 20 20 20 20 75 74 66 38 52 65 61 64 28 28  ;.    utf8Read((
9490: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
94a0: 68 61 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e  har *)&zIn[i], n
94b0: 49 6e 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20  In-i, &sz);.    
94c0: 69 20 2b 3d 20 73 7a 3b 0a 20 20 7d 0a 20 20 72  i += sz;.  }.  r
94d0: 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a  eturn nChar;.}..
94e0: 2f 2a 0a 2a 2a 20 54 61 62 6c 65 20 6f 66 20 74  /*.** Table of t
94f0: 72 61 6e 73 6c 61 74 69 6f 6e 73 20 66 72 6f 6d  ranslations from
9500: 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
9510: 65 72 73 20 69 6e 74 6f 20 41 53 43 49 49 2e 0a  ers into ASCII..
9520: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9530: 73 74 72 75 63 74 20 7b 0a 20 75 6e 73 69 67 6e  struct {. unsign
9540: 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 46 72  ed short int cFr
9550: 6f 6d 3b 0a 20 75 6e 73 69 67 6e 65 64 20 63 68  om;. unsigned ch
9560: 61 72 20 63 54 6f 30 2c 20 63 54 6f 31 3b 0a 7d  ar cTo0, cTo1;.}
9570: 20 74 72 61 6e 73 6c 69 74 5b 5d 20 3d 20 7b 0a   translit[] = {.
9580: 20 20 7b 20 30 78 30 30 41 30 2c 20 20 30 78 32    { 0x00A0,  0x2
9590: 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c2  0, 0x00 },  /* .
95a0: a0 20 74 6f 20 20 20 2a 2f 0a 20 20 7b 20 30 78  . to   */.  { 0x
95b0: 30 30 42 35 2c 20 20 30 78 37 35 2c 20 30 78 30  00B5,  0x75, 0x0
95c0: 30 20 7d 2c 20 20 2f 2a 20 c2 b5 20 74 6f 20 75  0 },  /* .. to u
95d0: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 30 2c 20   */.  { 0x00C0, 
95e0: 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20   0x41, 0x00 },  
95f0: 2f 2a 20 c3 80 20 74 6f 20 41 20 2a 2f 0a 20 20  /* .. to A */.  
9600: 7b 20 30 78 30 30 43 31 2c 20 20 30 78 34 31 2c  { 0x00C1,  0x41,
9610: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 81 20   0x00 },  /* .. 
9620: 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to A */.  { 0x00
9630: 43 32 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20  C2,  0x41, 0x00 
9640: 7d 2c 20 20 2f 2a 20 c3 82 20 74 6f 20 41 20 2a  },  /* .. to A *
9650: 2f 0a 20 20 7b 20 30 78 30 30 43 33 2c 20 20 30  /.  { 0x00C3,  0
9660: 78 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x41, 0x00 },  /*
9670: 20 c3 83 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20   .. to A */.  { 
9680: 30 78 30 30 43 34 2c 20 20 30 78 34 31 2c 20 30  0x00C4,  0x41, 0
9690: 78 36 35 20 7d 2c 20 20 2f 2a 20 c3 84 20 74 6f  x65 },  /* .. to
96a0: 20 41 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43   Ae */.  { 0x00C
96b0: 35 2c 20 20 30 78 34 31 2c 20 30 78 36 31 20 7d  5,  0x41, 0x61 }
96c0: 2c 20 20 2f 2a 20 c3 85 20 74 6f 20 41 61 20 2a  ,  /* .. to Aa *
96d0: 2f 0a 20 20 7b 20 30 78 30 30 43 36 2c 20 20 30  /.  { 0x00C6,  0
96e0: 78 34 31 2c 20 30 78 34 35 20 7d 2c 20 20 2f 2a  x41, 0x45 },  /*
96f0: 20 c3 86 20 74 6f 20 41 45 20 2a 2f 0a 20 20 7b   .. to AE */.  {
9700: 20 30 78 30 30 43 37 2c 20 20 30 78 34 33 2c 20   0x00C7,  0x43, 
9710: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 87 20 74  0x00 },  /* .. t
9720: 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43  o C */.  { 0x00C
9730: 38 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  8,  0x45, 0x00 }
9740: 2c 20 20 2f 2a 20 c3 88 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
9750: 0a 20 20 7b 20 30 78 30 30 43 39 2c 20 20 30 78  .  { 0x00C9,  0x
9760: 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  45, 0x00 },  /* 
9770: c3 89 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30  .. to E */.  { 0
9780: 78 30 30 43 41 2c 20 20 30 78 34 35 2c 20 30 78  x00CA,  0x45, 0x
9790: 30 30 20 7d 2c 20 20 2f 2a 20 c3 8a 20 74 6f 20  00 },  /* .. to 
97a0: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 30 43 42 2c  E */.  { 0x00CB,
97b0: 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20    0x45, 0x00 }, 
97c0: 20 2f 2a 20 c3 8b 20 74 6f 20 45 20 2a 2f 0a 20   /* .. to E */. 
97d0: 20 7b 20 30 78 30 30 43 43 2c 20 20 30 78 34 39   { 0x00CC,  0x49
97e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8c  , 0x00 },  /* ..
97f0: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
9800: 30 43 44 2c 20 20 30 78 34 39 2c 20 30 78 30 30  0CD,  0x49, 0x00
9810: 20 7d 2c 20 20 2f 2a 20 c3 8d 20 74 6f 20 49 20   },  /* .. to I 
9820: 2a 2f 0a 20 20 7b 20 30 78 30 30 43 45 2c 20 20  */.  { 0x00CE,  
9830: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
9840: 2a 20 c3 8e 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
9850: 20 30 78 30 30 43 46 2c 20 20 30 78 34 39 2c 20   0x00CF,  0x49, 
9860: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 8f 20 74  0x00 },  /* .. t
9870: 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44  o I */.  { 0x00D
9880: 30 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20 7d  0,  0x44, 0x00 }
9890: 2c 20 20 2f 2a 20 c3 90 20 74 6f 20 44 20 2a 2f  ,  /* .. to D */
98a0: 0a 20 20 7b 20 30 78 30 30 44 31 2c 20 20 30 78  .  { 0x00D1,  0x
98b0: 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4E, 0x00 },  /* 
98c0: c3 91 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30  .. to N */.  { 0
98d0: 78 30 30 44 32 2c 20 20 30 78 34 46 2c 20 30 78  x00D2,  0x4F, 0x
98e0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 92 20 74 6f 20  00 },  /* .. to 
98f0: 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 33 2c  O */.  { 0x00D3,
9900: 20 20 30 78 34 46 2c 20 30 78 30 30 20 7d 2c 20    0x4F, 0x00 }, 
9910: 20 2f 2a 20 c3 93 20 74 6f 20 4f 20 2a 2f 0a 20   /* .. to O */. 
9920: 20 7b 20 30 78 30 30 44 34 2c 20 20 30 78 34 46   { 0x00D4,  0x4F
9930: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 94  , 0x00 },  /* ..
9940: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
9950: 30 44 35 2c 20 20 30 78 34 46 2c 20 30 78 30 30  0D5,  0x4F, 0x00
9960: 20 7d 2c 20 20 2f 2a 20 c3 95 20 74 6f 20 4f 20   },  /* .. to O 
9970: 2a 2f 0a 20 20 7b 20 30 78 30 30 44 36 2c 20 20  */.  { 0x00D6,  
9980: 30 78 34 46 2c 20 30 78 36 35 20 7d 2c 20 20 2f  0x4F, 0x65 },  /
9990: 2a 20 c3 96 20 74 6f 20 4f 65 20 2a 2f 0a 20 20  * .. to Oe */.  
99a0: 7b 20 30 78 30 30 44 37 2c 20 20 30 78 37 38 2c  { 0x00D7,  0x78,
99b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 97 20   0x00 },  /* .. 
99c0: 74 6f 20 78 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to x */.  { 0x00
99d0: 44 38 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20  D8,  0x4F, 0x00 
99e0: 7d 2c 20 20 2f 2a 20 c3 98 20 74 6f 20 4f 20 2a  },  /* .. to O *
99f0: 2f 0a 20 20 7b 20 30 78 30 30 44 39 2c 20 20 30  /.  { 0x00D9,  0
9a00: 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x55, 0x00 },  /*
9a10: 20 c3 99 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20   .. to U */.  { 
9a20: 30 78 30 30 44 41 2c 20 20 30 78 35 35 2c 20 30  0x00DA,  0x55, 0
9a30: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 9a 20 74 6f  x00 },  /* .. to
9a40: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 42   U */.  { 0x00DB
9a50: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
9a60: 20 20 2f 2a 20 c3 9b 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
9a70: 20 20 7b 20 30 78 30 30 44 43 2c 20 20 30 78 35    { 0x00DC,  0x5
9a80: 35 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c3  5, 0x65 },  /* .
9a90: 9c 20 74 6f 20 55 65 20 2a 2f 0a 20 20 7b 20 30  . to Ue */.  { 0
9aa0: 78 30 30 44 44 2c 20 20 30 78 35 39 2c 20 30 78  x00DD,  0x59, 0x
9ab0: 30 30 20 7d 2c 20 20 2f 2a 20 c3 9d 20 74 6f 20  00 },  /* .. to 
9ac0: 59 20 2a 2f 0a 20 20 7b 20 30 78 30 30 44 45 2c  Y */.  { 0x00DE,
9ad0: 20 20 30 78 35 34 2c 20 30 78 36 38 20 7d 2c 20    0x54, 0x68 }, 
9ae0: 20 2f 2a 20 c3 9e 20 74 6f 20 54 68 20 2a 2f 0a   /* .. to Th */.
9af0: 20 20 7b 20 30 78 30 30 44 46 2c 20 20 30 78 37    { 0x00DF,  0x7
9b00: 33 2c 20 30 78 37 33 20 7d 2c 20 20 2f 2a 20 c3  3, 0x73 },  /* .
9b10: 9f 20 74 6f 20 73 73 20 2a 2f 0a 20 20 7b 20 30  . to ss */.  { 0
9b20: 78 30 30 45 30 2c 20 20 30 78 36 31 2c 20 30 78  x00E0,  0x61, 0x
9b30: 30 30 20 7d 2c 20 20 2f 2a 20 c3 a0 20 74 6f 20  00 },  /* .. to 
9b40: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 31 2c  a */.  { 0x00E1,
9b50: 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20    0x61, 0x00 }, 
9b60: 20 2f 2a 20 c3 a1 20 74 6f 20 61 20 2a 2f 0a 20   /* .. to a */. 
9b70: 20 7b 20 30 78 30 30 45 32 2c 20 20 30 78 36 31   { 0x00E2,  0x61
9b80: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a2  , 0x00 },  /* ..
9b90: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
9ba0: 30 45 33 2c 20 20 30 78 36 31 2c 20 30 78 30 30  0E3,  0x61, 0x00
9bb0: 20 7d 2c 20 20 2f 2a 20 c3 a3 20 74 6f 20 61 20   },  /* .. to a 
9bc0: 2a 2f 0a 20 20 7b 20 30 78 30 30 45 34 2c 20 20  */.  { 0x00E4,  
9bd0: 30 78 36 31 2c 20 30 78 36 35 20 7d 2c 20 20 2f  0x61, 0x65 },  /
9be0: 2a 20 c3 a4 20 74 6f 20 61 65 20 2a 2f 0a 20 20  * .. to ae */.  
9bf0: 7b 20 30 78 30 30 45 35 2c 20 20 30 78 36 31 2c  { 0x00E5,  0x61,
9c00: 20 30 78 36 31 20 7d 2c 20 20 2f 2a 20 c3 a5 20   0x61 },  /* .. 
9c10: 74 6f 20 61 61 20 2a 2f 0a 20 20 7b 20 30 78 30  to aa */.  { 0x0
9c20: 30 45 36 2c 20 20 30 78 36 31 2c 20 30 78 36 35  0E6,  0x61, 0x65
9c30: 20 7d 2c 20 20 2f 2a 20 c3 a6 20 74 6f 20 61 65   },  /* .. to ae
9c40: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 37 2c 20   */.  { 0x00E7, 
9c50: 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x63, 0x00 },  
9c60: 2f 2a 20 c3 a7 20 74 6f 20 63 20 2a 2f 0a 20 20  /* .. to c */.  
9c70: 7b 20 30 78 30 30 45 38 2c 20 20 30 78 36 35 2c  { 0x00E8,  0x65,
9c80: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 a8 20   0x00 },  /* .. 
9c90: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to e */.  { 0x00
9ca0: 45 39 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20  E9,  0x65, 0x00 
9cb0: 7d 2c 20 20 2f 2a 20 c3 a9 20 74 6f 20 65 20 2a  },  /* .. to e *
9cc0: 2f 0a 20 20 7b 20 30 78 30 30 45 41 2c 20 20 30  /.  { 0x00EA,  0
9cd0: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
9ce0: 20 c3 aa 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
9cf0: 30 78 30 30 45 42 2c 20 20 30 78 36 35 2c 20 30  0x00EB,  0x65, 0
9d00: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 ab 20 74 6f  x00 },  /* .. to
9d10: 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 43   e */.  { 0x00EC
9d20: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
9d30: 20 20 2f 2a 20 c3 ac 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
9d40: 20 20 7b 20 30 78 30 30 45 44 2c 20 20 30 78 36    { 0x00ED,  0x6
9d50: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  9, 0x00 },  /* .
9d60: ad 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
9d70: 30 30 45 45 2c 20 20 30 78 36 39 2c 20 30 78 30  00EE,  0x69, 0x0
9d80: 30 20 7d 2c 20 20 2f 2a 20 c3 ae 20 74 6f 20 69  0 },  /* .. to i
9d90: 20 2a 2f 0a 20 20 7b 20 30 78 30 30 45 46 2c 20   */.  { 0x00EF, 
9da0: 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x69, 0x00 },  
9db0: 2f 2a 20 c3 af 20 74 6f 20 69 20 2a 2f 0a 20 20  /* .. to i */.  
9dc0: 7b 20 30 78 30 30 46 30 2c 20 20 30 78 36 34 2c  { 0x00F0,  0x64,
9dd0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b0 20   0x00 },  /* .. 
9de0: 74 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 30  to d */.  { 0x00
9df0: 46 31 2c 20 20 30 78 36 45 2c 20 30 78 30 30 20  F1,  0x6E, 0x00 
9e00: 7d 2c 20 20 2f 2a 20 c3 b1 20 74 6f 20 6e 20 2a  },  /* .. to n *
9e10: 2f 0a 20 20 7b 20 30 78 30 30 46 32 2c 20 20 30  /.  { 0x00F2,  0
9e20: 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6F, 0x00 },  /*
9e30: 20 c3 b2 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
9e40: 30 78 30 30 46 33 2c 20 20 30 78 36 46 2c 20 30  0x00F3,  0x6F, 0
9e50: 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b3 20 74 6f  x00 },  /* .. to
9e60: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 34   o */.  { 0x00F4
9e70: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c  ,  0x6F, 0x00 },
9e80: 20 20 2f 2a 20 c3 b4 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
9e90: 20 20 7b 20 30 78 30 30 46 35 2c 20 20 30 78 36    { 0x00F5,  0x6
9ea0: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3  F, 0x00 },  /* .
9eb0: b5 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78  . to o */.  { 0x
9ec0: 30 30 46 36 2c 20 20 30 78 36 46 2c 20 30 78 36  00F6,  0x6F, 0x6
9ed0: 35 20 7d 2c 20 20 2f 2a 20 c3 b6 20 74 6f 20 6f  5 },  /* .. to o
9ee0: 65 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46 37 2c  e */.  { 0x00F7,
9ef0: 20 20 30 78 33 41 2c 20 30 78 30 30 20 7d 2c 20    0x3A, 0x00 }, 
9f00: 20 2f 2a 20 c3 b7 20 74 6f 20 3a 20 2a 2f 0a 20   /* .. to : */. 
9f10: 20 7b 20 30 78 30 30 46 38 2c 20 20 30 78 36 46   { 0x00F8,  0x6F
9f20: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 b8  , 0x00 },  /* ..
9f30: 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30   to o */.  { 0x0
9f40: 30 46 39 2c 20 20 30 78 37 35 2c 20 30 78 30 30  0F9,  0x75, 0x00
9f50: 20 7d 2c 20 20 2f 2a 20 c3 b9 20 74 6f 20 75 20   },  /* .. to u 
9f60: 2a 2f 0a 20 20 7b 20 30 78 30 30 46 41 2c 20 20  */.  { 0x00FA,  
9f70: 30 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x75, 0x00 },  /
9f80: 2a 20 c3 ba 20 74 6f 20 75 20 2a 2f 0a 20 20 7b  * .. to u */.  {
9f90: 20 30 78 30 30 46 42 2c 20 20 30 78 37 35 2c 20   0x00FB,  0x75, 
9fa0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c3 bb 20 74  0x00 },  /* .. t
9fb0: 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46  o u */.  { 0x00F
9fc0: 43 2c 20 20 30 78 37 35 2c 20 30 78 36 35 20 7d  C,  0x75, 0x65 }
9fd0: 2c 20 20 2f 2a 20 c3 bc 20 74 6f 20 75 65 20 2a  ,  /* .. to ue *
9fe0: 2f 0a 20 20 7b 20 30 78 30 30 46 44 2c 20 20 30  /.  { 0x00FD,  0
9ff0: 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x79, 0x00 },  /*
a000: 20 c3 bd 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20   .. to y */.  { 
a010: 30 78 30 30 46 45 2c 20 20 30 78 37 34 2c 20 30  0x00FE,  0x74, 0
a020: 78 36 38 20 7d 2c 20 20 2f 2a 20 c3 be 20 74 6f  x68 },  /* .. to
a030: 20 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30 30 46   th */.  { 0x00F
a040: 46 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d  F,  0x79, 0x00 }
a050: 2c 20 20 2f 2a 20 c3 bf 20 74 6f 20 79 20 2a 2f  ,  /* .. to y */
a060: 0a 20 20 7b 20 30 78 30 31 30 30 2c 20 20 30 78  .  { 0x0100,  0x
a070: 34 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  41, 0x00 },  /* 
a080: c4 80 20 74 6f 20 41 20 2a 2f 0a 20 20 7b 20 30  .. to A */.  { 0
a090: 78 30 31 30 31 2c 20 20 30 78 36 31 2c 20 30 78  x0101,  0x61, 0x
a0a0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 81 20 74 6f 20  00 },  /* .. to 
a0b0: 61 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 32 2c  a */.  { 0x0102,
a0c0: 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c 20    0x41, 0x00 }, 
a0d0: 20 2f 2a 20 c4 82 20 74 6f 20 41 20 2a 2f 0a 20   /* .. to A */. 
a0e0: 20 7b 20 30 78 30 31 30 33 2c 20 20 30 78 36 31   { 0x0103,  0x61
a0f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 83  , 0x00 },  /* ..
a100: 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30   to a */.  { 0x0
a110: 31 30 34 2c 20 20 30 78 34 31 2c 20 30 78 30 30  104,  0x41, 0x00
a120: 20 7d 2c 20 20 2f 2a 20 c4 84 20 74 6f 20 41 20   },  /* .. to A 
a130: 2a 2f 0a 20 20 7b 20 30 78 30 31 30 35 2c 20 20  */.  { 0x0105,  
a140: 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x61, 0x00 },  /
a150: 2a 20 c4 85 20 74 6f 20 61 20 2a 2f 0a 20 20 7b  * .. to a */.  {
a160: 20 30 78 30 31 30 36 2c 20 20 30 78 34 33 2c 20   0x0106,  0x43, 
a170: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 86 20 74  0x00 },  /* .. t
a180: 6f 20 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30  o C */.  { 0x010
a190: 37 2c 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d  7,  0x63, 0x00 }
a1a0: 2c 20 20 2f 2a 20 c4 87 20 74 6f 20 63 20 2a 2f  ,  /* .. to c */
a1b0: 0a 20 20 7b 20 30 78 30 31 30 38 2c 20 20 30 78  .  { 0x0108,  0x
a1c0: 34 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  43, 0x68 },  /* 
a1d0: c4 88 20 74 6f 20 43 68 20 2a 2f 0a 20 20 7b 20  .. to Ch */.  { 
a1e0: 30 78 30 31 30 39 2c 20 20 30 78 36 33 2c 20 30  0x0109,  0x63, 0
a1f0: 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 89 20 74 6f  x68 },  /* .. to
a200: 20 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30   ch */.  { 0x010
a210: 41 2c 20 20 30 78 34 33 2c 20 30 78 30 30 20 7d  A,  0x43, 0x00 }
a220: 2c 20 20 2f 2a 20 c4 8a 20 74 6f 20 43 20 2a 2f  ,  /* .. to C */
a230: 0a 20 20 7b 20 30 78 30 31 30 42 2c 20 20 30 78  .  { 0x010B,  0x
a240: 36 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  63, 0x00 },  /* 
a250: c4 8b 20 74 6f 20 63 20 2a 2f 0a 20 20 7b 20 30  .. to c */.  { 0
a260: 78 30 31 30 43 2c 20 20 30 78 34 33 2c 20 30 78  x010C,  0x43, 0x
a270: 30 30 20 7d 2c 20 20 2f 2a 20 c4 8c 20 74 6f 20  00 },  /* .. to 
a280: 43 20 2a 2f 0a 20 20 7b 20 30 78 30 31 30 44 2c  C */.  { 0x010D,
a290: 20 20 30 78 36 33 2c 20 30 78 30 30 20 7d 2c 20    0x63, 0x00 }, 
a2a0: 20 2f 2a 20 c4 8d 20 74 6f 20 63 20 2a 2f 0a 20   /* .. to c */. 
a2b0: 20 7b 20 30 78 30 31 30 45 2c 20 20 30 78 34 34   { 0x010E,  0x44
a2c0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 8e  , 0x00 },  /* ..
a2d0: 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30   to D */.  { 0x0
a2e0: 31 30 46 2c 20 20 30 78 36 34 2c 20 30 78 30 30  10F,  0x64, 0x00
a2f0: 20 7d 2c 20 20 2f 2a 20 c4 8f 20 74 6f 20 64 20   },  /* .. to d 
a300: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 30 2c 20 20  */.  { 0x0110,  
a310: 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x44, 0x00 },  /
a320: 2a 20 c4 90 20 74 6f 20 44 20 2a 2f 0a 20 20 7b  * .. to D */.  {
a330: 20 30 78 30 31 31 31 2c 20 20 30 78 36 34 2c 20   0x0111,  0x64, 
a340: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 91 20 74  0x00 },  /* .. t
a350: 6f 20 64 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o d */.  { 0x011
a360: 32 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  2,  0x45, 0x00 }
a370: 2c 20 20 2f 2a 20 c4 92 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
a380: 0a 20 20 7b 20 30 78 30 31 31 33 2c 20 20 30 78  .  { 0x0113,  0x
a390: 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  65, 0x00 },  /* 
a3a0: c4 93 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
a3b0: 78 30 31 31 34 2c 20 20 30 78 34 35 2c 20 30 78  x0114,  0x45, 0x
a3c0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 94 20 74 6f 20  00 },  /* .. to 
a3d0: 45 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 35 2c  E */.  { 0x0115,
a3e0: 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c 20    0x65, 0x00 }, 
a3f0: 20 2f 2a 20 c4 95 20 74 6f 20 65 20 2a 2f 0a 20   /* .. to e */. 
a400: 20 7b 20 30 78 30 31 31 36 2c 20 20 30 78 34 35   { 0x0116,  0x45
a410: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 96  , 0x00 },  /* ..
a420: 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30   to E */.  { 0x0
a430: 31 31 37 2c 20 20 30 78 36 35 2c 20 30 78 30 30  117,  0x65, 0x00
a440: 20 7d 2c 20 20 2f 2a 20 c4 97 20 74 6f 20 65 20   },  /* .. to e 
a450: 2a 2f 0a 20 20 7b 20 30 78 30 31 31 38 2c 20 20  */.  { 0x0118,  
a460: 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x45, 0x00 },  /
a470: 2a 20 c4 98 20 74 6f 20 45 20 2a 2f 0a 20 20 7b  * .. to E */.  {
a480: 20 30 78 30 31 31 39 2c 20 20 30 78 36 35 2c 20   0x0119,  0x65, 
a490: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 99 20 74  0x00 },  /* .. t
a4a0: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31  o e */.  { 0x011
a4b0: 41 2c 20 20 30 78 34 35 2c 20 30 78 30 30 20 7d  A,  0x45, 0x00 }
a4c0: 2c 20 20 2f 2a 20 c4 9a 20 74 6f 20 45 20 2a 2f  ,  /* .. to E */
a4d0: 0a 20 20 7b 20 30 78 30 31 31 42 2c 20 20 30 78  .  { 0x011B,  0x
a4e0: 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  65, 0x00 },  /* 
a4f0: c4 9b 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30  .. to e */.  { 0
a500: 78 30 31 31 43 2c 20 20 30 78 34 37 2c 20 30 78  x011C,  0x47, 0x
a510: 36 38 20 7d 2c 20 20 2f 2a 20 c4 9c 20 74 6f 20  68 },  /* .. to 
a520: 47 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 31 44  Gh */.  { 0x011D
a530: 2c 20 20 30 78 36 37 2c 20 30 78 36 38 20 7d 2c  ,  0x67, 0x68 },
a540: 20 20 2f 2a 20 c4 9d 20 74 6f 20 67 68 20 2a 2f    /* .. to gh */
a550: 0a 20 20 7b 20 30 78 30 31 31 45 2c 20 20 30 78  .  { 0x011E,  0x
a560: 34 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  47, 0x00 },  /* 
a570: c4 9e 20 74 6f 20 47 20 2a 2f 0a 20 20 7b 20 30  .. to G */.  { 0
a580: 78 30 31 31 46 2c 20 20 30 78 36 37 2c 20 30 78  x011F,  0x67, 0x
a590: 30 30 20 7d 2c 20 20 2f 2a 20 c4 9f 20 74 6f 20  00 },  /* .. to 
a5a0: 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 30 2c  g */.  { 0x0120,
a5b0: 20 20 30 78 34 37 2c 20 30 78 30 30 20 7d 2c 20    0x47, 0x00 }, 
a5c0: 20 2f 2a 20 c4 a0 20 74 6f 20 47 20 2a 2f 0a 20   /* .. to G */. 
a5d0: 20 7b 20 30 78 30 31 32 31 2c 20 20 30 78 36 37   { 0x0121,  0x67
a5e0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a1  , 0x00 },  /* ..
a5f0: 20 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30   to g */.  { 0x0
a600: 31 32 32 2c 20 20 30 78 34 37 2c 20 30 78 30 30  122,  0x47, 0x00
a610: 20 7d 2c 20 20 2f 2a 20 c4 a2 20 74 6f 20 47 20   },  /* .. to G 
a620: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 33 2c 20 20  */.  { 0x0123,  
a630: 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x67, 0x00 },  /
a640: 2a 20 c4 a3 20 74 6f 20 67 20 2a 2f 0a 20 20 7b  * .. to g */.  {
a650: 20 30 78 30 31 32 34 2c 20 20 30 78 34 38 2c 20   0x0124,  0x48, 
a660: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 a4 20 74  0x68 },  /* .. t
a670: 6f 20 48 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o Hh */.  { 0x01
a680: 32 35 2c 20 20 30 78 36 38 2c 20 30 78 36 38 20  25,  0x68, 0x68 
a690: 7d 2c 20 20 2f 2a 20 c4 a5 20 74 6f 20 68 68 20  },  /* .. to hh 
a6a0: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 36 2c 20 20  */.  { 0x0126,  
a6b0: 30 78 34 38 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x48, 0x00 },  /
a6c0: 2a 20 c4 a6 20 74 6f 20 48 20 2a 2f 0a 20 20 7b  * .. to H */.  {
a6d0: 20 30 78 30 31 32 37 2c 20 20 30 78 36 38 2c 20   0x0127,  0x68, 
a6e0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 a7 20 74  0x00 },  /* .. t
a6f0: 6f 20 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32  o h */.  { 0x012
a700: 38 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  8,  0x49, 0x00 }
a710: 2c 20 20 2f 2a 20 c4 a8 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
a720: 0a 20 20 7b 20 30 78 30 31 32 39 2c 20 20 30 78  .  { 0x0129,  0x
a730: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
a740: c4 a9 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
a750: 78 30 31 32 41 2c 20 20 30 78 34 39 2c 20 30 78  x012A,  0x49, 0x
a760: 30 30 20 7d 2c 20 20 2f 2a 20 c4 aa 20 74 6f 20  00 },  /* .. to 
a770: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 31 32 42 2c  I */.  { 0x012B,
a780: 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c 20    0x69, 0x00 }, 
a790: 20 2f 2a 20 c4 ab 20 74 6f 20 69 20 2a 2f 0a 20   /* .. to i */. 
a7a0: 20 7b 20 30 78 30 31 32 43 2c 20 20 30 78 34 39   { 0x012C,  0x49
a7b0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ac  , 0x00 },  /* ..
a7c0: 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30   to I */.  { 0x0
a7d0: 31 32 44 2c 20 20 30 78 36 39 2c 20 30 78 30 30  12D,  0x69, 0x00
a7e0: 20 7d 2c 20 20 2f 2a 20 c4 ad 20 74 6f 20 69 20   },  /* .. to i 
a7f0: 2a 2f 0a 20 20 7b 20 30 78 30 31 32 45 2c 20 20  */.  { 0x012E,  
a800: 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x49, 0x00 },  /
a810: 2a 20 c4 ae 20 74 6f 20 49 20 2a 2f 0a 20 20 7b  * .. to I */.  {
a820: 20 30 78 30 31 32 46 2c 20 20 30 78 36 39 2c 20   0x012F,  0x69, 
a830: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 af 20 74  0x00 },  /* .. t
a840: 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o i */.  { 0x013
a850: 30 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  0,  0x49, 0x00 }
a860: 2c 20 20 2f 2a 20 c4 b0 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
a870: 0a 20 20 7b 20 30 78 30 31 33 31 2c 20 20 30 78  .  { 0x0131,  0x
a880: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
a890: c4 b1 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
a8a0: 78 30 31 33 32 2c 20 20 30 78 34 39 2c 20 30 78  x0132,  0x49, 0x
a8b0: 34 41 20 7d 2c 20 20 2f 2a 20 c4 b2 20 74 6f 20  4A },  /* .. to 
a8c0: 49 4a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 33  IJ */.  { 0x0133
a8d0: 2c 20 20 30 78 36 39 2c 20 30 78 36 41 20 7d 2c  ,  0x69, 0x6A },
a8e0: 20 20 2f 2a 20 c4 b3 20 74 6f 20 69 6a 20 2a 2f    /* .. to ij */
a8f0: 0a 20 20 7b 20 30 78 30 31 33 34 2c 20 20 30 78  .  { 0x0134,  0x
a900: 34 41 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20  4A, 0x68 },  /* 
a910: c4 b4 20 74 6f 20 4a 68 20 2a 2f 0a 20 20 7b 20  .. to Jh */.  { 
a920: 30 78 30 31 33 35 2c 20 20 30 78 36 41 2c 20 30  0x0135,  0x6A, 0
a930: 78 36 38 20 7d 2c 20 20 2f 2a 20 c4 b5 20 74 6f  x68 },  /* .. to
a940: 20 6a 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33   jh */.  { 0x013
a950: 36 2c 20 20 30 78 34 42 2c 20 30 78 30 30 20 7d  6,  0x4B, 0x00 }
a960: 2c 20 20 2f 2a 20 c4 b6 20 74 6f 20 4b 20 2a 2f  ,  /* .. to K */
a970: 0a 20 20 7b 20 30 78 30 31 33 37 2c 20 20 30 78  .  { 0x0137,  0x
a980: 36 42 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6B, 0x00 },  /* 
a990: c4 b7 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30  .. to k */.  { 0
a9a0: 78 30 31 33 38 2c 20 20 30 78 36 42 2c 20 30 78  x0138,  0x6B, 0x
a9b0: 30 30 20 7d 2c 20 20 2f 2a 20 c4 b8 20 74 6f 20  00 },  /* .. to 
a9c0: 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33 39 2c  k */.  { 0x0139,
a9d0: 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d 2c 20    0x4C, 0x00 }, 
a9e0: 20 2f 2a 20 c4 b9 20 74 6f 20 4c 20 2a 2f 0a 20   /* .. to L */. 
a9f0: 20 7b 20 30 78 30 31 33 41 2c 20 20 30 78 36 43   { 0x013A,  0x6C
aa00: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 ba  , 0x00 },  /* ..
aa10: 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30   to l */.  { 0x0
aa20: 31 33 42 2c 20 20 30 78 34 43 2c 20 30 78 30 30  13B,  0x4C, 0x00
aa30: 20 7d 2c 20 20 2f 2a 20 c4 bb 20 74 6f 20 4c 20   },  /* .. to L 
aa40: 2a 2f 0a 20 20 7b 20 30 78 30 31 33 43 2c 20 20  */.  { 0x013C,  
aa50: 30 78 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6C, 0x00 },  /
aa60: 2a 20 c4 bc 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b  * .. to l */.  {
aa70: 20 30 78 30 31 33 44 2c 20 20 30 78 34 43 2c 20   0x013D,  0x4C, 
aa80: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c4 bd 20 74  0x00 },  /* .. t
aa90: 6f 20 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 31 33  o L */.  { 0x013
aaa0: 45 2c 20 20 30 78 36 43 2c 20 30 78 30 30 20 7d  E,  0x6C, 0x00 }
aab0: 2c 20 20 2f 2a 20 c4 be 20 74 6f 20 6c 20 2a 2f  ,  /* .. to l */
aac0: 0a 20 20 7b 20 30 78 30 31 33 46 2c 20 20 30 78  .  { 0x013F,  0x
aad0: 34 43 2c 20 30 78 32 45 20 7d 2c 20 20 2f 2a 20  4C, 0x2E },  /* 
aae0: c4 bf 20 74 6f 20 4c 2e 20 2a 2f 0a 20 20 7b 20  .. to L. */.  { 
aaf0: 30 78 30 31 34 30 2c 20 20 30 78 36 43 2c 20 30  0x0140,  0x6C, 0
ab00: 78 32 45 20 7d 2c 20 20 2f 2a 20 c5 80 20 74 6f  x2E },  /* .. to
ab10: 20 6c 2e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34   l. */.  { 0x014
ab20: 31 2c 20 20 30 78 34 43 2c 20 30 78 30 30 20 7d  1,  0x4C, 0x00 }
ab30: 2c 20 20 2f 2a 20 c5 81 20 74 6f 20 4c 20 2a 2f  ,  /* .. to L */
ab40: 0a 20 20 7b 20 30 78 30 31 34 32 2c 20 20 30 78  .  { 0x0142,  0x
ab50: 36 43 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  6C, 0x00 },  /* 
ab60: c5 82 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30  .. to l */.  { 0
ab70: 78 30 31 34 33 2c 20 20 30 78 34 45 2c 20 30 78  x0143,  0x4E, 0x
ab80: 30 30 20 7d 2c 20 20 2f 2a 20 c5 83 20 74 6f 20  00 },  /* .. to 
ab90: 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 34 2c  N */.  { 0x0144,
aba0: 20 20 30 78 36 45 2c 20 30 78 30 30 20 7d 2c 20    0x6E, 0x00 }, 
abb0: 20 2f 2a 20 c5 84 20 74 6f 20 6e 20 2a 2f 0a 20   /* .. to n */. 
abc0: 20 7b 20 30 78 30 31 34 35 2c 20 20 30 78 34 45   { 0x0145,  0x4E
abd0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 85  , 0x00 },  /* ..
abe0: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
abf0: 31 34 36 2c 20 20 30 78 36 45 2c 20 30 78 30 30  146,  0x6E, 0x00
ac00: 20 7d 2c 20 20 2f 2a 20 c5 86 20 74 6f 20 6e 20   },  /* .. to n 
ac10: 2a 2f 0a 20 20 7b 20 30 78 30 31 34 37 2c 20 20  */.  { 0x0147,  
ac20: 30 78 34 45 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4E, 0x00 },  /
ac30: 2a 20 c5 87 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b  * .. to N */.  {
ac40: 20 30 78 30 31 34 38 2c 20 20 30 78 36 45 2c 20   0x0148,  0x6E, 
ac50: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 88 20 74  0x00 },  /* .. t
ac60: 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34  o n */.  { 0x014
ac70: 39 2c 20 20 30 78 32 37 2c 20 30 78 36 45 20 7d  9,  0x27, 0x6E }
ac80: 2c 20 20 2f 2a 20 c5 89 20 74 6f 20 27 6e 20 2a  ,  /* .. to 'n *
ac90: 2f 0a 20 20 7b 20 30 78 30 31 34 41 2c 20 20 30  /.  { 0x014A,  0
aca0: 78 34 45 2c 20 30 78 34 37 20 7d 2c 20 20 2f 2a  x4E, 0x47 },  /*
acb0: 20 c5 8a 20 74 6f 20 4e 47 20 2a 2f 0a 20 20 7b   .. to NG */.  {
acc0: 20 30 78 30 31 34 42 2c 20 20 30 78 36 45 2c 20   0x014B,  0x6E, 
acd0: 30 78 36 37 20 7d 2c 20 20 2f 2a 20 c5 8b 20 74  0x67 },  /* .. t
ace0: 6f 20 6e 67 20 2a 2f 0a 20 20 7b 20 30 78 30 31  o ng */.  { 0x01
acf0: 34 43 2c 20 20 30 78 34 46 2c 20 30 78 30 30 20  4C,  0x4F, 0x00 
ad00: 7d 2c 20 20 2f 2a 20 c5 8c 20 74 6f 20 4f 20 2a  },  /* .. to O *
ad10: 2f 0a 20 20 7b 20 30 78 30 31 34 44 2c 20 20 30  /.  { 0x014D,  0
ad20: 78 36 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6F, 0x00 },  /*
ad30: 20 c5 8d 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
ad40: 30 78 30 31 34 45 2c 20 20 30 78 34 46 2c 20 30  0x014E,  0x4F, 0
ad50: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 8e 20 74 6f  x00 },  /* .. to
ad60: 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 31 34 46   O */.  { 0x014F
ad70: 2c 20 20 30 78 36 46 2c 20 30 78 30 30 20 7d 2c  ,  0x6F, 0x00 },
ad80: 20 20 2f 2a 20 c5 8f 20 74 6f 20 6f 20 2a 2f 0a    /* .. to o */.
ad90: 20 20 7b 20 30 78 30 31 35 30 2c 20 20 30 78 34    { 0x0150,  0x4
ada0: 46 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  F, 0x00 },  /* .
adb0: 90 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78  . to O */.  { 0x
adc0: 30 31 35 31 2c 20 20 30 78 36 46 2c 20 30 78 30  0151,  0x6F, 0x0
add0: 30 20 7d 2c 20 20 2f 2a 20 c5 91 20 74 6f 20 6f  0 },  /* .. to o
ade0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 32 2c 20   */.  { 0x0152, 
adf0: 20 30 78 34 46 2c 20 30 78 34 35 20 7d 2c 20 20   0x4F, 0x45 },  
ae00: 2f 2a 20 c5 92 20 74 6f 20 4f 45 20 2a 2f 0a 20  /* .. to OE */. 
ae10: 20 7b 20 30 78 30 31 35 33 2c 20 20 30 78 36 46   { 0x0153,  0x6F
ae20: 2c 20 30 78 36 35 20 7d 2c 20 20 2f 2a 20 c5 93  , 0x65 },  /* ..
ae30: 20 74 6f 20 6f 65 20 2a 2f 0a 20 20 7b 20 30 78   to oe */.  { 0x
ae40: 30 31 35 34 2c 20 20 30 78 35 32 2c 20 30 78 30  0154,  0x52, 0x0
ae50: 30 20 7d 2c 20 20 2f 2a 20 c5 94 20 74 6f 20 52  0 },  /* .. to R
ae60: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 35 2c 20   */.  { 0x0155, 
ae70: 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x72, 0x00 },  
ae80: 2f 2a 20 c5 95 20 74 6f 20 72 20 2a 2f 0a 20 20  /* .. to r */.  
ae90: 7b 20 30 78 30 31 35 36 2c 20 20 30 78 35 32 2c  { 0x0156,  0x52,
aea0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 96 20   0x00 },  /* .. 
aeb0: 74 6f 20 52 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to R */.  { 0x01
aec0: 35 37 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20  57,  0x72, 0x00 
aed0: 7d 2c 20 20 2f 2a 20 c5 97 20 74 6f 20 72 20 2a  },  /* .. to r *
aee0: 2f 0a 20 20 7b 20 30 78 30 31 35 38 2c 20 20 30  /.  { 0x0158,  0
aef0: 78 35 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x52, 0x00 },  /*
af00: 20 c5 98 20 74 6f 20 52 20 2a 2f 0a 20 20 7b 20   .. to R */.  { 
af10: 30 78 30 31 35 39 2c 20 20 30 78 37 32 2c 20 30  0x0159,  0x72, 0
af20: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 99 20 74 6f  x00 },  /* .. to
af30: 20 72 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 41   r */.  { 0x015A
af40: 2c 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c  ,  0x53, 0x00 },
af50: 20 20 2f 2a 20 c5 9a 20 74 6f 20 53 20 2a 2f 0a    /* .. to S */.
af60: 20 20 7b 20 30 78 30 31 35 42 2c 20 20 30 78 37    { 0x015B,  0x7
af70: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  3, 0x00 },  /* .
af80: 9b 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
af90: 30 31 35 43 2c 20 20 30 78 35 33 2c 20 30 78 36  015C,  0x53, 0x6
afa0: 38 20 7d 2c 20 20 2f 2a 20 c5 9c 20 74 6f 20 53  8 },  /* .. to S
afb0: 68 20 2a 2f 0a 20 20 7b 20 30 78 30 31 35 44 2c  h */.  { 0x015D,
afc0: 20 20 30 78 37 33 2c 20 30 78 36 38 20 7d 2c 20    0x73, 0x68 }, 
afd0: 20 2f 2a 20 c5 9d 20 74 6f 20 73 68 20 2a 2f 0a   /* .. to sh */.
afe0: 20 20 7b 20 30 78 30 31 35 45 2c 20 20 30 78 35    { 0x015E,  0x5
aff0: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  3, 0x00 },  /* .
b000: 9e 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78  . to S */.  { 0x
b010: 30 31 35 46 2c 20 20 30 78 37 33 2c 20 30 78 30  015F,  0x73, 0x0
b020: 30 20 7d 2c 20 20 2f 2a 20 c5 9f 20 74 6f 20 73  0 },  /* .. to s
b030: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 30 2c 20   */.  { 0x0160, 
b040: 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x53, 0x00 },  
b050: 2f 2a 20 c5 a0 20 74 6f 20 53 20 2a 2f 0a 20 20  /* .. to S */.  
b060: 7b 20 30 78 30 31 36 31 2c 20 20 30 78 37 33 2c  { 0x0161,  0x73,
b070: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a1 20   0x00 },  /* .. 
b080: 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to s */.  { 0x01
b090: 36 32 2c 20 20 30 78 35 34 2c 20 30 78 30 30 20  62,  0x54, 0x00 
b0a0: 7d 2c 20 20 2f 2a 20 c5 a2 20 74 6f 20 54 20 2a  },  /* .. to T *
b0b0: 2f 0a 20 20 7b 20 30 78 30 31 36 33 2c 20 20 30  /.  { 0x0163,  0
b0c0: 78 37 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x74, 0x00 },  /*
b0d0: 20 c5 a3 20 74 6f 20 74 20 2a 2f 0a 20 20 7b 20   .. to t */.  { 
b0e0: 30 78 30 31 36 34 2c 20 20 30 78 35 34 2c 20 30  0x0164,  0x54, 0
b0f0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a4 20 74 6f  x00 },  /* .. to
b100: 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 35   T */.  { 0x0165
b110: 2c 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c  ,  0x74, 0x00 },
b120: 20 20 2f 2a 20 c5 a5 20 74 6f 20 74 20 2a 2f 0a    /* .. to t */.
b130: 20 20 7b 20 30 78 30 31 36 36 2c 20 20 30 78 35    { 0x0166,  0x5
b140: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  4, 0x00 },  /* .
b150: a6 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78  . to T */.  { 0x
b160: 30 31 36 37 2c 20 20 30 78 37 34 2c 20 30 78 30  0167,  0x74, 0x0
b170: 30 20 7d 2c 20 20 2f 2a 20 c5 a7 20 74 6f 20 74  0 },  /* .. to t
b180: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 38 2c 20   */.  { 0x0168, 
b190: 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x55, 0x00 },  
b1a0: 2f 2a 20 c5 a8 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
b1b0: 7b 20 30 78 30 31 36 39 2c 20 20 30 78 37 35 2c  { 0x0169,  0x75,
b1c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 a9 20   0x00 },  /* .. 
b1d0: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to u */.  { 0x01
b1e0: 36 41 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  6A,  0x55, 0x00 
b1f0: 7d 2c 20 20 2f 2a 20 c5 aa 20 74 6f 20 55 20 2a  },  /* .. to U *
b200: 2f 0a 20 20 7b 20 30 78 30 31 36 42 2c 20 20 30  /.  { 0x016B,  0
b210: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
b220: 20 c5 ab 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
b230: 30 78 30 31 36 43 2c 20 20 30 78 35 35 2c 20 30  0x016C,  0x55, 0
b240: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 ac 20 74 6f  x00 },  /* .. to
b250: 20 55 20 2a 2f 0a 20 20 7b 20 30 78 30 31 36 44   U */.  { 0x016D
b260: 2c 20 20 30 78 37 35 2c 20 30 78 30 30 20 7d 2c  ,  0x75, 0x00 },
b270: 20 20 2f 2a 20 c5 ad 20 74 6f 20 75 20 2a 2f 0a    /* .. to u */.
b280: 20 20 7b 20 30 78 30 31 36 45 2c 20 20 30 78 35    { 0x016E,  0x5
b290: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  5, 0x00 },  /* .
b2a0: ae 20 74 6f 20 55 20 2a 2f 0a 20 20 7b 20 30 78  . to U */.  { 0x
b2b0: 30 31 36 46 2c 20 20 30 78 37 35 2c 20 30 78 30  016F,  0x75, 0x0
b2c0: 30 20 7d 2c 20 20 2f 2a 20 c5 af 20 74 6f 20 75  0 },  /* .. to u
b2d0: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 30 2c 20   */.  { 0x0170, 
b2e0: 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x55, 0x00 },  
b2f0: 2f 2a 20 c5 b0 20 74 6f 20 55 20 2a 2f 0a 20 20  /* .. to U */.  
b300: 7b 20 30 78 30 31 37 31 2c 20 20 30 78 37 35 2c  { 0x0171,  0x75,
b310: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b1 20   0x00 },  /* .. 
b320: 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to u */.  { 0x01
b330: 37 32 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20  72,  0x55, 0x00 
b340: 7d 2c 20 20 2f 2a 20 c5 b2 20 74 6f 20 55 20 2a  },  /* .. to U *
b350: 2f 0a 20 20 7b 20 30 78 30 31 37 33 2c 20 20 30  /.  { 0x0173,  0
b360: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
b370: 20 c5 b3 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
b380: 30 78 30 31 37 34 2c 20 20 30 78 35 37 2c 20 30  0x0174,  0x57, 0
b390: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b4 20 74 6f  x00 },  /* .. to
b3a0: 20 57 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 35   W */.  { 0x0175
b3b0: 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20 7d 2c  ,  0x77, 0x00 },
b3c0: 20 20 2f 2a 20 c5 b5 20 74 6f 20 77 20 2a 2f 0a    /* .. to w */.
b3d0: 20 20 7b 20 30 78 30 31 37 36 2c 20 20 30 78 35    { 0x0176,  0x5
b3e0: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  9, 0x00 },  /* .
b3f0: b6 20 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78  . to Y */.  { 0x
b400: 30 31 37 37 2c 20 20 30 78 37 39 2c 20 30 78 30  0177,  0x79, 0x0
b410: 30 20 7d 2c 20 20 2f 2a 20 c5 b7 20 74 6f 20 79  0 },  /* .. to y
b420: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 38 2c 20   */.  { 0x0178, 
b430: 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x59, 0x00 },  
b440: 2f 2a 20 c5 b8 20 74 6f 20 59 20 2a 2f 0a 20 20  /* .. to Y */.  
b450: 7b 20 30 78 30 31 37 39 2c 20 20 30 78 35 41 2c  { 0x0179,  0x5A,
b460: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 b9 20   0x00 },  /* .. 
b470: 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 31  to Z */.  { 0x01
b480: 37 41 2c 20 20 30 78 37 41 2c 20 30 78 30 30 20  7A,  0x7A, 0x00 
b490: 7d 2c 20 20 2f 2a 20 c5 ba 20 74 6f 20 7a 20 2a  },  /* .. to z *
b4a0: 2f 0a 20 20 7b 20 30 78 30 31 37 42 2c 20 20 30  /.  { 0x017B,  0
b4b0: 78 35 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x5A, 0x00 },  /*
b4c0: 20 c5 bb 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20   .. to Z */.  { 
b4d0: 30 78 30 31 37 43 2c 20 20 30 78 37 41 2c 20 30  0x017C,  0x7A, 0
b4e0: 78 30 30 20 7d 2c 20 20 2f 2a 20 c5 bc 20 74 6f  x00 },  /* .. to
b4f0: 20 7a 20 2a 2f 0a 20 20 7b 20 30 78 30 31 37 44   z */.  { 0x017D
b500: 2c 20 20 30 78 35 41 2c 20 30 78 30 30 20 7d 2c  ,  0x5A, 0x00 },
b510: 20 20 2f 2a 20 c5 bd 20 74 6f 20 5a 20 2a 2f 0a    /* .. to Z */.
b520: 20 20 7b 20 30 78 30 31 37 45 2c 20 20 30 78 37    { 0x017E,  0x7
b530: 41 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c5  A, 0x00 },  /* .
b540: be 20 74 6f 20 7a 20 2a 2f 0a 20 20 7b 20 30 78  . to z */.  { 0x
b550: 30 31 37 46 2c 20 20 30 78 37 33 2c 20 30 78 30  017F,  0x73, 0x0
b560: 30 20 7d 2c 20 20 2f 2a 20 c5 bf 20 74 6f 20 73  0 },  /* .. to s
b570: 20 2a 2f 0a 20 20 7b 20 30 78 30 31 39 32 2c 20   */.  { 0x0192, 
b580: 20 30 78 36 36 2c 20 30 78 30 30 20 7d 2c 20 20   0x66, 0x00 },  
b590: 2f 2a 20 c6 92 20 74 6f 20 66 20 2a 2f 0a 20 20  /* .. to f */.  
b5a0: 7b 20 30 78 30 32 31 38 2c 20 20 30 78 35 33 2c  { 0x0218,  0x53,
b5b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 98 20   0x00 },  /* .. 
b5c0: 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30 78 30 32  to S */.  { 0x02
b5d0: 31 39 2c 20 20 30 78 37 33 2c 20 30 78 30 30 20  19,  0x73, 0x00 
b5e0: 7d 2c 20 20 2f 2a 20 c8 99 20 74 6f 20 73 20 2a  },  /* .. to s *
b5f0: 2f 0a 20 20 7b 20 30 78 30 32 31 41 2c 20 20 30  /.  { 0x021A,  0
b600: 78 35 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x54, 0x00 },  /*
b610: 20 c8 9a 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20   .. to T */.  { 
b620: 30 78 30 32 31 42 2c 20 20 30 78 37 34 2c 20 30  0x021B,  0x74, 0
b630: 78 30 30 20 7d 2c 20 20 2f 2a 20 c8 9b 20 74 6f  x00 },  /* .. to
b640: 20 74 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 36   t */.  { 0x0386
b650: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
b660: 20 20 2f 2a 20 ce 86 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
b670: 20 20 7b 20 30 78 30 33 38 38 2c 20 20 30 78 34    { 0x0388,  0x4
b680: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  5, 0x00 },  /* .
b690: 88 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
b6a0: 30 33 38 39 2c 20 20 30 78 34 39 2c 20 30 78 30  0389,  0x49, 0x0
b6b0: 30 20 7d 2c 20 20 2f 2a 20 ce 89 20 74 6f 20 49  0 },  /* .. to I
b6c0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 38 41 2c 20   */.  { 0x038A, 
b6d0: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
b6e0: 2f 2a 20 ce 8a 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
b6f0: 7b 20 30 78 30 33 38 43 2c 20 20 30 78 34 66 2c  { 0x038C,  0x4f,
b700: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 8c 20   0x00 },  /* .. 
b710: 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to O */.  { 0x03
b720: 38 45 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20  8E,  0x59, 0x00 
b730: 7d 2c 20 20 2f 2a 20 ce 8e 20 74 6f 20 59 20 2a  },  /* .. to Y *
b740: 2f 0a 20 20 7b 20 30 78 30 33 38 46 2c 20 20 30  /.  { 0x038F,  0
b750: 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4f, 0x00 },  /*
b760: 20 ce 8f 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20   .. to O */.  { 
b770: 30 78 30 33 39 30 2c 20 20 30 78 36 39 2c 20 30  0x0390,  0x69, 0
b780: 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 90 20 74 6f  x00 },  /* .. to
b790: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 31   i */.  { 0x0391
b7a0: 2c 20 20 30 78 34 31 2c 20 30 78 30 30 20 7d 2c  ,  0x41, 0x00 },
b7b0: 20 20 2f 2a 20 ce 91 20 74 6f 20 41 20 2a 2f 0a    /* .. to A */.
b7c0: 20 20 7b 20 30 78 30 33 39 32 2c 20 20 30 78 34    { 0x0392,  0x4
b7d0: 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  2, 0x00 },  /* .
b7e0: 92 20 74 6f 20 42 20 2a 2f 0a 20 20 7b 20 30 78  . to B */.  { 0x
b7f0: 30 33 39 33 2c 20 20 30 78 34 37 2c 20 30 78 30  0393,  0x47, 0x0
b800: 30 20 7d 2c 20 20 2f 2a 20 ce 93 20 74 6f 20 47  0 },  /* .. to G
b810: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 34 2c 20   */.  { 0x0394, 
b820: 20 30 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x44, 0x00 },  
b830: 2f 2a 20 ce 94 20 74 6f 20 44 20 2a 2f 0a 20 20  /* .. to D */.  
b840: 7b 20 30 78 30 33 39 35 2c 20 20 30 78 34 35 2c  { 0x0395,  0x45,
b850: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 95 20   0x00 },  /* .. 
b860: 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to E */.  { 0x03
b870: 39 36 2c 20 20 30 78 35 61 2c 20 30 78 30 30 20  96,  0x5a, 0x00 
b880: 7d 2c 20 20 2f 2a 20 ce 96 20 74 6f 20 5a 20 2a  },  /* .. to Z *
b890: 2f 0a 20 20 7b 20 30 78 30 33 39 37 2c 20 20 30  /.  { 0x0397,  0
b8a0: 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x49, 0x00 },  /*
b8b0: 20 ce 97 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20   .. to I */.  { 
b8c0: 30 78 30 33 39 38 2c 20 20 30 78 35 34 2c 20 30  0x0398,  0x54, 0
b8d0: 78 36 38 20 7d 2c 20 20 2f 2a 20 ce 98 20 74 6f  x68 },  /* .. to
b8e0: 20 54 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39   Th */.  { 0x039
b8f0: 39 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d  9,  0x49, 0x00 }
b900: 2c 20 20 2f 2a 20 ce 99 20 74 6f 20 49 20 2a 2f  ,  /* .. to I */
b910: 0a 20 20 7b 20 30 78 30 33 39 41 2c 20 20 30 78  .  { 0x039A,  0x
b920: 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  4b, 0x00 },  /* 
b930: ce 9a 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30  .. to K */.  { 0
b940: 78 30 33 39 42 2c 20 20 30 78 34 63 2c 20 30 78  x039B,  0x4c, 0x
b950: 30 30 20 7d 2c 20 20 2f 2a 20 ce 9b 20 74 6f 20  00 },  /* .. to 
b960: 4c 20 2a 2f 0a 20 20 7b 20 30 78 30 33 39 43 2c  L */.  { 0x039C,
b970: 20 20 30 78 34 64 2c 20 30 78 30 30 20 7d 2c 20    0x4d, 0x00 }, 
b980: 20 2f 2a 20 ce 9c 20 74 6f 20 4d 20 2a 2f 0a 20   /* .. to M */. 
b990: 20 7b 20 30 78 30 33 39 44 2c 20 20 30 78 34 65   { 0x039D,  0x4e
b9a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce 9d  , 0x00 },  /* ..
b9b0: 20 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30   to N */.  { 0x0
b9c0: 33 39 45 2c 20 20 30 78 35 38 2c 20 30 78 30 30  39E,  0x58, 0x00
b9d0: 20 7d 2c 20 20 2f 2a 20 ce 9e 20 74 6f 20 58 20   },  /* .. to X 
b9e0: 2a 2f 0a 20 20 7b 20 30 78 30 33 39 46 2c 20 20  */.  { 0x039F,  
b9f0: 30 78 34 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4f, 0x00 },  /
ba00: 2a 20 ce 9f 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b  * .. to O */.  {
ba10: 20 30 78 30 33 41 30 2c 20 20 30 78 35 30 2c 20   0x03A0,  0x50, 
ba20: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a0 20 74  0x00 },  /* .. t
ba30: 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o P */.  { 0x03A
ba40: 31 2c 20 20 30 78 35 32 2c 20 30 78 30 30 20 7d  1,  0x52, 0x00 }
ba50: 2c 20 20 2f 2a 20 ce a1 20 74 6f 20 52 20 2a 2f  ,  /* .. to R */
ba60: 0a 20 20 7b 20 30 78 30 33 41 33 2c 20 20 30 78  .  { 0x03A3,  0x
ba70: 35 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  53, 0x00 },  /* 
ba80: ce a3 20 74 6f 20 53 20 2a 2f 0a 20 20 7b 20 30  .. to S */.  { 0
ba90: 78 30 33 41 34 2c 20 20 30 78 35 34 2c 20 30 78  x03A4,  0x54, 0x
baa0: 30 30 20 7d 2c 20 20 2f 2a 20 ce a4 20 74 6f 20  00 },  /* .. to 
bab0: 54 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 35 2c  T */.  { 0x03A5,
bac0: 20 20 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20    0x59, 0x00 }, 
bad0: 20 2f 2a 20 ce a5 20 74 6f 20 59 20 2a 2f 0a 20   /* .. to Y */. 
bae0: 20 7b 20 30 78 30 33 41 36 2c 20 20 30 78 34 36   { 0x03A6,  0x46
baf0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a6  , 0x00 },  /* ..
bb00: 20 74 6f 20 46 20 2a 2f 0a 20 20 7b 20 30 78 30   to F */.  { 0x0
bb10: 33 41 37 2c 20 20 30 78 34 33 2c 20 30 78 36 38  3A7,  0x43, 0x68
bb20: 20 7d 2c 20 20 2f 2a 20 ce a7 20 74 6f 20 43 68   },  /* .. to Ch
bb30: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41 38 2c 20   */.  { 0x03A8, 
bb40: 20 30 78 35 30 2c 20 30 78 37 33 20 7d 2c 20 20   0x50, 0x73 },  
bb50: 2f 2a 20 ce a8 20 74 6f 20 50 73 20 2a 2f 0a 20  /* .. to Ps */. 
bb60: 20 7b 20 30 78 30 33 41 39 2c 20 20 30 78 34 66   { 0x03A9,  0x4f
bb70: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce a9  , 0x00 },  /* ..
bb80: 20 74 6f 20 4f 20 2a 2f 0a 20 20 7b 20 30 78 30   to O */.  { 0x0
bb90: 33 41 41 2c 20 20 30 78 34 39 2c 20 30 78 30 30  3AA,  0x49, 0x00
bba0: 20 7d 2c 20 20 2f 2a 20 ce aa 20 74 6f 20 49 20   },  /* .. to I 
bbb0: 2a 2f 0a 20 20 7b 20 30 78 30 33 41 42 2c 20 20  */.  { 0x03AB,  
bbc0: 30 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x59, 0x00 },  /
bbd0: 2a 20 ce ab 20 74 6f 20 59 20 2a 2f 0a 20 20 7b  * .. to Y */.  {
bbe0: 20 30 78 30 33 41 43 2c 20 20 30 78 36 31 2c 20   0x03AC,  0x61, 
bbf0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce ac 20 74  0x00 },  /* .. t
bc00: 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78 30 33 41  o a */.  { 0x03A
bc10: 44 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d  D,  0x65, 0x00 }
bc20: 2c 20 20 2f 2a 20 ce ad 20 74 6f 20 65 20 2a 2f  ,  /* .. to e */
bc30: 0a 20 20 7b 20 30 78 30 33 41 45 2c 20 20 30 78  .  { 0x03AE,  0x
bc40: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
bc50: ce ae 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
bc60: 78 30 33 41 46 2c 20 20 30 78 36 39 2c 20 30 78  x03AF,  0x69, 0x
bc70: 30 30 20 7d 2c 20 20 2f 2a 20 ce af 20 74 6f 20  00 },  /* .. to 
bc80: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 31 2c  i */.  { 0x03B1,
bc90: 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c 20    0x61, 0x00 }, 
bca0: 20 2f 2a 20 ce b1 20 74 6f 20 61 20 2a 2f 0a 20   /* .. to a */. 
bcb0: 20 7b 20 30 78 30 33 42 32 2c 20 20 30 78 36 32   { 0x03B2,  0x62
bcc0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b2  , 0x00 },  /* ..
bcd0: 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20 30 78 30   to b */.  { 0x0
bce0: 33 42 33 2c 20 20 30 78 36 37 2c 20 30 78 30 30  3B3,  0x67, 0x00
bcf0: 20 7d 2c 20 20 2f 2a 20 ce b3 20 74 6f 20 67 20   },  /* .. to g 
bd00: 2a 2f 0a 20 20 7b 20 30 78 30 33 42 34 2c 20 20  */.  { 0x03B4,  
bd10: 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x64, 0x00 },  /
bd20: 2a 20 ce b4 20 74 6f 20 64 20 2a 2f 0a 20 20 7b  * .. to d */.  {
bd30: 20 30 78 30 33 42 35 2c 20 20 30 78 36 35 2c 20   0x03B5,  0x65, 
bd40: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce b5 20 74  0x00 },  /* .. t
bd50: 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42  o e */.  { 0x03B
bd60: 36 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20 7d  6,  0x7a, 0x00 }
bd70: 2c 20 20 2f 2a 20 ce b6 20 74 6f 20 7a 20 2a 2f  ,  /* .. to z */
bd80: 0a 20 20 7b 20 30 78 30 33 42 37 2c 20 20 30 78  .  { 0x03B7,  0x
bd90: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
bda0: ce b7 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
bdb0: 78 30 33 42 38 2c 20 20 30 78 37 34 2c 20 30 78  x03B8,  0x74, 0x
bdc0: 36 38 20 7d 2c 20 20 2f 2a 20 ce b8 20 74 6f 20  68 },  /* .. to 
bdd0: 74 68 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 39  th */.  { 0x03B9
bde0: 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20 7d 2c  ,  0x69, 0x00 },
bdf0: 20 20 2f 2a 20 ce b9 20 74 6f 20 69 20 2a 2f 0a    /* .. to i */.
be00: 20 20 7b 20 30 78 30 33 42 41 2c 20 20 30 78 36    { 0x03BA,  0x6
be10: 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce  b, 0x00 },  /* .
be20: ba 20 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78  . to k */.  { 0x
be30: 30 33 42 42 2c 20 20 30 78 36 63 2c 20 30 78 30  03BB,  0x6c, 0x0
be40: 30 20 7d 2c 20 20 2f 2a 20 ce bb 20 74 6f 20 6c  0 },  /* .. to l
be50: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 42 43 2c 20   */.  { 0x03BC, 
be60: 20 30 78 36 64 2c 20 30 78 30 30 20 7d 2c 20 20   0x6d, 0x00 },  
be70: 2f 2a 20 ce bc 20 74 6f 20 6d 20 2a 2f 0a 20 20  /* .. to m */.  
be80: 7b 20 30 78 30 33 42 44 2c 20 20 30 78 36 65 2c  { 0x03BD,  0x6e,
be90: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 ce bd 20   0x00 },  /* .. 
bea0: 74 6f 20 6e 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to n */.  { 0x03
beb0: 42 45 2c 20 20 30 78 37 38 2c 20 30 78 30 30 20  BE,  0x78, 0x00 
bec0: 7d 2c 20 20 2f 2a 20 ce be 20 74 6f 20 78 20 2a  },  /* .. to x *
bed0: 2f 0a 20 20 7b 20 30 78 30 33 42 46 2c 20 20 30  /.  { 0x03BF,  0
bee0: 78 36 66 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x6f, 0x00 },  /*
bef0: 20 ce bf 20 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20   .. to o */.  { 
bf00: 30 78 30 33 43 30 2c 20 20 30 78 37 30 2c 20 30  0x03C0,  0x70, 0
bf10: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 80 20 74 6f  x00 },  /* .. to
bf20: 20 70 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 31   p */.  { 0x03C1
bf30: 2c 20 20 30 78 37 32 2c 20 30 78 30 30 20 7d 2c  ,  0x72, 0x00 },
bf40: 20 20 2f 2a 20 cf 81 20 74 6f 20 72 20 2a 2f 0a    /* .. to r */.
bf50: 20 20 7b 20 30 78 30 33 43 33 2c 20 20 30 78 37    { 0x03C3,  0x7
bf60: 33 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  3, 0x00 },  /* .
bf70: 83 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
bf80: 30 33 43 34 2c 20 20 30 78 37 34 2c 20 30 78 30  03C4,  0x74, 0x0
bf90: 30 20 7d 2c 20 20 2f 2a 20 cf 84 20 74 6f 20 74  0 },  /* .. to t
bfa0: 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 35 2c 20   */.  { 0x03C5, 
bfb0: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
bfc0: 2f 2a 20 cf 85 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
bfd0: 7b 20 30 78 30 33 43 36 2c 20 20 30 78 36 36 2c  { 0x03C6,  0x66,
bfe0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 86 20   0x00 },  /* .. 
bff0: 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to f */.  { 0x03
c000: 43 37 2c 20 20 30 78 36 33 2c 20 30 78 36 38 20  C7,  0x63, 0x68 
c010: 7d 2c 20 20 2f 2a 20 cf 87 20 74 6f 20 63 68 20  },  /* .. to ch 
c020: 2a 2f 0a 20 20 7b 20 30 78 30 33 43 38 2c 20 20  */.  { 0x03C8,  
c030: 30 78 37 30 2c 20 30 78 37 33 20 7d 2c 20 20 2f  0x70, 0x73 },  /
c040: 2a 20 cf 88 20 74 6f 20 70 73 20 2a 2f 0a 20 20  * .. to ps */.  
c050: 7b 20 30 78 30 33 43 39 2c 20 20 30 78 36 66 2c  { 0x03C9,  0x6f,
c060: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 89 20   0x00 },  /* .. 
c070: 74 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33  to o */.  { 0x03
c080: 43 41 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  CA,  0x69, 0x00 
c090: 7d 2c 20 20 2f 2a 20 cf 8a 20 74 6f 20 69 20 2a  },  /* .. to i *
c0a0: 2f 0a 20 20 7b 20 30 78 30 33 43 42 2c 20 20 30  /.  { 0x03CB,  0
c0b0: 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x79, 0x00 },  /*
c0c0: 20 cf 8b 20 74 6f 20 79 20 2a 2f 0a 20 20 7b 20   .. to y */.  { 
c0d0: 30 78 30 33 43 43 2c 20 20 30 78 36 66 2c 20 30  0x03CC,  0x6f, 0
c0e0: 78 30 30 20 7d 2c 20 20 2f 2a 20 cf 8c 20 74 6f  x00 },  /* .. to
c0f0: 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 33 43 44   o */.  { 0x03CD
c100: 2c 20 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c  ,  0x79, 0x00 },
c110: 20 20 2f 2a 20 cf 8d 20 74 6f 20 79 20 2a 2f 0a    /* .. to y */.
c120: 20 20 7b 20 30 78 30 33 43 45 2c 20 20 30 78 36    { 0x03CE,  0x6
c130: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 cf  9, 0x00 },  /* .
c140: 8e 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
c150: 30 34 30 30 2c 20 20 30 78 34 35 2c 20 30 78 30  0400,  0x45, 0x0
c160: 30 20 7d 2c 20 20 2f 2a 20 d0 80 20 74 6f 20 45  0 },  /* .. to E
c170: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 31 2c 20   */.  { 0x0401, 
c180: 20 30 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20   0x45, 0x00 },  
c190: 2f 2a 20 d0 81 20 74 6f 20 45 20 2a 2f 0a 20 20  /* .. to E */.  
c1a0: 7b 20 30 78 30 34 30 32 2c 20 20 30 78 34 34 2c  { 0x0402,  0x44,
c1b0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 82 20   0x00 },  /* .. 
c1c0: 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to D */.  { 0x04
c1d0: 30 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20  03,  0x47, 0x00 
c1e0: 7d 2c 20 20 2f 2a 20 d0 83 20 74 6f 20 47 20 2a  },  /* .. to G *
c1f0: 2f 0a 20 20 7b 20 30 78 30 34 30 34 2c 20 20 30  /.  { 0x0404,  0
c200: 78 34 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x45, 0x00 },  /*
c210: 20 d0 84 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20   .. to E */.  { 
c220: 30 78 30 34 30 35 2c 20 20 30 78 35 61 2c 20 30  0x0405,  0x5a, 0
c230: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 85 20 74 6f  x00 },  /* .. to
c240: 20 5a 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 36   Z */.  { 0x0406
c250: 2c 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c  ,  0x49, 0x00 },
c260: 20 20 2f 2a 20 d0 86 20 74 6f 20 49 20 2a 2f 0a    /* .. to I */.
c270: 20 20 7b 20 30 78 30 34 30 37 2c 20 20 30 78 34    { 0x0407,  0x4
c280: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  9, 0x00 },  /* .
c290: 87 20 74 6f 20 49 20 2a 2f 0a 20 20 7b 20 30 78  . to I */.  { 0x
c2a0: 30 34 30 38 2c 20 20 30 78 34 61 2c 20 30 78 30  0408,  0x4a, 0x0
c2b0: 30 20 7d 2c 20 20 2f 2a 20 d0 88 20 74 6f 20 4a  0 },  /* .. to J
c2c0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 39 2c 20   */.  { 0x0409, 
c2d0: 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x49, 0x00 },  
c2e0: 2f 2a 20 d0 89 20 74 6f 20 49 20 2a 2f 0a 20 20  /* .. to I */.  
c2f0: 7b 20 30 78 30 34 30 41 2c 20 20 30 78 34 65 2c  { 0x040A,  0x4e,
c300: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8a 20   0x00 },  /* .. 
c310: 74 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to N */.  { 0x04
c320: 30 42 2c 20 20 30 78 34 34 2c 20 30 78 30 30 20  0B,  0x44, 0x00 
c330: 7d 2c 20 20 2f 2a 20 d0 8b 20 74 6f 20 44 20 2a  },  /* .. to D *
c340: 2f 0a 20 20 7b 20 30 78 30 34 30 43 2c 20 20 30  /.  { 0x040C,  0
c350: 78 34 62 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x4b, 0x00 },  /*
c360: 20 d0 8c 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20   .. to K */.  { 
c370: 30 78 30 34 30 44 2c 20 20 30 78 34 39 2c 20 30  0x040D,  0x49, 0
c380: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 8d 20 74 6f  x00 },  /* .. to
c390: 20 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 30 45   I */.  { 0x040E
c3a0: 2c 20 20 30 78 35 35 2c 20 30 78 30 30 20 7d 2c  ,  0x55, 0x00 },
c3b0: 20 20 2f 2a 20 d0 8e 20 74 6f 20 55 20 2a 2f 0a    /* .. to U */.
c3c0: 20 20 7b 20 30 78 30 34 30 46 2c 20 20 30 78 34    { 0x040F,  0x4
c3d0: 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  4, 0x00 },  /* .
c3e0: 8f 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78  . to D */.  { 0x
c3f0: 30 34 31 30 2c 20 20 30 78 34 31 2c 20 30 78 30  0410,  0x41, 0x0
c400: 30 20 7d 2c 20 20 2f 2a 20 d0 90 20 74 6f 20 41  0 },  /* .. to A
c410: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 31 2c 20   */.  { 0x0411, 
c420: 20 30 78 34 32 2c 20 30 78 30 30 20 7d 2c 20 20   0x42, 0x00 },  
c430: 2f 2a 20 d0 91 20 74 6f 20 42 20 2a 2f 0a 20 20  /* .. to B */.  
c440: 7b 20 30 78 30 34 31 32 2c 20 20 30 78 35 36 2c  { 0x0412,  0x56,
c450: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 92 20   0x00 },  /* .. 
c460: 74 6f 20 56 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to V */.  { 0x04
c470: 31 33 2c 20 20 30 78 34 37 2c 20 30 78 30 30 20  13,  0x47, 0x00 
c480: 7d 2c 20 20 2f 2a 20 d0 93 20 74 6f 20 47 20 2a  },  /* .. to G *
c490: 2f 0a 20 20 7b 20 30 78 30 34 31 34 2c 20 20 30  /.  { 0x0414,  0
c4a0: 78 34 34 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x44, 0x00 },  /*
c4b0: 20 d0 94 20 74 6f 20 44 20 2a 2f 0a 20 20 7b 20   .. to D */.  { 
c4c0: 30 78 30 34 31 35 2c 20 20 30 78 34 35 2c 20 30  0x0415,  0x45, 0
c4d0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 95 20 74 6f  x00 },  /* .. to
c4e0: 20 45 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 36   E */.  { 0x0416
c4f0: 2c 20 20 30 78 35 61 2c 20 30 78 36 38 20 7d 2c  ,  0x5a, 0x68 },
c500: 20 20 2f 2a 20 d0 96 20 74 6f 20 5a 68 20 2a 2f    /* .. to Zh */
c510: 0a 20 20 7b 20 30 78 30 34 31 37 2c 20 20 30 78  .  { 0x0417,  0x
c520: 35 61 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  5a, 0x00 },  /* 
c530: d0 97 20 74 6f 20 5a 20 2a 2f 0a 20 20 7b 20 30  .. to Z */.  { 0
c540: 78 30 34 31 38 2c 20 20 30 78 34 39 2c 20 30 78  x0418,  0x49, 0x
c550: 30 30 20 7d 2c 20 20 2f 2a 20 d0 98 20 74 6f 20  00 },  /* .. to 
c560: 49 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31 39 2c  I */.  { 0x0419,
c570: 20 20 30 78 34 39 2c 20 30 78 30 30 20 7d 2c 20    0x49, 0x00 }, 
c580: 20 2f 2a 20 d0 99 20 74 6f 20 49 20 2a 2f 0a 20   /* .. to I */. 
c590: 20 7b 20 30 78 30 34 31 41 2c 20 20 30 78 34 62   { 0x041A,  0x4b
c5a0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9a  , 0x00 },  /* ..
c5b0: 20 74 6f 20 4b 20 2a 2f 0a 20 20 7b 20 30 78 30   to K */.  { 0x0
c5c0: 34 31 42 2c 20 20 30 78 34 63 2c 20 30 78 30 30  41B,  0x4c, 0x00
c5d0: 20 7d 2c 20 20 2f 2a 20 d0 9b 20 74 6f 20 4c 20   },  /* .. to L 
c5e0: 2a 2f 0a 20 20 7b 20 30 78 30 34 31 43 2c 20 20  */.  { 0x041C,  
c5f0: 30 78 34 64 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x4d, 0x00 },  /
c600: 2a 20 d0 9c 20 74 6f 20 4d 20 2a 2f 0a 20 20 7b  * .. to M */.  {
c610: 20 30 78 30 34 31 44 2c 20 20 30 78 34 65 2c 20   0x041D,  0x4e, 
c620: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 9d 20 74  0x00 },  /* .. t
c630: 6f 20 4e 20 2a 2f 0a 20 20 7b 20 30 78 30 34 31  o N */.  { 0x041
c640: 45 2c 20 20 30 78 34 66 2c 20 30 78 30 30 20 7d  E,  0x4f, 0x00 }
c650: 2c 20 20 2f 2a 20 d0 9e 20 74 6f 20 4f 20 2a 2f  ,  /* .. to O */
c660: 0a 20 20 7b 20 30 78 30 34 31 46 2c 20 20 30 78  .  { 0x041F,  0x
c670: 35 30 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  50, 0x00 },  /* 
c680: d0 9f 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30  .. to P */.  { 0
c690: 78 30 34 32 30 2c 20 20 30 78 35 32 2c 20 30 78  x0420,  0x52, 0x
c6a0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 a0 20 74 6f 20  00 },  /* .. to 
c6b0: 52 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 31 2c  R */.  { 0x0421,
c6c0: 20 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20    0x53, 0x00 }, 
c6d0: 20 2f 2a 20 d0 a1 20 74 6f 20 53 20 2a 2f 0a 20   /* .. to S */. 
c6e0: 20 7b 20 30 78 30 34 32 32 2c 20 20 30 78 35 34   { 0x0422,  0x54
c6f0: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 a2  , 0x00 },  /* ..
c700: 20 74 6f 20 54 20 2a 2f 0a 20 20 7b 20 30 78 30   to T */.  { 0x0
c710: 34 32 33 2c 20 20 30 78 35 35 2c 20 30 78 30 30  423,  0x55, 0x00
c720: 20 7d 2c 20 20 2f 2a 20 d0 a3 20 74 6f 20 55 20   },  /* .. to U 
c730: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 34 2c 20 20  */.  { 0x0424,  
c740: 30 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x46, 0x00 },  /
c750: 2a 20 d0 a4 20 74 6f 20 46 20 2a 2f 0a 20 20 7b  * .. to F */.  {
c760: 20 30 78 30 34 32 35 2c 20 20 30 78 34 62 2c 20   0x0425,  0x4b, 
c770: 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a5 20 74  0x68 },  /* .. t
c780: 6f 20 4b 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34  o Kh */.  { 0x04
c790: 32 36 2c 20 20 30 78 35 34 2c 20 30 78 36 33 20  26,  0x54, 0x63 
c7a0: 7d 2c 20 20 2f 2a 20 d0 a6 20 74 6f 20 54 63 20  },  /* .. to Tc 
c7b0: 2a 2f 0a 20 20 7b 20 30 78 30 34 32 37 2c 20 20  */.  { 0x0427,  
c7c0: 30 78 34 33 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x43, 0x68 },  /
c7d0: 2a 20 d0 a7 20 74 6f 20 43 68 20 2a 2f 0a 20 20  * .. to Ch */.  
c7e0: 7b 20 30 78 30 34 32 38 2c 20 20 30 78 35 33 2c  { 0x0428,  0x53,
c7f0: 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 a8 20   0x68 },  /* .. 
c800: 74 6f 20 53 68 20 2a 2f 0a 20 20 7b 20 30 78 30  to Sh */.  { 0x0
c810: 34 32 39 2c 20 20 30 78 35 33 2c 20 30 78 36 38  429,  0x53, 0x68
c820: 20 7d 2c 20 20 2f 2a 20 d0 a9 20 74 6f 20 53 68   },  /* .. to Sh
c830: 63 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 41  ch */.  { 0x042A
c840: 2c 20 20 30 78 36 31 2c 20 30 78 30 30 20 7d 2c  ,  0x61, 0x00 },
c850: 20 20 2f 2a 20 20 74 6f 20 41 20 2a 2f 0a 20 20    /*  to A */.  
c860: 7b 20 30 78 30 34 32 42 2c 20 20 30 78 35 39 2c  { 0x042B,  0x59,
c870: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 ab 20   0x00 },  /* .. 
c880: 74 6f 20 59 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to Y */.  { 0x04
c890: 32 43 2c 20 20 30 78 35 39 2c 20 30 78 30 30 20  2C,  0x59, 0x00 
c8a0: 7d 2c 20 20 2f 2a 20 20 74 6f 20 59 20 2a 2f 0a  },  /*  to Y */.
c8b0: 20 20 7b 20 30 78 30 34 32 44 2c 20 20 30 78 34    { 0x042D,  0x4
c8c0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  5, 0x00 },  /* .
c8d0: ad 20 74 6f 20 45 20 2a 2f 0a 20 20 7b 20 30 78  . to E */.  { 0x
c8e0: 30 34 32 45 2c 20 20 30 78 34 39 2c 20 30 78 37  042E,  0x49, 0x7
c8f0: 35 20 7d 2c 20 20 2f 2a 20 d0 ae 20 74 6f 20 49  5 },  /* .. to I
c900: 75 20 2a 2f 0a 20 20 7b 20 30 78 30 34 32 46 2c  u */.  { 0x042F,
c910: 20 20 30 78 34 39 2c 20 30 78 36 31 20 7d 2c 20    0x49, 0x61 }, 
c920: 20 2f 2a 20 d0 af 20 74 6f 20 49 61 20 2a 2f 0a   /* .. to Ia */.
c930: 20 20 7b 20 30 78 30 34 33 30 2c 20 20 30 78 36    { 0x0430,  0x6
c940: 31 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0  1, 0x00 },  /* .
c950: b0 20 74 6f 20 61 20 2a 2f 0a 20 20 7b 20 30 78  . to a */.  { 0x
c960: 30 34 33 31 2c 20 20 30 78 36 32 2c 20 30 78 30  0431,  0x62, 0x0
c970: 30 20 7d 2c 20 20 2f 2a 20 d0 b1 20 74 6f 20 62  0 },  /* .. to b
c980: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 32 2c 20   */.  { 0x0432, 
c990: 20 30 78 37 36 2c 20 30 78 30 30 20 7d 2c 20 20   0x76, 0x00 },  
c9a0: 2f 2a 20 d0 b2 20 74 6f 20 76 20 2a 2f 0a 20 20  /* .. to v */.  
c9b0: 7b 20 30 78 30 34 33 33 2c 20 20 30 78 36 37 2c  { 0x0433,  0x67,
c9c0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 b3 20   0x00 },  /* .. 
c9d0: 74 6f 20 67 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to g */.  { 0x04
c9e0: 33 34 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20  34,  0x64, 0x00 
c9f0: 7d 2c 20 20 2f 2a 20 d0 b4 20 74 6f 20 64 20 2a  },  /* .. to d *
ca00: 2f 0a 20 20 7b 20 30 78 30 34 33 35 2c 20 20 30  /.  { 0x0435,  0
ca10: 78 36 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x65, 0x00 },  /*
ca20: 20 d0 b5 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20   .. to e */.  { 
ca30: 30 78 30 34 33 36 2c 20 20 30 78 37 61 2c 20 30  0x0436,  0x7a, 0
ca40: 78 36 38 20 7d 2c 20 20 2f 2a 20 d0 b6 20 74 6f  x68 },  /* .. to
ca50: 20 7a 68 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33   zh */.  { 0x043
ca60: 37 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20 7d  7,  0x7a, 0x00 }
ca70: 2c 20 20 2f 2a 20 d0 b7 20 74 6f 20 7a 20 2a 2f  ,  /* .. to z */
ca80: 0a 20 20 7b 20 30 78 30 34 33 38 2c 20 20 30 78  .  { 0x0438,  0x
ca90: 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  69, 0x00 },  /* 
caa0: d0 b8 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30  .. to i */.  { 0
cab0: 78 30 34 33 39 2c 20 20 30 78 36 39 2c 20 30 78  x0439,  0x69, 0x
cac0: 30 30 20 7d 2c 20 20 2f 2a 20 d0 b9 20 74 6f 20  00 },  /* .. to 
cad0: 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33 41 2c  i */.  { 0x043A,
cae0: 20 20 30 78 36 62 2c 20 30 78 30 30 20 7d 2c 20    0x6b, 0x00 }, 
caf0: 20 2f 2a 20 d0 ba 20 74 6f 20 6b 20 2a 2f 0a 20   /* .. to k */. 
cb00: 20 7b 20 30 78 30 34 33 42 2c 20 20 30 78 36 63   { 0x043B,  0x6c
cb10: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 bb  , 0x00 },  /* ..
cb20: 20 74 6f 20 6c 20 2a 2f 0a 20 20 7b 20 30 78 30   to l */.  { 0x0
cb30: 34 33 43 2c 20 20 30 78 36 64 2c 20 30 78 30 30  43C,  0x6d, 0x00
cb40: 20 7d 2c 20 20 2f 2a 20 d0 bc 20 74 6f 20 6d 20   },  /* .. to m 
cb50: 2a 2f 0a 20 20 7b 20 30 78 30 34 33 44 2c 20 20  */.  { 0x043D,  
cb60: 30 78 36 65 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6e, 0x00 },  /
cb70: 2a 20 d0 bd 20 74 6f 20 6e 20 2a 2f 0a 20 20 7b  * .. to n */.  {
cb80: 20 30 78 30 34 33 45 2c 20 20 30 78 36 66 2c 20   0x043E,  0x6f, 
cb90: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d0 be 20 74  0x00 },  /* .. t
cba0: 6f 20 6f 20 2a 2f 0a 20 20 7b 20 30 78 30 34 33  o o */.  { 0x043
cbb0: 46 2c 20 20 30 78 37 30 2c 20 30 78 30 30 20 7d  F,  0x70, 0x00 }
cbc0: 2c 20 20 2f 2a 20 d0 bf 20 74 6f 20 70 20 2a 2f  ,  /* .. to p */
cbd0: 0a 20 20 7b 20 30 78 30 34 34 30 2c 20 20 30 78  .  { 0x0440,  0x
cbe0: 37 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  72, 0x00 },  /* 
cbf0: d1 80 20 74 6f 20 72 20 2a 2f 0a 20 20 7b 20 30  .. to r */.  { 0
cc00: 78 30 34 34 31 2c 20 20 30 78 37 33 2c 20 30 78  x0441,  0x73, 0x
cc10: 30 30 20 7d 2c 20 20 2f 2a 20 d1 81 20 74 6f 20  00 },  /* .. to 
cc20: 73 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 32 2c  s */.  { 0x0442,
cc30: 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20    0x74, 0x00 }, 
cc40: 20 2f 2a 20 d1 82 20 74 6f 20 74 20 2a 2f 0a 20   /* .. to t */. 
cc50: 20 7b 20 30 78 30 34 34 33 2c 20 20 30 78 37 35   { 0x0443,  0x75
cc60: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 83  , 0x00 },  /* ..
cc70: 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20 30 78 30   to u */.  { 0x0
cc80: 34 34 34 2c 20 20 30 78 36 36 2c 20 30 78 30 30  444,  0x66, 0x00
cc90: 20 7d 2c 20 20 2f 2a 20 d1 84 20 74 6f 20 66 20   },  /* .. to f 
cca0: 2a 2f 0a 20 20 7b 20 30 78 30 34 34 35 2c 20 20  */.  { 0x0445,  
ccb0: 30 78 36 62 2c 20 30 78 36 38 20 7d 2c 20 20 2f  0x6b, 0x68 },  /
ccc0: 2a 20 d1 85 20 74 6f 20 6b 68 20 2a 2f 0a 20 20  * .. to kh */.  
ccd0: 7b 20 30 78 30 34 34 36 2c 20 20 30 78 37 34 2c  { 0x0446,  0x74,
cce0: 20 30 78 36 33 20 7d 2c 20 20 2f 2a 20 d1 86 20   0x63 },  /* .. 
ccf0: 74 6f 20 74 63 20 2a 2f 0a 20 20 7b 20 30 78 30  to tc */.  { 0x0
cd00: 34 34 37 2c 20 20 30 78 36 33 2c 20 30 78 36 38  447,  0x63, 0x68
cd10: 20 7d 2c 20 20 2f 2a 20 d1 87 20 74 6f 20 63 68   },  /* .. to ch
cd20: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 38 2c 20   */.  { 0x0448, 
cd30: 20 30 78 37 33 2c 20 30 78 36 38 20 7d 2c 20 20   0x73, 0x68 },  
cd40: 2f 2a 20 d1 88 20 74 6f 20 73 68 20 2a 2f 0a 20  /* .. to sh */. 
cd50: 20 7b 20 30 78 30 34 34 39 2c 20 20 30 78 37 33   { 0x0449,  0x73
cd60: 2c 20 30 78 36 38 20 7d 2c 20 20 2f 2a 20 d1 89  , 0x68 },  /* ..
cd70: 20 74 6f 20 73 68 63 68 20 2a 2f 0a 20 20 7b 20   to shch */.  { 
cd80: 30 78 30 34 34 41 2c 20 20 30 78 36 31 2c 20 30  0x044A,  0x61, 0
cd90: 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f 20 61  x00 },  /*  to a
cda0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 42 2c 20   */.  { 0x044B, 
cdb0: 20 30 78 37 39 2c 20 30 78 30 30 20 7d 2c 20 20   0x79, 0x00 },  
cdc0: 2f 2a 20 d1 8b 20 74 6f 20 79 20 2a 2f 0a 20 20  /* .. to y */.  
cdd0: 7b 20 30 78 30 34 34 43 2c 20 20 30 78 37 39 2c  { 0x044C,  0x79,
cde0: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 20 74 6f   0x00 },  /*  to
cdf0: 20 79 20 2a 2f 0a 20 20 7b 20 30 78 30 34 34 44   y */.  { 0x044D
ce00: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
ce10: 20 20 2f 2a 20 d1 8d 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
ce20: 20 20 7b 20 30 78 30 34 34 45 2c 20 20 30 78 36    { 0x044E,  0x6
ce30: 39 2c 20 30 78 37 35 20 7d 2c 20 20 2f 2a 20 d1  9, 0x75 },  /* .
ce40: 8e 20 74 6f 20 69 75 20 2a 2f 0a 20 20 7b 20 30  . to iu */.  { 0
ce50: 78 30 34 34 46 2c 20 20 30 78 36 39 2c 20 30 78  x044F,  0x69, 0x
ce60: 36 31 20 7d 2c 20 20 2f 2a 20 d1 8f 20 74 6f 20  61 },  /* .. to 
ce70: 69 61 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 30  ia */.  { 0x0450
ce80: 2c 20 20 30 78 36 35 2c 20 30 78 30 30 20 7d 2c  ,  0x65, 0x00 },
ce90: 20 20 2f 2a 20 d1 90 20 74 6f 20 65 20 2a 2f 0a    /* .. to e */.
cea0: 20 20 7b 20 30 78 30 34 35 31 2c 20 20 30 78 36    { 0x0451,  0x6
ceb0: 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  5, 0x00 },  /* .
cec0: 91 20 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78  . to e */.  { 0x
ced0: 30 34 35 32 2c 20 20 30 78 36 34 2c 20 30 78 30  0452,  0x64, 0x0
cee0: 30 20 7d 2c 20 20 2f 2a 20 d1 92 20 74 6f 20 64  0 },  /* .. to d
cef0: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 33 2c 20   */.  { 0x0453, 
cf00: 20 30 78 36 37 2c 20 30 78 30 30 20 7d 2c 20 20   0x67, 0x00 },  
cf10: 2f 2a 20 d1 93 20 74 6f 20 67 20 2a 2f 0a 20 20  /* .. to g */.  
cf20: 7b 20 30 78 30 34 35 34 2c 20 20 30 78 36 35 2c  { 0x0454,  0x65,
cf30: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 94 20   0x00 },  /* .. 
cf40: 74 6f 20 65 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to e */.  { 0x04
cf50: 35 35 2c 20 20 30 78 37 61 2c 20 30 78 30 30 20  55,  0x7a, 0x00 
cf60: 7d 2c 20 20 2f 2a 20 d1 95 20 74 6f 20 7a 20 2a  },  /* .. to z *
cf70: 2f 0a 20 20 7b 20 30 78 30 34 35 36 2c 20 20 30  /.  { 0x0456,  0
cf80: 78 36 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x69, 0x00 },  /*
cf90: 20 d1 96 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20   .. to i */.  { 
cfa0: 30 78 30 34 35 37 2c 20 20 30 78 36 39 2c 20 30  0x0457,  0x69, 0
cfb0: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 97 20 74 6f  x00 },  /* .. to
cfc0: 20 69 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 38   i */.  { 0x0458
cfd0: 2c 20 20 30 78 36 61 2c 20 30 78 30 30 20 7d 2c  ,  0x6a, 0x00 },
cfe0: 20 20 2f 2a 20 d1 98 20 74 6f 20 6a 20 2a 2f 0a    /* .. to j */.
cff0: 20 20 7b 20 30 78 30 34 35 39 2c 20 20 30 78 36    { 0x0459,  0x6
d000: 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1  9, 0x00 },  /* .
d010: 99 20 74 6f 20 69 20 2a 2f 0a 20 20 7b 20 30 78  . to i */.  { 0x
d020: 30 34 35 41 2c 20 20 30 78 36 65 2c 20 30 78 30  045A,  0x6e, 0x0
d030: 30 20 7d 2c 20 20 2f 2a 20 d1 9a 20 74 6f 20 6e  0 },  /* .. to n
d040: 20 2a 2f 0a 20 20 7b 20 30 78 30 34 35 42 2c 20   */.  { 0x045B, 
d050: 20 30 78 36 34 2c 20 30 78 30 30 20 7d 2c 20 20   0x64, 0x00 },  
d060: 2f 2a 20 d1 9b 20 74 6f 20 64 20 2a 2f 0a 20 20  /* .. to d */.  
d070: 7b 20 30 78 30 34 35 43 2c 20 20 30 78 36 62 2c  { 0x045C,  0x6b,
d080: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9c 20   0x00 },  /* .. 
d090: 74 6f 20 6b 20 2a 2f 0a 20 20 7b 20 30 78 30 34  to k */.  { 0x04
d0a0: 35 44 2c 20 20 30 78 36 39 2c 20 30 78 30 30 20  5D,  0x69, 0x00 
d0b0: 7d 2c 20 20 2f 2a 20 d1 9d 20 74 6f 20 69 20 2a  },  /* .. to i *
d0c0: 2f 0a 20 20 7b 20 30 78 30 34 35 45 2c 20 20 30  /.  { 0x045E,  0
d0d0: 78 37 35 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x75, 0x00 },  /*
d0e0: 20 d1 9e 20 74 6f 20 75 20 2a 2f 0a 20 20 7b 20   .. to u */.  { 
d0f0: 30 78 30 34 35 46 2c 20 20 30 78 36 34 2c 20 30  0x045F,  0x64, 0
d100: 78 30 30 20 7d 2c 20 20 2f 2a 20 d1 9f 20 74 6f  x00 },  /* .. to
d110: 20 64 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30 32   d */.  { 0x1E02
d120: 2c 20 20 30 78 34 32 2c 20 30 78 30 30 20 7d 2c  ,  0x42, 0x00 },
d130: 20 20 2f 2a 20 e1 b8 82 20 74 6f 20 42 20 2a 2f    /* ... to B */
d140: 0a 20 20 7b 20 30 78 31 45 30 33 2c 20 20 30 78  .  { 0x1E03,  0x
d150: 36 32 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  62, 0x00 },  /* 
d160: e1 b8 83 20 74 6f 20 62 20 2a 2f 0a 20 20 7b 20  ... to b */.  { 
d170: 30 78 31 45 30 41 2c 20 20 30 78 34 34 2c 20 30  0x1E0A,  0x44, 0
d180: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 8a 20 74  x00 },  /* ... t
d190: 6f 20 44 20 2a 2f 0a 20 20 7b 20 30 78 31 45 30  o D */.  { 0x1E0
d1a0: 42 2c 20 20 30 78 36 34 2c 20 30 78 30 30 20 7d  B,  0x64, 0x00 }
d1b0: 2c 20 20 2f 2a 20 e1 b8 8b 20 74 6f 20 64 20 2a  ,  /* ... to d *
d1c0: 2f 0a 20 20 7b 20 30 78 31 45 31 45 2c 20 20 30  /.  { 0x1E1E,  0
d1d0: 78 34 36 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x46, 0x00 },  /*
d1e0: 20 e1 b8 9e 20 74 6f 20 46 20 2a 2f 0a 20 20 7b   ... to F */.  {
d1f0: 20 30 78 31 45 31 46 2c 20 20 30 78 36 36 2c 20   0x1E1F,  0x66, 
d200: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b8 9f 20  0x00 },  /* ... 
d210: 74 6f 20 66 20 2a 2f 0a 20 20 7b 20 30 78 31 45  to f */.  { 0x1E
d220: 34 30 2c 20 20 30 78 34 44 2c 20 30 78 30 30 20  40,  0x4D, 0x00 
d230: 7d 2c 20 20 2f 2a 20 e1 b9 80 20 74 6f 20 4d 20  },  /* ... to M 
d240: 2a 2f 0a 20 20 7b 20 30 78 31 45 34 31 2c 20 20  */.  { 0x1E41,  
d250: 30 78 36 44 2c 20 30 78 30 30 20 7d 2c 20 20 2f  0x6D, 0x00 },  /
d260: 2a 20 e1 b9 81 20 74 6f 20 6d 20 2a 2f 0a 20 20  * ... to m */.  
d270: 7b 20 30 78 31 45 35 36 2c 20 20 30 78 35 30 2c  { 0x1E56,  0x50,
d280: 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9 96   0x00 },  /* ...
d290: 20 74 6f 20 50 20 2a 2f 0a 20 20 7b 20 30 78 31   to P */.  { 0x1
d2a0: 45 35 37 2c 20 20 30 78 37 30 2c 20 30 78 30 30  E57,  0x70, 0x00
d2b0: 20 7d 2c 20 20 2f 2a 20 e1 b9 97 20 74 6f 20 70   },  /* ... to p
d2c0: 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 30 2c 20   */.  { 0x1E60, 
d2d0: 20 30 78 35 33 2c 20 30 78 30 30 20 7d 2c 20 20   0x53, 0x00 },  
d2e0: 2f 2a 20 e1 b9 a0 20 74 6f 20 53 20 2a 2f 0a 20  /* ... to S */. 
d2f0: 20 7b 20 30 78 31 45 36 31 2c 20 20 30 78 37 33   { 0x1E61,  0x73
d300: 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 b9  , 0x00 },  /* ..
d310: a1 20 74 6f 20 73 20 2a 2f 0a 20 20 7b 20 30 78  . to s */.  { 0x
d320: 31 45 36 41 2c 20 20 30 78 35 34 2c 20 30 78 30  1E6A,  0x54, 0x0
d330: 30 20 7d 2c 20 20 2f 2a 20 e1 b9 aa 20 74 6f 20  0 },  /* ... to 
d340: 54 20 2a 2f 0a 20 20 7b 20 30 78 31 45 36 42 2c  T */.  { 0x1E6B,
d350: 20 20 30 78 37 34 2c 20 30 78 30 30 20 7d 2c 20    0x74, 0x00 }, 
d360: 20 2f 2a 20 e1 b9 ab 20 74 6f 20 74 20 2a 2f 0a   /* ... to t */.
d370: 20 20 7b 20 30 78 31 45 38 30 2c 20 20 30 78 35    { 0x1E80,  0x5
d380: 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1  7, 0x00 },  /* .
d390: ba 80 20 74 6f 20 57 20 2a 2f 0a 20 20 7b 20 30  .. to W */.  { 0
d3a0: 78 31 45 38 31 2c 20 20 30 78 37 37 2c 20 30 78  x1E81,  0x77, 0x
d3b0: 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 81 20 74 6f  00 },  /* ... to
d3c0: 20 77 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38 32   w */.  { 0x1E82
d3d0: 2c 20 20 30 78 35 37 2c 20 30 78 30 30 20 7d 2c  ,  0x57, 0x00 },
d3e0: 20 20 2f 2a 20 e1 ba 82 20 74 6f 20 57 20 2a 2f    /* ... to W */
d3f0: 0a 20 20 7b 20 30 78 31 45 38 33 2c 20 20 30 78  .  { 0x1E83,  0x
d400: 37 37 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a 20  77, 0x00 },  /* 
d410: e1 ba 83 20 74 6f 20 77 20 2a 2f 0a 20 20 7b 20  ... to w */.  { 
d420: 30 78 31 45 38 34 2c 20 20 30 78 35 37 2c 20 30  0x1E84,  0x57, 0
d430: 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 ba 84 20 74  x00 },  /* ... t
d440: 6f 20 57 20 2a 2f 0a 20 20 7b 20 30 78 31 45 38  o W */.  { 0x1E8
d450: 35 2c 20 20 30 78 37 37 2c 20 30 78 30 30 20 7d  5,  0x77, 0x00 }
d460: 2c 20 20 2f 2a 20 e1 ba 85 20 74 6f 20 77 20 2a  ,  /* ... to w *
d470: 2f 0a 20 20 7b 20 30 78 31 45 46 32 2c 20 20 30  /.  { 0x1EF2,  0
d480: 78 35 39 2c 20 30 78 30 30 20 7d 2c 20 20 2f 2a  x59, 0x00 },  /*
d490: 20 e1 bb b2 20 74 6f 20 59 20 2a 2f 0a 20 20 7b   ... to Y */.  {
d4a0: 20 30 78 31 45 46 33 2c 20 20 30 78 37 39 2c 20   0x1EF3,  0x79, 
d4b0: 30 78 30 30 20 7d 2c 20 20 2f 2a 20 e1 bb b3 20  0x00 },  /* ... 
d4c0: 74 6f 20 79 20 2a 2f 0a 20 20 7b 20 30 78 46 42  to y */.  { 0xFB
d4d0: 30 30 2c 20 20 30 78 36 36 2c 20 30 78 36 36 20  00,  0x66, 0x66 
d4e0: 7d 2c 20 20 2f 2a 20 ef ac 80 20 74 6f 20 66 66  },  /* ... to ff
d4f0: 20 2a 2f 0a 20 20 7b 20 30 78 46 42 30 31 2c 20   */.  { 0xFB01, 
d500: 20 30 78 36 36 2c 20 30 78 36 39 20 7d 2c 20 20   0x66, 0x69 },  
d510: 2f 2a 20 ef ac 81 20 74 6f 20 66 69 20 2a 2f 0a  /* ... to fi */.
d520: 20 20 7b 20 30 78 46 42 30 32 2c 20 20 30 78 36    { 0xFB02,  0x6
d530: 36 2c 20 30 78 36 43 20 7d 2c 20 20 2f 2a 20 ef  6, 0x6C },  /* .
d540: ac 82 20 74 6f 20 66 6c 20 2a 2f 0a 20 20 7b 20  .. to fl */.  { 
d550: 30 78 46 42 30 35 2c 20 20 30 78 37 33 2c 20 30  0xFB05,  0x73, 0
d560: 78 37 34 20 7d 2c 20 20 2f 2a 20 ef ac 85 20 74  x74 },  /* ... t
d570: 6f 20 73 74 20 2a 2f 0a 20 20 7b 20 30 78 46 42  o st */.  { 0xFB
d580: 30 36 2c 20 20 30 78 37 33 2c 20 30 78 37 34 20  06,  0x73, 0x74 
d590: 7d 2c 20 20 2f 2a 20 ef ac 86 20 74 6f 20 73 74  },  /* ... to st
d5a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
d5b0: 6e 76 65 72 74 20 74 68 65 20 69 6e 70 75 74 20  nvert the input 
d5c0: 73 74 72 69 6e 67 20 66 72 6f 6d 20 55 54 46 2d  string from UTF-
d5d0: 38 20 69 6e 74 6f 20 70 75 72 65 20 41 53 43 49  8 into pure ASCI
d5e0: 49 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  I by converting.
d5f0: 2a 2a 20 61 6c 6c 20 6e 6f 6e 2d 41 53 43 49 49  ** all non-ASCII
d600: 20 63 68 61 72 61 63 74 65 72 73 20 74 6f 20 73   characters to s
d610: 6f 6d 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  ome combination 
d620: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
d630: 20 74 68 65 0a 2a 2a 20 41 53 43 49 49 20 73 75   the.** ASCII su
d640: 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  bset..**.** The 
d650: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
d660: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 6d 6f  might contain mo
d670: 72 65 20 63 68 61 72 61 63 74 65 72 73 20 74 68  re characters th
d680: 61 6e 20 74 68 65 20 69 6e 70 75 74 2e 0a 2a 2a  an the input..**
d690: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
d6a0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
d6b0: 74 72 69 6e 67 20 63 6f 6d 65 73 20 66 72 6f 6d  tring comes from
d6c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
d6d0: 29 20 61 6e 64 0a 2a 2a 20 73 68 6f 75 6c 64 20  ) and.** should 
d6e0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
d6f0: 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
d700: 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  c unsigned char 
d710: 2a 74 72 61 6e 73 6c 69 74 65 72 61 74 65 28 63  *transliterate(c
d720: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
d730: 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *zIn, int nIn
d740: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
d750: 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
d760: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e  e3_malloc64( nIn
d770: 2a 34 20 2b 20 31 20 29 3b 0a 20 20 69 6e 74 20  *4 + 1 );.  int 
d780: 63 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20 20 69  c, sz, nOut;.  i
d790: 66 28 20 7a 4f 75 74 3d 3d 30 20 29 20 72 65 74  f( zOut==0 ) ret
d7a0: 75 72 6e 20 30 3b 0a 20 20 6e 4f 75 74 20 3d 20  urn 0;.  nOut = 
d7b0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 6e 49 6e 3e  0;.  while( nIn>
d7c0: 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 75 74 66  0 ){.    c = utf
d7d0: 38 52 65 61 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20  8Read(zIn, nIn, 
d7e0: 26 73 7a 29 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d  &sz);.    zIn +=
d7f0: 20 73 7a 3b 0a 20 20 20 20 6e 49 6e 20 2d 3d 20   sz;.    nIn -= 
d800: 73 7a 3b 0a 20 20 20 20 69 66 28 20 63 3c 3d 31  sz;.    if( c<=1
d810: 32 37 20 29 7b 0a 20 20 20 20 20 20 7a 4f 75 74  27 ){.      zOut
d820: 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 28 75 6e 73 69  [nOut++] = (unsi
d830: 67 6e 65 64 20 63 68 61 72 29 63 3b 0a 20 20 20  gned char)c;.   
d840: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
d850: 74 20 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b  t xTop, xBtm, x;
d860: 0a 20 20 20 20 20 20 78 54 6f 70 20 3d 20 73 69  .      xTop = si
d870: 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f 73  zeof(translit)/s
d880: 69 7a 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30  izeof(translit[0
d890: 5d 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 78 42  ]) - 1;.      xB
d8a0: 74 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  tm = 0;.      wh
d8b0: 69 6c 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20  ile( xTop>=xBtm 
d8c0: 29 7b 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28  ){.        x = (
d8d0: 78 54 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a  xTop + xBtm)/2;.
d8e0: 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61 6e          if( tran
d8f0: 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63  slit[x].cFrom==c
d900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f   ){.          zO
d910: 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61  ut[nOut++] = tra
d920: 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 30 3b 0a 20  nslit[x].cTo0;. 
d930: 20 20 20 20 20 20 20 20 20 69 66 28 20 74 72 61           if( tra
d940: 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 20 29 7b  nslit[x].cTo1 ){
d950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75  .            zOu
d960: 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 74 72 61 6e  t[nOut++] = tran
d970: 73 6c 69 74 5b 78 5d 2e 63 54 6f 31 3b 0a 20 20  slit[x].cTo1;.  
d980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d990: 20 61 6e 20 65 78 74 72 61 20 22 63 68 22 20 61   an extra "ch" a
d9a0: 66 74 65 72 20 74 68 65 20 22 73 68 22 20 66 6f  fter the "sh" fo
d9b0: 72 20 d0 a9 20 61 6e 64 20 d1 89 20 2a 2f 0a 20  r .. and .. */. 
d9c0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
d9d0: 3d 3d 30 78 30 34 32 39 20 7c 7c 20 63 3d 3d 20  ==0x0429 || c== 
d9e0: 30 78 30 34 34 39 20 29 7b 0a 20 20 20 20 20 20  0x0449 ){.      
d9f0: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e 4f 75          zOut[nOu
da00: 74 2b 2b 5d 20 3d 20 27 63 27 3b 0a 20 20 20 20  t++] = 'c';.    
da10: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6e            zOut[n
da20: 4f 75 74 2b 2b 5d 20 3d 20 27 68 27 3b 0a 20 20  Out++] = 'h';.  
da30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
da40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
da50: 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
da60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
da70: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 72 61 6e    }else if( tran
da80: 73 6c 69 74 5b 78 5d 2e 63 46 72 6f 6d 3e 63 20  slit[x].cFrom>c 
da90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 54 6f  ){.          xTo
daa0: 70 20 3d 20 78 2d 31 3b 0a 20 20 20 20 20 20 20  p = x-1;.       
dab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dac0: 20 20 78 42 74 6d 20 3d 20 78 2b 31 3b 0a 20 20    xBtm = x+1;.  
dad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dae0: 20 20 20 20 20 20 69 66 28 20 63 20 29 20 7a 4f        if( c ) zO
daf0: 75 74 5b 6e 4f 75 74 2b 2b 5d 20 3d 20 27 3f 27  ut[nOut++] = '?'
db00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 4f  ;.    }.  }.  zO
db10: 75 74 5b 6e 4f 75 74 5d 20 3d 20 30 3b 0a 20 20  ut[nOut] = 0;.  
db20: 72 65 74 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a  return zOut;.}..
db30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
db40: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
db50: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 68 6f  cters in the sho
db60: 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rtest prefix of 
db70: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74 72  the input.** str
db80: 69 6e 67 20 74 68 61 74 20 74 72 61 6e 73 6c 69  ing that transli
db90: 74 65 72 61 74 65 73 20 74 6f 20 61 6e 20 41 53  terates to an AS
dba0: 43 49 49 20 73 74 72 69 6e 67 20 6e 54 72 61 6e  CII string nTran
dbb0: 73 20 62 79 74 65 73 20 6f 72 20 6c 6f 6e 67 65  s bytes or longe
dbc0: 72 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  r..** Or, if the
dbd0: 20 74 72 61 6e 73 6c 69 74 65 72 61 74 69 6f 6e   transliteration
dbe0: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 73 74   of the input st
dbf0: 72 69 6e 67 20 69 73 20 6c 65 73 73 20 74 68 61  ring is less tha
dc00: 6e 20 6e 54 72 61 6e 73 0a 2a 2a 20 62 79 74 65  n nTrans.** byte
dc10: 73 20 69 6e 20 73 69 7a 65 2c 20 72 65 74 75 72  s in size, retur
dc20: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
dc30: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
dc40: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a  e input string..
dc50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
dc60: 61 6e 73 6c 65 6e 5f 74 6f 5f 63 68 61 72 6c 65  anslen_to_charle
dc70: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  n(const char *zI
dc80: 6e 2c 20 69 6e 74 20 6e 49 6e 2c 20 69 6e 74 20  n, int nIn, int 
dc90: 6e 54 72 61 6e 73 29 7b 0a 20 20 69 6e 74 20 69  nTrans){.  int i
dca0: 2c 20 63 2c 20 73 7a 2c 20 6e 4f 75 74 3b 0a 20  , c, sz, nOut;. 
dcb0: 20 69 6e 74 20 6e 43 68 61 72 3b 0a 0a 20 20 69   int nChar;..  i
dcc0: 20 3d 20 6e 4f 75 74 20 3d 20 30 3b 0a 20 20 66   = nOut = 0;.  f
dcd0: 6f 72 28 6e 43 68 61 72 3d 30 3b 20 69 3c 6e 49  or(nChar=0; i<nI
dce0: 6e 20 26 26 20 6e 4f 75 74 3c 6e 54 72 61 6e 73  n && nOut<nTrans
dcf0: 3b 20 6e 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; nChar++){.    
dd00: 63 20 3d 20 75 74 66 38 52 65 61 64 28 28 63 6f  c = utf8Read((co
dd10: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
dd20: 72 20 2a 29 26 7a 49 6e 5b 69 5d 2c 20 6e 49 6e  r *)&zIn[i], nIn
dd30: 2d 69 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 20  -i, &sz);.    i 
dd40: 2b 3d 20 73 7a 3b 0a 0a 20 20 20 20 6e 4f 75 74  += sz;..    nOut
dd50: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 63 3e 3d 31  ++;.    if( c>=1
dd60: 32 38 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  28 ){.      int 
dd70: 78 54 6f 70 2c 20 78 42 74 6d 2c 20 78 3b 0a 20  xTop, xBtm, x;. 
dd80: 20 20 20 20 20 78 54 6f 70 20 3d 20 73 69 7a 65       xTop = size
dd90: 6f 66 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a  of(translit)/siz
dda0: 65 6f 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29  eof(translit[0])
ddb0: 20 2d 20 31 3b 0a 20 20 20 20 20 20 78 42 74 6d   - 1;.      xBtm
ddc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 0;.      whil
ddd0: 65 28 20 78 54 6f 70 3e 3d 78 42 74 6d 20 29 7b  e( xTop>=xBtm ){
dde0: 0a 20 20 20 20 20 20 20 20 78 20 3d 20 28 78 54  .        x = (xT
ddf0: 6f 70 20 2b 20 78 42 74 6d 29 2f 32 3b 0a 20 20  op + xBtm)/2;.  
de00: 20 20 20 20 20 20 69 66 28 20 74 72 61 6e 73 6c        if( transl
de10: 69 74 5b 78 5d 2e 63 46 72 6f 6d 3d 3d 63 20 29  it[x].cFrom==c )
de20: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
de30: 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 54 6f 31  translit[x].cTo1
de40: 20 29 20 6e 4f 75 74 2b 2b 3b 0a 20 20 20 20 20   ) nOut++;.     
de50: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 78 30 34       if( c==0x04
de60: 32 39 20 7c 7c 20 63 3d 3d 20 30 78 30 34 34 39  29 || c== 0x0449
de70: 20 29 20 6e 4f 75 74 20 2b 3d 20 32 3b 0a 20 20   ) nOut += 2;.  
de80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
de90: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
dea0: 20 74 72 61 6e 73 6c 69 74 5b 78 5d 2e 63 46 72   translit[x].cFr
deb0: 6f 6d 3e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  om>c ){.        
dec0: 20 20 78 54 6f 70 20 3d 20 78 2d 31 3b 0a 20 20    xTop = x-1;.  
ded0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
dee0: 20 20 20 20 20 20 20 78 42 74 6d 20 3d 20 78 2b         xBtm = x+
def0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
df00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
df10: 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a    return nChar;.
df20: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 73 70 65  }.../*.**    spe
df30: 6c 6c 66 69 78 31 5f 74 72 61 6e 73 6c 69 74 28  llfix1_translit(
df40: 58 29 0a 2a 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  X).**.** Convert
df50: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
df60: 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 41 53 43 49  ontains non-ASCI
df70: 49 20 52 6f 6d 61 6e 20 63 68 61 72 61 63 74 65  I Roman characte
df80: 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 70 75 72 65  rs into .** pure
df90: 20 41 53 43 49 49 2e 0a 2a 2f 0a 73 74 61 74 69   ASCII..*/.stati
dfa0: 63 20 76 6f 69 64 20 74 72 61 6e 73 6c 69 74 65  c void translite
dfb0: 72 61 74 65 53 71 6c 46 75 6e 63 28 0a 20 20 73  rateSqlFunc(.  s
dfc0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
dfd0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
dfe0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
dff0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
e000: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
e010: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 73 71 6c 69  char *zIn = sqli
e020: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
e030: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e  rgv[0]);.  int n
e040: 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
e050: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
e060: 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  );.  unsigned ch
e070: 61 72 20 2a 7a 4f 75 74 20 3d 20 74 72 61 6e 73  ar *zOut = trans
e080: 6c 69 74 65 72 61 74 65 28 7a 49 6e 2c 20 6e 49  literate(zIn, nI
e090: 6e 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d  n);.  if( zOut==
e0a0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
e0b0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
e0c0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
e0d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e0e0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
e0f0: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 7a  ontext, (char*)z
e100: 4f 75 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  Out, -1, sqlite3
e110: 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _free);.  }.}../
e120: 2a 0a 2a 2a 20 20 20 20 73 70 65 6c 6c 66 69 78  *.**    spellfix
e130: 31 5f 73 63 72 69 70 74 63 6f 64 65 28 58 29 0a  1_scriptcode(X).
e140: 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 74  **.** Try to det
e150: 65 72 6d 69 6e 65 20 74 68 65 20 64 6f 6d 69 6e  ermine the domin
e160: 61 6e 74 20 73 63 72 69 70 74 20 75 73 65 64 20  ant script used 
e170: 62 79 20 74 68 65 20 77 6f 72 64 20 58 20 61 6e  by the word X an
e180: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 69 74 73 20  d return.** its 
e190: 49 53 4f 20 31 35 39 32 34 20 6e 75 6d 65 72 69  ISO 15924 numeri
e1a0: 63 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  c code..**.** Th
e1b0: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
e1c0: 65 6e 74 61 74 69 6f 6e 20 6f 6e 6c 79 20 75 6e  entation only un
e1d0: 64 65 72 73 74 61 6e 64 73 20 74 68 65 20 66 6f  derstands the fo
e1e0: 6c 6c 6f 77 69 6e 67 20 73 63 72 69 70 74 73 3a  llowing scripts:
e1f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 32 31 35 20 20 28  .**.**    215  (
e200: 4c 61 74 69 6e 29 0a 2a 2a 20 20 20 20 32 32 30  Latin).**    220
e210: 20 20 28 43 79 72 69 6c 6c 69 63 29 0a 2a 2a 20    (Cyrillic).** 
e220: 20 20 20 32 30 30 20 20 28 47 72 65 65 6b 29 0a     200  (Greek).
e230: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
e240: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 39  ne will return 9
e250: 39 38 20 69 66 20 74 68 65 20 69 6e 70 75 74 20  98 if the input 
e260: 58 20 63 6f 6e 74 61 69 6e 73 20 63 68 61 72 61  X contains chara
e270: 63 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 77  cters from.** tw
e280: 6f 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  o or more of the
e290: 20 61 62 6f 76 65 20 73 63 72 69 70 74 73 20 6f   above scripts o
e2a0: 72 20 39 39 39 20 69 66 20 58 20 63 6f 6e 74 61  r 999 if X conta
e2b0: 69 6e 73 20 6e 6f 20 63 68 61 72 61 63 74 65 72  ins no character
e2c0: 73 0a 2a 2a 20 66 72 6f 6d 20 61 6e 79 20 6f 66  s.** from any of
e2d0: 20 74 68 65 20 61 62 6f 76 65 20 73 63 72 69 70   the above scrip
e2e0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
e2f0: 69 64 20 73 63 72 69 70 74 43 6f 64 65 53 71 6c  id scriptCodeSql
e300: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
e310: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
e320: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
e330: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
e340: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
e350: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
e360: 49 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  In = sqlite3_val
e370: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
e380: 3b 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 73 71  ;.  int nIn = sq
e390: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
e3a0: 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  s(argv[0]);.  in
e3b0: 74 20 63 2c 20 73 7a 3b 0a 20 20 69 6e 74 20 73  t c, sz;.  int s
e3c0: 63 72 69 70 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  criptMask = 0;. 
e3d0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20   int res;.  int 
e3e0: 73 65 65 6e 44 69 67 69 74 20 3d 20 30 3b 0a 23  seenDigit = 0;.#
e3f0: 20 64 65 66 69 6e 65 20 53 43 52 49 50 54 5f 4c   define SCRIPT_L
e400: 41 54 49 4e 20 20 20 20 20 20 20 30 78 30 30 30  ATIN       0x000
e410: 31 0a 23 20 64 65 66 69 6e 65 20 53 43 52 49 50  1.# define SCRIP
e420: 54 5f 43 59 52 49 4c 4c 49 43 20 20 20 20 30 78  T_CYRILLIC    0x
e430: 30 30 30 32 0a 23 20 64 65 66 69 6e 65 20 53 43  0002.# define SC
e440: 52 49 50 54 5f 47 52 45 45 4b 20 20 20 20 20 20  RIPT_GREEK      
e450: 20 30 78 30 30 30 34 0a 23 20 64 65 66 69 6e 65   0x0004.# define
e460: 20 53 43 52 49 50 54 5f 48 45 42 52 45 57 20 20   SCRIPT_HEBREW  
e470: 20 20 20 20 30 78 30 30 30 38 0a 23 20 64 65 66      0x0008.# def
e480: 69 6e 65 20 53 43 52 49 50 54 5f 41 52 41 42 49  ine SCRIPT_ARABI
e490: 43 20 20 20 20 20 20 30 78 30 30 31 30 0a 0a 20  C      0x0010.. 
e4a0: 20 77 68 69 6c 65 28 20 6e 49 6e 3e 30 20 29 7b   while( nIn>0 ){
e4b0: 0a 20 20 20 20 63 20 3d 20 75 74 66 38 52 65 61  .    c = utf8Rea
e4c0: 64 28 7a 49 6e 2c 20 6e 49 6e 2c 20 26 73 7a 29  d(zIn, nIn, &sz)
e4d0: 3b 0a 20 20 20 20 7a 49 6e 20 2b 3d 20 73 7a 3b  ;.    zIn += sz;
e4e0: 0a 20 20 20 20 6e 49 6e 20 2d 3d 20 73 7a 3b 0a  .    nIn -= sz;.
e4f0: 20 20 20 20 69 66 28 20 63 3c 30 78 30 32 61 66      if( c<0x02af
e500: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3e   ){.      if( c>
e510: 3d 30 78 38 30 20 7c 7c 20 6d 69 64 43 6c 61 73  =0x80 || midClas
e520: 73 5b 63 26 30 78 37 66 5d 3c 43 43 4c 41 53 53  s[c&0x7f]<CCLASS
e530: 5f 44 49 47 49 54 20 29 7b 0a 20 20 20 20 20 20  _DIGIT ){.      
e540: 20 20 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20    scriptMask |= 
e550: 53 43 52 49 50 54 5f 4c 41 54 49 4e 3b 0a 20 20  SCRIPT_LATIN;.  
e560: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e      }else if( c>
e570: 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29  ='0' && c<='9' )
e580: 7b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 44 69  {.        seenDi
e590: 67 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  git = 1;.      }
e5a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
e5b0: 3e 3d 30 78 30 34 30 30 20 26 26 20 63 3c 3d 30  >=0x0400 && c<=0
e5c0: 78 30 34 66 66 20 29 7b 0a 20 20 20 20 20 20 73  x04ff ){.      s
e5d0: 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52  criptMask |= SCR
e5e0: 49 50 54 5f 43 59 52 49 4c 4c 49 43 3b 0a 20 20  IPT_CYRILLIC;.  
e5f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 30    }else if( c>=0
e600: 78 30 33 38 36 20 26 26 20 63 3c 3d 30 78 30 33  x0386 && c<=0x03
e610: 63 65 20 29 7b 0a 20 20 20 20 20 20 73 63 72 69  ce ){.      scri
e620: 70 74 4d 61 73 6b 20 7c 3d 20 53 43 52 49 50 54  ptMask |= SCRIPT
e630: 5f 47 52 45 45 4b 3b 0a 20 20 20 20 7d 65 6c 73  _GREEK;.    }els
e640: 65 20 69 66 28 20 63 3e 3d 30 78 30 35 39 30 20  e if( c>=0x0590 
e650: 26 26 20 63 3c 3d 30 78 30 35 66 66 20 29 7b 0a  && c<=0x05ff ){.
e660: 20 20 20 20 20 20 73 63 72 69 70 74 4d 61 73 6b        scriptMask
e670: 20 7c 3d 20 53 43 52 49 50 54 5f 48 45 42 52 45   |= SCRIPT_HEBRE
e680: 57 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  W;.    }else if(
e690: 20 63 3e 3d 30 78 30 36 30 30 20 26 26 20 63 3c   c>=0x0600 && c<
e6a0: 3d 30 78 30 36 66 66 20 29 7b 0a 20 20 20 20 20  =0x06ff ){.     
e6b0: 20 73 63 72 69 70 74 4d 61 73 6b 20 7c 3d 20 53   scriptMask |= S
e6c0: 43 52 49 50 54 5f 41 52 41 42 49 43 3b 0a 20 20  CRIPT_ARABIC;.  
e6d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 63    }.  }.  if( sc
e6e0: 72 69 70 74 4d 61 73 6b 3d 3d 30 20 26 26 20 73  riptMask==0 && s
e6f0: 65 65 6e 44 69 67 69 74 20 29 20 73 63 72 69 70  eenDigit ) scrip
e700: 74 4d 61 73 6b 20 3d 20 53 43 52 49 50 54 5f 4c  tMask = SCRIPT_L
e710: 41 54 49 4e 3b 0a 20 20 73 77 69 74 63 68 28 20  ATIN;.  switch( 
e720: 73 63 72 69 70 74 4d 61 73 6b 20 29 7b 0a 20 20  scriptMask ){.  
e730: 20 20 63 61 73 65 20 30 3a 20 20 20 20 20 20 20    case 0:       
e740: 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 39           res = 9
e750: 39 39 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  99; break;.    c
e760: 61 73 65 20 53 43 52 49 50 54 5f 4c 41 54 49 4e  ase SCRIPT_LATIN
e770: 3a 20 20 20 20 20 72 65 73 20 3d 20 32 31 35 3b  :     res = 215;
e780: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
e790: 20 53 43 52 49 50 54 5f 43 59 52 49 4c 4c 49 43   SCRIPT_CYRILLIC
e7a0: 3a 20 20 72 65 73 20 3d 20 32 32 30 3b 20 62 72  :  res = 220; br
e7b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 43  eak;.    case SC
e7c0: 52 49 50 54 5f 47 52 45 45 4b 3a 20 20 20 20 20  RIPT_GREEK:     
e7d0: 72 65 73 20 3d 20 32 30 30 3b 20 62 72 65 61 6b  res = 200; break
e7e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 43 52 49 50  ;.    case SCRIP
e7f0: 54 5f 48 45 42 52 45 57 3a 20 20 20 20 72 65 73  T_HEBREW:    res
e800: 20 3d 20 31 32 35 3b 20 62 72 65 61 6b 3b 0a 20   = 125; break;. 
e810: 20 20 20 63 61 73 65 20 53 43 52 49 50 54 5f 41     case SCRIPT_A
e820: 52 41 42 49 43 3a 20 20 20 20 72 65 73 20 3d 20  RABIC:    res = 
e830: 31 36 30 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  160; break;.    
e840: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
e850: 20 20 20 20 20 20 20 72 65 73 20 3d 20 39 39 38         res = 998
e860: 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73  ; break;.  }.  s
e870: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
e880: 74 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 29 3b  t(context, res);
e890: 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 74 72 61 6e 73  .}../* End trans
e8a0: 6c 69 74 65 72 61 74 65 0a 2a 2a 2a 2a 2a 2a 2a  literate.*******
e8b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8f0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
e900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e940: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 67 69 6e 20  ******.** Begin 
e950: 73 70 65 6c 6c 66 69 78 31 20 76 69 72 74 75 61  spellfix1 virtua
e960: 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 20  l table..*/../* 
e970: 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f  Maximum length o
e980: 66 20 61 20 70 68 6f 6e 65 68 61 73 68 20 75 73  f a phonehash us
e990: 65 64 20 66 6f 72 20 71 75 65 72 79 69 6e 67 20  ed for querying 
e9a0: 74 68 65 20 73 68 61 64 6f 77 20 74 61 62 6c 65  the shadow table
e9b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 45 4c   */.#define SPEL
e9c0: 4c 46 49 58 5f 4d 58 5f 48 41 53 48 20 20 33 32  LFIX_MX_HASH  32
e9d0: 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  ../* Maximum num
e9e0: 62 65 72 20 6f 66 20 68 61 73 68 20 73 74 72 69  ber of hash stri
e9f0: 6e 67 73 20 74 6f 20 65 78 61 6d 69 6e 65 20 70  ngs to examine p
ea00: 65 72 20 71 75 65 72 79 20 2a 2f 0a 23 64 65 66  er query */.#def
ea10: 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  ine SPELLFIX_MX_
ea20: 52 55 4e 20 20 20 31 0a 0a 74 79 70 65 64 65 66  RUN   1..typedef
ea30: 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78   struct spellfix
ea40: 31 5f 76 74 61 62 20 73 70 65 6c 6c 66 69 78 31  1_vtab spellfix1
ea50: 5f 76 74 61 62 3b 0a 74 79 70 65 64 65 66 20 73  _vtab;.typedef s
ea60: 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f  truct spellfix1_
ea70: 63 75 72 73 6f 72 20 73 70 65 6c 6c 66 69 78 31  cursor spellfix1
ea80: 5f 63 75 72 73 6f 72 3b 0a 0a 2f 2a 20 46 75 7a  _cursor;../* Fuz
ea90: 7a 79 2d 73 65 61 72 63 68 20 76 69 72 74 75 61  zy-search virtua
eaa0: 6c 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 2a  l table object *
eab0: 2f 0a 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69  /.struct spellfi
eac0: 78 31 5f 76 74 61 62 20 7b 0a 20 20 73 71 6c 69  x1_vtab {.  sqli
ead0: 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 20 20  te3_vtab base;  
eae0: 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63         /* Base c
eaf0: 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66  lass - must be f
eb00: 69 72 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  irst */.  sqlite
eb10: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
eb20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
eb30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
eb40: 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 20   char *zDbName; 
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
eb60: 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ame of database 
eb70: 68 6f 6c 64 69 6e 67 20 74 68 69 73 20 74 61 62  holding this tab
eb80: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  le */.  char *zT
eb90: 61 62 6c 65 4e 61 6d 65 3b 20 20 20 20 20 20 20  ableName;       
eba0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
ebb0: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
ebc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 73 74  */.  char *zCost
ebd0: 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
ebe0: 2f 2a 20 54 61 62 6c 65 20 68 6f 6c 64 69 6e 67  /* Table holding
ebf0: 20 65 64 69 74 2d 64 69 73 74 61 6e 63 65 20 63   edit-distance c
ec00: 6f 73 74 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20  ost numbers */. 
ec10: 20 45 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67   EditDist3Config
ec20: 20 2a 70 43 6f 6e 66 69 67 33 3b 20 2f 2a 20 50   *pConfig3; /* P
ec30: 61 72 73 65 64 20 65 64 69 74 20 64 69 73 74 61  arsed edit dista
ec40: 6e 63 65 20 63 6f 73 74 73 20 2a 2f 0a 7d 3b 0a  nce costs */.};.
ec50: 0a 2f 2a 20 46 75 7a 7a 79 2d 73 65 61 72 63 68  ./* Fuzzy-search
ec60: 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a   cursor object *
ec70: 2f 0a 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69  /.struct spellfi
ec80: 78 31 5f 63 75 72 73 6f 72 20 7b 0a 20 20 73 71  x1_cursor {.  sq
ec90: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
eca0: 72 20 62 61 73 65 3b 20 20 20 20 2f 2a 20 42 61  r base;    /* Ba
ecb0: 73 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20  se class - must 
ecc0: 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 73 70  be first */.  sp
ecd0: 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 56  ellfix1_vtab *pV
ece0: 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Tab;       /* Th
ecf0: 65 20 74 61 62 6c 65 20 74 6f 20 77 68 69 63 68  e table to which
ed00: 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
ed10: 6f 6e 67 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ongs */.  char *
ed20: 7a 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20 20  zPattern;       
ed30: 20 20 20 20 20 20 20 2f 2a 20 72 68 73 20 6f 66         /* rhs of
ed40: 20 4d 41 54 43 48 20 63 6c 61 75 73 65 20 2a 2f   MATCH clause */
ed50: 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 3b 20 20  .  int idxNum;  
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 2f 2a 20 69 64 78 4e 75 6d 20 76 61 6c 75 65 20  /* idxNum value 
ed80: 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65  passed to xFilte
ed90: 72 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  r() */.  int nRo
eda0: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
edb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
edc0: 6f 66 20 72 6f 77 73 20 6f 66 20 63 6f 6e 74 65  of rows of conte
edd0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  nt */.  int nAll
ede0: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oc;             
edf0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ee00: 66 20 61 6c 6c 6f 63 61 74 65 64 20 72 6f 77 73  f allocated rows
ee10: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 3b 20   */.  int iRow; 
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f     /* Current ro
ee40: 77 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  w of content */.
ee50: 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20 20 20    int iLang;    
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee70: 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6c  * Value of the l
ee80: 61 6e 67 69 64 3d 20 63 6f 6e 73 74 72 61 69 6e  angid= constrain
ee90: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 70 3b  t */.  int iTop;
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
eec0: 74 68 65 20 74 6f 70 3d 20 63 6f 6e 73 74 72 61  the top= constra
eed0: 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 63  int */.  int iSc
eee0: 6f 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ope;            
eef0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
ef00: 66 20 74 68 65 20 73 63 6f 70 65 3d 20 63 6f 6e  f the scope= con
ef10: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74  straint */.  int
ef20: 20 6e 53 65 61 72 63 68 3b 20 20 20 20 20 20 20   nSearch;       
ef30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ef40: 62 65 72 20 6f 66 20 76 6f 63 61 62 75 6c 61 72  ber of vocabular
ef50: 79 20 69 74 65 6d 73 20 63 68 65 63 6b 65 64 20  y items checked 
ef60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
ef70: 74 20 2a 70 46 75 6c 6c 53 63 61 6e 3b 20 20 20  t *pFullScan;   
ef80: 20 20 2f 2a 20 53 68 61 64 6f 77 20 71 75 65 72    /* Shadow quer
ef90: 79 20 66 6f 72 20 61 20 66 75 6c 6c 20 74 61 62  y for a full tab
efa0: 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 73 74 72  le scan */.  str
efb0: 75 63 74 20 73 70 65 6c 6c 66 69 78 31 5f 72 6f  uct spellfix1_ro
efc0: 77 20 7b 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  w {       /* For
efd0: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 63 6f 6e   each row of con
efe0: 74 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  tent */.    sqli
eff0: 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
f000: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  ;         /* Row
f010: 69 64 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20  id for this row 
f020: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 57 6f  */.    char *zWo
f030: 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
f040: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 66 6f 72       /* Text for
f050: 20 74 68 69 73 20 72 6f 77 20 2a 2f 0a 20 20 20   this row */.   
f060: 20 69 6e 74 20 69 52 61 6e 6b 3b 20 20 20 20 20   int iRank;     
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f080: 2a 20 52 61 6e 6b 20 66 6f 72 20 74 68 69 73 20  * Rank for this 
f090: 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  row */.    int i
f0a0: 44 69 73 74 61 6e 63 65 3b 20 20 20 20 20 20 20  Distance;       
f0b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 74           /* Dist
f0c0: 61 6e 63 65 20 66 72 6f 6d 20 70 61 74 74 65 72  ance from patter
f0d0: 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 77 20 2a  n for this row *
f0e0: 2f 0a 20 20 20 20 69 6e 74 20 69 53 63 6f 72 65  /.    int iScore
f0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f100: 20 20 20 20 2f 2a 20 53 63 6f 72 65 20 66 6f 72      /* Score for
f110: 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 20 20   sorting */.    
f120: 69 6e 74 20 69 4d 61 74 63 68 6c 65 6e 3b 20 20  int iMatchlen;  
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f140: 20 56 61 6c 75 65 20 6f 66 20 6d 61 74 63 68 6c   Value of matchl
f150: 65 6e 20 63 6f 6c 75 6d 6e 20 28 6f 72 20 2d 31  en column (or -1
f160: 29 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 48  ) */.    char zH
f170: 61 73 68 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  ash[SPELLFIX_MX_
f180: 48 41 53 48 5d 3b 20 2f 2a 20 74 68 65 20 70 68  HASH]; /* the ph
f190: 6f 6e 65 68 61 73 68 20 75 73 65 64 20 66 6f 72  onehash used for
f1a0: 20 74 68 69 73 20 6d 61 74 63 68 20 2a 2f 0a 20   this match */. 
f1b0: 20 7d 20 2a 61 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a   } *a; .};../*.*
f1c0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 6f 6e 65 20  * Construct one 
f1d0: 6f 72 20 6d 6f 72 65 20 53 51 4c 20 73 74 61 74  or more SQL stat
f1e0: 65 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  ements from the 
f1f0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 67 69  format string gi
f200: 76 65 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20  ven.** and then 
f210: 65 76 61 6c 75 61 74 65 20 74 68 6f 73 65 20 73  evaluate those s
f220: 74 61 74 65 6d 65 6e 74 73 2e 20 54 68 65 20 73  tatements. The s
f230: 75 63 63 65 73 73 20 63 6f 64 65 20 69 73 20 77  uccess code is w
f240: 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
f250: 70 52 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  pRc..**.** If *p
f260: 52 63 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  Rc is initially 
f270: 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68  non-zero then th
f280: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
f290: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f2a0: 20 76 6f 69 64 20 73 70 65 6c 6c 66 69 78 31 44   void spellfix1D
f2b0: 62 45 78 65 63 28 0a 20 20 69 6e 74 20 2a 70 52  bExec(.  int *pR
f2c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f2d0: 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
f2e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
f2f0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
f300: 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 68  atabase in which
f310: 20 74 6f 20 72 75 6e 20 53 51 4c 20 2a 2f 0a 20   to run SQL */. 
f320: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
f330: 72 6d 61 74 2c 20 20 20 2f 2a 20 46 6f 72 6d 61  rmat,   /* Forma
f340: 74 20 73 74 72 69 6e 67 20 66 6f 72 20 53 51 4c  t string for SQL
f350: 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20   */.  ...       
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f370: 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65  Arguments to the
f380: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 2a   format string *
f390: 2f 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  /.){.  va_list a
f3a0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
f3b0: 0a 20 20 69 66 28 20 2a 70 52 63 20 29 20 72 65  .  if( *pRc ) re
f3c0: 74 75 72 6e 3b 0a 20 20 76 61 5f 73 74 61 72 74  turn;.  va_start
f3d0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
f3e0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
f3f0: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
f400: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
f410: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
f420: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  =0 ){.    *pRc =
f430: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 63   }else{.    *pRc
f450: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
f460: 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
f470: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
f480: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
f490: 7d 0a 0a 2f 2a 0a 2a 2a 20 78 44 69 73 63 6f 6e  }../*.** xDiscon
f4a0: 6e 65 63 74 2f 78 44 65 73 74 72 6f 79 20 6d 65  nect/xDestroy me
f4b0: 74 68 6f 64 20 66 6f 72 20 74 68 65 20 66 75 7a  thod for the fuz
f4c0: 7a 79 2d 73 65 61 72 63 68 20 6d 6f 64 75 6c 65  zy-search module
f4d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f4e0: 73 70 65 6c 6c 66 69 78 31 55 6e 69 6e 69 74 28  spellfix1Uninit(
f4f0: 69 6e 74 20 69 73 44 65 73 74 72 6f 79 2c 20 73  int isDestroy, s
f500: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 54  qlite3_vtab *pVT
f510: 61 62 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  ab){.  spellfix1
f520: 5f 76 74 61 62 20 2a 70 20 3d 20 28 73 70 65 6c  _vtab *p = (spel
f530: 6c 66 69 78 31 5f 76 74 61 62 2a 29 70 56 54 61  lfix1_vtab*)pVTa
f540: 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
f550: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
f560: 73 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  sDestroy ){.    
f570: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
f580: 3e 64 62 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69  >db;.    spellfi
f590: 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64 62  x1DbExec(&rc, db
f5a0: 2c 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46  , "DROP TABLE IF
f5b0: 20 45 58 49 53 54 53 20 5c 22 25 77 5c 22 2e 5c   EXISTS \"%w\".\
f5c0: 22 25 77 5f 76 6f 63 61 62 5c 22 22 2c 0a 20 20  "%w_vocab\"",.  
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a  p->zDbName, p->z
f5f0: 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20 20 7d 0a  TableName);.  }.
f600: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f610: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
f620: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 61 62 6c  e3_free(p->zTabl
f630: 65 4e 61 6d 65 29 3b 0a 20 20 20 20 65 64 69 74  eName);.    edit
f640: 44 69 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74  Dist3ConfigDelet
f650: 65 28 70 2d 3e 70 43 6f 6e 66 69 67 33 29 3b 0a  e(p->pConfig3);.
f660: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f670: 28 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 29 3b  (p->zCostTable);
f680: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
f690: 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
f6a0: 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
f6b0: 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 44 69 73  int spellfix1Dis
f6c0: 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
f6d0: 76 74 61 62 20 2a 70 56 54 61 62 29 7b 0a 20 20  vtab *pVTab){.  
f6e0: 72 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31  return spellfix1
f6f0: 55 6e 69 6e 69 74 28 30 2c 20 70 56 54 61 62 29  Uninit(0, pVTab)
f700: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
f710: 70 65 6c 6c 66 69 78 31 44 65 73 74 72 6f 79 28  pellfix1Destroy(
f720: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
f730: 54 61 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Tab){.  return s
f740: 70 65 6c 6c 66 69 78 31 55 6e 69 6e 69 74 28 31  pellfix1Uninit(1
f750: 2c 20 70 56 54 61 62 29 3b 0a 7d 0a 0a 2f 2a 0a  , pVTab);.}../*.
f760: 2a 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ** Make a copy o
f770: 66 20 61 20 73 74 72 69 6e 67 2e 20 20 52 65 6d  f a string.  Rem
f780: 6f 76 65 20 6c 65 61 64 69 6e 67 20 61 6e 64 20  ove leading and 
f790: 74 72 61 69 6c 69 6e 67 20 77 68 69 74 65 73 70  trailing whitesp
f7a0: 61 63 65 0a 2a 2a 20 61 6e 64 20 64 65 71 75 6f  ace.** and dequo
f7b0: 74 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  te it..*/.static
f7c0: 20 63 68 61 72 20 2a 73 70 65 6c 6c 66 69 78 31   char *spellfix1
f7d0: 44 65 71 75 6f 74 65 28 63 6f 6e 73 74 20 63 68  Dequote(const ch
f7e0: 61 72 20 2a 7a 49 6e 29 7b 0a 20 20 63 68 61 72  ar *zIn){.  char
f7f0: 20 2a 7a 4f 75 74 3b 0a 20 20 69 6e 74 20 69 2c   *zOut;.  int i,
f800: 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   j;.  char c;.  
f810: 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 28  while( isspace((
f820: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 49  unsigned char)zI
f830: 6e 5b 30 5d 29 20 29 20 7a 49 6e 2b 2b 3b 0a 20  n[0]) ) zIn++;. 
f840: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
f850: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 49  mprintf("%s", zI
f860: 6e 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 3d 3d  n);.  if( zOut==
f870: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f880: 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  i = (int)strlen(
f890: 7a 4f 75 74 29 3b 0a 23 69 66 20 30 20 20 2f 2a  zOut);.#if 0  /*
f8a0: 20 54 68 65 20 70 61 72 73 65 72 20 77 69 6c 6c   The parser will
f8b0: 20 6e 65 76 65 72 20 6c 65 61 76 65 20 73 70 61   never leave spa
f8c0: 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 2a  ces at the end *
f8d0: 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26  /.  while( i>0 &
f8e0: 26 20 69 73 73 70 61 63 65 28 7a 4f 75 74 5b 69  & isspace(zOut[i
f8f0: 2d 31 5d 29 20 29 7b 20 69 2d 2d 3b 20 7d 0a 23  -1]) ){ i--; }.#
f900: 65 6e 64 69 66 0a 20 20 7a 4f 75 74 5b 69 5d 20  endif.  zOut[i] 
f910: 3d 20 30 3b 0a 20 20 63 20 3d 20 7a 4f 75 74 5b  = 0;.  c = zOut[
f920: 30 5d 3b 0a 20 20 69 66 28 20 63 3d 3d 27 5c 27  0];.  if( c=='\'
f930: 27 20 7c 7c 20 63 3d 3d 27 22 27 20 29 7b 0a 20  ' || c=='"' ){. 
f940: 20 20 20 66 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b     for(i=1, j=0;
f950: 20 41 4c 57 41 59 53 28 7a 4f 75 74 5b 69 5d 29   ALWAYS(zOut[i])
f960: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 4f  ; i++){.      zO
f970: 75 74 5b 6a 2b 2b 5d 20 3d 20 7a 4f 75 74 5b 69  ut[j++] = zOut[i
f980: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75  ];.      if( zOu
f990: 74 5b 69 5d 3d 3d 63 20 29 7b 0a 20 20 20 20 20  t[i]==c ){.     
f9a0: 20 20 20 69 66 28 20 7a 4f 75 74 5b 69 2b 31 5d     if( zOut[i+1]
f9b0: 3d 3d 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==c ){.         
f9c0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65   i++;.        }e
f9d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
f9e0: 4f 75 74 5b 6a 2d 31 5d 20 3d 20 30 3b 0a 20 20  Out[j-1] = 0;.  
f9f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fa00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fa10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
fa20: 75 72 6e 20 7a 4f 75 74 3b 0a 7d 0a 0a 0a 2f 2a  urn zOut;.}.../*
fa30: 0a 2a 2a 20 78 43 6f 6e 6e 65 63 74 2f 78 43 72  .** xConnect/xCr
fa40: 65 61 74 65 20 6d 65 74 68 6f 64 20 66 6f 72 20  eate method for 
fa50: 74 68 65 20 73 70 65 6c 6c 66 69 78 31 20 6d 6f  the spellfix1 mo
fa60: 64 75 6c 65 2e 20 41 72 67 75 6d 65 6e 74 73 20  dule. Arguments 
fa70: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67  are:.**.**   arg
fa80: 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65  v[0]   -> module
fa90: 20 6e 61 6d 65 20 20 28 22 73 70 65 6c 6c 66 69   name  ("spellfi
faa0: 78 31 22 29 0a 2a 2a 20 20 20 61 72 67 76 5b 31  x1").**   argv[1
fab0: 5d 20 20 20 2d 3e 20 64 61 74 61 62 61 73 65 20  ]   -> database 
fac0: 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67 76 5b 32  name.**   argv[2
fad0: 5d 20 20 20 2d 3e 20 74 61 62 6c 65 20 6e 61 6d  ]   -> table nam
fae0: 65 0a 2a 2a 20 20 20 61 72 67 76 5b 33 5d 2e 2e  e.**   argv[3]..
faf0: 20 2d 3e 20 6f 70 74 69 6f 6e 61 6c 20 61 72 67   -> optional arg
fb00: 75 6d 65 6e 74 73 20 28 69 2e 65 2e 20 22 65 64  uments (i.e. "ed
fb10: 69 74 5f 63 6f 73 74 5f 74 61 62 6c 65 22 20 70  it_cost_table" p
fb20: 61 72 61 6d 65 74 65 72 29 0a 2a 2f 0a 73 74 61  arameter).*/.sta
fb30: 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
fb40: 31 49 6e 69 74 28 0a 20 20 69 6e 74 20 69 73 43  1Init(.  int isC
fb50: 72 65 61 74 65 2c 0a 20 20 73 71 6c 69 74 65 33  reate,.  sqlite3
fb60: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41   *db,.  void *pA
fb70: 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  ux,.  int argc, 
fb80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
fb90: 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65  t*argv,.  sqlite
fba0: 33 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c  3_vtab **ppVTab,
fbb0: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
fbc0: 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 76  ){.  spellfix1_v
fbd0: 74 61 62 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  tab *pNew = 0;. 
fbe0: 20 2f 2a 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   /* const char *
fbf0: 7a 4d 6f 64 75 6c 65 20 3d 20 61 72 67 76 5b 30  zModule = argv[0
fc00: 5d 3b 20 2f 2f 20 6e 6f 74 20 75 73 65 64 20 2a  ]; // not used *
fc10: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
fc20: 7a 44 62 4e 61 6d 65 20 3d 20 61 72 67 76 5b 31  zDbName = argv[1
fc30: 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
fc40: 2a 7a 54 61 62 6c 65 4e 61 6d 65 20 3d 20 61 72  *zTableName = ar
fc50: 67 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 6e 44 62  gv[2];.  int nDb
fc60: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Name;.  int rc =
fc70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
fc80: 74 20 69 3b 0a 0a 20 20 6e 44 62 4e 61 6d 65 20  t i;..  nDbName 
fc90: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  = (int)strlen(zD
fca0: 62 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d  bName);.  pNew =
fcb0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
fcc0: 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  4( sizeof(*pNew)
fcd0: 20 2b 20 6e 44 62 4e 61 6d 65 20 2b 20 31 29 3b   + nDbName + 1);
fce0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
fcf0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
fd00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
fd10: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  {.    memset(pNe
fd20: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w, 0, sizeof(*pN
fd30: 65 77 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ew));.    pNew->
fd40: 7a 44 62 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a  zDbName = (char*
fd50: 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 20 20 6d  )&pNew[1];.    m
fd60: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 44 62 4e  emcpy(pNew->zDbN
fd70: 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 2c 20 6e 44  ame, zDbName, nD
fd80: 62 4e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 70 4e  bName+1);.    pN
fd90: 65 77 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 20 3d  ew->zTableName =
fda0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
fdb0: 28 22 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d  ("%s", zTableNam
fdc0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 64 62  e);.    pNew->db
fdd0: 20 3d 20 64 62 3b 0a 20 20 20 20 69 66 28 20 70   = db;.    if( p
fde0: 4e 65 77 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 3d  New->zTableName=
fdf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
fe00: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fe10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fe20: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63  rc = sqlite3_dec
fe30: 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 0a 20  lare_vtab(db, . 
fe40: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
fe50: 45 20 54 41 42 4c 45 20 78 28 77 6f 72 64 2c 72  E TABLE x(word,r
fe60: 61 6e 6b 2c 64 69 73 74 61 6e 63 65 2c 6c 61 6e  ank,distance,lan
fe70: 67 69 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  gid, ".         
fe80: 20 20 22 73 63 6f 72 65 2c 20 6d 61 74 63 68 6c    "score, matchl
fe90: 65 6e 2c 20 70 68 6f 6e 65 68 61 73 68 20 48 49  en, phonehash HI
fea0: 44 44 45 4e 2c 20 22 0a 20 20 20 20 20 20 20 20  DDEN, ".        
feb0: 20 20 20 22 74 6f 70 20 48 49 44 44 45 4e 2c 20     "top HIDDEN, 
fec0: 73 63 6f 70 65 20 48 49 44 44 45 4e 2c 20 73 72  scope HIDDEN, sr
fed0: 63 68 63 6e 74 20 48 49 44 44 45 4e 2c 20 22 0a  chcnt HIDDEN, ".
fee0: 20 20 20 20 20 20 20 20 20 20 20 22 73 6f 75 6e             "soun
fef0: 64 73 6c 69 6b 65 20 48 49 44 44 45 4e 2c 20 63  dslike HIDDEN, c
ff00: 6f 6d 6d 61 6e 64 20 48 49 44 44 45 4e 29 22 0a  ommand HIDDEN)".
ff10: 20 20 20 20 20 20 29 3b 0a 23 64 65 66 69 6e 65        );.#define
ff20: 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f   SPELLFIX_COL_WO
ff30: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 0a  RD            0.
ff40: 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58  #define SPELLFIX
ff50: 5f 43 4f 4c 5f 52 41 4e 4b 20 20 20 20 20 20 20  _COL_RANK       
ff60: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 53       1.#define S
ff70: 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 44 49 53 54  PELLFIX_COL_DIST
ff80: 41 4e 43 45 20 20 20 20 20 20 20 20 32 0a 23 64  ANCE        2.#d
ff90: 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43  efine SPELLFIX_C
ffa0: 4f 4c 5f 4c 41 4e 47 49 44 20 20 20 20 20 20 20  OL_LANGID       
ffb0: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 53 50 45     3.#define SPE
ffc0: 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 52 45 20  LLFIX_COL_SCORE 
ffd0: 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65 66            4.#def
ffe0: 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  ine SPELLFIX_COL
fff0: 5f 4d 41 54 43 48 4c 45 4e 20 20 20 20 20 20 20  _MATCHLEN       
10000 20 35 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c   5.#define SPELL
10010 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e 45 48 41 53  FIX_COL_PHONEHAS
10020 48 20 20 20 20 20 20 20 36 0a 23 64 65 66 69 6e  H       6.#defin
10030 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 54  e SPELLFIX_COL_T
10040 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20 37  OP             7
10050 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
10060 58 5f 43 4f 4c 5f 53 43 4f 50 45 20 20 20 20 20  X_COL_SCOPE     
10070 20 20 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20        8.#define 
10080 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52 43  SPELLFIX_COL_SRC
10090 48 43 4e 54 20 20 20 20 20 20 20 20 20 39 0a 23  HCNT         9.#
100a0 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f  define SPELLFIX_
100b0 43 4f 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 20 20  COL_SOUNDSLIKE  
100c0 20 20 20 31 30 0a 23 64 65 66 69 6e 65 20 53 50     10.#define SP
100d0 45 4c 4c 46 49 58 5f 43 4f 4c 5f 43 4f 4d 4d 41  ELLFIX_COL_COMMA
100e0 4e 44 20 20 20 20 20 20 20 20 31 31 0a 20 20 20  ND        11.   
100f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
10100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73 43 72  QLITE_OK && isCr
10110 65 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 70  eate ){.      sp
10120 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72  ellfix1DbExec(&r
10130 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20  c, db,.         
10140 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
10150 20 4e 4f 54 20 45 58 49 53 54 53 20 5c 22 25 77   NOT EXISTS \"%w
10160 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 28  \".\"%w_vocab\"(
10170 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
10180 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
10190 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20 20 20  RY KEY,\n".     
101a0 20 20 20 20 22 20 20 72 61 6e 6b 20 49 4e 54 2c      "  rank INT,
101b0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  \n".         "  
101c0 6c 61 6e 67 69 64 20 49 4e 54 2c 5c 6e 22 0a 20  langid INT,\n". 
101d0 20 20 20 20 20 20 20 20 22 20 20 77 6f 72 64 20          "  word 
101e0 54 45 58 54 2c 5c 6e 22 0a 20 20 20 20 20 20 20  TEXT,\n".       
101f0 20 20 22 20 20 6b 31 20 54 45 58 54 2c 5c 6e 22    "  k1 TEXT,\n"
10200 0a 20 20 20 20 20 20 20 20 20 22 20 20 6b 32 20  .         "  k2 
10210 54 45 58 54 5c 6e 22 0a 20 20 20 20 20 20 20 20  TEXT\n".        
10220 20 22 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20   ");\n",.       
10230 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 6c    zDbName, zTabl
10240 65 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  eName.      );. 
10250 20 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62       spellfix1Db
10260 45 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20  Exec(&rc, db,.  
10270 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49         "CREATE I
10280 4e 44 45 58 20 49 46 20 4e 4f 54 20 45 58 49 53  NDEX IF NOT EXIS
10290 54 53 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76  TS \"%w\".\"%w_v
102a0 6f 63 61 62 5f 69 6e 64 65 78 5f 6c 61 6e 67 69  ocab_index_langi
102b0 64 5f 6b 32 5c 22 20 22 0a 20 20 20 20 20 20 20  d_k2\" ".       
102c0 20 20 20 20 20 22 4f 4e 20 5c 22 25 77 5f 76 6f       "ON \"%w_vo
102d0 63 61 62 5c 22 28 6c 61 6e 67 69 64 2c 6b 32 29  cab\"(langid,k2)
102e0 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 7a 44 62  ;",.         zDb
102f0 4e 61 6d 65 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  Name, zTableName
10300 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 0a 20 20 20  , zTableName.   
10310 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
10320 66 6f 72 28 69 3d 33 3b 20 72 63 3d 3d 53 51 4c  for(i=3; rc==SQL
10330 49 54 45 5f 4f 4b 20 26 26 20 69 3c 61 72 67 63  ITE_OK && i<argc
10340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
10350 28 20 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 69  ( strncmp(argv[i
10360 5d 2c 22 65 64 69 74 5f 63 6f 73 74 5f 74 61 62  ],"edit_cost_tab
10370 6c 65 3d 22 2c 31 36 29 3d 3d 30 20 26 26 20 70  le=",16)==0 && p
10380 4e 65 77 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 3d  New->zCostTable=
10390 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  =0 ){.        pN
103a0 65 77 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 20 3d  ew->zCostTable =
103b0 20 73 70 65 6c 6c 66 69 78 31 44 65 71 75 6f 74   spellfix1Dequot
103c0 65 28 26 61 72 67 76 5b 69 5d 5b 31 36 5d 29 3b  e(&argv[i][16]);
103d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
103e0 77 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 3d 3d 30  w->zCostTable==0
103f0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
10400 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 63 6f  OMEM;.        co
10410 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
10420 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73        *pzErr = s
10430 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
10440 62 61 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  bad argument to 
10450 73 70 65 6c 6c 66 69 78 31 28 29 3a 20 5c 22 25  spellfix1(): \"%
10460 73 5c 22 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\"", argv[i]);.
10470 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10480 45 5f 45 52 52 4f 52 3b 20 0a 20 20 20 20 7d 0a  E_ERROR; .    }.
10490 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 26 26    }..  if( rc &&
104a0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 2a 70 70   pNew ){.    *pp
104b0 56 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 73 70  VTab = 0;.    sp
104c0 65 6c 6c 66 69 78 31 55 6e 69 6e 69 74 28 30 2c  ellfix1Uninit(0,
104d0 20 26 70 4e 65 77 2d 3e 62 61 73 65 29 3b 0a 20   &pNew->base);. 
104e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 56   }else{.    *ppV
104f0 54 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  Tab = (sqlite3_v
10500 74 61 62 20 2a 29 70 4e 65 77 3b 0a 20 20 7d 0a  tab *)pNew;.  }.
10510 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10520 2f 2a 0a 2a 2a 20 54 68 65 20 78 43 6f 6e 6e 65  /*.** The xConne
10530 63 74 20 61 6e 64 20 78 43 72 65 61 74 65 20 6d  ct and xCreate m
10540 65 74 68 6f 64 73 0a 2a 2f 0a 73 74 61 74 69 63  ethods.*/.static
10550 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 43 6f   int spellfix1Co
10560 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  nnect(.  sqlite3
10570 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41   *db,.  void *pA
10580 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  ux,.  int argc, 
10590 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73  const char *cons
105a0 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65  t*argv,.  sqlite
105b0 33 5f 76 74 61 62 20 2a 2a 70 70 56 54 61 62 2c  3_vtab **ppVTab,
105c0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
105d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 70 65 6c  ){.  return spel
105e0 6c 66 69 78 31 49 6e 69 74 28 30 2c 20 64 62 2c  lfix1Init(0, db,
105f0 20 70 41 75 78 2c 20 61 72 67 63 2c 20 61 72 67   pAux, argc, arg
10600 76 2c 20 70 70 56 54 61 62 2c 20 70 7a 45 72 72  v, ppVTab, pzErr
10610 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
10620 73 70 65 6c 6c 66 69 78 31 43 72 65 61 74 65 28  spellfix1Create(
10630 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
10640 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
10650 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
10660 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
10670 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
10680 20 2a 2a 70 70 56 54 61 62 2c 0a 20 20 63 68 61   **ppVTab,.  cha
10690 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 72  r **pzErr.){.  r
106a0 65 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 49  eturn spellfix1I
106b0 6e 69 74 28 31 2c 20 64 62 2c 20 70 41 75 78 2c  nit(1, db, pAux,
106c0 20 61 72 67 63 2c 20 61 72 67 76 2c 20 70 70 56   argc, argv, ppV
106d0 54 61 62 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a  Tab, pzErr);.}..
106e0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 6c 6c 20  /*.** Clear all 
106f0 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  of the content f
10700 72 6f 6d 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  rom a cursor..*/
10710 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 70 65  .static void spe
10720 6c 6c 66 69 78 31 52 65 73 65 74 43 75 72 73 6f  llfix1ResetCurso
10730 72 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73  r(spellfix1_curs
10740 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
10750 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
10760 3c 70 43 75 72 2d 3e 6e 52 6f 77 3b 20 69 2b 2b  <pCur->nRow; i++
10770 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
10780 72 65 65 28 70 43 75 72 2d 3e 61 5b 69 5d 2e 7a  ree(pCur->a[i].z
10790 57 6f 72 64 29 3b 0a 20 20 7d 0a 20 20 70 43 75  Word);.  }.  pCu
107a0 72 2d 3e 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 70  r->nRow = 0;.  p
107b0 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20  Cur->iRow = 0;. 
107c0 20 70 43 75 72 2d 3e 6e 53 65 61 72 63 68 20 3d   pCur->nSearch =
107d0 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
107e0 70 46 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20  pFullScan ){.   
107f0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
10800 65 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61  e(pCur->pFullSca
10810 6e 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 46  n);.    pCur->pF
10820 75 6c 6c 53 63 61 6e 20 3d 20 30 3b 0a 20 20 7d  ullScan = 0;.  }
10830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
10840 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 68   the cursor to h
10850 6f 6c 64 20 75 70 20 74 6f 20 4e 20 72 6f 77 73  old up to N rows
10860 20 6f 66 20 63 6f 6e 74 65 6e 74 0a 2a 2f 0a 73   of content.*/.s
10870 74 61 74 69 63 20 76 6f 69 64 20 73 70 65 6c 6c  tatic void spell
10880 66 69 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72  fix1ResizeCursor
10890 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
108a0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 4e 29 7b  r *pCur, int N){
108b0 0a 20 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66  .  struct spellf
108c0 69 78 31 5f 72 6f 77 20 2a 61 4e 65 77 3b 0a 20  ix1_row *aNew;. 
108d0 20 61 73 73 65 72 74 28 20 4e 3e 3d 70 43 75 72   assert( N>=pCur
108e0 2d 3e 6e 52 6f 77 20 29 3b 0a 20 20 61 4e 65 77  ->nRow );.  aNew
108f0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
10900 6f 63 36 34 28 70 43 75 72 2d 3e 61 2c 20 73 69  oc64(pCur->a, si
10910 7a 65 6f 66 28 70 43 75 72 2d 3e 61 5b 30 5d 29  zeof(pCur->a[0])
10920 2a 4e 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 3d  *N);.  if( aNew=
10930 3d 30 20 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20  =0 && N>0 ){.   
10940 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43   spellfix1ResetC
10950 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
10960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
10970 75 72 2d 3e 61 29 3b 0a 20 20 20 20 70 43 75 72  ur->a);.    pCur
10980 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
10990 20 20 70 43 75 72 2d 3e 61 20 3d 20 30 3b 0a 20    pCur->a = 0;. 
109a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
109b0 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 4e 3b 0a 20 20  ->nAlloc = N;.  
109c0 20 20 70 43 75 72 2d 3e 61 20 3d 20 61 4e 65 77    pCur->a = aNew
109d0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
109e0 43 6c 6f 73 65 20 61 20 66 75 7a 7a 79 2d 73 65  Close a fuzzy-se
109f0 61 72 63 68 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  arch cursor..*/.
10a00 73 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c  static int spell
10a10 66 69 78 31 43 6c 6f 73 65 28 73 71 6c 69 74 65  fix1Close(sqlite
10a20 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
10a30 75 72 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31  ur){.  spellfix1
10a40 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
10a50 28 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f  (spellfix1_curso
10a60 72 20 2a 29 63 75 72 3b 0a 20 20 73 70 65 6c 6c  r *)cur;.  spell
10a70 66 69 78 31 52 65 73 65 74 43 75 72 73 6f 72 28  fix1ResetCursor(
10a80 70 43 75 72 29 3b 0a 20 20 73 70 65 6c 6c 66 69  pCur);.  spellfi
10a90 78 31 52 65 73 69 7a 65 43 75 72 73 6f 72 28 70  x1ResizeCursor(p
10aa0 43 75 72 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  Cur, 0);.  sqlit
10ab0 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 7a 50  e3_free(pCur->zP
10ac0 61 74 74 65 72 6e 29 3b 0a 20 20 73 71 6c 69 74  attern);.  sqlit
10ad0 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 0a 20  e3_free(pCur);. 
10ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10af0 4b 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 50  K;.}..#define SP
10b00 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 4d 41  ELLFIX_IDXNUM_MA
10b10 54 43 48 20 20 30 78 30 31 20 20 20 20 20 20 20  TCH  0x01       
10b20 20 20 2f 2a 20 77 6f 72 64 20 4d 41 54 43 48 20    /* word MATCH 
10b30 24 73 74 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  $str */.#define 
10b40 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
10b50 4c 41 4e 47 49 44 20 30 78 30 32 20 20 20 20 20  LANGID 0x02     
10b60 20 20 20 20 2f 2a 20 6c 61 6e 67 69 64 20 3d 3d      /* langid ==
10b70 20 24 6c 61 6e 67 69 64 20 2a 2f 0a 23 64 65 66   $langid */.#def
10b80 69 6e 65 20 53 50 45 4c 4c 46 49 58 5f 49 44 58  ine SPELLFIX_IDX
10b90 4e 55 4d 5f 54 4f 50 20 20 20 20 30 78 30 34 20  NUM_TOP    0x04 
10ba0 20 20 20 20 20 20 20 20 2f 2a 20 74 6f 70 20 3d          /* top =
10bb0 20 24 74 6f 70 20 2a 2f 0a 23 64 65 66 69 6e 65   $top */.#define
10bc0 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
10bd0 5f 53 43 4f 50 45 20 20 30 78 30 38 20 20 20 20  _SCOPE  0x08    
10be0 20 20 20 20 20 2f 2a 20 73 63 6f 70 65 20 3d 20       /* scope = 
10bf0 24 73 63 6f 70 65 20 2a 2f 0a 23 64 65 66 69 6e  $scope */.#defin
10c00 65 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  e SPELLFIX_IDXNU
10c10 4d 5f 44 49 53 54 4c 54 20 30 78 31 30 20 20 20  M_DISTLT 0x10   
10c20 20 20 20 20 20 20 2f 2a 20 64 69 73 74 61 6e 63        /* distanc
10c30 65 20 3c 20 24 64 69 73 74 61 6e 63 65 20 2a 2f  e < $distance */
10c40 0a 23 64 65 66 69 6e 65 20 53 50 45 4c 4c 46 49  .#define SPELLFI
10c50 58 5f 49 44 58 4e 55 4d 5f 44 49 53 54 4c 45 20  X_IDXNUM_DISTLE 
10c60 30 78 32 30 20 20 20 20 20 20 20 20 20 2f 2a 20  0x20         /* 
10c70 64 69 73 74 61 6e 63 65 20 3c 3d 20 24 64 69 73  distance <= $dis
10c80 74 61 6e 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65  tance */.#define
10c90 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
10ca0 5f 52 4f 57 49 44 20 20 30 78 34 30 20 20 20 20  _ROWID  0x40    
10cb0 20 20 20 20 20 2f 2a 20 72 6f 77 69 64 20 3d 20       /* rowid = 
10cc0 24 72 6f 77 69 64 20 2a 2f 0a 23 64 65 66 69 6e  $rowid */.#defin
10cd0 65 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  e SPELLFIX_IDXNU
10ce0 4d 5f 44 49 53 54 20 20 20 28 30 78 31 30 7c 30  M_DIST   (0x10|0
10cf0 78 32 30 29 20 20 2f 2a 20 44 49 53 54 4c 54 20  x20)  /* DISTLT 
10d00 61 6e 64 20 44 49 53 54 4c 45 20 2a 2f 0a 0a 2f  and DISTLE */../
10d10 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6c 61 6e  *.**.** The plan
10d20 20 6e 75 6d 62 65 72 20 69 73 20 61 20 62 69 74   number is a bit
10d30 6d 61 73 6b 20 6f 66 20 74 68 65 20 53 50 45 4c  mask of the SPEL
10d40 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 2a 20 76 61  LFIX_IDXNUM_* va
10d50 6c 75 65 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  lues defined.** 
10d60 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 66 69 6c  above..**.** fil
10d70 74 65 72 2e 61 72 67 76 5b 2a 5d 20 76 61 6c 75  ter.argv[*] valu
10d80 65 73 20 63 6f 6e 74 61 69 6e 73 20 24 73 74 72  es contains $str
10d90 2c 20 24 6c 61 6e 67 69 64 2c 20 24 74 6f 70 2c  , $langid, $top,
10da0 20 24 73 63 6f 70 65 20 61 6e 64 20 24 72 6f 77   $scope and $row
10db0 69 64 0a 2a 2a 20 69 66 20 73 70 65 63 69 66 69  id.** if specifi
10dc0 65 64 20 61 6e 64 20 69 6e 20 74 68 61 74 20 6f  ed and in that o
10dd0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
10de0 69 6e 74 20 73 70 65 6c 6c 66 69 78 31 42 65 73  int spellfix1Bes
10df0 74 49 6e 64 65 78 28 73 71 6c 69 74 65 33 5f 76  tIndex(sqlite3_v
10e00 74 61 62 20 2a 74 61 62 2c 20 73 71 6c 69 74 65  tab *tab, sqlite
10e10 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
10e20 64 78 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69  dxInfo){.  int i
10e30 50 6c 61 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Plan = 0;.  int 
10e40 69 4c 61 6e 67 54 65 72 6d 20 3d 20 2d 31 3b 0a  iLangTerm = -1;.
10e50 20 20 69 6e 74 20 69 54 6f 70 54 65 72 6d 20 3d    int iTopTerm =
10e60 20 2d 31 3b 0a 20 20 69 6e 74 20 69 53 63 6f 70   -1;.  int iScop
10e70 65 54 65 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e  eTerm = -1;.  in
10e80 74 20 69 44 69 73 74 54 65 72 6d 20 3d 20 2d 31  t iDistTerm = -1
10e90 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 54 65  ;.  int iRowidTe
10ea0 72 6d 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  rm = -1;.  int i
10eb0 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
10ec0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
10ed0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73  onstraint *pCons
10ee0 74 72 61 69 6e 74 3b 0a 20 20 70 43 6f 6e 73 74  traint;.  pConst
10ef0 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
10f00 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
10f10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
10f20 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
10f30 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61  t; i++, pConstra
10f40 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  int++){.    if( 
10f50 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61  pConstraint->usa
10f60 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ble==0 ) continu
10f70 65 3b 0a 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73  e;..    /* Terms
10f80 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 77   of the form:  w
10f90 6f 72 64 20 4d 41 54 43 48 20 24 73 74 72 20 2a  ord MATCH $str *
10fa0 2f 0a 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e  /.    if( (iPlan
10fb0 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e   & SPELLFIX_IDXN
10fc0 55 4d 5f 4d 41 54 43 48 29 3d 3d 30 20 0a 20 20  UM_MATCH)==0 .  
10fd0 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e     && pConstrain
10fe0 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 53 50 45 4c  t->iColumn==SPEL
10ff0 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 0a 20 20  LFIX_COL_WORD.  
11000 20 20 20 26 26 20 70 43 6f 6e 73 74 72 61 69 6e     && pConstrain
11010 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  t->op==SQLITE_IN
11020 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
11030 41 54 43 48 0a 20 20 20 20 29 7b 0a 20 20 20 20  ATCH.    ){.    
11040 20 20 69 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c    iPlan |= SPELL
11050 46 49 58 5f 49 44 58 4e 55 4d 5f 4d 41 54 43 48  FIX_IDXNUM_MATCH
11060 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
11070 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
11080 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
11090 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78 49  = 1;.      pIdxI
110a0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
110b0 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20  Usage[i].omit = 
110c0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
110d0 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   Terms of the fo
110e0 72 6d 3a 20 20 6c 61 6e 67 69 64 20 3d 20 24 6c  rm:  langid = $l
110f0 61 6e 67 69 64 20 20 2a 2f 0a 20 20 20 20 69 66  angid  */.    if
11100 28 20 28 69 50 6c 61 6e 20 26 20 53 50 45 4c 4c  ( (iPlan & SPELL
11110 46 49 58 5f 49 44 58 4e 55 4d 5f 4c 41 4e 47 49  FIX_IDXNUM_LANGI
11120 44 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43  D)==0.     && pC
11130 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
11140 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  mn==SPELLFIX_COL
11150 5f 4c 41 4e 47 49 44 0a 20 20 20 20 20 26 26 20  _LANGID.     && 
11160 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d  pConstraint->op=
11170 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
11180 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20 20  NSTRAINT_EQ.    
11190 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c  ){.      iPlan |
111a0 3d 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55  = SPELLFIX_IDXNU
111b0 4d 5f 4c 41 4e 47 49 44 3b 0a 20 20 20 20 20 20  M_LANGID;.      
111c0 69 4c 61 6e 67 54 65 72 6d 20 3d 20 69 3b 0a 20  iLangTerm = i;. 
111d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 65 72     }..    /* Ter
111e0 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20  ms of the form: 
111f0 20 74 6f 70 20 3d 20 24 74 6f 70 20 2a 2f 0a 20   top = $top */. 
11200 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20     if( (iPlan & 
11210 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
11220 54 4f 50 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  TOP)==0.     && 
11230 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f  pConstraint->iCo
11240 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43  lumn==SPELLFIX_C
11250 4f 4c 5f 54 4f 50 0a 20 20 20 20 20 26 26 20 70  OL_TOP.     && p
11260 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d  Constraint->op==
11270 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
11280 53 54 52 41 49 4e 54 5f 45 51 0a 20 20 20 20 29  STRAINT_EQ.    )
11290 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d  {.      iPlan |=
112a0 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
112b0 5f 54 4f 50 3b 0a 20 20 20 20 20 20 69 54 6f 70  _TOP;.      iTop
112c0 54 65 72 6d 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  Term = i;.    }.
112d0 0a 20 20 20 20 2f 2a 20 54 65 72 6d 73 20 6f 66  .    /* Terms of
112e0 20 74 68 65 20 66 6f 72 6d 3a 20 20 73 63 6f 70   the form:  scop
112f0 65 20 3d 20 24 73 63 6f 70 65 20 2a 2f 0a 20 20  e = $scope */.  
11300 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26 20 53    if( (iPlan & S
11310 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 53  PELLFIX_IDXNUM_S
11320 43 4f 50 45 29 3d 3d 30 0a 20 20 20 20 20 26 26  COPE)==0.     &&
11330 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43   pConstraint->iC
11340 6f 6c 75 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f  olumn==SPELLFIX_
11350 43 4f 4c 5f 53 43 4f 50 45 0a 20 20 20 20 20 26  COL_SCOPE.     &
11360 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  & pConstraint->o
11370 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
11380 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20  CONSTRAINT_EQ.  
11390 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e    ){.      iPlan
113a0 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f 49 44 58   |= SPELLFIX_IDX
113b0 4e 55 4d 5f 53 43 4f 50 45 3b 0a 20 20 20 20 20  NUM_SCOPE;.     
113c0 20 69 53 63 6f 70 65 54 65 72 6d 20 3d 20 69 3b   iScopeTerm = i;
113d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
113e0 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  erms of the form
113f0 3a 20 20 64 69 73 74 61 6e 63 65 20 3c 20 24 64  :  distance < $d
11400 69 73 74 20 6f 72 20 64 69 73 74 61 6e 63 65 20  ist or distance 
11410 3c 3d 20 24 64 69 73 74 20 2a 2f 0a 20 20 20 20  <= $dist */.    
11420 69 66 28 20 28 69 50 6c 61 6e 20 26 20 53 50 45  if( (iPlan & SPE
11430 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 44 49 53  LLFIX_IDXNUM_DIS
11440 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 43  T)==0.     && pC
11450 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75  onstraint->iColu
11460 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  mn==SPELLFIX_COL
11470 5f 44 49 53 54 41 4e 43 45 0a 20 20 20 20 20 26  _DISTANCE.     &
11480 26 20 28 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  & (pConstraint->
11490 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
114a0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 0a 20  _CONSTRAINT_LT. 
114b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6e           || pCon
114c0 73 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c  straint->op==SQL
114d0 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
114e0 41 49 4e 54 5f 4c 45 29 0a 20 20 20 20 29 7b 0a  AINT_LE).    ){.
114f0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74        if( pConst
11500 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49 54  raint->op==SQLIT
11510 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
11520 4e 54 5f 4c 54 20 29 7b 0a 20 20 20 20 20 20 20  NT_LT ){.       
11530 20 69 50 6c 61 6e 20 7c 3d 20 53 50 45 4c 4c 46   iPlan |= SPELLF
11540 49 58 5f 49 44 58 4e 55 4d 5f 44 49 53 54 4c 54  IX_IDXNUM_DISTLT
11550 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11560 20 20 20 20 20 20 20 69 50 6c 61 6e 20 7c 3d 20         iPlan |= 
11570 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f  SPELLFIX_IDXNUM_
11580 44 49 53 54 4c 45 3b 0a 20 20 20 20 20 20 7d 0a  DISTLE;.      }.
11590 20 20 20 20 20 20 69 44 69 73 74 54 65 72 6d 20        iDistTerm 
115a0 3d 20 69 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = i;.    }..    
115b0 2f 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  /* Terms of the 
115c0 66 6f 72 6d 3a 20 20 64 69 73 74 61 6e 63 65 20  form:  distance 
115d0 3c 20 24 64 69 73 74 20 6f 72 20 64 69 73 74 61  < $dist or dista
115e0 6e 63 65 20 3c 3d 20 24 64 69 73 74 20 2a 2f 0a  nce <= $dist */.
115f0 20 20 20 20 69 66 28 20 28 69 50 6c 61 6e 20 26      if( (iPlan &
11600 20 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d   SPELLFIX_IDXNUM
11610 5f 52 4f 57 49 44 29 3d 3d 30 0a 20 20 20 20 20  _ROWID)==0.     
11620 26 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  && pConstraint->
11630 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20 26  iColumn<0.     &
11640 26 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  & pConstraint->o
11650 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p==SQLITE_INDEX_
11660 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 0a 20 20  CONSTRAINT_EQ.  
11670 20 20 29 7b 0a 20 20 20 20 20 20 69 50 6c 61 6e    ){.      iPlan
11680 20 7c 3d 20 53 50 45 4c 4c 46 49 58 5f 49 44 58   |= SPELLFIX_IDX
11690 4e 55 4d 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20  NUM_ROWID;.     
116a0 20 69 52 6f 77 69 64 54 65 72 6d 20 3d 20 69 3b   iRowidTerm = i;
116b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
116c0 20 69 50 6c 61 6e 26 53 50 45 4c 4c 46 49 58 5f   iPlan&SPELLFIX_
116d0 49 44 58 4e 55 4d 5f 4d 41 54 43 48 20 29 7b 0a  IDXNUM_MATCH ){.
116e0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 32 3b      int idx = 2;
116f0 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  .    pIdxInfo->i
11700 64 78 4e 75 6d 20 3d 20 69 50 6c 61 6e 3b 0a 20  dxNum = iPlan;. 
11710 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
11720 3e 6e 4f 72 64 65 72 42 79 3d 3d 31 0a 20 20 20  >nOrderBy==1.   
11730 20 20 26 26 20 70 49 64 78 49 6e 66 6f 2d 3e 61    && pIdxInfo->a
11740 4f 72 64 65 72 42 79 5b 30 5d 2e 69 43 6f 6c 75  OrderBy[0].iColu
11750 6d 6e 3d 3d 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  mn==SPELLFIX_COL
11760 5f 53 43 4f 52 45 0a 20 20 20 20 20 26 26 20 70  _SCORE.     && p
11770 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
11780 79 5b 30 5d 2e 64 65 73 63 3d 3d 30 0a 20 20 20  y[0].desc==0.   
11790 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e   ){.      pIdxIn
117a0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
117b0 6d 65 64 20 3d 20 31 3b 20 20 2f 2a 20 44 65 66  med = 1;  /* Def
117c0 61 75 6c 74 20 6f 72 64 65 72 20 62 79 20 69 53  ault order by iS
117d0 63 6f 72 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  core */.    }.  
117e0 20 20 69 66 28 20 69 50 6c 61 6e 26 53 50 45 4c    if( iPlan&SPEL
117f0 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 4c 41 4e 47  LFIX_IDXNUM_LANG
11800 49 44 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  ID ){.      pIdx
11810 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
11820 74 55 73 61 67 65 5b 69 4c 61 6e 67 54 65 72 6d  tUsage[iLangTerm
11830 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64  ].argvIndex = id
11840 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49  x++;.      pIdxI
11850 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
11860 55 73 61 67 65 5b 69 4c 61 6e 67 54 65 72 6d 5d  Usage[iLangTerm]
11870 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  .omit = 1;.    }
11880 0a 20 20 20 20 69 66 28 20 69 50 6c 61 6e 26 53  .    if( iPlan&S
11890 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 54  PELLFIX_IDXNUM_T
118a0 4f 50 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  OP ){.      pIdx
118b0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
118c0 74 55 73 61 67 65 5b 69 54 6f 70 54 65 72 6d 5d  tUsage[iTopTerm]
118d0 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69 64 78  .argvIndex = idx
118e0 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  ++;.      pIdxIn
118f0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
11900 73 61 67 65 5b 69 54 6f 70 54 65 72 6d 5d 2e 6f  sage[iTopTerm].o
11910 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  mit = 1;.    }. 
11920 20 20 20 69 66 28 20 69 50 6c 61 6e 26 53 50 45     if( iPlan&SPE
11930 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 53 43 4f  LLFIX_IDXNUM_SCO
11940 50 45 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  PE ){.      pIdx
11950 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
11960 74 55 73 61 67 65 5b 69 53 63 6f 70 65 54 65 72  tUsage[iScopeTer
11970 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20 69  m].argvIndex = i
11980 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49 64 78  dx++;.      pIdx
11990 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
119a0 74 55 73 61 67 65 5b 69 53 63 6f 70 65 54 65 72  tUsage[iScopeTer
119b0 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20  m].omit = 1;.   
119c0 20 7d 0a 20 20 20 20 69 66 28 20 69 50 6c 61 6e   }.    if( iPlan
119d0 26 53 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d  &SPELLFIX_IDXNUM
119e0 5f 44 49 53 54 20 29 7b 0a 20 20 20 20 20 20 70  _DIST ){.      p
119f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
11a00 61 69 6e 74 55 73 61 67 65 5b 69 44 69 73 74 54  aintUsage[iDistT
11a10 65 72 6d 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  erm].argvIndex =
11a20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 20 20 70 49   idx++;.      pI
11a30 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
11a40 69 6e 74 55 73 61 67 65 5b 69 44 69 73 74 54 65  intUsage[iDistTe
11a50 72 6d 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  rm].omit = 1;.  
11a60 20 20 7d 0a 20 20 20 20 70 49 64 78 49 6e 66 6f    }.    pIdxInfo
11a70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
11a80 3d 20 31 65 35 3b 0a 20 20 7d 65 6c 73 65 20 69  = 1e5;.  }else i
11a90 66 28 20 28 69 50 6c 61 6e 20 26 20 53 50 45 4c  f( (iPlan & SPEL
11aa0 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 52 4f 57 49  LFIX_IDXNUM_ROWI
11ab0 44 29 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e  D) ){.    pIdxIn
11ac0 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 53 50 45  fo->idxNum = SPE
11ad0 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 52 4f 57  LLFIX_IDXNUM_ROW
11ae0 49 44 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  ID;.    pIdxInfo
11af0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
11b00 67 65 5b 69 52 6f 77 69 64 54 65 72 6d 5d 2e 61  ge[iRowidTerm].a
11b10 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20  rgvIndex = 1;.  
11b20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
11b30 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 52 6f  straintUsage[iRo
11b40 77 69 64 54 65 72 6d 5d 2e 6f 6d 69 74 20 3d 20  widTerm].omit = 
11b50 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  1;.    pIdxInfo-
11b60 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
11b70 20 35 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   5;.  }else{.   
11b80 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
11b90 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
11ba0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
11bb0 73 74 20 3d 20 31 65 35 30 3b 0a 20 20 7d 0a 20  st = 1e50;.  }. 
11bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11bd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  K;.}../*.** Open
11be0 20 61 20 6e 65 77 20 66 75 7a 7a 79 2d 73 65 61   a new fuzzy-sea
11bf0 72 63 68 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  rch cursor..*/.s
11c00 74 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66  tatic int spellf
11c10 69 78 31 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  ix1Open(sqlite3_
11c20 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71 6c  vtab *pVTab, sql
11c30 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
11c40 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 20   **ppCursor){.  
11c50 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a  spellfix1_vtab *
11c60 70 20 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76  p = (spellfix1_v
11c70 74 61 62 2a 29 70 56 54 61 62 3b 0a 20 20 73 70  tab*)pVTab;.  sp
11c80 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a  ellfix1_cursor *
11c90 70 43 75 72 3b 0a 20 20 70 43 75 72 20 3d 20 73  pCur;.  pCur = s
11ca0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
11cb0 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29   sizeof(*pCur) )
11cc0 3b 0a 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20  ;.  if( pCur==0 
11cd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
11ce0 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28  NOMEM;.  memset(
11cf0 70 43 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCur, 0, sizeof(
11d00 2a 70 43 75 72 29 29 3b 0a 20 20 70 43 75 72 2d  *pCur));.  pCur-
11d10 3e 70 56 54 61 62 20 3d 20 70 3b 0a 20 20 2a 70  >pVTab = p;.  *p
11d20 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d  pCursor = &pCur-
11d30 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  >base;.  return 
11d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11d50 0a 2a 2a 20 41 64 6a 75 73 74 20 61 20 64 69 73  .** Adjust a dis
11d60 74 61 6e 63 65 20 6d 65 61 73 75 72 65 6d 65 6e  tance measuremen
11d70 74 20 62 79 20 74 68 65 20 77 6f 72 64 73 20 72  t by the words r
11d80 61 6e 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ank in order to 
11d90 73 68 6f 77 0a 2a 2a 20 70 72 65 66 65 72 65 6e  show.** preferen
11da0 63 65 20 74 6f 20 63 6f 6d 6d 6f 6e 20 77 6f 72  ce to common wor
11db0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
11dc0 74 20 73 70 65 6c 6c 66 69 78 31 53 63 6f 72 65  t spellfix1Score
11dd0 28 69 6e 74 20 69 44 69 73 74 61 6e 63 65 2c 20  (int iDistance, 
11de0 69 6e 74 20 69 52 61 6e 6b 29 7b 0a 20 20 69 6e  int iRank){.  in
11df0 74 20 69 4c 6f 67 32 3b 0a 20 20 66 6f 72 28 69  t iLog2;.  for(i
11e00 4c 6f 67 32 3d 30 3b 20 69 52 61 6e 6b 3e 30 3b  Log2=0; iRank>0;
11e10 20 69 4c 6f 67 32 2b 2b 2c 20 69 52 61 6e 6b 3e   iLog2++, iRank>
11e20 3e 3d 31 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20  >=1){}.  return 
11e30 69 44 69 73 74 61 6e 63 65 20 2b 20 33 32 20 2d  iDistance + 32 -
11e40 20 69 4c 6f 67 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iLog2;.}../*.**
11e50 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 70 65   Compare two spe
11e60 6c 6c 66 69 78 31 5f 72 6f 77 20 6f 62 6a 65 63  llfix1_row objec
11e70 74 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  ts for sorting p
11e80 75 72 70 6f 73 65 73 20 69 6e 20 71 73 6f 72 74  urposes in qsort
11e90 28 29 20 73 75 63 68 0a 2a 2a 20 74 68 61 74 20  () such.** that 
11ea0 74 68 65 79 20 73 6f 72 74 20 69 6e 20 6f 72 64  they sort in ord
11eb0 65 72 20 6f 66 20 69 6e 63 72 65 61 73 69 6e 67  er of increasing
11ec0 20 64 69 73 74 61 6e 63 65 2e 0a 2a 2f 0a 73 74   distance..*/.st
11ed0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
11ee0 43 44 45 43 4c 20 73 70 65 6c 6c 66 69 78 31 52  CDECL spellfix1R
11ef0 6f 77 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  owCompare(const 
11f00 76 6f 69 64 20 2a 41 2c 20 63 6f 6e 73 74 20 76  void *A, const v
11f10 6f 69 64 20 2a 42 29 7b 0a 20 20 63 6f 6e 73 74  oid *B){.  const
11f20 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69 78   struct spellfix
11f30 31 5f 72 6f 77 20 2a 61 20 3d 20 28 63 6f 6e 73  1_row *a = (cons
11f40 74 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66 69  t struct spellfi
11f50 78 31 5f 72 6f 77 2a 29 41 3b 0a 20 20 63 6f 6e  x1_row*)A;.  con
11f60 73 74 20 73 74 72 75 63 74 20 73 70 65 6c 6c 66  st struct spellf
11f70 69 78 31 5f 72 6f 77 20 2a 62 20 3d 20 28 63 6f  ix1_row *b = (co
11f80 6e 73 74 20 73 74 72 75 63 74 20 73 70 65 6c 6c  nst struct spell
11f90 66 69 78 31 5f 72 6f 77 2a 29 42 3b 0a 20 20 72  fix1_row*)B;.  r
11fa0 65 74 75 72 6e 20 61 2d 3e 69 53 63 6f 72 65 20  eturn a->iScore 
11fb0 2d 20 62 2d 3e 69 53 63 6f 72 65 3b 0a 7d 0a 0a  - b->iScore;.}..
11fc0 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72  /*.** A structur
11fd0 65 20 75 73 65 64 20 74 6f 20 70 61 73 73 20 69  e used to pass i
11fe0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
11ff0 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 46  spellfix1FilterF
12000 6f 72 4d 61 74 63 68 28 29 0a 2a 2a 20 69 6e 74  orMatch().** int
12010 6f 20 73 70 65 6c 6c 66 69 78 31 52 75 6e 51 75  o spellfix1RunQu
12020 65 72 79 28 29 2e 0a 2a 2f 0a 74 79 70 65 64 65  ery()..*/.typede
12030 66 20 73 74 72 75 63 74 20 4d 61 74 63 68 51 75  f struct MatchQu
12040 65 72 79 20 7b 0a 20 20 73 70 65 6c 6c 66 69 78  ery {.  spellfix
12050 31 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 3b 20  1_cursor *pCur; 
12060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12070 63 75 72 73 6f 72 20 62 65 69 6e 67 20 71 75 65  cursor being que
12080 72 69 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ried */.  sqlite
12090 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
120a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
120b0 61 64 6f 77 20 74 61 62 6c 65 20 71 75 65 72 79  adow table query
120c0 20 73 74 61 74 6d 65 6e 74 20 2a 2f 0a 20 20 63   statment */.  c
120d0 68 61 72 20 7a 48 61 73 68 5b 53 50 45 4c 4c 46  har zHash[SPELLF
120e0 49 58 5f 4d 58 5f 48 41 53 48 5d 3b 20 20 20 20  IX_MX_HASH];    
120f0 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 70  /* The current p
12100 68 6f 6e 65 68 61 73 68 20 66 6f 72 20 7a 50 61  honehash for zPa
12110 74 74 65 72 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ttern */.  const
12120 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b   char *zPattern;
12130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12140 72 61 6e 73 6c 69 74 65 72 61 74 65 64 20 69 6e  ransliterated in
12150 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  put string */.  
12160 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 20 20 20  int nPattern;   
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 50   /* Length of zP
12190 61 74 74 65 72 6e 20 2a 2f 0a 20 20 45 64 69 74  attern */.  Edit
121a0 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67 20  Dist3FromString 
121b0 2a 70 4d 61 74 63 68 53 74 72 33 3b 20 2f 2a 20  *pMatchStr3; /* 
121c0 4f 72 69 67 69 6e 61 6c 20 75 6e 69 63 6f 64 65  Original unicode
121d0 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 45 64 69   string */.  Edi
121e0 74 44 69 73 74 33 43 6f 6e 66 69 67 20 2a 70 43  tDist3Config *pC
121f0 6f 6e 66 69 67 33 3b 20 20 20 20 20 20 20 2f 2a  onfig3;       /*
12200 20 45 64 69 74 2d 64 69 73 74 61 6e 63 65 20 63   Edit-distance c
12210 6f 73 74 20 63 6f 65 66 66 69 63 69 65 6e 74 73  ost coefficients
12220 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 45 64 69 74   */.  const Edit
12230 44 69 73 74 33 4c 61 6e 67 20 2a 70 4c 61 6e 67  Dist3Lang *pLang
12240 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65  ;      /* The se
12250 6c 65 63 74 65 64 20 6c 61 6e 67 75 61 67 65 20  lected language 
12260 63 6f 65 66 66 69 63 69 65 6e 74 73 20 2a 2f 0a  coefficients */.
12270 20 20 69 6e 74 20 69 4c 61 6e 67 3b 20 20 20 20    int iLang;    
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12290 20 20 20 2f 2a 20 54 68 65 20 6c 61 6e 67 75 61     /* The langua
122a0 67 65 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ge id */.  int i
122b0 53 63 6f 70 65 3b 20 20 20 20 20 20 20 20 20 20  Scope;          
122c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
122d0 65 66 61 75 6c 74 20 73 63 6f 70 65 20 2a 2f 0a  efault scope */.
122e0 20 20 69 6e 74 20 69 4d 61 78 44 69 73 74 3b 20    int iMaxDist; 
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
12310 6c 6f 77 65 64 20 65 64 69 74 20 64 69 73 74 61  lowed edit dista
12320 6e 63 65 2c 20 6f 72 20 2d 31 20 2a 2f 0a 20 20  nce, or -1 */.  
12330 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a   /* Error code *
12360 2f 0a 20 20 69 6e 74 20 6e 52 75 6e 3b 20 20 20  /.  int nRun;   
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12380 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72 69 6f  * Number of prio
12390 72 20 72 75 6e 73 20 66 6f 72 20 74 68 65 20 73  r runs for the s
123a0 61 6d 65 20 7a 50 61 74 74 65 72 6e 20 2a 2f 0a  ame zPattern */.
123b0 20 20 63 68 61 72 20 61 7a 50 72 69 6f 72 5b 53    char azPrior[S
123c0 50 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 5d 5b  PELLFIX_MX_RUN][
123d0 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53 48  SPELLFIX_MX_HASH
123e0 5d 3b 20 20 2f 2a 20 50 72 69 6f 72 20 68 61 73  ];  /* Prior has
123f0 68 65 73 20 2a 2f 0a 7d 20 4d 61 74 63 68 51 75  hes */.} MatchQu
12400 65 72 79 3b 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  ery;../*.** Run 
12410 61 20 71 75 65 72 79 20 6c 6f 6f 6b 69 6e 67 20  a query looking 
12420 66 6f 72 20 74 68 65 20 62 65 73 74 20 6d 61 74  for the best mat
12430 63 68 65 73 20 61 67 61 69 6e 73 74 20 7a 50 61  ches against zPa
12440 74 74 65 72 6e 20 75 73 69 6e 67 0a 2a 2a 20 7a  ttern using.** z
12450 48 61 73 68 20 61 73 20 74 68 65 20 63 68 61 72  Hash as the char
12460 61 63 74 65 72 20 63 6c 61 73 73 20 73 65 65 64  acter class seed
12470 20 68 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   hash..*/.static
12480 20 76 6f 69 64 20 73 70 65 6c 6c 66 69 78 31 52   void spellfix1R
12490 75 6e 51 75 65 72 79 28 4d 61 74 63 68 51 75 65  unQuery(MatchQue
124a0 72 79 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ry *p, const cha
124b0 72 20 2a 7a 51 75 65 72 79 2c 20 69 6e 74 20 6e  r *zQuery, int n
124c0 51 75 65 72 79 29 7b 0a 20 20 63 6f 6e 73 74 20  Query){.  const 
124d0 63 68 61 72 20 2a 7a 4b 31 3b 0a 20 20 63 6f 6e  char *zK1;.  con
124e0 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 3b 0a  st char *zWord;.
124f0 20 20 69 6e 74 20 69 44 69 73 74 3b 0a 20 20 69    int iDist;.  i
12500 6e 74 20 69 52 61 6e 6b 3b 0a 20 20 69 6e 74 20  nt iRank;.  int 
12510 69 53 63 6f 72 65 3b 0a 20 20 69 6e 74 20 69 57  iScore;.  int iW
12520 6f 72 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  orst = 0;.  int 
12530 69 64 78 3b 0a 20 20 69 6e 74 20 69 64 78 57 6f  idx;.  int idxWo
12540 72 73 74 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  rst = -1;.  int 
12550 69 3b 0a 20 20 69 6e 74 20 69 53 63 6f 70 65 20  i;.  int iScope 
12560 3d 20 70 2d 3e 69 53 63 6f 70 65 3b 0a 20 20 73  = p->iScope;.  s
12570 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
12580 2a 70 43 75 72 20 3d 20 70 2d 3e 70 43 75 72 3b  *pCur = p->pCur;
12590 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
125a0 2a 70 53 74 6d 74 20 3d 20 70 2d 3e 70 53 74 6d  *pStmt = p->pStm
125b0 74 3b 0a 20 20 63 68 61 72 20 7a 48 61 73 68 31  t;.  char zHash1
125c0 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53  [SPELLFIX_MX_HAS
125d0 48 5d 3b 0a 20 20 63 68 61 72 20 7a 48 61 73 68  H];.  char zHash
125e0 32 5b 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41  2[SPELLFIX_MX_HA
125f0 53 48 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6c  SH];.  char *zCl
12600 61 73 73 3b 0a 20 20 69 6e 74 20 6e 43 6c 61 73  ass;.  int nClas
12610 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  s;.  int rc;..  
12620 69 66 28 20 70 43 75 72 2d 3e 61 3d 3d 30 20 7c  if( pCur->a==0 |
12630 7c 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  | p->rc ) return
12640 3b 20 20 20 2f 2a 20 50 72 69 6f 72 20 6d 65 6d  ;   /* Prior mem
12650 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
12660 61 69 6c 75 72 65 20 2a 2f 0a 20 20 7a 43 6c 61  ailure */.  zCla
12670 73 73 20 3d 20 28 63 68 61 72 2a 29 70 68 6f 6e  ss = (char*)phon
12680 65 74 69 63 48 61 73 68 28 28 75 6e 73 69 67 6e  eticHash((unsign
12690 65 64 20 63 68 61 72 2a 29 7a 51 75 65 72 79 2c  ed char*)zQuery,
126a0 20 6e 51 75 65 72 79 29 3b 0a 20 20 69 66 28 20   nQuery);.  if( 
126b0 7a 43 6c 61 73 73 3d 3d 30 20 29 7b 0a 20 20 20  zClass==0 ){.   
126c0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
126d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72  NOMEM;.    retur
126e0 6e 3b 0a 20 20 7d 0a 20 20 6e 43 6c 61 73 73 20  n;.  }.  nClass 
126f0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 43  = (int)strlen(zC
12700 6c 61 73 73 29 3b 0a 20 20 69 66 28 20 6e 43 6c  lass);.  if( nCl
12710 61 73 73 3e 53 50 45 4c 4c 46 49 58 5f 4d 58 5f  ass>SPELLFIX_MX_
12720 48 41 53 48 2d 32 20 29 7b 0a 20 20 20 20 6e 43  HASH-2 ){.    nC
12730 6c 61 73 73 20 3d 20 53 50 45 4c 4c 46 49 58 5f  lass = SPELLFIX_
12740 4d 58 5f 48 41 53 48 2d 32 3b 0a 20 20 20 20 7a  MX_HASH-2;.    z
12750 43 6c 61 73 73 5b 6e 43 6c 61 73 73 5d 20 3d 20  Class[nClass] = 
12760 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 43 6c  0;.  }.  if( nCl
12770 61 73 73 3c 3d 69 53 63 6f 70 65 20 29 7b 0a 20  ass<=iScope ){. 
12780 20 20 20 69 66 28 20 6e 43 6c 61 73 73 3e 32 20     if( nClass>2 
12790 29 7b 0a 20 20 20 20 20 20 69 53 63 6f 70 65 20  ){.      iScope 
127a0 3d 20 6e 43 6c 61 73 73 2d 31 3b 0a 20 20 20 20  = nClass-1;.    
127b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 63  }else{.      iSc
127c0 6f 70 65 20 3d 20 6e 43 6c 61 73 73 3b 0a 20 20  ope = nClass;.  
127d0 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79    }.  }.  memcpy
127e0 28 7a 48 61 73 68 31 2c 20 7a 43 6c 61 73 73 2c  (zHash1, zClass,
127f0 20 69 53 63 6f 70 65 29 3b 0a 20 20 73 71 6c 69   iScope);.  sqli
12800 74 65 33 5f 66 72 65 65 28 7a 43 6c 61 73 73 29  te3_free(zClass)
12810 3b 0a 20 20 7a 48 61 73 68 31 5b 69 53 63 6f 70  ;.  zHash1[iScop
12820 65 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 63 70 79  e] = 0;.  memcpy
12830 28 7a 48 61 73 68 32 2c 20 7a 48 61 73 68 31 2c  (zHash2, zHash1,
12840 20 69 53 63 6f 70 65 29 3b 0a 20 20 7a 48 61 73   iScope);.  zHas
12850 68 32 5b 69 53 63 6f 70 65 5d 20 3d 20 27 5a 27  h2[iScope] = 'Z'
12860 3b 0a 20 20 7a 48 61 73 68 32 5b 69 53 63 6f 70  ;.  zHash2[iScop
12870 65 2b 31 5d 20 3d 20 30 3b 0a 23 69 66 20 53 50  e+1] = 0;.#if SP
12880 45 4c 4c 46 49 58 5f 4d 58 5f 52 55 4e 3e 31 0a  ELLFIX_MX_RUN>1.
12890 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
128a0 6e 52 75 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRun; i++){.    
128b0 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 7a  if( strcmp(p->az
128c0 50 72 69 6f 72 5b 69 5d 2c 20 7a 48 61 73 68 31  Prior[i], zHash1
128d0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
128e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65   }.#endif.  asse
128f0 72 74 28 20 70 2d 3e 6e 52 75 6e 3c 53 50 45 4c  rt( p->nRun<SPEL
12900 4c 46 49 58 5f 4d 58 5f 52 55 4e 20 29 3b 0a 20  LFIX_MX_RUN );. 
12910 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 50 72 69   memcpy(p->azPri
12920 6f 72 5b 70 2d 3e 6e 52 75 6e 2b 2b 5d 2c 20 7a  or[p->nRun++], z
12930 48 61 73 68 31 2c 20 69 53 63 6f 70 65 2b 31 29  Hash1, iScope+1)
12940 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
12950 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
12960 20 31 2c 20 7a 48 61 73 68 31 2c 20 2d 31 2c 20   1, zHash1, -1, 
12970 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3d 3d  SQLITE_STATIC)==
12980 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
12990 7c 7c 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  || sqlite3_bind_
129a0 74 65 78 74 28 70 53 74 6d 74 2c 20 32 2c 20 7a  text(pStmt, 2, z
129b0 48 61 73 68 32 2c 20 2d 31 2c 20 53 51 4c 49 54  Hash2, -1, SQLIT
129c0 45 5f 53 54 41 54 49 43 29 3d 3d 53 51 4c 49 54  E_STATIC)==SQLIT
129d0 45 5f 4e 4f 4d 45 4d 0a 20 20 29 7b 0a 20 20 20  E_NOMEM.  ){.   
129e0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
129f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72  NOMEM;.    retur
12a00 6e 3b 0a 20 20 7d 0a 23 69 66 20 53 50 45 4c 4c  n;.  }.#if SPELL
12a10 46 49 58 5f 4d 58 5f 52 55 4e 3e 31 0a 20 20 66  FIX_MX_RUN>1.  f
12a20 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e  or(i=0; i<pCur->
12a30 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRow; i++){.    
12a40 69 66 28 20 70 43 75 72 2d 3e 61 5b 69 5d 2e 69  if( pCur->a[i].i
12a50 53 63 6f 72 65 3e 69 57 6f 72 73 74 20 29 7b 0a  Score>iWorst ){.
12a60 20 20 20 20 20 20 69 57 6f 72 73 74 20 3d 20 70        iWorst = p
12a70 43 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72 65  Cur->a[i].iScore
12a80 3b 0a 20 20 20 20 20 20 69 64 78 57 6f 72 73 74  ;.      idxWorst
12a90 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = i;.    }.  }.
12aa0 23 65 6e 64 69 66 0a 20 20 77 68 69 6c 65 28 20  #endif.  while( 
12ab0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
12ac0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
12ad0 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d 61 74 63  ){.    int iMatc
12ae0 68 6c 65 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 69  hlen = -1;.    i
12af0 52 61 6e 6b 20 3d 20 73 71 6c 69 74 65 33 5f 63  Rank = sqlite3_c
12b00 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
12b10 20 32 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   2);.    if( p->
12b20 70 4d 61 74 63 68 53 74 72 33 20 29 7b 0a 20 20  pMatchStr3 ){.  
12b30 20 20 20 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20      int nWord = 
12b40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
12b50 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a  ytes(pStmt, 1);.
12b60 20 20 20 20 20 20 7a 57 6f 72 64 20 3d 20 28 63        zWord = (c
12b70 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
12b80 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
12b90 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
12ba0 69 44 69 73 74 20 3d 20 65 64 69 74 44 69 73 74  iDist = editDist
12bb0 33 43 6f 72 65 28 70 2d 3e 70 4d 61 74 63 68 53  3Core(p->pMatchS
12bc0 74 72 33 2c 20 7a 57 6f 72 64 2c 20 6e 57 6f 72  tr3, zWord, nWor
12bd0 64 2c 20 70 2d 3e 70 4c 61 6e 67 2c 20 26 69 4d  d, p->pLang, &iM
12be0 61 74 63 68 6c 65 6e 29 3b 0a 20 20 20 20 7d 65  atchlen);.    }e
12bf0 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 31 20 3d  lse{.      zK1 =
12c00 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
12c10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
12c20 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 20 20 20  t(pStmt, 3);.   
12c30 20 20 20 69 66 28 20 7a 4b 31 3d 3d 30 20 29 20     if( zK1==0 ) 
12c40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
12c50 69 44 69 73 74 20 3d 20 65 64 69 74 64 69 73 74  iDist = editdist
12c60 31 28 70 2d 3e 7a 50 61 74 74 65 72 6e 2c 20 7a  1(p->zPattern, z
12c70 4b 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  K1, 0);.    }.  
12c80 20 20 69 66 28 20 69 44 69 73 74 3c 30 20 29 7b    if( iDist<0 ){
12c90 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
12ca0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12cb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12cc0 20 20 20 20 70 43 75 72 2d 3e 6e 53 65 61 72 63      pCur->nSearc
12cd0 68 2b 2b 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  h++;.    .    /*
12ce0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 22   If there is a "
12cf0 64 69 73 74 61 6e 63 65 20 3c 20 24 64 69 73 74  distance < $dist
12d00 22 20 6f 72 20 22 64 69 73 74 61 6e 63 65 20 3c  " or "distance <
12d10 3d 20 24 64 69 73 74 22 20 63 6f 6e 73 74 72 61  = $dist" constra
12d20 69 6e 74 2c 0a 20 20 20 20 2a 2a 20 63 68 65 63  int,.    ** chec
12d30 6b 20 69 66 20 74 68 69 73 20 72 6f 77 20 6d 65  k if this row me
12d40 65 74 73 20 69 74 2e 20 49 66 20 6e 6f 74 2c 20  ets it. If not, 
12d50 6a 75 6d 70 20 62 61 63 6b 20 75 70 20 74 6f 20  jump back up to 
12d60 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20  the top of the. 
12d70 20 20 20 2a 2a 20 6c 6f 6f 70 20 74 6f 20 70 72     ** loop to pr
12d80 6f 63 65 73 73 20 74 68 65 20 6e 65 78 74 20 72  ocess the next r
12d90 6f 77 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ow. Otherwise, i
12da0 66 20 74 68 65 20 72 6f 77 20 64 6f 65 73 20 6d  f the row does m
12db0 61 74 63 68 20 74 68 65 0a 20 20 20 20 2a 2a 20  atch the.    ** 
12dc0 64 69 73 74 61 6e 63 65 20 63 6f 6e 73 74 72 61  distance constra
12dd0 69 6e 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68  int, check if th
12de0 65 20 70 43 75 72 2d 3e 61 5b 5d 20 61 72 72 61  e pCur->a[] arra
12df0 79 20 69 73 20 61 6c 72 65 61 64 79 20 66 75 6c  y is already ful
12e00 6c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20  l..    ** If it 
12e10 69 73 20 61 6e 64 20 6e 6f 20 65 78 70 6c 69 63  is and no explic
12e20 69 74 20 22 74 6f 70 20 3d 20 3f 22 20 63 6f 6e  it "top = ?" con
12e30 73 74 72 61 69 6e 74 20 77 61 73 20 70 72 65 73  straint was pres
12e40 65 6e 74 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ent in the.    *
12e50 2a 20 71 75 65 72 79 2c 20 67 72 6f 77 20 74 68  * query, grow th
12e60 65 20 61 72 72 61 79 20 74 6f 20 65 6e 73 75 72  e array to ensur
12e70 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
12e80 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
12e90 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
12ea0 28 20 28 70 2d 3e 69 4d 61 78 44 69 73 74 3e 3d  ( (p->iMaxDist>=
12eb0 30 29 3d 3d 28 28 70 43 75 72 2d 3e 69 64 78 4e  0)==((pCur->idxN
12ec0 75 6d 20 26 20 53 50 45 4c 4c 46 49 58 5f 49 44  um & SPELLFIX_ID
12ed0 58 4e 55 4d 5f 44 49 53 54 29 20 3f 20 31 20 3a  XNUM_DIST) ? 1 :
12ee0 20 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70   0) );.    if( p
12ef0 2d 3e 69 4d 61 78 44 69 73 74 3e 3d 30 20 29 7b  ->iMaxDist>=0 ){
12f00 0a 20 20 20 20 20 20 69 66 28 20 69 44 69 73 74  .      if( iDist
12f10 3e 70 2d 3e 69 4d 61 78 44 69 73 74 20 29 20 63  >p->iMaxDist ) c
12f20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
12f30 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3e 3d 70  f( pCur->nRow>=p
12f40 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 26 26 20 28  Cur->nAlloc && (
12f50 70 43 75 72 2d 3e 69 64 78 4e 75 6d 20 26 20 53  pCur->idxNum & S
12f60 50 45 4c 4c 46 49 58 5f 49 44 58 4e 55 4d 5f 54  PELLFIX_IDXNUM_T
12f70 4f 50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  OP)==0 ){.      
12f80 20 20 73 70 65 6c 6c 66 69 78 31 52 65 73 69 7a    spellfix1Resiz
12f90 65 43 75 72 73 6f 72 28 70 43 75 72 2c 20 70 43  eCursor(pCur, pC
12fa0 75 72 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31  ur->nAlloc*2 + 1
12fb0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
12fc0 70 43 75 72 2d 3e 61 3d 3d 30 20 29 20 62 72 65  pCur->a==0 ) bre
12fd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
12fe0 7d 0a 0a 20 20 20 20 69 53 63 6f 72 65 20 3d 20  }..    iScore = 
12ff0 73 70 65 6c 6c 66 69 78 31 53 63 6f 72 65 28 69  spellfix1Score(i
13000 44 69 73 74 2c 69 52 61 6e 6b 29 3b 0a 20 20 20  Dist,iRank);.   
13010 20 69 66 28 20 70 43 75 72 2d 3e 6e 52 6f 77 3c   if( pCur->nRow<
13020 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  pCur->nAlloc ){.
13030 20 20 20 20 20 20 69 64 78 20 3d 20 70 43 75 72        idx = pCur
13040 2d 3e 6e 52 6f 77 3b 0a 20 20 20 20 7d 65 6c 73  ->nRow;.    }els
13050 65 20 69 66 28 20 69 53 63 6f 72 65 3c 69 57 6f  e if( iScore<iWo
13060 72 73 74 20 29 7b 0a 20 20 20 20 20 20 69 64 78  rst ){.      idx
13070 20 3d 20 69 64 78 57 6f 72 73 74 3b 0a 20 20 20   = idxWorst;.   
13080 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13090 70 43 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f  pCur->a[idx].zWo
130a0 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rd);.    }else{.
130b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
130c0 20 20 20 20 7d 0a 0a 20 20 20 20 70 43 75 72 2d      }..    pCur-
130d0 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64 20 3d 20  >a[idx].zWord = 
130e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
130f0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f  "%s", sqlite3_co
13100 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
13110 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70 43   1));.    if( pC
13120 75 72 2d 3e 61 5b 69 64 78 5d 2e 7a 57 6f 72 64  ur->a[idx].zWord
13130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
13140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13150 4d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  M;.      break;.
13160 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
13170 61 5b 69 64 78 5d 2e 69 52 6f 77 69 64 20 3d 20  a[idx].iRowid = 
13180 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
13190 6e 74 36 34 28 70 53 74 6d 74 2c 20 30 29 3b 0a  nt64(pStmt, 0);.
131a0 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d      pCur->a[idx]
131b0 2e 69 52 61 6e 6b 20 3d 20 69 52 61 6e 6b 3b 0a  .iRank = iRank;.
131c0 20 20 20 20 70 43 75 72 2d 3e 61 5b 69 64 78 5d      pCur->a[idx]
131d0 2e 69 44 69 73 74 61 6e 63 65 20 3d 20 69 44 69  .iDistance = iDi
131e0 73 74 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 5b  st;.    pCur->a[
131f0 69 64 78 5d 2e 69 53 63 6f 72 65 20 3d 20 69 53  idx].iScore = iS
13200 63 6f 72 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e  core;.    pCur->
13210 61 5b 69 64 78 5d 2e 69 4d 61 74 63 68 6c 65 6e  a[idx].iMatchlen
13220 20 3d 20 69 4d 61 74 63 68 6c 65 6e 3b 0a 20 20   = iMatchlen;.  
13230 20 20 6d 65 6d 63 70 79 28 70 43 75 72 2d 3e 61    memcpy(pCur->a
13240 5b 69 64 78 5d 2e 7a 48 61 73 68 2c 20 7a 48 61  [idx].zHash, zHa
13250 73 68 31 2c 20 69 53 63 6f 70 65 2b 31 29 3b 0a  sh1, iScope+1);.
13260 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 52      if( pCur->nR
13270 6f 77 3c 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63 20  ow<pCur->nAlloc 
13280 29 20 70 43 75 72 2d 3e 6e 52 6f 77 2b 2b 3b 0a  ) pCur->nRow++;.
13290 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 6e 52      if( pCur->nR
132a0 6f 77 3d 3d 70 43 75 72 2d 3e 6e 41 6c 6c 6f 63  ow==pCur->nAlloc
132b0 20 29 7b 0a 20 20 20 20 20 20 69 57 6f 72 73 74   ){.      iWorst
132c0 20 3d 20 70 43 75 72 2d 3e 61 5b 30 5d 2e 69 53   = pCur->a[0].iS
132d0 63 6f 72 65 3b 0a 20 20 20 20 20 20 69 64 78 57  core;.      idxW
132e0 6f 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  orst = 0;.      
132f0 66 6f 72 28 69 3d 31 3b 20 69 3c 70 43 75 72 2d  for(i=1; i<pCur-
13300 3e 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nRow; i++){.   
13310 20 20 20 20 20 69 53 63 6f 72 65 20 3d 20 70 43       iScore = pC
13320 75 72 2d 3e 61 5b 69 5d 2e 69 53 63 6f 72 65 3b  ur->a[i].iScore;
13330 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 57 6f  .        if( iWo
13340 72 73 74 3c 69 53 63 6f 72 65 20 29 7b 0a 20 20  rst<iScore ){.  
13350 20 20 20 20 20 20 20 20 69 57 6f 72 73 74 20 3d          iWorst =
13360 20 69 53 63 6f 72 65 3b 0a 20 20 20 20 20 20 20   iScore;.       
13370 20 20 20 69 64 78 57 6f 72 73 74 20 3d 20 69 3b     idxWorst = i;
13380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13390 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
133a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
133b0 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
133c0 72 63 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b  rc ) p->rc = rc;
133d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  .}../*.** This v
133e0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 78 46  ersion of the xF
133f0 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 77 6f 72  ilter method wor
13400 6b 20 69 66 20 74 68 65 20 4d 41 54 43 48 20 74  k if the MATCH t
13410 65 72 6d 20 69 73 20 70 72 65 73 65 6e 74 0a 2a  erm is present.*
13420 2a 20 61 6e 64 20 77 65 20 61 72 65 20 64 6f 69  * and we are doi
13430 6e 67 20 61 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74  ng a scan..*/.st
13440 61 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69  atic int spellfi
13450 78 31 46 69 6c 74 65 72 46 6f 72 4d 61 74 63 68  x1FilterForMatch
13460 28 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  (.  spellfix1_cu
13470 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20 20 69 6e  rsor *pCur,.  in
13480 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
13490 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
134a0 7b 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 20 3d  {.  int idxNum =
134b0 20 70 43 75 72 2d 3e 69 64 78 4e 75 6d 3b 0a 20   pCur->idxNum;. 
134c0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
134d0 63 68 61 72 20 2a 7a 4d 61 74 63 68 54 68 69 73  char *zMatchThis
134e0 3b 20 20 20 2f 2a 20 52 48 53 20 6f 66 20 74 68  ;   /* RHS of th
134f0 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72  e MATCH operator
13500 20 2a 2f 0a 20 20 45 64 69 74 44 69 73 74 33 46   */.  EditDist3F
13510 72 6f 6d 53 74 72 69 6e 67 20 2a 70 4d 61 74 63  romString *pMatc
13520 68 53 74 72 33 20 3d 20 30 3b 20 2f 2a 20 7a 4d  hStr3 = 0; /* zM
13530 61 74 63 68 54 68 69 73 20 61 73 20 61 6e 20 65  atchThis as an e
13540 64 69 74 64 69 73 74 20 73 74 72 69 6e 67 20 2a  ditdist string *
13550 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 74 65  /.  char *zPatte
13560 72 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rn;             
13570 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c         /* Transl
13580 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 7a 4d 61  iteration of zMa
13590 74 63 68 54 68 69 73 20 2a 2f 0a 20 20 69 6e 74  tchThis */.  int
135a0 20 6e 50 61 74 74 65 72 6e 3b 20 20 20 20 20 20   nPattern;      
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135c0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 50 61  /* Length of zPa
135d0 74 74 65 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ttern */.  int i
135e0 4c 69 6d 69 74 20 3d 20 32 30 3b 20 20 20 20 20  Limit = 20;     
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13600 20 4d 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 72   Max number of r
13610 6f 77 73 20 6f 66 20 6f 75 74 70 75 74 20 2a 2f  ows of output */
13620 0a 20 20 69 6e 74 20 69 53 63 6f 70 65 20 3d 20  .  int iScope = 
13630 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
13640 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 69        /* Use thi
13650 73 20 6d 61 6e 79 20 63 68 61 72 61 63 74 65 72  s many character
13660 73 20 6f 66 20 7a 43 6c 61 73 73 20 2a 2f 0a 20  s of zClass */. 
13670 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 30 3b 20   int iLang = 0; 
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 20 2f 2a 20 4c 61 6e 67 75 61 67 65 20      /* Language 
136a0 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
136b0 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
136d0 53 51 4c 20 6f 66 20 73 68 61 64 6f 77 20 74 61  SQL of shadow ta
136e0 62 6c 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  ble query */.  s
136f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13700 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  mt = 0;         
13710 20 20 2f 2a 20 53 68 61 64 6f 77 20 74 61 62 6c    /* Shadow tabl
13720 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  e query */.  int
13730 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13750 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
13760 2f 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 31 3b  /.  int idx = 1;
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
13790 76 61 69 6c 61 62 6c 65 20 66 69 6c 74 65 72 20  vailable filter 
137a0 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 73  parameter */.  s
137b0 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70  pellfix1_vtab *p
137c0 20 3d 20 70 43 75 72 2d 3e 70 56 54 61 62 3b 20   = pCur->pVTab; 
137d0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
137e0 20 74 61 62 6c 65 20 74 68 61 74 20 6f 77 6e 73   table that owns
137f0 20 70 43 75 72 20 2a 2f 0a 20 20 4d 61 74 63 68   pCur */.  Match
13800 51 75 65 72 79 20 78 3b 20 20 20 20 20 20 20 20  Query x;        
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13820 20 46 6f 72 20 70 61 73 73 69 6e 67 20 69 6e 66   For passing inf
13830 6f 20 74 6f 20 52 75 6e 51 75 65 72 79 28 29 20  o to RunQuery() 
13840 2a 2f 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  */..  /* Load th
13850 65 20 63 6f 73 74 20 74 61 62 6c 65 20 69 66 20  e cost table if 
13860 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65  we have not alre
13870 61 64 79 20 64 6f 6e 65 20 73 6f 20 2a 2f 0a 20  ady done so */. 
13880 20 69 66 28 20 70 2d 3e 7a 43 6f 73 74 54 61 62   if( p->zCostTab
13890 6c 65 21 3d 30 20 26 26 20 70 2d 3e 70 43 6f 6e  le!=0 && p->pCon
138a0 66 69 67 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70  fig3==0 ){.    p
138b0 2d 3e 70 43 6f 6e 66 69 67 33 20 3d 20 73 71 6c  ->pConfig3 = sql
138c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
138d0 69 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e 66 69 67  izeof(p->pConfig
138e0 33 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  3[0]) );.    if(
138f0 20 70 2d 3e 70 43 6f 6e 66 69 67 33 3d 3d 30 20   p->pConfig3==0 
13900 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13910 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65  NOMEM;.    memse
13920 74 28 70 2d 3e 70 43 6f 6e 66 69 67 33 2c 20 30  t(p->pConfig3, 0
13930 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 70 43 6f 6e  , sizeof(p->pCon
13940 66 69 67 33 5b 30 5d 29 29 3b 0a 20 20 20 20 72  fig3[0]));.    r
13950 63 20 3d 20 65 64 69 74 44 69 73 74 33 43 6f 6e  c = editDist3Con
13960 66 69 67 4c 6f 61 64 28 70 2d 3e 70 43 6f 6e 66  figLoad(p->pConf
13970 69 67 33 2c 20 70 2d 3e 64 62 2c 20 70 2d 3e 7a  ig3, p->db, p->z
13980 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  CostTable);.    
13990 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
139a0 72 63 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  rc;.  }.  memset
139b0 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78  (&x, 0, sizeof(x
139c0 29 29 3b 0a 20 20 78 2e 69 53 63 6f 70 65 20 3d  ));.  x.iScope =
139d0 20 33 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20   3;  /* Default 
139e0 73 63 6f 70 65 20 69 66 20 6e 6f 6e 65 20 73 70  scope if none sp
139f0 65 63 69 66 69 65 64 20 62 79 20 22 57 48 45 52  ecified by "WHER
13a00 45 20 73 63 6f 70 65 3d 4e 22 20 2a 2f 0a 20 20  E scope=N" */.  
13a10 78 2e 69 4d 61 78 44 69 73 74 20 3d 20 2d 31 3b  x.iMaxDist = -1;
13a20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
13a30 6c 6f 77 65 64 20 65 64 69 74 20 64 69 73 74 61  lowed edit dista
13a40 6e 63 65 20 2a 2f 0a 0a 20 20 69 66 28 20 69 64  nce */..  if( id
13a50 78 4e 75 6d 26 32 20 29 7b 0a 20 20 20 20 69 4c  xNum&2 ){.    iL
13a60 61 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ang = sqlite3_va
13a70 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 69 64 78  lue_int(argv[idx
13a80 2b 2b 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ++]);.  }.  if( 
13a90 69 64 78 4e 75 6d 26 34 20 29 7b 0a 20 20 20 20  idxNum&4 ){.    
13aa0 69 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  iLimit = sqlite3
13ab0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
13ac0 69 64 78 2b 2b 5d 29 3b 0a 20 20 20 20 69 66 28  idx++]);.    if(
13ad0 20 69 4c 69 6d 69 74 3c 31 20 29 20 69 4c 69 6d   iLimit<1 ) iLim
13ae0 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  it = 1;.  }.  if
13af0 28 20 69 64 78 4e 75 6d 26 38 20 29 7b 0a 20 20  ( idxNum&8 ){.  
13b00 20 20 78 2e 69 53 63 6f 70 65 20 3d 20 73 71 6c    x.iScope = sql
13b10 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
13b20 72 67 76 5b 69 64 78 2b 2b 5d 29 3b 0a 20 20 20  rgv[idx++]);.   
13b30 20 69 66 28 20 78 2e 69 53 63 6f 70 65 3c 31 20   if( x.iScope<1 
13b40 29 20 78 2e 69 53 63 6f 70 65 20 3d 20 31 3b 0a  ) x.iScope = 1;.
13b50 20 20 20 20 69 66 28 20 78 2e 69 53 63 6f 70 65      if( x.iScope
13b60 3e 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53  >SPELLFIX_MX_HAS
13b70 48 2d 32 20 29 20 78 2e 69 53 63 6f 70 65 20 3d  H-2 ) x.iScope =
13b80 20 53 50 45 4c 4c 46 49 58 5f 4d 58 5f 48 41 53   SPELLFIX_MX_HAS
13b90 48 2d 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  H-2;.  }.  if( i
13ba0 64 78 4e 75 6d 26 28 31 36 7c 33 32 29 20 29 7b  dxNum&(16|32) ){
13bb0 0a 20 20 20 20 78 2e 69 4d 61 78 44 69 73 74 20  .    x.iMaxDist 
13bc0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13bd0 69 6e 74 28 61 72 67 76 5b 69 64 78 2b 2b 5d 29  int(argv[idx++])
13be0 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 75 6d  ;.    if( idxNum
13bf0 26 31 36 20 29 20 78 2e 69 4d 61 78 44 69 73 74  &16 ) x.iMaxDist
13c00 2d 2d 3b 0a 20 20 20 20 69 66 28 20 78 2e 69 4d  --;.    if( x.iM
13c10 61 78 44 69 73 74 3c 30 20 29 20 78 2e 69 4d 61  axDist<0 ) x.iMa
13c20 78 44 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  xDist = 0;.  }. 
13c30 20 73 70 65 6c 6c 66 69 78 31 52 65 73 65 74 43   spellfix1ResetC
13c40 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 73  ursor(pCur);.  s
13c50 70 65 6c 6c 66 69 78 31 52 65 73 69 7a 65 43 75  pellfix1ResizeCu
13c60 72 73 6f 72 28 70 43 75 72 2c 20 69 4c 69 6d 69  rsor(pCur, iLimi
13c70 74 29 3b 0a 20 20 7a 4d 61 74 63 68 54 68 69 73  t);.  zMatchThis
13c80 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
13c90 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
13ca0 20 20 69 66 28 20 7a 4d 61 74 63 68 54 68 69 73    if( zMatchThis
13cb0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13cc0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
13cd0 3e 70 43 6f 6e 66 69 67 33 20 29 7b 0a 20 20 20  >pConfig3 ){.   
13ce0 20 78 2e 70 4c 61 6e 67 20 3d 20 65 64 69 74 44   x.pLang = editD
13cf0 69 73 74 33 46 69 6e 64 4c 61 6e 67 28 70 2d 3e  ist3FindLang(p->
13d00 70 43 6f 6e 66 69 67 33 2c 20 69 4c 61 6e 67 29  pConfig3, iLang)
13d10 3b 0a 20 20 20 20 70 4d 61 74 63 68 53 74 72 33  ;.    pMatchStr3
13d20 20 3d 20 65 64 69 74 44 69 73 74 33 46 72 6f 6d   = editDist3From
13d30 53 74 72 69 6e 67 4e 65 77 28 78 2e 70 4c 61 6e  StringNew(x.pLan
13d40 67 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  g, (const char*)
13d50 7a 4d 61 74 63 68 54 68 69 73 2c 20 2d 31 29 3b  zMatchThis, -1);
13d60 0a 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 53  .    if( pMatchS
13d70 74 72 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr3==0 ){.      
13d80 78 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  x.rc = SQLITE_NO
13d90 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
13da0 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20 20 20  filter_exit;.   
13db0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13dc0 78 2e 70 4c 61 6e 67 20 3d 20 30 3b 0a 20 20 7d  x.pLang = 0;.  }
13dd0 0a 20 20 7a 50 61 74 74 65 72 6e 20 3d 20 28 63  .  zPattern = (c
13de0 68 61 72 2a 29 74 72 61 6e 73 6c 69 74 65 72 61  har*)translitera
13df0 74 65 28 7a 4d 61 74 63 68 54 68 69 73 2c 20 73  te(zMatchThis, s
13e00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
13e10 65 73 28 61 72 67 76 5b 30 5d 29 29 3b 0a 20 20  es(argv[0]));.  
13e20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
13e30 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20  r->zPattern);.  
13e40 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 20 3d  pCur->zPattern =
13e50 20 7a 50 61 74 74 65 72 6e 3b 0a 20 20 69 66 28   zPattern;.  if(
13e60 20 7a 50 61 74 74 65 72 6e 3d 3d 30 20 29 7b 0a   zPattern==0 ){.
13e70 20 20 20 20 78 2e 72 63 20 3d 20 53 51 4c 49 54      x.rc = SQLIT
13e80 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
13e90 6f 20 66 69 6c 74 65 72 5f 65 78 69 74 3b 0a 20  o filter_exit;. 
13ea0 20 7d 0a 20 20 6e 50 61 74 74 65 72 6e 20 3d 20   }.  nPattern = 
13eb0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 50 61 74  (int)strlen(zPat
13ec0 74 65 72 6e 29 3b 0a 20 20 69 66 28 20 7a 50 61  tern);.  if( zPa
13ed0 74 74 65 72 6e 5b 6e 50 61 74 74 65 72 6e 2d 31  ttern[nPattern-1
13ee0 5d 3d 3d 27 2a 27 20 29 20 6e 50 61 74 74 65 72  ]=='*' ) nPatter
13ef0 6e 2d 2d 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  n--;.  zSql = sq
13f00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
13f10 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 20      "SELECT id, 
13f20 77 6f 72 64 2c 20 72 61 6e 6b 2c 20 6b 31 22 0a  word, rank, k1".
13f30 20 20 20 20 20 22 20 20 46 52 4f 4d 20 5c 22 25       "  FROM \"%
13f40 77 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22  w\".\"%w_vocab\"
13f50 22 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 6c  ".     " WHERE l
13f60 61 6e 67 69 64 3d 25 64 20 41 4e 44 20 6b 32 3e  angid=%d AND k2>
13f70 3d 3f 31 20 41 4e 44 20 6b 32 3c 3f 32 22 2c 0a  =?1 AND k2<?2",.
13f80 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c       p->zDbName,
13f90 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c 20   p->zTableName, 
13fa0 69 4c 61 6e 67 0a 20 20 29 3b 0a 20 20 69 66 28  iLang.  );.  if(
13fb0 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zSql==0 ){.    
13fc0 78 2e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  x.rc = SQLITE_NO
13fd0 4d 45 4d 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  MEM;.    pStmt =
13fe0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 66 69 6c   0;.    goto fil
13ff0 74 65 72 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  ter_exit;.  }.  
14000 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
14010 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
14020 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
14030 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
14040 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 70 43 75  ree(zSql);.  pCu
14050 72 2d 3e 69 4c 61 6e 67 20 3d 20 69 4c 61 6e 67  r->iLang = iLang
14060 3b 0a 20 20 78 2e 70 43 75 72 20 3d 20 70 43 75  ;.  x.pCur = pCu
14070 72 3b 0a 20 20 78 2e 70 53 74 6d 74 20 3d 20 70  r;.  x.pStmt = p
14080 53 74 6d 74 3b 0a 20 20 78 2e 7a 50 61 74 74 65  Stmt;.  x.zPatte
14090 72 6e 20 3d 20 7a 50 61 74 74 65 72 6e 3b 0a 20  rn = zPattern;. 
140a0 20 78 2e 6e 50 61 74 74 65 72 6e 20 3d 20 6e 50   x.nPattern = nP
140b0 61 74 74 65 72 6e 3b 0a 20 20 78 2e 70 4d 61 74  attern;.  x.pMat
140c0 63 68 53 74 72 33 20 3d 20 70 4d 61 74 63 68 53  chStr3 = pMatchS
140d0 74 72 33 3b 0a 20 20 78 2e 69 4c 61 6e 67 20 3d  tr3;.  x.iLang =
140e0 20 69 4c 61 6e 67 3b 0a 20 20 78 2e 72 63 20 3d   iLang;.  x.rc =
140f0 20 72 63 3b 0a 20 20 78 2e 70 43 6f 6e 66 69 67   rc;.  x.pConfig
14100 33 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 33 3b  3 = p->pConfig3;
14110 0a 20 20 69 66 28 20 78 2e 72 63 3d 3d 53 51 4c  .  if( x.rc==SQL
14120 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 70  ITE_OK ){.    sp
14130 65 6c 6c 66 69 78 31 52 75 6e 51 75 65 72 79 28  ellfix1RunQuery(
14140 26 78 2c 20 7a 50 61 74 74 65 72 6e 2c 20 6e 50  &x, zPattern, nP
14150 61 74 74 65 72 6e 29 3b 0a 20 20 7d 0a 0a 20 20  attern);.  }..  
14160 69 66 28 20 70 43 75 72 2d 3e 61 20 29 7b 0a 20  if( pCur->a ){. 
14170 20 20 20 71 73 6f 72 74 28 70 43 75 72 2d 3e 61     qsort(pCur->a
14180 2c 20 70 43 75 72 2d 3e 6e 52 6f 77 2c 20 73 69  , pCur->nRow, si
14190 7a 65 6f 66 28 70 43 75 72 2d 3e 61 5b 30 5d 29  zeof(pCur->a[0])
141a0 2c 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 43 6f  , spellfix1RowCo
141b0 6d 70 61 72 65 29 3b 0a 20 20 20 20 70 43 75 72  mpare);.    pCur
141c0 2d 3e 69 54 6f 70 20 3d 20 69 4c 69 6d 69 74 3b  ->iTop = iLimit;
141d0 0a 20 20 20 20 70 43 75 72 2d 3e 69 53 63 6f 70  .    pCur->iScop
141e0 65 20 3d 20 69 53 63 6f 70 65 3b 0a 20 20 7d 65  e = iScope;.  }e
141f0 6c 73 65 7b 0a 20 20 20 20 78 2e 72 63 20 3d 20  lse{.    x.rc = 
14200 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14210 7d 0a 0a 66 69 6c 74 65 72 5f 65 78 69 74 3a 0a  }..filter_exit:.
14220 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
14230 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 65 64 69  ze(pStmt);.  edi
14240 74 44 69 73 74 33 46 72 6f 6d 53 74 72 69 6e 67  tDist3FromString
14250 44 65 6c 65 74 65 28 70 4d 61 74 63 68 53 74 72  Delete(pMatchStr
14260 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 78 2e 72  3);.  return x.r
14270 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
14280 20 76 65 72 73 69 6f 6e 20 6f 66 20 78 46 69 6c   version of xFil
14290 74 65 72 20 68 61 6e 64 6c 65 73 20 61 20 66 75  ter handles a fu
142a0 6c 6c 2d 74 61 62 6c 65 20 73 63 61 6e 20 63 61  ll-table scan ca
142b0 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
142c0 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72   spellfix1Filter
142d0 46 6f 72 46 75 6c 6c 53 63 61 6e 28 0a 20 20 73  ForFullScan(.  s
142e0 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 20  pellfix1_cursor 
142f0 2a 70 43 75 72 2c 0a 20 20 69 6e 74 20 61 72 67  *pCur,.  int arg
14300 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
14310 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
14320 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14330 4b 3b 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 20  K;.  int idxNum 
14340 3d 20 70 43 75 72 2d 3e 69 64 78 4e 75 6d 3b 0a  = pCur->idxNum;.
14350 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
14360 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a  spellfix1_vtab *
14370 70 56 54 61 62 20 3d 20 70 43 75 72 2d 3e 70 56  pVTab = pCur->pV
14380 54 61 62 3b 0a 20 20 73 70 65 6c 6c 66 69 78 31  Tab;.  spellfix1
14390 52 65 73 65 74 43 75 72 73 6f 72 28 70 43 75 72  ResetCursor(pCur
143a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
143b0 4e 75 6d 3d 3d 30 20 7c 7c 20 69 64 78 4e 75 6d  Num==0 || idxNum
143c0 3d 3d 36 34 20 29 3b 0a 20 20 7a 53 71 6c 20 3d  ==64 );.  zSql =
143d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
143e0 28 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 77  (.     "SELECT w
143f0 6f 72 64 2c 20 72 61 6e 6b 2c 20 4e 55 4c 4c 2c  ord, rank, NULL,
14400 20 6c 61 6e 67 69 64 2c 20 69 64 20 46 52 4f 4d   langid, id FROM
14410 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76 6f 63   \"%w\".\"%w_voc
14420 61 62 5c 22 25 73 22 2c 0a 20 20 20 20 20 70 56  ab\"%s",.     pV
14430 54 61 62 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 56  Tab->zDbName, pV
14440 54 61 62 2d 3e 7a 54 61 62 6c 65 4e 61 6d 65 2c  Tab->zTableName,
14450 0a 20 20 20 20 20 28 28 69 64 78 4e 75 6d 20 26  .     ((idxNum &
14460 20 36 34 29 20 3f 20 22 20 57 48 45 52 45 20 72   64) ? " WHERE r
14470 6f 77 69 64 3d 3f 22 20 3a 20 22 22 29 0a 20 20  owid=?" : "").  
14480 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
14490 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
144a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 73  _NOMEM;.  rc = s
144b0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
144c0 32 28 70 56 54 61 62 2d 3e 64 62 2c 20 7a 53 71  2(pVTab->db, zSq
144d0 6c 2c 20 2d 31 2c 20 26 70 43 75 72 2d 3e 70 46  l, -1, &pCur->pF
144e0 75 6c 6c 53 63 61 6e 2c 20 30 29 3b 0a 20 20 73  ullScan, 0);.  s
144f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
14500 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
14510 49 54 45 5f 4f 4b 20 26 26 20 28 69 64 78 4e 75  ITE_OK && (idxNu
14520 6d 20 26 20 36 34 29 20 29 7b 0a 20 20 20 20 61  m & 64) ){.    a
14530 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
14540 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
14550 65 33 5f 62 69 6e 64 5f 76 61 6c 75 65 28 70 43  e3_bind_value(pC
14560 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 2c 20 31  ur->pFullScan, 1
14570 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a  , argv[0]);.  }.
14580 20 20 70 43 75 72 2d 3e 6e 52 6f 77 20 3d 20 70    pCur->nRow = p
14590 43 75 72 2d 3e 69 52 6f 77 20 3d 20 30 3b 0a 20  Cur->iRow = 0;. 
145a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
145b0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
145c0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43 75 72  qlite3_step(pCur
145d0 2d 3e 70 46 75 6c 6c 53 63 61 6e 29 3b 0a 20 20  ->pFullScan);.  
145e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
145f0 5f 52 4f 57 20 29 7b 20 70 43 75 72 2d 3e 69 52  _ROW ){ pCur->iR
14600 6f 77 20 3d 20 2d 31 3b 20 72 63 20 3d 20 53 51  ow = -1; rc = SQ
14610 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 20 20 20 20 69  LITE_OK; }.    i
14620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
14630 4e 45 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54  NE ){ rc = SQLIT
14640 45 5f 4f 4b 3b 20 7d 0a 20 20 7d 65 6c 73 65 7b  E_OK; }.  }else{
14650 0a 20 20 20 20 70 43 75 72 2d 3e 69 52 6f 77 20  .    pCur->iRow 
14660 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
14670 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
14680 43 61 6c 6c 65 64 20 74 6f 20 22 72 65 77 69 6e  Called to "rewin
14690 64 22 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b  d" a cursor back
146a0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
146b0 67 20 73 6f 20 74 68 61 74 0a 2a 2a 20 69 74 20  g so that.** it 
146c0 73 74 61 72 74 73 20 69 74 73 20 6f 75 74 70 75  starts its outpu
146d0 74 20 6f 76 65 72 20 61 67 61 69 6e 2e 20 20 41  t over again.  A
146e0 6c 77 61 79 73 20 63 61 6c 6c 65 64 20 61 74 20  lways called at 
146f0 6c 65 61 73 74 20 6f 6e 63 65 0a 2a 2a 20 70 72  least once.** pr
14700 69 6f 72 20 74 6f 20 61 6e 79 20 73 70 65 6c 6c  ior to any spell
14710 66 69 78 31 43 6f 6c 75 6d 6e 2c 20 73 70 65 6c  fix1Column, spel
14720 6c 66 69 78 31 52 6f 77 69 64 2c 20 6f 72 20 73  lfix1Rowid, or s
14730 70 65 6c 6c 66 69 78 31 45 6f 66 20 63 61 6c 6c  pellfix1Eof call
14740 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14750 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65 72 28  spellfix1Filter(
14760 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  .  sqlite3_vtab_
14770 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 0a 20 20  cursor *cur, .  
14780 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73  int idxNum, cons
14790 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a  t char *idxStr,.
147a0 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69    int argc, sqli
147b0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
147c0 0a 29 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f  .){.  spellfix1_
147d0 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
147e0 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72  spellfix1_cursor
147f0 20 2a 29 63 75 72 3b 0a 20 20 69 6e 74 20 72 63   *)cur;.  int rc
14800 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 4e 75 6d  ;.  pCur->idxNum
14810 20 3d 20 69 64 78 4e 75 6d 3b 0a 20 20 69 66 28   = idxNum;.  if(
14820 20 69 64 78 4e 75 6d 20 26 20 31 20 29 7b 0a 20   idxNum & 1 ){. 
14830 20 20 20 72 63 20 3d 20 73 70 65 6c 6c 66 69 78     rc = spellfix
14840 31 46 69 6c 74 65 72 46 6f 72 4d 61 74 63 68 28  1FilterForMatch(
14850 70 43 75 72 2c 20 61 72 67 63 2c 20 61 72 67 76  pCur, argc, argv
14860 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14870 72 63 20 3d 20 73 70 65 6c 6c 66 69 78 31 46 69  rc = spellfix1Fi
14880 6c 74 65 72 46 6f 72 46 75 6c 6c 53 63 61 6e 28  lterForFullScan(
14890 70 43 75 72 2c 20 61 72 67 63 2c 20 61 72 67 76  pCur, argc, argv
148a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
148b0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  rc;.}.../*.** Ad
148c0 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 74  vance a cursor t
148d0 6f 20 69 74 73 20 6e 65 78 74 20 72 6f 77 20 6f  o its next row o
148e0 66 20 6f 75 74 70 75 74 0a 2a 2f 0a 73 74 61 74  f output.*/.stat
148f0 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
14900 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61  Next(sqlite3_vta
14910 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
14920 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73    spellfix1_curs
14930 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c  or *pCur = (spel
14940 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 29 63  lfix1_cursor *)c
14950 75 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ur;.  int rc = S
14960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
14970 70 43 75 72 2d 3e 69 52 6f 77 20 3c 20 70 43 75  pCur->iRow < pCu
14980 72 2d 3e 6e 52 6f 77 20 29 7b 0a 20 20 20 20 69  r->nRow ){.    i
14990 66 28 20 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63  f( pCur->pFullSc
149a0 61 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  an ){.      rc =
149b0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 43   sqlite3_step(pC
149c0 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e 29 3b 0a  ur->pFullScan);.
149d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
149e0 4c 49 54 45 5f 52 4f 57 20 29 20 70 43 75 72 2d  LITE_ROW ) pCur-
149f0 3e 69 52 6f 77 20 3d 20 70 43 75 72 2d 3e 6e 52  >iRow = pCur->nR
14a00 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ow;.      if( rc
14a10 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20  ==SQLITE_ROW || 
14a20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
14a30 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14a40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14a50 20 20 20 70 43 75 72 2d 3e 69 52 6f 77 2b 2b 3b     pCur->iRow++;
14a60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14a70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14a80 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
14a90 77 65 20 61 72 65 20 61 74 20 74 68 65 20 65 6e  we are at the en
14aa0 64 2d 6f 66 2d 66 69 6c 65 0a 2a 2f 0a 73 74 61  d-of-file.*/.sta
14ab0 74 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78  tic int spellfix
14ac0 31 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74 61  1Eof(sqlite3_vta
14ad0 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
14ae0 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72 73    spellfix1_curs
14af0 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65 6c  or *pCur = (spel
14b00 6c 66 69 78 31 5f 63 75 72 73 6f 72 20 2a 29 63  lfix1_cursor *)c
14b10 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  ur;.  return pCu
14b20 72 2d 3e 69 52 6f 77 3e 3d 70 43 75 72 2d 3e 6e  r->iRow>=pCur->n
14b30 52 6f 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Row;.}../*.** Re
14b40 74 75 72 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  turn columns fro
14b50 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  m the current ro
14b60 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
14b70 20 73 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e   spellfix1Column
14b80 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
14b90 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 0a 20 20  _cursor *cur,.  
14ba0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
14bb0 2a 63 74 78 2c 0a 20 20 69 6e 74 20 69 0a 29 7b  *ctx,.  int i.){
14bc0 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75 72  .  spellfix1_cur
14bd0 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70 65  sor *pCur = (spe
14be0 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 2a 29 63  llfix1_cursor*)c
14bf0 75 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  ur;.  if( pCur->
14c00 70 46 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20 20  pFullScan ){.   
14c10 20 69 66 28 20 69 3c 3d 53 50 45 4c 4c 46 49 58   if( i<=SPELLFIX
14c20 5f 43 4f 4c 5f 4c 41 4e 47 49 44 20 29 7b 0a 20  _COL_LANGID ){. 
14c30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
14c40 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 73  ult_value(ctx, s
14c50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 76 61  qlite3_column_va
14c60 6c 75 65 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53  lue(pCur->pFullS
14c70 63 61 6e 2c 20 69 29 29 3b 0a 20 20 20 20 7d 65  can, i));.    }e
14c80 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
14c90 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
14ca0 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  tx);.    }.    r
14cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14cc0 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 69  .  }.  switch( i
14cd0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 50 45   ){.    case SPE
14ce0 4c 4c 46 49 58 5f 43 4f 4c 5f 57 4f 52 44 3a 20  LLFIX_COL_WORD: 
14cf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14d00 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
14d10 20 70 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69   pCur->a[pCur->i
14d20 52 6f 77 5d 2e 7a 57 6f 72 64 2c 20 2d 31 2c 20  Row].zWord, -1, 
14d30 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
14d40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14d50 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c   }.    case SPEL
14d60 4c 46 49 58 5f 43 4f 4c 5f 52 41 4e 4b 3a 20 7b  LFIX_COL_RANK: {
14d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
14d80 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70  esult_int(ctx, p
14d90 43 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f  Cur->a[pCur->iRo
14da0 77 5d 2e 69 52 61 6e 6b 29 3b 0a 20 20 20 20 20  w].iRank);.     
14db0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14dc0 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f    case SPELLFIX_
14dd0 43 4f 4c 5f 44 49 53 54 41 4e 43 45 3a 20 7b 0a  COL_DISTANCE: {.
14de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
14df0 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43  sult_int(ctx, pC
14e00 75 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77  ur->a[pCur->iRow
14e10 5d 2e 69 44 69 73 74 61 6e 63 65 29 3b 0a 20 20  ].iDistance);.  
14e20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14e30 0a 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46  .    case SPELLF
14e40 49 58 5f 43 4f 4c 5f 4c 41 4e 47 49 44 3a 20 7b  IX_COL_LANGID: {
14e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
14e60 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70  esult_int(ctx, p
14e70 43 75 72 2d 3e 69 4c 61 6e 67 29 3b 0a 20 20 20  Cur->iLang);.   
14e80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14e90 20 20 20 20 63 61 73 65 20 53 50 45 4c 4c 46 49      case SPELLFI
14ea0 58 5f 43 4f 4c 5f 53 43 4f 52 45 3a 20 7b 0a 20  X_COL_SCORE: {. 
14eb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
14ec0 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 70 43 75  ult_int(ctx, pCu
14ed0 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d  r->a[pCur->iRow]
14ee0 2e 69 53 63 6f 72 65 29 3b 0a 20 20 20 20 20 20  .iScore);.      
14ef0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14f00 20 63 61 73 65 20 53 50 45 4c 4c 46 49 58 5f 43   case SPELLFIX_C
14f10 4f 4c 5f 4d 41 54 43 48 4c 45 4e 3a 20 7b 0a 20  OL_MATCHLEN: {. 
14f20 20 20 20 20 20 69 6e 74 20 69 4d 61 74 63 68 6c       int iMatchl
14f30 65 6e 20 3d 20 70 43 75 72 2d 3e 61 5b 70 43 75  en = pCur->a[pCu
14f40 72 2d 3e 69 52 6f 77 5d 2e 69 4d 61 74 63 68 6c  r->iRow].iMatchl
14f50 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4d  en;.      if( iM
14f60 61 74 63 68 6c 65 6e 3c 30 20 29 7b 0a 20 20 20  atchlen<0 ){.   
14f70 20 20 20 20 20 69 6e 74 20 6e 50 61 74 74 65 72       int nPatter
14f80 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
14f90 70 43 75 72 2d 3e 7a 50 61 74 74 65 72 6e 29 3b  pCur->zPattern);
14fa0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
14fb0 57 6f 72 64 20 3d 20 70 43 75 72 2d 3e 61 5b 70  Word = pCur->a[p
14fc0 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a 57 6f 72 64  Cur->iRow].zWord
14fd0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 57  ;.        int nW
14fe0 6f 72 64 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ord = (int)strle
14ff0 6e 28 7a 57 6f 72 64 29 3b 0a 0a 20 20 20 20 20  n(zWord);..     
15000 20 20 20 69 66 28 20 6e 50 61 74 74 65 72 6e 3e     if( nPattern>
15010 30 20 26 26 20 70 43 75 72 2d 3e 7a 50 61 74 74  0 && pCur->zPatt
15020 65 72 6e 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3d  ern[nPattern-1]=
15030 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='*' ){.        
15040 20 20 63 68 61 72 20 2a 7a 54 72 61 6e 73 6c 69    char *zTransli
15050 74 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  t;.          int
15060 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 20 20   res;.          
15070 7a 54 72 61 6e 73 6c 69 74 20 3d 20 28 63 68 61  zTranslit = (cha
15080 72 20 2a 29 74 72 61 6e 73 6c 69 74 65 72 61 74  r *)transliterat
15090 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
150a0 20 2a 29 7a 57 6f 72 64 2c 20 6e 57 6f 72 64 29   *)zWord, nWord)
150b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
150c0 21 7a 54 72 61 6e 73 6c 69 74 20 29 20 72 65 74  !zTranslit ) ret
150d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
150e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  ;.          res 
150f0 3d 20 65 64 69 74 64 69 73 74 31 28 70 43 75 72  = editdist1(pCur
15100 2d 3e 7a 50 61 74 74 65 72 6e 2c 20 7a 54 72 61  ->zPattern, zTra
15110 6e 73 6c 69 74 2c 20 26 69 4d 61 74 63 68 6c 65  nslit, &iMatchle
15120 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  n);.          sq
15130 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72 61 6e  lite3_free(zTran
15140 73 6c 69 74 29 3b 0a 20 20 20 20 20 20 20 20 20  slit);.         
15150 20 69 66 28 20 72 65 73 3c 30 20 29 20 72 65 74   if( res<0 ) ret
15160 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15170 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4d 61 74  ;.          iMat
15180 63 68 6c 65 6e 20 3d 20 74 72 61 6e 73 6c 65 6e  chlen = translen
15190 5f 74 6f 5f 63 68 61 72 6c 65 6e 28 7a 57 6f 72  _to_charlen(zWor
151a0 64 2c 20 6e 57 6f 72 64 2c 20 69 4d 61 74 63 68  d, nWord, iMatch
151b0 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  len);.        }e
151c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
151d0 4d 61 74 63 68 6c 65 6e 20 3d 20 75 74 66 38 43  Matchlen = utf8C
151e0 68 61 72 6c 65 6e 28 7a 57 6f 72 64 2c 20 6e 57  harlen(zWord, nW
151f0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ord);.        }.
15200 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
15210 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
15220 74 28 63 74 78 2c 20 69 4d 61 74 63 68 6c 65 6e  t(ctx, iMatchlen
15230 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15240 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
15250 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 50 48 4f 4e  PELLFIX_COL_PHON
15260 45 48 41 53 48 3a 20 7b 0a 20 20 20 20 20 20 73  EHASH: {.      s
15270 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
15280 78 74 28 63 74 78 2c 20 70 43 75 72 2d 3e 61 5b  xt(ctx, pCur->a[
15290 70 43 75 72 2d 3e 69 52 6f 77 5d 2e 7a 48 61 73  pCur->iRow].zHas
152a0 68 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  h, -1, SQLITE_ST
152b0 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
152c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
152d0 73 65 20 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f  se SPELLFIX_COL_
152e0 54 4f 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TOP: {.      sql
152f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
15300 63 74 78 2c 20 70 43 75 72 2d 3e 69 54 6f 70 29  ctx, pCur->iTop)
15310 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15320 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50     }.    case SP
15330 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 43 4f 50 45  ELLFIX_COL_SCOPE
15340 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
15350 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78  3_result_int(ctx
15360 2c 20 70 43 75 72 2d 3e 69 53 63 6f 70 65 29 3b  , pCur->iScope);
15370 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15380 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 50 45    }.    case SPE
15390 4c 4c 46 49 58 5f 43 4f 4c 5f 53 52 43 48 43 4e  LLFIX_COL_SRCHCN
153a0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
153b0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
153c0 78 2c 20 70 43 75 72 2d 3e 6e 53 65 61 72 63 68  x, pCur->nSearch
153d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
153e0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
153f0 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
15400 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63  e3_result_null(c
15410 74 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tx);.      break
15420 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
15430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15440 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 77  }../*.** The row
15450 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  id..*/.static in
15460 74 20 73 70 65 6c 6c 66 69 78 31 52 6f 77 69 64  t spellfix1Rowid
15470 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
15480 72 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74  rsor *cur, sqlit
15490 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29  e_int64 *pRowid)
154a0 7b 0a 20 20 73 70 65 6c 6c 66 69 78 31 5f 63 75  {.  spellfix1_cu
154b0 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 70  rsor *pCur = (sp
154c0 65 6c 6c 66 69 78 31 5f 63 75 72 73 6f 72 2a 29  ellfix1_cursor*)
154d0 63 75 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  cur;.  if( pCur-
154e0 3e 70 46 75 6c 6c 53 63 61 6e 20 29 7b 0a 20 20  >pFullScan ){.  
154f0 20 20 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69    *pRowid = sqli
15500 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
15510 28 70 43 75 72 2d 3e 70 46 75 6c 6c 53 63 61 6e  (pCur->pFullScan
15520 2c 20 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 4);.  }else{. 
15530 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43 75     *pRowid = pCu
15540 72 2d 3e 61 5b 70 43 75 72 2d 3e 69 52 6f 77 5d  r->a[pCur->iRow]
15550 2e 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 72  .iRowid;.  }.  r
15560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
15580 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15590 64 20 62 79 20 74 68 65 20 78 55 70 64 61 74 65  d by the xUpdate
155a0 28 29 20 6d 65 74 68 6f 64 2e 20 49 74 20 72 65  () method. It re
155b0 74 75 72 6e 73 20 61 20 73 74 72 69 6e 67 0a 2a  turns a string.*
155c0 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
155d0 20 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 20 74   conflict mode t
155e0 68 61 74 20 78 55 70 64 61 74 65 28 29 20 73 68  hat xUpdate() sh
155f0 6f 75 6c 64 20 75 73 65 20 66 6f 72 20 74 68 65  ould use for the
15600 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6f 70 65 72   current.** oper
15610 61 74 69 6f 6e 2e 20 4f 6e 65 20 6f 66 3a 20 22  ation. One of: "
15620 52 4f 4c 4c 42 41 43 4b 22 2c 20 22 49 47 4e 4f  ROLLBACK", "IGNO
15630 52 45 22 2c 20 22 41 42 4f 52 54 22 20 6f 72 20  RE", "ABORT" or 
15640 22 52 45 50 4c 41 43 45 22 2e 0a 2a 2f 0a 73 74  "REPLACE"..*/.st
15650 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
15660 2a 73 70 65 6c 6c 66 69 78 31 47 65 74 43 6f 6e  *spellfix1GetCon
15670 66 6c 69 63 74 28 73 71 6c 69 74 65 33 20 2a 64  flict(sqlite3 *d
15680 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  b){.  static con
15690 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6e 66 6c  st char *azConfl
156a0 69 63 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  ict[] = {.    /*
156b0 20 4e 6f 74 65 3a 20 49 6e 73 74 65 61 64 20 6f   Note: Instead o
156c0 66 20 22 46 41 49 4c 22 20 2d 20 22 41 42 4f 52  f "FAIL" - "ABOR
156d0 54 22 2e 20 2a 2f 0a 20 20 20 20 22 52 4f 4c 4c  T". */.    "ROLL
156e0 42 41 43 4b 22 2c 20 22 49 47 4e 4f 52 45 22 2c  BACK", "IGNORE",
156f0 20 22 41 42 4f 52 54 22 2c 20 22 41 42 4f 52 54   "ABORT", "ABORT
15700 22 2c 20 22 52 45 50 4c 41 43 45 22 0a 20 20 7d  ", "REPLACE".  }
15710 3b 0a 20 20 69 6e 74 20 65 43 6f 6e 66 6c 69 63  ;.  int eConflic
15720 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 74 61 62  t = sqlite3_vtab
15730 5f 6f 6e 5f 63 6f 6e 66 6c 69 63 74 28 64 62 29  _on_conflict(db)
15740 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 43 6f  ;..  assert( eCo
15750 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f 52  nflict==SQLITE_R
15760 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 43 6f 6e 66  OLLBACK || eConf
15770 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f 49 47 4e  lict==SQLITE_IGN
15780 4f 52 45 0a 20 20 20 20 20 20 20 7c 7c 20 65 43  ORE.       || eC
15790 6f 6e 66 6c 69 63 74 3d 3d 53 51 4c 49 54 45 5f  onflict==SQLITE_
157a0 46 41 49 4c 20 7c 7c 20 65 43 6f 6e 66 6c 69 63  FAIL || eConflic
157b0 74 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 0a  t==SQLITE_ABORT.
157c0 20 20 20 20 20 20 20 7c 7c 20 65 43 6f 6e 66 6c         || eConfl
157d0 69 63 74 3d 3d 53 51 4c 49 54 45 5f 52 45 50 4c  ict==SQLITE_REPL
157e0 41 43 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ACE.  );.  asser
157f0 74 28 20 53 51 4c 49 54 45 5f 52 4f 4c 4c 42 41  t( SQLITE_ROLLBA
15800 43 4b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  CK==1 );.  asser
15810 74 28 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  t( SQLITE_IGNORE
15820 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
15830 20 53 51 4c 49 54 45 5f 46 41 49 4c 3d 3d 33 20   SQLITE_FAIL==3 
15840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
15850 49 54 45 5f 41 42 4f 52 54 3d 3d 34 20 29 3b 0a  ITE_ABORT==4 );.
15860 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
15870 5f 52 45 50 4c 41 43 45 3d 3d 35 20 29 3b 0a 0a  _REPLACE==5 );..
15880 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6e 66 6c    return azConfl
15890 69 63 74 5b 65 43 6f 6e 66 6c 69 63 74 2d 31 5d  ict[eConflict-1]
158a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  ;.}../*.** The x
158b0 55 70 64 61 74 65 28 29 20 6d 65 74 68 6f 64 2e  Update() method.
158c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
158d0 70 65 6c 6c 66 69 78 31 55 70 64 61 74 65 28 0a  pellfix1Update(.
158e0 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
158f0 70 56 54 61 62 2c 0a 20 20 69 6e 74 20 61 72 67  pVTab,.  int arg
15900 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
15910 75 65 20 2a 2a 61 72 67 76 2c 0a 20 20 73 71 6c  ue **argv,.  sql
15920 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69  ite_int64 *pRowi
15930 64 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d.){.  int rc = 
15940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
15950 69 74 65 33 5f 69 6e 74 36 34 20 72 6f 77 69 64  ite3_int64 rowid
15960 2c 20 6e 65 77 52 6f 77 69 64 3b 0a 20 20 73 70  , newRowid;.  sp
15970 65 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20  ellfix1_vtab *p 
15980 3d 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61  = (spellfix1_vta
15990 62 2a 29 70 56 54 61 62 3b 0a 20 20 73 71 6c 69  b*)pVTab;.  sqli
159a0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
159b0 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20  ..  if( argc==1 
159c0 29 7b 0a 20 20 20 20 2f 2a 20 41 20 64 65 6c 65  ){.    /* A dele
159d0 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  te operation on 
159e0 74 68 65 20 72 6f 77 69 64 20 67 69 76 65 6e 20  the rowid given 
159f0 62 79 20 61 72 67 76 5b 30 5d 20 2a 2f 0a 20 20  by argv[0] */.  
15a00 20 20 72 6f 77 69 64 20 3d 20 2a 70 52 6f 77 69    rowid = *pRowi
15a10 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
15a20 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 30 5d 29  e_int64(argv[0])
15a30 3b 0a 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44  ;.    spellfix1D
15a40 62 45 78 65 63 28 26 72 63 2c 20 64 62 2c 20 22  bExec(&rc, db, "
15a50 44 45 4c 45 54 45 20 46 52 4f 4d 20 5c 22 25 77  DELETE FROM \"%w
15a60 5c 22 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 20  \".\"%w_vocab\" 
15a70 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
15a90 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 2c 0a 20  HERE id=%lld",. 
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ab0 20 70 2d 3e 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e   p->zDbName, p->
15ac0 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 72 6f 77 69  zTableName, rowi
15ad0 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
15ae0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
15af0 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 73 71  char *zWord = sq
15b00 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
15b10 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43  (argv[SPELLFIX_C
15b20 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a 20 20 20  OL_WORD+2]);.   
15b30 20 69 6e 74 20 6e 57 6f 72 64 20 3d 20 73 71 6c   int nWord = sql
15b40 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
15b50 28 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43  (argv[SPELLFIX_C
15b60 4f 4c 5f 57 4f 52 44 2b 32 5d 29 3b 0a 20 20 20  OL_WORD+2]);.   
15b70 20 69 6e 74 20 69 4c 61 6e 67 20 3d 20 73 71 6c   int iLang = sql
15b80 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
15b90 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  rgv[SPELLFIX_COL
15ba0 5f 4c 41 4e 47 49 44 2b 32 5d 29 3b 0a 20 20 20  _LANGID+2]);.   
15bb0 20 69 6e 74 20 69 52 61 6e 6b 20 3d 20 73 71 6c   int iRank = sql
15bc0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
15bd0 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c  rgv[SPELLFIX_COL
15be0 5f 52 41 4e 4b 2b 32 5d 29 3b 0a 20 20 20 20 63  _RANK+2]);.    c
15bf0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
15c00 61 72 20 2a 7a 53 6f 75 6e 64 73 6c 69 6b 65 20  ar *zSoundslike 
15c10 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  =.           sql
15c20 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
15c30 61 72 67 76 5b 53 50 45 4c 4c 46 49 58 5f 43 4f  argv[SPELLFIX_CO
15c40 4c 5f 53 4f 55 4e 44 53 4c 49 4b 45 2b 32 5d 29  L_SOUNDSLIKE+2])
15c50 3b 0a 20 20 20 20 69 6e 74 20 6e 53 6f 75 6e 64  ;.    int nSound
15c60 73 6c 69 6b 65 20 3d 20 73 71 6c 69 74 65 33 5f  slike = sqlite3_
15c70 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
15c80 5b 53 50 45 4c 4c 46 49 58 5f 43 4f 4c 5f 53 4f  [SPELLFIX_COL_SO
15c90 55 4e 44 53 4c 49 4b 45 2b 32 5d 29 3b 0a 20 20  UNDSLIKE+2]);.  
15ca0 20 20 63 68 61 72 20 2a 7a 4b 31 2c 20 2a 7a 4b    char *zK1, *zK
15cb0 32 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  2;.    int i;.  
15cc0 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 63 6f    char c;.    co
15cd0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 66 6c  nst char *zConfl
15ce0 69 63 74 20 3d 20 73 70 65 6c 6c 66 69 78 31 47  ict = spellfix1G
15cf0 65 74 43 6f 6e 66 6c 69 63 74 28 64 62 29 3b 0a  etConflict(db);.
15d00 0a 20 20 20 20 69 66 28 20 7a 57 6f 72 64 3d 3d  .    if( zWord==
15d10 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  0 ){.      /* In
15d20 73 65 72 74 73 20 6f 66 20 74 68 65 20 66 6f 72  serts of the for
15d30 6d 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  m:  INSERT INTO 
15d40 74 61 62 6c 65 28 63 6f 6d 6d 61 6e 64 29 20 56  table(command) V
15d50 41 4c 55 45 53 28 27 78 79 7a 7a 79 27 29 3b 0a  ALUES('xyzzy');.
15d60 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 7a        ** cause z
15d70 57 6f 72 64 20 74 6f 20 62 65 20 4e 55 4c 4c 2c  Word to be NULL,
15d80 20 73 6f 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74   so we look at t
15d90 68 65 20 22 63 6f 6d 6d 61 6e 64 22 20 63 6f 6c  he "command" col
15da0 75 6d 6e 20 74 6f 20 73 65 65 0a 20 20 20 20 20  umn to see.     
15db0 20 2a 2a 20 77 68 61 74 20 73 70 65 63 69 61 6c   ** what special
15dc0 20 61 63 74 69 6f 6e 73 20 74 6f 20 74 61 6b 65   actions to take
15dd0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
15de0 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 0a 20 20  char *zCmd = .  
15df0 20 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68         (const ch
15e00 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
15e10 65 5f 74 65 78 74 28 61 72 67 76 5b 53 50 45 4c  e_text(argv[SPEL
15e20 4c 46 49 58 5f 43 4f 4c 5f 43 4f 4d 4d 41 4e 44  LFIX_COL_COMMAND
15e30 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
15e40 7a 43 6d 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zCmd==0 ){.     
15e50 20 20 20 70 56 54 61 62 2d 3e 7a 45 72 72 4d 73     pVTab->zErrMs
15e60 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
15e70 6e 74 66 28 22 4e 4f 54 20 4e 55 4c 4c 20 63 6f  ntf("NOT NULL co
15e80 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  nstraint failed:
15e90 20 25 73 2e 77 6f 72 64 22 2c 0a 20 20 20 20 20   %s.word",.     
15ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 20 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d      p->zTableNam
15ed0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
15ee0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
15ef0 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3b 0a 20 20  AINT_NOTNULL;.  
15f00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
15f10 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 72 65 73  strcmp(zCmd,"res
15f20 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  et")==0 ){.     
15f30 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20     /* Reset the 
15f40 20 65 64 69 74 20 63 6f 73 74 20 74 61 62 6c 65   edit cost table
15f50 20 28 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e   (if there is on
15f60 65 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 65  e). */.        e
15f70 64 69 74 44 69 73 74 33 43 6f 6e 66 69 67 44 65  ditDist3ConfigDe
15f80 6c 65 74 65 28 70 2d 3e 70 43 6f 6e 66 69 67 33  lete(p->pConfig3
15f90 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 43  );.        p->pC
15fa0 6f 6e 66 69 67 33 20 3d 20 30 3b 0a 20 20 20 20  onfig3 = 0;.    
15fb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15fc0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
15fd0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
15fe0 7a 43 6d 64 2c 22 65 64 69 74 5f 63 6f 73 74 5f  zCmd,"edit_cost_
15ff0 74 61 62 6c 65 3d 22 2c 31 36 29 3d 3d 30 20 29  table=",16)==0 )
16000 7b 0a 20 20 20 20 20 20 20 20 65 64 69 74 44 69  {.        editDi
16010 73 74 33 43 6f 6e 66 69 67 44 65 6c 65 74 65 28  st3ConfigDelete(
16020 70 2d 3e 70 43 6f 6e 66 69 67 33 29 3b 0a 20 20  p->pConfig3);.  
16030 20 20 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67        p->pConfig
16040 33 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  3 = 0;.        s
16050 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
16060 43 6f 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20  CostTable);.    
16070 20 20 20 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c      p->zCostTabl
16080 65 20 3d 20 73 70 65 6c 6c 66 69 78 31 44 65 71  e = spellfix1Deq
16090 75 6f 74 65 28 7a 43 6d 64 2b 31 36 29 3b 0a 20  uote(zCmd+16);. 
160a0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 43         if( p->zC
160b0 6f 73 74 54 61 62 6c 65 3d 3d 30 20 29 20 72 65  ostTable==0 ) re
160c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
160d0 4d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  M;.        if( p
160e0 2d 3e 7a 43 6f 73 74 54 61 62 6c 65 5b 30 5d 3d  ->zCostTable[0]=
160f0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
16100 72 69 63 6d 70 28 70 2d 3e 7a 43 6f 73 74 54 61  ricmp(p->zCostTa
16110 62 6c 65 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29  ble,"null")==0 )
16120 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
16130 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 73  te3_free(p->zCos
16140 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20  tTable);.       
16150 20 20 20 70 2d 3e 7a 43 6f 73 74 54 61 62 6c 65     p->zCostTable
16160 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
16170 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16180 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
16190 7d 0a 20 20 20 20 20 20 70 56 54 61 62 2d 3e 7a  }.      pVTab->z
161a0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
161b0 5f 6d 70 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77  _mprintf("unknow
161c0 6e 20 76 61 6c 75 65 20 66 6f 72 20 25 73 2e 63  n value for %s.c
161d0 6f 6d 6d 61 6e 64 3a 20 5c 22 25 77 5c 22 22 2c  ommand: \"%w\"",
161e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 61 62 6c          p->zTabl
16210 65 4e 61 6d 65 2c 20 7a 43 6d 64 29 3b 0a 20 20  eName, zCmd);.  
16220 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16230 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
16240 20 20 20 69 66 28 20 69 52 61 6e 6b 3c 31 20 29     if( iRank<1 )
16250 20 69 52 61 6e 6b 20 3d 20 31 3b 0a 20 20 20 20   iRank = 1;.    
16260 69 66 28 20 7a 53 6f 75 6e 64 73 6c 69 6b 65 20  if( zSoundslike 
16270 29 7b 0a 20 20 20 20 20 20 7a 4b 31 20 3d 20 28  ){.      zK1 = (
16280 63 68 61 72 2a 29 74 72 61 6e 73 6c 69 74 65 72  char*)transliter
16290 61 74 65 28 7a 53 6f 75 6e 64 73 6c 69 6b 65 2c  ate(zSoundslike,
162a0 20 6e 53 6f 75 6e 64 73 6c 69 6b 65 29 3b 0a 20   nSoundslike);. 
162b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
162c0 7a 4b 31 20 3d 20 28 63 68 61 72 2a 29 74 72 61  zK1 = (char*)tra
162d0 6e 73 6c 69 74 65 72 61 74 65 28 7a 57 6f 72 64  nsliterate(zWord
162e0 2c 20 6e 57 6f 72 64 29 3b 0a 20 20 20 20 7d 0a  , nWord);.    }.
162f0 20 20 20 20 69 66 28 20 7a 4b 31 3d 3d 30 20 29      if( zK1==0 )
16300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16310 4f 4d 45 4d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  OMEM;.    for(i=
16320 30 3b 20 28 63 20 3d 20 7a 4b 31 5b 69 5d 29 21  0; (c = zK1[i])!
16330 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
16340 20 69 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63   if( c>='A' && c
16350 3c 3d 27 5a 27 20 29 20 7a 4b 31 5b 69 5d 20 2b  <='Z' ) zK1[i] +
16360 3d 20 27 61 27 20 2d 20 27 41 27 3b 0a 20 20 20  = 'a' - 'A';.   
16370 20 7d 0a 20 20 20 20 7a 4b 32 20 3d 20 28 63 68   }.    zK2 = (ch
16380 61 72 2a 29 70 68 6f 6e 65 74 69 63 48 61 73 68  ar*)phoneticHash
16390 28 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ((const unsigned
163a0 20 63 68 61 72 2a 29 7a 4b 31 2c 20 69 29 3b 0a   char*)zK1, i);.
163b0 20 20 20 20 69 66 28 20 7a 4b 32 3d 3d 30 20 29      if( zK2==0 )
163c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
163d0 66 72 65 65 28 7a 4b 31 29 3b 0a 20 20 20 20 20  free(zK1);.     
163e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
163f0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
16400 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
16410 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
16420 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
16430 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
16440 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
16450 76 5b 31 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e 55  v[1])==SQLITE_NU
16460 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70  LL ){.        sp
16470 65 6c 6c 66 69 78 31 44 62 45 78 65 63 28 26 72  ellfix1DbExec(&r
16480 63 2c 20 64 62 2c 0a 20 20 20 20 20 20 20 20 20  c, db,.         
16490 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
164a0 54 4f 20 5c 22 25 77 5c 22 2e 5c 22 25 77 5f 76  TO \"%w\".\"%w_v
164b0 6f 63 61 62 5c 22 28 72 61 6e 6b 2c 6c 61 6e 67  ocab\"(rank,lang
164c0 69 64 2c 77 6f 72 64 2c 6b 31 2c 6b 32 29 20 22  id,word,k1,k2) "
164d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
164e0 22 56 41 4c 55 45 53 28 25 64 2c 25 64 2c 25 51  "VALUES(%d,%d,%Q
164f0 2c 25 51 2c 25 51 29 22 2c 0a 20 20 20 20 20 20  ,%Q,%Q)",.      
16500 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 4e           p->zDbN
16510 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61  ame, p->zTableNa
16520 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
16530 20 20 20 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c     iRank, iLang,
16540 20 7a 57 6f 72 64 2c 20 7a 4b 31 2c 20 7a 4b 32   zWord, zK1, zK2
16550 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
16560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16570 20 6e 65 77 52 6f 77 69 64 20 3d 20 73 71 6c 69   newRowid = sqli
16580 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
16590 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20  argv[1]);.      
165a0 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45 78 65    spellfix1DbExe
165b0 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20 20 20  c(&rc, db,.     
165c0 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 4f         "INSERT O
165d0 52 20 25 73 20 49 4e 54 4f 20 5c 22 25 77 5c 22  R %s INTO \"%w\"
165e0 2e 5c 22 25 77 5f 76 6f 63 61 62 5c 22 28 69 64  .\"%w_vocab\"(id
165f0 2c 72 61 6e 6b 2c 6c 61 6e 67 69 64 2c 77 6f 72  ,rank,langid,wor
16600 64 2c 6b 31 2c 6b 32 29 20 22 0a 20 20 20 20 20  d,k1,k2) ".     
16610 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28 25         "VALUES(%
16620 6c 6c 64 2c 25 64 2c 25 64 2c 25 51 2c 25 51 2c  lld,%d,%d,%Q,%Q,
16630 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %Q)",.          
16640 20 20 7a 43 6f 6e 66 6c 69 63 74 2c 20 70 2d 3e    zConflict, p->
16650 7a 44 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62  zDbName, p->zTab
16660 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  leName,.        
16670 20 20 20 20 6e 65 77 52 6f 77 69 64 2c 20 69 52      newRowid, iR
16680 61 6e 6b 2c 20 69 4c 61 6e 67 2c 20 7a 57 6f 72  ank, iLang, zWor
16690 64 2c 20 7a 4b 31 2c 20 7a 4b 32 0a 20 20 20 20  d, zK1, zK2.    
166a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
166b0 20 20 20 20 20 2a 70 52 6f 77 69 64 20 3d 20 73       *pRowid = s
166c0 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
166d0 72 74 5f 72 6f 77 69 64 28 64 62 29 3b 0a 20 20  rt_rowid(db);.  
166e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
166f0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
16700 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b  alue_int64(argv[
16710 30 5d 29 3b 0a 20 20 20 20 20 20 6e 65 77 52 6f  0]);.      newRo
16720 77 69 64 20 3d 20 2a 70 52 6f 77 69 64 20 3d 20  wid = *pRowid = 
16730 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
16740 74 36 34 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  t64(argv[1]);.  
16750 20 20 20 20 73 70 65 6c 6c 66 69 78 31 44 62 45      spellfix1DbE
16760 78 65 63 28 26 72 63 2c 20 64 62 2c 0a 20 20 20  xec(&rc, db,.   
16770 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54            "UPDAT
16780 45 20 4f 52 20 25 73 20 5c 22 25 77 5c 22 2e 5c  E OR %s \"%w\".\
16790 22 25 77 5f 76 6f 63 61 62 5c 22 20 53 45 54 20  "%w_vocab\" SET 
167a0 69 64 3d 25 6c 6c 64 2c 20 72 61 6e 6b 3d 25 64  id=%lld, rank=%d
167b0 2c 20 6c 61 6e 67 69 64 3d 25 64 2c 22 0a 20 20  , langid=%d,".  
167c0 20 20 20 20 20 20 20 20 20 20 20 22 20 77 6f 72             " wor
167d0 64 3d 25 51 2c 20 6b 31 3d 25 51 2c 20 6b 32 3d  d=%Q, k1=%Q, k2=
167e0 25 51 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64  %Q WHERE id=%lld
167f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16800 7a 43 6f 6e 66 6c 69 63 74 2c 20 70 2d 3e 7a 44  zConflict, p->zD
16810 62 4e 61 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65  bName, p->zTable
16820 4e 61 6d 65 2c 20 6e 65 77 52 6f 77 69 64 2c 20  Name, newRowid, 
16830 69 52 61 6e 6b 2c 20 69 4c 61 6e 67 2c 0a 20 20  iRank, iLang,.  
16840 20 20 20 20 20 20 20 20 20 20 20 7a 57 6f 72 64             zWord
16850 2c 20 7a 4b 31 2c 20 7a 4b 32 2c 20 72 6f 77 69  , zK1, zK2, rowi
16860 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  d.      );.    }
16870 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16880 65 28 7a 4b 31 29 3b 0a 20 20 20 20 73 71 6c 69  e(zK1);.    sqli
16890 74 65 33 5f 66 72 65 65 28 7a 4b 32 29 3b 0a 20  te3_free(zK2);. 
168a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
168b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 61 6d 65 20  }../*.** Rename 
168c0 74 68 65 20 73 70 65 6c 6c 66 69 78 31 20 74 61  the spellfix1 ta
168d0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
168e0 6e 74 20 73 70 65 6c 6c 66 69 78 31 52 65 6e 61  nt spellfix1Rena
168f0 6d 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  me(sqlite3_vtab 
16900 2a 70 56 54 61 62 2c 20 63 6f 6e 73 74 20 63 68  *pVTab, const ch
16910 61 72 20 2a 7a 4e 65 77 29 7b 0a 20 20 73 70 65  ar *zNew){.  spe
16920 6c 6c 66 69 78 31 5f 76 74 61 62 20 2a 70 20 3d  llfix1_vtab *p =
16930 20 28 73 70 65 6c 6c 66 69 78 31 5f 76 74 61 62   (spellfix1_vtab
16940 2a 29 70 56 54 61 62 3b 0a 20 20 73 71 6c 69 74  *)pVTab;.  sqlit
16950 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
16960 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16970 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
16980 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  ewName = sqlite3
16990 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
169a0 4e 65 77 29 3b 0a 20 20 69 66 28 20 7a 4e 65 77  New);.  if( zNew
169b0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Name==0 ){.    r
169c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
169d0 45 4d 3b 0a 20 20 7d 0a 20 20 73 70 65 6c 6c 66  EM;.  }.  spellf
169e0 69 78 31 44 62 45 78 65 63 28 26 72 63 2c 20 64  ix1DbExec(&rc, d
169f0 62 2c 20 0a 20 20 20 20 20 22 41 4c 54 45 52 20  b, .     "ALTER 
16a00 54 41 42 4c 45 20 5c 22 25 77 5c 22 2e 5c 22 25  TABLE \"%w\".\"%
16a10 77 5f 76 6f 63 61 62 5c 22 20 52 45 4e 41 4d 45  w_vocab\" RENAME
16a20 20 54 4f 20 5c 22 25 77 5f 76 6f 63 61 62 5c 22   TO \"%w_vocab\"
16a30 22 2c 0a 20 20 20 20 20 70 2d 3e 7a 44 62 4e 61  ",.     p->zDbNa
16a40 6d 65 2c 20 70 2d 3e 7a 54 61 62 6c 65 4e 61 6d  me, p->zTableNam
16a50 65 2c 20 7a 4e 65 77 4e 61 6d 65 0a 20 20 29 3b  e, zNewName.  );
16a60 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
16a80 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 54 61 62  te3_free(p->zTab
16a90 6c 65 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e  leName);.    p->
16aa0 7a 54 61 62 6c 65 4e 61 6d 65 20 3d 20 7a 4e 65  zTableName = zNe
16ab0 77 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  wName;.  }else{.
16ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16ad0 28 7a 4e 65 77 4e 61 6d 65 29 3b 0a 20 20 7d 0a  (zNewName);.  }.
16ae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16af0 0a 2f 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c  ./*.** A virtual
16b00 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 74 68   table module th
16b10 61 74 20 70 72 6f 76 69 64 65 73 20 66 75 7a 7a  at provides fuzz
16b20 79 20 73 65 61 72 63 68 2e 0a 2a 2f 0a 73 74 61  y search..*/.sta
16b30 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
16b40 6c 65 20 73 70 65 6c 6c 66 69 78 31 4d 6f 64 75  le spellfix1Modu
16b50 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
16b80 0a 20 20 73 70 65 6c 6c 66 69 78 31 43 72 65 61  .  spellfix1Crea
16b90 74 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  te,         /* x
16ba0 43 72 65 61 74 65 20 2d 20 68 61 6e 64 6c 65 20  Create - handle 
16bb0 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
16bc0 41 42 4c 45 20 2a 2f 0a 20 20 73 70 65 6c 6c 66  ABLE */.  spellf
16bd0 69 78 31 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20  ix1Connect,     
16be0 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2d     /* xConnect -
16bf0 20 72 65 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20   reconnected to 
16c00 61 6e 20 65 78 69 73 74 69 6e 67 20 74 61 62 6c  an existing tabl
16c10 65 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31  e */.  spellfix1
16c20 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
16c30 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2d 20  /* xBestIndex - 
16c40 66 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 74  figure out how t
16c50 6f 20 64 6f 20 61 20 71 75 65 72 79 20 2a 2f 0a  o do a query */.
16c60 20 20 73 70 65 6c 6c 66 69 78 31 44 69 73 63 6f    spellfix1Disco
16c70 6e 6e 65 63 74 2c 20 20 20 20 20 2f 2a 20 78 44  nnect,     /* xD
16c80 69 73 63 6f 6e 6e 65 63 74 20 2d 20 63 6c 6f 73  isconnect - clos
16c90 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  e a connection *
16ca0 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 44 65 73  /.  spellfix1Des
16cb0 74 72 6f 79 2c 20 20 20 20 20 20 20 20 2f 2a 20  troy,        /* 
16cc0 78 44 65 73 74 72 6f 79 20 2d 20 68 61 6e 64 6c  xDestroy - handl
16cd0 65 20 44 52 4f 50 20 54 41 42 4c 45 20 2a 2f 0a  e DROP TABLE */.
16ce0 20 20 73 70 65 6c 6c 66 69 78 31 4f 70 65 6e 2c    spellfix1Open,
16cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
16d00 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72  pen - open a cur
16d10 73 6f 72 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  sor */.  spellfi
16d20 78 31 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  x1Close,        
16d30 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
16d40 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
16d50 20 20 73 70 65 6c 6c 66 69 78 31 46 69 6c 74 65    spellfix1Filte
16d60 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46  r,         /* xF
16d70 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
16d80 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
16d90 74 73 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78  ts */.  spellfix
16da0 31 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  1Next,          
16db0 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
16dc0 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
16dd0 20 20 73 70 65 6c 6c 66 69 78 31 45 6f 66 2c 20    spellfix1Eof, 
16de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45             /* xE
16df0 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65  of - check for e
16e00 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20  nd of scan */.  
16e10 73 70 65 6c 6c 66 69 78 31 43 6f 6c 75 6d 6e 2c  spellfix1Column,
16e20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
16e30 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
16e40 2a 2f 0a 20 20 73 70 65 6c 6c 66 69 78 31 52 6f  */.  spellfix1Ro
16e50 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  wid,          /*
16e60 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
16e70 61 74 61 20 2a 2f 0a 20 20 73 70 65 6c 6c 66 69  ata */.  spellfi
16e80 78 31 55 70 64 61 74 65 2c 20 20 20 20 20 20 20  x1Update,       
16e90 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a    /* xUpdate */.
16ea0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
16eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42             /* xB
16ec0 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  egin */.  0,    
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
16ef0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
16f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
16f10 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  mmit */.  0,    
16f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f30 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
16f40 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
16f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16f60 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a   xFindMethod */.
16f70 20 20 73 70 65 6c 6c 66 69 78 31 52 65 6e 61 6d    spellfix1Renam
16f80 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52  e,         /* xR
16f90 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  ename */.};../*.
16fa0 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
16fb0 76 61 72 69 6f 75 73 20 66 75 6e 63 74 69 6f 6e  various function
16fc0 73 20 61 6e 64 20 74 68 65 20 76 69 72 74 75 61  s and the virtua
16fd0 6c 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  l table..*/.stat
16fe0 69 63 20 69 6e 74 20 73 70 65 6c 6c 66 69 78 31  ic int spellfix1
16ff0 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 33  Register(sqlite3
17000 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
17010 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17020 6e 74 20 69 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nt i;.  rc = sql
17030 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
17040 74 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66  tion(db, "spellf
17050 69 78 31 5f 74 72 61 6e 73 6c 69 74 22 2c 20 31  ix1_translit", 1
17060 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
17070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17090 20 20 20 20 74 72 61 6e 73 6c 69 74 65 72 61 74      transliterat
170a0 65 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  eSqlFunc, 0, 0);
170b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
170c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
170d0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
170e0 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 73 70  function(db, "sp
170f0 65 6c 6c 66 69 78 31 5f 65 64 69 74 64 69 73 74  ellfix1_editdist
17100 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
17110 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17130 20 20 20 20 20 20 20 20 65 64 69 74 64 69 73 74          editdist
17140 53 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  SqlFunc, 0, 0);.
17150 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
17160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17170 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
17180 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
17190 22 73 70 65 6c 6c 66 69 78 31 5f 70 68 6f 6e 65  "spellfix1_phone
171a0 68 61 73 68 22 2c 20 31 2c 20 53 51 4c 49 54 45  hash", 1, SQLITE
171b0 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 20 20 20 20 20 20 20 20 20 20 70 68 6f 6e              phon
171e0 65 74 69 63 48 61 73 68 53 71 6c 46 75 6e 63 2c  eticHashSqlFunc,
171f0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
17200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17210 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
17220 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
17230 69 6f 6e 28 64 62 2c 20 22 73 70 65 6c 6c 66 69  ion(db, "spellfi
17240 78 31 5f 73 63 72 69 70 74 63 6f 64 65 22 2c 20  x1_scriptcode", 
17250 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
17260 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 20 73 63 72 69 70 74 43 6f 64 65 53       scriptCodeS
17290 71 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  qlFunc, 0, 0);. 
172a0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
172b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
172c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
172d0 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 73 70  e_module(db, "sp
172e0 65 6c 6c 66 69 78 31 22 2c 20 26 73 70 65 6c 6c  ellfix1", &spell
172f0 66 69 78 31 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a  fix1Module, 0);.
17300 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
17310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17320 63 20 3d 20 65 64 69 74 44 69 73 74 33 49 6e 73  c = editDist3Ins
17330 74 61 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  tall(db);.  }.. 
17340 20 2f 2a 20 56 65 72 69 66 79 20 73 61 6e 69 74   /* Verify sanit
17350 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73 6c 69  y of the transli
17360 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
17370 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
17380 28 74 72 61 6e 73 6c 69 74 29 2f 73 69 7a 65 6f  (translit)/sizeo
17390 66 28 74 72 61 6e 73 6c 69 74 5b 30 5d 29 2d 31  f(translit[0])-1
173a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
173b0 72 74 28 20 74 72 61 6e 73 6c 69 74 5b 69 5d 2e  rt( translit[i].
173c0 63 46 72 6f 6d 3c 74 72 61 6e 73 6c 69 74 5b 69  cFrom<translit[i
173d0 2b 31 5d 2e 63 46 72 6f 6d 20 29 3b 0a 20 20 7d  +1].cFrom );.  }
173e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
173f0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
17400 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
17410 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  ABLE */../*.** E
17420 78 74 65 6e 73 69 6f 6e 20 6c 6f 61 64 20 66 75  xtension load fu
17430 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 64 65  nction..*/.#ifde
17440 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73  f _WIN32.__decls
17450 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23  pec(dllexport).#
17460 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65  endif.int sqlite
17470 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28  3_spellfix_init(
17480 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
17490 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
174a0 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c  sg, .  const sql
174b0 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
174c0 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c  s *pApi.){.  SQL
174d0 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
174e0 49 54 32 28 70 41 70 69 29 3b 0a 23 69 66 6e 64  IT2(pApi);.#ifnd
174f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
17500 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 72 65  IRTUALTABLE.  re
17510 74 75 72 6e 20 73 70 65 6c 6c 66 69 78 31 52 65  turn spellfix1Re
17520 67 69 73 74 65 72 28 64 62 29 3b 0a 23 65 6e 64  gister(db);.#end
17530 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
17540 54 45 5f 4f 4b 3b 0a 7d 0a                       TE_OK;.}.