/ Hex Artifact Content
Login

Artifact 7c61d5c35c3449597bdeaa54dd48afe26852c7b0:


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 23 69 6e 63 6c 75  *****.*/..#inclu
0180: 64 65 20 22 66 74 73 35 2e 68 22 0a 23 69 6e 63  de "fts5.h".#inc
0190: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
01a0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
01b0: 2e 68 3e 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h>../**********
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 2a 2a 2a 2a  ****************
01e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0200: 0a 2a 2a 20 53 74 61 72 74 20 6f 66 20 61 73 63  .** Start of asc
0210: 69 69 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d 70  ii tokenizer imp
0220: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
0230: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 6f 6b 65 6e  ./*.** For token
0240: 69 7a 65 72 73 20 77 69 74 68 20 6e 6f 20 22 75  izers with no "u
0250: 6e 69 63 6f 64 65 22 20 6d 6f 64 69 66 69 65 72  nicode" modifier
0260: 2c 20 74 68 65 20 73 65 74 20 6f 66 20 74 6f 6b  , the set of tok
0270: 65 6e 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  en characters.**
0280: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
0290: 74 68 65 20 73 65 74 20 6f 66 20 41 53 43 49 49  the set of ASCII
02a0: 20 72 61 6e 67 65 20 61 6c 70 68 61 6e 75 6d 65   range alphanume
02b0: 72 69 63 20 63 68 61 72 61 63 74 65 72 73 2e 20  ric characters. 
02c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
02d0: 6e 65 64 20 63 68 61 72 20 61 41 73 63 69 69 54  ned char aAsciiT
02e0: 6f 6b 65 6e 43 68 61 72 5b 31 32 38 5d 20 3d 20  okenChar[128] = 
02f0: 7b 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  {.  0, 0, 0, 0, 
0300: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
0310: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0320: 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78 30 30 2e  0, 0,   /* 0x00.
0330: 2e 30 78 30 46 20 2a 2f 0a 20 20 30 2c 20 30 2c  .0x0F */.  0, 0,
0340: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0350: 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,   0, 0, 0, 0,
0360: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f   0, 0, 0, 0,   /
0370: 2a 20 30 78 31 30 2e 2e 30 78 31 46 20 2a 2f 0a  * 0x10..0x1F */.
0380: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
0390: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
03a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
03b0: 20 30 2c 20 20 20 2f 2a 20 30 78 32 30 2e 2e 30   0,   /* 0x20..0
03c0: 78 32 46 20 2a 2f 0a 20 20 31 2c 20 31 2c 20 31  x2F */.  1, 1, 1
03d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
03e0: 20 20 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30     1, 1, 0, 0, 0
03f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20  , 0, 0, 0,   /* 
0400: 30 78 33 30 2e 2e 30 78 33 46 20 2a 2f 0a 20 20  0x30..0x3F */.  
0410: 30 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  0, 1, 1, 1, 1, 1
0420: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
0430: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
0440: 2c 20 20 20 2f 2a 20 30 78 34 30 2e 2e 30 78 34  ,   /* 0x40..0x4
0450: 46 20 2a 2f 0a 20 20 31 2c 20 31 2c 20 31 2c 20  F */.  1, 1, 1, 
0460: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20  1, 1, 1, 1, 1,  
0470: 20 31 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20   1, 1, 1, 0, 0, 
0480: 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78  0, 0, 0,   /* 0x
0490: 35 30 2e 2e 30 78 35 46 20 2a 2f 0a 20 20 30 2c  50..0x5F */.  0,
04a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
04b0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
04c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
04d0: 20 20 2f 2a 20 30 78 36 30 2e 2e 30 78 36 46 20    /* 0x60..0x6F 
04e0: 2a 2f 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  */.  1, 1, 1, 1,
04f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
0500: 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 1, 0, 0, 0,
0510: 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78 37 30   0, 0,   /* 0x70
0520: 2e 2e 30 78 37 46 20 2a 2f 0a 7d 3b 0a 0a 74 79  ..0x7F */.};..ty
0530: 70 65 64 65 66 20 73 74 72 75 63 74 20 41 73 63  pedef struct Asc
0540: 69 69 54 6f 6b 65 6e 69 7a 65 72 20 41 73 63 69  iiTokenizer Asci
0550: 69 54 6f 6b 65 6e 69 7a 65 72 3b 0a 73 74 72 75  iTokenizer;.stru
0560: 63 74 20 41 73 63 69 69 54 6f 6b 65 6e 69 7a 65  ct AsciiTokenize
0570: 72 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  r {.  unsigned c
0580: 68 61 72 20 61 54 6f 6b 65 6e 43 68 61 72 5b 31  har aTokenChar[1
0590: 32 38 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  28];.};..static 
05a0: 76 6f 69 64 20 66 74 73 35 41 73 63 69 69 41 64  void fts5AsciiAd
05b0: 64 45 78 63 65 70 74 69 6f 6e 73 28 0a 20 20 41  dExceptions(.  A
05c0: 73 63 69 69 54 6f 6b 65 6e 69 7a 65 72 20 2a 70  sciiTokenizer *p
05d0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
05e0: 2a 7a 41 72 67 2c 20 0a 20 20 69 6e 74 20 62 54  *zArg, .  int bT
05f0: 6f 6b 65 6e 43 68 61 72 73 0a 29 7b 0a 20 20 69  okenChars.){.  i
0600: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
0610: 20 7a 41 72 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   zArg[i]; i++){.
0620: 20 20 20 20 69 66 28 20 28 7a 41 72 67 5b 69 5d      if( (zArg[i]
0630: 20 26 20 30 78 38 30 29 3d 3d 30 20 29 7b 0a 20   & 0x80)==0 ){. 
0640: 20 20 20 20 20 70 2d 3e 61 54 6f 6b 65 6e 43 68       p->aTokenCh
0650: 61 72 5b 28 69 6e 74 29 7a 41 72 67 5b 69 5d 5d  ar[(int)zArg[i]]
0660: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
0670: 72 29 62 54 6f 6b 65 6e 43 68 61 72 73 3b 0a 20  r)bTokenChars;. 
0680: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
0690: 2a 20 43 72 65 61 74 65 20 61 20 22 61 73 63 69  * Create a "asci
06a0: 69 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f  i" tokenizer..*/
06b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
06c0: 41 73 63 69 69 43 72 65 61 74 65 28 0a 20 20 76  AsciiCreate(.  v
06d0: 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f  oid *pCtx, .  co
06e0: 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  nst char **azArg
06f0: 2c 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74  , int nArg,.  Ft
0700: 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 2a 70 70  s5Tokenizer **pp
0710: 4f 75 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Out.){.  int rc 
0720: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 41  = SQLITE_OK;.  A
0730: 73 63 69 69 54 6f 6b 65 6e 69 7a 65 72 20 2a 70  sciiTokenizer *p
0740: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 41 72 67   = 0;.  if( nArg
0750: 25 32 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  %2 ){.    rc = S
0760: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
0770: 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 73 71  else{.    p = sq
0780: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
0790: 65 6f 66 28 41 73 63 69 69 54 6f 6b 65 6e 69 7a  eof(AsciiTokeniz
07a0: 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  er));.    if( p=
07b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
07c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
07d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
07e0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 6d 65 6d  int i;.      mem
07f0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
0800: 28 41 73 63 69 69 54 6f 6b 65 6e 69 7a 65 72 29  (AsciiTokenizer)
0810: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
0820: 70 2d 3e 61 54 6f 6b 65 6e 43 68 61 72 2c 20 61  p->aTokenChar, a
0830: 41 73 63 69 69 54 6f 6b 65 6e 43 68 61 72 2c 20  AsciiTokenChar, 
0840: 73 69 7a 65 6f 66 28 61 41 73 63 69 69 54 6f 6b  sizeof(aAsciiTok
0850: 65 6e 43 68 61 72 29 29 3b 0a 20 20 20 20 20 20  enChar));.      
0860: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
0870: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67  ITE_OK && i<nArg
0880: 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20  ; i+=2){.       
0890: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
08a0: 67 20 3d 20 61 7a 41 72 67 5b 69 2b 31 5d 3b 0a  g = azArg[i+1];.
08b0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
08c0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61  qlite3_stricmp(a
08d0: 7a 41 72 67 5b 69 5d 2c 20 22 74 6f 6b 65 6e 63  zArg[i], "tokenc
08e0: 68 61 72 73 22 29 20 29 7b 0a 20 20 20 20 20 20  hars") ){.      
08f0: 20 20 20 20 66 74 73 35 41 73 63 69 69 41 64 64      fts5AsciiAdd
0900: 45 78 63 65 70 74 69 6f 6e 73 28 70 2c 20 7a 41  Exceptions(p, zA
0910: 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rg, 1);.        
0920: 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
0930: 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
0940: 69 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22  icmp(azArg[i], "
0950: 73 65 70 61 72 61 74 6f 72 73 22 29 20 29 7b 0a  separators") ){.
0960: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 41 73            fts5As
0970: 63 69 69 41 64 64 45 78 63 65 70 74 69 6f 6e 73  ciiAddExceptions
0980: 28 70 2c 20 7a 41 72 67 2c 20 30 29 3b 0a 20 20  (p, zArg, 0);.  
0990: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
09a0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
09b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
09c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
09d0: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20  }.  }..  *ppOut 
09e0: 3d 20 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  = (Fts5Tokenizer
09f0: 2a 29 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  *)p;.  return rc
0a00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
0a10: 65 20 61 20 22 61 73 63 69 69 22 20 74 6f 6b 65  e a "ascii" toke
0a20: 6e 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nizer..*/.static
0a30: 20 76 6f 69 64 20 66 74 73 35 41 73 63 69 69 44   void fts5AsciiD
0a40: 65 6c 65 74 65 28 46 74 73 35 54 6f 6b 65 6e 69  elete(Fts5Tokeni
0a50: 7a 65 72 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  zer *p){.  sqlit
0a60: 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 0a  e3_free(p);.}...
0a70: 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 63 69  static void asci
0a80: 69 46 6f 6c 64 28 63 68 61 72 20 2a 61 4f 75 74  iFold(char *aOut
0a90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 49  , const char *aI
0aa0: 6e 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  n, int nByte){. 
0ab0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
0ac0: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
0ad0: 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 61  {.    char c = a
0ae0: 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 63  In[i];.    if( c
0af0: 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 5a 27 20  >='A' && c<='Z' 
0b00: 29 20 63 20 2b 3d 20 33 32 3b 0a 20 20 20 20 61  ) c += 32;.    a
0b10: 4f 75 74 5b 69 5d 20 3d 20 63 3b 0a 20 20 7d 0a  Out[i] = c;.  }.
0b20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a  }../*.** Tokeniz
0b30: 65 20 73 6f 6d 65 20 74 65 78 74 20 75 73 69 6e  e some text usin
0b40: 67 20 74 68 65 20 61 73 63 69 69 20 74 6f 6b 65  g the ascii toke
0b50: 6e 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nizer..*/.static
0b60: 20 69 6e 74 20 66 74 73 35 41 73 63 69 69 54 6f   int fts5AsciiTo
0b70: 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35 54 6f  kenize(.  Fts5To
0b80: 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69  kenizer *pTokeni
0b90: 7a 65 72 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74  zer,.  void *pCt
0ba0: 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
0bb0: 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78  *pText, int nTex
0bc0: 74 2c 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65  t,.  int (*xToke
0bd0: 6e 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20  n)(void*, const 
0be0: 63 68 61 72 2a 2c 20 69 6e 74 20 6e 54 6f 6b 65  char*, int nToke
0bf0: 6e 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  n, int iStart, i
0c00: 6e 74 20 69 45 6e 64 29 0a 29 7b 0a 20 20 41 73  nt iEnd).){.  As
0c10: 63 69 69 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 20  ciiTokenizer *p 
0c20: 3d 20 28 41 73 63 69 69 54 6f 6b 65 6e 69 7a 65  = (AsciiTokenize
0c30: 72 2a 29 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20  r*)pTokenizer;. 
0c40: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
0c50: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 65 3b 0a 20  _OK;.  int ie;. 
0c60: 20 69 6e 74 20 69 73 20 3d 20 30 3b 0a 0a 20 20   int is = 0;..  
0c70: 63 68 61 72 20 61 46 6f 6c 64 5b 36 34 5d 3b 0a  char aFold[64];.
0c80: 20 20 69 6e 74 20 6e 46 6f 6c 64 20 3d 20 73 69    int nFold = si
0c90: 7a 65 6f 66 28 61 46 6f 6c 64 29 3b 0a 20 20 63  zeof(aFold);.  c
0ca0: 68 61 72 20 2a 70 46 6f 6c 64 20 3d 20 61 46 6f  har *pFold = aFo
0cb0: 6c 64 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ld;.  unsigned c
0cc0: 68 61 72 20 2a 61 20 3d 20 70 2d 3e 61 54 6f 6b  har *a = p->aTok
0cd0: 65 6e 43 68 61 72 3b 0a 0a 20 20 77 68 69 6c 65  enChar;..  while
0ce0: 28 20 69 73 3c 6e 54 65 78 74 20 26 26 20 72 63  ( is<nText && rc
0cf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
0d00: 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20     int nByte;.. 
0d10: 20 20 20 2f 2a 20 53 6b 69 70 20 61 6e 79 20 6c     /* Skip any l
0d20: 65 61 64 69 6e 67 20 64 69 76 69 64 65 72 20 63  eading divider c
0d30: 68 61 72 61 63 74 65 72 73 2e 20 2a 2f 0a 20 20  haracters. */.  
0d40: 20 20 77 68 69 6c 65 28 20 69 73 3c 6e 54 65 78    while( is<nTex
0d50: 74 20 26 26 20 28 28 70 54 65 78 74 5b 69 73 5d  t && ((pText[is]
0d60: 26 30 78 38 30 29 3d 3d 30 20 26 26 20 61 5b 28  &0x80)==0 && a[(
0d70: 69 6e 74 29 70 54 65 78 74 5b 69 73 5d 5d 3d 3d  int)pText[is]]==
0d80: 30 29 20 29 7b 0a 20 20 20 20 20 20 69 73 2b 2b  0) ){.      is++
0d90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
0da0: 69 73 3d 3d 6e 54 65 78 74 20 29 20 62 72 65 61  is==nText ) brea
0db0: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74  k;..    /* Count
0dc0: 20 74 68 65 20 74 6f 6b 65 6e 20 63 68 61 72 61   the token chara
0dd0: 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 65 20  cters */.    ie 
0de0: 3d 20 69 73 2b 31 3b 0a 20 20 20 20 77 68 69 6c  = is+1;.    whil
0df0: 65 28 20 69 65 3c 6e 54 65 78 74 20 26 26 20 28  e( ie<nText && (
0e00: 28 70 54 65 78 74 5b 69 65 5d 26 30 78 38 30 29  (pText[ie]&0x80)
0e10: 20 7c 7c 20 61 5b 28 69 6e 74 29 70 54 65 78 74   || a[(int)pText
0e20: 5b 69 65 5d 5d 20 29 20 29 7b 0a 20 20 20 20 20  [ie]] ) ){.     
0e30: 20 69 65 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20   ie++;.    }..  
0e40: 20 20 2f 2a 20 46 6f 6c 64 20 74 6f 20 6c 6f 77    /* Fold to low
0e50: 65 72 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 6e  er case */.    n
0e60: 42 79 74 65 20 3d 20 69 65 2d 69 73 3b 0a 20 20  Byte = ie-is;.  
0e70: 20 20 69 66 28 20 6e 42 79 74 65 3e 6e 46 6f 6c    if( nByte>nFol
0e80: 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  d ){.      if( p
0e90: 46 6f 6c 64 21 3d 61 46 6f 6c 64 20 29 20 73 71  Fold!=aFold ) sq
0ea0: 6c 69 74 65 33 5f 66 72 65 65 28 70 46 6f 6c 64  lite3_free(pFold
0eb0: 29 3b 0a 20 20 20 20 20 20 70 46 6f 6c 64 20 3d  );.      pFold =
0ec0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
0ed0: 6e 42 79 74 65 2a 32 29 3b 0a 20 20 20 20 20 20  nByte*2);.      
0ee0: 69 66 28 20 70 46 6f 6c 64 3d 3d 30 20 29 7b 0a  if( pFold==0 ){.
0ef0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
0f00: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
0f10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
0f20: 7d 0a 20 20 20 20 20 20 6e 46 6f 6c 64 20 3d 20  }.      nFold = 
0f30: 6e 42 79 74 65 2a 32 3b 0a 20 20 20 20 7d 0a 20  nByte*2;.    }. 
0f40: 20 20 20 61 73 63 69 69 46 6f 6c 64 28 70 46 6f     asciiFold(pFo
0f50: 6c 64 2c 20 26 70 54 65 78 74 5b 69 73 5d 2c 20  ld, &pText[is], 
0f60: 6e 42 79 74 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  nByte);..    /* 
0f70: 49 6e 76 6f 6b 65 20 74 68 65 20 74 6f 6b 65 6e  Invoke the token
0f80: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20   callback */.   
0f90: 20 72 63 20 3d 20 78 54 6f 6b 65 6e 28 70 43 74   rc = xToken(pCt
0fa0: 78 2c 20 70 46 6f 6c 64 2c 20 6e 42 79 74 65 2c  x, pFold, nByte,
0fb0: 20 69 73 2c 20 69 65 29 3b 0a 20 20 20 20 69 73   is, ie);.    is
0fc0: 20 3d 20 69 65 2b 31 3b 0a 20 20 7d 0a 20 20 0a   = ie+1;.  }.  .
0fd0: 20 20 69 66 28 20 70 46 6f 6c 64 21 3d 61 46 6f    if( pFold!=aFo
0fe0: 6c 64 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  ld ) sqlite3_fre
0ff0: 65 28 70 46 6f 6c 64 29 3b 0a 20 20 69 66 28 20  e(pFold);.  if( 
1000: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1010: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
1020: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1030: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1080: 20 53 74 61 72 74 20 6f 66 20 75 6e 69 63 6f 64   Start of unicod
1090: 65 36 31 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d  e61 tokenizer im
10a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
10b0: 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
10c0: 73 20 69 6e 20 66 74 73 35 5f 75 6e 69 63 6f 64  s in fts5_unicod
10d0: 65 32 2e 63 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  e2.c. .*/.int sq
10e0: 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
10f0: 49 73 61 6c 6e 75 6d 28 69 6e 74 20 63 29 3b 0a  Isalnum(int c);.
1100: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 55  int sqlite3Fts5U
1110: 6e 69 63 6f 64 65 49 73 64 69 61 63 72 69 74 69  nicodeIsdiacriti
1120: 63 28 69 6e 74 20 63 29 3b 0a 69 6e 74 20 73 71  c(int c);.int sq
1130: 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
1140: 46 6f 6c 64 28 69 6e 74 20 63 2c 20 69 6e 74 20  Fold(int c, int 
1150: 62 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63  bRemoveDiacritic
1160: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  );.../*.** The f
1170: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
1180: 72 6f 73 20 2d 20 52 45 41 44 5f 55 54 46 38 20  ros - READ_UTF8 
1190: 61 6e 64 20 57 52 49 54 45 5f 55 54 46 38 20 2d  and WRITE_UTF8 -
11a0: 20 68 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65   have been copie
11b0: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 71  d.** from the sq
11c0: 6c 69 74 65 33 20 73 6f 75 72 63 65 20 66 69 6c  lite3 source fil
11d0: 65 20 75 74 66 2e 63 2e 20 49 66 20 74 68 69 73  e utf.c. If this
11e0: 20 66 69 6c 65 20 69 73 20 63 6f 6d 70 69 6c 65   file is compile
11f0: 64 20 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20  d as part.** of 
1200: 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
1210: 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 72  , they are not r
1220: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 23 69 66 6e  equired..*/.#ifn
1230: 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47  def SQLITE_AMALG
1240: 41 4d 41 54 49 4f 4e 0a 0a 73 74 61 74 69 63 20  AMATION..static 
1250: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1260: 68 61 72 20 73 71 6c 69 74 65 33 55 74 66 38 54  har sqlite3Utf8T
1270: 72 61 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20 30 78  rans1[] = {.  0x
1280: 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20  00, 0x01, 0x02, 
1290: 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35  0x03, 0x04, 0x05
12a0: 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20  , 0x06, 0x07,.  
12b0: 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61  0x08, 0x09, 0x0a
12c0: 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78  , 0x0b, 0x0c, 0x
12d0: 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a  0d, 0x0e, 0x0f,.
12e0: 20 20 30 78 31 30 2c 20 30 78 31 31 2c 20 30 78    0x10, 0x11, 0x
12f0: 31 32 2c 20 30 78 31 33 2c 20 30 78 31 34 2c 20  12, 0x13, 0x14, 
1300: 30 78 31 35 2c 20 30 78 31 36 2c 20 30 78 31 37  0x15, 0x16, 0x17
1310: 2c 0a 20 20 30 78 31 38 2c 20 30 78 31 39 2c 20  ,.  0x18, 0x19, 
1320: 30 78 31 61 2c 20 30 78 31 62 2c 20 30 78 31 63  0x1a, 0x1b, 0x1c
1330: 2c 20 30 78 31 64 2c 20 30 78 31 65 2c 20 30 78  , 0x1d, 0x1e, 0x
1340: 31 66 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31  1f,.  0x00, 0x01
1350: 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78  , 0x02, 0x03, 0x
1360: 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20  04, 0x05, 0x06, 
1370: 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78  0x07,.  0x08, 0x
1380: 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20  09, 0x0a, 0x0b, 
1390: 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65  0x0c, 0x0d, 0x0e
13a0: 2c 20 30 78 30 66 2c 0a 20 20 30 78 30 30 2c 20  , 0x0f,.  0x00, 
13b0: 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33  0x01, 0x02, 0x03
13c0: 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78  , 0x04, 0x05, 0x
13d0: 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 30  06, 0x07,.  0x00
13e0: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
13f0: 30 33 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20  03, 0x00, 0x01, 
1400: 30 78 30 30 2c 20 30 78 30 30 2c 0a 7d 3b 0a 0a  0x00, 0x00,.};..
1410: 23 64 65 66 69 6e 65 20 52 45 41 44 5f 55 54 46  #define READ_UTF
1420: 38 28 7a 49 6e 2c 20 7a 54 65 72 6d 2c 20 63 29  8(zIn, zTerm, c)
1430: 20 20 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 5c 0a 20 20 63             \.  c
1450: 20 3d 20 2a 28 7a 49 6e 2b 2b 29 3b 20 20 20 20   = *(zIn++);    
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 69 66 28 20          \.  if( 
1490: 63 3e 3d 30 78 63 30 20 29 7b 20 20 20 20 20 20  c>=0xc0 ){      
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 20 20 20 20 5c 0a 20 20 20 20 63 20 3d 20 73       \.    c = s
14d0: 71 6c 69 74 65 33 55 74 66 38 54 72 61 6e 73 31  qlite3Utf8Trans1
14e0: 5b 63 2d 30 78 63 30 5d 3b 20 20 20 20 20 20 20  [c-0xc0];       
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 5c 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    \.    while( z
1510: 49 6e 21 3d 7a 54 65 72 6d 20 26 26 20 28 2a 7a  In!=zTerm && (*z
1520: 49 6e 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  In & 0xc0)==0x80
1530: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c   ){            \
1540: 0a 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36  .      c = (c<<6
1550: 29 20 2b 20 28 30 78 33 66 20 26 20 2a 28 7a 49  ) + (0x3f & *(zI
1560: 6e 2b 2b 29 29 3b 20 20 20 20 20 20 20 20 20 20  n++));          
1570: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1580: 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20    }             
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20 69           \.    i
15c0: 66 28 20 63 3c 30 78 38 30 20 20 20 20 20 20 20  f( c<0x80       
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20        \.        
1600: 7c 7c 20 28 63 26 30 78 46 46 46 46 46 38 30 30  || (c&0xFFFFF800
1610: 29 3d 3d 30 78 44 38 30 30 20 20 20 20 20 20 20  )==0xD800       
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 5c 0a 20 20 20 20 20 20 20 20 7c 7c 20     \.        || 
1640: 28 63 26 30 78 46 46 46 46 46 46 46 45 29 3d 3d  (c&0xFFFFFFFE)==
1650: 30 78 46 46 46 45 20 29 7b 20 20 63 20 3d 20 30  0xFFFE ){  c = 0
1660: 78 46 46 46 44 3b 20 7d 20 20 20 20 20 20 20 20  xFFFD; }        
1670: 5c 0a 20 20 7d 0a 0a 0a 23 64 65 66 69 6e 65 20  \.  }...#define 
1680: 57 52 49 54 45 5f 55 54 46 38 28 7a 4f 75 74 2c  WRITE_UTF8(zOut,
1690: 20 63 29 20 7b 20 20 20 20 20 20 20 20 20 20 20   c) {           
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
16b0: 0a 20 20 69 66 28 20 63 3c 30 78 30 30 30 38 30  .  if( c<0x00080
16c0: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a          \.    *z
16f0: 4f 75 74 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65  Out++ = (unsigne
1700: 64 20 63 68 61 72 29 28 63 26 30 78 46 46 29 3b  d char)(c&0xFF);
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20   \.  }          
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 65 6c            \.  el
1760: 73 65 20 69 66 28 20 63 3c 30 78 30 30 38 30 30  se if( c<0x00800
1770: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b     \.    *zOut++
17a0: 20 3d 20 30 78 43 30 20 2b 20 28 75 6e 73 69 67   = 0xC0 + (unsig
17b0: 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e 36 29  ned char)((c>>6)
17c0: 26 30 78 31 46 29 3b 20 20 20 20 20 5c 0a 20 20  &0x1F);     \.  
17d0: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30    *zOut++ = 0x80
17e0: 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   + (unsigned cha
17f0: 72 29 28 63 20 26 20 30 78 33 46 29 3b 20 20 20  r)(c & 0x3F);   
1800: 20 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20       \.  }      
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1840: 20 20 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31    else if( c<0x1
1850: 30 30 30 30 20 29 7b 20 20 20 20 20 20 20 20 20  0000 ){         
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f         \.    *zO
1880: 75 74 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28 75  ut++ = 0xE0 + (u
1890: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 28 63  nsigned char)((c
18a0: 3e 3e 31 32 29 26 30 78 30 46 29 3b 20 20 20 20  >>12)&0x0F);    
18b0: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
18c0: 30 78 38 30 20 2b 20 28 75 6e 73 69 67 6e 65 64  0x80 + (unsigned
18d0: 20 63 68 61 72 29 28 28 63 3e 3e 36 29 20 26 20   char)((c>>6) & 
18e0: 30 78 33 46 29 3b 20 20 20 5c 0a 20 20 20 20 2a  0x3F);   \.    *
18f0: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
1900: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28  (unsigned char)(
1910: 63 20 26 20 30 78 33 46 29 3b 20 20 20 20 20 20  c & 0x3F);      
1920: 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1950: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1960: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 46 30 20   *zOut++ = 0xF0 
1970: 2b 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  + (unsigned char
1980: 29 28 28 63 3e 3e 31 38 29 20 26 20 30 78 30 37  )((c>>18) & 0x07
1990: 29 3b 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b  );  \.    *zOut+
19a0: 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 6e 73 69  + = 0x80 + (unsi
19b0: 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e 31  gned char)((c>>1
19c0: 32 29 20 26 20 30 78 33 46 29 3b 20 20 5c 0a 20  2) & 0x3F);  \. 
19d0: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38     *zOut++ = 0x8
19e0: 30 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 63 68  0 + (unsigned ch
19f0: 61 72 29 28 28 63 3e 3e 36 29 20 26 20 30 78 33  ar)((c>>6) & 0x3
1a00: 46 29 3b 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75  F);   \.    *zOu
1a10: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 6e  t++ = 0x80 + (un
1a20: 73 69 67 6e 65 64 20 63 68 61 72 29 28 63 20 26  signed char)(c &
1a30: 20 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 5c   0x3F);        \
1a40: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 65 6e          \.}..#en
1a80: 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  dif /* ifndef SQ
1a90: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
1aa0: 4e 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74  N */..typedef st
1ab0: 72 75 63 74 20 55 6e 69 63 6f 64 65 36 31 54 6f  ruct Unicode61To
1ac0: 6b 65 6e 69 7a 65 72 20 55 6e 69 63 6f 64 65 36  kenizer Unicode6
1ad0: 31 54 6f 6b 65 6e 69 7a 65 72 3b 0a 73 74 72 75  1Tokenizer;.stru
1ae0: 63 74 20 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65  ct Unicode61Toke
1af0: 6e 69 7a 65 72 20 7b 0a 20 20 75 6e 73 69 67 6e  nizer {.  unsign
1b00: 65 64 20 63 68 61 72 20 61 54 6f 6b 65 6e 43 68  ed char aTokenCh
1b10: 61 72 5b 31 32 38 5d 3b 20 20 2f 2a 20 41 53 43  ar[128];  /* ASC
1b20: 49 49 20 72 61 6e 67 65 20 74 6f 6b 65 6e 20 63  II range token c
1b30: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63  haracters */.  c
1b40: 68 61 72 20 2a 61 46 6f 6c 64 3b 20 20 20 20 20  har *aFold;     
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b60: 2a 20 42 75 66 66 65 72 20 74 6f 20 66 6f 6c 64  * Buffer to fold
1b70: 20 74 65 78 74 20 69 6e 74 6f 20 2a 2f 0a 20 20   text into */.  
1b80: 69 6e 74 20 6e 46 6f 6c 64 3b 20 20 20 20 20 20  int nFold;      
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 46 6f 6c 64  /* Size of aFold
1bb0: 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  [] in bytes */. 
1bc0: 20 69 6e 74 20 62 52 65 6d 6f 76 65 44 69 61 63   int bRemoveDiac
1bd0: 72 69 74 69 63 3b 20 20 20 20 20 20 20 20 20 20  ritic;          
1be0: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 6d 6f   /* True if remo
1bf0: 76 65 5f 64 69 61 63 72 69 74 69 63 73 3d 31 20  ve_diacritics=1 
1c00: 69 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  is set */.  int 
1c10: 6e 45 78 63 65 70 74 69 6f 6e 3b 0a 20 20 69 6e  nException;.  in
1c20: 74 20 2a 61 69 45 78 63 65 70 74 69 6f 6e 3b 0a  t *aiException;.
1c30: 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  };..static int f
1c40: 74 73 35 55 6e 69 63 6f 64 65 41 64 64 45 78 63  ts5UnicodeAddExc
1c50: 65 70 74 69 6f 6e 73 28 0a 20 20 55 6e 69 63 6f  eptions(.  Unico
1c60: 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72 20 2a 70  de61Tokenizer *p
1c70: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ,          /* To
1c80: 6b 65 6e 69 7a 65 72 20 6f 62 6a 65 63 74 20 2a  kenizer object *
1c90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1ca0: 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
1cb0: 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72      /* Character
1cc0: 73 20 74 6f 20 74 72 65 61 74 20 61 73 20 65 78  s to treat as ex
1cd0: 63 65 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ceptions */.  in
1ce0: 74 20 62 54 6f 6b 65 6e 43 68 61 72 73 20 20 20  t bTokenChars   
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d00: 20 31 20 66 6f 72 20 27 74 6f 6b 65 6e 63 68 61   1 for 'tokencha
1d10: 72 73 27 2c 20 30 20 66 6f 72 20 27 73 65 70 61  rs', 0 for 'sepa
1d20: 72 61 74 6f 72 73 27 20 2a 2f 0a 29 7b 0a 20 20  rators' */.){.  
1d30: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d40: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74  OK;.  int n = st
1d50: 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 6e 74 20 2a  rlen(z);.  int *
1d60: 61 4e 65 77 3b 0a 0a 20 20 69 66 28 20 6e 3e 30  aNew;..  if( n>0
1d70: 20 29 7b 0a 20 20 20 20 61 4e 65 77 20 3d 20 28   ){.    aNew = (
1d80: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
1d90: 6c 6c 6f 63 28 70 2d 3e 61 69 45 78 63 65 70 74  lloc(p->aiExcept
1da0: 69 6f 6e 2c 20 28 6e 2b 70 2d 3e 6e 45 78 63 65  ion, (n+p->nExce
1db0: 70 74 69 6f 6e 29 2a 73 69 7a 65 6f 66 28 69 6e  ption)*sizeof(in
1dc0: 74 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  t));.    if( aNe
1dd0: 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
1de0: 4e 65 77 20 3d 20 70 2d 3e 6e 45 78 63 65 70 74  New = p->nExcept
1df0: 69 6f 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ion;.      const
1e00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1e10: 7a 43 73 72 20 3d 20 28 63 6f 6e 73 74 20 75 6e  zCsr = (const un
1e20: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 3b 0a  signed char*)z;.
1e30: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69        const unsi
1e40: 67 6e 65 64 20 63 68 61 72 20 2a 7a 54 65 72 6d  gned char *zTerm
1e50: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1e60: 65 64 20 63 68 61 72 2a 29 26 7a 5b 6e 5d 3b 0a  ed char*)&z[n];.
1e70: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 73        while( zCs
1e80: 72 3c 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  r<zTerm ){.     
1e90: 20 20 20 69 6e 74 20 69 43 6f 64 65 3b 0a 20 20     int iCode;.  
1ea0: 20 20 20 20 20 20 69 6e 74 20 62 54 6f 6b 65 6e        int bToken
1eb0: 3b 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f 55  ;.        READ_U
1ec0: 54 46 38 28 7a 43 73 72 2c 20 7a 54 65 72 6d 2c  TF8(zCsr, zTerm,
1ed0: 20 69 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   iCode);.       
1ee0: 20 69 66 28 20 69 43 6f 64 65 3c 31 32 38 20 29   if( iCode<128 )
1ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
1f00: 54 6f 6b 65 6e 43 68 61 72 5b 69 43 6f 64 65 5d  TokenChar[iCode]
1f10: 20 3d 20 62 54 6f 6b 65 6e 43 68 61 72 73 3b 0a   = bTokenChars;.
1f20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f30: 20 20 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 20           bToken 
1f40: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  = sqlite3Fts5Uni
1f50: 63 6f 64 65 49 73 61 6c 6e 75 6d 28 69 43 6f 64  codeIsalnum(iCod
1f60: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  e);.          as
1f70: 73 65 72 74 28 20 28 62 54 6f 6b 65 6e 3d 3d 30  sert( (bToken==0
1f80: 20 7c 7c 20 62 54 6f 6b 65 6e 3d 3d 31 29 20 29   || bToken==1) )
1f90: 3b 20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ; .          ass
1fa0: 65 72 74 28 20 28 62 54 6f 6b 65 6e 43 68 61 72  ert( (bTokenChar
1fb0: 73 3d 3d 30 20 7c 7c 20 62 54 6f 6b 65 6e 43 68  s==0 || bTokenCh
1fc0: 61 72 73 3d 3d 31 29 20 29 3b 0a 20 20 20 20 20  ars==1) );.     
1fd0: 20 20 20 20 20 69 66 28 20 62 54 6f 6b 65 6e 21       if( bToken!
1fe0: 3d 62 54 6f 6b 65 6e 43 68 61 72 73 20 26 26 20  =bTokenChars && 
1ff0: 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f  sqlite3Fts5Unico
2000: 64 65 49 73 64 69 61 63 72 69 74 69 63 28 69 43  deIsdiacritic(iC
2010: 6f 64 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ode)==0 ){.     
2020: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
2030: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2040: 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
2050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2060: 66 28 20 61 4e 65 77 5b 69 5d 3e 69 43 6f 64 65  f( aNew[i]>iCode
2070: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2090: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65      memmove(&aNe
20a0: 77 5b 69 2b 31 5d 2c 20 26 61 4e 65 77 5b 69 5d  w[i+1], &aNew[i]
20b0: 2c 20 28 6e 4e 65 77 2d 69 29 2a 73 69 7a 65 6f  , (nNew-i)*sizeo
20c0: 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  f(int));.       
20d0: 20 20 20 20 20 61 4e 65 77 5b 69 5d 20 3d 20 69       aNew[i] = i
20e0: 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Code;.          
20f0: 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
2100: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2110: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
2120: 3e 61 69 45 78 63 65 70 74 69 6f 6e 20 3d 20 61  >aiException = a
2130: 4e 65 77 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 45  New;.      p->nE
2140: 78 63 65 70 74 69 6f 6e 20 3d 20 6e 4e 65 77 3b  xception = nNew;
2150: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2160: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2170: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
2180: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2190: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
21a0: 65 20 69 66 20 74 68 65 20 70 2d 3e 61 69 45 78  e if the p->aiEx
21b0: 63 65 70 74 69 6f 6e 5b 5d 20 61 72 72 61 79 20  ception[] array 
21c0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
21d0: 75 65 20 69 43 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ue iCode..*/.sta
21e0: 74 69 63 20 69 6e 74 20 66 74 73 35 55 6e 69 63  tic int fts5Unic
21f0: 6f 64 65 49 73 45 78 63 65 70 74 69 6f 6e 28 55  odeIsException(U
2200: 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65  nicode61Tokenize
2210: 72 20 2a 70 2c 20 69 6e 74 20 69 43 6f 64 65 29  r *p, int iCode)
2220: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 45 78 63 65  {.  if( p->nExce
2230: 70 74 69 6f 6e 3e 30 20 29 7b 0a 20 20 20 20 69  ption>0 ){.    i
2240: 6e 74 20 2a 61 20 3d 20 70 2d 3e 61 69 45 78 63  nt *a = p->aiExc
2250: 65 70 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  eption;.    int 
2260: 69 4c 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  iLo = 0;.    int
2270: 20 69 48 69 20 3d 20 70 2d 3e 6e 45 78 63 65 70   iHi = p->nExcep
2280: 74 69 6f 6e 2d 31 3b 0a 0a 20 20 20 20 77 68 69  tion-1;..    whi
2290: 6c 65 28 20 69 48 69 3e 3d 69 4c 6f 20 29 7b 0a  le( iHi>=iLo ){.
22a0: 20 20 20 20 20 20 69 6e 74 20 69 54 65 73 74 20        int iTest 
22b0: 3d 20 28 69 48 69 20 2b 20 69 4c 6f 29 20 2f 20  = (iHi + iLo) / 
22c0: 32 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  2;.      if( iCo
22d0: 64 65 3d 3d 61 5b 69 54 65 73 74 5d 20 29 7b 0a  de==a[iTest] ){.
22e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
22f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2300: 28 20 69 43 6f 64 65 3e 61 5b 69 54 65 73 74 5d  ( iCode>a[iTest]
2310: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 20   ){.        iLo 
2320: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20  = iTest+1;.     
2330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2340: 69 48 69 20 3d 20 69 54 65 73 74 2d 31 3b 0a 20  iHi = iTest-1;. 
2350: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2360: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
2370: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
2380: 22 75 6e 69 63 6f 64 65 36 31 22 20 74 6f 6b 65  "unicode61" toke
2390: 6e 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nizer..*/.static
23a0: 20 76 6f 69 64 20 66 74 73 35 55 6e 69 63 6f 64   void fts5Unicod
23b0: 65 44 65 6c 65 74 65 28 46 74 73 35 54 6f 6b 65  eDelete(Fts5Toke
23c0: 6e 69 7a 65 72 20 2a 70 54 6f 6b 29 7b 0a 20 20  nizer *pTok){.  
23d0: 69 66 28 20 70 54 6f 6b 20 29 7b 0a 20 20 20 20  if( pTok ){.    
23e0: 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a  Unicode61Tokeniz
23f0: 65 72 20 2a 70 20 3d 20 28 55 6e 69 63 6f 64 65  er *p = (Unicode
2400: 36 31 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 54 6f  61Tokenizer*)pTo
2410: 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  k;.    sqlite3_f
2420: 72 65 65 28 70 2d 3e 61 69 45 78 63 65 70 74 69  ree(p->aiExcepti
2430: 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  on);.    sqlite3
2440: 5f 66 72 65 65 28 70 2d 3e 61 46 6f 6c 64 29 3b  _free(p->aFold);
2450: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2460: 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
2470: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rn;.}../*.** Cre
2480: 61 74 65 20 61 20 22 75 6e 69 63 6f 64 65 36 31  ate a "unicode61
2490: 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f 0a  " tokenizer..*/.
24a0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 55  static int fts5U
24b0: 6e 69 63 6f 64 65 43 72 65 61 74 65 28 0a 20 20  nicodeCreate(.  
24c0: 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63  void *pCtx, .  c
24d0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
24e0: 67 2c 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 46  g, int nArg,.  F
24f0: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 2a 70  ts5Tokenizer **p
2500: 70 4f 75 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  pOut.){.  int rc
2510: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2530: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  urn code */.  Un
2540: 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72  icode61Tokenizer
2550: 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a   *p = 0;      /*
2560: 20 4e 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 6f   New tokenizer o
2570: 62 6a 65 63 74 20 2a 2f 20 0a 0a 20 20 69 66 28  bject */ ..  if(
2580: 20 6e 41 72 67 25 32 20 29 7b 0a 20 20 20 20 72   nArg%2 ){.    r
2590: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
25a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
25b0: 20 3d 20 28 55 6e 69 63 6f 64 65 36 31 54 6f 6b   = (Unicode61Tok
25c0: 65 6e 69 7a 65 72 2a 29 73 71 6c 69 74 65 33 5f  enizer*)sqlite3_
25d0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 55 6e  malloc(sizeof(Un
25e0: 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72  icode61Tokenizer
25f0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  ));.    if( p ){
2600: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2610: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
2620: 20 73 69 7a 65 6f 66 28 55 6e 69 63 6f 64 65 36   sizeof(Unicode6
2630: 31 54 6f 6b 65 6e 69 7a 65 72 29 29 3b 0a 20 20  1Tokenizer));.  
2640: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 54      memcpy(p->aT
2650: 6f 6b 65 6e 43 68 61 72 2c 20 61 41 73 63 69 69  okenChar, aAscii
2660: 54 6f 6b 65 6e 43 68 61 72 2c 20 73 69 7a 65 6f  TokenChar, sizeo
2670: 66 28 61 41 73 63 69 69 54 6f 6b 65 6e 43 68 61  f(aAsciiTokenCha
2680: 72 29 29 3b 0a 20 20 20 20 20 20 70 2d 3e 62 52  r));.      p->bR
2690: 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 20 3d  emoveDiacritic =
26a0: 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 6f   1;.      p->nFo
26b0: 6c 64 20 3d 20 36 34 3b 0a 20 20 20 20 20 20 70  ld = 64;.      p
26c0: 2d 3e 61 46 6f 6c 64 20 3d 20 73 71 6c 69 74 65  ->aFold = sqlite
26d0: 33 5f 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 46 6f 6c  3_malloc(p->nFol
26e0: 64 20 2a 20 73 69 7a 65 6f 66 28 63 68 61 72 29  d * sizeof(char)
26f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
2700: 61 46 6f 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20  aFold==0 ){.    
2710: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2720: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
2730: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
2740: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
2750: 3c 6e 41 72 67 3b 20 69 2b 3d 32 29 7b 0a 20 20  <nArg; i+=2){.  
2760: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2770: 20 2a 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69   *zArg = azArg[i
2780: 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1];.        if(
2790: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
27a0: 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22 72  cmp(azArg[i], "r
27b0: 65 6d 6f 76 65 5f 64 69 61 63 72 69 74 69 63 73  emove_diacritics
27c0: 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ") ){.          
27d0: 69 66 28 20 28 7a 41 72 67 5b 30 5d 21 3d 27 30  if( (zArg[0]!='0
27e0: 27 20 26 26 20 7a 41 72 67 5b 30 5d 21 3d 27 31  ' && zArg[0]!='1
27f0: 27 29 20 7c 7c 20 7a 41 72 67 5b 31 5d 20 29 7b  ') || zArg[1] ){
2800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2810: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2820: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2830: 20 20 20 20 20 20 70 2d 3e 62 52 65 6d 6f 76 65        p->bRemove
2840: 44 69 61 63 72 69 74 69 63 20 3d 20 28 7a 41 72  Diacritic = (zAr
2850: 67 5b 30 5d 3d 3d 27 31 27 29 3b 0a 20 20 20 20  g[0]=='1');.    
2860: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
2870: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
2880: 5f 73 74 72 69 63 6d 70 28 61 7a 41 72 67 5b 69  _stricmp(azArg[i
2890: 5d 2c 20 22 74 6f 6b 65 6e 63 68 61 72 73 22 29  ], "tokenchars")
28a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
28b0: 20 3d 20 66 74 73 35 55 6e 69 63 6f 64 65 41 64   = fts5UnicodeAd
28c0: 64 45 78 63 65 70 74 69 6f 6e 73 28 70 2c 20 7a  dExceptions(p, z
28d0: 41 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Arg, 1);.       
28e0: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
28f0: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
2900: 72 69 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20  ricmp(azArg[i], 
2910: 22 73 65 70 61 72 61 74 6f 72 73 22 29 20 29 7b  "separators") ){
2920: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2930: 66 74 73 35 55 6e 69 63 6f 64 65 41 64 64 45 78  fts5UnicodeAddEx
2940: 63 65 70 74 69 6f 6e 73 28 70 2c 20 7a 41 72 67  ceptions(p, zArg
2950: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
2960: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2970: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2980: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2990: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
29a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
29c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 74 73  _OK ){.      fts
29e0: 35 55 6e 69 63 6f 64 65 44 65 6c 65 74 65 28 28  5UnicodeDelete((
29f0: 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 29 70  Fts5Tokenizer*)p
2a00: 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 30 3b 0a  );.      p = 0;.
2a10: 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 4f 75 74      }.    *ppOut
2a20: 20 3d 20 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65   = (Fts5Tokenize
2a30: 72 2a 29 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r*)p;.  }.  retu
2a40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a50: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 2c 20  Return true if, 
2a60: 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  for the purposes
2a70: 20 6f 66 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 77   of tokenizing w
2a80: 69 74 68 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65  ith the tokenize
2a90: 72 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74  r.** passed as t
2aa0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
2ab0: 74 2c 20 63 6f 64 65 70 6f 69 6e 74 20 69 43 6f  t, codepoint iCo
2ac0: 64 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  de is considered
2ad0: 20 61 20 74 6f 6b 65 6e 20 0a 2a 2a 20 63 68 61   a token .** cha
2ae0: 72 61 63 74 65 72 20 28 6e 6f 74 20 61 20 73 65  racter (not a se
2af0: 70 61 72 61 74 6f 72 29 2e 0a 2a 2f 0a 73 74 61  parator)..*/.sta
2b00: 74 69 63 20 69 6e 74 20 66 74 73 35 55 6e 69 63  tic int fts5Unic
2b10: 6f 64 65 49 73 41 6c 6e 75 6d 28 55 6e 69 63 6f  odeIsAlnum(Unico
2b20: 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72 20 2a 70  de61Tokenizer *p
2b30: 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20 20  , int iCode){.  
2b40: 61 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33  assert( (sqlite3
2b50: 46 74 73 35 55 6e 69 63 6f 64 65 49 73 61 6c 6e  Fts5UnicodeIsaln
2b60: 75 6d 28 69 43 6f 64 65 29 20 26 20 30 78 46 46  um(iCode) & 0xFF
2b70: 46 46 46 46 46 45 29 3d 3d 30 20 29 3b 0a 20 20  FFFFFE)==0 );.  
2b80: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
2b90: 73 35 55 6e 69 63 6f 64 65 49 73 61 6c 6e 75 6d  s5UnicodeIsalnum
2ba0: 28 69 43 6f 64 65 29 20 5e 20 66 74 73 35 55 6e  (iCode) ^ fts5Un
2bb0: 69 63 6f 64 65 49 73 45 78 63 65 70 74 69 6f 6e  icodeIsException
2bc0: 28 70 2c 20 69 43 6f 64 65 29 3b 0a 7d 0a 0a 73  (p, iCode);.}..s
2bd0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 55 6e  tatic int fts5Un
2be0: 69 63 6f 64 65 54 6f 6b 65 6e 69 7a 65 28 0a 20  icodeTokenize(. 
2bf0: 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a   Fts5Tokenizer *
2c00: 70 54 6f 6b 65 6e 69 7a 65 72 2c 0a 20 20 76 6f  pTokenizer,.  vo
2c10: 69 64 20 2a 70 43 74 78 2c 0a 20 20 63 6f 6e 73  id *pCtx,.  cons
2c20: 74 20 63 68 61 72 20 2a 70 54 65 78 74 2c 20 69  t char *pText, i
2c30: 6e 74 20 6e 54 65 78 74 2c 0a 20 20 69 6e 74 20  nt nText,.  int 
2c40: 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c  (*xToken)(void*,
2c50: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
2c60: 74 20 6e 54 6f 6b 65 6e 2c 20 69 6e 74 20 69 53  t nToken, int iS
2c70: 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29 0a  tart, int iEnd).
2c80: 29 7b 0a 20 20 55 6e 69 63 6f 64 65 36 31 54 6f  ){.  Unicode61To
2c90: 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20 28 55 6e  kenizer *p = (Un
2ca0: 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72  icode61Tokenizer
2cb0: 2a 29 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20  *)pTokenizer;.  
2cc0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2cd0: 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  OK;.  unsigned c
2ce0: 68 61 72 20 2a 61 20 3d 20 70 2d 3e 61 54 6f 6b  har *a = p->aTok
2cf0: 65 6e 43 68 61 72 3b 0a 0a 20 20 75 6e 73 69 67  enChar;..  unsig
2d00: 6e 65 64 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  ned char *zTerm 
2d10: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
2d20: 2a 29 26 70 54 65 78 74 5b 6e 54 65 78 74 5d 3b  *)&pText[nText];
2d30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2d40: 20 2a 7a 43 73 72 20 3d 20 28 75 6e 73 69 67 6e   *zCsr = (unsign
2d50: 65 64 20 63 68 61 72 20 2a 29 70 54 65 78 74 3b  ed char *)pText;
2d60: 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75  ..  /* Output bu
2d70: 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ffer */.  char *
2d80: 61 46 6f 6c 64 20 3d 20 70 2d 3e 61 46 6f 6c 64  aFold = p->aFold
2d90: 3b 0a 20 20 69 6e 74 20 6e 46 6f 6c 64 20 3d 20  ;.  int nFold = 
2da0: 70 2d 3e 6e 46 6f 6c 64 3b 0a 0a 20 20 2f 2a 20  p->nFold;..  /* 
2db0: 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
2dc0: 66 20 74 68 69 73 20 6c 6f 6f 70 20 67 6f 62 62  f this loop gobb
2dd0: 6c 65 73 20 75 70 20 61 20 63 6f 6e 74 69 67 75  les up a contigu
2de0: 6f 75 73 20 72 75 6e 20 6f 66 20 73 65 70 61 72  ous run of separ
2df0: 61 74 6f 72 73 2c 0a 20 20 2a 2a 20 74 68 65 6e  ators,.  ** then
2e00: 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e   the next token.
2e10: 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63    */.  while( rc
2e20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e30: 20 20 20 69 6e 74 20 69 43 6f 64 65 3b 20 20 20     int iCode;   
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 2f 2a 20 6e 6f 6e 2d 41 53 43 49 49 20 63 6f   /* non-ASCII co
2e60: 64 65 70 6f 69 6e 74 20 72 65 61 64 20 66 72 6f  depoint read fro
2e70: 6d 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20 63  m input */.    c
2e80: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 61 46 6f 6c  har *zOut = aFol
2e90: 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 3b 0a 20  d;.    int is;. 
2ea0: 20 20 20 69 6e 74 20 69 65 3b 0a 0a 20 20 20 20     int ie;..    
2eb0: 2f 2a 20 53 6b 69 70 20 61 6e 79 20 73 65 70 61  /* Skip any sepa
2ec0: 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 73  rator characters
2ed0: 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  . */.    while( 
2ee0: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  1 ){.      if( z
2ef0: 43 73 72 3e 3d 7a 54 65 72 6d 20 29 20 67 6f 74  Csr>=zTerm ) got
2f00: 6f 20 74 6f 6b 65 6e 69 7a 65 5f 64 6f 6e 65 3b  o tokenize_done;
2f10: 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 43 73 72  .      if( *zCsr
2f20: 20 26 20 30 78 38 30 20 29 20 7b 0a 20 20 20 20   & 0x80 ) {.    
2f30: 20 20 20 20 2f 2a 20 41 20 63 68 61 72 61 63 74      /* A charact
2f40: 65 72 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68  er outside of th
2f50: 65 20 61 73 63 69 69 20 72 61 6e 67 65 2e 20 53  e ascii range. S
2f60: 6b 69 70 20 70 61 73 74 20 69 74 20 69 66 20 69  kip past it if i
2f70: 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
2f80: 61 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  a separator char
2f90: 61 63 74 65 72 2e 20 4f 72 20 62 72 65 61 6b 20  acter. Or break 
2fa0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
2fb0: 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f  if it is not. */
2fc0: 0a 20 20 20 20 20 20 20 20 69 73 20 3d 20 7a 43  .        is = zC
2fd0: 73 72 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 63  sr - (unsigned c
2fe0: 68 61 72 2a 29 70 54 65 78 74 3b 0a 20 20 20 20  har*)pText;.    
2ff0: 20 20 20 20 52 45 41 44 5f 55 54 46 38 28 7a 43      READ_UTF8(zC
3000: 73 72 2c 20 7a 54 65 72 6d 2c 20 69 43 6f 64 65  sr, zTerm, iCode
3010: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
3020: 74 73 35 55 6e 69 63 6f 64 65 49 73 41 6c 6e 75  ts5UnicodeIsAlnu
3030: 6d 28 70 2c 20 69 43 6f 64 65 29 20 29 7b 0a 20  m(p, iCode) ){. 
3040: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f           goto no
3050: 6e 5f 61 73 63 69 69 5f 74 6f 6b 65 6e 63 68 61  n_ascii_tokencha
3060: 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
3070: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3080: 20 20 69 66 28 20 61 5b 2a 7a 43 73 72 5d 20 29    if( a[*zCsr] )
3090: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 20 3d  {.          is =
30a0: 20 7a 43 73 72 20 2d 20 28 75 6e 73 69 67 6e 65   zCsr - (unsigne
30b0: 64 20 63 68 61 72 2a 29 70 54 65 78 74 3b 0a 20  d char*)pText;. 
30c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 73           goto as
30d0: 63 69 69 5f 74 6f 6b 65 6e 63 68 61 72 3b 0a 20  cii_tokenchar;. 
30e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30f0: 20 7a 43 73 72 2b 2b 3b 0a 20 20 20 20 20 20 7d   zCsr++;.      }
3100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
3110: 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  un through the t
3120: 6f 6b 65 6e 63 68 61 72 73 2e 20 46 6f 6c 64 20  okenchars. Fold 
3130: 74 68 65 6d 20 69 6e 74 6f 20 74 68 65 20 6f 75  them into the ou
3140: 74 70 75 74 20 62 75 66 66 65 72 20 61 6c 6f 6e  tput buffer alon
3150: 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 77 61 79  g.    ** the way
3160: 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  .  */.    while(
3170: 20 7a 43 73 72 3c 7a 54 65 72 6d 20 29 7b 0a 0a   zCsr<zTerm ){..
3180: 20 20 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68        /* Grow th
3190: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
31a0: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
31b0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
31c0: 65 20 74 6f 20 66 69 74 20 74 68 65 0a 20 20 20  e to fit the.   
31d0: 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 70 6f     ** largest po
31e0: 73 73 69 62 6c 65 20 75 74 66 2d 38 20 63 68 61  ssible utf-8 cha
31f0: 72 61 63 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20  racter.  */.    
3200: 20 20 69 66 28 20 28 7a 4f 75 74 2d 61 46 6f 6c    if( (zOut-aFol
3210: 64 29 2b 36 3e 6e 46 6f 6c 64 20 29 7b 0a 20 20  d)+6>nFold ){.  
3220: 20 20 20 20 20 20 61 46 6f 6c 64 20 3d 20 73 71        aFold = sq
3230: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 6f  lite3_malloc(nFo
3240: 6c 64 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69  ld*2);.        i
3250: 66 28 20 61 46 6f 6c 64 3d 3d 30 20 29 7b 0a 20  f( aFold==0 ){. 
3260: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
3270: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
3280: 20 20 20 20 20 20 67 6f 74 6f 20 74 6f 6b 65 6e        goto token
3290: 69 7a 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 20 20  ize_done;.      
32a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 75 74    }.        zOut
32b0: 20 3d 20 26 61 46 6f 6c 64 5b 7a 4f 75 74 20 2d   = &aFold[zOut -
32c0: 20 70 2d 3e 61 46 6f 6c 64 5d 3b 0a 20 20 20 20   p->aFold];.    
32d0: 20 20 20 20 6d 65 6d 63 70 79 28 61 46 6f 6c 64      memcpy(aFold
32e0: 2c 20 70 2d 3e 61 46 6f 6c 64 2c 20 6e 46 6f 6c  , p->aFold, nFol
32f0: 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
3300: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 46 6f 6c  te3_free(p->aFol
3310: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  d);.        p->a
3320: 46 6f 6c 64 20 3d 20 61 46 6f 6c 64 3b 0a 20 20  Fold = aFold;.  
3330: 20 20 20 20 20 20 70 2d 3e 6e 46 6f 6c 64 20 3d        p->nFold =
3340: 20 6e 46 6f 6c 64 20 3d 20 6e 46 6f 6c 64 2a 32   nFold = nFold*2
3350: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
3360: 20 69 66 28 20 2a 7a 43 73 72 20 26 20 30 78 38   if( *zCsr & 0x8
3370: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
3380: 41 6e 20 6e 6f 6e 2d 61 73 63 69 69 2d 72 61 6e  An non-ascii-ran
3390: 67 65 20 63 68 61 72 61 63 74 65 72 2e 20 46 6f  ge character. Fo
33a0: 6c 64 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6f  ld it into the o
33b0: 75 74 70 75 74 20 62 75 66 66 65 72 20 69 66 0a  utput buffer if.
33c0: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73          ** it is
33d0: 20 61 20 74 6f 6b 65 6e 20 63 68 61 72 61 63 74   a token charact
33e0: 65 72 2c 20 6f 72 20 62 72 65 61 6b 20 6f 75 74  er, or break out
33f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
3400: 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20  it is not. */.  
3410: 20 20 20 20 20 20 52 45 41 44 5f 55 54 46 38 28        READ_UTF8(
3420: 7a 43 73 72 2c 20 7a 54 65 72 6d 2c 20 69 43 6f  zCsr, zTerm, iCo
3430: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  de);.        if(
3440: 20 66 74 73 35 55 6e 69 63 6f 64 65 49 73 41 6c   fts5UnicodeIsAl
3450: 6e 75 6d 28 70 2c 69 43 6f 64 65 29 7c 7c 73 71  num(p,iCode)||sq
3460: 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
3470: 49 73 64 69 61 63 72 69 74 69 63 28 69 43 6f 64  Isdiacritic(iCod
3480: 65 29 20 29 7b 0a 20 6e 6f 6e 5f 61 73 63 69 69  e) ){. non_ascii
3490: 5f 74 6f 6b 65 6e 63 68 61 72 3a 0a 20 20 20 20  _tokenchar:.    
34a0: 20 20 20 20 20 20 69 43 6f 64 65 20 3d 20 73 71        iCode = sq
34b0: 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
34c0: 46 6f 6c 64 28 69 43 6f 64 65 2c 20 70 2d 3e 62  Fold(iCode, p->b
34d0: 52 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 29  RemoveDiacritic)
34e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
34f0: 69 43 6f 64 65 20 29 20 57 52 49 54 45 5f 55 54  iCode ) WRITE_UT
3500: 46 38 28 7a 4f 75 74 2c 20 69 43 6f 64 65 29 3b  F8(zOut, iCode);
3510: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3520: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3530: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3540: 20 7d 65 6c 73 65 20 69 66 28 20 61 5b 2a 7a 43   }else if( a[*zC
3550: 73 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sr]==0 ){.      
3560: 20 20 2f 2a 20 41 6e 20 61 73 63 69 69 2d 72 61    /* An ascii-ra
3570: 6e 67 65 20 73 65 70 61 72 61 74 6f 72 20 63 68  nge separator ch
3580: 61 72 61 63 74 65 72 2e 20 45 6e 64 20 6f 66 20  aracter. End of 
3590: 74 6f 6b 65 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  token. */.      
35a0: 20 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 20 20    break; .      
35b0: 7d 65 6c 73 65 7b 0a 20 61 73 63 69 69 5f 74 6f  }else{. ascii_to
35c0: 6b 65 6e 63 68 61 72 3a 0a 20 20 20 20 20 20 20  kenchar:.       
35d0: 20 69 66 28 20 2a 7a 43 73 72 3e 3d 27 41 27 20   if( *zCsr>='A' 
35e0: 26 26 20 2a 7a 43 73 72 3c 3d 27 5a 27 20 29 7b  && *zCsr<='Z' ){
35f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 7a 4f 75 74  .          *zOut
3600: 2b 2b 20 3d 20 2a 7a 43 73 72 20 2b 20 33 32 3b  ++ = *zCsr + 32;
3610: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3620: 20 20 20 20 20 20 20 20 20 20 2a 7a 4f 75 74 2b            *zOut+
3630: 2b 20 3d 20 2a 7a 43 73 72 3b 0a 20 20 20 20 20  + = *zCsr;.     
3640: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 43 73     }.        zCs
3650: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
3660: 20 20 20 69 65 20 3d 20 7a 43 73 72 20 2d 20 28     ie = zCsr - (
3670: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
3680: 54 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Text;.    }..   
3690: 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 74   /* Invoke the t
36a0: 6f 6b 65 6e 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  oken callback */
36b0: 0a 20 20 20 20 72 63 20 3d 20 78 54 6f 6b 65 6e  .    rc = xToken
36c0: 28 70 43 74 78 2c 20 61 46 6f 6c 64 2c 20 7a 4f  (pCtx, aFold, zO
36d0: 75 74 2d 61 46 6f 6c 64 2c 20 69 73 2c 20 69 65  ut-aFold, is, ie
36e0: 29 3b 0a 20 20 7d 0a 20 20 0a 20 74 6f 6b 65 6e  );.  }.  . token
36f0: 69 7a 65 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20  ize_done:.  if( 
3700: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
3710: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
3720: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
3730: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
3740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
3780: 20 53 74 61 72 74 20 6f 66 20 70 6f 72 74 65 72   Start of porter
3790: 20 73 74 65 6d 6d 65 72 20 69 6d 70 6c 65 6d 65   stemmer impleme
37a0: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 20  ntation..*/../* 
37b0: 41 6e 79 20 74 6f 6b 65 6e 73 20 6c 61 72 67 65  Any tokens large
37c0: 72 20 74 68 61 6e 20 74 68 69 73 20 28 69 6e 20  r than this (in 
37d0: 62 79 74 65 73 29 20 61 72 65 20 70 61 73 73 65  bytes) are passe
37e0: 64 20 74 68 72 6f 75 67 68 20 77 69 74 68 6f 75  d through withou
37f0: 74 0a 2a 2a 20 73 74 65 6d 6d 69 6e 67 2e 20 2a  t.** stemming. *
3800: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50  /.#define FTS5_P
3810: 4f 52 54 45 52 5f 4d 41 58 5f 54 4f 4b 45 4e 20  ORTER_MAX_TOKEN 
3820: 36 34 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  64..typedef stru
3830: 63 74 20 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  ct PorterTokeniz
3840: 65 72 20 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  er PorterTokeniz
3850: 65 72 3b 0a 73 74 72 75 63 74 20 50 6f 72 74 65  er;.struct Porte
3860: 72 54 6f 6b 65 6e 69 7a 65 72 20 7b 0a 20 20 66  rTokenizer {.  f
3870: 74 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 74 6f  ts5_tokenizer to
3880: 6b 65 6e 69 7a 65 72 3b 20 20 20 20 20 20 20 2f  kenizer;       /
3890: 2a 20 50 61 72 65 6e 74 20 74 6f 6b 65 6e 69 7a  * Parent tokeniz
38a0: 65 72 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 46  er module */.  F
38b0: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54  ts5Tokenizer *pT
38c0: 6f 6b 65 6e 69 7a 65 72 3b 20 20 20 20 20 20 2f  okenizer;      /
38d0: 2a 20 50 61 72 65 6e 74 20 74 6f 6b 65 6e 69 7a  * Parent tokeniz
38e0: 65 72 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 20  er instance */. 
38f0: 20 63 68 61 72 20 61 42 75 66 5b 46 54 53 35 5f   char aBuf[FTS5_
3900: 50 4f 52 54 45 52 5f 4d 41 58 5f 54 4f 4b 45 4e  PORTER_MAX_TOKEN
3910: 20 2b 20 36 34 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a   + 64];.};../*.*
3920: 2a 20 44 65 6c 65 74 65 20 61 20 22 70 6f 72 74  * Delete a "port
3930: 65 72 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a  er" tokenizer..*
3940: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
3950: 73 35 50 6f 72 74 65 72 44 65 6c 65 74 65 28 46  s5PorterDelete(F
3960: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54  ts5Tokenizer *pT
3970: 6f 6b 29 7b 0a 20 20 69 66 28 20 70 54 6f 6b 20  ok){.  if( pTok 
3980: 29 7b 0a 20 20 20 20 50 6f 72 74 65 72 54 6f 6b  ){.    PorterTok
3990: 65 6e 69 7a 65 72 20 2a 70 20 3d 20 28 50 6f 72  enizer *p = (Por
39a0: 74 65 72 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 54  terTokenizer*)pT
39b0: 6f 6b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ok;.    if( p->p
39c0: 54 6f 6b 65 6e 69 7a 65 72 20 29 7b 0a 20 20 20  Tokenizer ){.   
39d0: 20 20 20 70 2d 3e 74 6f 6b 65 6e 69 7a 65 72 2e     p->tokenizer.
39e0: 78 44 65 6c 65 74 65 28 70 2d 3e 70 54 6f 6b 65  xDelete(p->pToke
39f0: 6e 69 7a 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  nizer);.    }.  
3a00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3a10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3a20: 43 72 65 61 74 65 20 61 20 22 70 6f 72 74 65 72  Create a "porter
3a30: 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f 0a  " tokenizer..*/.
3a40: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
3a50: 6f 72 74 65 72 43 72 65 61 74 65 28 0a 20 20 76  orterCreate(.  v
3a60: 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f  oid *pCtx, .  co
3a70: 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  nst char **azArg
3a80: 2c 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74  , int nArg,.  Ft
3a90: 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 2a 70 70  s5Tokenizer **pp
3aa0: 4f 75 74 0a 29 7b 0a 20 20 66 74 73 35 5f 61 70  Out.){.  fts5_ap
3ab0: 69 20 2a 70 41 70 69 20 3d 20 28 66 74 73 35 5f  i *pApi = (fts5_
3ac0: 61 70 69 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74  api*)pCtx;.  int
3ad0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3ae0: 0a 20 20 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  .  PorterTokeniz
3af0: 65 72 20 2a 70 52 65 74 3b 0a 20 20 76 6f 69 64  er *pRet;.  void
3b00: 20 2a 70 55 73 65 72 64 61 74 61 20 3d 20 30 3b   *pUserdata = 0;
3b10: 0a 0a 20 20 70 52 65 74 20 3d 20 28 50 6f 72 74  ..  pRet = (Port
3b20: 65 72 54 6f 6b 65 6e 69 7a 65 72 2a 29 73 71 6c  erTokenizer*)sql
3b30: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
3b40: 6f 66 28 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  of(PorterTokeniz
3b50: 65 72 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74  er));.  if( pRet
3b60: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
3b70: 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  Ret, 0, sizeof(P
3b80: 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72 29 29  orterTokenizer))
3b90: 3b 0a 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d  ;.    rc = pApi-
3ba0: 3e 78 46 69 6e 64 54 6f 6b 65 6e 69 7a 65 72 28  >xFindTokenizer(
3bb0: 70 41 70 69 2c 20 22 75 6e 69 63 6f 64 65 36 31  pApi, "unicode61
3bc0: 22 2c 20 26 70 55 73 65 72 64 61 74 61 2c 20 26  ", &pUserdata, &
3bd0: 70 52 65 74 2d 3e 74 6f 6b 65 6e 69 7a 65 72 29  pRet->tokenizer)
3be0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
3c00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
3c10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3c20: 20 72 63 20 3d 20 70 52 65 74 2d 3e 74 6f 6b 65   rc = pRet->toke
3c30: 6e 69 7a 65 72 2e 78 43 72 65 61 74 65 28 70 55  nizer.xCreate(pU
3c40: 73 65 72 64 61 74 61 2c 20 30 2c 20 30 2c 20 26  serdata, 0, 0, &
3c50: 70 52 65 74 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72  pRet->pTokenizer
3c60: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
3c70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
3c80: 20 20 20 66 74 73 35 50 6f 72 74 65 72 44 65 6c     fts5PorterDel
3c90: 65 74 65 28 28 46 74 73 35 54 6f 6b 65 6e 69 7a  ete((Fts5Tokeniz
3ca0: 65 72 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 70  er*)pRet);.    p
3cb0: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  Ret = 0;.  }.  *
3cc0: 70 70 4f 75 74 20 3d 20 28 46 74 73 35 54 6f 6b  ppOut = (Fts5Tok
3cd0: 65 6e 69 7a 65 72 2a 29 70 52 65 74 3b 0a 20 20  enizer*)pRet;.  
3ce0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79  return rc;.}..ty
3cf0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 72  pedef struct Por
3d00: 74 65 72 43 6f 6e 74 65 78 74 20 50 6f 72 74 65  terContext Porte
3d10: 72 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74  rContext;.struct
3d20: 20 50 6f 72 74 65 72 43 6f 6e 74 65 78 74 20 7b   PorterContext {
3d30: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 3b 0a 20  .  void *pCtx;. 
3d40: 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76   int (*xToken)(v
3d50: 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  oid*, const char
3d60: 2a 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74  *, int, int, int
3d70: 29 3b 0a 20 20 63 68 61 72 20 2a 61 42 75 66 3b  );.  char *aBuf;
3d80: 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72  .};..typedef str
3d90: 75 63 74 20 50 6f 72 74 65 72 52 75 6c 65 20 50  uct PorterRule P
3da0: 6f 72 74 65 72 52 75 6c 65 3b 0a 73 74 72 75 63  orterRule;.struc
3db0: 74 20 50 6f 72 74 65 72 52 75 6c 65 20 7b 0a 20  t PorterRule {. 
3dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75   const char *zSu
3dd0: 66 66 69 78 3b 0a 20 20 69 6e 74 20 6e 53 75 66  ffix;.  int nSuf
3de0: 66 69 78 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6f  fix;.  int (*xCo
3df0: 6e 64 29 28 63 68 61 72 20 2a 7a 53 74 65 6d 2c  nd)(char *zStem,
3e00: 20 69 6e 74 20 6e 53 74 65 6d 29 3b 0a 20 20 63   int nStem);.  c
3e10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74 70  onst char *zOutp
3e20: 75 74 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 70 75  ut;.  int nOutpu
3e30: 74 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  t;.};..static in
3e40: 74 20 66 74 73 35 50 6f 72 74 65 72 41 70 70 6c  t fts5PorterAppl
3e50: 79 28 63 68 61 72 20 2a 61 42 75 66 2c 20 69 6e  y(char *aBuf, in
3e60: 74 20 2a 70 6e 42 75 66 2c 20 50 6f 72 74 65 72  t *pnBuf, Porter
3e70: 52 75 6c 65 20 2a 61 52 75 6c 65 29 7b 0a 20 20  Rule *aRule){.  
3e80: 69 6e 74 20 72 65 74 20 3d 20 2d 31 3b 0a 20 20  int ret = -1;.  
3e90: 69 6e 74 20 6e 42 75 66 20 3d 20 2a 70 6e 42 75  int nBuf = *pnBu
3ea0: 66 3b 0a 20 20 50 6f 72 74 65 72 52 75 6c 65 20  f;.  PorterRule 
3eb0: 2a 70 3b 0a 0a 20 20 66 6f 72 28 70 3d 61 52 75  *p;..  for(p=aRu
3ec0: 6c 65 3b 20 70 2d 3e 7a 53 75 66 66 69 78 3b 20  le; p->zSuffix; 
3ed0: 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p++){.    assert
3ee0: 28 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 53 75 66  ( strlen(p->zSuf
3ef0: 66 69 78 29 3d 3d 70 2d 3e 6e 53 75 66 66 69 78  fix)==p->nSuffix
3f00: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
3f10: 73 74 72 6c 65 6e 28 70 2d 3e 7a 4f 75 74 70 75  strlen(p->zOutpu
3f20: 74 29 3d 3d 70 2d 3e 6e 4f 75 74 70 75 74 20 29  t)==p->nOutput )
3f30: 3b 0a 20 20 20 20 69 66 28 20 6e 42 75 66 3c 70  ;.    if( nBuf<p
3f40: 2d 3e 6e 53 75 66 66 69 78 20 29 20 63 6f 6e 74  ->nSuffix ) cont
3f50: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 30 3d  inue;.    if( 0=
3f60: 3d 6d 65 6d 63 6d 70 28 26 61 42 75 66 5b 6e 42  =memcmp(&aBuf[nB
3f70: 75 66 20 2d 20 70 2d 3e 6e 53 75 66 66 69 78 5d  uf - p->nSuffix]
3f80: 2c 20 70 2d 3e 7a 53 75 66 66 69 78 2c 20 70 2d  , p->zSuffix, p-
3f90: 3e 6e 53 75 66 66 69 78 29 20 29 20 62 72 65 61  >nSuffix) ) brea
3fa0: 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  k;.  }..  if( p-
3fb0: 3e 7a 53 75 66 66 69 78 20 29 7b 0a 20 20 20 20  >zSuffix ){.    
3fc0: 69 6e 74 20 6e 53 74 65 6d 20 3d 20 6e 42 75 66  int nStem = nBuf
3fd0: 20 2d 20 70 2d 3e 6e 53 75 66 66 69 78 3b 0a 20   - p->nSuffix;. 
3fe0: 20 20 20 69 66 28 20 70 2d 3e 78 43 6f 6e 64 3d     if( p->xCond=
3ff0: 3d 30 20 7c 7c 20 70 2d 3e 78 43 6f 6e 64 28 61  =0 || p->xCond(a
4000: 42 75 66 2c 20 6e 53 74 65 6d 29 20 29 7b 0a 20  Buf, nStem) ){. 
4010: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75       memcpy(&aBu
4020: 66 5b 6e 53 74 65 6d 5d 2c 20 70 2d 3e 7a 4f 75  f[nStem], p->zOu
4030: 74 70 75 74 2c 20 70 2d 3e 6e 4f 75 74 70 75 74  tput, p->nOutput
4040: 29 3b 0a 20 20 20 20 20 20 2a 70 6e 42 75 66 20  );.      *pnBuf 
4050: 3d 20 6e 53 74 65 6d 20 2b 20 70 2d 3e 6e 4f 75  = nStem + p->nOu
4060: 74 70 75 74 3b 0a 20 20 20 20 20 20 72 65 74 20  tput;.      ret 
4070: 3d 20 70 20 2d 20 61 52 75 6c 65 3b 0a 20 20 20  = p - aRule;.   
4080: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
4090: 20 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   ret;.}..static 
40a0: 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72 49 73  int fts5PorterIs
40b0: 56 6f 77 65 6c 28 63 68 61 72 20 63 2c 20 69 6e  Vowel(char c, in
40c0: 74 20 62 59 49 73 56 6f 77 65 6c 29 7b 0a 20 20  t bYIsVowel){.  
40d0: 72 65 74 75 72 6e 20 28 0a 20 20 20 20 20 20 63  return (.      c
40e0: 3d 3d 27 61 27 20 7c 7c 20 63 3d 3d 27 65 27 20  =='a' || c=='e' 
40f0: 7c 7c 20 63 3d 3d 27 69 27 20 7c 7c 20 63 3d 3d  || c=='i' || c==
4100: 27 6f 27 20 7c 7c 20 63 3d 3d 27 75 27 20 7c 7c  'o' || c=='u' ||
4110: 20 28 62 59 49 73 56 6f 77 65 6c 20 26 26 20 63   (bYIsVowel && c
4120: 3d 3d 27 79 27 29 0a 20 20 29 3b 0a 7d 0a 0a 73  =='y').  );.}..s
4130: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f  tatic int fts5Po
4140: 72 74 65 72 47 6f 62 62 6c 65 56 43 28 63 68 61  rterGobbleVC(cha
4150: 72 20 2a 7a 53 74 65 6d 2c 20 69 6e 74 20 6e 53  r *zStem, int nS
4160: 74 65 6d 2c 20 69 6e 74 20 62 50 72 65 76 43 6f  tem, int bPrevCo
4170: 6e 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ns){.  int i;.  
4180: 69 6e 74 20 62 43 6f 6e 73 20 3d 20 62 50 72 65  int bCons = bPre
4190: 76 43 6f 6e 73 3b 0a 0a 20 20 2f 2a 20 53 63 61  vCons;..  /* Sca
41a0: 6e 20 66 6f 72 20 61 20 76 6f 77 65 6c 20 2a 2f  n for a vowel */
41b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53  .  for(i=0; i<nS
41c0: 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  tem; i++){.    i
41d0: 66 28 20 30 3d 3d 28 62 43 6f 6e 73 20 3d 20 21  f( 0==(bCons = !
41e0: 66 74 73 35 50 6f 72 74 65 72 49 73 56 6f 77 65  fts5PorterIsVowe
41f0: 6c 28 7a 53 74 65 6d 5b 69 5d 2c 20 62 43 6f 6e  l(zStem[i], bCon
4200: 73 29 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  s)) ) break;.  }
4210: 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 66 6f 72 20  ..  /* Scan for 
4220: 61 20 63 6f 6e 73 6f 6e 65 6e 74 20 2a 2f 0a 20  a consonent */. 
4230: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 6e 53 74 65   for(i++; i<nSte
4240: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  m; i++){.    if(
4250: 20 28 62 43 6f 6e 73 20 3d 20 21 66 74 73 35 50   (bCons = !fts5P
4260: 6f 72 74 65 72 49 73 56 6f 77 65 6c 28 7a 53 74  orterIsVowel(zSt
4270: 65 6d 5b 69 5d 2c 20 62 43 6f 6e 73 29 29 20 29  em[i], bCons)) )
4280: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 7d   return i+1;.  }
4290: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
42a0: 2f 2a 20 70 6f 72 74 65 72 20 72 75 6c 65 20 63  /* porter rule c
42b0: 6f 6e 64 69 74 69 6f 6e 3a 20 28 6d 20 3e 20 30  ondition: (m > 0
42c0: 29 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ) */.static int 
42d0: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
42e0: 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20 69 6e 74  char *zStem, int
42f0: 20 6e 53 74 65 6d 29 7b 0a 20 20 72 65 74 75 72   nStem){.  retur
4300: 6e 20 21 21 66 74 73 35 50 6f 72 74 65 72 47 6f  n !!fts5PorterGo
4310: 62 62 6c 65 56 43 28 7a 53 74 65 6d 2c 20 6e 53  bbleVC(zStem, nS
4320: 74 65 6d 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 70  tem, 0);.}../* p
4330: 6f 72 74 65 72 20 72 75 6c 65 20 63 6f 6e 64 69  orter rule condi
4340: 74 69 6f 6e 3a 20 28 6d 20 3e 20 31 29 20 2a 2f  tion: (m > 1) */
4350: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
4360: 50 6f 72 74 65 72 5f 4d 47 74 31 28 63 68 61 72  Porter_MGt1(char
4370: 20 2a 7a 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74   *zStem, int nSt
4380: 65 6d 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  em){.  int n;.  
4390: 6e 20 3d 20 66 74 73 35 50 6f 72 74 65 72 47 6f  n = fts5PorterGo
43a0: 62 62 6c 65 56 43 28 7a 53 74 65 6d 2c 20 6e 53  bbleVC(zStem, nS
43b0: 74 65 6d 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  tem, 0);.  if( n
43c0: 20 26 26 20 66 74 73 35 50 6f 72 74 65 72 47 6f   && fts5PorterGo
43d0: 62 62 6c 65 56 43 28 26 7a 53 74 65 6d 5b 6e 5d  bbleVC(&zStem[n]
43e0: 2c 20 6e 53 74 65 6d 2d 6e 2c 20 31 29 20 29 7b  , nStem-n, 1) ){
43f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
4400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4410: 0a 0a 2f 2a 20 70 6f 72 74 65 72 20 72 75 6c 65  ../* porter rule
4420: 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 28 6d 20 3d   condition: (m =
4430: 20 31 29 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1) */.static in
4440: 74 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 45 71  t fts5Porter_MEq
4450: 31 28 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20 69  1(char *zStem, i
4460: 6e 74 20 6e 53 74 65 6d 29 7b 0a 20 20 69 6e 74  nt nStem){.  int
4470: 20 6e 3b 0a 20 20 6e 20 3d 20 66 74 73 35 50 6f   n;.  n = fts5Po
4480: 72 74 65 72 47 6f 62 62 6c 65 56 43 28 7a 53 74  rterGobbleVC(zSt
4490: 65 6d 2c 20 6e 53 74 65 6d 2c 20 30 29 3b 0a 20  em, nStem, 0);. 
44a0: 20 69 66 28 20 6e 20 26 26 20 30 3d 3d 66 74 73   if( n && 0==fts
44b0: 35 50 6f 72 74 65 72 47 6f 62 62 6c 65 56 43 28  5PorterGobbleVC(
44c0: 26 7a 53 74 65 6d 5b 6e 5d 2c 20 6e 53 74 65 6d  &zStem[n], nStem
44d0: 2d 6e 2c 20 31 29 20 29 7b 0a 20 20 20 20 72 65  -n, 1) ){.    re
44e0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
44f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 70 6f  turn 0;.}../* po
4500: 72 74 65 72 20 72 75 6c 65 20 63 6f 6e 64 69 74  rter rule condit
4510: 69 6f 6e 3a 20 28 2a 6f 29 20 2a 2f 0a 73 74 61  ion: (*o) */.sta
4520: 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74  tic int fts5Port
4530: 65 72 5f 4f 73 74 61 72 28 63 68 61 72 20 2a 7a  er_Ostar(char *z
4540: 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74 65 6d 29  Stem, int nStem)
4550: 7b 0a 20 20 69 66 28 20 7a 53 74 65 6d 5b 6e 53  {.  if( zStem[nS
4560: 74 65 6d 2d 31 5d 3d 3d 27 77 27 20 7c 7c 20 7a  tem-1]=='w' || z
4570: 53 74 65 6d 5b 6e 53 74 65 6d 2d 31 5d 3d 3d 27  Stem[nStem-1]=='
4580: 78 27 20 7c 7c 20 7a 53 74 65 6d 5b 6e 53 74 65  x' || zStem[nSte
4590: 6d 2d 31 5d 3d 3d 27 79 27 20 29 7b 0a 20 20 20  m-1]=='y' ){.   
45a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
45b0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  se{.    int i;. 
45c0: 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b     int mask = 0;
45d0: 0a 20 20 20 20 69 6e 74 20 62 43 6f 6e 73 20 3d  .    int bCons =
45e0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
45f0: 20 69 3c 6e 53 74 65 6d 3b 20 69 2b 2b 29 7b 0a   i<nStem; i++){.
4600: 20 20 20 20 20 20 62 43 6f 6e 73 20 3d 20 21 66        bCons = !f
4610: 74 73 35 50 6f 72 74 65 72 49 73 56 6f 77 65 6c  ts5PorterIsVowel
4620: 28 7a 53 74 65 6d 5b 69 5d 2c 20 62 43 6f 6e 73  (zStem[i], bCons
4630: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
4640: 20 62 43 6f 6e 73 3d 3d 30 20 7c 7c 20 62 43 6f   bCons==0 || bCo
4650: 6e 73 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 6d  ns==1 );.      m
4660: 61 73 6b 20 3d 20 28 6d 61 73 6b 20 3c 3c 20 31  ask = (mask << 1
4670: 29 20 2b 20 62 43 6f 6e 73 3b 0a 20 20 20 20 7d  ) + bCons;.    }
4680: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 6d 61  .    return ((ma
4690: 73 6b 20 26 20 30 78 30 30 30 37 29 3d 3d 30 78  sk & 0x0007)==0x
46a0: 30 30 30 35 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0005);.  }.}../*
46b0: 20 70 6f 72 74 65 72 20 72 75 6c 65 20 63 6f 6e   porter rule con
46c0: 64 69 74 69 6f 6e 3a 20 28 6d 20 3e 20 31 20 61  dition: (m > 1 a
46d0: 6e 64 20 28 2a 53 20 6f 72 20 2a 54 29 29 20 2a  nd (*S or *T)) *
46e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
46f0: 35 50 6f 72 74 65 72 5f 4d 47 74 31 5f 61 6e 64  5Porter_MGt1_and
4700: 5f 53 5f 6f 72 5f 54 28 63 68 61 72 20 2a 7a 53  _S_or_T(char *zS
4710: 74 65 6d 2c 20 69 6e 74 20 6e 53 74 65 6d 29 7b  tem, int nStem){
4720: 0a 20 20 72 65 74 75 72 6e 20 6e 53 74 65 6d 3e  .  return nStem>
4730: 30 0a 20 20 20 20 20 20 26 26 20 28 7a 53 74 65  0.      && (zSte
4740: 6d 5b 6e 53 74 65 6d 2d 31 5d 3d 3d 27 73 27 20  m[nStem-1]=='s' 
4750: 7c 7c 20 7a 53 74 65 6d 5b 6e 53 74 65 6d 2d 31  || zStem[nStem-1
4760: 5d 3d 3d 27 74 27 29 0a 20 20 20 20 20 20 26 26  ]=='t').      &&
4770: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31   fts5Porter_MGt1
4780: 28 7a 53 74 65 6d 2c 20 6e 53 74 65 6d 29 3b 0a  (zStem, nStem);.
4790: 7d 0a 0a 2f 2a 20 70 6f 72 74 65 72 20 72 75 6c  }../* porter rul
47a0: 65 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 28 2a 76  e condition: (*v
47b0: 2a 29 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *) */.static int
47c0: 20 66 74 73 35 50 6f 72 74 65 72 5f 56 6f 77 65   fts5Porter_Vowe
47d0: 6c 28 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20 69  l(char *zStem, i
47e0: 6e 74 20 6e 53 74 65 6d 29 7b 0a 20 20 69 6e 74  nt nStem){.  int
47f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
4800: 3c 6e 53 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nStem; i++){.  
4810: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
4820: 49 73 56 6f 77 65 6c 28 7a 53 74 65 6d 5b 69 5d  IsVowel(zStem[i]
4830: 2c 20 69 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  , i>0) ){.      
4840: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
4850: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4860: 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
4870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
48b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 47  ***********.** G
4900: 45 4e 45 52 41 54 45 44 20 43 4f 44 45 20 53 54  ENERATED CODE ST
4910: 41 52 54 53 20 48 45 52 45 20 28 6d 6b 70 6f 72  ARTS HERE (mkpor
4920: 74 65 72 73 74 65 70 73 2e 74 63 6c 29 0a 2a 2f  tersteps.tcl).*/
4930: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
4940: 35 50 6f 72 74 65 72 53 74 65 70 34 28 63 68 61  5PorterStep4(cha
4950: 72 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70 6e  r *aBuf, int *pn
4960: 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 20  Buf){.  int ret 
4970: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 75 66 20  = 0;.  int nBuf 
4980: 3d 20 2a 70 6e 42 75 66 3b 0a 20 20 73 77 69 74  = *pnBuf;.  swit
4990: 63 68 28 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d  ch( aBuf[nBuf-2]
49a0: 20 29 7b 0a 20 20 20 20 0a 20 20 20 20 63 61 73   ){.    .    cas
49b0: 65 20 27 61 27 3a 20 0a 20 20 20 20 20 20 69 66  e 'a': .      if
49c0: 28 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d  ( nBuf>2 && 0==m
49d0: 65 6d 63 6d 70 28 22 61 6c 22 2c 20 26 61 42 75  emcmp("al", &aBu
49e0: 66 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b  f[nBuf-2], 2) ){
49f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
4a00: 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75  5Porter_MGt1(aBu
4a10: 66 2c 20 6e 42 75 66 2d 32 29 20 29 7b 0a 20 20  f, nBuf-2) ){.  
4a20: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
4a30: 20 6e 42 75 66 20 2d 20 32 3b 0a 20 20 20 20 20   nBuf - 2;.     
4a40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20     break;.  .   
4a60: 20 63 61 73 65 20 27 63 27 3a 20 0a 20 20 20 20   case 'c': .    
4a70: 20 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20    if( nBuf>4 && 
4a80: 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 6e 63 65 22  0==memcmp("ance"
4a90: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c  , &aBuf[nBuf-4],
4aa0: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   4) ){.        i
4ab0: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
4ac0: 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29  t1(aBuf, nBuf-4)
4ad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
4ae0: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 3b  nBuf = nBuf - 4;
4af0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4b00: 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e   }else if( nBuf>
4b10: 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  4 && 0==memcmp("
4b20: 65 6e 63 65 22 2c 20 26 61 42 75 66 5b 6e 42 75  ence", &aBuf[nBu
4b30: 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20  f-4], 4) ){.    
4b40: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
4b50: 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42  er_MGt1(aBuf, nB
4b60: 75 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-4) ){.       
4b70: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
4b80: 20 2d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 4;.        }.
4b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4ba0: 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65  eak;.  .    case
4bb0: 20 27 65 27 3a 20 0a 20 20 20 20 20 20 69 66 28   'e': .      if(
4bc0: 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d 65   nBuf>2 && 0==me
4bd0: 6d 63 6d 70 28 22 65 72 22 2c 20 26 61 42 75 66  mcmp("er", &aBuf
4be0: 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b 0a  [nBuf-2], 2) ){.
4bf0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
4c00: 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66  Porter_MGt1(aBuf
4c10: 2c 20 6e 42 75 66 2d 32 29 20 29 7b 0a 20 20 20  , nBuf-2) ){.   
4c20: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
4c30: 6e 42 75 66 20 2d 20 32 3b 0a 20 20 20 20 20 20  nBuf - 2;.      
4c40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4c50: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20    break;.  .    
4c60: 63 61 73 65 20 27 69 27 3a 20 0a 20 20 20 20 20  case 'i': .     
4c70: 20 69 66 28 20 6e 42 75 66 3e 32 20 26 26 20 30   if( nBuf>2 && 0
4c80: 3d 3d 6d 65 6d 63 6d 70 28 22 69 63 22 2c 20 26  ==memcmp("ic", &
4c90: 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 32 29  aBuf[nBuf-2], 2)
4ca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
4cb0: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28  fts5Porter_MGt1(
4cc0: 61 42 75 66 2c 20 6e 42 75 66 2d 32 29 20 29 7b  aBuf, nBuf-2) ){
4cd0: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
4ce0: 66 20 3d 20 6e 42 75 66 20 2d 20 32 3b 0a 20 20  f = nBuf - 2;.  
4cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4d00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
4d10: 20 20 20 20 63 61 73 65 20 27 6c 27 3a 20 0a 20      case 'l': . 
4d20: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 34 20       if( nBuf>4 
4d30: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 62  && 0==memcmp("ab
4d40: 6c 65 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  le", &aBuf[nBuf-
4d50: 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  4], 4) ){.      
4d60: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
4d70: 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66  _MGt1(aBuf, nBuf
4d80: 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
4d90: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
4da0: 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
4db0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42      }else if( nB
4dc0: 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>4 && 0==memcm
4dd0: 70 28 22 69 62 6c 65 22 2c 20 26 61 42 75 66 5b  p("ible", &aBuf[
4de0: 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20  nBuf-4], 4) ){. 
4df0: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
4e00: 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c  orter_MGt1(aBuf,
4e10: 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20 20   nBuf-4) ){.    
4e20: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
4e30: 42 75 66 20 2d 20 34 3b 0a 20 20 20 20 20 20 20  Buf - 4;.       
4e40: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
4e50: 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63   break;.  .    c
4e60: 61 73 65 20 27 6e 27 3a 20 0a 20 20 20 20 20 20  ase 'n': .      
4e70: 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d  if( nBuf>3 && 0=
4e80: 3d 6d 65 6d 63 6d 70 28 22 61 6e 74 22 2c 20 26  =memcmp("ant", &
4e90: 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29  aBuf[nBuf-3], 3)
4ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
4eb0: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28  fts5Porter_MGt1(
4ec0: 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b  aBuf, nBuf-3) ){
4ed0: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
4ee0: 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20  f = nBuf - 3;.  
4ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
4f00: 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 35 20 26  lse if( nBuf>5 &
4f10: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65 6d 65  & 0==memcmp("eme
4f20: 6e 74 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  nt", &aBuf[nBuf-
4f30: 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  5], 5) ){.      
4f40: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
4f50: 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66  _MGt1(aBuf, nBuf
4f60: 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -5) ){.         
4f70: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
4f80: 20 35 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   5;.        }.  
4f90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42      }else if( nB
4fa0: 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>4 && 0==memcm
4fb0: 70 28 22 6d 65 6e 74 22 2c 20 26 61 42 75 66 5b  p("ment", &aBuf[
4fc0: 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20  nBuf-4], 4) ){. 
4fd0: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
4fe0: 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c  orter_MGt1(aBuf,
4ff0: 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20 20   nBuf-4) ){.    
5000: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
5010: 42 75 66 20 2d 20 34 3b 0a 20 20 20 20 20 20 20  Buf - 4;.       
5020: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
5030: 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d  f( nBuf>3 && 0==
5040: 6d 65 6d 63 6d 70 28 22 65 6e 74 22 2c 20 26 61  memcmp("ent", &a
5050: 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20  Buf[nBuf-3], 3) 
5060: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
5070: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61  ts5Porter_MGt1(a
5080: 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a  Buf, nBuf-3) ){.
5090: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
50a0: 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20   = nBuf - 3;.   
50b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
50c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20       break;.  . 
50d0: 20 20 20 63 61 73 65 20 27 6f 27 3a 20 0a 20 20     case 'o': .  
50e0: 20 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26      if( nBuf>3 &
50f0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 6f 6e  & 0==memcmp("ion
5100: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d  ", &aBuf[nBuf-3]
5110: 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 3) ){.        
5120: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
5130: 47 74 31 5f 61 6e 64 5f 53 5f 6f 72 5f 54 28 61  Gt1_and_S_or_T(a
5140: 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a  Buf, nBuf-3) ){.
5150: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
5160: 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20   = nBuf - 3;.   
5170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5180: 73 65 20 69 66 28 20 6e 42 75 66 3e 32 20 26 26  se if( nBuf>2 &&
5190: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 6f 75 22 2c   0==memcmp("ou",
51a0: 20 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20   &aBuf[nBuf-2], 
51b0: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  2) ){.        if
51c0: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
51d0: 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 32 29 20  1(aBuf, nBuf-2) 
51e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  ){.          *pn
51f0: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 32 3b 0a  Buf = nBuf - 2;.
5200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5210: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5220: 20 0a 20 20 20 20 63 61 73 65 20 27 73 27 3a 20   .    case 's': 
5230: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e  .      if( nBuf>
5240: 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  3 && 0==memcmp("
5250: 69 73 6d 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  ism", &aBuf[nBuf
5260: 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20 20  -3], 3) ){.     
5270: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
5280: 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75  r_MGt1(aBuf, nBu
5290: 66 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-3) ){.        
52a0: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
52b0: 2d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 3;.        }. 
52c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
52d0: 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20  ak;.  .    case 
52e0: 27 74 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20  't': .      if( 
52f0: 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>3 && 0==mem
5300: 63 6d 70 28 22 61 74 65 22 2c 20 26 61 42 75 66  cmp("ate", &aBuf
5310: 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a  [nBuf-3], 3) ){.
5320: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
5330: 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66  Porter_MGt1(aBuf
5340: 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20 20  , nBuf-3) ){.   
5350: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
5360: 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20 20 20  nBuf - 3;.      
5370: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
5380: 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d  if( nBuf>3 && 0=
5390: 3d 6d 65 6d 63 6d 70 28 22 69 74 69 22 2c 20 26  =memcmp("iti", &
53a0: 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29  aBuf[nBuf-3], 3)
53b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
53c0: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28  fts5Porter_MGt1(
53d0: 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b  aBuf, nBuf-3) ){
53e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
53f0: 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20  f = nBuf - 3;.  
5400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
5420: 20 20 20 20 63 61 73 65 20 27 75 27 3a 20 0a 20      case 'u': . 
5430: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20       if( nBuf>3 
5440: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 6f 75  && 0==memcmp("ou
5450: 73 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33  s", &aBuf[nBuf-3
5460: 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 3) ){.       
5470: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
5480: 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d  MGt1(aBuf, nBuf-
5490: 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  3) ){.          
54a0: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
54b0: 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  3;.        }.   
54c0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
54d0: 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27 76  ;.  .    case 'v
54e0: 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42  ': .      if( nB
54f0: 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>3 && 0==memcm
5500: 70 28 22 69 76 65 22 2c 20 26 61 42 75 66 5b 6e  p("ive", &aBuf[n
5510: 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20  Buf-3], 3) ){.  
5520: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
5530: 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20  rter_MGt1(aBuf, 
5540: 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20 20 20 20  nBuf-3) ){.     
5550: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
5560: 75 66 20 2d 20 33 3b 0a 20 20 20 20 20 20 20 20  uf - 3;.        
5570: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5580: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61  break;.  .    ca
5590: 73 65 20 27 7a 27 3a 20 0a 20 20 20 20 20 20 69  se 'z': .      i
55a0: 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d  f( nBuf>3 && 0==
55b0: 6d 65 6d 63 6d 70 28 22 69 7a 65 22 2c 20 26 61  memcmp("ize", &a
55c0: 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20  Buf[nBuf-3], 3) 
55d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
55e0: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61  ts5Porter_MGt1(a
55f0: 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a  Buf, nBuf-3) ){.
5600: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
5610: 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20   = nBuf - 3;.   
5620: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20       break;.  . 
5640: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
5650: 0a 7d 0a 20 20 0a 0a 73 74 61 74 69 63 20 69 6e  .}.  ..static in
5660: 74 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70  t fts5PorterStep
5670: 31 42 32 28 63 68 61 72 20 2a 61 42 75 66 2c 20  1B2(char *aBuf, 
5680: 69 6e 74 20 2a 70 6e 42 75 66 29 7b 0a 20 20 69  int *pnBuf){.  i
5690: 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 69 6e  nt ret = 0;.  in
56a0: 74 20 6e 42 75 66 20 3d 20 2a 70 6e 42 75 66 3b  t nBuf = *pnBuf;
56b0: 0a 20 20 73 77 69 74 63 68 28 20 61 42 75 66 5b  .  switch( aBuf[
56c0: 6e 42 75 66 2d 32 5d 20 29 7b 0a 20 20 20 20 0a  nBuf-2] ){.    .
56d0: 20 20 20 20 63 61 73 65 20 27 61 27 3a 20 0a 20      case 'a': . 
56e0: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 32 20       if( nBuf>2 
56f0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 74  && 0==memcmp("at
5700: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d  ", &aBuf[nBuf-2]
5710: 2c 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 2) ){.        
5720: 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75  memcpy(&aBuf[nBu
5730: 66 2d 32 5d 2c 20 22 61 74 65 22 2c 20 33 29 3b  f-2], "ate", 3);
5740: 0a 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20  .        *pnBuf 
5750: 3d 20 6e 42 75 66 20 2d 20 32 20 2b 20 33 3b 0a  = nBuf - 2 + 3;.
5760: 20 20 20 20 20 20 20 20 72 65 74 20 3d 20 31 3b          ret = 1;
5770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5780: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73  reak;.  .    cas
5790: 65 20 27 62 27 3a 20 0a 20 20 20 20 20 20 69 66  e 'b': .      if
57a0: 28 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d  ( nBuf>2 && 0==m
57b0: 65 6d 63 6d 70 28 22 62 6c 22 2c 20 26 61 42 75  emcmp("bl", &aBu
57c0: 66 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b  f[nBuf-2], 2) ){
57d0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
57e0: 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 22  &aBuf[nBuf-2], "
57f0: 62 6c 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  ble", 3);.      
5800: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
5810: 2d 20 32 20 2b 20 33 3b 0a 20 20 20 20 20 20 20  - 2 + 3;.       
5820: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   ret = 1;.      
5830: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5840: 20 0a 20 20 20 20 63 61 73 65 20 27 69 27 3a 20   .    case 'i': 
5850: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e  .      if( nBuf>
5860: 32 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  2 && 0==memcmp("
5870: 69 7a 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  iz", &aBuf[nBuf-
5880: 32 5d 2c 20 32 29 20 29 7b 0a 20 20 20 20 20 20  2], 2) ){.      
5890: 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e    memcpy(&aBuf[n
58a0: 42 75 66 2d 32 5d 2c 20 22 69 7a 65 22 2c 20 33  Buf-2], "ize", 3
58b0: 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 42 75  );.        *pnBu
58c0: 66 20 3d 20 6e 42 75 66 20 2d 20 32 20 2b 20 33  f = nBuf - 2 + 3
58d0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 20 3d 20  ;.        ret = 
58e0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
58f0: 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 7d 0a 20   break;.  .  }. 
5900: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 20   return ret;.}. 
5910: 20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74   ..static int ft
5920: 73 35 50 6f 72 74 65 72 53 74 65 70 32 28 63 68  s5PorterStep2(ch
5930: 61 72 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70  ar *aBuf, int *p
5940: 6e 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 65 74  nBuf){.  int ret
5950: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 75 66   = 0;.  int nBuf
5960: 20 3d 20 2a 70 6e 42 75 66 3b 0a 20 20 73 77 69   = *pnBuf;.  swi
5970: 74 63 68 28 20 61 42 75 66 5b 6e 42 75 66 2d 32  tch( aBuf[nBuf-2
5980: 5d 20 29 7b 0a 20 20 20 20 0a 20 20 20 20 63 61  ] ){.    .    ca
5990: 73 65 20 27 61 27 3a 20 0a 20 20 20 20 20 20 69  se 'a': .      i
59a0: 66 28 20 6e 42 75 66 3e 37 20 26 26 20 30 3d 3d  f( nBuf>7 && 0==
59b0: 6d 65 6d 63 6d 70 28 22 61 74 69 6f 6e 61 6c 22  memcmp("ational"
59c0: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d 2c  , &aBuf[nBuf-7],
59d0: 20 37 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   7) ){.        i
59e0: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
59f0: 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 37 29  t0(aBuf, nBuf-7)
5a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
5a10: 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d  mcpy(&aBuf[nBuf-
5a20: 37 5d 2c 20 22 61 74 65 22 2c 20 33 29 3b 0a 20  7], "ate", 3);. 
5a30: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
5a40: 3d 20 6e 42 75 66 20 2d 20 37 20 2b 20 33 3b 0a  = nBuf - 7 + 3;.
5a50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5a60: 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 36  }else if( nBuf>6
5a70: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 74   && 0==memcmp("t
5a80: 69 6f 6e 61 6c 22 2c 20 26 61 42 75 66 5b 6e 42  ional", &aBuf[nB
5a90: 75 66 2d 36 5d 2c 20 36 29 20 29 7b 0a 20 20 20  uf-6], 6) ){.   
5aa0: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
5ab0: 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e  ter_MGt0(aBuf, n
5ac0: 42 75 66 2d 36 29 20 29 7b 0a 20 20 20 20 20 20  Buf-6) ){.      
5ad0: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66      memcpy(&aBuf
5ae0: 5b 6e 42 75 66 2d 36 5d 2c 20 22 74 69 6f 6e 22  [nBuf-6], "tion"
5af0: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
5b00: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
5b10: 36 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  6 + 4;.        }
5b20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5b30: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73  reak;.  .    cas
5b40: 65 20 27 63 27 3a 20 0a 20 20 20 20 20 20 69 66  e 'c': .      if
5b50: 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d  ( nBuf>4 && 0==m
5b60: 65 6d 63 6d 70 28 22 65 6e 63 69 22 2c 20 26 61  emcmp("enci", &a
5b70: 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20  Buf[nBuf-4], 4) 
5b80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
5b90: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61  ts5Porter_MGt0(a
5ba0: 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a  Buf, nBuf-4) ){.
5bb0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
5bc0: 28 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20  (&aBuf[nBuf-4], 
5bd0: 22 65 6e 63 65 22 2c 20 34 29 3b 0a 20 20 20 20  "ence", 4);.    
5be0: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
5bf0: 42 75 66 20 2d 20 34 20 2b 20 34 3b 0a 20 20 20  Buf - 4 + 4;.   
5c00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5c10: 73 65 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26  se if( nBuf>4 &&
5c20: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 6e 63 69   0==memcmp("anci
5c30: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d  ", &aBuf[nBuf-4]
5c40: 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 4) ){.        
5c50: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
5c60: 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 34  Gt0(aBuf, nBuf-4
5c70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
5c80: 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66  emcpy(&aBuf[nBuf
5c90: 2d 34 5d 2c 20 22 61 6e 63 65 22 2c 20 34 29 3b  -4], "ance", 4);
5ca0: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
5cb0: 66 20 3d 20 6e 42 75 66 20 2d 20 34 20 2b 20 34  f = nBuf - 4 + 4
5cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5cd0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5ce0: 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27 65 27  .  .    case 'e'
5cf0: 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75  : .      if( nBu
5d00: 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  f>4 && 0==memcmp
5d10: 28 22 69 7a 65 72 22 2c 20 26 61 42 75 66 5b 6e  ("izer", &aBuf[n
5d20: 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20  Buf-4], 4) ){.  
5d30: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
5d40: 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20  rter_MGt0(aBuf, 
5d50: 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20 20 20  nBuf-4) ){.     
5d60: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75       memcpy(&aBu
5d70: 66 5b 6e 42 75 66 2d 34 5d 2c 20 22 69 7a 65 22  f[nBuf-4], "ize"
5d80: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
5d90: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
5da0: 34 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 7d  4 + 3;.        }
5db0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5dc0: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73  reak;.  .    cas
5dd0: 65 20 27 67 27 3a 20 0a 20 20 20 20 20 20 69 66  e 'g': .      if
5de0: 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d  ( nBuf>4 && 0==m
5df0: 65 6d 63 6d 70 28 22 6c 6f 67 69 22 2c 20 26 61  emcmp("logi", &a
5e00: 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20  Buf[nBuf-4], 4) 
5e10: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
5e20: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61  ts5Porter_MGt0(a
5e30: 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a  Buf, nBuf-4) ){.
5e40: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
5e50: 28 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20  (&aBuf[nBuf-4], 
5e60: 22 6c 6f 67 22 2c 20 33 29 3b 0a 20 20 20 20 20  "log", 3);.     
5e70: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
5e80: 75 66 20 2d 20 34 20 2b 20 33 3b 0a 20 20 20 20  uf - 4 + 3;.    
5e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5ea0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20      break;.  .  
5eb0: 20 20 63 61 73 65 20 27 6c 27 3a 20 0a 20 20 20    case 'l': .   
5ec0: 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26     if( nBuf>3 &&
5ed0: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 62 6c 69 22   0==memcmp("bli"
5ee0: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c  , &aBuf[nBuf-3],
5ef0: 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   3) ){.        i
5f00: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
5f10: 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29  t0(aBuf, nBuf-3)
5f20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
5f30: 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d  mcpy(&aBuf[nBuf-
5f40: 33 5d 2c 20 22 62 6c 65 22 2c 20 33 29 3b 0a 20  3], "ble", 3);. 
5f50: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
5f60: 3d 20 6e 42 75 66 20 2d 20 33 20 2b 20 33 3b 0a  = nBuf - 3 + 3;.
5f70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5f80: 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 34  }else if( nBuf>4
5f90: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61   && 0==memcmp("a
5fa0: 6c 6c 69 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  lli", &aBuf[nBuf
5fb0: 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  -4], 4) ){.     
5fc0: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
5fd0: 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75  r_MGt0(aBuf, nBu
5fe0: 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-4) ){.        
5ff0: 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e    memcpy(&aBuf[n
6000: 42 75 66 2d 34 5d 2c 20 22 61 6c 22 2c 20 32 29  Buf-4], "al", 2)
6010: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  ;.          *pnB
6020: 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 20 2b 20  uf = nBuf - 4 + 
6030: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
6040: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75     }else if( nBu
6050: 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  f>5 && 0==memcmp
6060: 28 22 65 6e 74 6c 69 22 2c 20 26 61 42 75 66 5b  ("entli", &aBuf[
6070: 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20  nBuf-5], 5) ){. 
6080: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
6090: 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c  orter_MGt0(aBuf,
60a0: 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20 20 20 20   nBuf-5) ){.    
60b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42        memcpy(&aB
60c0: 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 22 65 6e 74  uf[nBuf-5], "ent
60d0: 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 3);.         
60e0: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
60f0: 20 35 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20   5 + 3;.        
6100: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
6110: 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d  ( nBuf>3 && 0==m
6120: 65 6d 63 6d 70 28 22 65 6c 69 22 2c 20 26 61 42  emcmp("eli", &aB
6130: 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29  uf[nBuf-3], 3) )
6140: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
6150: 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42  s5Porter_MGt0(aB
6160: 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20  uf, nBuf-3) ){. 
6170: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6180: 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 22  &aBuf[nBuf-3], "
6190: 65 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  e", 1);.        
61a0: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
61b0: 2d 20 33 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  - 3 + 1;.       
61c0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
61d0: 66 28 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d  f( nBuf>5 && 0==
61e0: 6d 65 6d 63 6d 70 28 22 6f 75 73 6c 69 22 2c 20  memcmp("ousli", 
61f0: 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35  &aBuf[nBuf-5], 5
6200: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
6210: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30   fts5Porter_MGt0
6220: 28 61 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29  (aBuf, nBuf-5) )
6230: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
6240: 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d  py(&aBuf[nBuf-5]
6250: 2c 20 22 6f 75 73 22 2c 20 33 29 3b 0a 20 20 20  , "ous", 3);.   
6260: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
6270: 6e 42 75 66 20 2d 20 35 20 2b 20 33 3b 0a 20 20  nBuf - 5 + 3;.  
6280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
62a0: 20 20 20 20 63 61 73 65 20 27 6f 27 3a 20 0a 20      case 'o': . 
62b0: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 37 20       if( nBuf>7 
62c0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 7a  && 0==memcmp("iz
62d0: 61 74 69 6f 6e 22 2c 20 26 61 42 75 66 5b 6e 42  ation", &aBuf[nB
62e0: 75 66 2d 37 5d 2c 20 37 29 20 29 7b 0a 20 20 20  uf-7], 7) ){.   
62f0: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
6300: 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e  ter_MGt0(aBuf, n
6310: 42 75 66 2d 37 29 20 29 7b 0a 20 20 20 20 20 20  Buf-7) ){.      
6320: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66      memcpy(&aBuf
6330: 5b 6e 42 75 66 2d 37 5d 2c 20 22 69 7a 65 22 2c  [nBuf-7], "ize",
6340: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a   3);.          *
6350: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 37  pnBuf = nBuf - 7
6360: 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 3;.        }.
6370: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6380: 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>5 && 0==mem
6390: 63 6d 70 28 22 61 74 69 6f 6e 22 2c 20 26 61 42  cmp("ation", &aB
63a0: 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29  uf[nBuf-5], 5) )
63b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
63c0: 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42  s5Porter_MGt0(aB
63d0: 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20  uf, nBuf-5) ){. 
63e0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
63f0: 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 22  &aBuf[nBuf-5], "
6400: 61 74 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  ate", 3);.      
6410: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
6420: 66 20 2d 20 35 20 2b 20 33 3b 0a 20 20 20 20 20  f - 5 + 3;.     
6430: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6440: 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30   if( nBuf>4 && 0
6450: 3d 3d 6d 65 6d 63 6d 70 28 22 61 74 6f 72 22 2c  ==memcmp("ator",
6460: 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20   &aBuf[nBuf-4], 
6470: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  4) ){.        if
6480: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
6490: 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20  0(aBuf, nBuf-4) 
64a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
64b0: 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 34  cpy(&aBuf[nBuf-4
64c0: 5d 2c 20 22 61 74 65 22 2c 20 33 29 3b 0a 20 20  ], "ate", 3);.  
64d0: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
64e0: 20 6e 42 75 66 20 2d 20 34 20 2b 20 33 3b 0a 20   nBuf - 4 + 3;. 
64f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6500: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6510: 0a 20 20 20 20 63 61 73 65 20 27 73 27 3a 20 0a  .    case 's': .
6520: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 35        if( nBuf>5
6530: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61   && 0==memcmp("a
6540: 6c 69 73 6d 22 2c 20 26 61 42 75 66 5b 6e 42 75  lism", &aBuf[nBu
6550: 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20  f-5], 5) ){.    
6560: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
6570: 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42  er_MGt0(aBuf, nB
6580: 75 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-5) ){.       
6590: 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b     memcpy(&aBuf[
65a0: 6e 42 75 66 2d 35 5d 2c 20 22 61 6c 22 2c 20 32  nBuf-5], "al", 2
65b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  );.          *pn
65c0: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 35 20 2b  Buf = nBuf - 5 +
65d0: 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
65e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42      }else if( nB
65f0: 75 66 3e 37 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>7 && 0==memcm
6600: 70 28 22 69 76 65 6e 65 73 73 22 2c 20 26 61 42  p("iveness", &aB
6610: 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 37 29 20 29  uf[nBuf-7], 7) )
6620: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
6630: 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42  s5Porter_MGt0(aB
6640: 75 66 2c 20 6e 42 75 66 2d 37 29 20 29 7b 0a 20  uf, nBuf-7) ){. 
6650: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6660: 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 22  &aBuf[nBuf-7], "
6670: 69 76 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20  ive", 3);.      
6680: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
6690: 66 20 2d 20 37 20 2b 20 33 3b 0a 20 20 20 20 20  f - 7 + 3;.     
66a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
66b0: 20 69 66 28 20 6e 42 75 66 3e 37 20 26 26 20 30   if( nBuf>7 && 0
66c0: 3d 3d 6d 65 6d 63 6d 70 28 22 66 75 6c 6e 65 73  ==memcmp("fulnes
66d0: 73 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 37  s", &aBuf[nBuf-7
66e0: 5d 2c 20 37 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 7) ){.       
66f0: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
6700: 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d  MGt0(aBuf, nBuf-
6710: 37 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7) ){.          
6720: 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75  memcpy(&aBuf[nBu
6730: 66 2d 37 5d 2c 20 22 66 75 6c 22 2c 20 33 29 3b  f-7], "ful", 3);
6740: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
6750: 66 20 3d 20 6e 42 75 66 20 2d 20 37 20 2b 20 33  f = nBuf - 7 + 3
6760: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6770: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66    }else if( nBuf
6780: 3e 37 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >7 && 0==memcmp(
6790: 22 6f 75 73 6e 65 73 73 22 2c 20 26 61 42 75 66  "ousness", &aBuf
67a0: 5b 6e 42 75 66 2d 37 5d 2c 20 37 29 20 29 7b 0a  [nBuf-7], 7) ){.
67b0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
67c0: 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66  Porter_MGt0(aBuf
67d0: 2c 20 6e 42 75 66 2d 37 29 20 29 7b 0a 20 20 20  , nBuf-7) ){.   
67e0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
67f0: 42 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 22 6f 75  Buf[nBuf-7], "ou
6800: 73 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  s", 3);.        
6810: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
6820: 2d 20 37 20 2b 20 33 3b 0a 20 20 20 20 20 20 20  - 7 + 3;.       
6830: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6840: 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63   break;.  .    c
6850: 61 73 65 20 27 74 27 3a 20 0a 20 20 20 20 20 20  ase 't': .      
6860: 69 66 28 20 6e 42 75 66 3e 35 20 26 26 20 30 3d  if( nBuf>5 && 0=
6870: 3d 6d 65 6d 63 6d 70 28 22 61 6c 69 74 69 22 2c  =memcmp("aliti",
6880: 20 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20   &aBuf[nBuf-5], 
6890: 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  5) ){.        if
68a0: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
68b0: 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 35 29 20  0(aBuf, nBuf-5) 
68c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
68d0: 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 35  cpy(&aBuf[nBuf-5
68e0: 5d 2c 20 22 61 6c 22 2c 20 32 29 3b 0a 20 20 20  ], "al", 2);.   
68f0: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
6900: 6e 42 75 66 20 2d 20 35 20 2b 20 32 3b 0a 20 20  nBuf - 5 + 2;.  
6910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
6920: 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 35 20 26  lse if( nBuf>5 &
6930: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 76 69  & 0==memcmp("ivi
6940: 74 69 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  ti", &aBuf[nBuf-
6950: 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  5], 5) ){.      
6960: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
6970: 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66  _MGt0(aBuf, nBuf
6980: 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -5) ){.         
6990: 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42   memcpy(&aBuf[nB
69a0: 75 66 2d 35 5d 2c 20 22 69 76 65 22 2c 20 33 29  uf-5], "ive", 3)
69b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  ;.          *pnB
69c0: 75 66 20 3d 20 6e 42 75 66 20 2d 20 35 20 2b 20  uf = nBuf - 5 + 
69d0: 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  3;.        }.   
69e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75     }else if( nBu
69f0: 66 3e 36 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  f>6 && 0==memcmp
6a00: 28 22 62 69 6c 69 74 69 22 2c 20 26 61 42 75 66  ("biliti", &aBuf
6a10: 5b 6e 42 75 66 2d 36 5d 2c 20 36 29 20 29 7b 0a  [nBuf-6], 6) ){.
6a20: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
6a30: 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66  Porter_MGt0(aBuf
6a40: 2c 20 6e 42 75 66 2d 36 29 20 29 7b 0a 20 20 20  , nBuf-6) ){.   
6a50: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
6a60: 42 75 66 5b 6e 42 75 66 2d 36 5d 2c 20 22 62 6c  Buf[nBuf-6], "bl
6a70: 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  e", 3);.        
6a80: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
6a90: 2d 20 36 20 2b 20 33 3b 0a 20 20 20 20 20 20 20  - 6 + 3;.       
6aa0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6ab0: 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 7d 0a 20   break;.  .  }. 
6ac0: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 20   return ret;.}. 
6ad0: 20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74   ..static int ft
6ae0: 73 35 50 6f 72 74 65 72 53 74 65 70 33 28 63 68  s5PorterStep3(ch
6af0: 61 72 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70  ar *aBuf, int *p
6b00: 6e 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 65 74  nBuf){.  int ret
6b10: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 75 66   = 0;.  int nBuf
6b20: 20 3d 20 2a 70 6e 42 75 66 3b 0a 20 20 73 77 69   = *pnBuf;.  swi
6b30: 74 63 68 28 20 61 42 75 66 5b 6e 42 75 66 2d 32  tch( aBuf[nBuf-2
6b40: 5d 20 29 7b 0a 20 20 20 20 0a 20 20 20 20 63 61  ] ){.    .    ca
6b50: 73 65 20 27 61 27 3a 20 0a 20 20 20 20 20 20 69  se 'a': .      i
6b60: 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d  f( nBuf>4 && 0==
6b70: 6d 65 6d 63 6d 70 28 22 69 63 61 6c 22 2c 20 26  memcmp("ical", &
6b80: 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29  aBuf[nBuf-4], 4)
6b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
6ba0: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
6bb0: 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b  aBuf, nBuf-4) ){
6bc0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
6bd0: 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c  y(&aBuf[nBuf-4],
6be0: 20 22 69 63 22 2c 20 32 29 3b 0a 20 20 20 20 20   "ic", 2);.     
6bf0: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
6c00: 75 66 20 2d 20 34 20 2b 20 32 3b 0a 20 20 20 20  uf - 4 + 2;.    
6c10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20      break;.  .  
6c30: 20 20 63 61 73 65 20 27 73 27 3a 20 0a 20 20 20    case 's': .   
6c40: 20 20 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26     if( nBuf>4 &&
6c50: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 6e 65 73 73   0==memcmp("ness
6c60: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d  ", &aBuf[nBuf-4]
6c70: 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 4) ){.        
6c80: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
6c90: 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 34  Gt0(aBuf, nBuf-4
6ca0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  ) ){.          *
6cb0: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34  pnBuf = nBuf - 4
6cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6cd0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6ce0: 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27 74 27  .  .    case 't'
6cf0: 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75  : .      if( nBu
6d00: 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  f>5 && 0==memcmp
6d10: 28 22 69 63 61 74 65 22 2c 20 26 61 42 75 66 5b  ("icate", &aBuf[
6d20: 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20  nBuf-5], 5) ){. 
6d30: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
6d40: 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c  orter_MGt0(aBuf,
6d50: 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20 20 20 20   nBuf-5) ){.    
6d60: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42        memcpy(&aB
6d70: 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 22 69 63 22  uf[nBuf-5], "ic"
6d80: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
6d90: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
6da0: 35 20 2b 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  5 + 2;.        }
6db0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6dc0: 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65   nBuf>5 && 0==me
6dd0: 6d 63 6d 70 28 22 69 63 69 74 69 22 2c 20 26 61  mcmp("iciti", &a
6de0: 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20  Buf[nBuf-5], 5) 
6df0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
6e00: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61  ts5Porter_MGt0(a
6e10: 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a  Buf, nBuf-5) ){.
6e20: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6e30: 28 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20  (&aBuf[nBuf-5], 
6e40: 22 69 63 22 2c 20 32 29 3b 0a 20 20 20 20 20 20  "ic", 2);.      
6e50: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
6e60: 66 20 2d 20 35 20 2b 20 32 3b 0a 20 20 20 20 20  f - 5 + 2;.     
6e70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6e80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20     break;.  .   
6e90: 20 63 61 73 65 20 27 75 27 3a 20 0a 20 20 20 20   case 'u': .    
6ea0: 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20    if( nBuf>3 && 
6eb0: 30 3d 3d 6d 65 6d 63 6d 70 28 22 66 75 6c 22 2c  0==memcmp("ful",
6ec0: 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20   &aBuf[nBuf-3], 
6ed0: 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  3) ){.        if
6ee0: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
6ef0: 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20  0(aBuf, nBuf-3) 
6f00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  ){.          *pn
6f10: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a  Buf = nBuf - 3;.
6f20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f30: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6f40: 20 0a 20 20 20 20 63 61 73 65 20 27 76 27 3a 20   .    case 'v': 
6f50: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e  .      if( nBuf>
6f60: 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  5 && 0==memcmp("
6f70: 61 74 69 76 65 22 2c 20 26 61 42 75 66 5b 6e 42  ative", &aBuf[nB
6f80: 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20  uf-5], 5) ){.   
6f90: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
6fa0: 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e  ter_MGt0(aBuf, n
6fb0: 42 75 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20  Buf-5) ){.      
6fc0: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
6fd0: 66 20 2d 20 35 3b 0a 20 20 20 20 20 20 20 20 7d  f - 5;.        }
6fe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6ff0: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73  reak;.  .    cas
7000: 65 20 27 7a 27 3a 20 0a 20 20 20 20 20 20 69 66  e 'z': .      if
7010: 28 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d  ( nBuf>5 && 0==m
7020: 65 6d 63 6d 70 28 22 61 6c 69 7a 65 22 2c 20 26  emcmp("alize", &
7030: 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29  aBuf[nBuf-5], 5)
7040: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
7050: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
7060: 61 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b  aBuf, nBuf-5) ){
7070: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
7080: 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c  y(&aBuf[nBuf-5],
7090: 20 22 61 6c 22 2c 20 32 29 3b 0a 20 20 20 20 20   "al", 2);.     
70a0: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
70b0: 75 66 20 2d 20 35 20 2b 20 32 3b 0a 20 20 20 20  uf - 5 + 2;.    
70c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
70d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20      break;.  .  
70e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
70f0: 7d 0a 20 20 0a 0a 73 74 61 74 69 63 20 69 6e 74  }.  ..static int
7100: 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70 31   fts5PorterStep1
7110: 42 28 63 68 61 72 20 2a 61 42 75 66 2c 20 69 6e  B(char *aBuf, in
7120: 74 20 2a 70 6e 42 75 66 29 7b 0a 20 20 69 6e 74  t *pnBuf){.  int
7130: 20 72 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   ret = 0;.  int 
7140: 6e 42 75 66 20 3d 20 2a 70 6e 42 75 66 3b 0a 20  nBuf = *pnBuf;. 
7150: 20 73 77 69 74 63 68 28 20 61 42 75 66 5b 6e 42   switch( aBuf[nB
7160: 75 66 2d 32 5d 20 29 7b 0a 20 20 20 20 0a 20 20  uf-2] ){.    .  
7170: 20 20 63 61 73 65 20 27 65 27 3a 20 0a 20 20 20    case 'e': .   
7180: 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26     if( nBuf>3 &&
7190: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65 65 64 22   0==memcmp("eed"
71a0: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c  , &aBuf[nBuf-3],
71b0: 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   3) ){.        i
71c0: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
71d0: 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29  t0(aBuf, nBuf-3)
71e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
71f0: 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d  mcpy(&aBuf[nBuf-
7200: 33 5d 2c 20 22 65 65 22 2c 20 32 29 3b 0a 20 20  3], "ee", 2);.  
7210: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
7220: 20 6e 42 75 66 20 2d 20 33 20 2b 20 32 3b 0a 20   nBuf - 3 + 2;. 
7230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7240: 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 32 20  else if( nBuf>2 
7250: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65 64  && 0==memcmp("ed
7260: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d  ", &aBuf[nBuf-2]
7270: 2c 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 2) ){.        
7280: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 56  if( fts5Porter_V
7290: 6f 77 65 6c 28 61 42 75 66 2c 20 6e 42 75 66 2d  owel(aBuf, nBuf-
72a0: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
72b0: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
72c0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  2;.          ret
72d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
72e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
72f0: 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65  eak;.  .    case
7300: 20 27 6e 27 3a 20 0a 20 20 20 20 20 20 69 66 28   'n': .      if(
7310: 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65   nBuf>3 && 0==me
7320: 6d 63 6d 70 28 22 69 6e 67 22 2c 20 26 61 42 75  mcmp("ing", &aBu
7330: 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b  f[nBuf-3], 3) ){
7340: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
7350: 35 50 6f 72 74 65 72 5f 56 6f 77 65 6c 28 61 42  5Porter_Vowel(aB
7360: 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20  uf, nBuf-3) ){. 
7370: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
7380: 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20  = nBuf - 3;.    
7390: 20 20 20 20 20 20 72 65 74 20 3d 20 31 3b 0a 20        ret = 1;. 
73a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
73b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
73c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
73d0: 74 3b 0a 7d 0a 20 20 0a 2f 2a 20 0a 2a 2a 20 47  t;.}.  ./* .** G
73e0: 45 4e 45 52 41 54 45 44 20 43 4f 44 45 20 45 4e  ENERATED CODE EN
73f0: 44 53 20 48 45 52 45 20 28 6d 6b 70 6f 72 74 65  DS HERE (mkporte
7400: 72 73 74 65 70 73 2e 74 63 6c 29 0a 2a 2a 2a 2a  rsteps.tcl).****
7410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7450: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
7460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74a0: 2a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  **/..static void
74b0: 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70 31   fts5PorterStep1
74c0: 41 28 63 68 61 72 20 2a 61 42 75 66 2c 20 69 6e  A(char *aBuf, in
74d0: 74 20 2a 70 6e 42 75 66 29 7b 0a 20 20 69 6e 74  t *pnBuf){.  int
74e0: 20 6e 42 75 66 20 3d 20 2a 70 6e 42 75 66 3b 0a   nBuf = *pnBuf;.
74f0: 20 20 69 66 28 20 61 42 75 66 5b 6e 42 75 66 2d    if( aBuf[nBuf-
7500: 31 5d 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 69  1]=='s' ){.    i
7510: 66 28 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d 3d  f( aBuf[nBuf-2]=
7520: 3d 27 65 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='e' ){.      if
7530: 28 20 28 6e 42 75 66 3e 34 20 26 26 20 61 42 75  ( (nBuf>4 && aBu
7540: 66 5b 6e 42 75 66 2d 34 5d 3d 3d 27 73 27 20 26  f[nBuf-4]=='s' &
7550: 26 20 61 42 75 66 5b 6e 42 75 66 2d 33 5d 3d 3d  & aBuf[nBuf-3]==
7560: 27 73 27 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  's') .       || 
7570: 28 6e 42 75 66 3e 33 20 26 26 20 61 42 75 66 5b  (nBuf>3 && aBuf[
7580: 6e 42 75 66 2d 33 5d 3d 3d 27 69 27 20 29 0a 20  nBuf-3]=='i' ). 
7590: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
75a0: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 2d 32 3b  *pnBuf = nBuf-2;
75b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
75c0: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
75d0: 42 75 66 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  Buf-1;.      }. 
75e0: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
75f0: 28 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d  ( aBuf[nBuf-2]!=
7600: 27 73 27 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  's' ){.      *pn
7610: 42 75 66 20 3d 20 6e 42 75 66 2d 31 3b 0a 20 20  Buf = nBuf-1;.  
7620: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
7630: 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72  c int fts5Porter
7640: 43 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  Cb(.  void *pCtx
7650: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
7660: 2a 70 54 6f 6b 65 6e 2c 20 0a 20 20 69 6e 74 20  *pToken, .  int 
7670: 6e 54 6f 6b 65 6e 2c 20 0a 20 20 69 6e 74 20 69  nToken, .  int i
7680: 53 74 61 72 74 2c 20 0a 20 20 69 6e 74 20 69 45  Start, .  int iE
7690: 6e 64 0a 29 7b 0a 20 20 50 6f 72 74 65 72 43 6f  nd.){.  PorterCo
76a0: 6e 74 65 78 74 20 2a 70 20 3d 20 28 50 6f 72 74  ntext *p = (Port
76b0: 65 72 43 6f 6e 74 65 78 74 2a 29 70 43 74 78 3b  erContext*)pCtx;
76c0: 0a 0a 20 20 63 68 61 72 20 2a 61 42 75 66 3b 0a  ..  char *aBuf;.
76d0: 20 20 69 6e 74 20 6e 42 75 66 3b 0a 0a 20 20 69    int nBuf;..  i
76e0: 66 28 20 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 50  f( nToken>FTS5_P
76f0: 4f 52 54 45 52 5f 4d 41 58 5f 54 4f 4b 45 4e 20  ORTER_MAX_TOKEN 
7700: 7c 7c 20 6e 54 6f 6b 65 6e 3c 33 20 29 20 67 6f  || nToken<3 ) go
7710: 74 6f 20 70 61 73 73 5f 74 68 72 6f 75 67 68 3b  to pass_through;
7720: 0a 20 20 61 42 75 66 20 3d 20 70 2d 3e 61 42 75  .  aBuf = p->aBu
7730: 66 3b 0a 20 20 6e 42 75 66 20 3d 20 6e 54 6f 6b  f;.  nBuf = nTok
7740: 65 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 61 42 75  en;.  memcpy(aBu
7750: 66 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 75 66 29  f, pToken, nBuf)
7760: 3b 0a 0a 20 20 2f 2a 20 53 74 65 70 20 31 2e 20  ;..  /* Step 1. 
7770: 2a 2f 0a 20 20 66 74 73 35 50 6f 72 74 65 72 53  */.  fts5PorterS
7780: 74 65 70 31 41 28 61 42 75 66 2c 20 26 6e 42 75  tep1A(aBuf, &nBu
7790: 66 29 3b 0a 20 20 69 66 28 20 66 74 73 35 50 6f  f);.  if( fts5Po
77a0: 72 74 65 72 53 74 65 70 31 42 28 61 42 75 66 2c  rterStep1B(aBuf,
77b0: 20 26 6e 42 75 66 29 20 29 7b 0a 20 20 20 20 69   &nBuf) ){.    i
77c0: 66 28 20 66 74 73 35 50 6f 72 74 65 72 53 74 65  f( fts5PorterSte
77d0: 70 31 42 32 28 61 42 75 66 2c 20 26 6e 42 75 66  p1B2(aBuf, &nBuf
77e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
77f0: 61 72 20 63 20 3d 20 61 42 75 66 5b 6e 42 75 66  ar c = aBuf[nBuf
7800: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66  -1];.      if( f
7810: 74 73 35 50 6f 72 74 65 72 49 73 56 6f 77 65 6c  ts5PorterIsVowel
7820: 28 63 2c 20 30 29 3d 3d 30 20 0a 20 20 20 20 20  (c, 0)==0 .     
7830: 20 20 26 26 20 63 21 3d 27 6c 27 20 26 26 20 63    && c!='l' && c
7840: 21 3d 27 73 27 20 26 26 20 63 21 3d 27 7a 27 20  !='s' && c!='z' 
7850: 26 26 20 63 3d 3d 61 42 75 66 5b 6e 42 75 66 2d  && c==aBuf[nBuf-
7860: 32 5d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  2] .      ){.   
7870: 20 20 20 20 20 6e 42 75 66 2d 2d 3b 0a 20 20 20       nBuf--;.   
7880: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 74 73     }else if( fts
7890: 35 50 6f 72 74 65 72 5f 4d 45 71 31 28 61 42 75  5Porter_MEq1(aBu
78a0: 66 2c 20 6e 42 75 66 29 20 26 26 20 66 74 73 35  f, nBuf) && fts5
78b0: 50 6f 72 74 65 72 5f 4f 73 74 61 72 28 61 42 75  Porter_Ostar(aBu
78c0: 66 2c 20 6e 42 75 66 29 20 29 7b 0a 20 20 20 20  f, nBuf) ){.    
78d0: 20 20 20 20 61 42 75 66 5b 6e 42 75 66 2b 2b 5d      aBuf[nBuf++]
78e0: 20 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 7d 0a   = 'e';.      }.
78f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7900: 53 74 65 70 20 31 43 2e 20 2a 2f 0a 20 20 69 66  Step 1C. */.  if
7910: 28 20 61 42 75 66 5b 6e 42 75 66 2d 31 5d 3d 3d  ( aBuf[nBuf-1]==
7920: 27 79 27 20 26 26 20 66 74 73 35 50 6f 72 74 65  'y' && fts5Porte
7930: 72 5f 56 6f 77 65 6c 28 61 42 75 66 2c 20 6e 42  r_Vowel(aBuf, nB
7940: 75 66 2d 31 29 20 29 7b 0a 20 20 20 20 61 42 75  uf-1) ){.    aBu
7950: 66 5b 6e 42 75 66 2d 31 5d 20 3d 20 27 69 27 3b  f[nBuf-1] = 'i';
7960: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 73  .  }..  /* Steps
7970: 20 32 20 74 68 72 6f 75 67 68 20 34 2e 20 2a 2f   2 through 4. */
7980: 0a 20 20 66 74 73 35 50 6f 72 74 65 72 53 74 65  .  fts5PorterSte
7990: 70 32 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3b  p2(aBuf, &nBuf);
79a0: 0a 20 20 66 74 73 35 50 6f 72 74 65 72 53 74 65  .  fts5PorterSte
79b0: 70 33 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3b  p3(aBuf, &nBuf);
79c0: 0a 20 20 66 74 73 35 50 6f 72 74 65 72 53 74 65  .  fts5PorterSte
79d0: 70 34 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3b  p4(aBuf, &nBuf);
79e0: 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 61 2e 20  ..  /* Step 5a. 
79f0: 2a 2f 0a 20 20 69 66 28 20 6e 42 75 66 3e 30 20  */.  if( nBuf>0 
7a00: 26 26 20 61 42 75 66 5b 6e 42 75 66 2d 31 5d 3d  && aBuf[nBuf-1]=
7a10: 3d 27 65 27 20 29 7b 0a 20 20 20 20 69 66 28 20  ='e' ){.    if( 
7a20: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28  fts5Porter_MGt1(
7a30: 61 42 75 66 2c 20 6e 42 75 66 2d 31 29 20 0a 20  aBuf, nBuf-1) . 
7a40: 20 20 20 20 7c 7c 20 28 66 74 73 35 50 6f 72 74      || (fts5Port
7a50: 65 72 5f 4d 45 71 31 28 61 42 75 66 2c 20 6e 42  er_MEq1(aBuf, nB
7a60: 75 66 2d 31 29 20 26 26 20 21 66 74 73 35 50 6f  uf-1) && !fts5Po
7a70: 72 74 65 72 5f 4f 73 74 61 72 28 61 42 75 66 2c  rter_Ostar(aBuf,
7a80: 20 6e 42 75 66 2d 31 29 29 0a 20 20 20 20 29 7b   nBuf-1)).    ){
7a90: 0a 20 20 20 20 20 20 6e 42 75 66 2d 2d 3b 0a 20  .      nBuf--;. 
7aa0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
7ab0: 74 65 70 20 35 62 2e 20 2a 2f 0a 20 20 69 66 28  tep 5b. */.  if(
7ac0: 20 6e 42 75 66 3e 31 20 26 26 20 61 42 75 66 5b   nBuf>1 && aBuf[
7ad0: 6e 42 75 66 2d 31 5d 3d 3d 27 6c 27 20 0a 20 20  nBuf-1]=='l' .  
7ae0: 20 26 26 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d   && aBuf[nBuf-2]
7af0: 3d 3d 27 6c 27 20 26 26 20 66 74 73 35 50 6f 72  =='l' && fts5Por
7b00: 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e  ter_MGt1(aBuf, n
7b10: 42 75 66 2d 31 29 20 0a 20 20 29 7b 0a 20 20 20  Buf-1) .  ){.   
7b20: 20 6e 42 75 66 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nBuf--;.  }..  
7b30: 72 65 74 75 72 6e 20 70 2d 3e 78 54 6f 6b 65 6e  return p->xToken
7b40: 28 70 2d 3e 70 43 74 78 2c 20 61 42 75 66 2c 20  (p->pCtx, aBuf, 
7b50: 6e 42 75 66 2c 20 69 53 74 61 72 74 2c 20 69 45  nBuf, iStart, iE
7b60: 6e 64 29 3b 0a 0a 20 70 61 73 73 5f 74 68 72 6f  nd);.. pass_thro
7b70: 75 67 68 3a 0a 20 20 72 65 74 75 72 6e 20 70 2d  ugh:.  return p-
7b80: 3e 78 54 6f 6b 65 6e 28 70 2d 3e 70 43 74 78 2c  >xToken(p->pCtx,
7b90: 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c   pToken, nToken,
7ba0: 20 69 53 74 61 72 74 2c 20 69 45 6e 64 29 3b 0a   iStart, iEnd);.
7bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 6b 65 6e 69 7a  }../*.** Tokeniz
7bc0: 65 20 75 73 69 6e 67 20 74 68 65 20 70 6f 72 74  e using the port
7bd0: 65 72 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f  er tokenizer..*/
7be0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7bf0: 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 28 0a  PorterTokenize(.
7c00: 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20    Fts5Tokenizer 
7c10: 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c 0a 20 20 76  *pTokenizer,.  v
7c20: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 63 6f 6e  oid *pCtx,.  con
7c30: 73 74 20 63 68 61 72 20 2a 70 54 65 78 74 2c 20  st char *pText, 
7c40: 69 6e 74 20 6e 54 65 78 74 2c 0a 20 20 69 6e 74  int nText,.  int
7c50: 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a   (*xToken)(void*
7c60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
7c70: 6e 74 20 6e 54 6f 6b 65 6e 2c 20 69 6e 74 20 69  nt nToken, int i
7c80: 53 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29  Start, int iEnd)
7c90: 0a 29 7b 0a 20 20 50 6f 72 74 65 72 54 6f 6b 65  .){.  PorterToke
7ca0: 6e 69 7a 65 72 20 2a 70 20 3d 20 28 50 6f 72 74  nizer *p = (Port
7cb0: 65 72 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 54 6f  erTokenizer*)pTo
7cc0: 6b 65 6e 69 7a 65 72 3b 0a 20 20 50 6f 72 74 65  kenizer;.  Porte
7cd0: 72 43 6f 6e 74 65 78 74 20 73 43 74 78 3b 0a 20  rContext sCtx;. 
7ce0: 20 73 43 74 78 2e 78 54 6f 6b 65 6e 20 3d 20 78   sCtx.xToken = x
7cf0: 54 6f 6b 65 6e 3b 0a 20 20 73 43 74 78 2e 70 43  Token;.  sCtx.pC
7d00: 74 78 20 3d 20 70 43 74 78 3b 0a 20 20 73 43 74  tx = pCtx;.  sCt
7d10: 78 2e 61 42 75 66 20 3d 20 70 2d 3e 61 42 75 66  x.aBuf = p->aBuf
7d20: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 6f  ;.  return p->to
7d30: 6b 65 6e 69 7a 65 72 2e 78 54 6f 6b 65 6e 69 7a  kenizer.xTokeniz
7d40: 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 54 6f 6b  e(.      p->pTok
7d50: 65 6e 69 7a 65 72 2c 20 28 76 6f 69 64 2a 29 26  enizer, (void*)&
7d60: 73 43 74 78 2c 20 70 54 65 78 74 2c 20 6e 54 65  sCtx, pText, nTe
7d70: 78 74 2c 20 66 74 73 35 50 6f 72 74 65 72 43 62  xt, fts5PorterCb
7d80: 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  .  );.}../*.** R
7d90: 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c  egister all buil
7da0: 74 2d 69 6e 20 74 6f 6b 65 6e 69 7a 65 72 73 20  t-in tokenizers 
7db0: 77 69 74 68 20 46 54 53 35 2e 0a 2a 2f 0a 69 6e  with FTS5..*/.in
7dc0: 74 20 73 71 6c 69 74 65 33 46 74 73 35 54 6f 6b  t sqlite3Fts5Tok
7dd0: 65 6e 69 7a 65 72 49 6e 69 74 28 66 74 73 35 5f  enizerInit(fts5_
7de0: 61 70 69 20 2a 70 41 70 69 29 7b 0a 20 20 73 74  api *pApi){.  st
7df0: 72 75 63 74 20 42 75 69 6c 74 69 6e 54 6f 6b 65  ruct BuiltinToke
7e00: 6e 69 7a 65 72 20 7b 0a 20 20 20 20 63 6f 6e 73  nizer {.    cons
7e10: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
7e20: 20 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65     fts5_tokenize
7e30: 72 20 78 3b 0a 20 20 7d 20 61 42 75 69 6c 74 69  r x;.  } aBuilti
7e40: 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 75  n[] = {.    { "u
7e50: 6e 69 63 6f 64 65 36 31 22 2c 20 7b 66 74 73 35  nicode61", {fts5
7e60: 55 6e 69 63 6f 64 65 43 72 65 61 74 65 2c 20 66  UnicodeCreate, f
7e70: 74 73 35 55 6e 69 63 6f 64 65 44 65 6c 65 74 65  ts5UnicodeDelete
7e80: 2c 20 66 74 73 35 55 6e 69 63 6f 64 65 54 6f 6b  , fts5UnicodeTok
7e90: 65 6e 69 7a 65 7d 7d 2c 0a 20 20 20 20 7b 20 22  enize}},.    { "
7ea0: 61 73 63 69 69 22 2c 20 20 20 20 20 7b 66 74 73  ascii",     {fts
7eb0: 35 41 73 63 69 69 43 72 65 61 74 65 2c 20 66 74  5AsciiCreate, ft
7ec0: 73 35 41 73 63 69 69 44 65 6c 65 74 65 2c 20 66  s5AsciiDelete, f
7ed0: 74 73 35 41 73 63 69 69 54 6f 6b 65 6e 69 7a 65  ts5AsciiTokenize
7ee0: 20 7d 7d 2c 0a 20 20 20 20 7b 20 22 70 6f 72 74   }},.    { "port
7ef0: 65 72 22 2c 20 20 20 20 7b 66 74 73 35 50 6f 72  er",    {fts5Por
7f00: 74 65 72 43 72 65 61 74 65 2c 20 66 74 73 35 50  terCreate, fts5P
7f10: 6f 72 74 65 72 44 65 6c 65 74 65 2c 20 66 74 73  orterDelete, fts
7f20: 35 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 20  5PorterTokenize 
7f30: 7d 7d 2c 0a 20 20 7d 3b 0a 20 20 0a 20 20 69 6e  }},.  };.  .  in
7f40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7f50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7f60: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7f70: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20    /* To iterate 
7fa0: 74 68 72 6f 75 67 68 20 62 75 69 6c 74 69 6e 20  through builtin 
7fb0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
7fc0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
7fd0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 69 7a 65  ITE_OK && i<size
7fe0: 6f 66 28 61 42 75 69 6c 74 69 6e 29 2f 73 69 7a  of(aBuiltin)/siz
7ff0: 65 6f 66 28 61 42 75 69 6c 74 69 6e 5b 30 5d 29  eof(aBuiltin[0])
8000: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
8010: 20 70 41 70 69 2d 3e 78 43 72 65 61 74 65 54 6f   pApi->xCreateTo
8020: 6b 65 6e 69 7a 65 72 28 70 41 70 69 2c 0a 20 20  kenizer(pApi,.  
8030: 20 20 20 20 20 20 61 42 75 69 6c 74 69 6e 5b 69        aBuiltin[i
8040: 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ].zName,.       
8050: 20 28 76 6f 69 64 2a 29 70 41 70 69 2c 0a 20 20   (void*)pApi,.  
8060: 20 20 20 20 20 20 26 61 42 75 69 6c 74 69 6e 5b        &aBuiltin[
8070: 69 5d 2e 78 2c 0a 20 20 20 20 20 20 20 20 30 0a  i].x,.        0.
8080: 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65      );.  }..  re
8090: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
80a0: 7d 0a 0a 0a                                      }...