/ Hex Artifact Content
Login

Artifact ca2b6a033794945ac505241a86b0aa978709c23aa2e6121984d3e3ede96003c8:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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 2a 2a 2a 0a 2a 2f 0a 0a 0a 23 69 6e 63 6c  *****.*/...#incl
0180: 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68 22 0a  ude "fts5Int.h".
0190: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
01a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
01e0: 53 74 61 72 74 20 6f 66 20 61 73 63 69 69 20 74  Start of ascii t
01f0: 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
0200: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ntation..*/../*.
0210: 2a 2a 20 46 6f 72 20 74 6f 6b 65 6e 69 7a 65 72  ** For tokenizer
0220: 73 20 77 69 74 68 20 6e 6f 20 22 75 6e 69 63 6f  s with no "unico
0230: 64 65 22 20 6d 6f 64 69 66 69 65 72 2c 20 74 68  de" modifier, th
0240: 65 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 63  e set of token c
0250: 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 73 20  haracters.** is 
0260: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
0270: 73 65 74 20 6f 66 20 41 53 43 49 49 20 72 61 6e  set of ASCII ran
0280: 67 65 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20  ge alphanumeric 
0290: 63 68 61 72 61 63 74 65 72 73 2e 20 0a 2a 2f 0a  characters. .*/.
02a0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
02b0: 63 68 61 72 20 61 41 73 63 69 69 54 6f 6b 65 6e  char aAsciiToken
02c0: 43 68 61 72 5b 31 32 38 5d 20 3d 20 7b 0a 20 20  Char[128] = {.  
02d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
02e0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
02f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0300: 2c 20 20 20 2f 2a 20 30 78 30 30 2e 2e 30 78 30  ,   /* 0x00..0x0
0310: 46 20 2a 2f 0a 20 20 30 2c 20 30 2c 20 30 2c 20  F */.  0, 0, 0, 
0320: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0330: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0340: 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78  0, 0, 0,   /* 0x
0350: 31 30 2e 2e 30 78 31 46 20 2a 2f 0a 20 20 30 2c  10..0x1F */.  0,
0360: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0370: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
0380: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0390: 20 20 2f 2a 20 30 78 32 30 2e 2e 30 78 32 46 20    /* 0x20..0x2F 
03a0: 2a 2f 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  */.  1, 1, 1, 1,
03b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
03c0: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 0, 0, 0, 0,
03d0: 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78 33 30   0, 0,   /* 0x30
03e0: 2e 2e 30 78 33 46 20 2a 2f 0a 20 20 30 2c 20 31  ..0x3F */.  0, 1
03f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
0400: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
0410: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
0420: 2f 2a 20 30 78 34 30 2e 2e 30 78 34 46 20 2a 2f  /* 0x40..0x4F */
0430: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
0440: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
0450: 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  1, 1, 0, 0, 0, 0
0460: 2c 20 30 2c 20 20 20 2f 2a 20 30 78 35 30 2e 2e  , 0,   /* 0x50..
0470: 30 78 35 46 20 2a 2f 0a 20 20 30 2c 20 31 2c 20  0x5F */.  0, 1, 
0480: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
0490: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
04a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 2f 2a  1, 1, 1, 1,   /*
04b0: 20 30 78 36 30 2e 2e 30 78 36 46 20 2a 2f 0a 20   0x60..0x6F */. 
04c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
04d0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
04e0: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   1, 0, 0, 0, 0, 
04f0: 30 2c 20 20 20 2f 2a 20 30 78 37 30 2e 2e 30 78  0,   /* 0x70..0x
0500: 37 46 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  7F */.};..typede
0510: 66 20 73 74 72 75 63 74 20 41 73 63 69 69 54 6f  f struct AsciiTo
0520: 6b 65 6e 69 7a 65 72 20 41 73 63 69 69 54 6f 6b  kenizer AsciiTok
0530: 65 6e 69 7a 65 72 3b 0a 73 74 72 75 63 74 20 41  enizer;.struct A
0540: 73 63 69 69 54 6f 6b 65 6e 69 7a 65 72 20 7b 0a  sciiTokenizer {.
0550: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0560: 61 54 6f 6b 65 6e 43 68 61 72 5b 31 32 38 5d 3b  aTokenChar[128];
0570: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .};..static void
0580: 20 66 74 73 35 41 73 63 69 69 41 64 64 45 78 63   fts5AsciiAddExc
0590: 65 70 74 69 6f 6e 73 28 0a 20 20 41 73 63 69 69  eptions(.  Ascii
05a0: 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 2c 20 0a 20  Tokenizer *p, . 
05b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
05c0: 67 2c 20 0a 20 20 69 6e 74 20 62 54 6f 6b 65 6e  g, .  int bToken
05d0: 43 68 61 72 73 0a 29 7b 0a 20 20 69 6e 74 20 69  Chars.){.  int i
05e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72  ;.  for(i=0; zAr
05f0: 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  g[i]; i++){.    
0600: 69 66 28 20 28 7a 41 72 67 5b 69 5d 20 26 20 30  if( (zArg[i] & 0
0610: 78 38 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x80)==0 ){.     
0620: 20 70 2d 3e 61 54 6f 6b 65 6e 43 68 61 72 5b 28   p->aTokenChar[(
0630: 69 6e 74 29 7a 41 72 67 5b 69 5d 5d 20 3d 20 28  int)zArg[i]] = (
0640: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 62 54  unsigned char)bT
0650: 6f 6b 65 6e 43 68 61 72 73 3b 0a 20 20 20 20 7d  okenChars;.    }
0660: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
0670: 6c 65 74 65 20 61 20 22 61 73 63 69 69 22 20 74  lete a "ascii" t
0680: 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61  okenizer..*/.sta
0690: 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 63  tic void fts5Asc
06a0: 69 69 44 65 6c 65 74 65 28 46 74 73 35 54 6f 6b  iiDelete(Fts5Tok
06b0: 65 6e 69 7a 65 72 20 2a 70 29 7b 0a 20 20 73 71  enizer *p){.  sq
06c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d  lite3_free(p);.}
06d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
06e0: 6e 20 22 61 73 63 69 69 22 20 74 6f 6b 65 6e 69  n "ascii" tokeni
06f0: 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  zer..*/.static i
0700: 6e 74 20 66 74 73 35 41 73 63 69 69 43 72 65 61  nt fts5AsciiCrea
0710: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 55 6e 75  te(.  void *pUnu
0720: 73 65 64 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  sed, .  const ch
0730: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 69 6e 74 20  ar **azArg, int 
0740: 6e 41 72 67 2c 0a 20 20 46 74 73 35 54 6f 6b 65  nArg,.  Fts5Toke
0750: 6e 69 7a 65 72 20 2a 2a 70 70 4f 75 74 0a 29 7b  nizer **ppOut.){
0760: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
0770: 54 45 5f 4f 4b 3b 0a 20 20 41 73 63 69 69 54 6f  TE_OK;.  AsciiTo
0780: 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20 30 3b 0a  kenizer *p = 0;.
0790: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
07a0: 55 6e 75 73 65 64 29 3b 0a 20 20 69 66 28 20 6e  Unused);.  if( n
07b0: 41 72 67 25 32 20 29 7b 0a 20 20 20 20 72 63 20  Arg%2 ){.    rc 
07c0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
07d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
07e0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
07f0: 73 69 7a 65 6f 66 28 41 73 63 69 69 54 6f 6b 65  sizeof(AsciiToke
0800: 6e 69 7a 65 72 29 29 3b 0a 20 20 20 20 69 66 28  nizer));.    if(
0810: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72   p==0 ){.      r
0820: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
0830: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
0840: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
0850: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
0860: 65 6f 66 28 41 73 63 69 69 54 6f 6b 65 6e 69 7a  eof(AsciiTokeniz
0870: 65 72 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  er));.      memc
0880: 70 79 28 70 2d 3e 61 54 6f 6b 65 6e 43 68 61 72  py(p->aTokenChar
0890: 2c 20 61 41 73 63 69 69 54 6f 6b 65 6e 43 68 61  , aAsciiTokenCha
08a0: 72 2c 20 73 69 7a 65 6f 66 28 61 41 73 63 69 69  r, sizeof(aAscii
08b0: 54 6f 6b 65 6e 43 68 61 72 29 29 3b 0a 20 20 20  TokenChar));.   
08c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
08d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
08e0: 41 72 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  Arg; i+=2){.    
08f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0900: 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69 2b 31  zArg = azArg[i+1
0910: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  ];.        if( 0
0920: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
0930: 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22 74 6f 6b  p(azArg[i], "tok
0940: 65 6e 63 68 61 72 73 22 29 20 29 7b 0a 20 20 20  enchars") ){.   
0950: 20 20 20 20 20 20 20 66 74 73 35 41 73 63 69 69         fts5Ascii
0960: 41 64 64 45 78 63 65 70 74 69 6f 6e 73 28 70 2c  AddExceptions(p,
0970: 20 7a 41 72 67 2c 20 31 29 3b 0a 20 20 20 20 20   zArg, 1);.     
0980: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
0990: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
09a0: 73 74 72 69 63 6d 70 28 61 7a 41 72 67 5b 69 5d  stricmp(azArg[i]
09b0: 2c 20 22 73 65 70 61 72 61 74 6f 72 73 22 29 20  , "separators") 
09c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
09d0: 35 41 73 63 69 69 41 64 64 45 78 63 65 70 74 69  5AsciiAddExcepti
09e0: 6f 6e 73 28 70 2c 20 7a 41 72 67 2c 20 30 29 3b  ons(p, zArg, 0);
09f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
0a00: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
0a10: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
0a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
0a30: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
0a40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
0a50: 20 20 66 74 73 35 41 73 63 69 69 44 65 6c 65 74    fts5AsciiDelet
0a60: 65 28 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  e((Fts5Tokenizer
0a70: 2a 29 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  *)p);.        p 
0a80: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
0a90: 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74   }.  }..  *ppOut
0aa0: 20 3d 20 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65   = (Fts5Tokenize
0ab0: 72 2a 29 70 3b 0a 20 20 72 65 74 75 72 6e 20 72  r*)p;.  return r
0ac0: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  c;.}...static vo
0ad0: 69 64 20 61 73 63 69 69 46 6f 6c 64 28 63 68 61  id asciiFold(cha
0ae0: 72 20 2a 61 4f 75 74 2c 20 63 6f 6e 73 74 20 63  r *aOut, const c
0af0: 68 61 72 20 2a 61 49 6e 2c 20 69 6e 74 20 6e 42  har *aIn, int nB
0b00: 79 74 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  yte){.  int i;. 
0b10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
0b20: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  e; i++){.    cha
0b30: 72 20 63 20 3d 20 61 49 6e 5b 69 5d 3b 0a 20 20  r c = aIn[i];.  
0b40: 20 20 69 66 28 20 63 3e 3d 27 41 27 20 26 26 20    if( c>='A' && 
0b50: 63 3c 3d 27 5a 27 20 29 20 63 20 2b 3d 20 33 32  c<='Z' ) c += 32
0b60: 3b 0a 20 20 20 20 61 4f 75 74 5b 69 5d 20 3d 20  ;.    aOut[i] = 
0b70: 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
0b80: 54 6f 6b 65 6e 69 7a 65 20 73 6f 6d 65 20 74 65  Tokenize some te
0b90: 78 74 20 75 73 69 6e 67 20 74 68 65 20 61 73 63  xt using the asc
0ba0: 69 69 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f  ii tokenizer..*/
0bb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
0bc0: 41 73 63 69 69 54 6f 6b 65 6e 69 7a 65 28 0a 20  AsciiTokenize(. 
0bd0: 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a   Fts5Tokenizer *
0be0: 70 54 6f 6b 65 6e 69 7a 65 72 2c 0a 20 20 76 6f  pTokenizer,.  vo
0bf0: 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  id *pCtx,.  int 
0c00: 69 55 6e 75 73 65 64 2c 0a 20 20 63 6f 6e 73 74  iUnused,.  const
0c10: 20 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e   char *pText, in
0c20: 74 20 6e 54 65 78 74 2c 0a 20 20 69 6e 74 20 28  t nText,.  int (
0c30: 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20  *xToken)(void*, 
0c40: 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  int, const char*
0c50: 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 69 6e  , int nToken, in
0c60: 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45  t iStart, int iE
0c70: 6e 64 29 0a 29 7b 0a 20 20 41 73 63 69 69 54 6f  nd).){.  AsciiTo
0c80: 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20 28 41 73  kenizer *p = (As
0c90: 63 69 69 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 54  ciiTokenizer*)pT
0ca0: 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 69 6e 74 20  okenizer;.  int 
0cb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0cc0: 20 20 69 6e 74 20 69 65 3b 0a 20 20 69 6e 74 20    int ie;.  int 
0cd0: 69 73 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20  is = 0;..  char 
0ce0: 61 46 6f 6c 64 5b 36 34 5d 3b 0a 20 20 69 6e 74  aFold[64];.  int
0cf0: 20 6e 46 6f 6c 64 20 3d 20 73 69 7a 65 6f 66 28   nFold = sizeof(
0d00: 61 46 6f 6c 64 29 3b 0a 20 20 63 68 61 72 20 2a  aFold);.  char *
0d10: 70 46 6f 6c 64 20 3d 20 61 46 6f 6c 64 3b 0a 20  pFold = aFold;. 
0d20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0d30: 61 20 3d 20 70 2d 3e 61 54 6f 6b 65 6e 43 68 61  a = p->aTokenCha
0d40: 72 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  r;..  UNUSED_PAR
0d50: 41 4d 28 69 55 6e 75 73 65 64 29 3b 0a 0a 20 20  AM(iUnused);..  
0d60: 77 68 69 6c 65 28 20 69 73 3c 6e 54 65 78 74 20  while( is<nText 
0d70: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
0d80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
0d90: 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20  e;..    /* Skip 
0da0: 61 6e 79 20 6c 65 61 64 69 6e 67 20 64 69 76 69  any leading divi
0db0: 64 65 72 20 63 68 61 72 61 63 74 65 72 73 2e 20  der characters. 
0dc0: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  */.    while( is
0dd0: 3c 6e 54 65 78 74 20 26 26 20 28 28 70 54 65 78  <nText && ((pTex
0de0: 74 5b 69 73 5d 26 30 78 38 30 29 3d 3d 30 20 26  t[is]&0x80)==0 &
0df0: 26 20 61 5b 28 69 6e 74 29 70 54 65 78 74 5b 69  & a[(int)pText[i
0e00: 73 5d 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  s]]==0) ){.     
0e10: 20 69 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20   is++;.    }.   
0e20: 20 69 66 28 20 69 73 3d 3d 6e 54 65 78 74 20 29   if( is==nText )
0e30: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
0e40: 43 6f 75 6e 74 20 74 68 65 20 74 6f 6b 65 6e 20  Count the token 
0e50: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
0e60: 20 20 69 65 20 3d 20 69 73 2b 31 3b 0a 20 20 20    ie = is+1;.   
0e70: 20 77 68 69 6c 65 28 20 69 65 3c 6e 54 65 78 74   while( ie<nText
0e80: 20 26 26 20 28 28 70 54 65 78 74 5b 69 65 5d 26   && ((pText[ie]&
0e90: 30 78 38 30 29 20 7c 7c 20 61 5b 28 69 6e 74 29  0x80) || a[(int)
0ea0: 70 54 65 78 74 5b 69 65 5d 5d 20 29 20 29 7b 0a  pText[ie]] ) ){.
0eb0: 20 20 20 20 20 20 69 65 2b 2b 3b 0a 20 20 20 20        ie++;.    
0ec0: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 6c 64 20 74  }..    /* Fold t
0ed0: 6f 20 6c 6f 77 65 72 20 63 61 73 65 20 2a 2f 0a  o lower case */.
0ee0: 20 20 20 20 6e 42 79 74 65 20 3d 20 69 65 2d 69      nByte = ie-i
0ef0: 73 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  s;.    if( nByte
0f00: 3e 6e 46 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20  >nFold ){.      
0f10: 69 66 28 20 70 46 6f 6c 64 21 3d 61 46 6f 6c 64  if( pFold!=aFold
0f20: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
0f30: 70 46 6f 6c 64 29 3b 0a 20 20 20 20 20 20 70 46  pFold);.      pF
0f40: 6f 6c 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  old = sqlite3_ma
0f50: 6c 6c 6f 63 28 6e 42 79 74 65 2a 32 29 3b 0a 20  lloc(nByte*2);. 
0f60: 20 20 20 20 20 69 66 28 20 70 46 6f 6c 64 3d 3d       if( pFold==
0f70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
0f80: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
0f90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 6f       }.      nFo
0fb0: 6c 64 20 3d 20 6e 42 79 74 65 2a 32 3b 0a 20 20  ld = nByte*2;.  
0fc0: 20 20 7d 0a 20 20 20 20 61 73 63 69 69 46 6f 6c    }.    asciiFol
0fd0: 64 28 70 46 6f 6c 64 2c 20 26 70 54 65 78 74 5b  d(pFold, &pText[
0fe0: 69 73 5d 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  is], nByte);..  
0ff0: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
1000: 74 6f 6b 65 6e 20 63 61 6c 6c 62 61 63 6b 20 2a  token callback *
1010: 2f 0a 20 20 20 20 72 63 20 3d 20 78 54 6f 6b 65  /.    rc = xToke
1020: 6e 28 70 43 74 78 2c 20 30 2c 20 70 46 6f 6c 64  n(pCtx, 0, pFold
1030: 2c 20 6e 42 79 74 65 2c 20 69 73 2c 20 69 65 29  , nByte, is, ie)
1040: 3b 0a 20 20 20 20 69 73 20 3d 20 69 65 2b 31 3b  ;.    is = ie+1;
1050: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 70 46  .  }.  .  if( pF
1060: 6f 6c 64 21 3d 61 46 6f 6c 64 20 29 20 73 71 6c  old!=aFold ) sql
1070: 69 74 65 33 5f 66 72 65 65 28 70 46 6f 6c 64 29  ite3_free(pFold)
1080: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1090: 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
10a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
10b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1100: 2a 2a 2a 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 6f  *****.** Start o
1110: 66 20 75 6e 69 63 6f 64 65 36 31 20 74 6f 6b 65  f unicode61 toke
1120: 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61  nizer implementa
1130: 74 69 6f 6e 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  tion..*/.../*.**
1140: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1150: 77 6f 20 6d 61 63 72 6f 73 20 2d 20 52 45 41 44  wo macros - READ
1160: 5f 55 54 46 38 20 61 6e 64 20 57 52 49 54 45 5f  _UTF8 and WRITE_
1170: 55 54 46 38 20 2d 20 68 61 76 65 20 62 65 65 6e  UTF8 - have been
1180: 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
1190: 74 68 65 20 73 71 6c 69 74 65 33 20 73 6f 75 72  the sqlite3 sour
11a0: 63 65 20 66 69 6c 65 20 75 74 66 2e 63 2e 20 49  ce file utf.c. I
11b0: 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 63  f this file is c
11c0: 6f 6d 70 69 6c 65 64 20 61 73 20 70 61 72 74 0a  ompiled as part.
11d0: 2a 2a 20 6f 66 20 74 68 65 20 61 6d 61 6c 67 61  ** of the amalga
11e0: 6d 61 74 69 6f 6e 2c 20 74 68 65 79 20 61 72 65  mation, they are
11f0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 2a   not required..*
1200: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1210: 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 0a 73  _AMALGAMATION..s
1220: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
1230: 67 6e 65 64 20 63 68 61 72 20 73 71 6c 69 74 65  gned char sqlite
1240: 33 55 74 66 38 54 72 61 6e 73 31 5b 5d 20 3d 20  3Utf8Trans1[] = 
1250: 7b 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20  {.  0x00, 0x01, 
1260: 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34  0x02, 0x03, 0x04
1270: 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78  , 0x05, 0x06, 0x
1280: 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78 30 39  07,.  0x08, 0x09
1290: 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20 30 78  , 0x0a, 0x0b, 0x
12a0: 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65 2c 20  0c, 0x0d, 0x0e, 
12b0: 30 78 30 66 2c 0a 20 20 30 78 31 30 2c 20 30 78  0x0f,.  0x10, 0x
12c0: 31 31 2c 20 30 78 31 32 2c 20 30 78 31 33 2c 20  11, 0x12, 0x13, 
12d0: 30 78 31 34 2c 20 30 78 31 35 2c 20 30 78 31 36  0x14, 0x15, 0x16
12e0: 2c 20 30 78 31 37 2c 0a 20 20 30 78 31 38 2c 20  , 0x17,.  0x18, 
12f0: 30 78 31 39 2c 20 30 78 31 61 2c 20 30 78 31 62  0x19, 0x1a, 0x1b
1300: 2c 20 30 78 31 63 2c 20 30 78 31 64 2c 20 30 78  , 0x1c, 0x1d, 0x
1310: 31 65 2c 20 30 78 31 66 2c 0a 20 20 30 78 30 30  1e, 0x1f,.  0x00
1320: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
1330: 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20  03, 0x04, 0x05, 
1340: 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78  0x06, 0x07,.  0x
1350: 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61 2c 20  08, 0x09, 0x0a, 
1360: 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78 30 64  0x0b, 0x0c, 0x0d
1370: 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a 20 20  , 0x0e, 0x0f,.  
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32  0x00, 0x01, 0x02
1390: 2c 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78  , 0x03, 0x04, 0x
13a0: 30 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a  05, 0x06, 0x07,.
13b0: 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78    0x00, 0x01, 0x
13c0: 30 32 2c 20 30 78 30 33 2c 20 30 78 30 30 2c 20  02, 0x03, 0x00, 
13d0: 30 78 30 31 2c 20 30 78 30 30 2c 20 30 78 30 30  0x01, 0x00, 0x00
13e0: 2c 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 52 45  ,.};..#define RE
13f0: 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20 7a 54 65  AD_UTF8(zIn, zTe
1400: 72 6d 2c 20 63 29 20 20 20 20 20 20 20 20 20 20  rm, c)          
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 5c 0a 20 20 63 20 3d 20 2a 28 7a 49 6e 2b 2b   \.  c = *(zIn++
1430: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1460: 20 20 69 66 28 20 63 3e 3d 30 78 63 30 20 29 7b    if( c>=0xc0 ){
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
14a0: 20 63 20 3d 20 73 71 6c 69 74 65 33 55 74 66 38   c = sqlite3Utf8
14b0: 54 72 61 6e 73 31 5b 63 2d 30 78 63 30 5d 3b 20  Trans1[c-0xc0]; 
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 77 68          \.    wh
14e0: 69 6c 65 28 20 7a 49 6e 21 3d 7a 54 65 72 6d 20  ile( zIn!=zTerm 
14f0: 26 26 20 28 2a 7a 49 6e 20 26 20 30 78 63 30 29  && (*zIn & 0xc0)
1500: 3d 3d 30 78 38 30 20 29 7b 20 20 20 20 20 20 20  ==0x80 ){       
1510: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 63 20 3d       \.      c =
1520: 20 28 63 3c 3c 36 29 20 2b 20 28 30 78 33 66 20   (c<<6) + (0x3f 
1530: 26 20 2a 28 7a 49 6e 2b 2b 29 29 3b 20 20 20 20  & *(zIn++));    
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 5c 0a 20 20 20 20 7d 20 20 20 20 20 20 20    \.    }       
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1590: 0a 20 20 20 20 69 66 28 20 63 3c 30 78 38 30 20  .    if( c<0x80 
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
15d0: 20 20 20 20 20 20 7c 7c 20 28 63 26 30 78 46 46        || (c&0xFF
15e0: 46 46 46 38 30 30 29 3d 3d 30 78 44 38 30 30 20  FFF800)==0xD800 
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20           \.     
1610: 20 20 20 7c 7c 20 28 63 26 30 78 46 46 46 46 46     || (c&0xFFFFF
1620: 46 46 45 29 3d 3d 30 78 46 46 46 45 20 29 7b 20  FFE)==0xFFFE ){ 
1630: 20 63 20 3d 20 30 78 46 46 46 44 3b 20 7d 20 20   c = 0xFFFD; }  
1640: 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a 0a 23 64        \.  }...#d
1650: 65 66 69 6e 65 20 57 52 49 54 45 5f 55 54 46 38  efine WRITE_UTF8
1660: 28 7a 4f 75 74 2c 20 63 29 20 7b 20 20 20 20 20  (zOut, c) {     
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 5c 0a 20 20 69 66 28 20 63 3c 30       \.  if( c<0
1690: 78 30 30 30 38 30 20 29 7b 20 20 20 20 20 20 20  x00080 ){       
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16c0: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 28 75      *zOut++ = (u
16d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 63 26  nsigned char)(c&
16e0: 30 78 46 46 29 3b 20 20 20 20 20 20 20 20 20 20  0xFF);          
16f0: 20 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20 20         \.  }    
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 5c 0a 20 20 65 6c 73 65 20 69 66 28 20 63 3c 30  \.  else if( c<0
1740: 78 30 30 38 30 30 20 29 7b 20 20 20 20 20 20 20  x00800 ){       
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
1770: 7a 4f 75 74 2b 2b 20 3d 20 30 78 43 30 20 2b 20  zOut++ = 0xC0 + 
1780: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28  (unsigned char)(
1790: 28 63 3e 3e 36 29 26 30 78 31 46 29 3b 20 20 20  (c>>6)&0x1F);   
17a0: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
17b0: 3d 20 30 78 38 30 20 2b 20 28 75 6e 73 69 67 6e  = 0x80 + (unsign
17c0: 65 64 20 63 68 61 72 29 28 63 20 26 20 30 78 33  ed char)(c & 0x3
17d0: 46 29 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 7d  F);        \.  }
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 20 20 20 20 5c 0a 20 20 65 6c 73 65 20 69 66 28      \.  else if(
1820: 20 63 3c 30 78 31 30 30 30 30 20 29 7b 20 20 20   c<0x10000 ){   
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1850: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 45     *zOut++ = 0xE
1860: 30 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 63 68  0 + (unsigned ch
1870: 61 72 29 28 28 63 3e 3e 31 32 29 26 30 78 30 46  ar)((c>>12)&0x0F
1880: 29 3b 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75  );    \.    *zOu
1890: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 6e  t++ = 0x80 + (un
18a0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e  signed char)((c>
18b0: 3e 36 29 20 26 20 30 78 33 46 29 3b 20 20 20 5c  >6) & 0x3F);   \
18c0: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30  .    *zOut++ = 0
18d0: 78 38 30 20 2b 20 28 75 6e 73 69 67 6e 65 64 20  x80 + (unsigned 
18e0: 63 68 61 72 29 28 63 20 26 20 30 78 33 46 29 3b  char)(c & 0x3F);
18f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
1900: 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
1940: 20 30 78 46 30 20 2b 20 28 75 6e 73 69 67 6e 65   0xF0 + (unsigne
1950: 64 20 63 68 61 72 29 28 28 63 3e 3e 31 38 29 20  d char)((c>>18) 
1960: 26 20 30 78 30 37 29 3b 20 20 5c 0a 20 20 20 20  & 0x07);  \.    
1970: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
1980: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
1990: 28 28 63 3e 3e 31 32 29 20 26 20 30 78 33 46 29  ((c>>12) & 0x3F)
19a0: 3b 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b  ;  \.    *zOut++
19b0: 20 3d 20 30 78 38 30 20 2b 20 28 75 6e 73 69 67   = 0x80 + (unsig
19c0: 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e 36 29  ned char)((c>>6)
19d0: 20 26 20 30 78 33 46 29 3b 20 20 20 5c 0a 20 20   & 0x3F);   \.  
19e0: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
19f0: 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   + (unsigned cha
1a00: 72 29 28 63 20 26 20 30 78 33 46 29 3b 20 20 20  r)(c & 0x3F);   
1a10: 20 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20       \.  }      
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1a50: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  }..#endif /* ifn
1a60: 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47  def SQLITE_AMALG
1a70: 41 4d 41 54 49 4f 4e 20 2a 2f 0a 0a 74 79 70 65  AMATION */..type
1a80: 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 63 6f  def struct Unico
1a90: 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72 20 55 6e  de61Tokenizer Un
1aa0: 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72  icode61Tokenizer
1ab0: 3b 0a 73 74 72 75 63 74 20 55 6e 69 63 6f 64 65  ;.struct Unicode
1ac0: 36 31 54 6f 6b 65 6e 69 7a 65 72 20 7b 0a 20 20  61Tokenizer {.  
1ad0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 54  unsigned char aT
1ae0: 6f 6b 65 6e 43 68 61 72 5b 31 32 38 5d 3b 20 20  okenChar[128];  
1af0: 2f 2a 20 41 53 43 49 49 20 72 61 6e 67 65 20 74  /* ASCII range t
1b00: 6f 6b 65 6e 20 63 68 61 72 61 63 74 65 72 73 20  oken characters 
1b10: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 6f 6c 64  */.  char *aFold
1b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b30: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
1b40: 6f 20 66 6f 6c 64 20 74 65 78 74 20 69 6e 74 6f  o fold text into
1b50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 6f 6c 64 3b   */.  int nFold;
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b80: 20 61 46 6f 6c 64 5b 5d 20 69 6e 20 62 79 74 65   aFold[] in byte
1b90: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 52 65 6d 6f  s */.  int eRemo
1ba0: 76 65 44 69 61 63 72 69 74 69 63 3b 20 20 20 20  veDiacritic;    
1bb0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1bc0: 66 20 72 65 6d 6f 76 65 5f 64 69 61 63 72 69 74  f remove_diacrit
1bd0: 69 63 73 3d 31 20 69 73 20 73 65 74 20 2a 2f 0a  ics=1 is set */.
1be0: 20 20 69 6e 74 20 6e 45 78 63 65 70 74 69 6f 6e    int nException
1bf0: 3b 0a 20 20 69 6e 74 20 2a 61 69 45 78 63 65 70  ;.  int *aiExcep
1c00: 74 69 6f 6e 3b 0a 0a 20 20 75 6e 73 69 67 6e 65  tion;..  unsigne
1c10: 64 20 63 68 61 72 20 61 43 61 74 65 67 6f 72 79  d char aCategory
1c20: 5b 33 32 5d 3b 20 20 20 20 2f 2a 20 54 72 75 65  [32];    /* True
1c30: 20 66 6f 72 20 74 6f 6b 65 6e 20 63 68 61 72 20   for token char 
1c40: 63 61 74 65 67 6f 72 69 65 73 20 2a 2f 0a 7d 3b  categories */.};
1c50: 0a 0a 2f 2a 20 56 61 6c 75 65 73 20 66 6f 72 20  ../* Values for 
1c60: 65 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63  eRemoveDiacritic
1c70: 20 28 6d 75 73 74 20 6d 61 74 63 68 20 69 6e 74   (must match int
1c80: 65 72 6e 61 6c 73 20 6f 66 20 66 74 73 35 5f 75  ernals of fts5_u
1c90: 6e 69 63 6f 64 65 32 2e 63 29 20 2a 2f 0a 23 64  nicode2.c) */.#d
1ca0: 65 66 69 6e 65 20 46 54 53 35 5f 52 45 4d 4f 56  efine FTS5_REMOV
1cb0: 45 5f 44 49 41 43 52 49 54 49 43 53 5f 4e 4f 4e  E_DIACRITICS_NON
1cc0: 45 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 46  E    0.#define F
1cd0: 54 53 35 5f 52 45 4d 4f 56 45 5f 44 49 41 43 52  TS5_REMOVE_DIACR
1ce0: 49 54 49 43 53 5f 53 49 4d 50 4c 45 20 20 31 0a  ITICS_SIMPLE  1.
1cf0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 52 45 4d  #define FTS5_REM
1d00: 4f 56 45 5f 44 49 41 43 52 49 54 49 43 53 5f 43  OVE_DIACRITICS_C
1d10: 4f 4d 50 4c 45 58 20 32 0a 0a 73 74 61 74 69 63  OMPLEX 2..static
1d20: 20 69 6e 74 20 66 74 73 35 55 6e 69 63 6f 64 65   int fts5Unicode
1d30: 41 64 64 45 78 63 65 70 74 69 6f 6e 73 28 0a 20  AddExceptions(. 
1d40: 20 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69   Unicode61Tokeni
1d50: 7a 65 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  zer *p,         
1d60: 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72 20 6f 62   /* Tokenizer ob
1d70: 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
1d80: 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20  char *z,        
1d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61            /* Cha
1da0: 72 61 63 74 65 72 73 20 74 6f 20 74 72 65 61 74  racters to treat
1db0: 20 61 73 20 65 78 63 65 70 74 69 6f 6e 73 20 2a   as exceptions *
1dc0: 2f 0a 20 20 69 6e 74 20 62 54 6f 6b 65 6e 43 68  /.  int bTokenCh
1dd0: 61 72 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ars             
1de0: 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 27 74 6f      /* 1 for 'to
1df0: 6b 65 6e 63 68 61 72 73 27 2c 20 30 20 66 6f 72  kenchars', 0 for
1e00: 20 27 73 65 70 61 72 61 74 6f 72 73 27 20 2a 2f   'separators' */
1e10: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1e20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
1e30: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
1e40: 7a 29 3b 0a 20 20 69 6e 74 20 2a 61 4e 65 77 3b  z);.  int *aNew;
1e50: 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ..  if( n>0 ){. 
1e60: 20 20 20 61 4e 65 77 20 3d 20 28 69 6e 74 2a 29     aNew = (int*)
1e70: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
1e80: 70 2d 3e 61 69 45 78 63 65 70 74 69 6f 6e 2c 20  p->aiException, 
1e90: 28 6e 2b 70 2d 3e 6e 45 78 63 65 70 74 69 6f 6e  (n+p->nException
1ea0: 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  )*sizeof(int));.
1eb0: 20 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a      if( aNew ){.
1ec0: 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
1ed0: 20 70 2d 3e 6e 45 78 63 65 70 74 69 6f 6e 3b 0a   p->nException;.
1ee0: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
1ef0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 73 72 20  gned char *zCsr 
1f00: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1f10: 64 20 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20 20  d char*)z;.     
1f20: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1f30: 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63  char *zTerm = (c
1f40: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1f50: 61 72 2a 29 26 7a 5b 6e 5d 3b 0a 20 20 20 20 20  ar*)&z[n];.     
1f60: 20 77 68 69 6c 65 28 20 7a 43 73 72 3c 7a 54 65   while( zCsr<zTe
1f70: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  rm ){.        in
1f80: 74 20 69 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  t iCode;.       
1f90: 20 69 6e 74 20 62 54 6f 6b 65 6e 3b 0a 20 20 20   int bToken;.   
1fa0: 20 20 20 20 20 52 45 41 44 5f 55 54 46 38 28 7a       READ_UTF8(z
1fb0: 43 73 72 2c 20 7a 54 65 72 6d 2c 20 69 43 6f 64  Csr, zTerm, iCod
1fc0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1fd0: 69 43 6f 64 65 3c 31 32 38 20 29 7b 0a 20 20 20  iCode<128 ){.   
1fe0: 20 20 20 20 20 20 20 70 2d 3e 61 54 6f 6b 65 6e         p->aToken
1ff0: 43 68 61 72 5b 69 43 6f 64 65 5d 20 3d 20 28 75  Char[iCode] = (u
2000: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 62 54 6f  nsigned char)bTo
2010: 6b 65 6e 43 68 61 72 73 3b 0a 20 20 20 20 20 20  kenChars;.      
2020: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2030: 20 20 20 62 54 6f 6b 65 6e 20 3d 20 70 2d 3e 61     bToken = p->a
2040: 43 61 74 65 67 6f 72 79 5b 73 71 6c 69 74 65 33  Category[sqlite3
2050: 46 74 73 35 55 6e 69 63 6f 64 65 43 61 74 65 67  Fts5UnicodeCateg
2060: 6f 72 79 28 69 43 6f 64 65 29 5d 3b 0a 20 20 20  ory(iCode)];.   
2070: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
2080: 62 54 6f 6b 65 6e 3d 3d 30 20 7c 7c 20 62 54 6f  bToken==0 || bTo
2090: 6b 65 6e 3d 3d 31 29 20 29 3b 20 0a 20 20 20 20  ken==1) ); .    
20a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62        assert( (b
20b0: 54 6f 6b 65 6e 43 68 61 72 73 3d 3d 30 20 7c 7c  TokenChars==0 ||
20c0: 20 62 54 6f 6b 65 6e 43 68 61 72 73 3d 3d 31 29   bTokenChars==1)
20d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
20e0: 28 20 62 54 6f 6b 65 6e 21 3d 62 54 6f 6b 65 6e  ( bToken!=bToken
20f0: 43 68 61 72 73 20 26 26 20 73 71 6c 69 74 65 33  Chars && sqlite3
2100: 46 74 73 35 55 6e 69 63 6f 64 65 49 73 64 69 61  Fts5UnicodeIsdia
2110: 63 72 69 74 69 63 28 69 43 6f 64 65 29 3d 3d 30  critic(iCode)==0
2120: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2130: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
2140: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e     for(i=0; i<nN
2150: 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ew; i++){.      
2160: 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
2170: 5b 69 5d 3e 69 43 6f 64 65 20 29 20 62 72 65 61  [i]>iCode ) brea
2180: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
2190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
21a0: 6d 6f 76 65 28 26 61 4e 65 77 5b 69 2b 31 5d 2c  move(&aNew[i+1],
21b0: 20 26 61 4e 65 77 5b 69 5d 2c 20 28 6e 4e 65 77   &aNew[i], (nNew
21c0: 2d 69 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  -i)*sizeof(int))
21d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4e  ;.            aN
21e0: 65 77 5b 69 5d 20 3d 20 69 43 6f 64 65 3b 0a 20  ew[i] = iCode;. 
21f0: 20 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 2b             nNew+
2200: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2210: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2220: 0a 20 20 20 20 20 20 70 2d 3e 61 69 45 78 63 65  .      p->aiExce
2230: 70 74 69 6f 6e 20 3d 20 61 4e 65 77 3b 0a 20 20  ption = aNew;.  
2240: 20 20 20 20 70 2d 3e 6e 45 78 63 65 70 74 69 6f      p->nExceptio
2250: 6e 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 65  n = nNew;.    }e
2260: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2270: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2280: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2290: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22a0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
22b0: 65 20 70 2d 3e 61 69 45 78 63 65 70 74 69 6f 6e  e p->aiException
22c0: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
22d0: 73 20 74 68 65 20 76 61 6c 75 65 20 69 43 6f 64  s the value iCod
22e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22f0: 20 66 74 73 35 55 6e 69 63 6f 64 65 49 73 45 78   fts5UnicodeIsEx
2300: 63 65 70 74 69 6f 6e 28 55 6e 69 63 6f 64 65 36  ception(Unicode6
2310: 31 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 2c 20 69  1Tokenizer *p, i
2320: 6e 74 20 69 43 6f 64 65 29 7b 0a 20 20 69 66 28  nt iCode){.  if(
2330: 20 70 2d 3e 6e 45 78 63 65 70 74 69 6f 6e 3e 30   p->nException>0
2340: 20 29 7b 0a 20 20 20 20 69 6e 74 20 2a 61 20 3d   ){.    int *a =
2350: 20 70 2d 3e 61 69 45 78 63 65 70 74 69 6f 6e 3b   p->aiException;
2360: 0a 20 20 20 20 69 6e 74 20 69 4c 6f 20 3d 20 30  .    int iLo = 0
2370: 3b 0a 20 20 20 20 69 6e 74 20 69 48 69 20 3d 20  ;.    int iHi = 
2380: 70 2d 3e 6e 45 78 63 65 70 74 69 6f 6e 2d 31 3b  p->nException-1;
2390: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69 48 69  ..    while( iHi
23a0: 3e 3d 69 4c 6f 20 29 7b 0a 20 20 20 20 20 20 69  >=iLo ){.      i
23b0: 6e 74 20 69 54 65 73 74 20 3d 20 28 69 48 69 20  nt iTest = (iHi 
23c0: 2b 20 69 4c 6f 29 20 2f 20 32 3b 0a 20 20 20 20  + iLo) / 2;.    
23d0: 20 20 69 66 28 20 69 43 6f 64 65 3d 3d 61 5b 69    if( iCode==a[i
23e0: 54 65 73 74 5d 20 29 7b 0a 20 20 20 20 20 20 20  Test] ){.       
23f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2400: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 64 65   }else if( iCode
2410: 3e 61 5b 69 54 65 73 74 5d 20 29 7b 0a 20 20 20  >a[iTest] ){.   
2420: 20 20 20 20 20 69 4c 6f 20 3d 20 69 54 65 73 74       iLo = iTest
2430: 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
2440: 0a 20 20 20 20 20 20 20 20 69 48 69 20 3d 20 69  .        iHi = i
2450: 54 65 73 74 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  Test-1;.      }.
2460: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2470: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2480: 44 65 6c 65 74 65 20 61 20 22 75 6e 69 63 6f 64  Delete a "unicod
2490: 65 36 31 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a  e61" tokenizer..
24a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
24b0: 74 73 35 55 6e 69 63 6f 64 65 44 65 6c 65 74 65  ts5UnicodeDelete
24c0: 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a  (Fts5Tokenizer *
24d0: 70 54 6f 6b 29 7b 0a 20 20 69 66 28 20 70 54 6f  pTok){.  if( pTo
24e0: 6b 20 29 7b 0a 20 20 20 20 55 6e 69 63 6f 64 65  k ){.    Unicode
24f0: 36 31 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 20 3d  61Tokenizer *p =
2500: 20 28 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e   (Unicode61Token
2510: 69 7a 65 72 2a 29 70 54 6f 6b 3b 0a 20 20 20 20  izer*)pTok;.    
2520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
2530: 61 69 45 78 63 65 70 74 69 6f 6e 29 3b 0a 20 20  aiException);.  
2540: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2550: 2d 3e 61 46 6f 6c 64 29 3b 0a 20 20 20 20 73 71  ->aFold);.    sq
2560: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
2570: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
2580: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 63 6f  static int unico
2590: 64 65 53 65 74 43 61 74 65 67 6f 72 69 65 73 28  deSetCategories(
25a0: 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a  Unicode61Tokeniz
25b0: 65 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  er *p, const cha
25c0: 72 20 2a 7a 43 61 74 29 7b 0a 20 20 63 6f 6e 73  r *zCat){.  cons
25d0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 43 61 74  t char *z = zCat
25e0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  ;..  while( *z )
25f0: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 3d  {.    while( *z=
2600: 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27  =' ' || *z=='\t'
2610: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) z++;.    if( 
2620: 2a 7a 20 26 26 20 73 71 6c 69 74 65 33 46 74 73  *z && sqlite3Fts
2630: 35 55 6e 69 63 6f 64 65 43 61 74 50 61 72 73 65  5UnicodeCatParse
2640: 28 7a 2c 20 70 2d 3e 61 43 61 74 65 67 6f 72 79  (z, p->aCategory
2650: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
2660: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2670: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
2680: 20 2a 7a 21 3d 27 20 27 20 26 26 20 2a 7a 21 3d   *z!=' ' && *z!=
2690: 27 5c 74 27 20 26 26 20 2a 7a 21 3d 27 5c 30 27  '\t' && *z!='\0'
26a0: 20 29 20 7a 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 73   ) z++;.  }..  s
26b0: 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64  qlite3Fts5Unicod
26c0: 65 41 73 63 69 69 28 70 2d 3e 61 43 61 74 65 67  eAscii(p->aCateg
26d0: 6f 72 79 2c 20 70 2d 3e 61 54 6f 6b 65 6e 43 68  ory, p->aTokenCh
26e0: 61 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ar);.  return SQ
26f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2700: 2a 20 43 72 65 61 74 65 20 61 20 22 75 6e 69 63  * Create a "unic
2710: 6f 64 65 36 31 22 20 74 6f 6b 65 6e 69 7a 65 72  ode61" tokenizer
2720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2730: 66 74 73 35 55 6e 69 63 6f 64 65 43 72 65 61 74  fts5UnicodeCreat
2740: 65 28 0a 20 20 76 6f 69 64 20 2a 70 55 6e 75 73  e(.  void *pUnus
2750: 65 64 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  ed, .  const cha
2760: 72 20 2a 2a 61 7a 41 72 67 2c 20 69 6e 74 20 6e  r **azArg, int n
2770: 41 72 67 2c 0a 20 20 46 74 73 35 54 6f 6b 65 6e  Arg,.  Fts5Token
2780: 69 7a 65 72 20 2a 2a 70 70 4f 75 74 0a 29 7b 0a  izer **ppOut.){.
2790: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27a0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
27b0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
27c0: 20 2a 2f 0a 20 20 55 6e 69 63 6f 64 65 36 31 54   */.  Unicode61T
27d0: 6f 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20 30 3b  okenizer *p = 0;
27e0: 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 6f 6b        /* New tok
27f0: 65 6e 69 7a 65 72 20 6f 62 6a 65 63 74 20 2a 2f  enizer object */
2800: 20 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   ..  UNUSED_PARA
2810: 4d 28 70 55 6e 75 73 65 64 29 3b 0a 0a 20 20 69  M(pUnused);..  i
2820: 66 28 20 6e 41 72 67 25 32 20 29 7b 0a 20 20 20  f( nArg%2 ){.   
2830: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2840: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
2850: 20 70 20 3d 20 28 55 6e 69 63 6f 64 65 36 31 54   p = (Unicode61T
2860: 6f 6b 65 6e 69 7a 65 72 2a 29 73 71 6c 69 74 65  okenizer*)sqlite
2870: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
2880: 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a  Unicode61Tokeniz
2890: 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 20  er));.    if( p 
28a0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
28b0: 68 61 72 20 2a 7a 43 61 74 20 3d 20 22 4c 2a 20  har *zCat = "L* 
28c0: 4e 2a 20 43 6f 22 3b 0a 20 20 20 20 20 20 69 6e  N* Co";.      in
28d0: 74 20 69 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  t i;.      memse
28e0: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55  t(p, 0, sizeof(U
28f0: 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65  nicode61Tokenize
2900: 72 29 29 3b 0a 0a 20 20 20 20 20 20 70 2d 3e 65  r));..      p->e
2910: 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 20  RemoveDiacritic 
2920: 3d 20 46 54 53 35 5f 52 45 4d 4f 56 45 5f 44 49  = FTS5_REMOVE_DI
2930: 41 43 52 49 54 49 43 53 5f 53 49 4d 50 4c 45 3b  ACRITICS_SIMPLE;
2940: 0a 20 20 20 20 20 20 70 2d 3e 6e 46 6f 6c 64 20  .      p->nFold 
2950: 3d 20 36 34 3b 0a 20 20 20 20 20 20 70 2d 3e 61  = 64;.      p->a
2960: 46 6f 6c 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Fold = sqlite3_m
2970: 61 6c 6c 6f 63 28 70 2d 3e 6e 46 6f 6c 64 20 2a  alloc(p->nFold *
2980: 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29 3b 0a   sizeof(char));.
2990: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 46 6f        if( p->aFo
29a0: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ld==0 ){.       
29b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
29c0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  EM;.      }..   
29d0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
29e0: 20 61 20 22 63 61 74 65 67 6f 72 69 65 73 22 20   a "categories" 
29f0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  argument */.    
2a00: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
2a10: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41  QLITE_OK && i<nA
2a20: 72 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  rg; i+=2){.     
2a30: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
2a40: 33 5f 73 74 72 69 63 6d 70 28 61 7a 41 72 67 5b  3_stricmp(azArg[
2a50: 69 5d 2c 20 22 63 61 74 65 67 6f 72 69 65 73 22  i], "categories"
2a60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
2a70: 43 61 74 20 3d 20 61 7a 41 72 67 5b 69 2b 31 5d  Cat = azArg[i+1]
2a80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a90: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
2aa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ab0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
2ac0: 63 6f 64 65 53 65 74 43 61 74 65 67 6f 72 69 65  codeSetCategorie
2ad0: 73 28 70 2c 20 7a 43 61 74 29 3b 0a 20 20 20 20  s(p, zCat);.    
2ae0: 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
2af0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
2b00: 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b 3d  K && i<nArg; i+=
2b10: 32 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  2){.        cons
2b20: 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 61  t char *zArg = a
2b30: 7a 41 72 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20  zArg[i+1];.     
2b40: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
2b50: 33 5f 73 74 72 69 63 6d 70 28 61 7a 41 72 67 5b  3_stricmp(azArg[
2b60: 69 5d 2c 20 22 72 65 6d 6f 76 65 5f 64 69 61 63  i], "remove_diac
2b70: 72 69 74 69 63 73 22 29 20 29 7b 0a 20 20 20 20  ritics") ){.    
2b80: 20 20 20 20 20 20 69 66 28 20 28 7a 41 72 67 5b        if( (zArg[
2b90: 30 5d 21 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  0]!='0' && zArg[
2ba0: 30 5d 21 3d 27 31 27 20 26 26 20 7a 41 72 67 5b  0]!='1' && zArg[
2bb0: 30 5d 21 3d 27 32 27 29 20 7c 7c 20 7a 41 72 67  0]!='2') || zArg
2bc0: 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [1] ){.         
2bd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2be0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
2bf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c00: 20 20 20 70 2d 3e 65 52 65 6d 6f 76 65 44 69 61     p->eRemoveDia
2c10: 63 72 69 74 69 63 20 3d 20 28 7a 41 72 67 5b 30  critic = (zArg[0
2c20: 5d 20 2d 20 27 30 27 29 3b 0a 20 20 20 20 20 20  ] - '0');.      
2c30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2c40: 3e 65 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69  >eRemoveDiacriti
2c50: 63 3d 3d 46 54 53 35 5f 52 45 4d 4f 56 45 5f 44  c==FTS5_REMOVE_D
2c60: 49 41 43 52 49 54 49 43 53 5f 4e 4f 4e 45 0a 20  IACRITICS_NONE. 
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 7c 7c 20 70 2d 3e 65 52 65 6d 6f 76 65 44 69 61  || p->eRemoveDia
2c90: 63 72 69 74 69 63 3d 3d 46 54 53 35 5f 52 45 4d  critic==FTS5_REM
2ca0: 4f 56 45 5f 44 49 41 43 52 49 54 49 43 53 5f 53  OVE_DIACRITICS_S
2cb0: 49 4d 50 4c 45 0a 20 20 20 20 20 20 20 20 20 20  IMPLE.          
2cc0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 52 65         || p->eRe
2cd0: 6d 6f 76 65 44 69 61 63 72 69 74 69 63 3d 3d 46  moveDiacritic==F
2ce0: 54 53 35 5f 52 45 4d 4f 56 45 5f 44 49 41 43 52  TS5_REMOVE_DIACR
2cf0: 49 54 49 43 53 5f 43 4f 4d 50 4c 45 58 0a 20 20  ITICS_COMPLEX.  
2d00: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
2d10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d20: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
2d30: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
2d40: 72 69 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20  ricmp(azArg[i], 
2d50: 22 74 6f 6b 65 6e 63 68 61 72 73 22 29 20 29 7b  "tokenchars") ){
2d60: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2d70: 66 74 73 35 55 6e 69 63 6f 64 65 41 64 64 45 78  fts5UnicodeAddEx
2d80: 63 65 70 74 69 6f 6e 73 28 70 2c 20 7a 41 72 67  ceptions(p, zArg
2d90: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
2da0: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
2db0: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
2dc0: 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22 73 65  mp(azArg[i], "se
2dd0: 70 61 72 61 74 6f 72 73 22 29 20 29 7b 0a 20 20  parators") ){.  
2de0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2df0: 35 55 6e 69 63 6f 64 65 41 64 64 45 78 63 65 70  5UnicodeAddExcep
2e00: 74 69 6f 6e 73 28 70 2c 20 7a 41 72 67 2c 20 30  tions(p, zArg, 0
2e10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2e20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
2e30: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2e40: 61 7a 41 72 67 5b 69 5d 2c 20 22 63 61 74 65 67  azArg[i], "categ
2e50: 6f 72 69 65 73 22 29 20 29 7b 0a 20 20 20 20 20  ories") ){.     
2e60: 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
2e70: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2e80: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2e90: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2ea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
2eb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ec0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2ed0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
2ee0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ef0: 29 7b 0a 20 20 20 20 20 20 66 74 73 35 55 6e 69  ){.      fts5Uni
2f00: 63 6f 64 65 44 65 6c 65 74 65 28 28 46 74 73 35  codeDelete((Fts5
2f10: 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 29 3b 0a 20  Tokenizer*)p);. 
2f20: 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
2f30: 7d 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 28  }.    *ppOut = (
2f40: 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 29 70  Fts5Tokenizer*)p
2f50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2f70: 72 6e 20 74 72 75 65 20 69 66 2c 20 66 6f 72 20  rn true if, for 
2f80: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
2f90: 74 6f 6b 65 6e 69 7a 69 6e 67 20 77 69 74 68 20  tokenizing with 
2fa0: 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 0a 2a 2a  the tokenizer.**
2fb0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2fc0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 63  irst argument, c
2fd0: 6f 64 65 70 6f 69 6e 74 20 69 43 6f 64 65 20 69  odepoint iCode i
2fe0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 74  s considered a t
2ff0: 6f 6b 65 6e 20 0a 2a 2a 20 63 68 61 72 61 63 74  oken .** charact
3000: 65 72 20 28 6e 6f 74 20 61 20 73 65 70 61 72 61  er (not a separa
3010: 74 6f 72 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tor)..*/.static 
3020: 69 6e 74 20 66 74 73 35 55 6e 69 63 6f 64 65 49  int fts5UnicodeI
3030: 73 41 6c 6e 75 6d 28 55 6e 69 63 6f 64 65 36 31  sAlnum(Unicode61
3040: 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 2c 20 69 6e  Tokenizer *p, in
3050: 74 20 69 43 6f 64 65 29 7b 0a 20 20 72 65 74 75  t iCode){.  retu
3060: 72 6e 20 28 0a 20 20 20 20 70 2d 3e 61 43 61 74  rn (.    p->aCat
3070: 65 67 6f 72 79 5b 73 71 6c 69 74 65 33 46 74 73  egory[sqlite3Fts
3080: 35 55 6e 69 63 6f 64 65 43 61 74 65 67 6f 72 79  5UnicodeCategory
3090: 28 69 43 6f 64 65 29 5d 0a 20 20 20 20 5e 20 66  (iCode)].    ^ f
30a0: 74 73 35 55 6e 69 63 6f 64 65 49 73 45 78 63 65  ts5UnicodeIsExce
30b0: 70 74 69 6f 6e 28 70 2c 20 69 43 6f 64 65 29 0a  ption(p, iCode).
30c0: 20 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69    );.}..static i
30d0: 6e 74 20 66 74 73 35 55 6e 69 63 6f 64 65 54 6f  nt fts5UnicodeTo
30e0: 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35 54 6f  kenize(.  Fts5To
30f0: 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69  kenizer *pTokeni
3100: 7a 65 72 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74  zer,.  void *pCt
3110: 78 2c 0a 20 20 69 6e 74 20 69 55 6e 75 73 65 64  x,.  int iUnused
3120: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
3130: 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78 74  pText, int nText
3140: 2c 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e  ,.  int (*xToken
3150: 29 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f  )(void*, int, co
3160: 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 20 6e  nst char*, int n
3170: 54 6f 6b 65 6e 2c 20 69 6e 74 20 69 53 74 61 72  Token, int iStar
3180: 74 2c 20 69 6e 74 20 69 45 6e 64 29 0a 29 7b 0a  t, int iEnd).){.
3190: 20 20 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e    Unicode61Token
31a0: 69 7a 65 72 20 2a 70 20 3d 20 28 55 6e 69 63 6f  izer *p = (Unico
31b0: 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72 2a 29 70  de61Tokenizer*)p
31c0: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 69 6e 74  Tokenizer;.  int
31d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
31f0: 20 2a 61 20 3d 20 70 2d 3e 61 54 6f 6b 65 6e 43   *a = p->aTokenC
3200: 68 61 72 3b 0a 0a 20 20 75 6e 73 69 67 6e 65 64  har;..  unsigned
3210: 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28   char *zTerm = (
3220: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
3230: 70 54 65 78 74 5b 6e 54 65 78 74 5d 3b 0a 20 20  pText[nText];.  
3240: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
3250: 43 73 72 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  Csr = (unsigned 
3260: 63 68 61 72 20 2a 29 70 54 65 78 74 3b 0a 0a 20  char *)pText;.. 
3270: 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
3280: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46 6f  r */.  char *aFo
3290: 6c 64 20 3d 20 70 2d 3e 61 46 6f 6c 64 3b 0a 20  ld = p->aFold;. 
32a0: 20 69 6e 74 20 6e 46 6f 6c 64 20 3d 20 70 2d 3e   int nFold = p->
32b0: 6e 46 6f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  nFold;.  const c
32c0: 68 61 72 20 2a 70 45 6e 64 20 3d 20 26 61 46 6f  har *pEnd = &aFo
32d0: 6c 64 5b 6e 46 6f 6c 64 2d 36 5d 3b 0a 0a 20 20  ld[nFold-6];..  
32e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 69 55 6e  UNUSED_PARAM(iUn
32f0: 75 73 65 64 29 3b 0a 0a 20 20 2f 2a 20 45 61 63  used);..  /* Eac
3300: 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  h iteration of t
3310: 68 69 73 20 6c 6f 6f 70 20 67 6f 62 62 6c 65 73  his loop gobbles
3320: 20 75 70 20 61 20 63 6f 6e 74 69 67 75 6f 75 73   up a contiguous
3330: 20 72 75 6e 20 6f 66 20 73 65 70 61 72 61 74 6f   run of separato
3340: 72 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  rs,.  ** then th
3350: 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 20 20 2a  e next token.  *
3360: 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
3370: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3380: 69 6e 74 20 69 43 6f 64 65 3b 20 20 20 20 20 20  int iCode;      
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33a0: 20 6e 6f 6e 2d 41 53 43 49 49 20 63 6f 64 65 70   non-ASCII codep
33b0: 6f 69 6e 74 20 72 65 61 64 20 66 72 6f 6d 20 69  oint read from i
33c0: 6e 70 75 74 20 2a 2f 0a 20 20 20 20 63 68 61 72  nput */.    char
33d0: 20 2a 7a 4f 75 74 20 3d 20 61 46 6f 6c 64 3b 0a   *zOut = aFold;.
33e0: 20 20 20 20 69 6e 74 20 69 73 3b 0a 20 20 20 20      int is;.    
33f0: 69 6e 74 20 69 65 3b 0a 0a 20 20 20 20 2f 2a 20  int ie;..    /* 
3400: 53 6b 69 70 20 61 6e 79 20 73 65 70 61 72 61 74  Skip any separat
3410: 6f 72 20 63 68 61 72 61 63 74 65 72 73 2e 20 2a  or characters. *
3420: 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  /.    while( 1 )
3430: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 73 72  {.      if( zCsr
3440: 3e 3d 7a 54 65 72 6d 20 29 20 67 6f 74 6f 20 74  >=zTerm ) goto t
3450: 6f 6b 65 6e 69 7a 65 5f 64 6f 6e 65 3b 0a 20 20  okenize_done;.  
3460: 20 20 20 20 69 66 28 20 2a 7a 43 73 72 20 26 20      if( *zCsr & 
3470: 30 78 38 30 20 29 20 7b 0a 20 20 20 20 20 20 20  0x80 ) {.       
3480: 20 2f 2a 20 41 20 63 68 61 72 61 63 74 65 72 20   /* A character 
3490: 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65 20 61  outside of the a
34a0: 73 63 69 69 20 72 61 6e 67 65 2e 20 53 6b 69 70  scii range. Skip
34b0: 20 70 61 73 74 20 69 74 20 69 66 20 69 74 20 69   past it if it i
34c0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 73  s.        ** a s
34d0: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
34e0: 65 72 2e 20 4f 72 20 62 72 65 61 6b 20 6f 75 74  er. Or break out
34f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
3500: 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20  it is not. */.  
3510: 20 20 20 20 20 20 69 73 20 3d 20 7a 43 73 72 20        is = zCsr 
3520: 2d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  - (unsigned char
3530: 2a 29 70 54 65 78 74 3b 0a 20 20 20 20 20 20 20  *)pText;.       
3540: 20 52 45 41 44 5f 55 54 46 38 28 7a 43 73 72 2c   READ_UTF8(zCsr,
3550: 20 7a 54 65 72 6d 2c 20 69 43 6f 64 65 29 3b 0a   zTerm, iCode);.
3560: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
3570: 55 6e 69 63 6f 64 65 49 73 41 6c 6e 75 6d 28 70  UnicodeIsAlnum(p
3580: 2c 20 69 43 6f 64 65 29 20 29 7b 0a 20 20 20 20  , iCode) ){.    
3590: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 6e 5f 61        goto non_a
35a0: 73 63 69 69 5f 74 6f 6b 65 6e 63 68 61 72 3b 0a  scii_tokenchar;.
35b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
35d0: 66 28 20 61 5b 2a 7a 43 73 72 5d 20 29 7b 0a 20  f( a[*zCsr] ){. 
35e0: 20 20 20 20 20 20 20 20 20 69 73 20 3d 20 7a 43           is = zC
35f0: 73 72 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 63  sr - (unsigned c
3600: 68 61 72 2a 29 70 54 65 78 74 3b 0a 20 20 20 20  har*)pText;.    
3610: 20 20 20 20 20 20 67 6f 74 6f 20 61 73 63 69 69        goto ascii
3620: 5f 74 6f 6b 65 6e 63 68 61 72 3b 0a 20 20 20 20  _tokenchar;.    
3630: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43      }.        zC
3640: 73 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sr++;.      }.  
3650: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20    }..    /* Run 
3660: 74 68 72 6f 75 67 68 20 74 68 65 20 74 6f 6b 65  through the toke
3670: 6e 63 68 61 72 73 2e 20 46 6f 6c 64 20 74 68 65  nchars. Fold the
3680: 6d 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  m into the outpu
3690: 74 20 62 75 66 66 65 72 20 61 6c 6f 6e 67 0a 20  t buffer along. 
36a0: 20 20 20 2a 2a 20 74 68 65 20 77 61 79 2e 20 20     ** the way.  
36b0: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 43  */.    while( zC
36c0: 73 72 3c 7a 54 65 72 6d 20 29 7b 0a 0a 20 20 20  sr<zTerm ){..   
36d0: 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 6f     /* Grow the o
36e0: 75 74 70 75 74 20 62 75 66 66 65 72 20 73 6f 20  utput buffer so 
36f0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
3700: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
3710: 6f 20 66 69 74 20 74 68 65 0a 20 20 20 20 20 20  o fit the.      
3720: 2a 2a 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69  ** largest possi
3730: 62 6c 65 20 75 74 66 2d 38 20 63 68 61 72 61 63  ble utf-8 charac
3740: 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ter.  */.      i
3750: 66 28 20 7a 4f 75 74 3e 70 45 6e 64 20 29 7b 0a  f( zOut>pEnd ){.
3760: 20 20 20 20 20 20 20 20 61 46 6f 6c 64 20 3d 20          aFold = 
3770: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
3780: 46 6f 6c 64 2a 32 29 3b 0a 20 20 20 20 20 20 20  Fold*2);.       
3790: 20 69 66 28 20 61 46 6f 6c 64 3d 3d 30 20 29 7b   if( aFold==0 ){
37a0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
37b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
37c0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6b          goto tok
37d0: 65 6e 69 7a 65 5f 64 6f 6e 65 3b 0a 20 20 20 20  enize_done;.    
37e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
37f0: 75 74 20 3d 20 26 61 46 6f 6c 64 5b 7a 4f 75 74  ut = &aFold[zOut
3800: 20 2d 20 70 2d 3e 61 46 6f 6c 64 5d 3b 0a 20 20   - p->aFold];.  
3810: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 46 6f        memcpy(aFo
3820: 6c 64 2c 20 70 2d 3e 61 46 6f 6c 64 2c 20 6e 46  ld, p->aFold, nF
3830: 6f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  old);.        sq
3840: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46  lite3_free(p->aF
3850: 6f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  old);.        p-
3860: 3e 61 46 6f 6c 64 20 3d 20 61 46 6f 6c 64 3b 0a  >aFold = aFold;.
3870: 20 20 20 20 20 20 20 20 70 2d 3e 6e 46 6f 6c 64          p->nFold
3880: 20 3d 20 6e 46 6f 6c 64 20 3d 20 6e 46 6f 6c 64   = nFold = nFold
3890: 2a 32 3b 0a 20 20 20 20 20 20 20 20 70 45 6e 64  *2;.        pEnd
38a0: 20 3d 20 26 61 46 6f 6c 64 5b 6e 46 6f 6c 64 2d   = &aFold[nFold-
38b0: 36 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  6];.      }..   
38c0: 20 20 20 69 66 28 20 2a 7a 43 73 72 20 26 20 30     if( *zCsr & 0
38d0: 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  x80 ){.        /
38e0: 2a 20 41 6e 20 6e 6f 6e 2d 61 73 63 69 69 2d 72  * An non-ascii-r
38f0: 61 6e 67 65 20 63 68 61 72 61 63 74 65 72 2e 20  ange character. 
3900: 46 6f 6c 64 20 69 74 20 69 6e 74 6f 20 74 68 65  Fold it into the
3910: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
3920: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  f.        ** it 
3930: 69 73 20 61 20 74 6f 6b 65 6e 20 63 68 61 72 61  is a token chara
3940: 63 74 65 72 2c 20 6f 72 20 62 72 65 61 6b 20 6f  cter, or break o
3950: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  ut of the loop i
3960: 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f 0a  f it is not. */.
3970: 20 20 20 20 20 20 20 20 52 45 41 44 5f 55 54 46          READ_UTF
3980: 38 28 7a 43 73 72 2c 20 7a 54 65 72 6d 2c 20 69  8(zCsr, zTerm, i
3990: 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Code);.        i
39a0: 66 28 20 66 74 73 35 55 6e 69 63 6f 64 65 49 73  f( fts5UnicodeIs
39b0: 41 6c 6e 75 6d 28 70 2c 69 43 6f 64 65 29 7c 7c  Alnum(p,iCode)||
39c0: 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f  sqlite3Fts5Unico
39d0: 64 65 49 73 64 69 61 63 72 69 74 69 63 28 69 43  deIsdiacritic(iC
39e0: 6f 64 65 29 20 29 7b 0a 20 6e 6f 6e 5f 61 73 63  ode) ){. non_asc
39f0: 69 69 5f 74 6f 6b 65 6e 63 68 61 72 3a 0a 20 20  ii_tokenchar:.  
3a00: 20 20 20 20 20 20 20 20 69 43 6f 64 65 20 3d 20          iCode = 
3a10: 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f  sqlite3Fts5Unico
3a20: 64 65 46 6f 6c 64 28 69 43 6f 64 65 2c 20 70 2d  deFold(iCode, p-
3a30: 3e 65 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69  >eRemoveDiacriti
3a40: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  c);.          if
3a50: 28 20 69 43 6f 64 65 20 29 20 57 52 49 54 45 5f  ( iCode ) WRITE_
3a60: 55 54 46 38 28 7a 4f 75 74 2c 20 69 43 6f 64 65  UTF8(zOut, iCode
3a70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
3a80: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
3a90: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
3aa0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 5b 2a     }else if( a[*
3ab0: 7a 43 73 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  zCsr]==0 ){.    
3ac0: 20 20 20 20 2f 2a 20 41 6e 20 61 73 63 69 69 2d      /* An ascii-
3ad0: 72 61 6e 67 65 20 73 65 70 61 72 61 74 6f 72 20  range separator 
3ae0: 63 68 61 72 61 63 74 65 72 2e 20 45 6e 64 20 6f  character. End o
3af0: 66 20 74 6f 6b 65 6e 2e 20 2a 2f 0a 20 20 20 20  f token. */.    
3b00: 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 20 20      break; .    
3b10: 20 20 7d 65 6c 73 65 7b 0a 20 61 73 63 69 69 5f    }else{. ascii_
3b20: 74 6f 6b 65 6e 63 68 61 72 3a 0a 20 20 20 20 20  tokenchar:.     
3b30: 20 20 20 69 66 28 20 2a 7a 43 73 72 3e 3d 27 41     if( *zCsr>='A
3b40: 27 20 26 26 20 2a 7a 43 73 72 3c 3d 27 5a 27 20  ' && *zCsr<='Z' 
3b50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 4f  ){.          *zO
3b60: 75 74 2b 2b 20 3d 20 2a 7a 43 73 72 20 2b 20 33  ut++ = *zCsr + 3
3b70: 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  2;.        }else
3b80: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 4f 75  {.          *zOu
3b90: 74 2b 2b 20 3d 20 2a 7a 43 73 72 3b 0a 20 20 20  t++ = *zCsr;.   
3ba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
3bb0: 43 73 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Csr++;.      }. 
3bc0: 20 20 20 20 20 69 65 20 3d 20 7a 43 73 72 20 2d       ie = zCsr -
3bd0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
3be0: 29 70 54 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  )pText;.    }.. 
3bf0: 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65     /* Invoke the
3c00: 20 74 6f 6b 65 6e 20 63 61 6c 6c 62 61 63 6b 20   token callback 
3c10: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 78 54 6f 6b  */.    rc = xTok
3c20: 65 6e 28 70 43 74 78 2c 20 30 2c 20 61 46 6f 6c  en(pCtx, 0, aFol
3c30: 64 2c 20 7a 4f 75 74 2d 61 46 6f 6c 64 2c 20 69  d, zOut-aFold, i
3c40: 73 2c 20 69 65 29 3b 20 0a 20 20 7d 0a 20 20 0a  s, ie); .  }.  .
3c50: 20 74 6f 6b 65 6e 69 7a 65 5f 64 6f 6e 65 3a 0a   tokenize_done:.
3c60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
3c70: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
3c80: 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
3c90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   rc;.}../*******
3ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ce0: 2a 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 6f 66 20  ***.** Start of 
3cf0: 70 6f 72 74 65 72 20 73 74 65 6d 6d 65 72 20 69  porter stemmer i
3d00: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
3d10: 2f 0a 0a 2f 2a 20 41 6e 79 20 74 6f 6b 65 6e 73  /../* Any tokens
3d20: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
3d30: 73 20 28 69 6e 20 62 79 74 65 73 29 20 61 72 65  s (in bytes) are
3d40: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
3d50: 77 69 74 68 6f 75 74 0a 2a 2a 20 73 74 65 6d 6d  without.** stemm
3d60: 69 6e 67 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ing. */.#define 
3d70: 46 54 53 35 5f 50 4f 52 54 45 52 5f 4d 41 58 5f  FTS5_PORTER_MAX_
3d80: 54 4f 4b 45 4e 20 36 34 0a 0a 74 79 70 65 64 65  TOKEN 64..typede
3d90: 66 20 73 74 72 75 63 74 20 50 6f 72 74 65 72 54  f struct PorterT
3da0: 6f 6b 65 6e 69 7a 65 72 20 50 6f 72 74 65 72 54  okenizer PorterT
3db0: 6f 6b 65 6e 69 7a 65 72 3b 0a 73 74 72 75 63 74  okenizer;.struct
3dc0: 20 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72   PorterTokenizer
3dd0: 20 7b 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69   {.  fts5_tokeni
3de0: 7a 65 72 20 74 6f 6b 65 6e 69 7a 65 72 3b 20 20  zer tokenizer;  
3df0: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74       /* Parent t
3e00: 6f 6b 65 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20  okenizer module 
3e10: 2a 2f 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  */.  Fts5Tokeniz
3e20: 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 3b 20  er *pTokenizer; 
3e30: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74       /* Parent t
3e40: 6f 6b 65 6e 69 7a 65 72 20 69 6e 73 74 61 6e 63  okenizer instanc
3e50: 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 42 75 66  e */.  char aBuf
3e60: 5b 46 54 53 35 5f 50 4f 52 54 45 52 5f 4d 41 58  [FTS5_PORTER_MAX
3e70: 5f 54 4f 4b 45 4e 20 2b 20 36 34 5d 3b 0a 7d 3b  _TOKEN + 64];.};
3e80: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
3e90: 20 22 70 6f 72 74 65 72 22 20 74 6f 6b 65 6e 69   "porter" tokeni
3ea0: 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  zer..*/.static v
3eb0: 6f 69 64 20 66 74 73 35 50 6f 72 74 65 72 44 65  oid fts5PorterDe
3ec0: 6c 65 74 65 28 46 74 73 35 54 6f 6b 65 6e 69 7a  lete(Fts5Tokeniz
3ed0: 65 72 20 2a 70 54 6f 6b 29 7b 0a 20 20 69 66 28  er *pTok){.  if(
3ee0: 20 70 54 6f 6b 20 29 7b 0a 20 20 20 20 50 6f 72   pTok ){.    Por
3ef0: 74 65 72 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 20  terTokenizer *p 
3f00: 3d 20 28 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  = (PorterTokeniz
3f10: 65 72 2a 29 70 54 6f 6b 3b 0a 20 20 20 20 69 66  er*)pTok;.    if
3f20: 28 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 20  ( p->pTokenizer 
3f30: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 74 6f 6b 65  ){.      p->toke
3f40: 6e 69 7a 65 72 2e 78 44 65 6c 65 74 65 28 70 2d  nizer.xDelete(p-
3f50: 3e 70 54 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20 20  >pTokenizer);.  
3f60: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
3f70: 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
3f80: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 22  /*.** Create a "
3f90: 70 6f 72 74 65 72 22 20 74 6f 6b 65 6e 69 7a 65  porter" tokenize
3fa0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
3fb0: 20 66 74 73 35 50 6f 72 74 65 72 43 72 65 61 74   fts5PorterCreat
3fc0: 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  e(.  void *pCtx,
3fd0: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
3fe0: 2a 61 7a 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  *azArg, int nArg
3ff0: 2c 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65  ,.  Fts5Tokenize
4000: 72 20 2a 2a 70 70 4f 75 74 0a 29 7b 0a 20 20 66  r **ppOut.){.  f
4010: 74 73 35 5f 61 70 69 20 2a 70 41 70 69 20 3d 20  ts5_api *pApi = 
4020: 28 66 74 73 35 5f 61 70 69 2a 29 70 43 74 78 3b  (fts5_api*)pCtx;
4030: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
4040: 54 45 5f 4f 4b 3b 0a 20 20 50 6f 72 74 65 72 54  TE_OK;.  PorterT
4050: 6f 6b 65 6e 69 7a 65 72 20 2a 70 52 65 74 3b 0a  okenizer *pRet;.
4060: 20 20 76 6f 69 64 20 2a 70 55 73 65 72 64 61 74    void *pUserdat
4070: 61 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  a = 0;.  const c
4080: 68 61 72 20 2a 7a 42 61 73 65 20 3d 20 22 75 6e  har *zBase = "un
4090: 69 63 6f 64 65 36 31 22 3b 0a 0a 20 20 69 66 28  icode61";..  if(
40a0: 20 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 7a   nArg>0 ){.    z
40b0: 42 61 73 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b  Base = azArg[0];
40c0: 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 28  .  }..  pRet = (
40d0: 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72 2a  PorterTokenizer*
40e0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
40f0: 73 69 7a 65 6f 66 28 50 6f 72 74 65 72 54 6f 6b  sizeof(PorterTok
4100: 65 6e 69 7a 65 72 29 29 3b 0a 20 20 69 66 28 20  enizer));.  if( 
4110: 70 52 65 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73  pRet ){.    mems
4120: 65 74 28 70 52 65 74 2c 20 30 2c 20 73 69 7a 65  et(pRet, 0, size
4130: 6f 66 28 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  of(PorterTokeniz
4140: 65 72 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  er));.    rc = p
4150: 41 70 69 2d 3e 78 46 69 6e 64 54 6f 6b 65 6e 69  Api->xFindTokeni
4160: 7a 65 72 28 70 41 70 69 2c 20 7a 42 61 73 65 2c  zer(pApi, zBase,
4170: 20 26 70 55 73 65 72 64 61 74 61 2c 20 26 70 52   &pUserdata, &pR
4180: 65 74 2d 3e 74 6f 6b 65 6e 69 7a 65 72 29 3b 0a  et->tokenizer);.
4190: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
41a0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
41b0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
41c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
41d0: 6e 74 20 6e 41 72 67 32 20 3d 20 28 6e 41 72 67  nt nArg2 = (nArg
41e0: 3e 30 20 3f 20 6e 41 72 67 2d 31 20 3a 20 30 29  >0 ? nArg-1 : 0)
41f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
4200: 20 2a 2a 61 7a 41 72 67 32 20 3d 20 28 6e 41 72   **azArg2 = (nAr
4210: 67 32 20 3f 20 26 61 7a 41 72 67 5b 31 5d 20 3a  g2 ? &azArg[1] :
4220: 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 52   0);.    rc = pR
4230: 65 74 2d 3e 74 6f 6b 65 6e 69 7a 65 72 2e 78 43  et->tokenizer.xC
4240: 72 65 61 74 65 28 70 55 73 65 72 64 61 74 61 2c  reate(pUserdata,
4250: 20 61 7a 41 72 67 32 2c 20 6e 41 72 67 32 2c 20   azArg2, nArg2, 
4260: 26 70 52 65 74 2d 3e 70 54 6f 6b 65 6e 69 7a 65  &pRet->pTokenize
4270: 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  r);.  }..  if( r
4280: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4290: 20 20 20 20 66 74 73 35 50 6f 72 74 65 72 44 65      fts5PorterDe
42a0: 6c 65 74 65 28 28 46 74 73 35 54 6f 6b 65 6e 69  lete((Fts5Tokeni
42b0: 7a 65 72 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  zer*)pRet);.    
42c0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
42d0: 2a 70 70 4f 75 74 20 3d 20 28 46 74 73 35 54 6f  *ppOut = (Fts5To
42e0: 6b 65 6e 69 7a 65 72 2a 29 70 52 65 74 3b 0a 20  kenizer*)pRet;. 
42f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74   return rc;.}..t
4300: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f  ypedef struct Po
4310: 72 74 65 72 43 6f 6e 74 65 78 74 20 50 6f 72 74  rterContext Port
4320: 65 72 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  erContext;.struc
4330: 74 20 50 6f 72 74 65 72 43 6f 6e 74 65 78 74 20  t PorterContext 
4340: 7b 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 3b 0a  {.  void *pCtx;.
4350: 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28    int (*xToken)(
4360: 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73  void*, int, cons
4370: 74 20 63 68 61 72 2a 2c 20 69 6e 74 2c 20 69 6e  t char*, int, in
4380: 74 2c 20 69 6e 74 29 3b 0a 20 20 63 68 61 72 20  t, int);.  char 
4390: 2a 61 42 75 66 3b 0a 7d 3b 0a 0a 74 79 70 65 64  *aBuf;.};..typed
43a0: 65 66 20 73 74 72 75 63 74 20 50 6f 72 74 65 72  ef struct Porter
43b0: 52 75 6c 65 20 50 6f 72 74 65 72 52 75 6c 65 3b  Rule PorterRule;
43c0: 0a 73 74 72 75 63 74 20 50 6f 72 74 65 72 52 75  .struct PorterRu
43d0: 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  le {.  const cha
43e0: 72 20 2a 7a 53 75 66 66 69 78 3b 0a 20 20 69 6e  r *zSuffix;.  in
43f0: 74 20 6e 53 75 66 66 69 78 3b 0a 20 20 69 6e 74  t nSuffix;.  int
4400: 20 28 2a 78 43 6f 6e 64 29 28 63 68 61 72 20 2a   (*xCond)(char *
4410: 7a 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74 65 6d  zStem, int nStem
4420: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
4430: 2a 7a 4f 75 74 70 75 74 3b 0a 20 20 69 6e 74 20  *zOutput;.  int 
4440: 6e 4f 75 74 70 75 74 3b 0a 7d 3b 0a 0a 23 69 66  nOutput;.};..#if
4450: 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74   0.static int ft
4460: 73 35 50 6f 72 74 65 72 41 70 70 6c 79 28 63 68  s5PorterApply(ch
4470: 61 72 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70  ar *aBuf, int *p
4480: 6e 42 75 66 2c 20 50 6f 72 74 65 72 52 75 6c 65  nBuf, PorterRule
4490: 20 2a 61 52 75 6c 65 29 7b 0a 20 20 69 6e 74 20   *aRule){.  int 
44a0: 72 65 74 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  ret = -1;.  int 
44b0: 6e 42 75 66 20 3d 20 2a 70 6e 42 75 66 3b 0a 20  nBuf = *pnBuf;. 
44c0: 20 50 6f 72 74 65 72 52 75 6c 65 20 2a 70 3b 0a   PorterRule *p;.
44d0: 0a 20 20 66 6f 72 28 70 3d 61 52 75 6c 65 3b 20  .  for(p=aRule; 
44e0: 70 2d 3e 7a 53 75 66 66 69 78 3b 20 70 2b 2b 29  p->zSuffix; p++)
44f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74  {.    assert( st
4500: 72 6c 65 6e 28 70 2d 3e 7a 53 75 66 66 69 78 29  rlen(p->zSuffix)
4510: 3d 3d 70 2d 3e 6e 53 75 66 66 69 78 20 29 3b 0a  ==p->nSuffix );.
4520: 20 20 20 20 61 73 73 65 72 74 28 20 73 74 72 6c      assert( strl
4530: 65 6e 28 70 2d 3e 7a 4f 75 74 70 75 74 29 3d 3d  en(p->zOutput)==
4540: 70 2d 3e 6e 4f 75 74 70 75 74 20 29 3b 0a 20 20  p->nOutput );.  
4550: 20 20 69 66 28 20 6e 42 75 66 3c 70 2d 3e 6e 53    if( nBuf<p->nS
4560: 75 66 66 69 78 20 29 20 63 6f 6e 74 69 6e 75 65  uffix ) continue
4570: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 6d 65 6d  ;.    if( 0==mem
4580: 63 6d 70 28 26 61 42 75 66 5b 6e 42 75 66 20 2d  cmp(&aBuf[nBuf -
4590: 20 70 2d 3e 6e 53 75 66 66 69 78 5d 2c 20 70 2d   p->nSuffix], p-
45a0: 3e 7a 53 75 66 66 69 78 2c 20 70 2d 3e 6e 53 75  >zSuffix, p->nSu
45b0: 66 66 69 78 29 20 29 20 62 72 65 61 6b 3b 0a 20  ffix) ) break;. 
45c0: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 53 75   }..  if( p->zSu
45d0: 66 66 69 78 20 29 7b 0a 20 20 20 20 69 6e 74 20  ffix ){.    int 
45e0: 6e 53 74 65 6d 20 3d 20 6e 42 75 66 20 2d 20 70  nStem = nBuf - p
45f0: 2d 3e 6e 53 75 66 66 69 78 3b 0a 20 20 20 20 69  ->nSuffix;.    i
4600: 66 28 20 70 2d 3e 78 43 6f 6e 64 3d 3d 30 20 7c  f( p->xCond==0 |
4610: 7c 20 70 2d 3e 78 43 6f 6e 64 28 61 42 75 66 2c  | p->xCond(aBuf,
4620: 20 6e 53 74 65 6d 29 20 29 7b 0a 20 20 20 20 20   nStem) ){.     
4630: 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 53   memcpy(&aBuf[nS
4640: 74 65 6d 5d 2c 20 70 2d 3e 7a 4f 75 74 70 75 74  tem], p->zOutput
4650: 2c 20 70 2d 3e 6e 4f 75 74 70 75 74 29 3b 0a 20  , p->nOutput);. 
4660: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 53       *pnBuf = nS
4670: 74 65 6d 20 2b 20 70 2d 3e 6e 4f 75 74 70 75 74  tem + p->nOutput
4680: 3b 0a 20 20 20 20 20 20 72 65 74 20 3d 20 70 20  ;.      ret = p 
4690: 2d 20 61 52 75 6c 65 3b 0a 20 20 20 20 7d 0a 20  - aRule;.    }. 
46a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74   }..  return ret
46b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ;.}.#endif..stat
46c0: 69 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65  ic int fts5Porte
46d0: 72 49 73 56 6f 77 65 6c 28 63 68 61 72 20 63 2c  rIsVowel(char c,
46e0: 20 69 6e 74 20 62 59 49 73 56 6f 77 65 6c 29 7b   int bYIsVowel){
46f0: 0a 20 20 72 65 74 75 72 6e 20 28 0a 20 20 20 20  .  return (.    
4700: 20 20 63 3d 3d 27 61 27 20 7c 7c 20 63 3d 3d 27    c=='a' || c=='
4710: 65 27 20 7c 7c 20 63 3d 3d 27 69 27 20 7c 7c 20  e' || c=='i' || 
4720: 63 3d 3d 27 6f 27 20 7c 7c 20 63 3d 3d 27 75 27  c=='o' || c=='u'
4730: 20 7c 7c 20 28 62 59 49 73 56 6f 77 65 6c 20 26   || (bYIsVowel &
4740: 26 20 63 3d 3d 27 79 27 29 0a 20 20 29 3b 0a 7d  & c=='y').  );.}
4750: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
4760: 35 50 6f 72 74 65 72 47 6f 62 62 6c 65 56 43 28  5PorterGobbleVC(
4770: 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20 69 6e 74  char *zStem, int
4780: 20 6e 53 74 65 6d 2c 20 69 6e 74 20 62 50 72 65   nStem, int bPre
4790: 76 43 6f 6e 73 29 7b 0a 20 20 69 6e 74 20 69 3b  vCons){.  int i;
47a0: 0a 20 20 69 6e 74 20 62 43 6f 6e 73 20 3d 20 62  .  int bCons = b
47b0: 50 72 65 76 43 6f 6e 73 3b 0a 0a 20 20 2f 2a 20  PrevCons;..  /* 
47c0: 53 63 61 6e 20 66 6f 72 20 61 20 76 6f 77 65 6c  Scan for a vowel
47d0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
47e0: 3c 6e 53 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nStem; i++){.  
47f0: 20 20 69 66 28 20 30 3d 3d 28 62 43 6f 6e 73 20    if( 0==(bCons 
4800: 3d 20 21 66 74 73 35 50 6f 72 74 65 72 49 73 56  = !fts5PorterIsV
4810: 6f 77 65 6c 28 7a 53 74 65 6d 5b 69 5d 2c 20 62  owel(zStem[i], b
4820: 43 6f 6e 73 29 29 20 29 20 62 72 65 61 6b 3b 0a  Cons)) ) break;.
4830: 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 66    }..  /* Scan f
4840: 6f 72 20 61 20 63 6f 6e 73 6f 6e 65 6e 74 20 2a  or a consonent *
4850: 2f 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 6e  /.  for(i++; i<n
4860: 53 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Stem; i++){.    
4870: 69 66 28 20 28 62 43 6f 6e 73 20 3d 20 21 66 74  if( (bCons = !ft
4880: 73 35 50 6f 72 74 65 72 49 73 56 6f 77 65 6c 28  s5PorterIsVowel(
4890: 7a 53 74 65 6d 5b 69 5d 2c 20 62 43 6f 6e 73 29  zStem[i], bCons)
48a0: 29 20 29 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a  ) ) return i+1;.
48b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
48c0: 7d 0a 0a 2f 2a 20 70 6f 72 74 65 72 20 72 75 6c  }../* porter rul
48d0: 65 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 28 6d 20  e condition: (m 
48e0: 3e 20 30 29 20 2a 2f 0a 73 74 61 74 69 63 20 69  > 0) */.static i
48f0: 6e 74 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  nt fts5Porter_MG
4900: 74 30 28 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20  t0(char *zStem, 
4910: 69 6e 74 20 6e 53 74 65 6d 29 7b 0a 20 20 72 65  int nStem){.  re
4920: 74 75 72 6e 20 21 21 66 74 73 35 50 6f 72 74 65  turn !!fts5Porte
4930: 72 47 6f 62 62 6c 65 56 43 28 7a 53 74 65 6d 2c  rGobbleVC(zStem,
4940: 20 6e 53 74 65 6d 2c 20 30 29 3b 0a 7d 0a 0a 2f   nStem, 0);.}../
4950: 2a 20 70 6f 72 74 65 72 20 72 75 6c 65 20 63 6f  * porter rule co
4960: 6e 64 69 74 69 6f 6e 3a 20 28 6d 20 3e 20 31 29  ndition: (m > 1)
4970: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66   */.static int f
4980: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 63  ts5Porter_MGt1(c
4990: 68 61 72 20 2a 7a 53 74 65 6d 2c 20 69 6e 74 20  har *zStem, int 
49a0: 6e 53 74 65 6d 29 7b 0a 20 20 69 6e 74 20 6e 3b  nStem){.  int n;
49b0: 0a 20 20 6e 20 3d 20 66 74 73 35 50 6f 72 74 65  .  n = fts5Porte
49c0: 72 47 6f 62 62 6c 65 56 43 28 7a 53 74 65 6d 2c  rGobbleVC(zStem,
49d0: 20 6e 53 74 65 6d 2c 20 30 29 3b 0a 20 20 69 66   nStem, 0);.  if
49e0: 28 20 6e 20 26 26 20 66 74 73 35 50 6f 72 74 65  ( n && fts5Porte
49f0: 72 47 6f 62 62 6c 65 56 43 28 26 7a 53 74 65 6d  rGobbleVC(&zStem
4a00: 5b 6e 5d 2c 20 6e 53 74 65 6d 2d 6e 2c 20 31 29  [n], nStem-n, 1)
4a10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4a20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4a30: 3b 0a 7d 0a 0a 2f 2a 20 70 6f 72 74 65 72 20 72  ;.}../* porter r
4a40: 75 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 28  ule condition: (
4a50: 6d 20 3d 20 31 29 20 2a 2f 0a 73 74 61 74 69 63  m = 1) */.static
4a60: 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72 5f   int fts5Porter_
4a70: 4d 45 71 31 28 63 68 61 72 20 2a 7a 53 74 65 6d  MEq1(char *zStem
4a80: 2c 20 69 6e 74 20 6e 53 74 65 6d 29 7b 0a 20 20  , int nStem){.  
4a90: 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 66 74 73  int n;.  n = fts
4aa0: 35 50 6f 72 74 65 72 47 6f 62 62 6c 65 56 43 28  5PorterGobbleVC(
4ab0: 7a 53 74 65 6d 2c 20 6e 53 74 65 6d 2c 20 30 29  zStem, nStem, 0)
4ac0: 3b 0a 20 20 69 66 28 20 6e 20 26 26 20 30 3d 3d  ;.  if( n && 0==
4ad0: 66 74 73 35 50 6f 72 74 65 72 47 6f 62 62 6c 65  fts5PorterGobble
4ae0: 56 43 28 26 7a 53 74 65 6d 5b 6e 5d 2c 20 6e 53  VC(&zStem[n], nS
4af0: 74 65 6d 2d 6e 2c 20 31 29 20 29 7b 0a 20 20 20  tem-n, 1) ){.   
4b00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
4b10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4b20: 20 70 6f 72 74 65 72 20 72 75 6c 65 20 63 6f 6e   porter rule con
4b30: 64 69 74 69 6f 6e 3a 20 28 2a 6f 29 20 2a 2f 0a  dition: (*o) */.
4b40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
4b50: 6f 72 74 65 72 5f 4f 73 74 61 72 28 63 68 61 72  orter_Ostar(char
4b60: 20 2a 7a 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74   *zStem, int nSt
4b70: 65 6d 29 7b 0a 20 20 69 66 28 20 7a 53 74 65 6d  em){.  if( zStem
4b80: 5b 6e 53 74 65 6d 2d 31 5d 3d 3d 27 77 27 20 7c  [nStem-1]=='w' |
4b90: 7c 20 7a 53 74 65 6d 5b 6e 53 74 65 6d 2d 31 5d  | zStem[nStem-1]
4ba0: 3d 3d 27 78 27 20 7c 7c 20 7a 53 74 65 6d 5b 6e  =='x' || zStem[n
4bb0: 53 74 65 6d 2d 31 5d 3d 3d 27 79 27 20 29 7b 0a  Stem-1]=='y' ){.
4bc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
4be0: 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d  ;.    int mask =
4bf0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 43 6f 6e   0;.    int bCon
4c00: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  s = 0;.    for(i
4c10: 3d 30 3b 20 69 3c 6e 53 74 65 6d 3b 20 69 2b 2b  =0; i<nStem; i++
4c20: 29 7b 0a 20 20 20 20 20 20 62 43 6f 6e 73 20 3d  ){.      bCons =
4c30: 20 21 66 74 73 35 50 6f 72 74 65 72 49 73 56 6f   !fts5PorterIsVo
4c40: 77 65 6c 28 7a 53 74 65 6d 5b 69 5d 2c 20 62 43  wel(zStem[i], bC
4c50: 6f 6e 73 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ons);.      asse
4c60: 72 74 28 20 62 43 6f 6e 73 3d 3d 30 20 7c 7c 20  rt( bCons==0 || 
4c70: 62 43 6f 6e 73 3d 3d 31 20 29 3b 0a 20 20 20 20  bCons==1 );.    
4c80: 20 20 6d 61 73 6b 20 3d 20 28 6d 61 73 6b 20 3c    mask = (mask <
4c90: 3c 20 31 29 20 2b 20 62 43 6f 6e 73 3b 0a 20 20  < 1) + bCons;.  
4ca0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 28    }.    return (
4cb0: 28 6d 61 73 6b 20 26 20 30 78 30 30 30 37 29 3d  (mask & 0x0007)=
4cc0: 3d 30 78 30 30 30 35 29 3b 0a 20 20 7d 0a 7d 0a  =0x0005);.  }.}.
4cd0: 0a 2f 2a 20 70 6f 72 74 65 72 20 72 75 6c 65 20  ./* porter rule 
4ce0: 63 6f 6e 64 69 74 69 6f 6e 3a 20 28 6d 20 3e 20  condition: (m > 
4cf0: 31 20 61 6e 64 20 28 2a 53 20 6f 72 20 2a 54 29  1 and (*S or *T)
4d00: 29 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ) */.static int 
4d10: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 5f  fts5Porter_MGt1_
4d20: 61 6e 64 5f 53 5f 6f 72 5f 54 28 63 68 61 72 20  and_S_or_T(char 
4d30: 2a 7a 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74 65  *zStem, int nSte
4d40: 6d 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e 53  m){.  assert( nS
4d50: 74 65 6d 3e 30 20 29 3b 0a 20 20 72 65 74 75 72  tem>0 );.  retur
4d60: 6e 20 28 7a 53 74 65 6d 5b 6e 53 74 65 6d 2d 31  n (zStem[nStem-1
4d70: 5d 3d 3d 27 73 27 20 7c 7c 20 7a 53 74 65 6d 5b  ]=='s' || zStem[
4d80: 6e 53 74 65 6d 2d 31 5d 3d 3d 27 74 27 29 20 0a  nStem-1]=='t') .
4d90: 20 20 20 20 20 20 26 26 20 66 74 73 35 50 6f 72        && fts5Por
4da0: 74 65 72 5f 4d 47 74 31 28 7a 53 74 65 6d 2c 20  ter_MGt1(zStem, 
4db0: 6e 53 74 65 6d 29 3b 0a 7d 0a 0a 2f 2a 20 70 6f  nStem);.}../* po
4dc0: 72 74 65 72 20 72 75 6c 65 20 63 6f 6e 64 69 74  rter rule condit
4dd0: 69 6f 6e 3a 20 28 2a 76 2a 29 20 2a 2f 0a 73 74  ion: (*v*) */.st
4de0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 72  atic int fts5Por
4df0: 74 65 72 5f 56 6f 77 65 6c 28 63 68 61 72 20 2a  ter_Vowel(char *
4e00: 7a 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74 65 6d  zStem, int nStem
4e10: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
4e20: 72 28 69 3d 30 3b 20 69 3c 6e 53 74 65 6d 3b 20  r(i=0; i<nStem; 
4e30: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 66 74  i++){.    if( ft
4e40: 73 35 50 6f 72 74 65 72 49 73 56 6f 77 65 6c 28  s5PorterIsVowel(
4e50: 7a 53 74 65 6d 5b 69 5d 2c 20 69 3e 30 29 20 29  zStem[i], i>0) )
4e60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4e70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4e80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a  turn 0;.}.../***
4e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ed0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
4ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f20: 2a 2a 2a 0a 2a 2a 20 47 45 4e 45 52 41 54 45 44  ***.** GENERATED
4f30: 20 43 4f 44 45 20 53 54 41 52 54 53 20 48 45 52   CODE STARTS HER
4f40: 45 20 28 6d 6b 70 6f 72 74 65 72 73 74 65 70 73  E (mkportersteps
4f50: 2e 74 63 6c 29 0a 2a 2f 0a 0a 73 74 61 74 69 63  .tcl).*/..static
4f60: 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72 53   int fts5PorterS
4f70: 74 65 70 34 28 63 68 61 72 20 2a 61 42 75 66 2c  tep4(char *aBuf,
4f80: 20 69 6e 74 20 2a 70 6e 42 75 66 29 7b 0a 20 20   int *pnBuf){.  
4f90: 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 69  int ret = 0;.  i
4fa0: 6e 74 20 6e 42 75 66 20 3d 20 2a 70 6e 42 75 66  nt nBuf = *pnBuf
4fb0: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 42 75 66  ;.  switch( aBuf
4fc0: 5b 6e 42 75 66 2d 32 5d 20 29 7b 0a 20 20 20 20  [nBuf-2] ){.    
4fd0: 0a 20 20 20 20 63 61 73 65 20 27 61 27 3a 20 0a  .    case 'a': .
4fe0: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 32        if( nBuf>2
4ff0: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61   && 0==memcmp("a
5000: 6c 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 32  l", &aBuf[nBuf-2
5010: 5d 2c 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 2) ){.       
5020: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
5030: 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d  MGt1(aBuf, nBuf-
5040: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
5050: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
5060: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
5070: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
5080: 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27 63  ;.  .    case 'c
5090: 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42  ': .      if( nB
50a0: 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>4 && 0==memcm
50b0: 70 28 22 61 6e 63 65 22 2c 20 26 61 42 75 66 5b  p("ance", &aBuf[
50c0: 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20  nBuf-4], 4) ){. 
50d0: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
50e0: 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c  orter_MGt1(aBuf,
50f0: 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20 20   nBuf-4) ){.    
5100: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
5110: 42 75 66 20 2d 20 34 3b 0a 20 20 20 20 20 20 20  Buf - 4;.       
5120: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
5130: 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d  f( nBuf>4 && 0==
5140: 6d 65 6d 63 6d 70 28 22 65 6e 63 65 22 2c 20 26  memcmp("ence", &
5150: 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29  aBuf[nBuf-4], 4)
5160: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5170: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28  fts5Porter_MGt1(
5180: 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b  aBuf, nBuf-4) ){
5190: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
51a0: 66 20 3d 20 6e 42 75 66 20 2d 20 34 3b 0a 20 20  f = nBuf - 4;.  
51b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
51c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
51d0: 20 20 20 20 63 61 73 65 20 27 65 27 3a 20 0a 20      case 'e': . 
51e0: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 32 20       if( nBuf>2 
51f0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65 72  && 0==memcmp("er
5200: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d  ", &aBuf[nBuf-2]
5210: 2c 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 2) ){.        
5220: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
5230: 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 32  Gt1(aBuf, nBuf-2
5240: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  ) ){.          *
5250: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 32  pnBuf = nBuf - 2
5260: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5270: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5280: 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27 69 27  .  .    case 'i'
5290: 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75  : .      if( nBu
52a0: 66 3e 32 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  f>2 && 0==memcmp
52b0: 28 22 69 63 22 2c 20 26 61 42 75 66 5b 6e 42 75  ("ic", &aBuf[nBu
52c0: 66 2d 32 5d 2c 20 32 29 20 29 7b 0a 20 20 20 20  f-2], 2) ){.    
52d0: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
52e0: 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42  er_MGt1(aBuf, nB
52f0: 75 66 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-2) ){.       
5300: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
5310: 20 2d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 2;.        }.
5320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5330: 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65  eak;.  .    case
5340: 20 27 6c 27 3a 20 0a 20 20 20 20 20 20 69 66 28   'l': .      if(
5350: 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65   nBuf>4 && 0==me
5360: 6d 63 6d 70 28 22 61 62 6c 65 22 2c 20 26 61 42  mcmp("able", &aB
5370: 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29  uf[nBuf-4], 4) )
5380: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
5390: 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42  s5Porter_MGt1(aB
53a0: 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20  uf, nBuf-4) ){. 
53b0: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
53c0: 3d 20 6e 42 75 66 20 2d 20 34 3b 0a 20 20 20 20  = nBuf - 4;.    
53d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
53e0: 65 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20  e if( nBuf>4 && 
53f0: 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 62 6c 65 22  0==memcmp("ible"
5400: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c  , &aBuf[nBuf-4],
5410: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   4) ){.        i
5420: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
5430: 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29  t1(aBuf, nBuf-4)
5440: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
5450: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 3b  nBuf = nBuf - 4;
5460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5470: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5480: 20 20 0a 20 20 20 20 63 61 73 65 20 27 6e 27 3a    .    case 'n':
5490: 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66   .      if( nBuf
54a0: 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >3 && 0==memcmp(
54b0: 22 61 6e 74 22 2c 20 26 61 42 75 66 5b 6e 42 75  "ant", &aBuf[nBu
54c0: 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20  f-3], 3) ){.    
54d0: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
54e0: 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42  er_MGt1(aBuf, nB
54f0: 75 66 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-3) ){.       
5500: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
5510: 20 2d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 3;.        }.
5520: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
5530: 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>5 && 0==mem
5540: 63 6d 70 28 22 65 6d 65 6e 74 22 2c 20 26 61 42  cmp("ement", &aB
5550: 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29  uf[nBuf-5], 5) )
5560: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
5570: 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42  s5Porter_MGt1(aB
5580: 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20  uf, nBuf-5) ){. 
5590: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
55a0: 3d 20 6e 42 75 66 20 2d 20 35 3b 0a 20 20 20 20  = nBuf - 5;.    
55b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
55c0: 65 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20  e if( nBuf>4 && 
55d0: 30 3d 3d 6d 65 6d 63 6d 70 28 22 6d 65 6e 74 22  0==memcmp("ment"
55e0: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c  , &aBuf[nBuf-4],
55f0: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   4) ){.        i
5600: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
5610: 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29  t1(aBuf, nBuf-4)
5620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
5630: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 3b  nBuf = nBuf - 4;
5640: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5650: 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e   }else if( nBuf>
5660: 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  3 && 0==memcmp("
5670: 65 6e 74 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  ent", &aBuf[nBuf
5680: 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20 20  -3], 3) ){.     
5690: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
56a0: 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75  r_MGt1(aBuf, nBu
56b0: 66 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-3) ){.        
56c0: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
56d0: 2d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 3;.        }. 
56e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
56f0: 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20  ak;.  .    case 
5700: 27 6f 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20  'o': .      if( 
5710: 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>3 && 0==mem
5720: 63 6d 70 28 22 69 6f 6e 22 2c 20 26 61 42 75 66  cmp("ion", &aBuf
5730: 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a  [nBuf-3], 3) ){.
5740: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
5750: 50 6f 72 74 65 72 5f 4d 47 74 31 5f 61 6e 64 5f  Porter_MGt1_and_
5760: 53 5f 6f 72 5f 54 28 61 42 75 66 2c 20 6e 42 75  S_or_T(aBuf, nBu
5770: 66 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-3) ){.        
5780: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
5790: 2d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 3;.        }. 
57a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
57b0: 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>2 && 0==memc
57c0: 6d 70 28 22 6f 75 22 2c 20 26 61 42 75 66 5b 6e  mp("ou", &aBuf[n
57d0: 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b 0a 20 20  Buf-2], 2) ){.  
57e0: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
57f0: 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20  rter_MGt1(aBuf, 
5800: 6e 42 75 66 2d 32 29 20 29 7b 0a 20 20 20 20 20  nBuf-2) ){.     
5810: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
5820: 75 66 20 2d 20 32 3b 0a 20 20 20 20 20 20 20 20  uf - 2;.        
5830: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5840: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61  break;.  .    ca
5850: 73 65 20 27 73 27 3a 20 0a 20 20 20 20 20 20 69  se 's': .      i
5860: 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d  f( nBuf>3 && 0==
5870: 6d 65 6d 63 6d 70 28 22 69 73 6d 22 2c 20 26 61  memcmp("ism", &a
5880: 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20  Buf[nBuf-3], 3) 
5890: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
58a0: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61  ts5Porter_MGt1(a
58b0: 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a  Buf, nBuf-3) ){.
58c0: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
58d0: 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20   = nBuf - 3;.   
58e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
58f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20       break;.  . 
5900: 20 20 20 63 61 73 65 20 27 74 27 3a 20 0a 20 20     case 't': .  
5910: 20 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26      if( nBuf>3 &
5920: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 74 65  & 0==memcmp("ate
5930: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d  ", &aBuf[nBuf-3]
5940: 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 3) ){.        
5950: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
5960: 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 33  Gt1(aBuf, nBuf-3
5970: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  ) ){.          *
5980: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 33  pnBuf = nBuf - 3
5990: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
59a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66    }else if( nBuf
59b0: 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >3 && 0==memcmp(
59c0: 22 69 74 69 22 2c 20 26 61 42 75 66 5b 6e 42 75  "iti", &aBuf[nBu
59d0: 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20  f-3], 3) ){.    
59e0: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
59f0: 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42  er_MGt1(aBuf, nB
5a00: 75 66 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-3) ){.       
5a10: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
5a20: 20 2d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 3;.        }.
5a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5a40: 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65  eak;.  .    case
5a50: 20 27 75 27 3a 20 0a 20 20 20 20 20 20 69 66 28   'u': .      if(
5a60: 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65   nBuf>3 && 0==me
5a70: 6d 63 6d 70 28 22 6f 75 73 22 2c 20 26 61 42 75  mcmp("ous", &aBu
5a80: 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b  f[nBuf-3], 3) ){
5a90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
5aa0: 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75  5Porter_MGt1(aBu
5ab0: 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20  f, nBuf-3) ){.  
5ac0: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
5ad0: 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20 20   nBuf - 3;.     
5ae0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5af0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20     break;.  .   
5b00: 20 63 61 73 65 20 27 76 27 3a 20 0a 20 20 20 20   case 'v': .    
5b10: 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20    if( nBuf>3 && 
5b20: 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 76 65 22 2c  0==memcmp("ive",
5b30: 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20   &aBuf[nBuf-3], 
5b40: 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  3) ){.        if
5b50: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
5b60: 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20  1(aBuf, nBuf-3) 
5b70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  ){.          *pn
5b80: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a  Buf = nBuf - 3;.
5b90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ba0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5bb0: 20 0a 20 20 20 20 63 61 73 65 20 27 7a 27 3a 20   .    case 'z': 
5bc0: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e  .      if( nBuf>
5bd0: 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  3 && 0==memcmp("
5be0: 69 7a 65 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  ize", &aBuf[nBuf
5bf0: 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20 20  -3], 3) ){.     
5c00: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
5c10: 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75  r_MGt1(aBuf, nBu
5c20: 66 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-3) ){.        
5c30: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
5c40: 2d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 3;.        }. 
5c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5c60: 61 6b 3b 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74  ak;.  .  }.  ret
5c70: 75 72 6e 20 72 65 74 3b 0a 7d 0a 20 20 0a 0a 73  urn ret;.}.  ..s
5c80: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f  tatic int fts5Po
5c90: 72 74 65 72 53 74 65 70 31 42 32 28 63 68 61 72  rterStep1B2(char
5ca0: 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70 6e 42   *aBuf, int *pnB
5cb0: 75 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d  uf){.  int ret =
5cc0: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 75 66 20 3d   0;.  int nBuf =
5cd0: 20 2a 70 6e 42 75 66 3b 0a 20 20 73 77 69 74 63   *pnBuf;.  switc
5ce0: 68 28 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d 20  h( aBuf[nBuf-2] 
5cf0: 29 7b 0a 20 20 20 20 0a 20 20 20 20 63 61 73 65  ){.    .    case
5d00: 20 27 61 27 3a 20 0a 20 20 20 20 20 20 69 66 28   'a': .      if(
5d10: 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d 65   nBuf>2 && 0==me
5d20: 6d 63 6d 70 28 22 61 74 22 2c 20 26 61 42 75 66  mcmp("at", &aBuf
5d30: 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b 0a  [nBuf-2], 2) ){.
5d40: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
5d50: 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 22 61  aBuf[nBuf-2], "a
5d60: 74 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  te", 3);.       
5d70: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
5d80: 20 32 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20   2 + 3;.        
5d90: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ret = 1;.      }
5da0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5db0: 0a 20 20 20 20 63 61 73 65 20 27 62 27 3a 20 0a  .    case 'b': .
5dc0: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 32        if( nBuf>2
5dd0: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 62   && 0==memcmp("b
5de0: 6c 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 32  l", &aBuf[nBuf-2
5df0: 5d 2c 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 2) ){.       
5e00: 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42   memcpy(&aBuf[nB
5e10: 75 66 2d 32 5d 2c 20 22 62 6c 65 22 2c 20 33 29  uf-2], "ble", 3)
5e20: 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66  ;.        *pnBuf
5e30: 20 3d 20 6e 42 75 66 20 2d 20 32 20 2b 20 33 3b   = nBuf - 2 + 3;
5e40: 0a 20 20 20 20 20 20 20 20 72 65 74 20 3d 20 31  .        ret = 1
5e50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5e60: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61  break;.  .    ca
5e70: 73 65 20 27 69 27 3a 20 0a 20 20 20 20 20 20 69  se 'i': .      i
5e80: 66 28 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d  f( nBuf>2 && 0==
5e90: 6d 65 6d 63 6d 70 28 22 69 7a 22 2c 20 26 61 42  memcmp("iz", &aB
5ea0: 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29  uf[nBuf-2], 2) )
5eb0: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
5ec0: 28 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20  (&aBuf[nBuf-2], 
5ed0: 22 69 7a 65 22 2c 20 33 29 3b 0a 20 20 20 20 20  "ize", 3);.     
5ee0: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
5ef0: 20 2d 20 32 20 2b 20 33 3b 0a 20 20 20 20 20 20   - 2 + 3;.      
5f00: 20 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 20    ret = 1;.     
5f10: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5f20: 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20    .  }.  return 
5f30: 72 65 74 3b 0a 7d 0a 20 20 0a 0a 73 74 61 74 69  ret;.}.  ..stati
5f40: 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72  c int fts5Porter
5f50: 53 74 65 70 32 28 63 68 61 72 20 2a 61 42 75 66  Step2(char *aBuf
5f60: 2c 20 69 6e 74 20 2a 70 6e 42 75 66 29 7b 0a 20  , int *pnBuf){. 
5f70: 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20   int ret = 0;.  
5f80: 69 6e 74 20 6e 42 75 66 20 3d 20 2a 70 6e 42 75  int nBuf = *pnBu
5f90: 66 3b 0a 20 20 73 77 69 74 63 68 28 20 61 42 75  f;.  switch( aBu
5fa0: 66 5b 6e 42 75 66 2d 32 5d 20 29 7b 0a 20 20 20  f[nBuf-2] ){.   
5fb0: 20 0a 20 20 20 20 63 61 73 65 20 27 61 27 3a 20   .    case 'a': 
5fc0: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e  .      if( nBuf>
5fd0: 37 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  7 && 0==memcmp("
5fe0: 61 74 69 6f 6e 61 6c 22 2c 20 26 61 42 75 66 5b  ational", &aBuf[
5ff0: 6e 42 75 66 2d 37 5d 2c 20 37 29 20 29 7b 0a 20  nBuf-7], 7) ){. 
6000: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
6010: 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c  orter_MGt0(aBuf,
6020: 20 6e 42 75 66 2d 37 29 20 29 7b 0a 20 20 20 20   nBuf-7) ){.    
6030: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42        memcpy(&aB
6040: 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 22 61 74 65  uf[nBuf-7], "ate
6050: 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 3);.         
6060: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
6070: 20 37 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20   7 + 3;.        
6080: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
6090: 28 20 6e 42 75 66 3e 36 20 26 26 20 30 3d 3d 6d  ( nBuf>6 && 0==m
60a0: 65 6d 63 6d 70 28 22 74 69 6f 6e 61 6c 22 2c 20  emcmp("tional", 
60b0: 26 61 42 75 66 5b 6e 42 75 66 2d 36 5d 2c 20 36  &aBuf[nBuf-6], 6
60c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
60d0: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30   fts5Porter_MGt0
60e0: 28 61 42 75 66 2c 20 6e 42 75 66 2d 36 29 20 29  (aBuf, nBuf-6) )
60f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
6100: 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 36 5d  py(&aBuf[nBuf-6]
6110: 2c 20 22 74 69 6f 6e 22 2c 20 34 29 3b 0a 20 20  , "tion", 4);.  
6120: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
6130: 20 6e 42 75 66 20 2d 20 36 20 2b 20 34 3b 0a 20   nBuf - 6 + 4;. 
6140: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6150: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6160: 0a 20 20 20 20 63 61 73 65 20 27 63 27 3a 20 0a  .    case 'c': .
6170: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 34        if( nBuf>4
6180: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65   && 0==memcmp("e
6190: 6e 63 69 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  nci", &aBuf[nBuf
61a0: 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  -4], 4) ){.     
61b0: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
61c0: 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75  r_MGt0(aBuf, nBu
61d0: 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-4) ){.        
61e0: 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e    memcpy(&aBuf[n
61f0: 42 75 66 2d 34 5d 2c 20 22 65 6e 63 65 22 2c 20  Buf-4], "ence", 
6200: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  4);.          *p
6210: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 20  nBuf = nBuf - 4 
6220: 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  + 4;.        }. 
6230: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
6240: 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>4 && 0==memc
6250: 6d 70 28 22 61 6e 63 69 22 2c 20 26 61 42 75 66  mp("anci", &aBuf
6260: 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a  [nBuf-4], 4) ){.
6270: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
6280: 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66  Porter_MGt0(aBuf
6290: 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20  , nBuf-4) ){.   
62a0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
62b0: 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 22 61 6e  Buf[nBuf-4], "an
62c0: 63 65 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ce", 4);.       
62d0: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
62e0: 20 2d 20 34 20 2b 20 34 3b 0a 20 20 20 20 20 20   - 4 + 4;.      
62f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6300: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20    break;.  .    
6310: 63 61 73 65 20 27 65 27 3a 20 0a 20 20 20 20 20  case 'e': .     
6320: 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30   if( nBuf>4 && 0
6330: 3d 3d 6d 65 6d 63 6d 70 28 22 69 7a 65 72 22 2c  ==memcmp("izer",
6340: 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20   &aBuf[nBuf-4], 
6350: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  4) ){.        if
6360: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
6370: 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20  0(aBuf, nBuf-4) 
6380: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
6390: 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 34  cpy(&aBuf[nBuf-4
63a0: 5d 2c 20 22 69 7a 65 22 2c 20 33 29 3b 0a 20 20  ], "ize", 3);.  
63b0: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
63c0: 20 6e 42 75 66 20 2d 20 34 20 2b 20 33 3b 0a 20   nBuf - 4 + 3;. 
63d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
63e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
63f0: 0a 20 20 20 20 63 61 73 65 20 27 67 27 3a 20 0a  .    case 'g': .
6400: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 34        if( nBuf>4
6410: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 6c   && 0==memcmp("l
6420: 6f 67 69 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  ogi", &aBuf[nBuf
6430: 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  -4], 4) ){.     
6440: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
6450: 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75  r_MGt0(aBuf, nBu
6460: 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-4) ){.        
6470: 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e    memcpy(&aBuf[n
6480: 42 75 66 2d 34 5d 2c 20 22 6c 6f 67 22 2c 20 33  Buf-4], "log", 3
6490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  );.          *pn
64a0: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 20 2b  Buf = nBuf - 4 +
64b0: 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   3;.        }.  
64c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
64d0: 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27  k;.  .    case '
64e0: 6c 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e  l': .      if( n
64f0: 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>3 && 0==memc
6500: 6d 70 28 22 62 6c 69 22 2c 20 26 61 42 75 66 5b  mp("bli", &aBuf[
6510: 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20  nBuf-3], 3) ){. 
6520: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
6530: 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c  orter_MGt0(aBuf,
6540: 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20 20 20   nBuf-3) ){.    
6550: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42        memcpy(&aB
6560: 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 22 62 6c 65  uf[nBuf-3], "ble
6570: 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 3);.         
6580: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
6590: 20 33 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20   3 + 3;.        
65a0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
65b0: 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d  ( nBuf>4 && 0==m
65c0: 65 6d 63 6d 70 28 22 61 6c 6c 69 22 2c 20 26 61  emcmp("alli", &a
65d0: 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20  Buf[nBuf-4], 4) 
65e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
65f0: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61  ts5Porter_MGt0(a
6600: 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a  Buf, nBuf-4) ){.
6610: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6620: 28 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20  (&aBuf[nBuf-4], 
6630: 22 61 6c 22 2c 20 32 29 3b 0a 20 20 20 20 20 20  "al", 2);.      
6640: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
6650: 66 20 2d 20 34 20 2b 20 32 3b 0a 20 20 20 20 20  f - 4 + 2;.     
6660: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6670: 20 69 66 28 20 6e 42 75 66 3e 35 20 26 26 20 30   if( nBuf>5 && 0
6680: 3d 3d 6d 65 6d 63 6d 70 28 22 65 6e 74 6c 69 22  ==memcmp("entli"
6690: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c  , &aBuf[nBuf-5],
66a0: 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   5) ){.        i
66b0: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
66c0: 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 35 29  t0(aBuf, nBuf-5)
66d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
66e0: 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d  mcpy(&aBuf[nBuf-
66f0: 35 5d 2c 20 22 65 6e 74 22 2c 20 33 29 3b 0a 20  5], "ent", 3);. 
6700: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
6710: 3d 20 6e 42 75 66 20 2d 20 35 20 2b 20 33 3b 0a  = nBuf - 5 + 3;.
6720: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6730: 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 33  }else if( nBuf>3
6740: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65   && 0==memcmp("e
6750: 6c 69 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  li", &aBuf[nBuf-
6760: 33 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20  3], 3) ){.      
6770: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
6780: 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66  _MGt0(aBuf, nBuf
6790: 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -3) ){.         
67a0: 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42   memcpy(&aBuf[nB
67b0: 75 66 2d 33 5d 2c 20 22 65 22 2c 20 31 29 3b 0a  uf-3], "e", 1);.
67c0: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
67d0: 20 3d 20 6e 42 75 66 20 2d 20 33 20 2b 20 31 3b   = nBuf - 3 + 1;
67e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
67f0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e   }else if( nBuf>
6800: 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  5 && 0==memcmp("
6810: 6f 75 73 6c 69 22 2c 20 26 61 42 75 66 5b 6e 42  ousli", &aBuf[nB
6820: 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20  uf-5], 5) ){.   
6830: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
6840: 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e  ter_MGt0(aBuf, n
6850: 42 75 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20  Buf-5) ){.      
6860: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66      memcpy(&aBuf
6870: 5b 6e 42 75 66 2d 35 5d 2c 20 22 6f 75 73 22 2c  [nBuf-5], "ous",
6880: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a   3);.          *
6890: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 35  pnBuf = nBuf - 5
68a0: 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 3;.        }.
68b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
68c0: 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65  eak;.  .    case
68d0: 20 27 6f 27 3a 20 0a 20 20 20 20 20 20 69 66 28   'o': .      if(
68e0: 20 6e 42 75 66 3e 37 20 26 26 20 30 3d 3d 6d 65   nBuf>7 && 0==me
68f0: 6d 63 6d 70 28 22 69 7a 61 74 69 6f 6e 22 2c 20  mcmp("ization", 
6900: 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 37  &aBuf[nBuf-7], 7
6910: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
6920: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30   fts5Porter_MGt0
6930: 28 61 42 75 66 2c 20 6e 42 75 66 2d 37 29 20 29  (aBuf, nBuf-7) )
6940: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
6950: 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d  py(&aBuf[nBuf-7]
6960: 2c 20 22 69 7a 65 22 2c 20 33 29 3b 0a 20 20 20  , "ize", 3);.   
6970: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
6980: 6e 42 75 66 20 2d 20 37 20 2b 20 33 3b 0a 20 20  nBuf - 7 + 3;.  
6990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
69a0: 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 35 20 26  lse if( nBuf>5 &
69b0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 74 69  & 0==memcmp("ati
69c0: 6f 6e 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  on", &aBuf[nBuf-
69d0: 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  5], 5) ){.      
69e0: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
69f0: 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66  _MGt0(aBuf, nBuf
6a00: 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -5) ){.         
6a10: 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42   memcpy(&aBuf[nB
6a20: 75 66 2d 35 5d 2c 20 22 61 74 65 22 2c 20 33 29  uf-5], "ate", 3)
6a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  ;.          *pnB
6a40: 75 66 20 3d 20 6e 42 75 66 20 2d 20 35 20 2b 20  uf = nBuf - 5 + 
6a50: 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  3;.        }.   
6a60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75     }else if( nBu
6a70: 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  f>4 && 0==memcmp
6a80: 28 22 61 74 6f 72 22 2c 20 26 61 42 75 66 5b 6e  ("ator", &aBuf[n
6a90: 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20  Buf-4], 4) ){.  
6aa0: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
6ab0: 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20  rter_MGt0(aBuf, 
6ac0: 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20 20 20  nBuf-4) ){.     
6ad0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75       memcpy(&aBu
6ae0: 66 5b 6e 42 75 66 2d 34 5d 2c 20 22 61 74 65 22  f[nBuf-4], "ate"
6af0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
6b00: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
6b10: 34 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 7d  4 + 3;.        }
6b20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6b30: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73  reak;.  .    cas
6b40: 65 20 27 73 27 3a 20 0a 20 20 20 20 20 20 69 66  e 's': .      if
6b50: 28 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d  ( nBuf>5 && 0==m
6b60: 65 6d 63 6d 70 28 22 61 6c 69 73 6d 22 2c 20 26  emcmp("alism", &
6b70: 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29  aBuf[nBuf-5], 5)
6b80: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
6b90: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
6ba0: 61 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b  aBuf, nBuf-5) ){
6bb0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
6bc0: 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c  y(&aBuf[nBuf-5],
6bd0: 20 22 61 6c 22 2c 20 32 29 3b 0a 20 20 20 20 20   "al", 2);.     
6be0: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
6bf0: 75 66 20 2d 20 35 20 2b 20 32 3b 0a 20 20 20 20  uf - 5 + 2;.    
6c00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6c10: 65 20 69 66 28 20 6e 42 75 66 3e 37 20 26 26 20  e if( nBuf>7 && 
6c20: 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 76 65 6e 65  0==memcmp("ivene
6c30: 73 73 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  ss", &aBuf[nBuf-
6c40: 37 5d 2c 20 37 29 20 29 7b 0a 20 20 20 20 20 20  7], 7) ){.      
6c50: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
6c60: 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66  _MGt0(aBuf, nBuf
6c70: 2d 37 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -7) ){.         
6c80: 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42   memcpy(&aBuf[nB
6c90: 75 66 2d 37 5d 2c 20 22 69 76 65 22 2c 20 33 29  uf-7], "ive", 3)
6ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  ;.          *pnB
6cb0: 75 66 20 3d 20 6e 42 75 66 20 2d 20 37 20 2b 20  uf = nBuf - 7 + 
6cc0: 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  3;.        }.   
6cd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75     }else if( nBu
6ce0: 66 3e 37 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  f>7 && 0==memcmp
6cf0: 28 22 66 75 6c 6e 65 73 73 22 2c 20 26 61 42 75  ("fulness", &aBu
6d00: 66 5b 6e 42 75 66 2d 37 5d 2c 20 37 29 20 29 7b  f[nBuf-7], 7) ){
6d10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
6d20: 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75  5Porter_MGt0(aBu
6d30: 66 2c 20 6e 42 75 66 2d 37 29 20 29 7b 0a 20 20  f, nBuf-7) ){.  
6d40: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
6d50: 61 42 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 22 66  aBuf[nBuf-7], "f
6d60: 75 6c 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  ul", 3);.       
6d70: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
6d80: 20 2d 20 37 20 2b 20 33 3b 0a 20 20 20 20 20 20   - 7 + 3;.      
6d90: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
6da0: 69 66 28 20 6e 42 75 66 3e 37 20 26 26 20 30 3d  if( nBuf>7 && 0=
6db0: 3d 6d 65 6d 63 6d 70 28 22 6f 75 73 6e 65 73 73  =memcmp("ousness
6dc0: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d  ", &aBuf[nBuf-7]
6dd0: 2c 20 37 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 7) ){.        
6de0: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
6df0: 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 37  Gt0(aBuf, nBuf-7
6e00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
6e10: 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66  emcpy(&aBuf[nBuf
6e20: 2d 37 5d 2c 20 22 6f 75 73 22 2c 20 33 29 3b 0a  -7], "ous", 3);.
6e30: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
6e40: 20 3d 20 6e 42 75 66 20 2d 20 37 20 2b 20 33 3b   = nBuf - 7 + 3;
6e50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6e60: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6e70: 20 20 0a 20 20 20 20 63 61 73 65 20 27 74 27 3a    .    case 't':
6e80: 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66   .      if( nBuf
6e90: 3e 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >5 && 0==memcmp(
6ea0: 22 61 6c 69 74 69 22 2c 20 26 61 42 75 66 5b 6e  "aliti", &aBuf[n
6eb0: 42 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20  Buf-5], 5) ){.  
6ec0: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
6ed0: 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20  rter_MGt0(aBuf, 
6ee0: 6e 42 75 66 2d 35 29 20 29 7b 0a 20 20 20 20 20  nBuf-5) ){.     
6ef0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75       memcpy(&aBu
6f00: 66 5b 6e 42 75 66 2d 35 5d 2c 20 22 61 6c 22 2c  f[nBuf-5], "al",
6f10: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a   2);.          *
6f20: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 35  pnBuf = nBuf - 5
6f30: 20 2b 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 2;.        }.
6f40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6f50: 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>5 && 0==mem
6f60: 63 6d 70 28 22 69 76 69 74 69 22 2c 20 26 61 42  cmp("iviti", &aB
6f70: 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29  uf[nBuf-5], 5) )
6f80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
6f90: 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42  s5Porter_MGt0(aB
6fa0: 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20  uf, nBuf-5) ){. 
6fb0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6fc0: 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 22  &aBuf[nBuf-5], "
6fd0: 69 76 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  ive", 3);.      
6fe0: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
6ff0: 66 20 2d 20 35 20 2b 20 33 3b 0a 20 20 20 20 20  f - 5 + 3;.     
7000: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
7010: 20 69 66 28 20 6e 42 75 66 3e 36 20 26 26 20 30   if( nBuf>6 && 0
7020: 3d 3d 6d 65 6d 63 6d 70 28 22 62 69 6c 69 74 69  ==memcmp("biliti
7030: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 36 5d  ", &aBuf[nBuf-6]
7040: 2c 20 36 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 6) ){.        
7050: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
7060: 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 36  Gt0(aBuf, nBuf-6
7070: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
7080: 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66  emcpy(&aBuf[nBuf
7090: 2d 36 5d 2c 20 22 62 6c 65 22 2c 20 33 29 3b 0a  -6], "ble", 3);.
70a0: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
70b0: 20 3d 20 6e 42 75 66 20 2d 20 36 20 2b 20 33 3b   = nBuf - 6 + 3;
70c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
70d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
70e0: 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20    .  }.  return 
70f0: 72 65 74 3b 0a 7d 0a 20 20 0a 0a 73 74 61 74 69  ret;.}.  ..stati
7100: 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72  c int fts5Porter
7110: 53 74 65 70 33 28 63 68 61 72 20 2a 61 42 75 66  Step3(char *aBuf
7120: 2c 20 69 6e 74 20 2a 70 6e 42 75 66 29 7b 0a 20  , int *pnBuf){. 
7130: 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20   int ret = 0;.  
7140: 69 6e 74 20 6e 42 75 66 20 3d 20 2a 70 6e 42 75  int nBuf = *pnBu
7150: 66 3b 0a 20 20 73 77 69 74 63 68 28 20 61 42 75  f;.  switch( aBu
7160: 66 5b 6e 42 75 66 2d 32 5d 20 29 7b 0a 20 20 20  f[nBuf-2] ){.   
7170: 20 0a 20 20 20 20 63 61 73 65 20 27 61 27 3a 20   .    case 'a': 
7180: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e  .      if( nBuf>
7190: 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  4 && 0==memcmp("
71a0: 69 63 61 6c 22 2c 20 26 61 42 75 66 5b 6e 42 75  ical", &aBuf[nBu
71b0: 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20  f-4], 4) ){.    
71c0: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
71d0: 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42  er_MGt0(aBuf, nB
71e0: 75 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-4) ){.       
71f0: 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b     memcpy(&aBuf[
7200: 6e 42 75 66 2d 34 5d 2c 20 22 69 63 22 2c 20 32  nBuf-4], "ic", 2
7210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  );.          *pn
7220: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 20 2b  Buf = nBuf - 4 +
7230: 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
7240: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7250: 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27  k;.  .    case '
7260: 73 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e  s': .      if( n
7270: 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>4 && 0==memc
7280: 6d 70 28 22 6e 65 73 73 22 2c 20 26 61 42 75 66  mp("ness", &aBuf
7290: 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a  [nBuf-4], 4) ){.
72a0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
72b0: 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66  Porter_MGt0(aBuf
72c0: 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20  , nBuf-4) ){.   
72d0: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
72e0: 6e 42 75 66 20 2d 20 34 3b 0a 20 20 20 20 20 20  nBuf - 4;.      
72f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7300: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20    break;.  .    
7310: 63 61 73 65 20 27 74 27 3a 20 0a 20 20 20 20 20  case 't': .     
7320: 20 69 66 28 20 6e 42 75 66 3e 35 20 26 26 20 30   if( nBuf>5 && 0
7330: 3d 3d 6d 65 6d 63 6d 70 28 22 69 63 61 74 65 22  ==memcmp("icate"
7340: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c  , &aBuf[nBuf-5],
7350: 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   5) ){.        i
7360: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
7370: 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 35 29  t0(aBuf, nBuf-5)
7380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
7390: 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d  mcpy(&aBuf[nBuf-
73a0: 35 5d 2c 20 22 69 63 22 2c 20 32 29 3b 0a 20 20  5], "ic", 2);.  
73b0: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
73c0: 20 6e 42 75 66 20 2d 20 35 20 2b 20 32 3b 0a 20   nBuf - 5 + 2;. 
73d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
73e0: 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 35 20  else if( nBuf>5 
73f0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 63  && 0==memcmp("ic
7400: 69 74 69 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  iti", &aBuf[nBuf
7410: 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  -5], 5) ){.     
7420: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
7430: 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75  r_MGt0(aBuf, nBu
7440: 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-5) ){.        
7450: 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e    memcpy(&aBuf[n
7460: 42 75 66 2d 35 5d 2c 20 22 69 63 22 2c 20 32 29  Buf-5], "ic", 2)
7470: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  ;.          *pnB
7480: 75 66 20 3d 20 6e 42 75 66 20 2d 20 35 20 2b 20  uf = nBuf - 5 + 
7490: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
74a0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
74b0: 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27 75  ;.  .    case 'u
74c0: 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42  ': .      if( nB
74d0: 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>3 && 0==memcm
74e0: 70 28 22 66 75 6c 22 2c 20 26 61 42 75 66 5b 6e  p("ful", &aBuf[n
74f0: 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20  Buf-3], 3) ){.  
7500: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
7510: 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20  rter_MGt0(aBuf, 
7520: 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20 20 20 20  nBuf-3) ){.     
7530: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
7540: 75 66 20 2d 20 33 3b 0a 20 20 20 20 20 20 20 20  uf - 3;.        
7550: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7560: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61  break;.  .    ca
7570: 73 65 20 27 76 27 3a 20 0a 20 20 20 20 20 20 69  se 'v': .      i
7580: 66 28 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d  f( nBuf>5 && 0==
7590: 6d 65 6d 63 6d 70 28 22 61 74 69 76 65 22 2c 20  memcmp("ative", 
75a0: 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35  &aBuf[nBuf-5], 5
75b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
75c0: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30   fts5Porter_MGt0
75d0: 28 61 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29  (aBuf, nBuf-5) )
75e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  {.          *pnB
75f0: 75 66 20 3d 20 6e 42 75 66 20 2d 20 35 3b 0a 20  uf = nBuf - 5;. 
7600: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7610: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7620: 0a 20 20 20 20 63 61 73 65 20 27 7a 27 3a 20 0a  .    case 'z': .
7630: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 35        if( nBuf>5
7640: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61   && 0==memcmp("a
7650: 6c 69 7a 65 22 2c 20 26 61 42 75 66 5b 6e 42 75  lize", &aBuf[nBu
7660: 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20  f-5], 5) ){.    
7670: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
7680: 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42  er_MGt0(aBuf, nB
7690: 75 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-5) ){.       
76a0: 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b     memcpy(&aBuf[
76b0: 6e 42 75 66 2d 35 5d 2c 20 22 61 6c 22 2c 20 32  nBuf-5], "al", 2
76c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  );.          *pn
76d0: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 35 20 2b  Buf = nBuf - 5 +
76e0: 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
76f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7700: 6b 3b 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74 75  k;.  .  }.  retu
7710: 72 6e 20 72 65 74 3b 0a 7d 0a 20 20 0a 0a 73 74  rn ret;.}.  ..st
7720: 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 72  atic int fts5Por
7730: 74 65 72 53 74 65 70 31 42 28 63 68 61 72 20 2a  terStep1B(char *
7740: 61 42 75 66 2c 20 69 6e 74 20 2a 70 6e 42 75 66  aBuf, int *pnBuf
7750: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30  ){.  int ret = 0
7760: 3b 0a 20 20 69 6e 74 20 6e 42 75 66 20 3d 20 2a  ;.  int nBuf = *
7770: 70 6e 42 75 66 3b 0a 20 20 73 77 69 74 63 68 28  pnBuf;.  switch(
7780: 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d 20 29 7b   aBuf[nBuf-2] ){
7790: 0a 20 20 20 20 0a 20 20 20 20 63 61 73 65 20 27  .    .    case '
77a0: 65 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e  e': .      if( n
77b0: 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>3 && 0==memc
77c0: 6d 70 28 22 65 65 64 22 2c 20 26 61 42 75 66 5b  mp("eed", &aBuf[
77d0: 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20  nBuf-3], 3) ){. 
77e0: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
77f0: 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c  orter_MGt0(aBuf,
7800: 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20 20 20   nBuf-3) ){.    
7810: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42        memcpy(&aB
7820: 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 22 65 65 22  uf[nBuf-3], "ee"
7830: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
7840: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
7850: 33 20 2b 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  3 + 2;.        }
7860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7870: 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d 65   nBuf>2 && 0==me
7880: 6d 63 6d 70 28 22 65 64 22 2c 20 26 61 42 75 66  mcmp("ed", &aBuf
7890: 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b 0a  [nBuf-2], 2) ){.
78a0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
78b0: 50 6f 72 74 65 72 5f 56 6f 77 65 6c 28 61 42 75  Porter_Vowel(aBu
78c0: 66 2c 20 6e 42 75 66 2d 32 29 20 29 7b 0a 20 20  f, nBuf-2) ){.  
78d0: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
78e0: 20 6e 42 75 66 20 2d 20 32 3b 0a 20 20 20 20 20   nBuf - 2;.     
78f0: 20 20 20 20 20 72 65 74 20 3d 20 31 3b 0a 20 20       ret = 1;.  
7900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7910: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
7920: 20 20 20 20 63 61 73 65 20 27 6e 27 3a 20 0a 20      case 'n': . 
7930: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20       if( nBuf>3 
7940: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 6e  && 0==memcmp("in
7950: 67 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33  g", &aBuf[nBuf-3
7960: 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 3) ){.       
7970: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
7980: 56 6f 77 65 6c 28 61 42 75 66 2c 20 6e 42 75 66  Vowel(aBuf, nBuf
7990: 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -3) ){.         
79a0: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
79b0: 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   3;.          re
79c0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
79d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
79e0: 72 65 61 6b 3b 0a 20 20 0a 20 20 7d 0a 20 20 72  reak;.  .  }.  r
79f0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 20 20 0a  eturn ret;.}.  .
7a00: 2f 2a 20 0a 2a 2a 20 47 45 4e 45 52 41 54 45 44  /* .** GENERATED
7a10: 20 43 4f 44 45 20 45 4e 44 53 20 48 45 52 45 20   CODE ENDS HERE 
7a20: 28 6d 6b 70 6f 72 74 65 72 73 74 65 70 73 2e 74  (mkportersteps.t
7a30: 63 6c 29 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cl).************
7a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
7a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61  **********/..sta
7ad0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 72  tic void fts5Por
7ae0: 74 65 72 53 74 65 70 31 41 28 63 68 61 72 20 2a  terStep1A(char *
7af0: 61 42 75 66 2c 20 69 6e 74 20 2a 70 6e 42 75 66  aBuf, int *pnBuf
7b00: 29 7b 0a 20 20 69 6e 74 20 6e 42 75 66 20 3d 20  ){.  int nBuf = 
7b10: 2a 70 6e 42 75 66 3b 0a 20 20 69 66 28 20 61 42  *pnBuf;.  if( aB
7b20: 75 66 5b 6e 42 75 66 2d 31 5d 3d 3d 27 73 27 20  uf[nBuf-1]=='s' 
7b30: 29 7b 0a 20 20 20 20 69 66 28 20 61 42 75 66 5b  ){.    if( aBuf[
7b40: 6e 42 75 66 2d 32 5d 3d 3d 27 65 27 20 29 7b 0a  nBuf-2]=='e' ){.
7b50: 20 20 20 20 20 20 69 66 28 20 28 6e 42 75 66 3e        if( (nBuf>
7b60: 34 20 26 26 20 61 42 75 66 5b 6e 42 75 66 2d 34  4 && aBuf[nBuf-4
7b70: 5d 3d 3d 27 73 27 20 26 26 20 61 42 75 66 5b 6e  ]=='s' && aBuf[n
7b80: 42 75 66 2d 33 5d 3d 3d 27 73 27 29 20 0a 20 20  Buf-3]=='s') .  
7b90: 20 20 20 20 20 7c 7c 20 28 6e 42 75 66 3e 33 20       || (nBuf>3 
7ba0: 26 26 20 61 42 75 66 5b 6e 42 75 66 2d 33 5d 3d  && aBuf[nBuf-3]=
7bb0: 3d 27 69 27 20 29 0a 20 20 20 20 20 20 29 7b 0a  ='i' ).      ){.
7bc0: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
7bd0: 20 6e 42 75 66 2d 32 3b 0a 20 20 20 20 20 20 7d   nBuf-2;.      }
7be0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
7bf0: 6e 42 75 66 20 3d 20 6e 42 75 66 2d 31 3b 0a 20  nBuf = nBuf-1;. 
7c00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7c10: 20 65 6c 73 65 20 69 66 28 20 61 42 75 66 5b 6e   else if( aBuf[n
7c20: 42 75 66 2d 32 5d 21 3d 27 73 27 20 29 7b 0a 20  Buf-2]!='s' ){. 
7c30: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
7c40: 75 66 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  uf-1;.    }.  }.
7c50: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
7c60: 73 35 50 6f 72 74 65 72 43 62 28 0a 20 20 76 6f  s5PorterCb(.  vo
7c70: 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
7c80: 20 74 66 6c 61 67 73 2c 0a 20 20 63 6f 6e 73 74   tflags,.  const
7c90: 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 0a   char *pToken, .
7ca0: 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 0a 20    int nToken, . 
7cb0: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 0a 20 20   int iStart, .  
7cc0: 69 6e 74 20 69 45 6e 64 0a 29 7b 0a 20 20 50 6f  int iEnd.){.  Po
7cd0: 72 74 65 72 43 6f 6e 74 65 78 74 20 2a 70 20 3d  rterContext *p =
7ce0: 20 28 50 6f 72 74 65 72 43 6f 6e 74 65 78 74 2a   (PorterContext*
7cf0: 29 70 43 74 78 3b 0a 0a 20 20 63 68 61 72 20 2a  )pCtx;..  char *
7d00: 61 42 75 66 3b 0a 20 20 69 6e 74 20 6e 42 75 66  aBuf;.  int nBuf
7d10: 3b 0a 0a 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3e  ;..  if( nToken>
7d20: 46 54 53 35 5f 50 4f 52 54 45 52 5f 4d 41 58 5f  FTS5_PORTER_MAX_
7d30: 54 4f 4b 45 4e 20 7c 7c 20 6e 54 6f 6b 65 6e 3c  TOKEN || nToken<
7d40: 33 20 29 20 67 6f 74 6f 20 70 61 73 73 5f 74 68  3 ) goto pass_th
7d50: 72 6f 75 67 68 3b 0a 20 20 61 42 75 66 20 3d 20  rough;.  aBuf = 
7d60: 70 2d 3e 61 42 75 66 3b 0a 20 20 6e 42 75 66 20  p->aBuf;.  nBuf 
7d70: 3d 20 6e 54 6f 6b 65 6e 3b 0a 20 20 6d 65 6d 63  = nToken;.  memc
7d80: 70 79 28 61 42 75 66 2c 20 70 54 6f 6b 65 6e 2c  py(aBuf, pToken,
7d90: 20 6e 42 75 66 29 3b 0a 0a 20 20 2f 2a 20 53 74   nBuf);..  /* St
7da0: 65 70 20 31 2e 20 2a 2f 0a 20 20 66 74 73 35 50  ep 1. */.  fts5P
7db0: 6f 72 74 65 72 53 74 65 70 31 41 28 61 42 75 66  orterStep1A(aBuf
7dc0: 2c 20 26 6e 42 75 66 29 3b 0a 20 20 69 66 28 20  , &nBuf);.  if( 
7dd0: 66 74 73 35 50 6f 72 74 65 72 53 74 65 70 31 42  fts5PorterStep1B
7de0: 28 61 42 75 66 2c 20 26 6e 42 75 66 29 20 29 7b  (aBuf, &nBuf) ){
7df0: 0a 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72  .    if( fts5Por
7e00: 74 65 72 53 74 65 70 31 42 32 28 61 42 75 66 2c  terStep1B2(aBuf,
7e10: 20 26 6e 42 75 66 29 3d 3d 30 20 29 7b 0a 20 20   &nBuf)==0 ){.  
7e20: 20 20 20 20 63 68 61 72 20 63 20 3d 20 61 42 75      char c = aBu
7e30: 66 5b 6e 42 75 66 2d 31 5d 3b 0a 20 20 20 20 20  f[nBuf-1];.     
7e40: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 49   if( fts5PorterI
7e50: 73 56 6f 77 65 6c 28 63 2c 20 30 29 3d 3d 30 20  sVowel(c, 0)==0 
7e60: 0a 20 20 20 20 20 20 20 26 26 20 63 21 3d 27 6c  .       && c!='l
7e70: 27 20 26 26 20 63 21 3d 27 73 27 20 26 26 20 63  ' && c!='s' && c
7e80: 21 3d 27 7a 27 20 26 26 20 63 3d 3d 61 42 75 66  !='z' && c==aBuf
7e90: 5b 6e 42 75 66 2d 32 5d 20 0a 20 20 20 20 20 20  [nBuf-2] .      
7ea0: 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 75 66 2d  ){.        nBuf-
7eb0: 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  -;.      }else i
7ec0: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 45  f( fts5Porter_ME
7ed0: 71 31 28 61 42 75 66 2c 20 6e 42 75 66 29 20 26  q1(aBuf, nBuf) &
7ee0: 26 20 66 74 73 35 50 6f 72 74 65 72 5f 4f 73 74  & fts5Porter_Ost
7ef0: 61 72 28 61 42 75 66 2c 20 6e 42 75 66 29 20 29  ar(aBuf, nBuf) )
7f00: 7b 0a 20 20 20 20 20 20 20 20 61 42 75 66 5b 6e  {.        aBuf[n
7f10: 42 75 66 2b 2b 5d 20 3d 20 27 65 27 3b 0a 20 20  Buf++] = 'e';.  
7f20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7f30: 0a 20 20 2f 2a 20 53 74 65 70 20 31 43 2e 20 2a  .  /* Step 1C. *
7f40: 2f 0a 20 20 69 66 28 20 61 42 75 66 5b 6e 42 75  /.  if( aBuf[nBu
7f50: 66 2d 31 5d 3d 3d 27 79 27 20 26 26 20 66 74 73  f-1]=='y' && fts
7f60: 35 50 6f 72 74 65 72 5f 56 6f 77 65 6c 28 61 42  5Porter_Vowel(aB
7f70: 75 66 2c 20 6e 42 75 66 2d 31 29 20 29 7b 0a 20  uf, nBuf-1) ){. 
7f80: 20 20 20 61 42 75 66 5b 6e 42 75 66 2d 31 5d 20     aBuf[nBuf-1] 
7f90: 3d 20 27 69 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = 'i';.  }..  /*
7fa0: 20 53 74 65 70 73 20 32 20 74 68 72 6f 75 67 68   Steps 2 through
7fb0: 20 34 2e 20 2a 2f 0a 20 20 66 74 73 35 50 6f 72   4. */.  fts5Por
7fc0: 74 65 72 53 74 65 70 32 28 61 42 75 66 2c 20 26  terStep2(aBuf, &
7fd0: 6e 42 75 66 29 3b 0a 20 20 66 74 73 35 50 6f 72  nBuf);.  fts5Por
7fe0: 74 65 72 53 74 65 70 33 28 61 42 75 66 2c 20 26  terStep3(aBuf, &
7ff0: 6e 42 75 66 29 3b 0a 20 20 66 74 73 35 50 6f 72  nBuf);.  fts5Por
8000: 74 65 72 53 74 65 70 34 28 61 42 75 66 2c 20 26  terStep4(aBuf, &
8010: 6e 42 75 66 29 3b 0a 0a 20 20 2f 2a 20 53 74 65  nBuf);..  /* Ste
8020: 70 20 35 61 2e 20 2a 2f 0a 20 20 61 73 73 65 72  p 5a. */.  asser
8030: 74 28 20 6e 42 75 66 3e 30 20 29 3b 0a 20 20 69  t( nBuf>0 );.  i
8040: 66 28 20 61 42 75 66 5b 6e 42 75 66 2d 31 5d 3d  f( aBuf[nBuf-1]=
8050: 3d 27 65 27 20 29 7b 0a 20 20 20 20 69 66 28 20  ='e' ){.    if( 
8060: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28  fts5Porter_MGt1(
8070: 61 42 75 66 2c 20 6e 42 75 66 2d 31 29 20 0a 20  aBuf, nBuf-1) . 
8080: 20 20 20 20 7c 7c 20 28 66 74 73 35 50 6f 72 74      || (fts5Port
8090: 65 72 5f 4d 45 71 31 28 61 42 75 66 2c 20 6e 42  er_MEq1(aBuf, nB
80a0: 75 66 2d 31 29 20 26 26 20 21 66 74 73 35 50 6f  uf-1) && !fts5Po
80b0: 72 74 65 72 5f 4f 73 74 61 72 28 61 42 75 66 2c  rter_Ostar(aBuf,
80c0: 20 6e 42 75 66 2d 31 29 29 0a 20 20 20 20 29 7b   nBuf-1)).    ){
80d0: 0a 20 20 20 20 20 20 6e 42 75 66 2d 2d 3b 0a 20  .      nBuf--;. 
80e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
80f0: 74 65 70 20 35 62 2e 20 2a 2f 0a 20 20 69 66 28  tep 5b. */.  if(
8100: 20 6e 42 75 66 3e 31 20 26 26 20 61 42 75 66 5b   nBuf>1 && aBuf[
8110: 6e 42 75 66 2d 31 5d 3d 3d 27 6c 27 20 0a 20 20  nBuf-1]=='l' .  
8120: 20 26 26 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d   && aBuf[nBuf-2]
8130: 3d 3d 27 6c 27 20 26 26 20 66 74 73 35 50 6f 72  =='l' && fts5Por
8140: 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e  ter_MGt1(aBuf, n
8150: 42 75 66 2d 31 29 20 0a 20 20 29 7b 0a 20 20 20  Buf-1) .  ){.   
8160: 20 6e 42 75 66 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nBuf--;.  }..  
8170: 72 65 74 75 72 6e 20 70 2d 3e 78 54 6f 6b 65 6e  return p->xToken
8180: 28 70 2d 3e 70 43 74 78 2c 20 74 66 6c 61 67 73  (p->pCtx, tflags
8190: 2c 20 61 42 75 66 2c 20 6e 42 75 66 2c 20 69 53  , aBuf, nBuf, iS
81a0: 74 61 72 74 2c 20 69 45 6e 64 29 3b 0a 0a 20 70  tart, iEnd);.. p
81b0: 61 73 73 5f 74 68 72 6f 75 67 68 3a 0a 20 20 72  ass_through:.  r
81c0: 65 74 75 72 6e 20 70 2d 3e 78 54 6f 6b 65 6e 28  eturn p->xToken(
81d0: 70 2d 3e 70 43 74 78 2c 20 74 66 6c 61 67 73 2c  p->pCtx, tflags,
81e0: 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c   pToken, nToken,
81f0: 20 69 53 74 61 72 74 2c 20 69 45 6e 64 29 3b 0a   iStart, iEnd);.
8200: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a  }../*.** Tokeniz
8210: 65 20 75 73 69 6e 67 20 74 68 65 20 70 6f 72 74  e using the port
8220: 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f  er tokenizer..*/
8230: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8240: 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 28 0a  PorterTokenize(.
8250: 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20    Fts5Tokenizer 
8260: 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c 0a 20 20 76  *pTokenizer,.  v
8270: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
8280: 20 66 6c 61 67 73 2c 0a 20 20 63 6f 6e 73 74 20   flags,.  const 
8290: 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69 6e 74  char *pText, int
82a0: 20 6e 54 65 78 74 2c 0a 20 20 69 6e 74 20 28 2a   nText,.  int (*
82b0: 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20 69  xToken)(void*, i
82c0: 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  nt, const char*,
82d0: 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 69 6e 74   int nToken, int
82e0: 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e   iStart, int iEn
82f0: 64 29 0a 29 7b 0a 20 20 50 6f 72 74 65 72 54 6f  d).){.  PorterTo
8300: 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20 28 50 6f  kenizer *p = (Po
8310: 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72 2a 29 70  rterTokenizer*)p
8320: 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 50 6f 72  Tokenizer;.  Por
8330: 74 65 72 43 6f 6e 74 65 78 74 20 73 43 74 78 3b  terContext sCtx;
8340: 0a 20 20 73 43 74 78 2e 78 54 6f 6b 65 6e 20 3d  .  sCtx.xToken =
8350: 20 78 54 6f 6b 65 6e 3b 0a 20 20 73 43 74 78 2e   xToken;.  sCtx.
8360: 70 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20 73  pCtx = pCtx;.  s
8370: 43 74 78 2e 61 42 75 66 20 3d 20 70 2d 3e 61 42  Ctx.aBuf = p->aB
8380: 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  uf;.  return p->
8390: 74 6f 6b 65 6e 69 7a 65 72 2e 78 54 6f 6b 65 6e  tokenizer.xToken
83a0: 69 7a 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 54  ize(.      p->pT
83b0: 6f 6b 65 6e 69 7a 65 72 2c 20 28 76 6f 69 64 2a  okenizer, (void*
83c0: 29 26 73 43 74 78 2c 20 66 6c 61 67 73 2c 20 70  )&sCtx, flags, p
83d0: 54 65 78 74 2c 20 6e 54 65 78 74 2c 20 66 74 73  Text, nText, fts
83e0: 35 50 6f 72 74 65 72 43 62 0a 20 20 29 3b 0a 7d  5PorterCb.  );.}
83f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
8400: 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 74 6f   all built-in to
8410: 6b 65 6e 69 7a 65 72 73 20 77 69 74 68 20 46 54  kenizers with FT
8420: 53 35 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  S5..*/.int sqlit
8430: 65 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49  e3Fts5TokenizerI
8440: 6e 69 74 28 66 74 73 35 5f 61 70 69 20 2a 70 41  nit(fts5_api *pA
8450: 70 69 29 7b 0a 20 20 73 74 72 75 63 74 20 42 75  pi){.  struct Bu
8460: 69 6c 74 69 6e 54 6f 6b 65 6e 69 7a 65 72 20 7b  iltinTokenizer {
8470: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
8480: 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 74 73 35  *zName;.    fts5
8490: 5f 74 6f 6b 65 6e 69 7a 65 72 20 78 3b 0a 20 20  _tokenizer x;.  
84a0: 7d 20 61 42 75 69 6c 74 69 6e 5b 5d 20 3d 20 7b  } aBuiltin[] = {
84b0: 0a 20 20 20 20 7b 20 22 75 6e 69 63 6f 64 65 36  .    { "unicode6
84c0: 31 22 2c 20 7b 66 74 73 35 55 6e 69 63 6f 64 65  1", {fts5Unicode
84d0: 43 72 65 61 74 65 2c 20 66 74 73 35 55 6e 69 63  Create, fts5Unic
84e0: 6f 64 65 44 65 6c 65 74 65 2c 20 66 74 73 35 55  odeDelete, fts5U
84f0: 6e 69 63 6f 64 65 54 6f 6b 65 6e 69 7a 65 7d 7d  nicodeTokenize}}
8500: 2c 0a 20 20 20 20 7b 20 22 61 73 63 69 69 22 2c  ,.    { "ascii",
8510: 20 20 20 20 20 7b 66 74 73 35 41 73 63 69 69 43       {fts5AsciiC
8520: 72 65 61 74 65 2c 20 66 74 73 35 41 73 63 69 69  reate, fts5Ascii
8530: 44 65 6c 65 74 65 2c 20 66 74 73 35 41 73 63 69  Delete, fts5Asci
8540: 69 54 6f 6b 65 6e 69 7a 65 20 7d 7d 2c 0a 20 20  iTokenize }},.  
8550: 20 20 7b 20 22 70 6f 72 74 65 72 22 2c 20 20 20    { "porter",   
8560: 20 7b 66 74 73 35 50 6f 72 74 65 72 43 72 65 61   {fts5PorterCrea
8570: 74 65 2c 20 66 74 73 35 50 6f 72 74 65 72 44 65  te, fts5PorterDe
8580: 6c 65 74 65 2c 20 66 74 73 35 50 6f 72 74 65 72  lete, fts5Porter
8590: 54 6f 6b 65 6e 69 7a 65 20 7d 7d 2c 0a 20 20 7d  Tokenize }},.  }
85a0: 3b 0a 20 20 0a 20 20 69 6e 74 20 72 63 20 3d 20  ;.  .  int rc = 
85b0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
85c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
85d0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
85e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
85f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
8600: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
8610: 20 62 75 69 6c 74 69 6e 20 66 75 6e 63 74 69 6f   builtin functio
8620: 6e 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30  ns */..  for(i=0
8630: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
8640: 26 26 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  && i<ArraySize(a
8650: 42 75 69 6c 74 69 6e 29 3b 20 69 2b 2b 29 7b 0a  Builtin); i++){.
8660: 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78      rc = pApi->x
8670: 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 28  CreateTokenizer(
8680: 70 41 70 69 2c 0a 20 20 20 20 20 20 20 20 61 42  pApi,.        aB
8690: 75 69 6c 74 69 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c  uiltin[i].zName,
86a0: 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29  .        (void*)
86b0: 70 41 70 69 2c 0a 20 20 20 20 20 20 20 20 26 61  pApi,.        &a
86c0: 42 75 69 6c 74 69 6e 5b 69 5d 2e 78 2c 0a 20 20  Builtin[i].x,.  
86d0: 20 20 20 20 20 20 30 0a 20 20 20 20 29 3b 0a 20        0.    );. 
86e0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
86f0: 0a 7d 0a 0a 0a                                   .}...