/ Hex Artifact Content
Login

Artifact f380f46f341af9c9a9908e1aade685ba1eaa157a:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2f 0a 0a 0a 23 69 6e 63 6c  *****.*/...#incl
0180: 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68 22 0a  ude "fts5Int.h".
0190: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
01a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
01e0: 53 74 61 72 74 20 6f 66 20 61 73 63 69 69 20 74  Start of ascii t
01f0: 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
0200: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ntation..*/../*.
0210: 2a 2a 20 46 6f 72 20 74 6f 6b 65 6e 69 7a 65 72  ** For tokenizer
0220: 73 20 77 69 74 68 20 6e 6f 20 22 75 6e 69 63 6f  s with no "unico
0230: 64 65 22 20 6d 6f 64 69 66 69 65 72 2c 20 74 68  de" modifier, th
0240: 65 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 63  e set of token c
0250: 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 73 20  haracters.** is 
0260: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
0270: 73 65 74 20 6f 66 20 41 53 43 49 49 20 72 61 6e  set of ASCII ran
0280: 67 65 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20  ge alphanumeric 
0290: 63 68 61 72 61 63 74 65 72 73 2e 20 0a 2a 2f 0a  characters. .*/.
02a0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
02b0: 63 68 61 72 20 61 41 73 63 69 69 54 6f 6b 65 6e  char aAsciiToken
02c0: 43 68 61 72 5b 31 32 38 5d 20 3d 20 7b 0a 20 20  Char[128] = {.  
02d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
02e0: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
02f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0300: 2c 20 20 20 2f 2a 20 30 78 30 30 2e 2e 30 78 30  ,   /* 0x00..0x0
0310: 46 20 2a 2f 0a 20 20 30 2c 20 30 2c 20 30 2c 20  F */.  0, 0, 0, 
0320: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0330: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0340: 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78  0, 0, 0,   /* 0x
0350: 31 30 2e 2e 30 78 31 46 20 2a 2f 0a 20 20 30 2c  10..0x1F */.  0,
0360: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0370: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
0380: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0390: 20 20 2f 2a 20 30 78 32 30 2e 2e 30 78 32 46 20    /* 0x20..0x2F 
03a0: 2a 2f 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  */.  1, 1, 1, 1,
03b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
03c0: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 0, 0, 0, 0,
03d0: 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78 33 30   0, 0,   /* 0x30
03e0: 2e 2e 30 78 33 46 20 2a 2f 0a 20 20 30 2c 20 31  ..0x3F */.  0, 1
03f0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
0400: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
0410: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
0420: 2f 2a 20 30 78 34 30 2e 2e 30 78 34 46 20 2a 2f  /* 0x40..0x4F */
0430: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
0440: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
0450: 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  1, 1, 0, 0, 0, 0
0460: 2c 20 30 2c 20 20 20 2f 2a 20 30 78 35 30 2e 2e  , 0,   /* 0x50..
0470: 30 78 35 46 20 2a 2f 0a 20 20 30 2c 20 31 2c 20  0x5F */.  0, 1, 
0480: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
0490: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
04a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 2f 2a  1, 1, 1, 1,   /*
04b0: 20 30 78 36 30 2e 2e 30 78 36 46 20 2a 2f 0a 20   0x60..0x6F */. 
04c0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
04d0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
04e0: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   1, 0, 0, 0, 0, 
04f0: 30 2c 20 20 20 2f 2a 20 30 78 37 30 2e 2e 30 78  0,   /* 0x70..0x
0500: 37 46 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  7F */.};..typede
0510: 66 20 73 74 72 75 63 74 20 41 73 63 69 69 54 6f  f struct AsciiTo
0520: 6b 65 6e 69 7a 65 72 20 41 73 63 69 69 54 6f 6b  kenizer AsciiTok
0530: 65 6e 69 7a 65 72 3b 0a 73 74 72 75 63 74 20 41  enizer;.struct A
0540: 73 63 69 69 54 6f 6b 65 6e 69 7a 65 72 20 7b 0a  sciiTokenizer {.
0550: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0560: 61 54 6f 6b 65 6e 43 68 61 72 5b 31 32 38 5d 3b  aTokenChar[128];
0570: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .};..static void
0580: 20 66 74 73 35 41 73 63 69 69 41 64 64 45 78 63   fts5AsciiAddExc
0590: 65 70 74 69 6f 6e 73 28 0a 20 20 41 73 63 69 69  eptions(.  Ascii
05a0: 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 2c 20 0a 20  Tokenizer *p, . 
05b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
05c0: 67 2c 20 0a 20 20 69 6e 74 20 62 54 6f 6b 65 6e  g, .  int bToken
05d0: 43 68 61 72 73 0a 29 7b 0a 20 20 69 6e 74 20 69  Chars.){.  int i
05e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72  ;.  for(i=0; zAr
05f0: 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  g[i]; i++){.    
0600: 69 66 28 20 28 7a 41 72 67 5b 69 5d 20 26 20 30  if( (zArg[i] & 0
0610: 78 38 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x80)==0 ){.     
0620: 20 70 2d 3e 61 54 6f 6b 65 6e 43 68 61 72 5b 28   p->aTokenChar[(
0630: 69 6e 74 29 7a 41 72 67 5b 69 5d 5d 20 3d 20 28  int)zArg[i]] = (
0640: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 62 54  unsigned char)bT
0650: 6f 6b 65 6e 43 68 61 72 73 3b 0a 20 20 20 20 7d  okenChars;.    }
0660: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
0670: 6c 65 74 65 20 61 20 22 61 73 63 69 69 22 20 74  lete a "ascii" t
0680: 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61  okenizer..*/.sta
0690: 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 63  tic void fts5Asc
06a0: 69 69 44 65 6c 65 74 65 28 46 74 73 35 54 6f 6b  iiDelete(Fts5Tok
06b0: 65 6e 69 7a 65 72 20 2a 70 29 7b 0a 20 20 73 71  enizer *p){.  sq
06c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d  lite3_free(p);.}
06d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
06e0: 6e 20 22 61 73 63 69 69 22 20 74 6f 6b 65 6e 69  n "ascii" tokeni
06f0: 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  zer..*/.static i
0700: 6e 74 20 66 74 73 35 41 73 63 69 69 43 72 65 61  nt fts5AsciiCrea
0710: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  te(.  void *pCtx
0720: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
0730: 2a 2a 61 7a 41 72 67 2c 20 69 6e 74 20 6e 41 72  **azArg, int nAr
0740: 67 2c 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  g,.  Fts5Tokeniz
0750: 65 72 20 2a 2a 70 70 4f 75 74 0a 29 7b 0a 20 20  er **ppOut.){.  
0760: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0770: 4f 4b 3b 0a 20 20 41 73 63 69 69 54 6f 6b 65 6e  OK;.  AsciiToken
0780: 69 7a 65 72 20 2a 70 20 3d 20 30 3b 0a 20 20 69  izer *p = 0;.  i
0790: 66 28 20 6e 41 72 67 25 32 20 29 7b 0a 20 20 20  f( nArg%2 ){.   
07a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
07b0: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
07c0: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
07d0: 6c 6f 63 28 73 69 7a 65 6f 66 28 41 73 63 69 69  loc(sizeof(Ascii
07e0: 54 6f 6b 65 6e 69 7a 65 72 29 29 3b 0a 20 20 20  Tokenizer));.   
07f0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
0800: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
0810: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
0820: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
0830: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
0840: 20 73 69 7a 65 6f 66 28 41 73 63 69 69 54 6f 6b   sizeof(AsciiTok
0850: 65 6e 69 7a 65 72 29 29 3b 0a 20 20 20 20 20 20  enizer));.      
0860: 6d 65 6d 63 70 79 28 70 2d 3e 61 54 6f 6b 65 6e  memcpy(p->aToken
0870: 43 68 61 72 2c 20 61 41 73 63 69 69 54 6f 6b 65  Char, aAsciiToke
0880: 6e 43 68 61 72 2c 20 73 69 7a 65 6f 66 28 61 41  nChar, sizeof(aA
0890: 73 63 69 69 54 6f 6b 65 6e 43 68 61 72 29 29 3b  sciiTokenChar));
08a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
08b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
08c0: 20 69 3c 6e 41 72 67 3b 20 69 2b 3d 32 29 7b 0a   i<nArg; i+=2){.
08d0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
08e0: 61 72 20 2a 7a 41 72 67 20 3d 20 61 7a 41 72 67  ar *zArg = azArg
08f0: 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  [i+1];.        i
0900: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
0910: 72 69 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20  ricmp(azArg[i], 
0920: 22 74 6f 6b 65 6e 63 68 61 72 73 22 29 20 29 7b  "tokenchars") ){
0930: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 41  .          fts5A
0940: 73 63 69 69 41 64 64 45 78 63 65 70 74 69 6f 6e  sciiAddException
0950: 73 28 70 2c 20 7a 41 72 67 2c 20 31 29 3b 0a 20  s(p, zArg, 1);. 
0960: 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
0970: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
0980: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 41 72  te3_stricmp(azAr
0990: 67 5b 69 5d 2c 20 22 73 65 70 61 72 61 74 6f 72  g[i], "separator
09a0: 73 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  s") ){.         
09b0: 20 66 74 73 35 41 73 63 69 69 41 64 64 45 78 63   fts5AsciiAddExc
09c0: 65 70 74 69 6f 6e 73 28 70 2c 20 7a 41 72 67 2c  eptions(p, zArg,
09d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   0);.        }el
09e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
09f0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0a00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0a10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
0a20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0a30: 20 20 20 20 20 20 66 74 73 35 41 73 63 69 69 44        fts5AsciiD
0a40: 65 6c 65 74 65 28 28 46 74 73 35 54 6f 6b 65 6e  elete((Fts5Token
0a50: 69 7a 65 72 2a 29 70 29 3b 0a 20 20 20 20 20 20  izer*)p);.      
0a60: 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    p = 0;.      }
0a70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
0a80: 70 4f 75 74 20 3d 20 28 46 74 73 35 54 6f 6b 65  pOut = (Fts5Toke
0a90: 6e 69 7a 65 72 2a 29 70 3b 0a 20 20 72 65 74 75  nizer*)p;.  retu
0aa0: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69  rn rc;.}...stati
0ab0: 63 20 76 6f 69 64 20 61 73 63 69 69 46 6f 6c 64  c void asciiFold
0ac0: 28 63 68 61 72 20 2a 61 4f 75 74 2c 20 63 6f 6e  (char *aOut, con
0ad0: 73 74 20 63 68 61 72 20 2a 61 49 6e 2c 20 69 6e  st char *aIn, in
0ae0: 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  t nByte){.  int 
0af0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0b00: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
0b10: 20 63 68 61 72 20 63 20 3d 20 61 49 6e 5b 69 5d   char c = aIn[i]
0b20: 3b 0a 20 20 20 20 69 66 28 20 63 3e 3d 27 41 27  ;.    if( c>='A'
0b30: 20 26 26 20 63 3c 3d 27 5a 27 20 29 20 63 20 2b   && c<='Z' ) c +
0b40: 3d 20 33 32 3b 0a 20 20 20 20 61 4f 75 74 5b 69  = 32;.    aOut[i
0b50: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ] = c;.  }.}../*
0b60: 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 65 20 73 6f 6d  .** Tokenize som
0b70: 65 20 74 65 78 74 20 75 73 69 6e 67 20 74 68 65  e text using the
0b80: 20 61 73 63 69 69 20 74 6f 6b 65 6e 69 7a 65 72   ascii tokenizer
0b90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0ba0: 66 74 73 35 41 73 63 69 69 54 6f 6b 65 6e 69 7a  fts5AsciiTokeniz
0bb0: 65 28 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  e(.  Fts5Tokeniz
0bc0: 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c 0a  er *pTokenizer,.
0bd0: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20    void *pCtx,.  
0be0: 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 63 6f 6e  int flags,.  con
0bf0: 73 74 20 63 68 61 72 20 2a 70 54 65 78 74 2c 20  st char *pText, 
0c00: 69 6e 74 20 6e 54 65 78 74 2c 0a 20 20 69 6e 74  int nText,.  int
0c10: 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a   (*xToken)(void*
0c20: 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61  , int, const cha
0c30: 72 2a 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  r*, int nToken, 
0c40: 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
0c50: 69 45 6e 64 29 0a 29 7b 0a 20 20 41 73 63 69 69  iEnd).){.  Ascii
0c60: 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20 28  Tokenizer *p = (
0c70: 41 73 63 69 69 54 6f 6b 65 6e 69 7a 65 72 2a 29  AsciiTokenizer*)
0c80: 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 69 6e  pTokenizer;.  in
0c90: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
0ca0: 3b 0a 20 20 69 6e 74 20 69 65 3b 0a 20 20 69 6e  ;.  int ie;.  in
0cb0: 74 20 69 73 20 3d 20 30 3b 0a 0a 20 20 63 68 61  t is = 0;..  cha
0cc0: 72 20 61 46 6f 6c 64 5b 36 34 5d 3b 0a 20 20 69  r aFold[64];.  i
0cd0: 6e 74 20 6e 46 6f 6c 64 20 3d 20 73 69 7a 65 6f  nt nFold = sizeo
0ce0: 66 28 61 46 6f 6c 64 29 3b 0a 20 20 63 68 61 72  f(aFold);.  char
0cf0: 20 2a 70 46 6f 6c 64 20 3d 20 61 46 6f 6c 64 3b   *pFold = aFold;
0d00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
0d10: 20 2a 61 20 3d 20 70 2d 3e 61 54 6f 6b 65 6e 43   *a = p->aTokenC
0d20: 68 61 72 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69  har;..  while( i
0d30: 73 3c 6e 54 65 78 74 20 26 26 20 72 63 3d 3d 53  s<nText && rc==S
0d40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
0d50: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
0d60: 2f 2a 20 53 6b 69 70 20 61 6e 79 20 6c 65 61 64  /* Skip any lead
0d70: 69 6e 67 20 64 69 76 69 64 65 72 20 63 68 61 72  ing divider char
0d80: 61 63 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 77  acters. */.    w
0d90: 68 69 6c 65 28 20 69 73 3c 6e 54 65 78 74 20 26  hile( is<nText &
0da0: 26 20 28 28 70 54 65 78 74 5b 69 73 5d 26 30 78  & ((pText[is]&0x
0db0: 38 30 29 3d 3d 30 20 26 26 20 61 5b 28 69 6e 74  80)==0 && a[(int
0dc0: 29 70 54 65 78 74 5b 69 73 5d 5d 3d 3d 30 29 20  )pText[is]]==0) 
0dd0: 29 7b 0a 20 20 20 20 20 20 69 73 2b 2b 3b 0a 20  ){.      is++;. 
0de0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 3d     }.    if( is=
0df0: 3d 6e 54 65 78 74 20 29 20 62 72 65 61 6b 3b 0a  =nText ) break;.
0e00: 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  .    /* Count th
0e10: 65 20 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65  e token characte
0e20: 72 73 20 2a 2f 0a 20 20 20 20 69 65 20 3d 20 69  rs */.    ie = i
0e30: 73 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s+1;.    while( 
0e40: 69 65 3c 6e 54 65 78 74 20 26 26 20 28 28 70 54  ie<nText && ((pT
0e50: 65 78 74 5b 69 65 5d 26 30 78 38 30 29 20 7c 7c  ext[ie]&0x80) ||
0e60: 20 61 5b 28 69 6e 74 29 70 54 65 78 74 5b 69 65   a[(int)pText[ie
0e70: 5d 5d 20 29 20 29 7b 0a 20 20 20 20 20 20 69 65  ]] ) ){.      ie
0e80: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ++;.    }..    /
0e90: 2a 20 46 6f 6c 64 20 74 6f 20 6c 6f 77 65 72 20  * Fold to lower 
0ea0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 6e 42 79 74  case */.    nByt
0eb0: 65 20 3d 20 69 65 2d 69 73 3b 0a 20 20 20 20 69  e = ie-is;.    i
0ec0: 66 28 20 6e 42 79 74 65 3e 6e 46 6f 6c 64 20 29  f( nByte>nFold )
0ed0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 6f 6c  {.      if( pFol
0ee0: 64 21 3d 61 46 6f 6c 64 20 29 20 73 71 6c 69 74  d!=aFold ) sqlit
0ef0: 65 33 5f 66 72 65 65 28 70 46 6f 6c 64 29 3b 0a  e3_free(pFold);.
0f00: 20 20 20 20 20 20 70 46 6f 6c 64 20 3d 20 73 71        pFold = sq
0f10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79  lite3_malloc(nBy
0f20: 74 65 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28  te*2);.      if(
0f30: 20 70 46 6f 6c 64 3d 3d 30 20 29 7b 0a 20 20 20   pFold==0 ){.   
0f40: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
0f50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
0f60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
0f70: 20 20 20 20 20 6e 46 6f 6c 64 20 3d 20 6e 42 79       nFold = nBy
0f80: 74 65 2a 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  te*2;.    }.    
0f90: 61 73 63 69 69 46 6f 6c 64 28 70 46 6f 6c 64 2c  asciiFold(pFold,
0fa0: 20 26 70 54 65 78 74 5b 69 73 5d 2c 20 6e 42 79   &pText[is], nBy
0fb0: 74 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 76  te);..    /* Inv
0fc0: 6f 6b 65 20 74 68 65 20 74 6f 6b 65 6e 20 63 61  oke the token ca
0fd0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 72 63  llback */.    rc
0fe0: 20 3d 20 78 54 6f 6b 65 6e 28 70 43 74 78 2c 20   = xToken(pCtx, 
0ff0: 30 2c 20 70 46 6f 6c 64 2c 20 6e 42 79 74 65 2c  0, pFold, nByte,
1000: 20 69 73 2c 20 69 65 29 3b 0a 20 20 20 20 69 73   is, ie);.    is
1010: 20 3d 20 69 65 2b 31 3b 0a 20 20 7d 0a 20 20 0a   = ie+1;.  }.  .
1020: 20 20 69 66 28 20 70 46 6f 6c 64 21 3d 61 46 6f    if( pFold!=aFo
1030: 6c 64 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  ld ) sqlite3_fre
1040: 65 28 70 46 6f 6c 64 29 3b 0a 20 20 69 66 28 20  e(pFold);.  if( 
1050: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1060: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
1070: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1080: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10d0: 20 53 74 61 72 74 20 6f 66 20 75 6e 69 63 6f 64   Start of unicod
10e0: 65 36 31 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6d  e61 tokenizer im
10f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
1100: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
1110: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1120: 73 20 2d 20 52 45 41 44 5f 55 54 46 38 20 61 6e  s - READ_UTF8 an
1130: 64 20 57 52 49 54 45 5f 55 54 46 38 20 2d 20 68  d WRITE_UTF8 - h
1140: 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65 64 0a  ave been copied.
1150: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ** from the sqli
1160: 74 65 33 20 73 6f 75 72 63 65 20 66 69 6c 65 20  te3 source file 
1170: 75 74 66 2e 63 2e 20 49 66 20 74 68 69 73 20 66  utf.c. If this f
1180: 69 6c 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ile is compiled 
1190: 61 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  as part.** of th
11a0: 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2c 20  e amalgamation, 
11b0: 74 68 65 79 20 61 72 65 20 6e 6f 74 20 72 65 71  they are not req
11c0: 75 69 72 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  uired..*/.#ifnde
11d0: 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d  f SQLITE_AMALGAM
11e0: 41 54 49 4f 4e 0a 0a 73 74 61 74 69 63 20 63 6f  ATION..static co
11f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1200: 72 20 73 71 6c 69 74 65 33 55 74 66 38 54 72 61  r sqlite3Utf8Tra
1210: 6e 73 31 5b 5d 20 3d 20 7b 0a 20 20 30 78 30 30  ns1[] = {.  0x00
1220: 2c 20 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78  , 0x01, 0x02, 0x
1230: 30 33 2c 20 30 78 30 34 2c 20 30 78 30 35 2c 20  03, 0x04, 0x05, 
1240: 30 78 30 36 2c 20 30 78 30 37 2c 0a 20 20 30 78  0x06, 0x07,.  0x
1250: 30 38 2c 20 30 78 30 39 2c 20 30 78 30 61 2c 20  08, 0x09, 0x0a, 
1260: 30 78 30 62 2c 20 30 78 30 63 2c 20 30 78 30 64  0x0b, 0x0c, 0x0d
1270: 2c 20 30 78 30 65 2c 20 30 78 30 66 2c 0a 20 20  , 0x0e, 0x0f,.  
1280: 30 78 31 30 2c 20 30 78 31 31 2c 20 30 78 31 32  0x10, 0x11, 0x12
1290: 2c 20 30 78 31 33 2c 20 30 78 31 34 2c 20 30 78  , 0x13, 0x14, 0x
12a0: 31 35 2c 20 30 78 31 36 2c 20 30 78 31 37 2c 0a  15, 0x16, 0x17,.
12b0: 20 20 30 78 31 38 2c 20 30 78 31 39 2c 20 30 78    0x18, 0x19, 0x
12c0: 31 61 2c 20 30 78 31 62 2c 20 30 78 31 63 2c 20  1a, 0x1b, 0x1c, 
12d0: 30 78 31 64 2c 20 30 78 31 65 2c 20 30 78 31 66  0x1d, 0x1e, 0x1f
12e0: 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20  ,.  0x00, 0x01, 
12f0: 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34  0x02, 0x03, 0x04
1300: 2c 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78  , 0x05, 0x06, 0x
1310: 30 37 2c 0a 20 20 30 78 30 38 2c 20 30 78 30 39  07,.  0x08, 0x09
1320: 2c 20 30 78 30 61 2c 20 30 78 30 62 2c 20 30 78  , 0x0a, 0x0b, 0x
1330: 30 63 2c 20 30 78 30 64 2c 20 30 78 30 65 2c 20  0c, 0x0d, 0x0e, 
1340: 30 78 30 66 2c 0a 20 20 30 78 30 30 2c 20 30 78  0x0f,.  0x00, 0x
1350: 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20  01, 0x02, 0x03, 
1360: 30 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36  0x04, 0x05, 0x06
1370: 2c 20 30 78 30 37 2c 0a 20 20 30 78 30 30 2c 20  , 0x07,.  0x00, 
1380: 30 78 30 31 2c 20 30 78 30 32 2c 20 30 78 30 33  0x01, 0x02, 0x03
1390: 2c 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78  , 0x00, 0x01, 0x
13a0: 30 30 2c 20 30 78 30 30 2c 0a 7d 3b 0a 0a 23 64  00, 0x00,.};..#d
13b0: 65 66 69 6e 65 20 52 45 41 44 5f 55 54 46 38 28  efine READ_UTF8(
13c0: 7a 49 6e 2c 20 7a 54 65 72 6d 2c 20 63 29 20 20  zIn, zTerm, c)  
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 63 20 3d           \.  c =
13f0: 20 2a 28 7a 49 6e 2b 2b 29 3b 20 20 20 20 20 20   *(zIn++);      
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 63 3e        \.  if( c>
1430: 3d 30 78 63 30 20 29 7b 20 20 20 20 20 20 20 20  =0xc0 ){        
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 5c 0a 20 20 20 20 63 20 3d 20 73 71 6c     \.    c = sql
1470: 69 74 65 33 55 74 66 38 54 72 61 6e 73 31 5b 63  ite3Utf8Trans1[c
1480: 2d 30 78 63 30 5d 3b 20 20 20 20 20 20 20 20 20  -0xc0];         
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 5c 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 49 6e  \.    while( zIn
14b0: 21 3d 7a 54 65 72 6d 20 26 26 20 28 2a 7a 49 6e  !=zTerm && (*zIn
14c0: 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29   & 0xc0)==0x80 )
14d0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20  {            \. 
14e0: 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 36 29 20       c = (c<<6) 
14f0: 2b 20 28 30 78 33 66 20 26 20 2a 28 7a 49 6e 2b  + (0x3f & *(zIn+
1500: 2b 29 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  +));            
1510: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1520: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 66 28         \.    if(
1560: 20 63 3c 30 78 38 30 20 20 20 20 20 20 20 20 20   c<0x80         
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 5c 0a 20 20 20 20 20 20 20 20 7c 7c      \.        ||
15a0: 20 28 63 26 30 78 46 46 46 46 46 38 30 30 29 3d   (c&0xFFFFF800)=
15b0: 3d 30 78 44 38 30 30 20 20 20 20 20 20 20 20 20  =0xD800         
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 5c 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 63   \.        || (c
15e0: 26 30 78 46 46 46 46 46 46 46 45 29 3d 3d 30 78  &0xFFFFFFFE)==0x
15f0: 46 46 46 45 20 29 7b 20 20 63 20 3d 20 30 78 46  FFFE ){  c = 0xF
1600: 46 46 44 3b 20 7d 20 20 20 20 20 20 20 20 5c 0a  FFD; }        \.
1610: 20 20 7d 0a 0a 0a 23 64 65 66 69 6e 65 20 57 52    }...#define WR
1620: 49 54 45 5f 55 54 46 38 28 7a 4f 75 74 2c 20 63  ITE_UTF8(zOut, c
1630: 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) {             
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1650: 20 69 66 28 20 63 3c 30 78 30 30 30 38 30 20 29   if( c<0x00080 )
1660: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75        \.    *zOu
1690: 74 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  t++ = (unsigned 
16a0: 63 68 61 72 29 28 63 26 30 78 46 46 29 3b 20 20  char)(c&0xFF);  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
16c0: 0a 20 20 7d 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 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 5c 0a 20 20 65 6c 73 65          \.  else
1700: 20 69 66 28 20 63 3c 30 78 30 30 38 30 30 20 29   if( c<0x00800 )
1710: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
1740: 20 30 78 43 30 20 2b 20 28 75 6e 73 69 67 6e 65   0xC0 + (unsigne
1750: 64 20 63 68 61 72 29 28 28 63 3e 3e 36 29 26 30  d char)((c>>6)&0
1760: 78 31 46 29 3b 20 20 20 20 20 5c 0a 20 20 20 20  x1F);     \.    
1770: 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b  *zOut++ = 0x80 +
1780: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
1790: 28 63 20 26 20 30 78 33 46 29 3b 20 20 20 20 20  (c & 0x3F);     
17a0: 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20     \.  }        
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
17e0: 65 6c 73 65 20 69 66 28 20 63 3c 30 78 31 30 30  else if( c<0x100
17f0: 30 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  00 ){           
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74       \.    *zOut
1820: 2b 2b 20 3d 20 30 78 45 30 20 2b 20 28 75 6e 73  ++ = 0xE0 + (uns
1830: 69 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e  igned char)((c>>
1840: 31 32 29 26 30 78 30 46 29 3b 20 20 20 20 5c 0a  12)&0x0F);    \.
1850: 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78      *zOut++ = 0x
1860: 38 30 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 63  80 + (unsigned c
1870: 68 61 72 29 28 28 63 3e 3e 36 29 20 26 20 30 78  har)((c>>6) & 0x
1880: 33 46 29 3b 20 20 20 5c 0a 20 20 20 20 2a 7a 4f  3F);   \.    *zO
1890: 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75  ut++ = 0x80 + (u
18a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 63 20  nsigned char)(c 
18b0: 26 20 30 78 33 46 29 3b 20 20 20 20 20 20 20 20  & 0x3F);        
18c0: 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 2a           \.    *
1900: 7a 4f 75 74 2b 2b 20 3d 20 30 78 46 30 20 2b 20  zOut++ = 0xF0 + 
1910: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28  (unsigned char)(
1920: 28 63 3e 3e 31 38 29 20 26 20 30 78 30 37 29 3b  (c>>18) & 0x07);
1930: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
1940: 3d 20 30 78 38 30 20 2b 20 28 75 6e 73 69 67 6e  = 0x80 + (unsign
1950: 65 64 20 63 68 61 72 29 28 28 63 3e 3e 31 32 29  ed char)((c>>12)
1960: 20 26 20 30 78 33 46 29 3b 20 20 5c 0a 20 20 20   & 0x3F);  \.   
1970: 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20   *zOut++ = 0x80 
1980: 2b 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  + (unsigned char
1990: 29 28 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29  )((c>>6) & 0x3F)
19a0: 3b 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b  ;   \.    *zOut+
19b0: 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 6e 73 69  + = 0x80 + (unsi
19c0: 67 6e 65 64 20 63 68 61 72 29 28 63 20 26 20 30  gned char)(c & 0
19d0: 78 33 46 29 3b 20 20 20 20 20 20 20 20 5c 0a 20  x3F);        \. 
19e0: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 65 6e 64 69        \.}..#endi
1a20: 66 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  f /* ifndef SQLI
1a30: 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 20  TE_AMALGAMATION 
1a40: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  */..typedef stru
1a50: 63 74 20 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65  ct Unicode61Toke
1a60: 6e 69 7a 65 72 20 55 6e 69 63 6f 64 65 36 31 54  nizer Unicode61T
1a70: 6f 6b 65 6e 69 7a 65 72 3b 0a 73 74 72 75 63 74  okenizer;.struct
1a80: 20 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69   Unicode61Tokeni
1a90: 7a 65 72 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64  zer {.  unsigned
1aa0: 20 63 68 61 72 20 61 54 6f 6b 65 6e 43 68 61 72   char aTokenChar
1ab0: 5b 31 32 38 5d 3b 20 20 2f 2a 20 41 53 43 49 49  [128];  /* ASCII
1ac0: 20 72 61 6e 67 65 20 74 6f 6b 65 6e 20 63 68 61   range token cha
1ad0: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61  racters */.  cha
1ae0: 72 20 2a 61 46 6f 6c 64 3b 20 20 20 20 20 20 20  r *aFold;       
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b00: 42 75 66 66 65 72 20 74 6f 20 66 6f 6c 64 20 74  Buffer to fold t
1b10: 65 78 74 20 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e  ext into */.  in
1b20: 74 20 6e 46 6f 6c 64 3b 20 20 20 20 20 20 20 20  t nFold;        
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b40: 20 53 69 7a 65 20 6f 66 20 61 46 6f 6c 64 5b 5d   Size of aFold[]
1b50: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1b60: 6e 74 20 62 52 65 6d 6f 76 65 44 69 61 63 72 69  nt bRemoveDiacri
1b70: 74 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tic;           /
1b80: 2a 20 54 72 75 65 20 69 66 20 72 65 6d 6f 76 65  * True if remove
1b90: 5f 64 69 61 63 72 69 74 69 63 73 3d 31 20 69 73  _diacritics=1 is
1ba0: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45   set */.  int nE
1bb0: 78 63 65 70 74 69 6f 6e 3b 0a 20 20 69 6e 74 20  xception;.  int 
1bc0: 2a 61 69 45 78 63 65 70 74 69 6f 6e 3b 0a 7d 3b  *aiException;.};
1bd0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
1be0: 35 55 6e 69 63 6f 64 65 41 64 64 45 78 63 65 70  5UnicodeAddExcep
1bf0: 74 69 6f 6e 73 28 0a 20 20 55 6e 69 63 6f 64 65  tions(.  Unicode
1c00: 36 31 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 2c 20  61Tokenizer *p, 
1c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65           /* Toke
1c20: 6e 69 7a 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  nizer object */.
1c30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c    const char *z,
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72 73 20    /* Characters 
1c60: 74 6f 20 74 72 65 61 74 20 61 73 20 65 78 63 65  to treat as exce
1c70: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
1c80: 62 54 6f 6b 65 6e 43 68 61 72 73 20 20 20 20 20  bTokenChars     
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1ca0: 20 66 6f 72 20 27 74 6f 6b 65 6e 63 68 61 72 73   for 'tokenchars
1cb0: 27 2c 20 30 20 66 6f 72 20 27 73 65 70 61 72 61  ', 0 for 'separa
1cc0: 74 6f 72 73 27 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tors' */.){.  in
1cd0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ce0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c  ;.  int n = strl
1cf0: 65 6e 28 7a 29 3b 0a 20 20 69 6e 74 20 2a 61 4e  en(z);.  int *aN
1d00: 65 77 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29  ew;..  if( n>0 )
1d10: 7b 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 69 6e  {.    aNew = (in
1d20: 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  t*)sqlite3_reall
1d30: 6f 63 28 70 2d 3e 61 69 45 78 63 65 70 74 69 6f  oc(p->aiExceptio
1d40: 6e 2c 20 28 6e 2b 70 2d 3e 6e 45 78 63 65 70 74  n, (n+p->nExcept
1d50: 69 6f 6e 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29  ion)*sizeof(int)
1d60: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20  );.    if( aNew 
1d70: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
1d80: 77 20 3d 20 70 2d 3e 6e 45 78 63 65 70 74 69 6f  w = p->nExceptio
1d90: 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  n;.      const u
1da0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 43  nsigned char *zC
1db0: 73 72 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  sr = (const unsi
1dc0: 67 6e 65 64 20 63 68 61 72 2a 29 7a 3b 0a 20 20  gned char*)z;.  
1dd0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
1de0: 65 64 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  ed char *zTerm =
1df0: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1e00: 20 63 68 61 72 2a 29 26 7a 5b 6e 5d 3b 0a 20 20   char*)&z[n];.  
1e10: 20 20 20 20 77 68 69 6c 65 28 20 7a 43 73 72 3c      while( zCsr<
1e20: 7a 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  zTerm ){.       
1e30: 20 69 6e 74 20 69 43 6f 64 65 3b 0a 20 20 20 20   int iCode;.    
1e40: 20 20 20 20 69 6e 74 20 62 54 6f 6b 65 6e 3b 0a      int bToken;.
1e50: 20 20 20 20 20 20 20 20 52 45 41 44 5f 55 54 46          READ_UTF
1e60: 38 28 7a 43 73 72 2c 20 7a 54 65 72 6d 2c 20 69  8(zCsr, zTerm, i
1e70: 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Code);.        i
1e80: 66 28 20 69 43 6f 64 65 3c 31 32 38 20 29 7b 0a  f( iCode<128 ){.
1e90: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 54 6f            p->aTo
1ea0: 6b 65 6e 43 68 61 72 5b 69 43 6f 64 65 5d 20 3d  kenChar[iCode] =
1eb0: 20 62 54 6f 6b 65 6e 43 68 61 72 73 3b 0a 20 20   bTokenChars;.  
1ec0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ed0: 20 20 20 20 20 20 20 62 54 6f 6b 65 6e 20 3d 20         bToken = 
1ee0: 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f  sqlite3Fts5Unico
1ef0: 64 65 49 73 61 6c 6e 75 6d 28 69 43 6f 64 65 29  deIsalnum(iCode)
1f00: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1f10: 72 74 28 20 28 62 54 6f 6b 65 6e 3d 3d 30 20 7c  rt( (bToken==0 |
1f20: 7c 20 62 54 6f 6b 65 6e 3d 3d 31 29 20 29 3b 20  | bToken==1) ); 
1f30: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1f40: 74 28 20 28 62 54 6f 6b 65 6e 43 68 61 72 73 3d  t( (bTokenChars=
1f50: 3d 30 20 7c 7c 20 62 54 6f 6b 65 6e 43 68 61 72  =0 || bTokenChar
1f60: 73 3d 3d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  s==1) );.       
1f70: 20 20 20 69 66 28 20 62 54 6f 6b 65 6e 21 3d 62     if( bToken!=b
1f80: 54 6f 6b 65 6e 43 68 61 72 73 20 26 26 20 73 71  TokenChars && sq
1f90: 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f 64 65  lite3Fts5Unicode
1fa0: 49 73 64 69 61 63 72 69 74 69 63 28 69 43 6f 64  Isdiacritic(iCod
1fb0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
1fc0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1fd0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1fe0: 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2000: 20 61 4e 65 77 5b 69 5d 3e 69 43 6f 64 65 20 29   aNew[i]>iCode )
2010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2020: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2030: 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b    memmove(&aNew[
2040: 69 2b 31 5d 2c 20 26 61 4e 65 77 5b 69 5d 2c 20  i+1], &aNew[i], 
2050: 28 6e 4e 65 77 2d 69 29 2a 73 69 7a 65 6f 66 28  (nNew-i)*sizeof(
2060: 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  int));.         
2070: 20 20 20 61 4e 65 77 5b 69 5d 20 3d 20 69 43 6f     aNew[i] = iCo
2080: 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  de;.            
2090: 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nNew++;.        
20a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
20b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 61      }.      p->a
20c0: 69 45 78 63 65 70 74 69 6f 6e 20 3d 20 61 4e 65  iException = aNe
20d0: 77 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 45 78 63  w;.      p->nExc
20e0: 65 70 74 69 6f 6e 20 3d 20 6e 4e 65 77 3b 0a 20  eption = nNew;. 
20f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2100: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2110: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
2120: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2130: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2140: 69 66 20 74 68 65 20 70 2d 3e 61 69 45 78 63 65  if the p->aiExce
2150: 70 74 69 6f 6e 5b 5d 20 61 72 72 61 79 20 63 6f  ption[] array co
2160: 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  ntains the value
2170: 20 69 43 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69   iCode..*/.stati
2180: 63 20 69 6e 74 20 66 74 73 35 55 6e 69 63 6f 64  c int fts5Unicod
2190: 65 49 73 45 78 63 65 70 74 69 6f 6e 28 55 6e 69  eIsException(Uni
21a0: 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72 20  code61Tokenizer 
21b0: 2a 70 2c 20 69 6e 74 20 69 43 6f 64 65 29 7b 0a  *p, int iCode){.
21c0: 20 20 69 66 28 20 70 2d 3e 6e 45 78 63 65 70 74    if( p->nExcept
21d0: 69 6f 6e 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  ion>0 ){.    int
21e0: 20 2a 61 20 3d 20 70 2d 3e 61 69 45 78 63 65 70   *a = p->aiExcep
21f0: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4c  tion;.    int iL
2200: 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  o = 0;.    int i
2210: 48 69 20 3d 20 70 2d 3e 6e 45 78 63 65 70 74 69  Hi = p->nExcepti
2220: 6f 6e 2d 31 3b 0a 0a 20 20 20 20 77 68 69 6c 65  on-1;..    while
2230: 28 20 69 48 69 3e 3d 69 4c 6f 20 29 7b 0a 20 20  ( iHi>=iLo ){.  
2240: 20 20 20 20 69 6e 74 20 69 54 65 73 74 20 3d 20      int iTest = 
2250: 28 69 48 69 20 2b 20 69 4c 6f 29 20 2f 20 32 3b  (iHi + iLo) / 2;
2260: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 64 65  .      if( iCode
2270: 3d 3d 61 5b 69 54 65 73 74 5d 20 29 7b 0a 20 20  ==a[iTest] ){.  
2280: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2290: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22a0: 69 43 6f 64 65 3e 61 5b 69 54 65 73 74 5d 20 29  iCode>a[iTest] )
22b0: 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 20 3d 20  {.        iLo = 
22c0: 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 7d  iTest+1;.      }
22d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 48  else{.        iH
22e0: 69 20 3d 20 69 54 65 73 74 2d 31 3b 0a 20 20 20  i = iTest-1;.   
22f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2300: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2310: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 22 75  *.** Delete a "u
2320: 6e 69 63 6f 64 65 36 31 22 20 74 6f 6b 65 6e 69  nicode61" tokeni
2330: 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  zer..*/.static v
2340: 6f 69 64 20 66 74 73 35 55 6e 69 63 6f 64 65 44  oid fts5UnicodeD
2350: 65 6c 65 74 65 28 46 74 73 35 54 6f 6b 65 6e 69  elete(Fts5Tokeni
2360: 7a 65 72 20 2a 70 54 6f 6b 29 7b 0a 20 20 69 66  zer *pTok){.  if
2370: 28 20 70 54 6f 6b 20 29 7b 0a 20 20 20 20 55 6e  ( pTok ){.    Un
2380: 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72  icode61Tokenizer
2390: 20 2a 70 20 3d 20 28 55 6e 69 63 6f 64 65 36 31   *p = (Unicode61
23a0: 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 54 6f 6b 3b  Tokenizer*)pTok;
23b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
23c0: 65 28 70 2d 3e 61 69 45 78 63 65 70 74 69 6f 6e  e(p->aiException
23d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23e0: 72 65 65 28 70 2d 3e 61 46 6f 6c 64 29 3b 0a 20  ree(p->aFold);. 
23f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2400: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
2410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2420: 65 20 61 20 22 75 6e 69 63 6f 64 65 36 31 22 20  e a "unicode61" 
2430: 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f 0a 73 74  tokenizer..*/.st
2440: 61 74 69 63 20 69 6e 74 20 66 74 73 35 55 6e 69  atic int fts5Uni
2450: 63 6f 64 65 43 72 65 61 74 65 28 0a 20 20 76 6f  codeCreate(.  vo
2460: 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e  id *pCtx, .  con
2470: 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  st char **azArg,
2480: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74 73   int nArg,.  Fts
2490: 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 2a 70 70 4f  5Tokenizer **ppO
24a0: 75 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut.){.  int rc =
24b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
24c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24d0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 69 63  n code */.  Unic
24e0: 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72 20 2a  ode61Tokenizer *
24f0: 70 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  p = 0;      /* N
2500: 65 77 20 74 6f 6b 65 6e 69 7a 65 72 20 6f 62 6a  ew tokenizer obj
2510: 65 63 74 20 2a 2f 20 0a 0a 20 20 69 66 28 20 6e  ect */ ..  if( n
2520: 41 72 67 25 32 20 29 7b 0a 20 20 20 20 72 63 20  Arg%2 ){.    rc 
2530: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
2550: 20 28 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e   (Unicode61Token
2560: 69 7a 65 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61  izer*)sqlite3_ma
2570: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 55 6e 69 63  lloc(sizeof(Unic
2580: 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72 29 29  ode61Tokenizer))
2590: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
25a0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
25b0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
25c0: 69 7a 65 6f 66 28 55 6e 69 63 6f 64 65 36 31 54  izeof(Unicode61T
25d0: 6f 6b 65 6e 69 7a 65 72 29 29 3b 0a 20 20 20 20  okenizer));.    
25e0: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 54 6f 6b    memcpy(p->aTok
25f0: 65 6e 43 68 61 72 2c 20 61 41 73 63 69 69 54 6f  enChar, aAsciiTo
2600: 6b 65 6e 43 68 61 72 2c 20 73 69 7a 65 6f 66 28  kenChar, sizeof(
2610: 61 41 73 63 69 69 54 6f 6b 65 6e 43 68 61 72 29  aAsciiTokenChar)
2620: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 62 52 65 6d  );.      p->bRem
2630: 6f 76 65 44 69 61 63 72 69 74 69 63 20 3d 20 31  oveDiacritic = 1
2640: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 6f 6c 64  ;.      p->nFold
2650: 20 3d 20 36 34 3b 0a 20 20 20 20 20 20 70 2d 3e   = 64;.      p->
2660: 61 46 6f 6c 64 20 3d 20 73 71 6c 69 74 65 33 5f  aFold = sqlite3_
2670: 6d 61 6c 6c 6f 63 28 70 2d 3e 6e 46 6f 6c 64 20  malloc(p->nFold 
2680: 2a 20 73 69 7a 65 6f 66 28 63 68 61 72 29 29 3b  * sizeof(char));
2690: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 46  .      if( p->aF
26a0: 6f 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  old==0 ){.      
26b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
26c0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
26d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
26e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
26f0: 41 72 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  Arg; i+=2){.    
2700: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2710: 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69 2b 31  zArg = azArg[i+1
2720: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  ];.        if( 0
2730: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
2740: 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22 72 65 6d  p(azArg[i], "rem
2750: 6f 76 65 5f 64 69 61 63 72 69 74 69 63 73 22 29  ove_diacritics")
2760: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2770: 28 20 28 7a 41 72 67 5b 30 5d 21 3d 27 30 27 20  ( (zArg[0]!='0' 
2780: 26 26 20 7a 41 72 67 5b 30 5d 21 3d 27 31 27 29  && zArg[0]!='1')
2790: 20 7c 7c 20 7a 41 72 67 5b 31 5d 20 29 7b 0a 20   || zArg[1] ){. 
27a0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
27b0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
27c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27d0: 20 20 20 20 70 2d 3e 62 52 65 6d 6f 76 65 44 69      p->bRemoveDi
27e0: 61 63 72 69 74 69 63 20 3d 20 28 7a 41 72 67 5b  acritic = (zArg[
27f0: 30 5d 3d 3d 27 31 27 29 3b 0a 20 20 20 20 20 20  0]=='1');.      
2800: 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
2810: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
2820: 74 72 69 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c  tricmp(azArg[i],
2830: 20 22 74 6f 6b 65 6e 63 68 61 72 73 22 29 20 29   "tokenchars") )
2840: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2850: 20 66 74 73 35 55 6e 69 63 6f 64 65 41 64 64 45   fts5UnicodeAddE
2860: 78 63 65 70 74 69 6f 6e 73 28 70 2c 20 7a 41 72  xceptions(p, zAr
2870: 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  g, 1);.        }
2880: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
2890: 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
28a0: 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22 73  cmp(azArg[i], "s
28b0: 65 70 61 72 61 74 6f 72 73 22 29 20 29 7b 0a 20  eparators") ){. 
28c0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74           rc = ft
28d0: 73 35 55 6e 69 63 6f 64 65 41 64 64 45 78 63 65  s5UnicodeAddExce
28e0: 70 74 69 6f 6e 73 28 70 2c 20 7a 41 72 67 2c 20  ptions(p, zArg, 
28f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
2900: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
2910: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2930: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2940: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2950: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2960: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2970: 4b 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 55  K ){.      fts5U
2980: 6e 69 63 6f 64 65 44 65 6c 65 74 65 28 28 46 74  nicodeDelete((Ft
2990: 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 29 3b  s5Tokenizer*)p);
29a0: 0a 20 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20  .      p = 0;.  
29b0: 20 20 7d 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d    }.    *ppOut =
29c0: 20 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a   (Fts5Tokenizer*
29d0: 29 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  )p;.  }.  return
29e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
29f0: 74 75 72 6e 20 74 72 75 65 20 69 66 2c 20 66 6f  turn true if, fo
2a00: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
2a10: 66 20 74 6f 6b 65 6e 69 7a 69 6e 67 20 77 69 74  f tokenizing wit
2a20: 68 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72 0a  h the tokenizer.
2a30: 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ** passed as the
2a40: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
2a50: 20 63 6f 64 65 70 6f 69 6e 74 20 69 43 6f 64 65   codepoint iCode
2a60: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
2a70: 20 74 6f 6b 65 6e 20 0a 2a 2a 20 63 68 61 72 61   token .** chara
2a80: 63 74 65 72 20 28 6e 6f 74 20 61 20 73 65 70 61  cter (not a sepa
2a90: 72 61 74 6f 72 29 2e 0a 2a 2f 0a 73 74 61 74 69  rator)..*/.stati
2aa0: 63 20 69 6e 74 20 66 74 73 35 55 6e 69 63 6f 64  c int fts5Unicod
2ab0: 65 49 73 41 6c 6e 75 6d 28 55 6e 69 63 6f 64 65  eIsAlnum(Unicode
2ac0: 36 31 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 2c 20  61Tokenizer *p, 
2ad0: 69 6e 74 20 69 43 6f 64 65 29 7b 0a 20 20 61 73  int iCode){.  as
2ae0: 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 46 74  sert( (sqlite3Ft
2af0: 73 35 55 6e 69 63 6f 64 65 49 73 61 6c 6e 75 6d  s5UnicodeIsalnum
2b00: 28 69 43 6f 64 65 29 20 26 20 30 78 46 46 46 46  (iCode) & 0xFFFF
2b10: 46 46 46 45 29 3d 3d 30 20 29 3b 0a 20 20 72 65  FFFE)==0 );.  re
2b20: 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74 73 35  turn sqlite3Fts5
2b30: 55 6e 69 63 6f 64 65 49 73 61 6c 6e 75 6d 28 69  UnicodeIsalnum(i
2b40: 43 6f 64 65 29 20 5e 20 66 74 73 35 55 6e 69 63  Code) ^ fts5Unic
2b50: 6f 64 65 49 73 45 78 63 65 70 74 69 6f 6e 28 70  odeIsException(p
2b60: 2c 20 69 43 6f 64 65 29 3b 0a 7d 0a 0a 73 74 61  , iCode);.}..sta
2b70: 74 69 63 20 69 6e 74 20 66 74 73 35 55 6e 69 63  tic int fts5Unic
2b80: 6f 64 65 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 46  odeTokenize(.  F
2b90: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54  ts5Tokenizer *pT
2ba0: 6f 6b 65 6e 69 7a 65 72 2c 0a 20 20 76 6f 69 64  okenizer,.  void
2bb0: 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 66 6c   *pCtx,.  int fl
2bc0: 61 67 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ags,.  const cha
2bd0: 72 20 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54  r *pText, int nT
2be0: 65 78 74 2c 0a 20 20 69 6e 74 20 28 2a 78 54 6f  ext,.  int (*xTo
2bf0: 6b 65 6e 29 28 76 6f 69 64 2a 2c 20 69 6e 74 2c  ken)(void*, int,
2c00: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
2c10: 74 20 6e 54 6f 6b 65 6e 2c 20 69 6e 74 20 69 53  t nToken, int iS
2c20: 74 61 72 74 2c 20 69 6e 74 20 69 45 6e 64 29 0a  tart, int iEnd).
2c30: 29 7b 0a 20 20 55 6e 69 63 6f 64 65 36 31 54 6f  ){.  Unicode61To
2c40: 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20 28 55 6e  kenizer *p = (Un
2c50: 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72  icode61Tokenizer
2c60: 2a 29 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20  *)pTokenizer;.  
2c70: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c80: 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  OK;.  unsigned c
2c90: 68 61 72 20 2a 61 20 3d 20 70 2d 3e 61 54 6f 6b  har *a = p->aTok
2ca0: 65 6e 43 68 61 72 3b 0a 0a 20 20 75 6e 73 69 67  enChar;..  unsig
2cb0: 6e 65 64 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  ned char *zTerm 
2cc0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
2cd0: 2a 29 26 70 54 65 78 74 5b 6e 54 65 78 74 5d 3b  *)&pText[nText];
2ce0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2cf0: 20 2a 7a 43 73 72 20 3d 20 28 75 6e 73 69 67 6e   *zCsr = (unsign
2d00: 65 64 20 63 68 61 72 20 2a 29 70 54 65 78 74 3b  ed char *)pText;
2d10: 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75  ..  /* Output bu
2d20: 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ffer */.  char *
2d30: 61 46 6f 6c 64 20 3d 20 70 2d 3e 61 46 6f 6c 64  aFold = p->aFold
2d40: 3b 0a 20 20 69 6e 74 20 6e 46 6f 6c 64 20 3d 20  ;.  int nFold = 
2d50: 70 2d 3e 6e 46 6f 6c 64 3b 0a 20 20 63 6f 6e 73  p->nFold;.  cons
2d60: 74 20 63 68 61 72 20 2a 70 45 6e 64 20 3d 20 26  t char *pEnd = &
2d70: 61 46 6f 6c 64 5b 6e 46 6f 6c 64 2d 36 5d 3b 0a  aFold[nFold-6];.
2d80: 0a 20 20 2f 2a 20 45 61 63 68 20 69 74 65 72 61  .  /* Each itera
2d90: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 6c 6f 6f  tion of this loo
2da0: 70 20 67 6f 62 62 6c 65 73 20 75 70 20 61 20 63  p gobbles up a c
2db0: 6f 6e 74 69 67 75 6f 75 73 20 72 75 6e 20 6f 66  ontiguous run of
2dc0: 20 73 65 70 61 72 61 74 6f 72 73 2c 0a 20 20 2a   separators,.  *
2dd0: 2a 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20  * then the next 
2de0: 74 6f 6b 65 6e 2e 20 20 2a 2f 0a 20 20 77 68 69  token.  */.  whi
2df0: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2e00: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  K ){.    int iCo
2e10: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
2e20: 20 20 20 20 20 20 20 2f 2a 20 6e 6f 6e 2d 41 53         /* non-AS
2e30: 43 49 49 20 63 6f 64 65 70 6f 69 6e 74 20 72 65  CII codepoint re
2e40: 61 64 20 66 72 6f 6d 20 69 6e 70 75 74 20 2a 2f  ad from input */
2e50: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  .    char *zOut 
2e60: 3d 20 61 46 6f 6c 64 3b 0a 20 20 20 20 69 6e 74  = aFold;.    int
2e70: 20 69 73 3b 0a 20 20 20 20 69 6e 74 20 69 65 3b   is;.    int ie;
2e80: 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 61 6e  ..    /* Skip an
2e90: 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
2ea0: 61 63 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 77  acters. */.    w
2eb0: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
2ec0: 20 69 66 28 20 7a 43 73 72 3e 3d 7a 54 65 72 6d   if( zCsr>=zTerm
2ed0: 20 29 20 67 6f 74 6f 20 74 6f 6b 65 6e 69 7a 65   ) goto tokenize
2ee0: 5f 64 6f 6e 65 3b 0a 20 20 20 20 20 20 69 66 28  _done;.      if(
2ef0: 20 2a 7a 43 73 72 20 26 20 30 78 38 30 20 29 20   *zCsr & 0x80 ) 
2f00: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63  {.        /* A c
2f10: 68 61 72 61 63 74 65 72 20 6f 75 74 73 69 64 65  haracter outside
2f20: 20 6f 66 20 74 68 65 20 61 73 63 69 69 20 72 61   of the ascii ra
2f30: 6e 67 65 2e 20 53 6b 69 70 20 70 61 73 74 20 69  nge. Skip past i
2f40: 74 20 69 66 20 69 74 20 69 73 0a 20 20 20 20 20  t if it is.     
2f50: 20 20 20 2a 2a 20 61 20 73 65 70 61 72 61 74 6f     ** a separato
2f60: 72 20 63 68 61 72 61 63 74 65 72 2e 20 4f 72 20  r character. Or 
2f70: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
2f80: 20 6c 6f 6f 70 20 69 66 20 69 74 20 69 73 20 6e   loop if it is n
2f90: 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ot. */.        i
2fa0: 73 20 3d 20 7a 43 73 72 20 2d 20 28 75 6e 73 69  s = zCsr - (unsi
2fb0: 67 6e 65 64 20 63 68 61 72 2a 29 70 54 65 78 74  gned char*)pText
2fc0: 3b 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f 55  ;.        READ_U
2fd0: 54 46 38 28 7a 43 73 72 2c 20 7a 54 65 72 6d 2c  TF8(zCsr, zTerm,
2fe0: 20 69 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   iCode);.       
2ff0: 20 69 66 28 20 66 74 73 35 55 6e 69 63 6f 64 65   if( fts5Unicode
3000: 49 73 41 6c 6e 75 6d 28 70 2c 20 69 43 6f 64 65  IsAlnum(p, iCode
3010: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
3020: 6f 74 6f 20 6e 6f 6e 5f 61 73 63 69 69 5f 74 6f  oto non_ascii_to
3030: 6b 65 6e 63 68 61 72 3b 0a 20 20 20 20 20 20 20  kenchar;.       
3040: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
3050: 20 20 20 20 20 20 20 20 69 66 28 20 61 5b 2a 7a          if( a[*z
3060: 43 73 72 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  Csr] ){.        
3070: 20 20 69 73 20 3d 20 7a 43 73 72 20 2d 20 28 75    is = zCsr - (u
3080: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 54  nsigned char*)pT
3090: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ext;.          g
30a0: 6f 74 6f 20 61 73 63 69 69 5f 74 6f 6b 65 6e 63  oto ascii_tokenc
30b0: 68 61 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  har;.        }. 
30c0: 20 20 20 20 20 20 20 7a 43 73 72 2b 2b 3b 0a 20         zCsr++;. 
30d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
30e0: 20 20 2f 2a 20 52 75 6e 20 74 68 72 6f 75 67 68    /* Run through
30f0: 20 74 68 65 20 74 6f 6b 65 6e 63 68 61 72 73 2e   the tokenchars.
3100: 20 46 6f 6c 64 20 74 68 65 6d 20 69 6e 74 6f 20   Fold them into 
3110: 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
3120: 72 20 61 6c 6f 6e 67 0a 20 20 20 20 2a 2a 20 74  r along.    ** t
3130: 68 65 20 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20  he way.  */.    
3140: 77 68 69 6c 65 28 20 7a 43 73 72 3c 7a 54 65 72  while( zCsr<zTer
3150: 6d 20 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  m ){..      /* G
3160: 72 6f 77 20 74 68 65 20 6f 75 74 70 75 74 20 62  row the output b
3170: 75 66 66 65 72 20 73 6f 20 74 68 61 74 20 74 68  uffer so that th
3180: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
3190: 74 20 73 70 61 63 65 20 74 6f 20 66 69 74 20 74  t space to fit t
31a0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  he.      ** larg
31b0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75 74 66  est possible utf
31c0: 2d 38 20 63 68 61 72 61 63 74 65 72 2e 20 20 2a  -8 character.  *
31d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 4f 75 74  /.      if( zOut
31e0: 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  >pEnd ){.       
31f0: 20 61 46 6f 6c 64 20 3d 20 73 71 6c 69 74 65 33   aFold = sqlite3
3200: 5f 6d 61 6c 6c 6f 63 28 6e 46 6f 6c 64 2a 32 29  _malloc(nFold*2)
3210: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  ;.        if( aF
3220: 6f 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  old==0 ){.      
3230: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3240: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
3250: 20 67 6f 74 6f 20 74 6f 6b 65 6e 69 7a 65 5f 64   goto tokenize_d
3260: 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  one;.        }. 
3270: 20 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 26 61         zOut = &a
3280: 46 6f 6c 64 5b 7a 4f 75 74 20 2d 20 70 2d 3e 61  Fold[zOut - p->a
3290: 46 6f 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d  Fold];.        m
32a0: 65 6d 63 70 79 28 61 46 6f 6c 64 2c 20 70 2d 3e  emcpy(aFold, p->
32b0: 61 46 6f 6c 64 2c 20 6e 46 6f 6c 64 29 3b 0a 20  aFold, nFold);. 
32c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
32d0: 72 65 65 28 70 2d 3e 61 46 6f 6c 64 29 3b 0a 20  ree(p->aFold);. 
32e0: 20 20 20 20 20 20 20 70 2d 3e 61 46 6f 6c 64 20         p->aFold 
32f0: 3d 20 61 46 6f 6c 64 3b 0a 20 20 20 20 20 20 20  = aFold;.       
3300: 20 70 2d 3e 6e 46 6f 6c 64 20 3d 20 6e 46 6f 6c   p->nFold = nFol
3310: 64 20 3d 20 6e 46 6f 6c 64 2a 32 3b 0a 20 20 20  d = nFold*2;.   
3320: 20 20 20 20 20 70 45 6e 64 20 3d 20 26 61 46 6f       pEnd = &aFo
3330: 6c 64 5b 6e 46 6f 6c 64 2d 36 5d 3b 0a 20 20 20  ld[nFold-6];.   
3340: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
3350: 2a 7a 43 73 72 20 26 20 30 78 38 30 20 29 7b 0a  *zCsr & 0x80 ){.
3360: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6e 6f          /* An no
3370: 6e 2d 61 73 63 69 69 2d 72 61 6e 67 65 20 63 68  n-ascii-range ch
3380: 61 72 61 63 74 65 72 2e 20 46 6f 6c 64 20 69 74  aracter. Fold it
3390: 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
33a0: 20 62 75 66 66 65 72 20 69 66 0a 20 20 20 20 20   buffer if.     
33b0: 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 74 6f     ** it is a to
33c0: 6b 65 6e 20 63 68 61 72 61 63 74 65 72 2c 20 6f  ken character, o
33d0: 72 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  r break out of t
33e0: 68 65 20 6c 6f 6f 70 20 69 66 20 69 74 20 69 73  he loop if it is
33f0: 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
3400: 20 52 45 41 44 5f 55 54 46 38 28 7a 43 73 72 2c   READ_UTF8(zCsr,
3410: 20 7a 54 65 72 6d 2c 20 69 43 6f 64 65 29 3b 0a   zTerm, iCode);.
3420: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
3430: 55 6e 69 63 6f 64 65 49 73 41 6c 6e 75 6d 28 70  UnicodeIsAlnum(p
3440: 2c 69 43 6f 64 65 29 7c 7c 73 71 6c 69 74 65 33  ,iCode)||sqlite3
3450: 46 74 73 35 55 6e 69 63 6f 64 65 49 73 64 69 61  Fts5UnicodeIsdia
3460: 63 72 69 74 69 63 28 69 43 6f 64 65 29 20 29 7b  critic(iCode) ){
3470: 0a 20 6e 6f 6e 5f 61 73 63 69 69 5f 74 6f 6b 65  . non_ascii_toke
3480: 6e 63 68 61 72 3a 0a 20 20 20 20 20 20 20 20 20  nchar:.         
3490: 20 69 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33   iCode = sqlite3
34a0: 46 74 73 35 55 6e 69 63 6f 64 65 46 6f 6c 64 28  Fts5UnicodeFold(
34b0: 69 43 6f 64 65 2c 20 70 2d 3e 62 52 65 6d 6f 76  iCode, p->bRemov
34c0: 65 44 69 61 63 72 69 74 69 63 29 3b 0a 20 20 20  eDiacritic);.   
34d0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 64 65         if( iCode
34e0: 20 29 20 57 52 49 54 45 5f 55 54 46 38 28 7a 4f   ) WRITE_UTF8(zO
34f0: 75 74 2c 20 69 43 6f 64 65 29 3b 0a 20 20 20 20  ut, iCode);.    
3500: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3510: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3520: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
3530: 65 20 69 66 28 20 61 5b 2a 7a 43 73 72 5d 3d 3d  e if( a[*zCsr]==
3540: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
3550: 41 6e 20 61 73 63 69 69 2d 72 61 6e 67 65 20 73  An ascii-range s
3560: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
3570: 65 72 2e 20 45 6e 64 20 6f 66 20 74 6f 6b 65 6e  er. End of token
3580: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
3590: 61 6b 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak; .      }else
35a0: 7b 0a 20 61 73 63 69 69 5f 74 6f 6b 65 6e 63 68  {. ascii_tokench
35b0: 61 72 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  ar:.        if( 
35c0: 2a 7a 43 73 72 3e 3d 27 41 27 20 26 26 20 2a 7a  *zCsr>='A' && *z
35d0: 43 73 72 3c 3d 27 5a 27 20 29 7b 0a 20 20 20 20  Csr<='Z' ){.    
35e0: 20 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20        *zOut++ = 
35f0: 2a 7a 43 73 72 20 2b 20 33 32 3b 0a 20 20 20 20  *zCsr + 32;.    
3600: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3610: 20 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 2a       *zOut++ = *
3620: 7a 43 73 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zCsr;.        }.
3630: 20 20 20 20 20 20 20 20 7a 43 73 72 2b 2b 3b 0a          zCsr++;.
3640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 65        }.      ie
3650: 20 3d 20 7a 43 73 72 20 2d 20 28 75 6e 73 69 67   = zCsr - (unsig
3660: 6e 65 64 20 63 68 61 72 2a 29 70 54 65 78 74 3b  ned char*)pText;
3670: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
3680: 6e 76 6f 6b 65 20 74 68 65 20 74 6f 6b 65 6e 20  nvoke the token 
3690: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20  callback */.    
36a0: 72 63 20 3d 20 78 54 6f 6b 65 6e 28 70 43 74 78  rc = xToken(pCtx
36b0: 2c 20 30 2c 20 61 46 6f 6c 64 2c 20 7a 4f 75 74  , 0, aFold, zOut
36c0: 2d 61 46 6f 6c 64 2c 20 69 73 2c 20 69 65 29 3b  -aFold, is, ie);
36d0: 20 0a 20 20 7d 0a 20 20 0a 20 74 6f 6b 65 6e 69   .  }.  . tokeni
36e0: 7a 65 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20 72  ze_done:.  if( r
36f0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
3700: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3710: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3720: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
3730: 2a 2a 2a 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 0a 2a 2a 20  ************.** 
3770: 53 74 61 72 74 20 6f 66 20 70 6f 72 74 65 72 20  Start of porter 
3780: 73 74 65 6d 6d 65 72 20 69 6d 70 6c 65 6d 65 6e  stemmer implemen
3790: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 20 41  tation..*/../* A
37a0: 6e 79 20 74 6f 6b 65 6e 73 20 6c 61 72 67 65 72  ny tokens larger
37b0: 20 74 68 61 6e 20 74 68 69 73 20 28 69 6e 20 62   than this (in b
37c0: 79 74 65 73 29 20 61 72 65 20 70 61 73 73 65 64  ytes) are passed
37d0: 20 74 68 72 6f 75 67 68 20 77 69 74 68 6f 75 74   through without
37e0: 0a 2a 2a 20 73 74 65 6d 6d 69 6e 67 2e 20 2a 2f  .** stemming. */
37f0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 50 4f  .#define FTS5_PO
3800: 52 54 45 52 5f 4d 41 58 5f 54 4f 4b 45 4e 20 36  RTER_MAX_TOKEN 6
3810: 34 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  4..typedef struc
3820: 74 20 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65  t PorterTokenize
3830: 72 20 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65  r PorterTokenize
3840: 72 3b 0a 73 74 72 75 63 74 20 50 6f 72 74 65 72  r;.struct Porter
3850: 54 6f 6b 65 6e 69 7a 65 72 20 7b 0a 20 20 66 74  Tokenizer {.  ft
3860: 73 35 5f 74 6f 6b 65 6e 69 7a 65 72 20 74 6f 6b  s5_tokenizer tok
3870: 65 6e 69 7a 65 72 3b 20 20 20 20 20 20 20 2f 2a  enizer;       /*
3880: 20 50 61 72 65 6e 74 20 74 6f 6b 65 6e 69 7a 65   Parent tokenize
3890: 72 20 6d 6f 64 75 6c 65 20 2a 2f 0a 20 20 46 74  r module */.  Ft
38a0: 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  s5Tokenizer *pTo
38b0: 6b 65 6e 69 7a 65 72 3b 20 20 20 20 20 20 2f 2a  kenizer;      /*
38c0: 20 50 61 72 65 6e 74 20 74 6f 6b 65 6e 69 7a 65   Parent tokenize
38d0: 72 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 20 20  r instance */.  
38e0: 63 68 61 72 20 61 42 75 66 5b 46 54 53 35 5f 50  char aBuf[FTS5_P
38f0: 4f 52 54 45 52 5f 4d 41 58 5f 54 4f 4b 45 4e 20  ORTER_MAX_TOKEN 
3900: 2b 20 36 34 5d 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  + 64];.};../*.**
3910: 20 44 65 6c 65 74 65 20 61 20 22 70 6f 72 74 65   Delete a "porte
3920: 72 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f  r" tokenizer..*/
3930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
3940: 35 50 6f 72 74 65 72 44 65 6c 65 74 65 28 46 74  5PorterDelete(Ft
3950: 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f  s5Tokenizer *pTo
3960: 6b 29 7b 0a 20 20 69 66 28 20 70 54 6f 6b 20 29  k){.  if( pTok )
3970: 7b 0a 20 20 20 20 50 6f 72 74 65 72 54 6f 6b 65  {.    PorterToke
3980: 6e 69 7a 65 72 20 2a 70 20 3d 20 28 50 6f 72 74  nizer *p = (Port
3990: 65 72 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 54 6f  erTokenizer*)pTo
39a0: 6b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54  k;.    if( p->pT
39b0: 6f 6b 65 6e 69 7a 65 72 20 29 7b 0a 20 20 20 20  okenizer ){.    
39c0: 20 20 70 2d 3e 74 6f 6b 65 6e 69 7a 65 72 2e 78    p->tokenizer.x
39d0: 44 65 6c 65 74 65 28 70 2d 3e 70 54 6f 6b 65 6e  Delete(p->pToken
39e0: 69 7a 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  izer);.    }.   
39f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
3a00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
3a10: 72 65 61 74 65 20 61 20 22 70 6f 72 74 65 72 22  reate a "porter"
3a20: 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f 0a 73   tokenizer..*/.s
3a30: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f  tatic int fts5Po
3a40: 72 74 65 72 43 72 65 61 74 65 28 0a 20 20 76 6f  rterCreate(.  vo
3a50: 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e  id *pCtx, .  con
3a60: 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  st char **azArg,
3a70: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 46 74 73   int nArg,.  Fts
3a80: 35 54 6f 6b 65 6e 69 7a 65 72 20 2a 2a 70 70 4f  5Tokenizer **ppO
3a90: 75 74 0a 29 7b 0a 20 20 66 74 73 35 5f 61 70 69  ut.){.  fts5_api
3aa0: 20 2a 70 41 70 69 20 3d 20 28 66 74 73 35 5f 61   *pApi = (fts5_a
3ab0: 70 69 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  pi*)pCtx;.  int 
3ac0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
3ad0: 20 20 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65    PorterTokenize
3ae0: 72 20 2a 70 52 65 74 3b 0a 20 20 76 6f 69 64 20  r *pRet;.  void 
3af0: 2a 70 55 73 65 72 64 61 74 61 20 3d 20 30 3b 0a  *pUserdata = 0;.
3b00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
3b10: 61 73 65 20 3d 20 22 75 6e 69 63 6f 64 65 36 31  ase = "unicode61
3b20: 22 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3e 30  ";..  if( nArg>0
3b30: 20 29 7b 0a 20 20 20 20 7a 42 61 73 65 20 3d 20   ){.    zBase = 
3b40: 61 7a 41 72 67 5b 30 5d 3b 0a 20 20 7d 0a 0a 20  azArg[0];.  }.. 
3b50: 20 70 52 65 74 20 3d 20 28 50 6f 72 74 65 72 54   pRet = (PorterT
3b60: 6f 6b 65 6e 69 7a 65 72 2a 29 73 71 6c 69 74 65  okenizer*)sqlite
3b70: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
3b80: 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72 29  PorterTokenizer)
3b90: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
3ba0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74  .    memset(pRet
3bb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 6f 72 74  , 0, sizeof(Port
3bc0: 65 72 54 6f 6b 65 6e 69 7a 65 72 29 29 3b 0a 20  erTokenizer));. 
3bd0: 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78 46     rc = pApi->xF
3be0: 69 6e 64 54 6f 6b 65 6e 69 7a 65 72 28 70 41 70  indTokenizer(pAp
3bf0: 69 2c 20 7a 42 61 73 65 2c 20 26 70 55 73 65 72  i, zBase, &pUser
3c00: 64 61 74 61 2c 20 26 70 52 65 74 2d 3e 74 6f 6b  data, &pRet->tok
3c10: 65 6e 69 7a 65 72 29 3b 0a 20 20 7d 65 6c 73 65  enizer);.  }else
3c20: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
3c30: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
3c40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3c50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67   ){.    int nArg
3c60: 32 20 3d 20 28 6e 41 72 67 3e 30 20 3f 20 6e 41  2 = (nArg>0 ? nA
3c70: 72 67 2d 31 20 3a 20 30 29 3b 0a 20 20 20 20 63  rg-1 : 0);.    c
3c80: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
3c90: 67 32 20 3d 20 28 6e 41 72 67 32 20 3f 20 26 61  g2 = (nArg2 ? &a
3ca0: 7a 41 72 67 5b 31 5d 20 3a 20 30 29 3b 0a 20 20  zArg[1] : 0);.  
3cb0: 20 20 72 63 20 3d 20 70 52 65 74 2d 3e 74 6f 6b    rc = pRet->tok
3cc0: 65 6e 69 7a 65 72 2e 78 43 72 65 61 74 65 28 70  enizer.xCreate(p
3cd0: 55 73 65 72 64 61 74 61 2c 20 61 7a 41 72 67 32  Userdata, azArg2
3ce0: 2c 20 6e 41 72 67 32 2c 20 26 70 52 65 74 2d 3e  , nArg2, &pRet->
3cf0: 70 54 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20 20 7d  pTokenizer);.  }
3d00: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
3d10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73  TE_OK ){.    fts
3d20: 35 50 6f 72 74 65 72 44 65 6c 65 74 65 28 28 46  5PorterDelete((F
3d30: 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 52  ts5Tokenizer*)pR
3d40: 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  et);.    pRet = 
3d50: 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20  0;.  }.  *ppOut 
3d60: 3d 20 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  = (Fts5Tokenizer
3d70: 2a 29 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e  *)pRet;.  return
3d80: 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20   rc;.}..typedef 
3d90: 73 74 72 75 63 74 20 50 6f 72 74 65 72 43 6f 6e  struct PorterCon
3da0: 74 65 78 74 20 50 6f 72 74 65 72 43 6f 6e 74 65  text PorterConte
3db0: 78 74 3b 0a 73 74 72 75 63 74 20 50 6f 72 74 65  xt;.struct Porte
3dc0: 72 43 6f 6e 74 65 78 74 20 7b 0a 20 20 76 6f 69  rContext {.  voi
3dd0: 64 20 2a 70 43 74 78 3b 0a 20 20 69 6e 74 20 28  d *pCtx;.  int (
3de0: 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a 2c 20  *xToken)(void*, 
3df0: 69 6e 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  int, const char*
3e00: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29  , int, int, int)
3e10: 3b 0a 20 20 63 68 61 72 20 2a 61 42 75 66 3b 0a  ;.  char *aBuf;.
3e20: 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  };..typedef stru
3e30: 63 74 20 50 6f 72 74 65 72 52 75 6c 65 20 50 6f  ct PorterRule Po
3e40: 72 74 65 72 52 75 6c 65 3b 0a 73 74 72 75 63 74  rterRule;.struct
3e50: 20 50 6f 72 74 65 72 52 75 6c 65 20 7b 0a 20 20   PorterRule {.  
3e60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 66  const char *zSuf
3e70: 66 69 78 3b 0a 20 20 69 6e 74 20 6e 53 75 66 66  fix;.  int nSuff
3e80: 69 78 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e  ix;.  int (*xCon
3e90: 64 29 28 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20  d)(char *zStem, 
3ea0: 69 6e 74 20 6e 53 74 65 6d 29 3b 0a 20 20 63 6f  int nStem);.  co
3eb0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 75 74 70 75  nst char *zOutpu
3ec0: 74 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 70 75 74  t;.  int nOutput
3ed0: 3b 0a 7d 3b 0a 0a 23 69 66 20 30 0a 73 74 61 74  ;.};..#if 0.stat
3ee0: 69 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65  ic int fts5Porte
3ef0: 72 41 70 70 6c 79 28 63 68 61 72 20 2a 61 42 75  rApply(char *aBu
3f00: 66 2c 20 69 6e 74 20 2a 70 6e 42 75 66 2c 20 50  f, int *pnBuf, P
3f10: 6f 72 74 65 72 52 75 6c 65 20 2a 61 52 75 6c 65  orterRule *aRule
3f20: 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 2d  ){.  int ret = -
3f30: 31 3b 0a 20 20 69 6e 74 20 6e 42 75 66 20 3d 20  1;.  int nBuf = 
3f40: 2a 70 6e 42 75 66 3b 0a 20 20 50 6f 72 74 65 72  *pnBuf;.  Porter
3f50: 52 75 6c 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28  Rule *p;..  for(
3f60: 70 3d 61 52 75 6c 65 3b 20 70 2d 3e 7a 53 75 66  p=aRule; p->zSuf
3f70: 66 69 78 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 61  fix; p++){.    a
3f80: 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 70 2d  ssert( strlen(p-
3f90: 3e 7a 53 75 66 66 69 78 29 3d 3d 70 2d 3e 6e 53  >zSuffix)==p->nS
3fa0: 75 66 66 69 78 20 29 3b 0a 20 20 20 20 61 73 73  uffix );.    ass
3fb0: 65 72 74 28 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ert( strlen(p->z
3fc0: 4f 75 74 70 75 74 29 3d 3d 70 2d 3e 6e 4f 75 74  Output)==p->nOut
3fd0: 70 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  put );.    if( n
3fe0: 42 75 66 3c 70 2d 3e 6e 53 75 66 66 69 78 20 29  Buf<p->nSuffix )
3ff0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
4000: 66 28 20 30 3d 3d 6d 65 6d 63 6d 70 28 26 61 42  f( 0==memcmp(&aB
4010: 75 66 5b 6e 42 75 66 20 2d 20 70 2d 3e 6e 53 75  uf[nBuf - p->nSu
4020: 66 66 69 78 5d 2c 20 70 2d 3e 7a 53 75 66 66 69  ffix], p->zSuffi
4030: 78 2c 20 70 2d 3e 6e 53 75 66 66 69 78 29 20 29  x, p->nSuffix) )
4040: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
4050: 66 28 20 70 2d 3e 7a 53 75 66 66 69 78 20 29 7b  f( p->zSuffix ){
4060: 0a 20 20 20 20 69 6e 74 20 6e 53 74 65 6d 20 3d  .    int nStem =
4070: 20 6e 42 75 66 20 2d 20 70 2d 3e 6e 53 75 66 66   nBuf - p->nSuff
4080: 69 78 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 78  ix;.    if( p->x
4090: 43 6f 6e 64 3d 3d 30 20 7c 7c 20 70 2d 3e 78 43  Cond==0 || p->xC
40a0: 6f 6e 64 28 61 42 75 66 2c 20 6e 53 74 65 6d 29  ond(aBuf, nStem)
40b0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
40c0: 28 26 61 42 75 66 5b 6e 53 74 65 6d 5d 2c 20 70  (&aBuf[nStem], p
40d0: 2d 3e 7a 4f 75 74 70 75 74 2c 20 70 2d 3e 6e 4f  ->zOutput, p->nO
40e0: 75 74 70 75 74 29 3b 0a 20 20 20 20 20 20 2a 70  utput);.      *p
40f0: 6e 42 75 66 20 3d 20 6e 53 74 65 6d 20 2b 20 70  nBuf = nStem + p
4100: 2d 3e 6e 4f 75 74 70 75 74 3b 0a 20 20 20 20 20  ->nOutput;.     
4110: 20 72 65 74 20 3d 20 70 20 2d 20 61 52 75 6c 65   ret = p - aRule
4120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
4130: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 23 65 6e  eturn ret;.}.#en
4140: 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
4150: 66 74 73 35 50 6f 72 74 65 72 49 73 56 6f 77 65  fts5PorterIsVowe
4160: 6c 28 63 68 61 72 20 63 2c 20 69 6e 74 20 62 59  l(char c, int bY
4170: 49 73 56 6f 77 65 6c 29 7b 0a 20 20 72 65 74 75  IsVowel){.  retu
4180: 72 6e 20 28 0a 20 20 20 20 20 20 63 3d 3d 27 61  rn (.      c=='a
4190: 27 20 7c 7c 20 63 3d 3d 27 65 27 20 7c 7c 20 63  ' || c=='e' || c
41a0: 3d 3d 27 69 27 20 7c 7c 20 63 3d 3d 27 6f 27 20  =='i' || c=='o' 
41b0: 7c 7c 20 63 3d 3d 27 75 27 20 7c 7c 20 28 62 59  || c=='u' || (bY
41c0: 49 73 56 6f 77 65 6c 20 26 26 20 63 3d 3d 27 79  IsVowel && c=='y
41d0: 27 29 0a 20 20 29 3b 0a 7d 0a 0a 73 74 61 74 69  ').  );.}..stati
41e0: 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72  c int fts5Porter
41f0: 47 6f 62 62 6c 65 56 43 28 63 68 61 72 20 2a 7a  GobbleVC(char *z
4200: 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74 65 6d 2c  Stem, int nStem,
4210: 20 69 6e 74 20 62 50 72 65 76 43 6f 6e 73 29 7b   int bPrevCons){
4220: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4230: 62 43 6f 6e 73 20 3d 20 62 50 72 65 76 43 6f 6e  bCons = bPrevCon
4240: 73 3b 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 66 6f  s;..  /* Scan fo
4250: 72 20 61 20 76 6f 77 65 6c 20 2a 2f 0a 20 20 66  r a vowel */.  f
4260: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 74 65 6d 3b  or(i=0; i<nStem;
4270: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30   i++){.    if( 0
4280: 3d 3d 28 62 43 6f 6e 73 20 3d 20 21 66 74 73 35  ==(bCons = !fts5
4290: 50 6f 72 74 65 72 49 73 56 6f 77 65 6c 28 7a 53  PorterIsVowel(zS
42a0: 74 65 6d 5b 69 5d 2c 20 62 43 6f 6e 73 29 29 20  tem[i], bCons)) 
42b0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20  ) break;.  }..  
42c0: 2f 2a 20 53 63 61 6e 20 66 6f 72 20 61 20 63 6f  /* Scan for a co
42d0: 6e 73 6f 6e 65 6e 74 20 2a 2f 0a 20 20 66 6f 72  nsonent */.  for
42e0: 28 69 2b 2b 3b 20 69 3c 6e 53 74 65 6d 3b 20 69  (i++; i<nStem; i
42f0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28 62 43  ++){.    if( (bC
4300: 6f 6e 73 20 3d 20 21 66 74 73 35 50 6f 72 74 65  ons = !fts5Porte
4310: 72 49 73 56 6f 77 65 6c 28 7a 53 74 65 6d 5b 69  rIsVowel(zStem[i
4320: 5d 2c 20 62 43 6f 6e 73 29 29 20 29 20 72 65 74  ], bCons)) ) ret
4330: 75 72 6e 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 72  urn i+1;.  }.  r
4340: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 70  eturn 0;.}../* p
4350: 6f 72 74 65 72 20 72 75 6c 65 20 63 6f 6e 64 69  orter rule condi
4360: 74 69 6f 6e 3a 20 28 6d 20 3e 20 30 29 20 2a 2f  tion: (m > 0) */
4370: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
4380: 50 6f 72 74 65 72 5f 4d 47 74 30 28 63 68 61 72  Porter_MGt0(char
4390: 20 2a 7a 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74   *zStem, int nSt
43a0: 65 6d 29 7b 0a 20 20 72 65 74 75 72 6e 20 21 21  em){.  return !!
43b0: 66 74 73 35 50 6f 72 74 65 72 47 6f 62 62 6c 65  fts5PorterGobble
43c0: 56 43 28 7a 53 74 65 6d 2c 20 6e 53 74 65 6d 2c  VC(zStem, nStem,
43d0: 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 70 6f 72 74 65   0);.}../* porte
43e0: 72 20 72 75 6c 65 20 63 6f 6e 64 69 74 69 6f 6e  r rule condition
43f0: 3a 20 28 6d 20 3e 20 31 29 20 2a 2f 0a 73 74 61  : (m > 1) */.sta
4400: 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74  tic int fts5Port
4410: 65 72 5f 4d 47 74 31 28 63 68 61 72 20 2a 7a 53  er_MGt1(char *zS
4420: 74 65 6d 2c 20 69 6e 74 20 6e 53 74 65 6d 29 7b  tem, int nStem){
4430: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20  .  int n;.  n = 
4440: 66 74 73 35 50 6f 72 74 65 72 47 6f 62 62 6c 65  fts5PorterGobble
4450: 56 43 28 7a 53 74 65 6d 2c 20 6e 53 74 65 6d 2c  VC(zStem, nStem,
4460: 20 30 29 3b 0a 20 20 69 66 28 20 6e 20 26 26 20   0);.  if( n && 
4470: 66 74 73 35 50 6f 72 74 65 72 47 6f 62 62 6c 65  fts5PorterGobble
4480: 56 43 28 26 7a 53 74 65 6d 5b 6e 5d 2c 20 6e 53  VC(&zStem[n], nS
4490: 74 65 6d 2d 6e 2c 20 31 29 20 29 7b 0a 20 20 20  tem-n, 1) ){.   
44a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
44b0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
44c0: 20 70 6f 72 74 65 72 20 72 75 6c 65 20 63 6f 6e   porter rule con
44d0: 64 69 74 69 6f 6e 3a 20 28 6d 20 3d 20 31 29 20  dition: (m = 1) 
44e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
44f0: 73 35 50 6f 72 74 65 72 5f 4d 45 71 31 28 63 68  s5Porter_MEq1(ch
4500: 61 72 20 2a 7a 53 74 65 6d 2c 20 69 6e 74 20 6e  ar *zStem, int n
4510: 53 74 65 6d 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Stem){.  int n;.
4520: 20 20 6e 20 3d 20 66 74 73 35 50 6f 72 74 65 72    n = fts5Porter
4530: 47 6f 62 62 6c 65 56 43 28 7a 53 74 65 6d 2c 20  GobbleVC(zStem, 
4540: 6e 53 74 65 6d 2c 20 30 29 3b 0a 20 20 69 66 28  nStem, 0);.  if(
4550: 20 6e 20 26 26 20 30 3d 3d 66 74 73 35 50 6f 72   n && 0==fts5Por
4560: 74 65 72 47 6f 62 62 6c 65 56 43 28 26 7a 53 74  terGobbleVC(&zSt
4570: 65 6d 5b 6e 5d 2c 20 6e 53 74 65 6d 2d 6e 2c 20  em[n], nStem-n, 
4580: 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
4590: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
45a0: 20 30 3b 0a 7d 0a 0a 2f 2a 20 70 6f 72 74 65 72   0;.}../* porter
45b0: 20 72 75 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 3a   rule condition:
45c0: 20 28 2a 6f 29 20 2a 2f 0a 73 74 61 74 69 63 20   (*o) */.static 
45d0: 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72 5f 4f  int fts5Porter_O
45e0: 73 74 61 72 28 63 68 61 72 20 2a 7a 53 74 65 6d  star(char *zStem
45f0: 2c 20 69 6e 74 20 6e 53 74 65 6d 29 7b 0a 20 20  , int nStem){.  
4600: 69 66 28 20 7a 53 74 65 6d 5b 6e 53 74 65 6d 2d  if( zStem[nStem-
4610: 31 5d 3d 3d 27 77 27 20 7c 7c 20 7a 53 74 65 6d  1]=='w' || zStem
4620: 5b 6e 53 74 65 6d 2d 31 5d 3d 3d 27 78 27 20 7c  [nStem-1]=='x' |
4630: 7c 20 7a 53 74 65 6d 5b 6e 53 74 65 6d 2d 31 5d  | zStem[nStem-1]
4640: 3d 3d 27 79 27 20 29 7b 0a 20 20 20 20 72 65 74  =='y' ){.    ret
4650: 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
4660: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
4670: 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nt mask = 0;.   
4680: 20 69 6e 74 20 62 43 6f 6e 73 20 3d 20 30 3b 0a   int bCons = 0;.
4690: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
46a0: 53 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Stem; i++){.    
46b0: 20 20 62 43 6f 6e 73 20 3d 20 21 66 74 73 35 50    bCons = !fts5P
46c0: 6f 72 74 65 72 49 73 56 6f 77 65 6c 28 7a 53 74  orterIsVowel(zSt
46d0: 65 6d 5b 69 5d 2c 20 62 43 6f 6e 73 29 3b 0a 20  em[i], bCons);. 
46e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 62 43 6f       assert( bCo
46f0: 6e 73 3d 3d 30 20 7c 7c 20 62 43 6f 6e 73 3d 3d  ns==0 || bCons==
4700: 31 20 29 3b 0a 20 20 20 20 20 20 6d 61 73 6b 20  1 );.      mask 
4710: 3d 20 28 6d 61 73 6b 20 3c 3c 20 31 29 20 2b 20  = (mask << 1) + 
4720: 62 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20  bCons;.    }.   
4730: 20 72 65 74 75 72 6e 20 28 28 6d 61 73 6b 20 26   return ((mask &
4740: 20 30 78 30 30 30 37 29 3d 3d 30 78 30 30 30 35   0x0007)==0x0005
4750: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 70 6f 72  );.  }.}../* por
4760: 74 65 72 20 72 75 6c 65 20 63 6f 6e 64 69 74 69  ter rule conditi
4770: 6f 6e 3a 20 28 6d 20 3e 20 31 20 61 6e 64 20 28  on: (m > 1 and (
4780: 2a 53 20 6f 72 20 2a 54 29 29 20 2a 2f 0a 73 74  *S or *T)) */.st
4790: 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 72  atic int fts5Por
47a0: 74 65 72 5f 4d 47 74 31 5f 61 6e 64 5f 53 5f 6f  ter_MGt1_and_S_o
47b0: 72 5f 54 28 63 68 61 72 20 2a 7a 53 74 65 6d 2c  r_T(char *zStem,
47c0: 20 69 6e 74 20 6e 53 74 65 6d 29 7b 0a 20 20 61   int nStem){.  a
47d0: 73 73 65 72 74 28 20 6e 53 74 65 6d 3e 30 20 29  ssert( nStem>0 )
47e0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 7a 53 74 65  ;.  return (zSte
47f0: 6d 5b 6e 53 74 65 6d 2d 31 5d 3d 3d 27 73 27 20  m[nStem-1]=='s' 
4800: 7c 7c 20 7a 53 74 65 6d 5b 6e 53 74 65 6d 2d 31  || zStem[nStem-1
4810: 5d 3d 3d 27 74 27 29 20 0a 20 20 20 20 20 20 26  ]=='t') .      &
4820: 26 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  & fts5Porter_MGt
4830: 31 28 7a 53 74 65 6d 2c 20 6e 53 74 65 6d 29 3b  1(zStem, nStem);
4840: 0a 7d 0a 0a 2f 2a 20 70 6f 72 74 65 72 20 72 75  .}../* porter ru
4850: 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 28 2a  le condition: (*
4860: 76 2a 29 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  v*) */.static in
4870: 74 20 66 74 73 35 50 6f 72 74 65 72 5f 56 6f 77  t fts5Porter_Vow
4880: 65 6c 28 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20  el(char *zStem, 
4890: 69 6e 74 20 6e 53 74 65 6d 29 7b 0a 20 20 69 6e  int nStem){.  in
48a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
48b0: 69 3c 6e 53 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  i<nStem; i++){. 
48c0: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
48d0: 72 49 73 56 6f 77 65 6c 28 7a 53 74 65 6d 5b 69  rIsVowel(zStem[i
48e0: 5d 2c 20 69 3e 30 29 20 29 7b 0a 20 20 20 20 20  ], i>0) ){.     
48f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
4900: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4910: 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
4920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
49b0: 47 45 4e 45 52 41 54 45 44 20 43 4f 44 45 20 53  GENERATED CODE S
49c0: 54 41 52 54 53 20 48 45 52 45 20 28 6d 6b 70 6f  TARTS HERE (mkpo
49d0: 72 74 65 72 73 74 65 70 73 2e 74 63 6c 29 0a 2a  rtersteps.tcl).*
49e0: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  /..static int ft
49f0: 73 35 50 6f 72 74 65 72 53 74 65 70 34 28 63 68  s5PorterStep4(ch
4a00: 61 72 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70  ar *aBuf, int *p
4a10: 6e 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 65 74  nBuf){.  int ret
4a20: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 75 66   = 0;.  int nBuf
4a30: 20 3d 20 2a 70 6e 42 75 66 3b 0a 20 20 73 77 69   = *pnBuf;.  swi
4a40: 74 63 68 28 20 61 42 75 66 5b 6e 42 75 66 2d 32  tch( aBuf[nBuf-2
4a50: 5d 20 29 7b 0a 20 20 20 20 0a 20 20 20 20 63 61  ] ){.    .    ca
4a60: 73 65 20 27 61 27 3a 20 0a 20 20 20 20 20 20 69  se 'a': .      i
4a70: 66 28 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d  f( nBuf>2 && 0==
4a80: 6d 65 6d 63 6d 70 28 22 61 6c 22 2c 20 26 61 42  memcmp("al", &aB
4a90: 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29  uf[nBuf-2], 2) )
4aa0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
4ab0: 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42  s5Porter_MGt1(aB
4ac0: 75 66 2c 20 6e 42 75 66 2d 32 29 20 29 7b 0a 20  uf, nBuf-2) ){. 
4ad0: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
4ae0: 3d 20 6e 42 75 66 20 2d 20 32 3b 0a 20 20 20 20  = nBuf - 2;.    
4af0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20      break;.  .  
4b10: 20 20 63 61 73 65 20 27 63 27 3a 20 0a 20 20 20    case 'c': .   
4b20: 20 20 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26     if( nBuf>4 &&
4b30: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 6e 63 65   0==memcmp("ance
4b40: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d  ", &aBuf[nBuf-4]
4b50: 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 4) ){.        
4b60: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
4b70: 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 34  Gt1(aBuf, nBuf-4
4b80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  ) ){.          *
4b90: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34  pnBuf = nBuf - 4
4ba0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4bb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66    }else if( nBuf
4bc0: 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >4 && 0==memcmp(
4bd0: 22 65 6e 63 65 22 2c 20 26 61 42 75 66 5b 6e 42  "ence", &aBuf[nB
4be0: 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20  uf-4], 4) ){.   
4bf0: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
4c00: 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e  ter_MGt1(aBuf, n
4c10: 42 75 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20  Buf-4) ){.      
4c20: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
4c30: 66 20 2d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  f - 4;.        }
4c40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4c50: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73  reak;.  .    cas
4c60: 65 20 27 65 27 3a 20 0a 20 20 20 20 20 20 69 66  e 'e': .      if
4c70: 28 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d  ( nBuf>2 && 0==m
4c80: 65 6d 63 6d 70 28 22 65 72 22 2c 20 26 61 42 75  emcmp("er", &aBu
4c90: 66 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b  f[nBuf-2], 2) ){
4ca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
4cb0: 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75  5Porter_MGt1(aBu
4cc0: 66 2c 20 6e 42 75 66 2d 32 29 20 29 7b 0a 20 20  f, nBuf-2) ){.  
4cd0: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
4ce0: 20 6e 42 75 66 20 2d 20 32 3b 0a 20 20 20 20 20   nBuf - 2;.     
4cf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
4d00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20     break;.  .   
4d10: 20 63 61 73 65 20 27 69 27 3a 20 0a 20 20 20 20   case 'i': .    
4d20: 20 20 69 66 28 20 6e 42 75 66 3e 32 20 26 26 20    if( nBuf>2 && 
4d30: 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 63 22 2c 20  0==memcmp("ic", 
4d40: 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 32  &aBuf[nBuf-2], 2
4d50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
4d60: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31   fts5Porter_MGt1
4d70: 28 61 42 75 66 2c 20 6e 42 75 66 2d 32 29 20 29  (aBuf, nBuf-2) )
4d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  {.          *pnB
4d90: 75 66 20 3d 20 6e 42 75 66 20 2d 20 32 3b 0a 20  uf = nBuf - 2;. 
4da0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4db0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4dc0: 0a 20 20 20 20 63 61 73 65 20 27 6c 27 3a 20 0a  .    case 'l': .
4dd0: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 34        if( nBuf>4
4de0: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61   && 0==memcmp("a
4df0: 62 6c 65 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  ble", &aBuf[nBuf
4e00: 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  -4], 4) ){.     
4e10: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
4e20: 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75  r_MGt1(aBuf, nBu
4e30: 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-4) ){.        
4e40: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
4e50: 2d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 4;.        }. 
4e60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
4e70: 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>4 && 0==memc
4e80: 6d 70 28 22 69 62 6c 65 22 2c 20 26 61 42 75 66  mp("ible", &aBuf
4e90: 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a  [nBuf-4], 4) ){.
4ea0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
4eb0: 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66  Porter_MGt1(aBuf
4ec0: 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20  , nBuf-4) ){.   
4ed0: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
4ee0: 6e 42 75 66 20 2d 20 34 3b 0a 20 20 20 20 20 20  nBuf - 4;.      
4ef0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4f00: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20    break;.  .    
4f10: 63 61 73 65 20 27 6e 27 3a 20 0a 20 20 20 20 20  case 'n': .     
4f20: 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30   if( nBuf>3 && 0
4f30: 3d 3d 6d 65 6d 63 6d 70 28 22 61 6e 74 22 2c 20  ==memcmp("ant", 
4f40: 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33  &aBuf[nBuf-3], 3
4f50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
4f60: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31   fts5Porter_MGt1
4f70: 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29  (aBuf, nBuf-3) )
4f80: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  {.          *pnB
4f90: 75 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20  uf = nBuf - 3;. 
4fa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4fb0: 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 35 20  else if( nBuf>5 
4fc0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65 6d  && 0==memcmp("em
4fd0: 65 6e 74 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  ent", &aBuf[nBuf
4fe0: 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  -5], 5) ){.     
4ff0: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
5000: 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75  r_MGt1(aBuf, nBu
5010: 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-5) ){.        
5020: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
5030: 2d 20 35 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 5;.        }. 
5040: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
5050: 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>4 && 0==memc
5060: 6d 70 28 22 6d 65 6e 74 22 2c 20 26 61 42 75 66  mp("ment", &aBuf
5070: 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a  [nBuf-4], 4) ){.
5080: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
5090: 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66  Porter_MGt1(aBuf
50a0: 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20  , nBuf-4) ){.   
50b0: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
50c0: 6e 42 75 66 20 2d 20 34 3b 0a 20 20 20 20 20 20  nBuf - 4;.      
50d0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
50e0: 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d  if( nBuf>3 && 0=
50f0: 3d 6d 65 6d 63 6d 70 28 22 65 6e 74 22 2c 20 26  =memcmp("ent", &
5100: 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29  aBuf[nBuf-3], 3)
5110: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5120: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28  fts5Porter_MGt1(
5130: 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b  aBuf, nBuf-3) ){
5140: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
5150: 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20  f = nBuf - 3;.  
5160: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5170: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
5180: 20 20 20 20 63 61 73 65 20 27 6f 27 3a 20 0a 20      case 'o': . 
5190: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20       if( nBuf>3 
51a0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 6f  && 0==memcmp("io
51b0: 6e 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33  n", &aBuf[nBuf-3
51c0: 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 3) ){.       
51d0: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
51e0: 4d 47 74 31 5f 61 6e 64 5f 53 5f 6f 72 5f 54 28  MGt1_and_S_or_T(
51f0: 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b  aBuf, nBuf-3) ){
5200: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
5210: 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20  f = nBuf - 3;.  
5220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5230: 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 32 20 26  lse if( nBuf>2 &
5240: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 6f 75 22  & 0==memcmp("ou"
5250: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c  , &aBuf[nBuf-2],
5260: 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   2) ){.        i
5270: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
5280: 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 32 29  t1(aBuf, nBuf-2)
5290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
52a0: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 32 3b  nBuf = nBuf - 2;
52b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
52c0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
52d0: 20 20 0a 20 20 20 20 63 61 73 65 20 27 73 27 3a    .    case 's':
52e0: 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66   .      if( nBuf
52f0: 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >3 && 0==memcmp(
5300: 22 69 73 6d 22 2c 20 26 61 42 75 66 5b 6e 42 75  "ism", &aBuf[nBu
5310: 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20  f-3], 3) ){.    
5320: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
5330: 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42  er_MGt1(aBuf, nB
5340: 75 66 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-3) ){.       
5350: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
5360: 20 2d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 3;.        }.
5370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5380: 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65  eak;.  .    case
5390: 20 27 74 27 3a 20 0a 20 20 20 20 20 20 69 66 28   't': .      if(
53a0: 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65   nBuf>3 && 0==me
53b0: 6d 63 6d 70 28 22 61 74 65 22 2c 20 26 61 42 75  mcmp("ate", &aBu
53c0: 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b  f[nBuf-3], 3) ){
53d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
53e0: 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75  5Porter_MGt1(aBu
53f0: 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20  f, nBuf-3) ){.  
5400: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
5410: 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20 20   nBuf - 3;.     
5420: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
5430: 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30   if( nBuf>3 && 0
5440: 3d 3d 6d 65 6d 63 6d 70 28 22 69 74 69 22 2c 20  ==memcmp("iti", 
5450: 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33  &aBuf[nBuf-3], 3
5460: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
5470: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31   fts5Porter_MGt1
5480: 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29  (aBuf, nBuf-3) )
5490: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  {.          *pnB
54a0: 75 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20  uf = nBuf - 3;. 
54b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
54c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
54d0: 0a 20 20 20 20 63 61 73 65 20 27 75 27 3a 20 0a  .    case 'u': .
54e0: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 33        if( nBuf>3
54f0: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 6f   && 0==memcmp("o
5500: 75 73 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  us", &aBuf[nBuf-
5510: 33 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20  3], 3) ){.      
5520: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
5530: 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66  _MGt1(aBuf, nBuf
5540: 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -3) ){.         
5550: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
5560: 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   3;.        }.  
5570: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5580: 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27  k;.  .    case '
5590: 76 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e  v': .      if( n
55a0: 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>3 && 0==memc
55b0: 6d 70 28 22 69 76 65 22 2c 20 26 61 42 75 66 5b  mp("ive", &aBuf[
55c0: 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20  nBuf-3], 3) ){. 
55d0: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
55e0: 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c  orter_MGt1(aBuf,
55f0: 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20 20 20   nBuf-3) ){.    
5600: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
5610: 42 75 66 20 2d 20 33 3b 0a 20 20 20 20 20 20 20  Buf - 3;.       
5620: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5630: 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63   break;.  .    c
5640: 61 73 65 20 27 7a 27 3a 20 0a 20 20 20 20 20 20  ase 'z': .      
5650: 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d  if( nBuf>3 && 0=
5660: 3d 6d 65 6d 63 6d 70 28 22 69 7a 65 22 2c 20 26  =memcmp("ize", &
5670: 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29  aBuf[nBuf-3], 3)
5680: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5690: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28  fts5Porter_MGt1(
56a0: 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b  aBuf, nBuf-3) ){
56b0: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
56c0: 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20  f = nBuf - 3;.  
56d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
56e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
56f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
5700: 3b 0a 7d 0a 20 20 0a 0a 73 74 61 74 69 63 20 69  ;.}.  ..static i
5710: 6e 74 20 66 74 73 35 50 6f 72 74 65 72 53 74 65  nt fts5PorterSte
5720: 70 31 42 32 28 63 68 61 72 20 2a 61 42 75 66 2c  p1B2(char *aBuf,
5730: 20 69 6e 74 20 2a 70 6e 42 75 66 29 7b 0a 20 20   int *pnBuf){.  
5740: 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 69  int ret = 0;.  i
5750: 6e 74 20 6e 42 75 66 20 3d 20 2a 70 6e 42 75 66  nt nBuf = *pnBuf
5760: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 42 75 66  ;.  switch( aBuf
5770: 5b 6e 42 75 66 2d 32 5d 20 29 7b 0a 20 20 20 20  [nBuf-2] ){.    
5780: 0a 20 20 20 20 63 61 73 65 20 27 61 27 3a 20 0a  .    case 'a': .
5790: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 32        if( nBuf>2
57a0: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61   && 0==memcmp("a
57b0: 74 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 32  t", &aBuf[nBuf-2
57c0: 5d 2c 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 2) ){.       
57d0: 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42   memcpy(&aBuf[nB
57e0: 75 66 2d 32 5d 2c 20 22 61 74 65 22 2c 20 33 29  uf-2], "ate", 3)
57f0: 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66  ;.        *pnBuf
5800: 20 3d 20 6e 42 75 66 20 2d 20 32 20 2b 20 33 3b   = nBuf - 2 + 3;
5810: 0a 20 20 20 20 20 20 20 20 72 65 74 20 3d 20 31  .        ret = 1
5820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5830: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61  break;.  .    ca
5840: 73 65 20 27 62 27 3a 20 0a 20 20 20 20 20 20 69  se 'b': .      i
5850: 66 28 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d  f( nBuf>2 && 0==
5860: 6d 65 6d 63 6d 70 28 22 62 6c 22 2c 20 26 61 42  memcmp("bl", &aB
5870: 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29  uf[nBuf-2], 2) )
5880: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
5890: 28 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20  (&aBuf[nBuf-2], 
58a0: 22 62 6c 65 22 2c 20 33 29 3b 0a 20 20 20 20 20  "ble", 3);.     
58b0: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
58c0: 20 2d 20 32 20 2b 20 33 3b 0a 20 20 20 20 20 20   - 2 + 3;.      
58d0: 20 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 20    ret = 1;.     
58e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
58f0: 20 20 0a 20 20 20 20 63 61 73 65 20 27 69 27 3a    .    case 'i':
5900: 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66   .      if( nBuf
5910: 3e 32 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >2 && 0==memcmp(
5920: 22 69 7a 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  "iz", &aBuf[nBuf
5930: 2d 32 5d 2c 20 32 29 20 29 7b 0a 20 20 20 20 20  -2], 2) ){.     
5940: 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b     memcpy(&aBuf[
5950: 6e 42 75 66 2d 32 5d 2c 20 22 69 7a 65 22 2c 20  nBuf-2], "ize", 
5960: 33 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 42  3);.        *pnB
5970: 75 66 20 3d 20 6e 42 75 66 20 2d 20 32 20 2b 20  uf = nBuf - 2 + 
5980: 33 3b 0a 20 20 20 20 20 20 20 20 72 65 74 20 3d  3;.        ret =
5990: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
59a0: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 7d 0a    break;.  .  }.
59b0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
59c0: 20 20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66    ..static int f
59d0: 74 73 35 50 6f 72 74 65 72 53 74 65 70 32 28 63  ts5PorterStep2(c
59e0: 68 61 72 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a  har *aBuf, int *
59f0: 70 6e 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 65  pnBuf){.  int re
5a00: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 75  t = 0;.  int nBu
5a10: 66 20 3d 20 2a 70 6e 42 75 66 3b 0a 20 20 73 77  f = *pnBuf;.  sw
5a20: 69 74 63 68 28 20 61 42 75 66 5b 6e 42 75 66 2d  itch( aBuf[nBuf-
5a30: 32 5d 20 29 7b 0a 20 20 20 20 0a 20 20 20 20 63  2] ){.    .    c
5a40: 61 73 65 20 27 61 27 3a 20 0a 20 20 20 20 20 20  ase 'a': .      
5a50: 69 66 28 20 6e 42 75 66 3e 37 20 26 26 20 30 3d  if( nBuf>7 && 0=
5a60: 3d 6d 65 6d 63 6d 70 28 22 61 74 69 6f 6e 61 6c  =memcmp("ational
5a70: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d  ", &aBuf[nBuf-7]
5a80: 2c 20 37 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 7) ){.        
5a90: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
5aa0: 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 37  Gt0(aBuf, nBuf-7
5ab0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
5ac0: 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66  emcpy(&aBuf[nBuf
5ad0: 2d 37 5d 2c 20 22 61 74 65 22 2c 20 33 29 3b 0a  -7], "ate", 3);.
5ae0: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
5af0: 20 3d 20 6e 42 75 66 20 2d 20 37 20 2b 20 33 3b   = nBuf - 7 + 3;
5b00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b10: 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e   }else if( nBuf>
5b20: 36 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  6 && 0==memcmp("
5b30: 74 69 6f 6e 61 6c 22 2c 20 26 61 42 75 66 5b 6e  tional", &aBuf[n
5b40: 42 75 66 2d 36 5d 2c 20 36 29 20 29 7b 0a 20 20  Buf-6], 6) ){.  
5b50: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
5b60: 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20  rter_MGt0(aBuf, 
5b70: 6e 42 75 66 2d 36 29 20 29 7b 0a 20 20 20 20 20  nBuf-6) ){.     
5b80: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75       memcpy(&aBu
5b90: 66 5b 6e 42 75 66 2d 36 5d 2c 20 22 74 69 6f 6e  f[nBuf-6], "tion
5ba0: 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 4);.         
5bb0: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
5bc0: 20 36 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20   6 + 4;.        
5bd0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5be0: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61  break;.  .    ca
5bf0: 73 65 20 27 63 27 3a 20 0a 20 20 20 20 20 20 69  se 'c': .      i
5c00: 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d  f( nBuf>4 && 0==
5c10: 6d 65 6d 63 6d 70 28 22 65 6e 63 69 22 2c 20 26  memcmp("enci", &
5c20: 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29  aBuf[nBuf-4], 4)
5c30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5c40: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
5c50: 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b  aBuf, nBuf-4) ){
5c60: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
5c70: 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c  y(&aBuf[nBuf-4],
5c80: 20 22 65 6e 63 65 22 2c 20 34 29 3b 0a 20 20 20   "ence", 4);.   
5c90: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
5ca0: 6e 42 75 66 20 2d 20 34 20 2b 20 34 3b 0a 20 20  nBuf - 4 + 4;.  
5cb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5cc0: 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 34 20 26  lse if( nBuf>4 &
5cd0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 6e 63  & 0==memcmp("anc
5ce0: 69 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34  i", &aBuf[nBuf-4
5cf0: 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 4) ){.       
5d00: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
5d10: 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d  MGt0(aBuf, nBuf-
5d20: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4) ){.          
5d30: 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75  memcpy(&aBuf[nBu
5d40: 66 2d 34 5d 2c 20 22 61 6e 63 65 22 2c 20 34 29  f-4], "ance", 4)
5d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  ;.          *pnB
5d60: 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 20 2b 20  uf = nBuf - 4 + 
5d70: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
5d80: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
5d90: 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27 65  ;.  .    case 'e
5da0: 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42  ': .      if( nB
5db0: 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>4 && 0==memcm
5dc0: 70 28 22 69 7a 65 72 22 2c 20 26 61 42 75 66 5b  p("izer", &aBuf[
5dd0: 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20  nBuf-4], 4) ){. 
5de0: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
5df0: 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c  orter_MGt0(aBuf,
5e00: 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20 20 20   nBuf-4) ){.    
5e10: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42        memcpy(&aB
5e20: 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 22 69 7a 65  uf[nBuf-4], "ize
5e30: 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 3);.         
5e40: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
5e50: 20 34 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20   4 + 3;.        
5e60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5e70: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61  break;.  .    ca
5e80: 73 65 20 27 67 27 3a 20 0a 20 20 20 20 20 20 69  se 'g': .      i
5e90: 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d  f( nBuf>4 && 0==
5ea0: 6d 65 6d 63 6d 70 28 22 6c 6f 67 69 22 2c 20 26  memcmp("logi", &
5eb0: 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29  aBuf[nBuf-4], 4)
5ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5ed0: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
5ee0: 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b  aBuf, nBuf-4) ){
5ef0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
5f00: 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c  y(&aBuf[nBuf-4],
5f10: 20 22 6c 6f 67 22 2c 20 33 29 3b 0a 20 20 20 20   "log", 3);.    
5f20: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
5f30: 42 75 66 20 2d 20 34 20 2b 20 33 3b 0a 20 20 20  Buf - 4 + 3;.   
5f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20       break;.  . 
5f60: 20 20 20 63 61 73 65 20 27 6c 27 3a 20 0a 20 20     case 'l': .  
5f70: 20 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26      if( nBuf>3 &
5f80: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 62 6c 69  & 0==memcmp("bli
5f90: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d  ", &aBuf[nBuf-3]
5fa0: 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 3) ){.        
5fb0: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
5fc0: 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 33  Gt0(aBuf, nBuf-3
5fd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
5fe0: 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66  emcpy(&aBuf[nBuf
5ff0: 2d 33 5d 2c 20 22 62 6c 65 22 2c 20 33 29 3b 0a  -3], "ble", 3);.
6000: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
6010: 20 3d 20 6e 42 75 66 20 2d 20 33 20 2b 20 33 3b   = nBuf - 3 + 3;
6020: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6030: 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e   }else if( nBuf>
6040: 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  4 && 0==memcmp("
6050: 61 6c 6c 69 22 2c 20 26 61 42 75 66 5b 6e 42 75  alli", &aBuf[nBu
6060: 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20  f-4], 4) ){.    
6070: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
6080: 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42  er_MGt0(aBuf, nB
6090: 75 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-4) ){.       
60a0: 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b     memcpy(&aBuf[
60b0: 6e 42 75 66 2d 34 5d 2c 20 22 61 6c 22 2c 20 32  nBuf-4], "al", 2
60c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  );.          *pn
60d0: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 20 2b  Buf = nBuf - 4 +
60e0: 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
60f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42      }else if( nB
6100: 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>5 && 0==memcm
6110: 70 28 22 65 6e 74 6c 69 22 2c 20 26 61 42 75 66  p("entli", &aBuf
6120: 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a  [nBuf-5], 5) ){.
6130: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
6140: 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66  Porter_MGt0(aBuf
6150: 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20 20 20  , nBuf-5) ){.   
6160: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
6170: 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 22 65 6e  Buf[nBuf-5], "en
6180: 74 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  t", 3);.        
6190: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
61a0: 2d 20 35 20 2b 20 33 3b 0a 20 20 20 20 20 20 20  - 5 + 3;.       
61b0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
61c0: 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d  f( nBuf>3 && 0==
61d0: 6d 65 6d 63 6d 70 28 22 65 6c 69 22 2c 20 26 61  memcmp("eli", &a
61e0: 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20  Buf[nBuf-3], 3) 
61f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
6200: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61  ts5Porter_MGt0(a
6210: 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a  Buf, nBuf-3) ){.
6220: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6230: 28 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20  (&aBuf[nBuf-3], 
6240: 22 65 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  "e", 1);.       
6250: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
6260: 20 2d 20 33 20 2b 20 31 3b 0a 20 20 20 20 20 20   - 3 + 1;.      
6270: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
6280: 69 66 28 20 6e 42 75 66 3e 35 20 26 26 20 30 3d  if( nBuf>5 && 0=
6290: 3d 6d 65 6d 63 6d 70 28 22 6f 75 73 6c 69 22 2c  =memcmp("ousli",
62a0: 20 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20   &aBuf[nBuf-5], 
62b0: 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  5) ){.        if
62c0: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
62d0: 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 35 29 20  0(aBuf, nBuf-5) 
62e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
62f0: 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 35  cpy(&aBuf[nBuf-5
6300: 5d 2c 20 22 6f 75 73 22 2c 20 33 29 3b 0a 20 20  ], "ous", 3);.  
6310: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
6320: 20 6e 42 75 66 20 2d 20 35 20 2b 20 33 3b 0a 20   nBuf - 5 + 3;. 
6330: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6340: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6350: 0a 20 20 20 20 63 61 73 65 20 27 6f 27 3a 20 0a  .    case 'o': .
6360: 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 37        if( nBuf>7
6370: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69   && 0==memcmp("i
6380: 7a 61 74 69 6f 6e 22 2c 20 26 61 42 75 66 5b 6e  zation", &aBuf[n
6390: 42 75 66 2d 37 5d 2c 20 37 29 20 29 7b 0a 20 20  Buf-7], 7) ){.  
63a0: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
63b0: 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20  rter_MGt0(aBuf, 
63c0: 6e 42 75 66 2d 37 29 20 29 7b 0a 20 20 20 20 20  nBuf-7) ){.     
63d0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75       memcpy(&aBu
63e0: 66 5b 6e 42 75 66 2d 37 5d 2c 20 22 69 7a 65 22  f[nBuf-7], "ize"
63f0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
6400: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
6410: 37 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 7d  7 + 3;.        }
6420: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6430: 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65   nBuf>5 && 0==me
6440: 6d 63 6d 70 28 22 61 74 69 6f 6e 22 2c 20 26 61  mcmp("ation", &a
6450: 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20  Buf[nBuf-5], 5) 
6460: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
6470: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61  ts5Porter_MGt0(a
6480: 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a  Buf, nBuf-5) ){.
6490: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
64a0: 28 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20  (&aBuf[nBuf-5], 
64b0: 22 61 74 65 22 2c 20 33 29 3b 0a 20 20 20 20 20  "ate", 3);.     
64c0: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
64d0: 75 66 20 2d 20 35 20 2b 20 33 3b 0a 20 20 20 20  uf - 5 + 3;.    
64e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
64f0: 65 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20  e if( nBuf>4 && 
6500: 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 74 6f 72 22  0==memcmp("ator"
6510: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c  , &aBuf[nBuf-4],
6520: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   4) ){.        i
6530: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
6540: 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29  t0(aBuf, nBuf-4)
6550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
6560: 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d  mcpy(&aBuf[nBuf-
6570: 34 5d 2c 20 22 61 74 65 22 2c 20 33 29 3b 0a 20  4], "ate", 3);. 
6580: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
6590: 3d 20 6e 42 75 66 20 2d 20 34 20 2b 20 33 3b 0a  = nBuf - 4 + 3;.
65a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
65b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
65c0: 20 0a 20 20 20 20 63 61 73 65 20 27 73 27 3a 20   .    case 's': 
65d0: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e  .      if( nBuf>
65e0: 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  5 && 0==memcmp("
65f0: 61 6c 69 73 6d 22 2c 20 26 61 42 75 66 5b 6e 42  alism", &aBuf[nB
6600: 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20  uf-5], 5) ){.   
6610: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
6620: 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e  ter_MGt0(aBuf, n
6630: 42 75 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20  Buf-5) ){.      
6640: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66      memcpy(&aBuf
6650: 5b 6e 42 75 66 2d 35 5d 2c 20 22 61 6c 22 2c 20  [nBuf-5], "al", 
6660: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  2);.          *p
6670: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 35 20  nBuf = nBuf - 5 
6680: 2b 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  + 2;.        }. 
6690: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
66a0: 42 75 66 3e 37 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>7 && 0==memc
66b0: 6d 70 28 22 69 76 65 6e 65 73 73 22 2c 20 26 61  mp("iveness", &a
66c0: 42 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 37 29 20  Buf[nBuf-7], 7) 
66d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
66e0: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61  ts5Porter_MGt0(a
66f0: 42 75 66 2c 20 6e 42 75 66 2d 37 29 20 29 7b 0a  Buf, nBuf-7) ){.
6700: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6710: 28 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d 2c 20  (&aBuf[nBuf-7], 
6720: 22 69 76 65 22 2c 20 33 29 3b 0a 20 20 20 20 20  "ive", 3);.     
6730: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
6740: 75 66 20 2d 20 37 20 2b 20 33 3b 0a 20 20 20 20  uf - 7 + 3;.    
6750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6760: 65 20 69 66 28 20 6e 42 75 66 3e 37 20 26 26 20  e if( nBuf>7 && 
6770: 30 3d 3d 6d 65 6d 63 6d 70 28 22 66 75 6c 6e 65  0==memcmp("fulne
6780: 73 73 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  ss", &aBuf[nBuf-
6790: 37 5d 2c 20 37 29 20 29 7b 0a 20 20 20 20 20 20  7], 7) ){.      
67a0: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
67b0: 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66  _MGt0(aBuf, nBuf
67c0: 2d 37 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -7) ){.         
67d0: 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42   memcpy(&aBuf[nB
67e0: 75 66 2d 37 5d 2c 20 22 66 75 6c 22 2c 20 33 29  uf-7], "ful", 3)
67f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  ;.          *pnB
6800: 75 66 20 3d 20 6e 42 75 66 20 2d 20 37 20 2b 20  uf = nBuf - 7 + 
6810: 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  3;.        }.   
6820: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75     }else if( nBu
6830: 66 3e 37 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  f>7 && 0==memcmp
6840: 28 22 6f 75 73 6e 65 73 73 22 2c 20 26 61 42 75  ("ousness", &aBu
6850: 66 5b 6e 42 75 66 2d 37 5d 2c 20 37 29 20 29 7b  f[nBuf-7], 7) ){
6860: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
6870: 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75  5Porter_MGt0(aBu
6880: 66 2c 20 6e 42 75 66 2d 37 29 20 29 7b 0a 20 20  f, nBuf-7) ){.  
6890: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
68a0: 61 42 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 22 6f  aBuf[nBuf-7], "o
68b0: 75 73 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  us", 3);.       
68c0: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
68d0: 20 2d 20 37 20 2b 20 33 3b 0a 20 20 20 20 20 20   - 7 + 3;.      
68e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
68f0: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20    break;.  .    
6900: 63 61 73 65 20 27 74 27 3a 20 0a 20 20 20 20 20  case 't': .     
6910: 20 69 66 28 20 6e 42 75 66 3e 35 20 26 26 20 30   if( nBuf>5 && 0
6920: 3d 3d 6d 65 6d 63 6d 70 28 22 61 6c 69 74 69 22  ==memcmp("aliti"
6930: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c  , &aBuf[nBuf-5],
6940: 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   5) ){.        i
6950: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
6960: 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 35 29  t0(aBuf, nBuf-5)
6970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
6980: 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d  mcpy(&aBuf[nBuf-
6990: 35 5d 2c 20 22 61 6c 22 2c 20 32 29 3b 0a 20 20  5], "al", 2);.  
69a0: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
69b0: 20 6e 42 75 66 20 2d 20 35 20 2b 20 32 3b 0a 20   nBuf - 5 + 2;. 
69c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
69d0: 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 35 20  else if( nBuf>5 
69e0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 76  && 0==memcmp("iv
69f0: 69 74 69 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  iti", &aBuf[nBuf
6a00: 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  -5], 5) ){.     
6a10: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
6a20: 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75  r_MGt0(aBuf, nBu
6a30: 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-5) ){.        
6a40: 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e    memcpy(&aBuf[n
6a50: 42 75 66 2d 35 5d 2c 20 22 69 76 65 22 2c 20 33  Buf-5], "ive", 3
6a60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  );.          *pn
6a70: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 35 20 2b  Buf = nBuf - 5 +
6a80: 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   3;.        }.  
6a90: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42      }else if( nB
6aa0: 75 66 3e 36 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>6 && 0==memcm
6ab0: 70 28 22 62 69 6c 69 74 69 22 2c 20 26 61 42 75  p("biliti", &aBu
6ac0: 66 5b 6e 42 75 66 2d 36 5d 2c 20 36 29 20 29 7b  f[nBuf-6], 6) ){
6ad0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
6ae0: 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75  5Porter_MGt0(aBu
6af0: 66 2c 20 6e 42 75 66 2d 36 29 20 29 7b 0a 20 20  f, nBuf-6) ){.  
6b00: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
6b10: 61 42 75 66 5b 6e 42 75 66 2d 36 5d 2c 20 22 62  aBuf[nBuf-6], "b
6b20: 6c 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  le", 3);.       
6b30: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
6b40: 20 2d 20 36 20 2b 20 33 3b 0a 20 20 20 20 20 20   - 6 + 3;.      
6b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6b60: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 7d 0a    break;.  .  }.
6b70: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
6b80: 20 20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66    ..static int f
6b90: 74 73 35 50 6f 72 74 65 72 53 74 65 70 33 28 63  ts5PorterStep3(c
6ba0: 68 61 72 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a  har *aBuf, int *
6bb0: 70 6e 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 65  pnBuf){.  int re
6bc0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 75  t = 0;.  int nBu
6bd0: 66 20 3d 20 2a 70 6e 42 75 66 3b 0a 20 20 73 77  f = *pnBuf;.  sw
6be0: 69 74 63 68 28 20 61 42 75 66 5b 6e 42 75 66 2d  itch( aBuf[nBuf-
6bf0: 32 5d 20 29 7b 0a 20 20 20 20 0a 20 20 20 20 63  2] ){.    .    c
6c00: 61 73 65 20 27 61 27 3a 20 0a 20 20 20 20 20 20  ase 'a': .      
6c10: 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d  if( nBuf>4 && 0=
6c20: 3d 6d 65 6d 63 6d 70 28 22 69 63 61 6c 22 2c 20  =memcmp("ical", 
6c30: 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34  &aBuf[nBuf-4], 4
6c40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
6c50: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30   fts5Porter_MGt0
6c60: 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29  (aBuf, nBuf-4) )
6c70: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
6c80: 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d  py(&aBuf[nBuf-4]
6c90: 2c 20 22 69 63 22 2c 20 32 29 3b 0a 20 20 20 20  , "ic", 2);.    
6ca0: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
6cb0: 42 75 66 20 2d 20 34 20 2b 20 32 3b 0a 20 20 20  Buf - 4 + 2;.   
6cc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6cd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20       break;.  . 
6ce0: 20 20 20 63 61 73 65 20 27 73 27 3a 20 0a 20 20     case 's': .  
6cf0: 20 20 20 20 69 66 28 20 6e 42 75 66 3e 34 20 26      if( nBuf>4 &
6d00: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 6e 65 73  & 0==memcmp("nes
6d10: 73 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34  s", &aBuf[nBuf-4
6d20: 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 4) ){.       
6d30: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
6d40: 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d  MGt0(aBuf, nBuf-
6d50: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4) ){.          
6d60: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
6d70: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
6d80: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6d90: 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27 74  ;.  .    case 't
6da0: 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42  ': .      if( nB
6db0: 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>5 && 0==memcm
6dc0: 70 28 22 69 63 61 74 65 22 2c 20 26 61 42 75 66  p("icate", &aBuf
6dd0: 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a  [nBuf-5], 5) ){.
6de0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
6df0: 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66  Porter_MGt0(aBuf
6e00: 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20 20 20  , nBuf-5) ){.   
6e10: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
6e20: 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 22 69 63  Buf[nBuf-5], "ic
6e30: 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 2);.         
6e40: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
6e50: 20 35 20 2b 20 32 3b 0a 20 20 20 20 20 20 20 20   5 + 2;.        
6e60: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
6e70: 28 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d  ( nBuf>5 && 0==m
6e80: 65 6d 63 6d 70 28 22 69 63 69 74 69 22 2c 20 26  emcmp("iciti", &
6e90: 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29  aBuf[nBuf-5], 5)
6ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
6eb0: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
6ec0: 61 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b  aBuf, nBuf-5) ){
6ed0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
6ee0: 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c  y(&aBuf[nBuf-5],
6ef0: 20 22 69 63 22 2c 20 32 29 3b 0a 20 20 20 20 20   "ic", 2);.     
6f00: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
6f10: 75 66 20 2d 20 35 20 2b 20 32 3b 0a 20 20 20 20  uf - 5 + 2;.    
6f20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6f30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20      break;.  .  
6f40: 20 20 63 61 73 65 20 27 75 27 3a 20 0a 20 20 20    case 'u': .   
6f50: 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26     if( nBuf>3 &&
6f60: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 66 75 6c 22   0==memcmp("ful"
6f70: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c  , &aBuf[nBuf-3],
6f80: 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   3) ){.        i
6f90: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
6fa0: 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29  t0(aBuf, nBuf-3)
6fb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
6fc0: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b  nBuf = nBuf - 3;
6fd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6fe0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6ff0: 20 20 0a 20 20 20 20 63 61 73 65 20 27 76 27 3a    .    case 'v':
7000: 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66   .      if( nBuf
7010: 3e 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >5 && 0==memcmp(
7020: 22 61 74 69 76 65 22 2c 20 26 61 42 75 66 5b 6e  "ative", &aBuf[n
7030: 42 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20  Buf-5], 5) ){.  
7040: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
7050: 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20  rter_MGt0(aBuf, 
7060: 6e 42 75 66 2d 35 29 20 29 7b 0a 20 20 20 20 20  nBuf-5) ){.     
7070: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
7080: 75 66 20 2d 20 35 3b 0a 20 20 20 20 20 20 20 20  uf - 5;.        
7090: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
70a0: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61  break;.  .    ca
70b0: 73 65 20 27 7a 27 3a 20 0a 20 20 20 20 20 20 69  se 'z': .      i
70c0: 66 28 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d  f( nBuf>5 && 0==
70d0: 6d 65 6d 63 6d 70 28 22 61 6c 69 7a 65 22 2c 20  memcmp("alize", 
70e0: 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35  &aBuf[nBuf-5], 5
70f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
7100: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30   fts5Porter_MGt0
7110: 28 61 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29  (aBuf, nBuf-5) )
7120: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
7130: 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d  py(&aBuf[nBuf-5]
7140: 2c 20 22 61 6c 22 2c 20 32 29 3b 0a 20 20 20 20  , "al", 2);.    
7150: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
7160: 42 75 66 20 2d 20 35 20 2b 20 32 3b 0a 20 20 20  Buf - 5 + 2;.   
7170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7180: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20       break;.  . 
7190: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
71a0: 0a 7d 0a 20 20 0a 0a 73 74 61 74 69 63 20 69 6e  .}.  ..static in
71b0: 74 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70  t fts5PorterStep
71c0: 31 42 28 63 68 61 72 20 2a 61 42 75 66 2c 20 69  1B(char *aBuf, i
71d0: 6e 74 20 2a 70 6e 42 75 66 29 7b 0a 20 20 69 6e  nt *pnBuf){.  in
71e0: 74 20 72 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t ret = 0;.  int
71f0: 20 6e 42 75 66 20 3d 20 2a 70 6e 42 75 66 3b 0a   nBuf = *pnBuf;.
7200: 20 20 73 77 69 74 63 68 28 20 61 42 75 66 5b 6e    switch( aBuf[n
7210: 42 75 66 2d 32 5d 20 29 7b 0a 20 20 20 20 0a 20  Buf-2] ){.    . 
7220: 20 20 20 63 61 73 65 20 27 65 27 3a 20 0a 20 20     case 'e': .  
7230: 20 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26      if( nBuf>3 &
7240: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65 65 64  & 0==memcmp("eed
7250: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d  ", &aBuf[nBuf-3]
7260: 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 3) ){.        
7270: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
7280: 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 33  Gt0(aBuf, nBuf-3
7290: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
72a0: 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66  emcpy(&aBuf[nBuf
72b0: 2d 33 5d 2c 20 22 65 65 22 2c 20 32 29 3b 0a 20  -3], "ee", 2);. 
72c0: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
72d0: 3d 20 6e 42 75 66 20 2d 20 33 20 2b 20 32 3b 0a  = nBuf - 3 + 2;.
72e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
72f0: 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 32  }else if( nBuf>2
7300: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65   && 0==memcmp("e
7310: 64 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 32  d", &aBuf[nBuf-2
7320: 5d 2c 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 2) ){.       
7330: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
7340: 56 6f 77 65 6c 28 61 42 75 66 2c 20 6e 42 75 66  Vowel(aBuf, nBuf
7350: 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -2) ){.         
7360: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
7370: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   2;.          re
7380: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
7390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
73a0: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73  reak;.  .    cas
73b0: 65 20 27 6e 27 3a 20 0a 20 20 20 20 20 20 69 66  e 'n': .      if
73c0: 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d  ( nBuf>3 && 0==m
73d0: 65 6d 63 6d 70 28 22 69 6e 67 22 2c 20 26 61 42  emcmp("ing", &aB
73e0: 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29  uf[nBuf-3], 3) )
73f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
7400: 73 35 50 6f 72 74 65 72 5f 56 6f 77 65 6c 28 61  s5Porter_Vowel(a
7410: 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a  Buf, nBuf-3) ){.
7420: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
7430: 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20   = nBuf - 3;.   
7440: 20 20 20 20 20 20 20 72 65 74 20 3d 20 31 3b 0a         ret = 1;.
7450: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7460: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7470: 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
7480: 65 74 3b 0a 7d 0a 20 20 0a 2f 2a 20 0a 2a 2a 20  et;.}.  ./* .** 
7490: 47 45 4e 45 52 41 54 45 44 20 43 4f 44 45 20 45  GENERATED CODE E
74a0: 4e 44 53 20 48 45 52 45 20 28 6d 6b 70 6f 72 74  NDS HERE (mkport
74b0: 65 72 73 74 65 70 73 2e 74 63 6c 29 0a 2a 2a 2a  ersteps.tcl).***
74c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  ***/..static voi
7560: 64 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70  d fts5PorterStep
7570: 31 41 28 63 68 61 72 20 2a 61 42 75 66 2c 20 69  1A(char *aBuf, i
7580: 6e 74 20 2a 70 6e 42 75 66 29 7b 0a 20 20 69 6e  nt *pnBuf){.  in
7590: 74 20 6e 42 75 66 20 3d 20 2a 70 6e 42 75 66 3b  t nBuf = *pnBuf;
75a0: 0a 20 20 69 66 28 20 61 42 75 66 5b 6e 42 75 66  .  if( aBuf[nBuf
75b0: 2d 31 5d 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  -1]=='s' ){.    
75c0: 69 66 28 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d  if( aBuf[nBuf-2]
75d0: 3d 3d 27 65 27 20 29 7b 0a 20 20 20 20 20 20 69  =='e' ){.      i
75e0: 66 28 20 28 6e 42 75 66 3e 34 20 26 26 20 61 42  f( (nBuf>4 && aB
75f0: 75 66 5b 6e 42 75 66 2d 34 5d 3d 3d 27 73 27 20  uf[nBuf-4]=='s' 
7600: 26 26 20 61 42 75 66 5b 6e 42 75 66 2d 33 5d 3d  && aBuf[nBuf-3]=
7610: 3d 27 73 27 29 20 0a 20 20 20 20 20 20 20 7c 7c  ='s') .       ||
7620: 20 28 6e 42 75 66 3e 33 20 26 26 20 61 42 75 66   (nBuf>3 && aBuf
7630: 5b 6e 42 75 66 2d 33 5d 3d 3d 27 69 27 20 29 0a  [nBuf-3]=='i' ).
7640: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
7650: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 2d 32   *pnBuf = nBuf-2
7660: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7670: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
7680: 6e 42 75 66 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  nBuf-1;.      }.
7690: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
76a0: 66 28 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d 21  f( aBuf[nBuf-2]!
76b0: 3d 27 73 27 20 29 7b 0a 20 20 20 20 20 20 2a 70  ='s' ){.      *p
76c0: 6e 42 75 66 20 3d 20 6e 42 75 66 2d 31 3b 0a 20  nBuf = nBuf-1;. 
76d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
76e0: 69 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65  ic int fts5Porte
76f0: 72 43 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  rCb(.  void *pCt
7700: 78 2c 20 0a 20 20 69 6e 74 20 74 66 6c 61 67 73  x, .  int tflags
7710: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7720: 70 54 6f 6b 65 6e 2c 20 0a 20 20 69 6e 74 20 6e  pToken, .  int n
7730: 54 6f 6b 65 6e 2c 20 0a 20 20 69 6e 74 20 69 53  Token, .  int iS
7740: 74 61 72 74 2c 20 0a 20 20 69 6e 74 20 69 45 6e  tart, .  int iEn
7750: 64 0a 29 7b 0a 20 20 50 6f 72 74 65 72 43 6f 6e  d.){.  PorterCon
7760: 74 65 78 74 20 2a 70 20 3d 20 28 50 6f 72 74 65  text *p = (Porte
7770: 72 43 6f 6e 74 65 78 74 2a 29 70 43 74 78 3b 0a  rContext*)pCtx;.
7780: 0a 20 20 63 68 61 72 20 2a 61 42 75 66 3b 0a 20  .  char *aBuf;. 
7790: 20 69 6e 74 20 6e 42 75 66 3b 0a 0a 20 20 69 66   int nBuf;..  if
77a0: 28 20 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 50 4f  ( nToken>FTS5_PO
77b0: 52 54 45 52 5f 4d 41 58 5f 54 4f 4b 45 4e 20 7c  RTER_MAX_TOKEN |
77c0: 7c 20 6e 54 6f 6b 65 6e 3c 33 20 29 20 67 6f 74  | nToken<3 ) got
77d0: 6f 20 70 61 73 73 5f 74 68 72 6f 75 67 68 3b 0a  o pass_through;.
77e0: 20 20 61 42 75 66 20 3d 20 70 2d 3e 61 42 75 66    aBuf = p->aBuf
77f0: 3b 0a 20 20 6e 42 75 66 20 3d 20 6e 54 6f 6b 65  ;.  nBuf = nToke
7800: 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 61 42 75 66  n;.  memcpy(aBuf
7810: 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 75 66 29 3b  , pToken, nBuf);
7820: 0a 0a 20 20 2f 2a 20 53 74 65 70 20 31 2e 20 2a  ..  /* Step 1. *
7830: 2f 0a 20 20 66 74 73 35 50 6f 72 74 65 72 53 74  /.  fts5PorterSt
7840: 65 70 31 41 28 61 42 75 66 2c 20 26 6e 42 75 66  ep1A(aBuf, &nBuf
7850: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 50 6f 72  );.  if( fts5Por
7860: 74 65 72 53 74 65 70 31 42 28 61 42 75 66 2c 20  terStep1B(aBuf, 
7870: 26 6e 42 75 66 29 20 29 7b 0a 20 20 20 20 69 66  &nBuf) ){.    if
7880: 28 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70  ( fts5PorterStep
7890: 31 42 32 28 61 42 75 66 2c 20 26 6e 42 75 66 29  1B2(aBuf, &nBuf)
78a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==0 ){.      cha
78b0: 72 20 63 20 3d 20 61 42 75 66 5b 6e 42 75 66 2d  r c = aBuf[nBuf-
78c0: 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  1];.      if( ft
78d0: 73 35 50 6f 72 74 65 72 49 73 56 6f 77 65 6c 28  s5PorterIsVowel(
78e0: 63 2c 20 30 29 3d 3d 30 20 0a 20 20 20 20 20 20  c, 0)==0 .      
78f0: 20 26 26 20 63 21 3d 27 6c 27 20 26 26 20 63 21   && c!='l' && c!
7900: 3d 27 73 27 20 26 26 20 63 21 3d 27 7a 27 20 26  ='s' && c!='z' &
7910: 26 20 63 3d 3d 61 42 75 66 5b 6e 42 75 66 2d 32  & c==aBuf[nBuf-2
7920: 5d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ] .      ){.    
7930: 20 20 20 20 6e 42 75 66 2d 2d 3b 0a 20 20 20 20      nBuf--;.    
7940: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 74 73 35    }else if( fts5
7950: 50 6f 72 74 65 72 5f 4d 45 71 31 28 61 42 75 66  Porter_MEq1(aBuf
7960: 2c 20 6e 42 75 66 29 20 26 26 20 66 74 73 35 50  , nBuf) && fts5P
7970: 6f 72 74 65 72 5f 4f 73 74 61 72 28 61 42 75 66  orter_Ostar(aBuf
7980: 2c 20 6e 42 75 66 29 20 29 7b 0a 20 20 20 20 20  , nBuf) ){.     
7990: 20 20 20 61 42 75 66 5b 6e 42 75 66 2b 2b 5d 20     aBuf[nBuf++] 
79a0: 3d 20 27 65 27 3b 0a 20 20 20 20 20 20 7d 0a 20  = 'e';.      }. 
79b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
79c0: 74 65 70 20 31 43 2e 20 2a 2f 0a 20 20 69 66 28  tep 1C. */.  if(
79d0: 20 61 42 75 66 5b 6e 42 75 66 2d 31 5d 3d 3d 27   aBuf[nBuf-1]=='
79e0: 79 27 20 26 26 20 66 74 73 35 50 6f 72 74 65 72  y' && fts5Porter
79f0: 5f 56 6f 77 65 6c 28 61 42 75 66 2c 20 6e 42 75  _Vowel(aBuf, nBu
7a00: 66 2d 31 29 20 29 7b 0a 20 20 20 20 61 42 75 66  f-1) ){.    aBuf
7a10: 5b 6e 42 75 66 2d 31 5d 20 3d 20 27 69 27 3b 0a  [nBuf-1] = 'i';.
7a20: 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 73 20    }..  /* Steps 
7a30: 32 20 74 68 72 6f 75 67 68 20 34 2e 20 2a 2f 0a  2 through 4. */.
7a40: 20 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70    fts5PorterStep
7a50: 32 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3b 0a  2(aBuf, &nBuf);.
7a60: 20 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70    fts5PorterStep
7a70: 33 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3b 0a  3(aBuf, &nBuf);.
7a80: 20 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70    fts5PorterStep
7a90: 34 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3b 0a  4(aBuf, &nBuf);.
7aa0: 0a 20 20 2f 2a 20 53 74 65 70 20 35 61 2e 20 2a  .  /* Step 5a. *
7ab0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66  /.  assert( nBuf
7ac0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 61 42 75 66  >0 );.  if( aBuf
7ad0: 5b 6e 42 75 66 2d 31 5d 3d 3d 27 65 27 20 29 7b  [nBuf-1]=='e' ){
7ae0: 0a 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72  .    if( fts5Por
7af0: 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e  ter_MGt1(aBuf, n
7b00: 42 75 66 2d 31 29 20 0a 20 20 20 20 20 7c 7c 20  Buf-1) .     || 
7b10: 28 66 74 73 35 50 6f 72 74 65 72 5f 4d 45 71 31  (fts5Porter_MEq1
7b20: 28 61 42 75 66 2c 20 6e 42 75 66 2d 31 29 20 26  (aBuf, nBuf-1) &
7b30: 26 20 21 66 74 73 35 50 6f 72 74 65 72 5f 4f 73  & !fts5Porter_Os
7b40: 74 61 72 28 61 42 75 66 2c 20 6e 42 75 66 2d 31  tar(aBuf, nBuf-1
7b50: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
7b60: 6e 42 75 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nBuf--;.    }.  
7b70: 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 62 2e  }..  /* Step 5b.
7b80: 20 2a 2f 0a 20 20 69 66 28 20 6e 42 75 66 3e 31   */.  if( nBuf>1
7b90: 20 26 26 20 61 42 75 66 5b 6e 42 75 66 2d 31 5d   && aBuf[nBuf-1]
7ba0: 3d 3d 27 6c 27 20 0a 20 20 20 26 26 20 61 42 75  =='l' .   && aBu
7bb0: 66 5b 6e 42 75 66 2d 32 5d 3d 3d 27 6c 27 20 26  f[nBuf-2]=='l' &
7bc0: 26 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  & fts5Porter_MGt
7bd0: 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 31 29 20  1(aBuf, nBuf-1) 
7be0: 0a 20 20 29 7b 0a 20 20 20 20 6e 42 75 66 2d 2d  .  ){.    nBuf--
7bf0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
7c00: 70 2d 3e 78 54 6f 6b 65 6e 28 70 2d 3e 70 43 74  p->xToken(p->pCt
7c10: 78 2c 20 74 66 6c 61 67 73 2c 20 61 42 75 66 2c  x, tflags, aBuf,
7c20: 20 6e 42 75 66 2c 20 69 53 74 61 72 74 2c 20 69   nBuf, iStart, i
7c30: 45 6e 64 29 3b 0a 0a 20 70 61 73 73 5f 74 68 72  End);.. pass_thr
7c40: 6f 75 67 68 3a 0a 20 20 72 65 74 75 72 6e 20 70  ough:.  return p
7c50: 2d 3e 78 54 6f 6b 65 6e 28 70 2d 3e 70 43 74 78  ->xToken(p->pCtx
7c60: 2c 20 74 66 6c 61 67 73 2c 20 70 54 6f 6b 65 6e  , tflags, pToken
7c70: 2c 20 6e 54 6f 6b 65 6e 2c 20 69 53 74 61 72 74  , nToken, iStart
7c80: 2c 20 69 45 6e 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iEnd);.}../*.*
7c90: 2a 20 54 6f 6b 65 6e 69 7a 65 20 75 73 69 6e 67  * Tokenize using
7ca0: 20 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65   the porter toke
7cb0: 6e 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nizer..*/.static
7cc0: 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72 54   int fts5PorterT
7cd0: 6f 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35 54  okenize(.  Fts5T
7ce0: 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e  okenizer *pToken
7cf0: 69 7a 65 72 2c 0a 20 20 76 6f 69 64 20 2a 70 43  izer,.  void *pC
7d00: 74 78 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  tx,.  int flags,
7d10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
7d20: 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c  Text, int nText,
7d30: 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29  .  int (*xToken)
7d40: 28 76 6f 69 64 2a 2c 20 69 6e 74 2c 20 63 6f 6e  (void*, int, con
7d50: 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 20 6e 54  st char*, int nT
7d60: 6f 6b 65 6e 2c 20 69 6e 74 20 69 53 74 61 72 74  oken, int iStart
7d70: 2c 20 69 6e 74 20 69 45 6e 64 29 0a 29 7b 0a 20  , int iEnd).){. 
7d80: 20 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72   PorterTokenizer
7d90: 20 2a 70 20 3d 20 28 50 6f 72 74 65 72 54 6f 6b   *p = (PorterTok
7da0: 65 6e 69 7a 65 72 2a 29 70 54 6f 6b 65 6e 69 7a  enizer*)pTokeniz
7db0: 65 72 3b 0a 20 20 50 6f 72 74 65 72 43 6f 6e 74  er;.  PorterCont
7dc0: 65 78 74 20 73 43 74 78 3b 0a 20 20 73 43 74 78  ext sCtx;.  sCtx
7dd0: 2e 78 54 6f 6b 65 6e 20 3d 20 78 54 6f 6b 65 6e  .xToken = xToken
7de0: 3b 0a 20 20 73 43 74 78 2e 70 43 74 78 20 3d 20  ;.  sCtx.pCtx = 
7df0: 70 43 74 78 3b 0a 20 20 73 43 74 78 2e 61 42 75  pCtx;.  sCtx.aBu
7e00: 66 20 3d 20 70 2d 3e 61 42 75 66 3b 0a 20 20 72  f = p->aBuf;.  r
7e10: 65 74 75 72 6e 20 70 2d 3e 74 6f 6b 65 6e 69 7a  eturn p->tokeniz
7e20: 65 72 2e 78 54 6f 6b 65 6e 69 7a 65 28 0a 20 20  er.xTokenize(.  
7e30: 20 20 20 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65      p->pTokenize
7e40: 72 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c  r, (void*)&sCtx,
7e50: 20 66 6c 61 67 73 2c 20 70 54 65 78 74 2c 20 6e   flags, pText, n
7e60: 54 65 78 74 2c 20 66 74 73 35 50 6f 72 74 65 72  Text, fts5Porter
7e70: 43 62 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cb.  );.}../*.**
7e80: 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75   Register all bu
7e90: 69 6c 74 2d 69 6e 20 74 6f 6b 65 6e 69 7a 65 72  ilt-in tokenizer
7ea0: 73 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2f 0a  s with FTS5..*/.
7eb0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 54  int sqlite3Fts5T
7ec0: 6f 6b 65 6e 69 7a 65 72 49 6e 69 74 28 66 74 73  okenizerInit(fts
7ed0: 35 5f 61 70 69 20 2a 70 41 70 69 29 7b 0a 20 20  5_api *pApi){.  
7ee0: 73 74 72 75 63 74 20 42 75 69 6c 74 69 6e 54 6f  struct BuiltinTo
7ef0: 6b 65 6e 69 7a 65 72 20 7b 0a 20 20 20 20 63 6f  kenizer {.    co
7f00: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
7f10: 0a 20 20 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69  .    fts5_tokeni
7f20: 7a 65 72 20 78 3b 0a 20 20 7d 20 61 42 75 69 6c  zer x;.  } aBuil
7f30: 74 69 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  tin[] = {.    { 
7f40: 22 75 6e 69 63 6f 64 65 36 31 22 2c 20 7b 66 74  "unicode61", {ft
7f50: 73 35 55 6e 69 63 6f 64 65 43 72 65 61 74 65 2c  s5UnicodeCreate,
7f60: 20 66 74 73 35 55 6e 69 63 6f 64 65 44 65 6c 65   fts5UnicodeDele
7f70: 74 65 2c 20 66 74 73 35 55 6e 69 63 6f 64 65 54  te, fts5UnicodeT
7f80: 6f 6b 65 6e 69 7a 65 7d 7d 2c 0a 20 20 20 20 7b  okenize}},.    {
7f90: 20 22 61 73 63 69 69 22 2c 20 20 20 20 20 7b 66   "ascii",     {f
7fa0: 74 73 35 41 73 63 69 69 43 72 65 61 74 65 2c 20  ts5AsciiCreate, 
7fb0: 66 74 73 35 41 73 63 69 69 44 65 6c 65 74 65 2c  fts5AsciiDelete,
7fc0: 20 66 74 73 35 41 73 63 69 69 54 6f 6b 65 6e 69   fts5AsciiTokeni
7fd0: 7a 65 20 7d 7d 2c 0a 20 20 20 20 7b 20 22 70 6f  ze }},.    { "po
7fe0: 72 74 65 72 22 2c 20 20 20 20 7b 66 74 73 35 50  rter",    {fts5P
7ff0: 6f 72 74 65 72 43 72 65 61 74 65 2c 20 66 74 73  orterCreate, fts
8000: 35 50 6f 72 74 65 72 44 65 6c 65 74 65 2c 20 66  5PorterDelete, f
8010: 74 73 35 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a  ts5PorterTokeniz
8020: 65 20 7d 7d 2c 0a 20 20 7d 3b 0a 20 20 0a 20 20  e }},.  };.  .  
8030: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8040: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
8050: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
8060: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74      /* To iterat
8090: 65 20 74 68 72 6f 75 67 68 20 62 75 69 6c 74 69  e through builti
80a0: 6e 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  n functions */..
80b0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
80c0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 69  QLITE_OK && i<si
80d0: 7a 65 6f 66 28 61 42 75 69 6c 74 69 6e 29 2f 73  zeof(aBuiltin)/s
80e0: 69 7a 65 6f 66 28 61 42 75 69 6c 74 69 6e 5b 30  izeof(aBuiltin[0
80f0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  ]); i++){.    rc
8100: 20 3d 20 70 41 70 69 2d 3e 78 43 72 65 61 74 65   = pApi->xCreate
8110: 54 6f 6b 65 6e 69 7a 65 72 28 70 41 70 69 2c 0a  Tokenizer(pApi,.
8120: 20 20 20 20 20 20 20 20 61 42 75 69 6c 74 69 6e          aBuiltin
8130: 5b 69 5d 2e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  [i].zName,.     
8140: 20 20 20 28 76 6f 69 64 2a 29 70 41 70 69 2c 0a     (void*)pApi,.
8150: 20 20 20 20 20 20 20 20 26 61 42 75 69 6c 74 69          &aBuilti
8160: 6e 5b 69 5d 2e 78 2c 0a 20 20 20 20 20 20 20 20  n[i].x,.        
8170: 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  0.    );.  }..  
8180: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a     return rc;.}...