/ Hex Artifact Content
Login

Artifact 97251d68d7a6a9415bde1203f9382864dfc1f989:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2f 0a 0a 23 69 66 20 64 65  *****.*/..#if de
0180: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0190: 42 4c 45 5f 46 54 53 35 29 0a 0a 23 69 6e 63 6c  BLE_FTS5)..#incl
01a0: 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68 22 0a  ude "fts5Int.h".
01b0: 0a 2f 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 2a 2a 2a 2a  ****************
01e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
01f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
0200: 53 74 61 72 74 20 6f 66 20 61 73 63 69 69 20 74  Start of ascii t
0210: 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
0220: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ntation..*/../*.
0230: 2a 2a 20 46 6f 72 20 74 6f 6b 65 6e 69 7a 65 72  ** For tokenizer
0240: 73 20 77 69 74 68 20 6e 6f 20 22 75 6e 69 63 6f  s with no "unico
0250: 64 65 22 20 6d 6f 64 69 66 69 65 72 2c 20 74 68  de" modifier, th
0260: 65 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 63  e set of token c
0270: 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 69 73 20  haracters.** is 
0280: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
0290: 73 65 74 20 6f 66 20 41 53 43 49 49 20 72 61 6e  set of ASCII ran
02a0: 67 65 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20  ge alphanumeric 
02b0: 63 68 61 72 61 63 74 65 72 73 2e 20 0a 2a 2f 0a  characters. .*/.
02c0: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
02d0: 63 68 61 72 20 61 41 73 63 69 69 54 6f 6b 65 6e  char aAsciiToken
02e0: 43 68 61 72 5b 31 32 38 5d 20 3d 20 7b 0a 20 20  Char[128] = {.  
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 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
0310: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0320: 2c 20 20 20 2f 2a 20 30 78 30 30 2e 2e 30 78 30  ,   /* 0x00..0x0
0330: 46 20 2a 2f 0a 20 20 30 2c 20 30 2c 20 30 2c 20  F */.  0, 0, 0, 
0340: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0350: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0360: 30 2c 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78  0, 0, 0,   /* 0x
0370: 31 30 2e 2e 30 78 31 46 20 2a 2f 0a 20 20 30 2c  10..0x1F */.  0,
0380: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0390: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
03a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
03b0: 20 20 2f 2a 20 30 78 32 30 2e 2e 30 78 32 46 20    /* 0x20..0x2F 
03c0: 2a 2f 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  */.  1, 1, 1, 1,
03d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
03e0: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 1, 0, 0, 0, 0,
03f0: 20 30 2c 20 30 2c 20 20 20 2f 2a 20 30 78 33 30   0, 0,   /* 0x30
0400: 2e 2e 30 78 33 46 20 2a 2f 0a 20 20 30 2c 20 31  ..0x3F */.  0, 1
0410: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
0420: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
0430: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
0440: 2f 2a 20 30 78 34 30 2e 2e 30 78 34 46 20 2a 2f  /* 0x40..0x4F */
0450: 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  .  1, 1, 1, 1, 1
0460: 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20  , 1, 1, 1,   1, 
0470: 31 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  1, 1, 0, 0, 0, 0
0480: 2c 20 30 2c 20 20 20 2f 2a 20 30 78 35 30 2e 2e  , 0,   /* 0x50..
0490: 30 78 35 46 20 2a 2f 0a 20 20 30 2c 20 31 2c 20  0x5F */.  0, 1, 
04a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
04b0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
04c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 2f 2a  1, 1, 1, 1,   /*
04d0: 20 30 78 36 30 2e 2e 30 78 36 46 20 2a 2f 0a 20   0x60..0x6F */. 
04e0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
04f0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
0500: 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   1, 0, 0, 0, 0, 
0510: 30 2c 20 20 20 2f 2a 20 30 78 37 30 2e 2e 30 78  0,   /* 0x70..0x
0520: 37 46 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  7F */.};..typede
0530: 66 20 73 74 72 75 63 74 20 41 73 63 69 69 54 6f  f struct AsciiTo
0540: 6b 65 6e 69 7a 65 72 20 41 73 63 69 69 54 6f 6b  kenizer AsciiTok
0550: 65 6e 69 7a 65 72 3b 0a 73 74 72 75 63 74 20 41  enizer;.struct A
0560: 73 63 69 69 54 6f 6b 65 6e 69 7a 65 72 20 7b 0a  sciiTokenizer {.
0570: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
0580: 61 54 6f 6b 65 6e 43 68 61 72 5b 31 32 38 5d 3b  aTokenChar[128];
0590: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .};..static void
05a0: 20 66 74 73 35 41 73 63 69 69 41 64 64 45 78 63   fts5AsciiAddExc
05b0: 65 70 74 69 6f 6e 73 28 0a 20 20 41 73 63 69 69  eptions(.  Ascii
05c0: 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 2c 20 0a 20  Tokenizer *p, . 
05d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
05e0: 67 2c 20 0a 20 20 69 6e 74 20 62 54 6f 6b 65 6e  g, .  int bToken
05f0: 43 68 61 72 73 0a 29 7b 0a 20 20 69 6e 74 20 69  Chars.){.  int i
0600: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72  ;.  for(i=0; zAr
0610: 67 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  g[i]; i++){.    
0620: 69 66 28 20 28 7a 41 72 67 5b 69 5d 20 26 20 30  if( (zArg[i] & 0
0630: 78 38 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x80)==0 ){.     
0640: 20 70 2d 3e 61 54 6f 6b 65 6e 43 68 61 72 5b 28   p->aTokenChar[(
0650: 69 6e 74 29 7a 41 72 67 5b 69 5d 5d 20 3d 20 28  int)zArg[i]] = (
0660: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 62 54  unsigned char)bT
0670: 6f 6b 65 6e 43 68 61 72 73 3b 0a 20 20 20 20 7d  okenChars;.    }
0680: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
0690: 6c 65 74 65 20 61 20 22 61 73 63 69 69 22 20 74  lete a "ascii" t
06a0: 6f 6b 65 6e 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61  okenizer..*/.sta
06b0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 63  tic void fts5Asc
06c0: 69 69 44 65 6c 65 74 65 28 46 74 73 35 54 6f 6b  iiDelete(Fts5Tok
06d0: 65 6e 69 7a 65 72 20 2a 70 29 7b 0a 20 20 73 71  enizer *p){.  sq
06e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d  lite3_free(p);.}
06f0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
0700: 6e 20 22 61 73 63 69 69 22 20 74 6f 6b 65 6e 69  n "ascii" tokeni
0710: 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  zer..*/.static i
0720: 6e 74 20 66 74 73 35 41 73 63 69 69 43 72 65 61  nt fts5AsciiCrea
0730: 74 65 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  te(.  void *pCtx
0740: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
0750: 2a 2a 61 7a 41 72 67 2c 20 69 6e 74 20 6e 41 72  **azArg, int nAr
0760: 67 2c 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  g,.  Fts5Tokeniz
0770: 65 72 20 2a 2a 70 70 4f 75 74 0a 29 7b 0a 20 20  er **ppOut.){.  
0780: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
0790: 4f 4b 3b 0a 20 20 41 73 63 69 69 54 6f 6b 65 6e  OK;.  AsciiToken
07a0: 69 7a 65 72 20 2a 70 20 3d 20 30 3b 0a 20 20 69  izer *p = 0;.  i
07b0: 66 28 20 6e 41 72 67 25 32 20 29 7b 0a 20 20 20  f( nArg%2 ){.   
07c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
07d0: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
07e0: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
07f0: 6c 6f 63 28 73 69 7a 65 6f 66 28 41 73 63 69 69  loc(sizeof(Ascii
0800: 54 6f 6b 65 6e 69 7a 65 72 29 29 3b 0a 20 20 20  Tokenizer));.   
0810: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
0820: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
0830: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
0840: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
0850: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
0860: 20 73 69 7a 65 6f 66 28 41 73 63 69 69 54 6f 6b   sizeof(AsciiTok
0870: 65 6e 69 7a 65 72 29 29 3b 0a 20 20 20 20 20 20  enizer));.      
0880: 6d 65 6d 63 70 79 28 70 2d 3e 61 54 6f 6b 65 6e  memcpy(p->aToken
0890: 43 68 61 72 2c 20 61 41 73 63 69 69 54 6f 6b 65  Char, aAsciiToke
08a0: 6e 43 68 61 72 2c 20 73 69 7a 65 6f 66 28 61 41  nChar, sizeof(aA
08b0: 73 63 69 69 54 6f 6b 65 6e 43 68 61 72 29 29 3b  sciiTokenChar));
08c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
08d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
08e0: 20 69 3c 6e 41 72 67 3b 20 69 2b 3d 32 29 7b 0a   i<nArg; i+=2){.
08f0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
0900: 61 72 20 2a 7a 41 72 67 20 3d 20 61 7a 41 72 67  ar *zArg = azArg
0910: 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  [i+1];.        i
0920: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
0930: 72 69 63 6d 70 28 61 7a 41 72 67 5b 69 5d 2c 20  ricmp(azArg[i], 
0940: 22 74 6f 6b 65 6e 63 68 61 72 73 22 29 20 29 7b  "tokenchars") ){
0950: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 41  .          fts5A
0960: 73 63 69 69 41 64 64 45 78 63 65 70 74 69 6f 6e  sciiAddException
0970: 73 28 70 2c 20 7a 41 72 67 2c 20 31 29 3b 0a 20  s(p, zArg, 1);. 
0980: 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
0990: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
09a0: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 41 72  te3_stricmp(azAr
09b0: 67 5b 69 5d 2c 20 22 73 65 70 61 72 61 74 6f 72  g[i], "separator
09c0: 73 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  s") ){.         
09d0: 20 66 74 73 35 41 73 63 69 69 41 64 64 45 78 63   fts5AsciiAddExc
09e0: 65 70 74 69 6f 6e 73 28 70 2c 20 7a 41 72 67 2c  eptions(p, zArg,
09f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   0);.        }el
0a00: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
0a10: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
0a20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0a30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
0a40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
0a50: 20 20 20 20 20 20 66 74 73 35 41 73 63 69 69 44        fts5AsciiD
0a60: 65 6c 65 74 65 28 28 46 74 73 35 54 6f 6b 65 6e  elete((Fts5Token
0a70: 69 7a 65 72 2a 29 70 29 3b 0a 20 20 20 20 20 20  izer*)p);.      
0a80: 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    p = 0;.      }
0a90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
0aa0: 70 4f 75 74 20 3d 20 28 46 74 73 35 54 6f 6b 65  pOut = (Fts5Toke
0ab0: 6e 69 7a 65 72 2a 29 70 3b 0a 20 20 72 65 74 75  nizer*)p;.  retu
0ac0: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69  rn rc;.}...stati
0ad0: 63 20 76 6f 69 64 20 61 73 63 69 69 46 6f 6c 64  c void asciiFold
0ae0: 28 63 68 61 72 20 2a 61 4f 75 74 2c 20 63 6f 6e  (char *aOut, con
0af0: 73 74 20 63 68 61 72 20 2a 61 49 6e 2c 20 69 6e  st char *aIn, in
0b00: 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  t nByte){.  int 
0b10: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0b20: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
0b30: 20 63 68 61 72 20 63 20 3d 20 61 49 6e 5b 69 5d   char c = aIn[i]
0b40: 3b 0a 20 20 20 20 69 66 28 20 63 3e 3d 27 41 27  ;.    if( c>='A'
0b50: 20 26 26 20 63 3c 3d 27 5a 27 20 29 20 63 20 2b   && c<='Z' ) c +
0b60: 3d 20 33 32 3b 0a 20 20 20 20 61 4f 75 74 5b 69  = 32;.    aOut[i
0b70: 5d 20 3d 20 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ] = c;.  }.}../*
0b80: 0a 2a 2a 20 54 6f 6b 65 6e 69 7a 65 20 73 6f 6d  .** Tokenize som
0b90: 65 20 74 65 78 74 20 75 73 69 6e 67 20 74 68 65  e text using the
0ba0: 20 61 73 63 69 69 20 74 6f 6b 65 6e 69 7a 65 72   ascii tokenizer
0bb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0bc0: 66 74 73 35 41 73 63 69 69 54 6f 6b 65 6e 69 7a  fts5AsciiTokeniz
0bd0: 65 28 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a  e(.  Fts5Tokeniz
0be0: 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c 0a  er *pTokenizer,.
0bf0: 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20    void *pCtx,.  
0c00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 78  const char *pTex
0c10: 74 2c 20 69 6e 74 20 6e 54 65 78 74 2c 0a 20 20  t, int nText,.  
0c20: 69 6e 74 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f  int (*xToken)(vo
0c30: 69 64 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  id*, const char*
0c40: 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 69 6e  , int nToken, in
0c50: 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69 45  t iStart, int iE
0c60: 6e 64 29 0a 29 7b 0a 20 20 41 73 63 69 69 54 6f  nd).){.  AsciiTo
0c70: 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20 28 41 73  kenizer *p = (As
0c80: 63 69 69 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 54  ciiTokenizer*)pT
0c90: 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 69 6e 74 20  okenizer;.  int 
0ca0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
0cb0: 20 20 69 6e 74 20 69 65 3b 0a 20 20 69 6e 74 20    int ie;.  int 
0cc0: 69 73 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20  is = 0;..  char 
0cd0: 61 46 6f 6c 64 5b 36 34 5d 3b 0a 20 20 69 6e 74  aFold[64];.  int
0ce0: 20 6e 46 6f 6c 64 20 3d 20 73 69 7a 65 6f 66 28   nFold = sizeof(
0cf0: 61 46 6f 6c 64 29 3b 0a 20 20 63 68 61 72 20 2a  aFold);.  char *
0d00: 70 46 6f 6c 64 20 3d 20 61 46 6f 6c 64 3b 0a 20  pFold = aFold;. 
0d10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0d20: 61 20 3d 20 70 2d 3e 61 54 6f 6b 65 6e 43 68 61  a = p->aTokenCha
0d30: 72 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 73 3c  r;..  while( is<
0d40: 6e 54 65 78 74 20 26 26 20 72 63 3d 3d 53 51 4c  nText && rc==SQL
0d50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
0d60: 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 2f 2a  t nByte;..    /*
0d70: 20 53 6b 69 70 20 61 6e 79 20 6c 65 61 64 69 6e   Skip any leadin
0d80: 67 20 64 69 76 69 64 65 72 20 63 68 61 72 61 63  g divider charac
0d90: 74 65 72 73 2e 20 2a 2f 0a 20 20 20 20 77 68 69  ters. */.    whi
0da0: 6c 65 28 20 69 73 3c 6e 54 65 78 74 20 26 26 20  le( is<nText && 
0db0: 28 28 70 54 65 78 74 5b 69 73 5d 26 30 78 38 30  ((pText[is]&0x80
0dc0: 29 3d 3d 30 20 26 26 20 61 5b 28 69 6e 74 29 70  )==0 && a[(int)p
0dd0: 54 65 78 74 5b 69 73 5d 5d 3d 3d 30 29 20 29 7b  Text[is]]==0) ){
0de0: 0a 20 20 20 20 20 20 69 73 2b 2b 3b 0a 20 20 20  .      is++;.   
0df0: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 3d 3d 6e   }.    if( is==n
0e00: 54 65 78 74 20 29 20 62 72 65 61 6b 3b 0a 0a 20  Text ) break;.. 
0e10: 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20     /* Count the 
0e20: 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65 72 73  token characters
0e30: 20 2a 2f 0a 20 20 20 20 69 65 20 3d 20 69 73 2b   */.    ie = is+
0e40: 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 65  1;.    while( ie
0e50: 3c 6e 54 65 78 74 20 26 26 20 28 28 70 54 65 78  <nText && ((pTex
0e60: 74 5b 69 65 5d 26 30 78 38 30 29 20 7c 7c 20 61  t[ie]&0x80) || a
0e70: 5b 28 69 6e 74 29 70 54 65 78 74 5b 69 65 5d 5d  [(int)pText[ie]]
0e80: 20 29 20 29 7b 0a 20 20 20 20 20 20 69 65 2b 2b   ) ){.      ie++
0e90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
0ea0: 46 6f 6c 64 20 74 6f 20 6c 6f 77 65 72 20 63 61  Fold to lower ca
0eb0: 73 65 20 2a 2f 0a 20 20 20 20 6e 42 79 74 65 20  se */.    nByte 
0ec0: 3d 20 69 65 2d 69 73 3b 0a 20 20 20 20 69 66 28  = ie-is;.    if(
0ed0: 20 6e 42 79 74 65 3e 6e 46 6f 6c 64 20 29 7b 0a   nByte>nFold ){.
0ee0: 20 20 20 20 20 20 69 66 28 20 70 46 6f 6c 64 21        if( pFold!
0ef0: 3d 61 46 6f 6c 64 20 29 20 73 71 6c 69 74 65 33  =aFold ) sqlite3
0f00: 5f 66 72 65 65 28 70 46 6f 6c 64 29 3b 0a 20 20  _free(pFold);.  
0f10: 20 20 20 20 70 46 6f 6c 64 20 3d 20 73 71 6c 69      pFold = sqli
0f20: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
0f30: 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *2);.      if( p
0f40: 46 6f 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Fold==0 ){.     
0f50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
0f60: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72  OMEM;.        br
0f70: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
0f80: 20 20 20 6e 46 6f 6c 64 20 3d 20 6e 42 79 74 65     nFold = nByte
0f90: 2a 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  *2;.    }.    as
0fa0: 63 69 69 46 6f 6c 64 28 70 46 6f 6c 64 2c 20 26  ciiFold(pFold, &
0fb0: 70 54 65 78 74 5b 69 73 5d 2c 20 6e 42 79 74 65  pText[is], nByte
0fc0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  );..    /* Invok
0fd0: 65 20 74 68 65 20 74 6f 6b 65 6e 20 63 61 6c 6c  e the token call
0fe0: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 72 63 20 3d  back */.    rc =
0ff0: 20 78 54 6f 6b 65 6e 28 70 43 74 78 2c 20 70 46   xToken(pCtx, pF
1000: 6f 6c 64 2c 20 6e 42 79 74 65 2c 20 69 73 2c 20  old, nByte, is, 
1010: 69 65 29 3b 0a 20 20 20 20 69 73 20 3d 20 69 65  ie);.    is = ie
1020: 2b 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  +1;.  }.  .  if(
1030: 20 70 46 6f 6c 64 21 3d 61 46 6f 6c 64 20 29 20   pFold!=aFold ) 
1040: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 6f  sqlite3_free(pFo
1050: 6c 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ld);.  if( rc==S
1060: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
1070: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72  = SQLITE_OK;.  r
1080: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
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 2a 2a 2a  ****************
10d0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 74 61 72  ********.** Star
10e0: 74 20 6f 66 20 75 6e 69 63 6f 64 65 36 31 20 74  t of unicode61 t
10f0: 6f 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65  okenizer impleme
1100: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 0a 0a 2f 2a  ntation..*/.../*
1110: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1120: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 2d 20 52  g two macros - R
1130: 45 41 44 5f 55 54 46 38 20 61 6e 64 20 57 52 49  EAD_UTF8 and WRI
1140: 54 45 5f 55 54 46 38 20 2d 20 68 61 76 65 20 62  TE_UTF8 - have b
1150: 65 65 6e 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  een copied.** fr
1160: 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 33 20 73  om the sqlite3 s
1170: 6f 75 72 63 65 20 66 69 6c 65 20 75 74 66 2e 63  ource file utf.c
1180: 2e 20 49 66 20 74 68 69 73 20 66 69 6c 65 20 69  . If this file i
1190: 73 20 63 6f 6d 70 69 6c 65 64 20 61 73 20 70 61  s compiled as pa
11a0: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 61 6d 61  rt.** of the ama
11b0: 6c 67 61 6d 61 74 69 6f 6e 2c 20 74 68 65 79 20  lgamation, they 
11c0: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
11d0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
11e0: 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e  ITE_AMALGAMATION
11f0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  ..static const u
1200: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 71 6c  nsigned char sql
1210: 69 74 65 33 55 74 66 38 54 72 61 6e 73 31 5b 5d  ite3Utf8Trans1[]
1220: 20 3d 20 7b 0a 20 20 30 78 30 30 2c 20 30 78 30   = {.  0x00, 0x0
1230: 31 2c 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30  1, 0x02, 0x03, 0
1240: 78 30 34 2c 20 30 78 30 35 2c 20 30 78 30 36 2c  x04, 0x05, 0x06,
1250: 20 30 78 30 37 2c 0a 20 20 30 78 30 38 2c 20 30   0x07,.  0x08, 0
1260: 78 30 39 2c 20 30 78 30 61 2c 20 30 78 30 62 2c  x09, 0x0a, 0x0b,
1270: 20 30 78 30 63 2c 20 30 78 30 64 2c 20 30 78 30   0x0c, 0x0d, 0x0
1280: 65 2c 20 30 78 30 66 2c 0a 20 20 30 78 31 30 2c  e, 0x0f,.  0x10,
1290: 20 30 78 31 31 2c 20 30 78 31 32 2c 20 30 78 31   0x11, 0x12, 0x1
12a0: 33 2c 20 30 78 31 34 2c 20 30 78 31 35 2c 20 30  3, 0x14, 0x15, 0
12b0: 78 31 36 2c 20 30 78 31 37 2c 0a 20 20 30 78 31  x16, 0x17,.  0x1
12c0: 38 2c 20 30 78 31 39 2c 20 30 78 31 61 2c 20 30  8, 0x19, 0x1a, 0
12d0: 78 31 62 2c 20 30 78 31 63 2c 20 30 78 31 64 2c  x1b, 0x1c, 0x1d,
12e0: 20 30 78 31 65 2c 20 30 78 31 66 2c 0a 20 20 30   0x1e, 0x1f,.  0
12f0: 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 32 2c  x00, 0x01, 0x02,
1300: 20 30 78 30 33 2c 20 30 78 30 34 2c 20 30 78 30   0x03, 0x04, 0x0
1310: 35 2c 20 30 78 30 36 2c 20 30 78 30 37 2c 0a 20  5, 0x06, 0x07,. 
1320: 20 30 78 30 38 2c 20 30 78 30 39 2c 20 30 78 30   0x08, 0x09, 0x0
1330: 61 2c 20 30 78 30 62 2c 20 30 78 30 63 2c 20 30  a, 0x0b, 0x0c, 0
1340: 78 30 64 2c 20 30 78 30 65 2c 20 30 78 30 66 2c  x0d, 0x0e, 0x0f,
1350: 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c 20 30  .  0x00, 0x01, 0
1360: 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30 34 2c  x02, 0x03, 0x04,
1370: 20 30 78 30 35 2c 20 30 78 30 36 2c 20 30 78 30   0x05, 0x06, 0x0
1380: 37 2c 0a 20 20 30 78 30 30 2c 20 30 78 30 31 2c  7,.  0x00, 0x01,
1390: 20 30 78 30 32 2c 20 30 78 30 33 2c 20 30 78 30   0x02, 0x03, 0x0
13a0: 30 2c 20 30 78 30 31 2c 20 30 78 30 30 2c 20 30  0, 0x01, 0x00, 0
13b0: 78 30 30 2c 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  x00,.};..#define
13c0: 20 52 45 41 44 5f 55 54 46 38 28 7a 49 6e 2c 20   READ_UTF8(zIn, 
13d0: 7a 54 65 72 6d 2c 20 63 29 20 20 20 20 20 20 20  zTerm, c)       
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 5c 0a 20 20 63 20 3d 20 2a 28 7a 49      \.  c = *(zI
1400: 6e 2b 2b 29 3b 20 20 20 20 20 20 20 20 20 20 20  n++);           
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 5c 0a 20 20 69 66 28 20 63 3e 3d 30 78 63 30   \.  if( c>=0xc0
1440: 20 29 7b 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 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1470: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
1480: 74 66 38 54 72 61 6e 73 31 5b 63 2d 30 78 63 30  tf8Trans1[c-0xc0
1490: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
14a0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
14b0: 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d 7a 54 65   while( zIn!=zTe
14c0: 72 6d 20 26 26 20 28 2a 7a 49 6e 20 26 20 30 78  rm && (*zIn & 0x
14d0: 63 30 29 3d 3d 30 78 38 30 20 29 7b 20 20 20 20  c0)==0x80 ){    
14e0: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 20 20          \.      
14f0: 63 20 3d 20 28 63 3c 3c 36 29 20 2b 20 28 30 78  c = (c<<6) + (0x
1500: 33 66 20 26 20 2a 28 7a 49 6e 2b 2b 29 29 3b 20  3f & *(zIn++)); 
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1520: 20 20 20 20 20 5c 0a 20 20 20 20 7d 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 20 20 20 20 20 20 20 20 20                  
1560: 20 20 5c 0a 20 20 20 20 69 66 28 20 63 3c 30 78    \.    if( c<0x
1570: 38 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  80              
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15a0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 63 26 30  .        || (c&0
15b0: 78 46 46 46 46 46 38 30 30 29 3d 3d 30 78 44 38  xFFFFF800)==0xD8
15c0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
15e0: 20 20 20 20 20 20 7c 7c 20 28 63 26 30 78 46 46        || (c&0xFF
15f0: 46 46 46 46 46 45 29 3d 3d 30 78 46 46 46 45 20  FFFFFE)==0xFFFE 
1600: 29 7b 20 20 63 20 3d 20 30 78 46 46 46 44 3b 20  ){  c = 0xFFFD; 
1610: 7d 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 0a  }        \.  }..
1620: 0a 23 64 65 66 69 6e 65 20 57 52 49 54 45 5f 55  .#define WRITE_U
1630: 54 46 38 28 7a 4f 75 74 2c 20 63 29 20 7b 20 20  TF8(zOut, c) {  
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
1660: 63 3c 30 78 30 30 30 38 30 20 29 7b 20 20 20 20  c<0x00080 ){    
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d   \.    *zOut++ =
16a0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
16b0: 28 63 26 30 78 46 46 29 3b 20 20 20 20 20 20 20  (c&0xFF);       
16c0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 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 20 20 20 20 20 20 20 20                  
1700: 20 20 20 5c 0a 20 20 65 6c 73 65 20 69 66 28 20     \.  else if( 
1710: 63 3c 30 78 30 30 38 30 30 20 29 7b 20 20 20 20  c<0x00800 ){    
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1740: 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 43 30    *zOut++ = 0xC0
1750: 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   + (unsigned cha
1760: 72 29 28 28 63 3e 3e 36 29 26 30 78 31 46 29 3b  r)((c>>6)&0x1F);
1770: 20 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74       \.    *zOut
1780: 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 6e 73  ++ = 0x80 + (uns
1790: 69 67 6e 65 64 20 63 68 61 72 29 28 63 20 26 20  igned char)(c & 
17a0: 30 78 33 46 29 3b 20 20 20 20 20 20 20 20 5c 0a  0x3F);        \.
17b0: 20 20 7d 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 20 20 20 20                  
17e0: 20 20 20 20 20 20 20 5c 0a 20 20 65 6c 73 65 20         \.  else 
17f0: 69 66 28 20 63 3c 30 78 31 30 30 30 30 20 29 7b  if( c<0x10000 ){
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20  \.    *zOut++ = 
1830: 30 78 45 30 20 2b 20 28 75 6e 73 69 67 6e 65 64  0xE0 + (unsigned
1840: 20 63 68 61 72 29 28 28 63 3e 3e 31 32 29 26 30   char)((c>>12)&0
1850: 78 30 46 29 3b 20 20 20 20 5c 0a 20 20 20 20 2a  x0F);    \.    *
1860: 7a 4f 75 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20  zOut++ = 0x80 + 
1870: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28  (unsigned char)(
1880: 28 63 3e 3e 36 29 20 26 20 30 78 33 46 29 3b 20  (c>>6) & 0x3F); 
1890: 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20    \.    *zOut++ 
18a0: 3d 20 30 78 38 30 20 2b 20 28 75 6e 73 69 67 6e  = 0x80 + (unsign
18b0: 65 64 20 63 68 61 72 29 28 63 20 26 20 30 78 33  ed char)(c & 0x3
18c0: 46 29 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 7d  F);        \.  }
18d0: 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
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 20 20 20 20 20 20 20                  
1900: 20 20 20 20 5c 0a 20 20 20 20 2a 7a 4f 75 74 2b      \.    *zOut+
1910: 2b 20 3d 20 30 78 46 30 20 2b 20 28 75 6e 73 69  + = 0xF0 + (unsi
1920: 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e 3e 31  gned char)((c>>1
1930: 38 29 20 26 20 30 78 30 37 29 3b 20 20 5c 0a 20  8) & 0x07);  \. 
1940: 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30 78 38     *zOut++ = 0x8
1950: 30 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 63 68  0 + (unsigned ch
1960: 61 72 29 28 28 63 3e 3e 31 32 29 20 26 20 30 78  ar)((c>>12) & 0x
1970: 33 46 29 3b 20 20 5c 0a 20 20 20 20 2a 7a 4f 75  3F);  \.    *zOu
1980: 74 2b 2b 20 3d 20 30 78 38 30 20 2b 20 28 75 6e  t++ = 0x80 + (un
1990: 73 69 67 6e 65 64 20 63 68 61 72 29 28 28 63 3e  signed char)((c>
19a0: 3e 36 29 20 26 20 30 78 33 46 29 3b 20 20 20 5c  >6) & 0x3F);   \
19b0: 0a 20 20 20 20 2a 7a 4f 75 74 2b 2b 20 3d 20 30  .    *zOut++ = 0
19c0: 78 38 30 20 2b 20 28 75 6e 73 69 67 6e 65 64 20  x80 + (unsigned 
19d0: 63 68 61 72 29 28 63 20 26 20 30 78 33 46 29 3b  char)(c & 0x3F);
19e0: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 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 20 20 20 20 20 20 20 20 20 20                  
1a20: 20 5c 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   \.}..#endif /* 
1a30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
1a40: 41 4c 47 41 4d 41 54 49 4f 4e 20 2a 2f 0a 0a 74  ALGAMATION */..t
1a50: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55 6e  ypedef struct Un
1a60: 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72  icode61Tokenizer
1a70: 20 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69   Unicode61Tokeni
1a80: 7a 65 72 3b 0a 73 74 72 75 63 74 20 55 6e 69 63  zer;.struct Unic
1a90: 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72 20 7b  ode61Tokenizer {
1aa0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1ab0: 20 61 54 6f 6b 65 6e 43 68 61 72 5b 31 32 38 5d   aTokenChar[128]
1ac0: 3b 20 20 2f 2a 20 41 53 43 49 49 20 72 61 6e 67  ;  /* ASCII rang
1ad0: 65 20 74 6f 6b 65 6e 20 63 68 61 72 61 63 74 65  e token characte
1ae0: 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 46  rs */.  char *aF
1af0: 6f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  old;            
1b00: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1b10: 72 20 74 6f 20 66 6f 6c 64 20 74 65 78 74 20 69  r to fold text i
1b20: 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 6f  nto */.  int nFo
1b30: 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
1b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b50: 20 6f 66 20 61 46 6f 6c 64 5b 5d 20 69 6e 20 62   of aFold[] in b
1b60: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 52  ytes */.  int bR
1b70: 65 6d 6f 76 65 44 69 61 63 72 69 74 69 63 3b 20  emoveDiacritic; 
1b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1b90: 65 20 69 66 20 72 65 6d 6f 76 65 5f 64 69 61 63  e if remove_diac
1ba0: 72 69 74 69 63 73 3d 31 20 69 73 20 73 65 74 20  ritics=1 is set 
1bb0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 63 65 70 74  */.  int nExcept
1bc0: 69 6f 6e 3b 0a 20 20 69 6e 74 20 2a 61 69 45 78  ion;.  int *aiEx
1bd0: 63 65 70 74 69 6f 6e 3b 0a 7d 3b 0a 0a 73 74 61  ception;.};..sta
1be0: 74 69 63 20 69 6e 74 20 66 74 73 35 55 6e 69 63  tic int fts5Unic
1bf0: 6f 64 65 41 64 64 45 78 63 65 70 74 69 6f 6e 73  odeAddExceptions
1c00: 28 0a 20 20 55 6e 69 63 6f 64 65 36 31 54 6f 6b  (.  Unicode61Tok
1c10: 65 6e 69 7a 65 72 20 2a 70 2c 20 20 20 20 20 20  enizer *p,      
1c20: 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a 65 72      /* Tokenizer
1c30: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
1c40: 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c60: 43 68 61 72 61 63 74 65 72 73 20 74 6f 20 74 72  Characters to tr
1c70: 65 61 74 20 61 73 20 65 78 63 65 70 74 69 6f 6e  eat as exception
1c80: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 54 6f 6b 65  s */.  int bToke
1c90: 6e 43 68 61 72 73 20 20 20 20 20 20 20 20 20 20  nChars          
1ca0: 20 20 20 20 20 20 20 2f 2a 20 31 20 66 6f 72 20         /* 1 for 
1cb0: 27 74 6f 6b 65 6e 63 68 61 72 73 27 2c 20 30 20  'tokenchars', 0 
1cc0: 66 6f 72 20 27 73 65 70 61 72 61 74 6f 72 73 27  for 'separators'
1cd0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1ce0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1cf0: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29  nt n = strlen(z)
1d00: 3b 0a 20 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 0a  ;.  int *aNew;..
1d10: 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1d20: 20 61 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71   aNew = (int*)sq
1d30: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d  lite3_realloc(p-
1d40: 3e 61 69 45 78 63 65 70 74 69 6f 6e 2c 20 28 6e  >aiException, (n
1d50: 2b 70 2d 3e 6e 45 78 63 65 70 74 69 6f 6e 29 2a  +p->nException)*
1d60: 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
1d70: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
1d80: 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70      int nNew = p
1d90: 2d 3e 6e 45 78 63 65 70 74 69 6f 6e 3b 0a 20 20  ->nException;.  
1da0: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
1db0: 65 64 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20  ed char *zCsr = 
1dc0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1dd0: 63 68 61 72 2a 29 7a 3b 0a 20 20 20 20 20 20 63  char*)z;.      c
1de0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1df0: 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e  ar *zTerm = (con
1e00: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1e10: 2a 29 26 7a 5b 6e 5d 3b 0a 20 20 20 20 20 20 77  *)&z[n];.      w
1e20: 68 69 6c 65 28 20 7a 43 73 72 3c 7a 54 65 72 6d  hile( zCsr<zTerm
1e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1e40: 69 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  iCode;.        i
1e50: 6e 74 20 62 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  nt bToken;.     
1e60: 20 20 20 52 45 41 44 5f 55 54 46 38 28 7a 43 73     READ_UTF8(zCs
1e70: 72 2c 20 7a 54 65 72 6d 2c 20 69 43 6f 64 65 29  r, zTerm, iCode)
1e80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
1e90: 6f 64 65 3c 31 32 38 20 29 7b 0a 20 20 20 20 20  ode<128 ){.     
1ea0: 20 20 20 20 20 70 2d 3e 61 54 6f 6b 65 6e 43 68       p->aTokenCh
1eb0: 61 72 5b 69 43 6f 64 65 5d 20 3d 20 62 54 6f 6b  ar[iCode] = bTok
1ec0: 65 6e 43 68 61 72 73 3b 0a 20 20 20 20 20 20 20  enChars;.       
1ed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ee0: 20 20 62 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74    bToken = sqlit
1ef0: 65 33 46 74 73 35 55 6e 69 63 6f 64 65 49 73 61  e3Fts5UnicodeIsa
1f00: 6c 6e 75 6d 28 69 43 6f 64 65 29 3b 0a 20 20 20  lnum(iCode);.   
1f10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
1f20: 62 54 6f 6b 65 6e 3d 3d 30 20 7c 7c 20 62 54 6f  bToken==0 || bTo
1f30: 6b 65 6e 3d 3d 31 29 20 29 3b 20 0a 20 20 20 20  ken==1) ); .    
1f40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62        assert( (b
1f50: 54 6f 6b 65 6e 43 68 61 72 73 3d 3d 30 20 7c 7c  TokenChars==0 ||
1f60: 20 62 54 6f 6b 65 6e 43 68 61 72 73 3d 3d 31 29   bTokenChars==1)
1f70: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1f80: 28 20 62 54 6f 6b 65 6e 21 3d 62 54 6f 6b 65 6e  ( bToken!=bToken
1f90: 43 68 61 72 73 20 26 26 20 73 71 6c 69 74 65 33  Chars && sqlite3
1fa0: 46 74 73 35 55 6e 69 63 6f 64 65 49 73 64 69 61  Fts5UnicodeIsdia
1fb0: 63 72 69 74 69 63 28 69 43 6f 64 65 29 3d 3d 30  critic(iCode)==0
1fc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1fd0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
1fe0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e     for(i=0; i<nN
1ff0: 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ew; i++){.      
2000: 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
2010: 5b 69 5d 3e 69 43 6f 64 65 20 29 20 62 72 65 61  [i]>iCode ) brea
2020: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
2030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2040: 6d 6f 76 65 28 26 61 4e 65 77 5b 69 2b 31 5d 2c  move(&aNew[i+1],
2050: 20 26 61 4e 65 77 5b 69 5d 2c 20 28 6e 4e 65 77   &aNew[i], (nNew
2060: 2d 69 29 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  -i)*sizeof(int))
2070: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 4e  ;.            aN
2080: 65 77 5b 69 5d 20 3d 20 69 43 6f 64 65 3b 0a 20  ew[i] = iCode;. 
2090: 20 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 2b             nNew+
20a0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
20b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20c0: 0a 20 20 20 20 20 20 70 2d 3e 61 69 45 78 63 65  .      p->aiExce
20d0: 70 74 69 6f 6e 20 3d 20 61 4e 65 77 3b 0a 20 20  ption = aNew;.  
20e0: 20 20 20 20 70 2d 3e 6e 45 78 63 65 70 74 69 6f      p->nExceptio
20f0: 6e 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 65  n = nNew;.    }e
2100: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2110: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2120: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2130: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2140: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
2150: 65 20 70 2d 3e 61 69 45 78 63 65 70 74 69 6f 6e  e p->aiException
2160: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
2170: 73 20 74 68 65 20 76 61 6c 75 65 20 69 43 6f 64  s the value iCod
2180: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2190: 20 66 74 73 35 55 6e 69 63 6f 64 65 49 73 45 78   fts5UnicodeIsEx
21a0: 63 65 70 74 69 6f 6e 28 55 6e 69 63 6f 64 65 36  ception(Unicode6
21b0: 31 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 2c 20 69  1Tokenizer *p, i
21c0: 6e 74 20 69 43 6f 64 65 29 7b 0a 20 20 69 66 28  nt iCode){.  if(
21d0: 20 70 2d 3e 6e 45 78 63 65 70 74 69 6f 6e 3e 30   p->nException>0
21e0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 2a 61 20 3d   ){.    int *a =
21f0: 20 70 2d 3e 61 69 45 78 63 65 70 74 69 6f 6e 3b   p->aiException;
2200: 0a 20 20 20 20 69 6e 74 20 69 4c 6f 20 3d 20 30  .    int iLo = 0
2210: 3b 0a 20 20 20 20 69 6e 74 20 69 48 69 20 3d 20  ;.    int iHi = 
2220: 70 2d 3e 6e 45 78 63 65 70 74 69 6f 6e 2d 31 3b  p->nException-1;
2230: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69 48 69  ..    while( iHi
2240: 3e 3d 69 4c 6f 20 29 7b 0a 20 20 20 20 20 20 69  >=iLo ){.      i
2250: 6e 74 20 69 54 65 73 74 20 3d 20 28 69 48 69 20  nt iTest = (iHi 
2260: 2b 20 69 4c 6f 29 20 2f 20 32 3b 0a 20 20 20 20  + iLo) / 2;.    
2270: 20 20 69 66 28 20 69 43 6f 64 65 3d 3d 61 5b 69    if( iCode==a[i
2280: 54 65 73 74 5d 20 29 7b 0a 20 20 20 20 20 20 20  Test] ){.       
2290: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
22a0: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 64 65   }else if( iCode
22b0: 3e 61 5b 69 54 65 73 74 5d 20 29 7b 0a 20 20 20  >a[iTest] ){.   
22c0: 20 20 20 20 20 69 4c 6f 20 3d 20 69 54 65 73 74       iLo = iTest
22d0: 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
22e0: 0a 20 20 20 20 20 20 20 20 69 48 69 20 3d 20 69  .        iHi = i
22f0: 54 65 73 74 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  Test-1;.      }.
2300: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2310: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2320: 44 65 6c 65 74 65 20 61 20 22 75 6e 69 63 6f 64  Delete a "unicod
2330: 65 36 31 22 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a  e61" tokenizer..
2340: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2350: 74 73 35 55 6e 69 63 6f 64 65 44 65 6c 65 74 65  ts5UnicodeDelete
2360: 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20 2a  (Fts5Tokenizer *
2370: 70 54 6f 6b 29 7b 0a 20 20 69 66 28 20 70 54 6f  pTok){.  if( pTo
2380: 6b 20 29 7b 0a 20 20 20 20 55 6e 69 63 6f 64 65  k ){.    Unicode
2390: 36 31 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 20 3d  61Tokenizer *p =
23a0: 20 28 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e   (Unicode61Token
23b0: 69 7a 65 72 2a 29 70 54 6f 6b 3b 0a 20 20 20 20  izer*)pTok;.    
23c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
23d0: 61 69 45 78 63 65 70 74 69 6f 6e 29 3b 0a 20 20  aiException);.  
23e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
23f0: 2d 3e 61 46 6f 6c 64 29 3b 0a 20 20 20 20 73 71  ->aFold);.    sq
2400: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
2410: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
2420: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 22  /*.** Create a "
2430: 75 6e 69 63 6f 64 65 36 31 22 20 74 6f 6b 65 6e  unicode61" token
2440: 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  izer..*/.static 
2450: 69 6e 74 20 66 74 73 35 55 6e 69 63 6f 64 65 43  int fts5UnicodeC
2460: 72 65 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 70  reate(.  void *p
2470: 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Ctx, .  const ch
2480: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 69 6e 74 20  ar **azArg, int 
2490: 6e 41 72 67 2c 0a 20 20 46 74 73 35 54 6f 6b 65  nArg,.  Fts5Toke
24a0: 6e 69 7a 65 72 20 2a 2a 70 70 4f 75 74 0a 29 7b  nizer **ppOut.){
24b0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24c0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
24d0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
24e0: 65 20 2a 2f 0a 20 20 55 6e 69 63 6f 64 65 36 31  e */.  Unicode61
24f0: 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20 30  Tokenizer *p = 0
2500: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 6f  ;      /* New to
2510: 6b 65 6e 69 7a 65 72 20 6f 62 6a 65 63 74 20 2a  kenizer object *
2520: 2f 20 0a 0a 20 20 69 66 28 20 6e 41 72 67 25 32  / ..  if( nArg%2
2530: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2540: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
2550: 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 69  se{.    p = (Uni
2560: 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72 2a  code61Tokenizer*
2570: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
2580: 73 69 7a 65 6f 66 28 55 6e 69 63 6f 64 65 36 31  sizeof(Unicode61
2590: 54 6f 6b 65 6e 69 7a 65 72 29 29 3b 0a 20 20 20  Tokenizer));.   
25a0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
25b0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 6d 65 6d  int i;.      mem
25c0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
25d0: 28 55 6e 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69  (Unicode61Tokeni
25e0: 7a 65 72 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  zer));.      mem
25f0: 63 70 79 28 70 2d 3e 61 54 6f 6b 65 6e 43 68 61  cpy(p->aTokenCha
2600: 72 2c 20 61 41 73 63 69 69 54 6f 6b 65 6e 43 68  r, aAsciiTokenCh
2610: 61 72 2c 20 73 69 7a 65 6f 66 28 61 41 73 63 69  ar, sizeof(aAsci
2620: 69 54 6f 6b 65 6e 43 68 61 72 29 29 3b 0a 20 20  iTokenChar));.  
2630: 20 20 20 20 70 2d 3e 62 52 65 6d 6f 76 65 44 69      p->bRemoveDi
2640: 61 63 72 69 74 69 63 20 3d 20 31 3b 0a 20 20 20  acritic = 1;.   
2650: 20 20 20 70 2d 3e 6e 46 6f 6c 64 20 3d 20 36 34     p->nFold = 64
2660: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 46 6f 6c 64  ;.      p->aFold
2670: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2680: 63 28 70 2d 3e 6e 46 6f 6c 64 20 2a 20 73 69 7a  c(p->nFold * siz
2690: 65 6f 66 28 63 68 61 72 29 29 3b 0a 20 20 20 20  eof(char));.    
26a0: 20 20 69 66 28 20 70 2d 3e 61 46 6f 6c 64 3d 3d    if( p->aFold==
26b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
26c0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
26d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
26e0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
26f0: 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20  E_OK && i<nArg; 
2700: 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 63  i+=2){.        c
2710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20  onst char *zArg 
2720: 3d 20 61 7a 41 72 67 5b 69 2b 31 5d 3b 0a 20 20  = azArg[i+1];.  
2730: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
2740: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 41  ite3_stricmp(azA
2750: 72 67 5b 69 5d 2c 20 22 72 65 6d 6f 76 65 5f 64  rg[i], "remove_d
2760: 69 61 63 72 69 74 69 63 73 22 29 20 29 7b 0a 20  iacritics") ){. 
2770: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 7a 41           if( (zA
2780: 72 67 5b 30 5d 21 3d 27 30 27 20 26 26 20 7a 41  rg[0]!='0' && zA
2790: 72 67 5b 30 5d 21 3d 27 31 27 29 20 7c 7c 20 7a  rg[0]!='1') || z
27a0: 41 72 67 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Arg[1] ){.      
27b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
27d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
27e0: 2d 3e 62 52 65 6d 6f 76 65 44 69 61 63 72 69 74  ->bRemoveDiacrit
27f0: 69 63 20 3d 20 28 7a 41 72 67 5b 30 5d 3d 3d 27  ic = (zArg[0]=='
2800: 31 27 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  1');.        }el
2810: 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  se.        if( 0
2820: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
2830: 70 28 61 7a 41 72 67 5b 69 5d 2c 20 22 74 6f 6b  p(azArg[i], "tok
2840: 65 6e 63 68 61 72 73 22 29 20 29 7b 0a 20 20 20  enchars") ){.   
2850: 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
2860: 55 6e 69 63 6f 64 65 41 64 64 45 78 63 65 70 74  UnicodeAddExcept
2870: 69 6f 6e 73 28 70 2c 20 7a 41 72 67 2c 20 31 29  ions(p, zArg, 1)
2880: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
2890: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
28a0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61  qlite3_stricmp(a
28b0: 7a 41 72 67 5b 69 5d 2c 20 22 73 65 70 61 72 61  zArg[i], "separa
28c0: 74 6f 72 73 22 29 20 29 7b 0a 20 20 20 20 20 20  tors") ){.      
28d0: 20 20 20 20 72 63 20 3d 20 66 74 73 35 55 6e 69      rc = fts5Uni
28e0: 63 6f 64 65 41 64 64 45 78 63 65 70 74 69 6f 6e  codeAddException
28f0: 73 28 70 2c 20 7a 41 72 67 2c 20 30 29 3b 0a 20  s(p, zArg, 0);. 
2900: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2910: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2920: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2930: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2950: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2960: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2970: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2980: 20 20 20 20 20 20 66 74 73 35 55 6e 69 63 6f 64        fts5Unicod
2990: 65 44 65 6c 65 74 65 28 28 46 74 73 35 54 6f 6b  eDelete((Fts5Tok
29a0: 65 6e 69 7a 65 72 2a 29 70 29 3b 0a 20 20 20 20  enizer*)p);.    
29b0: 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    p = 0;.    }. 
29c0: 20 20 20 2a 70 70 4f 75 74 20 3d 20 28 46 74 73     *ppOut = (Fts
29d0: 35 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 3b 0a 20  5Tokenizer*)p;. 
29e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a00: 74 72 75 65 20 69 66 2c 20 66 6f 72 20 74 68 65  true if, for the
2a10: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 6f 6b   purposes of tok
2a20: 65 6e 69 7a 69 6e 67 20 77 69 74 68 20 74 68 65  enizing with the
2a30: 20 74 6f 6b 65 6e 69 7a 65 72 0a 2a 2a 20 70 61   tokenizer.** pa
2a40: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2a50: 74 20 61 72 67 75 6d 65 6e 74 2c 20 63 6f 64 65  t argument, code
2a60: 70 6f 69 6e 74 20 69 43 6f 64 65 20 69 73 20 63  point iCode is c
2a70: 6f 6e 73 69 64 65 72 65 64 20 61 20 74 6f 6b 65  onsidered a toke
2a80: 6e 20 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20  n .** character 
2a90: 28 6e 6f 74 20 61 20 73 65 70 61 72 61 74 6f 72  (not a separator
2aa0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
2ab0: 20 66 74 73 35 55 6e 69 63 6f 64 65 49 73 41 6c   fts5UnicodeIsAl
2ac0: 6e 75 6d 28 55 6e 69 63 6f 64 65 36 31 54 6f 6b  num(Unicode61Tok
2ad0: 65 6e 69 7a 65 72 20 2a 70 2c 20 69 6e 74 20 69  enizer *p, int i
2ae0: 43 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Code){.  assert(
2af0: 20 28 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69   (sqlite3Fts5Uni
2b00: 63 6f 64 65 49 73 61 6c 6e 75 6d 28 69 43 6f 64  codeIsalnum(iCod
2b10: 65 29 20 26 20 30 78 46 46 46 46 46 46 46 45 29  e) & 0xFFFFFFFE)
2b20: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2b30: 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69 63 6f  sqlite3Fts5Unico
2b40: 64 65 49 73 61 6c 6e 75 6d 28 69 43 6f 64 65 29  deIsalnum(iCode)
2b50: 20 5e 20 66 74 73 35 55 6e 69 63 6f 64 65 49 73   ^ fts5UnicodeIs
2b60: 45 78 63 65 70 74 69 6f 6e 28 70 2c 20 69 43 6f  Exception(p, iCo
2b70: 64 65 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  de);.}..static i
2b80: 6e 74 20 66 74 73 35 55 6e 69 63 6f 64 65 54 6f  nt fts5UnicodeTo
2b90: 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35 54 6f  kenize(.  Fts5To
2ba0: 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69  kenizer *pTokeni
2bb0: 7a 65 72 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74  zer,.  void *pCt
2bc0: 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
2bd0: 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78  *pText, int nTex
2be0: 74 2c 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65  t,.  int (*xToke
2bf0: 6e 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20  n)(void*, const 
2c00: 63 68 61 72 2a 2c 20 69 6e 74 20 6e 54 6f 6b 65  char*, int nToke
2c10: 6e 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  n, int iStart, i
2c20: 6e 74 20 69 45 6e 64 29 0a 29 7b 0a 20 20 55 6e  nt iEnd).){.  Un
2c30: 69 63 6f 64 65 36 31 54 6f 6b 65 6e 69 7a 65 72  icode61Tokenizer
2c40: 20 2a 70 20 3d 20 28 55 6e 69 63 6f 64 65 36 31   *p = (Unicode61
2c50: 54 6f 6b 65 6e 69 7a 65 72 2a 29 70 54 6f 6b 65  Tokenizer*)pToke
2c60: 6e 69 7a 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  nizer;.  int rc 
2c70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
2c80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 20  nsigned char *a 
2c90: 3d 20 70 2d 3e 61 54 6f 6b 65 6e 43 68 61 72 3b  = p->aTokenChar;
2ca0: 0a 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ..  unsigned cha
2cb0: 72 20 2a 7a 54 65 72 6d 20 3d 20 28 75 6e 73 69  r *zTerm = (unsi
2cc0: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 54 65 78  gned char*)&pTex
2cd0: 74 5b 6e 54 65 78 74 5d 3b 0a 20 20 75 6e 73 69  t[nText];.  unsi
2ce0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 43 73 72 20  gned char *zCsr 
2cf0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
2d00: 20 2a 29 70 54 65 78 74 3b 0a 0a 20 20 2f 2a 20   *)pText;..  /* 
2d10: 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
2d20: 0a 20 20 63 68 61 72 20 2a 61 46 6f 6c 64 20 3d  .  char *aFold =
2d30: 20 70 2d 3e 61 46 6f 6c 64 3b 0a 20 20 69 6e 74   p->aFold;.  int
2d40: 20 6e 46 6f 6c 64 20 3d 20 70 2d 3e 6e 46 6f 6c   nFold = p->nFol
2d50: 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
2d60: 2a 70 45 6e 64 20 3d 20 26 61 46 6f 6c 64 5b 6e  *pEnd = &aFold[n
2d70: 46 6f 6c 64 2d 36 5d 3b 0a 0a 20 20 2f 2a 20 45  Fold-6];..  /* E
2d80: 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
2d90: 20 74 68 69 73 20 6c 6f 6f 70 20 67 6f 62 62 6c   this loop gobbl
2da0: 65 73 20 75 70 20 61 20 63 6f 6e 74 69 67 75 6f  es up a contiguo
2db0: 75 73 20 72 75 6e 20 6f 66 20 73 65 70 61 72 61  us run of separa
2dc0: 74 6f 72 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  tors,.  ** then 
2dd0: 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 20  the next token. 
2de0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
2df0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e00: 20 20 69 6e 74 20 69 43 6f 64 65 3b 20 20 20 20    int iCode;    
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 2f 2a 20 6e 6f 6e 2d 41 53 43 49 49 20 63 6f 64  /* non-ASCII cod
2e30: 65 70 6f 69 6e 74 20 72 65 61 64 20 66 72 6f 6d  epoint read from
2e40: 20 69 6e 70 75 74 20 2a 2f 0a 20 20 20 20 63 68   input */.    ch
2e50: 61 72 20 2a 7a 4f 75 74 20 3d 20 61 46 6f 6c 64  ar *zOut = aFold
2e60: 3b 0a 20 20 20 20 69 6e 74 20 69 73 3b 0a 20 20  ;.    int is;.  
2e70: 20 20 69 6e 74 20 69 65 3b 0a 0a 20 20 20 20 2f    int ie;..    /
2e80: 2a 20 53 6b 69 70 20 61 6e 79 20 73 65 70 61 72  * Skip any separ
2e90: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 73 2e  ator characters.
2ea0: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 31   */.    while( 1
2eb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43   ){.      if( zC
2ec0: 73 72 3e 3d 7a 54 65 72 6d 20 29 20 67 6f 74 6f  sr>=zTerm ) goto
2ed0: 20 74 6f 6b 65 6e 69 7a 65 5f 64 6f 6e 65 3b 0a   tokenize_done;.
2ee0: 20 20 20 20 20 20 69 66 28 20 2a 7a 43 73 72 20        if( *zCsr 
2ef0: 26 20 30 78 38 30 20 29 20 7b 0a 20 20 20 20 20  & 0x80 ) {.     
2f00: 20 20 20 2f 2a 20 41 20 63 68 61 72 61 63 74 65     /* A characte
2f10: 72 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65  r outside of the
2f20: 20 61 73 63 69 69 20 72 61 6e 67 65 2e 20 53 6b   ascii range. Sk
2f30: 69 70 20 70 61 73 74 20 69 74 20 69 66 20 69 74  ip past it if it
2f40: 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   is.        ** a
2f50: 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
2f60: 63 74 65 72 2e 20 4f 72 20 62 72 65 61 6b 20 6f  cter. Or break o
2f70: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  ut of the loop i
2f80: 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f 0a  f it is not. */.
2f90: 20 20 20 20 20 20 20 20 69 73 20 3d 20 7a 43 73          is = zCs
2fa0: 72 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  r - (unsigned ch
2fb0: 61 72 2a 29 70 54 65 78 74 3b 0a 20 20 20 20 20  ar*)pText;.     
2fc0: 20 20 20 52 45 41 44 5f 55 54 46 38 28 7a 43 73     READ_UTF8(zCs
2fd0: 72 2c 20 7a 54 65 72 6d 2c 20 69 43 6f 64 65 29  r, zTerm, iCode)
2fe0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  ;.        if( ft
2ff0: 73 35 55 6e 69 63 6f 64 65 49 73 41 6c 6e 75 6d  s5UnicodeIsAlnum
3000: 28 70 2c 20 69 43 6f 64 65 29 20 29 7b 0a 20 20  (p, iCode) ){.  
3010: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 6e          goto non
3020: 5f 61 73 63 69 69 5f 74 6f 6b 65 6e 63 68 61 72  _ascii_tokenchar
3030: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3050: 20 69 66 28 20 61 5b 2a 7a 43 73 72 5d 20 29 7b   if( a[*zCsr] ){
3060: 0a 20 20 20 20 20 20 20 20 20 20 69 73 20 3d 20  .          is = 
3070: 7a 43 73 72 20 2d 20 28 75 6e 73 69 67 6e 65 64  zCsr - (unsigned
3080: 20 63 68 61 72 2a 29 70 54 65 78 74 3b 0a 20 20   char*)pText;.  
3090: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 73 63          goto asc
30a0: 69 69 5f 74 6f 6b 65 6e 63 68 61 72 3b 0a 20 20  ii_tokenchar;.  
30b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30c0: 7a 43 73 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  zCsr++;.      }.
30d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75      }..    /* Ru
30e0: 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 6f  n through the to
30f0: 6b 65 6e 63 68 61 72 73 2e 20 46 6f 6c 64 20 74  kenchars. Fold t
3100: 68 65 6d 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  hem into the out
3110: 70 75 74 20 62 75 66 66 65 72 20 61 6c 6f 6e 67  put buffer along
3120: 0a 20 20 20 20 2a 2a 20 74 68 65 20 77 61 79 2e  .    ** the way.
3130: 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
3140: 7a 43 73 72 3c 7a 54 65 72 6d 20 29 7b 0a 0a 20  zCsr<zTerm ){.. 
3150: 20 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65       /* Grow the
3160: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 73   output buffer s
3170: 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  o that there is 
3180: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
3190: 20 74 6f 20 66 69 74 20 74 68 65 0a 20 20 20 20   to fit the.    
31a0: 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 70 6f 73    ** largest pos
31b0: 73 69 62 6c 65 20 75 74 66 2d 38 20 63 68 61 72  sible utf-8 char
31c0: 61 63 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20  acter.  */.     
31d0: 20 69 66 28 20 7a 4f 75 74 3e 70 45 6e 64 20 29   if( zOut>pEnd )
31e0: 7b 0a 20 20 20 20 20 20 20 20 61 46 6f 6c 64 20  {.        aFold 
31f0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
3200: 28 6e 46 6f 6c 64 2a 32 29 3b 0a 20 20 20 20 20  (nFold*2);.     
3210: 20 20 20 69 66 28 20 61 46 6f 6c 64 3d 3d 30 20     if( aFold==0 
3220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
3230: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
3240: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 74            goto t
3250: 6f 6b 65 6e 69 7a 65 5f 64 6f 6e 65 3b 0a 20 20  okenize_done;.  
3260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3270: 7a 4f 75 74 20 3d 20 26 61 46 6f 6c 64 5b 7a 4f  zOut = &aFold[zO
3280: 75 74 20 2d 20 70 2d 3e 61 46 6f 6c 64 5d 3b 0a  ut - p->aFold];.
3290: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
32a0: 46 6f 6c 64 2c 20 70 2d 3e 61 46 6f 6c 64 2c 20  Fold, p->aFold, 
32b0: 6e 46 6f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  nFold);.        
32c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
32d0: 61 46 6f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  aFold);.        
32e0: 70 2d 3e 61 46 6f 6c 64 20 3d 20 61 46 6f 6c 64  p->aFold = aFold
32f0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 46 6f  ;.        p->nFo
3300: 6c 64 20 3d 20 6e 46 6f 6c 64 20 3d 20 6e 46 6f  ld = nFold = nFo
3310: 6c 64 2a 32 3b 0a 20 20 20 20 20 20 20 20 70 45  ld*2;.        pE
3320: 6e 64 20 3d 20 26 61 46 6f 6c 64 5b 6e 46 6f 6c  nd = &aFold[nFol
3330: 64 2d 36 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  d-6];.      }.. 
3340: 20 20 20 20 20 69 66 28 20 2a 7a 43 73 72 20 26       if( *zCsr &
3350: 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20   0x80 ){.       
3360: 20 2f 2a 20 41 6e 20 6e 6f 6e 2d 61 73 63 69 69   /* An non-ascii
3370: 2d 72 61 6e 67 65 20 63 68 61 72 61 63 74 65 72  -range character
3380: 2e 20 46 6f 6c 64 20 69 74 20 69 6e 74 6f 20 74  . Fold it into t
3390: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
33a0: 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 69   if.        ** i
33b0: 74 20 69 73 20 61 20 74 6f 6b 65 6e 20 63 68 61  t is a token cha
33c0: 72 61 63 74 65 72 2c 20 6f 72 20 62 72 65 61 6b  racter, or break
33d0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
33e0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a   if it is not. *
33f0: 2f 0a 20 20 20 20 20 20 20 20 52 45 41 44 5f 55  /.        READ_U
3400: 54 46 38 28 7a 43 73 72 2c 20 7a 54 65 72 6d 2c  TF8(zCsr, zTerm,
3410: 20 69 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   iCode);.       
3420: 20 69 66 28 20 66 74 73 35 55 6e 69 63 6f 64 65   if( fts5Unicode
3430: 49 73 41 6c 6e 75 6d 28 70 2c 69 43 6f 64 65 29  IsAlnum(p,iCode)
3440: 7c 7c 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  ||sqlite3Fts5Uni
3450: 63 6f 64 65 49 73 64 69 61 63 72 69 74 69 63 28  codeIsdiacritic(
3460: 69 43 6f 64 65 29 20 29 7b 0a 20 6e 6f 6e 5f 61  iCode) ){. non_a
3470: 73 63 69 69 5f 74 6f 6b 65 6e 63 68 61 72 3a 0a  scii_tokenchar:.
3480: 20 20 20 20 20 20 20 20 20 20 69 43 6f 64 65 20            iCode 
3490: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 55 6e 69  = sqlite3Fts5Uni
34a0: 63 6f 64 65 46 6f 6c 64 28 69 43 6f 64 65 2c 20  codeFold(iCode, 
34b0: 70 2d 3e 62 52 65 6d 6f 76 65 44 69 61 63 72 69  p->bRemoveDiacri
34c0: 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tic);.          
34d0: 69 66 28 20 69 43 6f 64 65 20 29 20 57 52 49 54  if( iCode ) WRIT
34e0: 45 5f 55 54 46 38 28 7a 4f 75 74 2c 20 69 43 6f  E_UTF8(zOut, iCo
34f0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  de);.        }el
3500: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72  se{.          br
3510: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
3520: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
3530: 5b 2a 7a 43 73 72 5d 3d 3d 30 20 29 7b 0a 20 20  [*zCsr]==0 ){.  
3540: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 73 63 69        /* An asci
3550: 69 2d 72 61 6e 67 65 20 73 65 70 61 72 61 74 6f  i-range separato
3560: 72 20 63 68 61 72 61 63 74 65 72 2e 20 45 6e 64  r character. End
3570: 20 6f 66 20 74 6f 6b 65 6e 2e 20 2a 2f 0a 20 20   of token. */.  
3580: 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20        break; .  
3590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 61 73 63 69      }else{. asci
35a0: 69 5f 74 6f 6b 65 6e 63 68 61 72 3a 0a 20 20 20  i_tokenchar:.   
35b0: 20 20 20 20 20 69 66 28 20 2a 7a 43 73 72 3e 3d       if( *zCsr>=
35c0: 27 41 27 20 26 26 20 2a 7a 43 73 72 3c 3d 27 5a  'A' && *zCsr<='Z
35d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  ' ){.          *
35e0: 7a 4f 75 74 2b 2b 20 3d 20 2a 7a 43 73 72 20 2b  zOut++ = *zCsr +
35f0: 20 33 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   32;.        }el
3600: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 7a  se{.          *z
3610: 4f 75 74 2b 2b 20 3d 20 2a 7a 43 73 72 3b 0a 20  Out++ = *zCsr;. 
3620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3630: 20 7a 43 73 72 2b 2b 3b 0a 20 20 20 20 20 20 7d   zCsr++;.      }
3640: 0a 20 20 20 20 20 20 69 65 20 3d 20 7a 43 73 72  .      ie = zCsr
3650: 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   - (unsigned cha
3660: 72 2a 29 70 54 65 78 74 3b 0a 20 20 20 20 7d 0a  r*)pText;.    }.
3670: 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  .    /* Invoke t
3680: 68 65 20 74 6f 6b 65 6e 20 63 61 6c 6c 62 61 63  he token callbac
3690: 6b 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 78 54  k */.    rc = xT
36a0: 6f 6b 65 6e 28 70 43 74 78 2c 20 61 46 6f 6c 64  oken(pCtx, aFold
36b0: 2c 20 7a 4f 75 74 2d 61 46 6f 6c 64 2c 20 69 73  , zOut-aFold, is
36c0: 2c 20 69 65 29 3b 0a 20 20 7d 0a 20 20 0a 20 74  , ie);.  }.  . t
36d0: 6f 6b 65 6e 69 7a 65 5f 64 6f 6e 65 3a 0a 20 20  okenize_done:.  
36e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
36f0: 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ONE ) rc = SQLIT
3700: 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72  E_OK;.  return r
3710: 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}../*********
3720: 2a 2a 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 0a 2a 2a 20 53 74 61 72 74 20 6f 66 20 70 6f  *.** Start of po
3770: 72 74 65 72 20 73 74 65 6d 6d 65 72 20 69 6d 70  rter stemmer imp
3780: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
3790: 0a 2f 2a 20 41 6e 79 20 74 6f 6b 65 6e 73 20 6c  ./* Any tokens l
37a0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
37b0: 28 69 6e 20 62 79 74 65 73 29 20 61 72 65 20 70  (in bytes) are p
37c0: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 77 69  assed through wi
37d0: 74 68 6f 75 74 0a 2a 2a 20 73 74 65 6d 6d 69 6e  thout.** stemmin
37e0: 67 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  g. */.#define FT
37f0: 53 35 5f 50 4f 52 54 45 52 5f 4d 41 58 5f 54 4f  S5_PORTER_MAX_TO
3800: 4b 45 4e 20 36 34 0a 0a 74 79 70 65 64 65 66 20  KEN 64..typedef 
3810: 73 74 72 75 63 74 20 50 6f 72 74 65 72 54 6f 6b  struct PorterTok
3820: 65 6e 69 7a 65 72 20 50 6f 72 74 65 72 54 6f 6b  enizer PorterTok
3830: 65 6e 69 7a 65 72 3b 0a 73 74 72 75 63 74 20 50  enizer;.struct P
3840: 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72 20 7b  orterTokenizer {
3850: 0a 20 20 66 74 73 35 5f 74 6f 6b 65 6e 69 7a 65  .  fts5_tokenize
3860: 72 20 74 6f 6b 65 6e 69 7a 65 72 3b 20 20 20 20  r tokenizer;    
3870: 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 6f 6b     /* Parent tok
3880: 65 6e 69 7a 65 72 20 6d 6f 64 75 6c 65 20 2a 2f  enizer module */
3890: 0a 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  .  Fts5Tokenizer
38a0: 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 3b 20 20 20   *pTokenizer;   
38b0: 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 74 6f 6b     /* Parent tok
38c0: 65 6e 69 7a 65 72 20 69 6e 73 74 61 6e 63 65 20  enizer instance 
38d0: 2a 2f 0a 20 20 63 68 61 72 20 61 42 75 66 5b 46  */.  char aBuf[F
38e0: 54 53 35 5f 50 4f 52 54 45 52 5f 4d 41 58 5f 54  TS5_PORTER_MAX_T
38f0: 4f 4b 45 4e 20 2b 20 36 34 5d 3b 0a 7d 3b 0a 0a  OKEN + 64];.};..
3900: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 22  /*.** Delete a "
3910: 70 6f 72 74 65 72 22 20 74 6f 6b 65 6e 69 7a 65  porter" tokenize
3920: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
3930: 64 20 66 74 73 35 50 6f 72 74 65 72 44 65 6c 65  d fts5PorterDele
3940: 74 65 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72  te(Fts5Tokenizer
3950: 20 2a 70 54 6f 6b 29 7b 0a 20 20 69 66 28 20 70   *pTok){.  if( p
3960: 54 6f 6b 20 29 7b 0a 20 20 20 20 50 6f 72 74 65  Tok ){.    Porte
3970: 72 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20  rTokenizer *p = 
3980: 28 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72  (PorterTokenizer
3990: 2a 29 70 54 6f 6b 3b 0a 20 20 20 20 69 66 28 20  *)pTok;.    if( 
39a0: 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 20 29 7b  p->pTokenizer ){
39b0: 0a 20 20 20 20 20 20 70 2d 3e 74 6f 6b 65 6e 69  .      p->tokeni
39c0: 7a 65 72 2e 78 44 65 6c 65 74 65 28 70 2d 3e 70  zer.xDelete(p->p
39d0: 54 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20 20 20 20  Tokenizer);.    
39e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
39f0: 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
3a00: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 22 70 6f  .** Create a "po
3a10: 72 74 65 72 22 20 74 6f 6b 65 6e 69 7a 65 72 2e  rter" tokenizer.
3a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
3a30: 74 73 35 50 6f 72 74 65 72 43 72 65 61 74 65 28  ts5PorterCreate(
3a40: 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
3a50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
3a60: 7a 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 0a  zArg, int nArg,.
3a70: 20 20 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 20    Fts5Tokenizer 
3a80: 2a 2a 70 70 4f 75 74 0a 29 7b 0a 20 20 66 74 73  **ppOut.){.  fts
3a90: 35 5f 61 70 69 20 2a 70 41 70 69 20 3d 20 28 66  5_api *pApi = (f
3aa0: 74 73 35 5f 61 70 69 2a 29 70 43 74 78 3b 0a 20  ts5_api*)pCtx;. 
3ab0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3ac0: 5f 4f 4b 3b 0a 20 20 50 6f 72 74 65 72 54 6f 6b  _OK;.  PorterTok
3ad0: 65 6e 69 7a 65 72 20 2a 70 52 65 74 3b 0a 20 20  enizer *pRet;.  
3ae0: 76 6f 69 64 20 2a 70 55 73 65 72 64 61 74 61 20  void *pUserdata 
3af0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
3b00: 72 20 2a 7a 42 61 73 65 20 3d 20 22 75 6e 69 63  r *zBase = "unic
3b10: 6f 64 65 36 31 22 3b 0a 0a 20 20 69 66 28 20 6e  ode61";..  if( n
3b20: 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 7a 42 61  Arg>0 ){.    zBa
3b30: 73 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20  se = azArg[0];. 
3b40: 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 28 50 6f   }..  pRet = (Po
3b50: 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72 2a 29 73  rterTokenizer*)s
3b60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
3b70: 7a 65 6f 66 28 50 6f 72 74 65 72 54 6f 6b 65 6e  zeof(PorterToken
3b80: 69 7a 65 72 29 29 3b 0a 20 20 69 66 28 20 70 52  izer));.  if( pR
3b90: 65 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  et ){.    memset
3ba0: 28 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (pRet, 0, sizeof
3bb0: 28 50 6f 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72  (PorterTokenizer
3bc0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 41 70  ));.    rc = pAp
3bd0: 69 2d 3e 78 46 69 6e 64 54 6f 6b 65 6e 69 7a 65  i->xFindTokenize
3be0: 72 28 70 41 70 69 2c 20 7a 42 61 73 65 2c 20 26  r(pApi, zBase, &
3bf0: 70 55 73 65 72 64 61 74 61 2c 20 26 70 52 65 74  pUserdata, &pRet
3c00: 2d 3e 74 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20 20  ->tokenizer);.  
3c10: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
3c20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
3c30: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
3c40: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
3c50: 3d 20 70 52 65 74 2d 3e 74 6f 6b 65 6e 69 7a 65  = pRet->tokenize
3c60: 72 2e 78 43 72 65 61 74 65 28 70 55 73 65 72 64  r.xCreate(pUserd
3c70: 61 74 61 2c 20 30 2c 20 30 2c 20 26 70 52 65 74  ata, 0, 0, &pRet
3c80: 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20  ->pTokenizer);. 
3c90: 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
3ca0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
3cb0: 74 73 35 50 6f 72 74 65 72 44 65 6c 65 74 65 28  ts5PorterDelete(
3cc0: 28 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 2a 29  (Fts5Tokenizer*)
3cd0: 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20  pRet);.    pRet 
3ce0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 4f 75  = 0;.  }.  *ppOu
3cf0: 74 20 3d 20 28 46 74 73 35 54 6f 6b 65 6e 69 7a  t = (Fts5Tokeniz
3d00: 65 72 2a 29 70 52 65 74 3b 0a 20 20 72 65 74 75  er*)pRet;.  retu
3d10: 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65  rn rc;.}..typede
3d20: 66 20 73 74 72 75 63 74 20 50 6f 72 74 65 72 43  f struct PorterC
3d30: 6f 6e 74 65 78 74 20 50 6f 72 74 65 72 43 6f 6e  ontext PorterCon
3d40: 74 65 78 74 3b 0a 73 74 72 75 63 74 20 50 6f 72  text;.struct Por
3d50: 74 65 72 43 6f 6e 74 65 78 74 20 7b 0a 20 20 76  terContext {.  v
3d60: 6f 69 64 20 2a 70 43 74 78 3b 0a 20 20 69 6e 74  oid *pCtx;.  int
3d70: 20 28 2a 78 54 6f 6b 65 6e 29 28 76 6f 69 64 2a   (*xToken)(void*
3d80: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
3d90: 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29 3b 0a 20  nt, int, int);. 
3da0: 20 63 68 61 72 20 2a 61 42 75 66 3b 0a 7d 3b 0a   char *aBuf;.};.
3db0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3dc0: 50 6f 72 74 65 72 52 75 6c 65 20 50 6f 72 74 65  PorterRule Porte
3dd0: 72 52 75 6c 65 3b 0a 73 74 72 75 63 74 20 50 6f  rRule;.struct Po
3de0: 72 74 65 72 52 75 6c 65 20 7b 0a 20 20 63 6f 6e  rterRule {.  con
3df0: 73 74 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78  st char *zSuffix
3e00: 3b 0a 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b  ;.  int nSuffix;
3e10: 0a 20 20 69 6e 74 20 28 2a 78 43 6f 6e 64 29 28  .  int (*xCond)(
3e20: 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20 69 6e 74  char *zStem, int
3e30: 20 6e 53 74 65 6d 29 3b 0a 20 20 63 6f 6e 73 74   nStem);.  const
3e40: 20 63 68 61 72 20 2a 7a 4f 75 74 70 75 74 3b 0a   char *zOutput;.
3e50: 20 20 69 6e 74 20 6e 4f 75 74 70 75 74 3b 0a 7d    int nOutput;.}
3e60: 3b 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20  ;..#if 0.static 
3e70: 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72 41 70  int fts5PorterAp
3e80: 70 6c 79 28 63 68 61 72 20 2a 61 42 75 66 2c 20  ply(char *aBuf, 
3e90: 69 6e 74 20 2a 70 6e 42 75 66 2c 20 50 6f 72 74  int *pnBuf, Port
3ea0: 65 72 52 75 6c 65 20 2a 61 52 75 6c 65 29 7b 0a  erRule *aRule){.
3eb0: 20 20 69 6e 74 20 72 65 74 20 3d 20 2d 31 3b 0a    int ret = -1;.
3ec0: 20 20 69 6e 74 20 6e 42 75 66 20 3d 20 2a 70 6e    int nBuf = *pn
3ed0: 42 75 66 3b 0a 20 20 50 6f 72 74 65 72 52 75 6c  Buf;.  PorterRul
3ee0: 65 20 2a 70 3b 0a 0a 20 20 66 6f 72 28 70 3d 61  e *p;..  for(p=a
3ef0: 52 75 6c 65 3b 20 70 2d 3e 7a 53 75 66 66 69 78  Rule; p->zSuffix
3f00: 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; p++){.    asse
3f10: 72 74 28 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 53  rt( strlen(p->zS
3f20: 75 66 66 69 78 29 3d 3d 70 2d 3e 6e 53 75 66 66  uffix)==p->nSuff
3f30: 69 78 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ix );.    assert
3f40: 28 20 73 74 72 6c 65 6e 28 70 2d 3e 7a 4f 75 74  ( strlen(p->zOut
3f50: 70 75 74 29 3d 3d 70 2d 3e 6e 4f 75 74 70 75 74  put)==p->nOutput
3f60: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 75 66   );.    if( nBuf
3f70: 3c 70 2d 3e 6e 53 75 66 66 69 78 20 29 20 63 6f  <p->nSuffix ) co
3f80: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
3f90: 30 3d 3d 6d 65 6d 63 6d 70 28 26 61 42 75 66 5b  0==memcmp(&aBuf[
3fa0: 6e 42 75 66 20 2d 20 70 2d 3e 6e 53 75 66 66 69  nBuf - p->nSuffi
3fb0: 78 5d 2c 20 70 2d 3e 7a 53 75 66 66 69 78 2c 20  x], p->zSuffix, 
3fc0: 70 2d 3e 6e 53 75 66 66 69 78 29 20 29 20 62 72  p->nSuffix) ) br
3fd0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  eak;.  }..  if( 
3fe0: 70 2d 3e 7a 53 75 66 66 69 78 20 29 7b 0a 20 20  p->zSuffix ){.  
3ff0: 20 20 69 6e 74 20 6e 53 74 65 6d 20 3d 20 6e 42    int nStem = nB
4000: 75 66 20 2d 20 70 2d 3e 6e 53 75 66 66 69 78 3b  uf - p->nSuffix;
4010: 0a 20 20 20 20 69 66 28 20 70 2d 3e 78 43 6f 6e  .    if( p->xCon
4020: 64 3d 3d 30 20 7c 7c 20 70 2d 3e 78 43 6f 6e 64  d==0 || p->xCond
4030: 28 61 42 75 66 2c 20 6e 53 74 65 6d 29 20 29 7b  (aBuf, nStem) ){
4040: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61  .      memcpy(&a
4050: 42 75 66 5b 6e 53 74 65 6d 5d 2c 20 70 2d 3e 7a  Buf[nStem], p->z
4060: 4f 75 74 70 75 74 2c 20 70 2d 3e 6e 4f 75 74 70  Output, p->nOutp
4070: 75 74 29 3b 0a 20 20 20 20 20 20 2a 70 6e 42 75  ut);.      *pnBu
4080: 66 20 3d 20 6e 53 74 65 6d 20 2b 20 70 2d 3e 6e  f = nStem + p->n
4090: 4f 75 74 70 75 74 3b 0a 20 20 20 20 20 20 72 65  Output;.      re
40a0: 74 20 3d 20 70 20 2d 20 61 52 75 6c 65 3b 0a 20  t = p - aRule;. 
40b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
40c0: 72 6e 20 72 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  rn ret;.}.#endif
40d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
40e0: 35 50 6f 72 74 65 72 49 73 56 6f 77 65 6c 28 63  5PorterIsVowel(c
40f0: 68 61 72 20 63 2c 20 69 6e 74 20 62 59 49 73 56  har c, int bYIsV
4100: 6f 77 65 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20  owel){.  return 
4110: 28 0a 20 20 20 20 20 20 63 3d 3d 27 61 27 20 7c  (.      c=='a' |
4120: 7c 20 63 3d 3d 27 65 27 20 7c 7c 20 63 3d 3d 27  | c=='e' || c=='
4130: 69 27 20 7c 7c 20 63 3d 3d 27 6f 27 20 7c 7c 20  i' || c=='o' || 
4140: 63 3d 3d 27 75 27 20 7c 7c 20 28 62 59 49 73 56  c=='u' || (bYIsV
4150: 6f 77 65 6c 20 26 26 20 63 3d 3d 27 79 27 29 0a  owel && c=='y').
4160: 20 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69    );.}..static i
4170: 6e 74 20 66 74 73 35 50 6f 72 74 65 72 47 6f 62  nt fts5PorterGob
4180: 62 6c 65 56 43 28 63 68 61 72 20 2a 7a 53 74 65  bleVC(char *zSte
4190: 6d 2c 20 69 6e 74 20 6e 53 74 65 6d 2c 20 69 6e  m, int nStem, in
41a0: 74 20 62 50 72 65 76 43 6f 6e 73 29 7b 0a 20 20  t bPrevCons){.  
41b0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 43 6f  int i;.  int bCo
41c0: 6e 73 20 3d 20 62 50 72 65 76 43 6f 6e 73 3b 0a  ns = bPrevCons;.
41d0: 0a 20 20 2f 2a 20 53 63 61 6e 20 66 6f 72 20 61  .  /* Scan for a
41e0: 20 76 6f 77 65 6c 20 2a 2f 0a 20 20 66 6f 72 28   vowel */.  for(
41f0: 69 3d 30 3b 20 69 3c 6e 53 74 65 6d 3b 20 69 2b  i=0; i<nStem; i+
4200: 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  +){.    if( 0==(
4210: 62 43 6f 6e 73 20 3d 20 21 66 74 73 35 50 6f 72  bCons = !fts5Por
4220: 74 65 72 49 73 56 6f 77 65 6c 28 7a 53 74 65 6d  terIsVowel(zStem
4230: 5b 69 5d 2c 20 62 43 6f 6e 73 29 29 20 29 20 62  [i], bCons)) ) b
4240: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  reak;.  }..  /* 
4250: 53 63 61 6e 20 66 6f 72 20 61 20 63 6f 6e 73 6f  Scan for a conso
4260: 6e 65 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 2b  nent */.  for(i+
4270: 2b 3b 20 69 3c 6e 53 74 65 6d 3b 20 69 2b 2b 29  +; i<nStem; i++)
4280: 7b 0a 20 20 20 20 69 66 28 20 28 62 43 6f 6e 73  {.    if( (bCons
4290: 20 3d 20 21 66 74 73 35 50 6f 72 74 65 72 49 73   = !fts5PorterIs
42a0: 56 6f 77 65 6c 28 7a 53 74 65 6d 5b 69 5d 2c 20  Vowel(zStem[i], 
42b0: 62 43 6f 6e 73 29 29 20 29 20 72 65 74 75 72 6e  bCons)) ) return
42c0: 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   i+1;.  }.  retu
42d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 70 6f 72 74  rn 0;.}../* port
42e0: 65 72 20 72 75 6c 65 20 63 6f 6e 64 69 74 69 6f  er rule conditio
42f0: 6e 3a 20 28 6d 20 3e 20 30 29 20 2a 2f 0a 73 74  n: (m > 0) */.st
4300: 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 72  atic int fts5Por
4310: 74 65 72 5f 4d 47 74 30 28 63 68 61 72 20 2a 7a  ter_MGt0(char *z
4320: 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74 65 6d 29  Stem, int nStem)
4330: 7b 0a 20 20 72 65 74 75 72 6e 20 21 21 66 74 73  {.  return !!fts
4340: 35 50 6f 72 74 65 72 47 6f 62 62 6c 65 56 43 28  5PorterGobbleVC(
4350: 7a 53 74 65 6d 2c 20 6e 53 74 65 6d 2c 20 30 29  zStem, nStem, 0)
4360: 3b 0a 7d 0a 0a 2f 2a 20 70 6f 72 74 65 72 20 72  ;.}../* porter r
4370: 75 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 28  ule condition: (
4380: 6d 20 3e 20 31 29 20 2a 2f 0a 73 74 61 74 69 63  m > 1) */.static
4390: 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72 5f   int fts5Porter_
43a0: 4d 47 74 31 28 63 68 61 72 20 2a 7a 53 74 65 6d  MGt1(char *zStem
43b0: 2c 20 69 6e 74 20 6e 53 74 65 6d 29 7b 0a 20 20  , int nStem){.  
43c0: 69 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 66 74 73  int n;.  n = fts
43d0: 35 50 6f 72 74 65 72 47 6f 62 62 6c 65 56 43 28  5PorterGobbleVC(
43e0: 7a 53 74 65 6d 2c 20 6e 53 74 65 6d 2c 20 30 29  zStem, nStem, 0)
43f0: 3b 0a 20 20 69 66 28 20 6e 20 26 26 20 66 74 73  ;.  if( n && fts
4400: 35 50 6f 72 74 65 72 47 6f 62 62 6c 65 56 43 28  5PorterGobbleVC(
4410: 26 7a 53 74 65 6d 5b 6e 5d 2c 20 6e 53 74 65 6d  &zStem[n], nStem
4420: 2d 6e 2c 20 31 29 20 29 7b 0a 20 20 20 20 72 65  -n, 1) ){.    re
4430: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
4440: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 70 6f  turn 0;.}../* po
4450: 72 74 65 72 20 72 75 6c 65 20 63 6f 6e 64 69 74  rter rule condit
4460: 69 6f 6e 3a 20 28 6d 20 3d 20 31 29 20 2a 2f 0a  ion: (m = 1) */.
4470: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
4480: 6f 72 74 65 72 5f 4d 45 71 31 28 63 68 61 72 20  orter_MEq1(char 
4490: 2a 7a 53 74 65 6d 2c 20 69 6e 74 20 6e 53 74 65  *zStem, int nSte
44a0: 6d 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e  m){.  int n;.  n
44b0: 20 3d 20 66 74 73 35 50 6f 72 74 65 72 47 6f 62   = fts5PorterGob
44c0: 62 6c 65 56 43 28 7a 53 74 65 6d 2c 20 6e 53 74  bleVC(zStem, nSt
44d0: 65 6d 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 20  em, 0);.  if( n 
44e0: 26 26 20 30 3d 3d 66 74 73 35 50 6f 72 74 65 72  && 0==fts5Porter
44f0: 47 6f 62 62 6c 65 56 43 28 26 7a 53 74 65 6d 5b  GobbleVC(&zStem[
4500: 6e 5d 2c 20 6e 53 74 65 6d 2d 6e 2c 20 31 29 20  n], nStem-n, 1) 
4510: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
4520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4530: 0a 7d 0a 0a 2f 2a 20 70 6f 72 74 65 72 20 72 75  .}../* porter ru
4540: 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 28 2a  le condition: (*
4550: 6f 29 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o) */.static int
4560: 20 66 74 73 35 50 6f 72 74 65 72 5f 4f 73 74 61   fts5Porter_Osta
4570: 72 28 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20 69  r(char *zStem, i
4580: 6e 74 20 6e 53 74 65 6d 29 7b 0a 20 20 69 66 28  nt nStem){.  if(
4590: 20 7a 53 74 65 6d 5b 6e 53 74 65 6d 2d 31 5d 3d   zStem[nStem-1]=
45a0: 3d 27 77 27 20 7c 7c 20 7a 53 74 65 6d 5b 6e 53  ='w' || zStem[nS
45b0: 74 65 6d 2d 31 5d 3d 3d 27 78 27 20 7c 7c 20 7a  tem-1]=='x' || z
45c0: 53 74 65 6d 5b 6e 53 74 65 6d 2d 31 5d 3d 3d 27  Stem[nStem-1]=='
45d0: 79 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y' ){.    return
45e0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
45f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
4600: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 69 6e  mask = 0;.    in
4610: 74 20 62 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  t bCons = 0;.   
4620: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 74 65   for(i=0; i<nSte
4630: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 62  m; i++){.      b
4640: 43 6f 6e 73 20 3d 20 21 66 74 73 35 50 6f 72 74  Cons = !fts5Port
4650: 65 72 49 73 56 6f 77 65 6c 28 7a 53 74 65 6d 5b  erIsVowel(zStem[
4660: 69 5d 2c 20 62 43 6f 6e 73 29 3b 0a 20 20 20 20  i], bCons);.    
4670: 20 20 61 73 73 65 72 74 28 20 62 43 6f 6e 73 3d    assert( bCons=
4680: 3d 30 20 7c 7c 20 62 43 6f 6e 73 3d 3d 31 20 29  =0 || bCons==1 )
4690: 3b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 28  ;.      mask = (
46a0: 6d 61 73 6b 20 3c 3c 20 31 29 20 2b 20 62 43 6f  mask << 1) + bCo
46b0: 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ns;.    }.    re
46c0: 74 75 72 6e 20 28 28 6d 61 73 6b 20 26 20 30 78  turn ((mask & 0x
46d0: 30 30 30 37 29 3d 3d 30 78 30 30 30 35 29 3b 0a  0007)==0x0005);.
46e0: 20 20 7d 0a 7d 0a 0a 2f 2a 20 70 6f 72 74 65 72    }.}../* porter
46f0: 20 72 75 6c 65 20 63 6f 6e 64 69 74 69 6f 6e 3a   rule condition:
4700: 20 28 6d 20 3e 20 31 20 61 6e 64 20 28 2a 53 20   (m > 1 and (*S 
4710: 6f 72 20 2a 54 29 29 20 2a 2f 0a 73 74 61 74 69  or *T)) */.stati
4720: 63 20 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72  c int fts5Porter
4730: 5f 4d 47 74 31 5f 61 6e 64 5f 53 5f 6f 72 5f 54  _MGt1_and_S_or_T
4740: 28 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20 69 6e  (char *zStem, in
4750: 74 20 6e 53 74 65 6d 29 7b 0a 20 20 61 73 73 65  t nStem){.  asse
4760: 72 74 28 20 6e 53 74 65 6d 3e 30 20 29 3b 0a 20  rt( nStem>0 );. 
4770: 20 72 65 74 75 72 6e 20 28 7a 53 74 65 6d 5b 6e   return (zStem[n
4780: 53 74 65 6d 2d 31 5d 3d 3d 27 73 27 20 7c 7c 20  Stem-1]=='s' || 
4790: 7a 53 74 65 6d 5b 6e 53 74 65 6d 2d 31 5d 3d 3d  zStem[nStem-1]==
47a0: 27 74 27 29 20 0a 20 20 20 20 20 20 26 26 20 66  't') .      && f
47b0: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 7a  ts5Porter_MGt1(z
47c0: 53 74 65 6d 2c 20 6e 53 74 65 6d 29 3b 0a 7d 0a  Stem, nStem);.}.
47d0: 0a 2f 2a 20 70 6f 72 74 65 72 20 72 75 6c 65 20  ./* porter rule 
47e0: 63 6f 6e 64 69 74 69 6f 6e 3a 20 28 2a 76 2a 29  condition: (*v*)
47f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66   */.static int f
4800: 74 73 35 50 6f 72 74 65 72 5f 56 6f 77 65 6c 28  ts5Porter_Vowel(
4810: 63 68 61 72 20 2a 7a 53 74 65 6d 2c 20 69 6e 74  char *zStem, int
4820: 20 6e 53 74 65 6d 29 7b 0a 20 20 69 6e 74 20 69   nStem){.  int i
4830: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
4840: 53 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Stem; i++){.    
4850: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 49 73  if( fts5PorterIs
4860: 56 6f 77 65 6c 28 7a 53 74 65 6d 5b 69 5d 2c 20  Vowel(zStem[i], 
4870: 69 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  i>0) ){.      re
4880: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4890: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
48a0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
48b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 20 47 45 4e  *********.** GEN
4940: 45 52 41 54 45 44 20 43 4f 44 45 20 53 54 41 52  ERATED CODE STAR
4950: 54 53 20 48 45 52 45 20 28 6d 6b 70 6f 72 74 65  TS HERE (mkporte
4960: 72 73 74 65 70 73 2e 74 63 6c 29 0a 2a 2f 0a 0a  rsteps.tcl).*/..
4970: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
4980: 6f 72 74 65 72 53 74 65 70 34 28 63 68 61 72 20  orterStep4(char 
4990: 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70 6e 42 75  *aBuf, int *pnBu
49a0: 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20  f){.  int ret = 
49b0: 30 3b 0a 20 20 69 6e 74 20 6e 42 75 66 20 3d 20  0;.  int nBuf = 
49c0: 2a 70 6e 42 75 66 3b 0a 20 20 73 77 69 74 63 68  *pnBuf;.  switch
49d0: 28 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d 20 29  ( aBuf[nBuf-2] )
49e0: 7b 0a 20 20 20 20 0a 20 20 20 20 63 61 73 65 20  {.    .    case 
49f0: 27 61 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20  'a': .      if( 
4a00: 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>2 && 0==mem
4a10: 63 6d 70 28 22 61 6c 22 2c 20 26 61 42 75 66 5b  cmp("al", &aBuf[
4a20: 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b 0a 20  nBuf-2], 2) ){. 
4a30: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
4a40: 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c  orter_MGt1(aBuf,
4a50: 20 6e 42 75 66 2d 32 29 20 29 7b 0a 20 20 20 20   nBuf-2) ){.    
4a60: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
4a70: 42 75 66 20 2d 20 32 3b 0a 20 20 20 20 20 20 20  Buf - 2;.       
4a80: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
4a90: 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63   break;.  .    c
4aa0: 61 73 65 20 27 63 27 3a 20 0a 20 20 20 20 20 20  ase 'c': .      
4ab0: 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d  if( nBuf>4 && 0=
4ac0: 3d 6d 65 6d 63 6d 70 28 22 61 6e 63 65 22 2c 20  =memcmp("ance", 
4ad0: 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34  &aBuf[nBuf-4], 4
4ae0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
4af0: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31   fts5Porter_MGt1
4b00: 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29  (aBuf, nBuf-4) )
4b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42  {.          *pnB
4b20: 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 3b 0a 20  uf = nBuf - 4;. 
4b30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4b40: 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 34 20  else if( nBuf>4 
4b50: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65 6e  && 0==memcmp("en
4b60: 63 65 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  ce", &aBuf[nBuf-
4b70: 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  4], 4) ){.      
4b80: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
4b90: 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66  _MGt1(aBuf, nBuf
4ba0: 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
4bb0: 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d   *pnBuf = nBuf -
4bc0: 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
4bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
4be0: 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27  k;.  .    case '
4bf0: 65 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e  e': .      if( n
4c00: 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>2 && 0==memc
4c10: 6d 70 28 22 65 72 22 2c 20 26 61 42 75 66 5b 6e  mp("er", &aBuf[n
4c20: 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b 0a 20 20  Buf-2], 2) ){.  
4c30: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
4c40: 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20  rter_MGt1(aBuf, 
4c50: 6e 42 75 66 2d 32 29 20 29 7b 0a 20 20 20 20 20  nBuf-2) ){.     
4c60: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
4c70: 75 66 20 2d 20 32 3b 0a 20 20 20 20 20 20 20 20  uf - 2;.        
4c80: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4c90: 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61  break;.  .    ca
4ca0: 73 65 20 27 69 27 3a 20 0a 20 20 20 20 20 20 69  se 'i': .      i
4cb0: 66 28 20 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d  f( nBuf>2 && 0==
4cc0: 6d 65 6d 63 6d 70 28 22 69 63 22 2c 20 26 61 42  memcmp("ic", &aB
4cd0: 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29  uf[nBuf-2], 2) )
4ce0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
4cf0: 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42  s5Porter_MGt1(aB
4d00: 75 66 2c 20 6e 42 75 66 2d 32 29 20 29 7b 0a 20  uf, nBuf-2) ){. 
4d10: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
4d20: 3d 20 6e 42 75 66 20 2d 20 32 3b 0a 20 20 20 20  = nBuf - 2;.    
4d30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20      break;.  .  
4d50: 20 20 63 61 73 65 20 27 6c 27 3a 20 0a 20 20 20    case 'l': .   
4d60: 20 20 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26     if( nBuf>4 &&
4d70: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 62 6c 65   0==memcmp("able
4d80: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d  ", &aBuf[nBuf-4]
4d90: 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 4) ){.        
4da0: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
4db0: 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 34  Gt1(aBuf, nBuf-4
4dc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  ) ){.          *
4dd0: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34  pnBuf = nBuf - 4
4de0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4df0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66    }else if( nBuf
4e00: 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >4 && 0==memcmp(
4e10: 22 69 62 6c 65 22 2c 20 26 61 42 75 66 5b 6e 42  "ible", &aBuf[nB
4e20: 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20  uf-4], 4) ){.   
4e30: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
4e40: 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e  ter_MGt1(aBuf, n
4e50: 42 75 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20  Buf-4) ){.      
4e60: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
4e70: 66 20 2d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  f - 4;.        }
4e80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4e90: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73  reak;.  .    cas
4ea0: 65 20 27 6e 27 3a 20 0a 20 20 20 20 20 20 69 66  e 'n': .      if
4eb0: 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d  ( nBuf>3 && 0==m
4ec0: 65 6d 63 6d 70 28 22 61 6e 74 22 2c 20 26 61 42  emcmp("ant", &aB
4ed0: 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29  uf[nBuf-3], 3) )
4ee0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
4ef0: 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42  s5Porter_MGt1(aB
4f00: 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20  uf, nBuf-3) ){. 
4f10: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
4f20: 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20  = nBuf - 3;.    
4f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
4f40: 65 20 69 66 28 20 6e 42 75 66 3e 35 20 26 26 20  e if( nBuf>5 && 
4f50: 30 3d 3d 6d 65 6d 63 6d 70 28 22 65 6d 65 6e 74  0==memcmp("ement
4f60: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d  ", &aBuf[nBuf-5]
4f70: 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 5) ){.        
4f80: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
4f90: 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 35  Gt1(aBuf, nBuf-5
4fa0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  ) ){.          *
4fb0: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 35  pnBuf = nBuf - 5
4fc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4fd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66    }else if( nBuf
4fe0: 3e 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >4 && 0==memcmp(
4ff0: 22 6d 65 6e 74 22 2c 20 26 61 42 75 66 5b 6e 42  "ment", &aBuf[nB
5000: 75 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20  uf-4], 4) ){.   
5010: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
5020: 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e  ter_MGt1(aBuf, n
5030: 42 75 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20  Buf-4) ){.      
5040: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
5050: 66 20 2d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  f - 4;.        }
5060: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
5070: 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65   nBuf>3 && 0==me
5080: 6d 63 6d 70 28 22 65 6e 74 22 2c 20 26 61 42 75  mcmp("ent", &aBu
5090: 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b  f[nBuf-3], 3) ){
50a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
50b0: 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75  5Porter_MGt1(aBu
50c0: 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20  f, nBuf-3) ){.  
50d0: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
50e0: 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20 20   nBuf - 3;.     
50f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20     break;.  .   
5110: 20 63 61 73 65 20 27 6f 27 3a 20 0a 20 20 20 20   case 'o': .    
5120: 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20    if( nBuf>3 && 
5130: 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 6f 6e 22 2c  0==memcmp("ion",
5140: 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20   &aBuf[nBuf-3], 
5150: 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  3) ){.        if
5160: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
5170: 31 5f 61 6e 64 5f 53 5f 6f 72 5f 54 28 61 42 75  1_and_S_or_T(aBu
5180: 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20  f, nBuf-3) ){.  
5190: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
51a0: 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20 20   nBuf - 3;.     
51b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
51c0: 20 69 66 28 20 6e 42 75 66 3e 32 20 26 26 20 30   if( nBuf>2 && 0
51d0: 3d 3d 6d 65 6d 63 6d 70 28 22 6f 75 22 2c 20 26  ==memcmp("ou", &
51e0: 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 32 29  aBuf[nBuf-2], 2)
51f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5200: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28  fts5Porter_MGt1(
5210: 61 42 75 66 2c 20 6e 42 75 66 2d 32 29 20 29 7b  aBuf, nBuf-2) ){
5220: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
5230: 66 20 3d 20 6e 42 75 66 20 2d 20 32 3b 0a 20 20  f = nBuf - 2;.  
5240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5250: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
5260: 20 20 20 20 63 61 73 65 20 27 73 27 3a 20 0a 20      case 's': . 
5270: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20       if( nBuf>3 
5280: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 73  && 0==memcmp("is
5290: 6d 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33  m", &aBuf[nBuf-3
52a0: 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 3) ){.       
52b0: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
52c0: 4d 47 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d  MGt1(aBuf, nBuf-
52d0: 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  3) ){.          
52e0: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
52f0: 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  3;.        }.   
5300: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
5310: 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27 74  ;.  .    case 't
5320: 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42  ': .      if( nB
5330: 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>3 && 0==memcm
5340: 70 28 22 61 74 65 22 2c 20 26 61 42 75 66 5b 6e  p("ate", &aBuf[n
5350: 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20  Buf-3], 3) ){.  
5360: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
5370: 72 74 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20  rter_MGt1(aBuf, 
5380: 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20 20 20 20  nBuf-3) ){.     
5390: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
53a0: 75 66 20 2d 20 33 3b 0a 20 20 20 20 20 20 20 20  uf - 3;.        
53b0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
53c0: 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d  ( nBuf>3 && 0==m
53d0: 65 6d 63 6d 70 28 22 69 74 69 22 2c 20 26 61 42  emcmp("iti", &aB
53e0: 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29  uf[nBuf-3], 3) )
53f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
5400: 73 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42  s5Porter_MGt1(aB
5410: 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20  uf, nBuf-3) ){. 
5420: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
5430: 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20  = nBuf - 3;.    
5440: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5450: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20      break;.  .  
5460: 20 20 63 61 73 65 20 27 75 27 3a 20 0a 20 20 20    case 'u': .   
5470: 20 20 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26     if( nBuf>3 &&
5480: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 6f 75 73 22   0==memcmp("ous"
5490: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c  , &aBuf[nBuf-3],
54a0: 20 33 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   3) ){.        i
54b0: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
54c0: 74 31 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29  t1(aBuf, nBuf-3)
54d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
54e0: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b  nBuf = nBuf - 3;
54f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5500: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
5510: 20 20 0a 20 20 20 20 63 61 73 65 20 27 76 27 3a    .    case 'v':
5520: 20 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66   .      if( nBuf
5530: 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >3 && 0==memcmp(
5540: 22 69 76 65 22 2c 20 26 61 42 75 66 5b 6e 42 75  "ive", &aBuf[nBu
5550: 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20 20 20 20  f-3], 3) ){.    
5560: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
5570: 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42  er_MGt1(aBuf, nB
5580: 75 66 2d 33 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-3) ){.       
5590: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
55a0: 20 2d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a   - 3;.        }.
55b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
55c0: 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65  eak;.  .    case
55d0: 20 27 7a 27 3a 20 0a 20 20 20 20 20 20 69 66 28   'z': .      if(
55e0: 20 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65   nBuf>3 && 0==me
55f0: 6d 63 6d 70 28 22 69 7a 65 22 2c 20 26 61 42 75  mcmp("ize", &aBu
5600: 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b  f[nBuf-3], 3) ){
5610: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
5620: 35 50 6f 72 74 65 72 5f 4d 47 74 31 28 61 42 75  5Porter_MGt1(aBu
5630: 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20  f, nBuf-3) ){.  
5640: 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d          *pnBuf =
5650: 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20 20   nBuf - 3;.     
5660: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5670: 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 7d     break;.  .  }
5680: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
5690: 0a 20 20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .  ..static int 
56a0: 66 74 73 35 50 6f 72 74 65 72 53 74 65 70 31 42  fts5PorterStep1B
56b0: 32 28 63 68 61 72 20 2a 61 42 75 66 2c 20 69 6e  2(char *aBuf, in
56c0: 74 20 2a 70 6e 42 75 66 29 7b 0a 20 20 69 6e 74  t *pnBuf){.  int
56d0: 20 72 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   ret = 0;.  int 
56e0: 6e 42 75 66 20 3d 20 2a 70 6e 42 75 66 3b 0a 20  nBuf = *pnBuf;. 
56f0: 20 73 77 69 74 63 68 28 20 61 42 75 66 5b 6e 42   switch( aBuf[nB
5700: 75 66 2d 32 5d 20 29 7b 0a 20 20 20 20 0a 20 20  uf-2] ){.    .  
5710: 20 20 63 61 73 65 20 27 61 27 3a 20 0a 20 20 20    case 'a': .   
5720: 20 20 20 69 66 28 20 6e 42 75 66 3e 32 20 26 26     if( nBuf>2 &&
5730: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 74 22 2c   0==memcmp("at",
5740: 20 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20   &aBuf[nBuf-2], 
5750: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  2) ){.        me
5760: 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d  mcpy(&aBuf[nBuf-
5770: 32 5d 2c 20 22 61 74 65 22 2c 20 33 29 3b 0a 20  2], "ate", 3);. 
5780: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
5790: 6e 42 75 66 20 2d 20 32 20 2b 20 33 3b 0a 20 20  nBuf - 2 + 3;.  
57a0: 20 20 20 20 20 20 72 65 74 20 3d 20 31 3b 0a 20        ret = 1;. 
57b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
57c0: 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20  ak;.  .    case 
57d0: 27 62 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20  'b': .      if( 
57e0: 6e 42 75 66 3e 32 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>2 && 0==mem
57f0: 63 6d 70 28 22 62 6c 22 2c 20 26 61 42 75 66 5b  cmp("bl", &aBuf[
5800: 6e 42 75 66 2d 32 5d 2c 20 32 29 20 29 7b 0a 20  nBuf-2], 2) ){. 
5810: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
5820: 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20 22 62 6c  Buf[nBuf-2], "bl
5830: 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  e", 3);.        
5840: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
5850: 32 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 72  2 + 3;.        r
5860: 65 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  et = 1;.      }.
5870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
5880: 20 20 20 20 63 61 73 65 20 27 69 27 3a 20 0a 20      case 'i': . 
5890: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 32 20       if( nBuf>2 
58a0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 7a  && 0==memcmp("iz
58b0: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d  ", &aBuf[nBuf-2]
58c0: 2c 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 2) ){.        
58d0: 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75  memcpy(&aBuf[nBu
58e0: 66 2d 32 5d 2c 20 22 69 7a 65 22 2c 20 33 29 3b  f-2], "ize", 3);
58f0: 0a 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20  .        *pnBuf 
5900: 3d 20 6e 42 75 66 20 2d 20 32 20 2b 20 33 3b 0a  = nBuf - 2 + 3;.
5910: 20 20 20 20 20 20 20 20 72 65 74 20 3d 20 31 3b          ret = 1;
5920: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
5930: 72 65 61 6b 3b 0a 20 20 0a 20 20 7d 0a 20 20 72  reak;.  .  }.  r
5940: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 20 20 0a  eturn ret;.}.  .
5950: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
5960: 50 6f 72 74 65 72 53 74 65 70 32 28 63 68 61 72  PorterStep2(char
5970: 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70 6e 42   *aBuf, int *pnB
5980: 75 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d  uf){.  int ret =
5990: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 75 66 20 3d   0;.  int nBuf =
59a0: 20 2a 70 6e 42 75 66 3b 0a 20 20 73 77 69 74 63   *pnBuf;.  switc
59b0: 68 28 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d 20  h( aBuf[nBuf-2] 
59c0: 29 7b 0a 20 20 20 20 0a 20 20 20 20 63 61 73 65  ){.    .    case
59d0: 20 27 61 27 3a 20 0a 20 20 20 20 20 20 69 66 28   'a': .      if(
59e0: 20 6e 42 75 66 3e 37 20 26 26 20 30 3d 3d 6d 65   nBuf>7 && 0==me
59f0: 6d 63 6d 70 28 22 61 74 69 6f 6e 61 6c 22 2c 20  mcmp("ational", 
5a00: 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 37  &aBuf[nBuf-7], 7
5a10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
5a20: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30   fts5Porter_MGt0
5a30: 28 61 42 75 66 2c 20 6e 42 75 66 2d 37 29 20 29  (aBuf, nBuf-7) )
5a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
5a50: 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d  py(&aBuf[nBuf-7]
5a60: 2c 20 22 61 74 65 22 2c 20 33 29 3b 0a 20 20 20  , "ate", 3);.   
5a70: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
5a80: 6e 42 75 66 20 2d 20 37 20 2b 20 33 3b 0a 20 20  nBuf - 7 + 3;.  
5a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5aa0: 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 36 20 26  lse if( nBuf>6 &
5ab0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 74 69 6f  & 0==memcmp("tio
5ac0: 6e 61 6c 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  nal", &aBuf[nBuf
5ad0: 2d 36 5d 2c 20 36 29 20 29 7b 0a 20 20 20 20 20  -6], 6) ){.     
5ae0: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
5af0: 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75  r_MGt0(aBuf, nBu
5b00: 66 2d 36 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-6) ){.        
5b10: 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e    memcpy(&aBuf[n
5b20: 42 75 66 2d 36 5d 2c 20 22 74 69 6f 6e 22 2c 20  Buf-6], "tion", 
5b30: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  4);.          *p
5b40: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 36 20  nBuf = nBuf - 6 
5b50: 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  + 4;.        }. 
5b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5b70: 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20  ak;.  .    case 
5b80: 27 63 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20  'c': .      if( 
5b90: 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>4 && 0==mem
5ba0: 63 6d 70 28 22 65 6e 63 69 22 2c 20 26 61 42 75  cmp("enci", &aBu
5bb0: 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b  f[nBuf-4], 4) ){
5bc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
5bd0: 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75  5Porter_MGt0(aBu
5be0: 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20  f, nBuf-4) ){.  
5bf0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
5c00: 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 22 65  aBuf[nBuf-4], "e
5c10: 6e 63 65 22 2c 20 34 29 3b 0a 20 20 20 20 20 20  nce", 4);.      
5c20: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
5c30: 66 20 2d 20 34 20 2b 20 34 3b 0a 20 20 20 20 20  f - 4 + 4;.     
5c40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
5c50: 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30   if( nBuf>4 && 0
5c60: 3d 3d 6d 65 6d 63 6d 70 28 22 61 6e 63 69 22 2c  ==memcmp("anci",
5c70: 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20   &aBuf[nBuf-4], 
5c80: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  4) ){.        if
5c90: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
5ca0: 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20  0(aBuf, nBuf-4) 
5cb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
5cc0: 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 34  cpy(&aBuf[nBuf-4
5cd0: 5d 2c 20 22 61 6e 63 65 22 2c 20 34 29 3b 0a 20  ], "ance", 4);. 
5ce0: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
5cf0: 3d 20 6e 42 75 66 20 2d 20 34 20 2b 20 34 3b 0a  = nBuf - 4 + 4;.
5d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5d10: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
5d20: 20 0a 20 20 20 20 63 61 73 65 20 27 65 27 3a 20   .    case 'e': 
5d30: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e  .      if( nBuf>
5d40: 34 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  4 && 0==memcmp("
5d50: 69 7a 65 72 22 2c 20 26 61 42 75 66 5b 6e 42 75  izer", &aBuf[nBu
5d60: 66 2d 34 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20  f-4], 4) ){.    
5d70: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
5d80: 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42  er_MGt0(aBuf, nB
5d90: 75 66 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  uf-4) ){.       
5da0: 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b     memcpy(&aBuf[
5db0: 6e 42 75 66 2d 34 5d 2c 20 22 69 7a 65 22 2c 20  nBuf-4], "ize", 
5dc0: 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  3);.          *p
5dd0: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 20  nBuf = nBuf - 4 
5de0: 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  + 3;.        }. 
5df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5e00: 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20  ak;.  .    case 
5e10: 27 67 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20  'g': .      if( 
5e20: 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>4 && 0==mem
5e30: 63 6d 70 28 22 6c 6f 67 69 22 2c 20 26 61 42 75  cmp("logi", &aBu
5e40: 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29 7b  f[nBuf-4], 4) ){
5e50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
5e60: 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75  5Porter_MGt0(aBu
5e70: 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20 20  f, nBuf-4) ){.  
5e80: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
5e90: 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 22 6c  aBuf[nBuf-4], "l
5ea0: 6f 67 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20  og", 3);.       
5eb0: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
5ec0: 20 2d 20 34 20 2b 20 33 3b 0a 20 20 20 20 20 20   - 4 + 3;.      
5ed0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20    break;.  .    
5ef0: 63 61 73 65 20 27 6c 27 3a 20 0a 20 20 20 20 20  case 'l': .     
5f00: 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30   if( nBuf>3 && 0
5f10: 3d 3d 6d 65 6d 63 6d 70 28 22 62 6c 69 22 2c 20  ==memcmp("bli", 
5f20: 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33  &aBuf[nBuf-3], 3
5f30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
5f40: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30   fts5Porter_MGt0
5f50: 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29  (aBuf, nBuf-3) )
5f60: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
5f70: 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d  py(&aBuf[nBuf-3]
5f80: 2c 20 22 62 6c 65 22 2c 20 33 29 3b 0a 20 20 20  , "ble", 3);.   
5f90: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
5fa0: 6e 42 75 66 20 2d 20 33 20 2b 20 33 3b 0a 20 20  nBuf - 3 + 3;.  
5fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5fc0: 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 34 20 26  lse if( nBuf>4 &
5fd0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 6c 6c  & 0==memcmp("all
5fe0: 69 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 34  i", &aBuf[nBuf-4
5ff0: 5d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 4) ){.       
6000: 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f   if( fts5Porter_
6010: 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d  MGt0(aBuf, nBuf-
6020: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4) ){.          
6030: 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75  memcpy(&aBuf[nBu
6040: 66 2d 34 5d 2c 20 22 61 6c 22 2c 20 32 29 3b 0a  f-4], "al", 2);.
6050: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
6060: 20 3d 20 6e 42 75 66 20 2d 20 34 20 2b 20 32 3b   = nBuf - 4 + 2;
6070: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6080: 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e   }else if( nBuf>
6090: 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  5 && 0==memcmp("
60a0: 65 6e 74 6c 69 22 2c 20 26 61 42 75 66 5b 6e 42  entli", &aBuf[nB
60b0: 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20  uf-5], 5) ){.   
60c0: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
60d0: 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e  ter_MGt0(aBuf, n
60e0: 42 75 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20  Buf-5) ){.      
60f0: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66      memcpy(&aBuf
6100: 5b 6e 42 75 66 2d 35 5d 2c 20 22 65 6e 74 22 2c  [nBuf-5], "ent",
6110: 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a   3);.          *
6120: 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 35  pnBuf = nBuf - 5
6130: 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a   + 3;.        }.
6140: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6150: 6e 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>3 && 0==mem
6160: 63 6d 70 28 22 65 6c 69 22 2c 20 26 61 42 75 66  cmp("eli", &aBuf
6170: 5b 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a  [nBuf-3], 3) ){.
6180: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
6190: 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66  Porter_MGt0(aBuf
61a0: 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20 20  , nBuf-3) ){.   
61b0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
61c0: 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 22 65 22  Buf[nBuf-3], "e"
61d0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
61e0: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
61f0: 33 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  3 + 1;.        }
6200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6210: 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65   nBuf>5 && 0==me
6220: 6d 63 6d 70 28 22 6f 75 73 6c 69 22 2c 20 26 61  mcmp("ousli", &a
6230: 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20  Buf[nBuf-5], 5) 
6240: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ){.        if( f
6250: 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61  ts5Porter_MGt0(a
6260: 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a  Buf, nBuf-5) ){.
6270: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6280: 28 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20  (&aBuf[nBuf-5], 
6290: 22 6f 75 73 22 2c 20 33 29 3b 0a 20 20 20 20 20  "ous", 3);.     
62a0: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
62b0: 75 66 20 2d 20 35 20 2b 20 33 3b 0a 20 20 20 20  uf - 5 + 3;.    
62c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
62d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20      break;.  .  
62e0: 20 20 63 61 73 65 20 27 6f 27 3a 20 0a 20 20 20    case 'o': .   
62f0: 20 20 20 69 66 28 20 6e 42 75 66 3e 37 20 26 26     if( nBuf>7 &&
6300: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 7a 61 74   0==memcmp("izat
6310: 69 6f 6e 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  ion", &aBuf[nBuf
6320: 2d 37 5d 2c 20 37 29 20 29 7b 0a 20 20 20 20 20  -7], 7) ){.     
6330: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
6340: 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75  r_MGt0(aBuf, nBu
6350: 66 2d 37 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-7) ){.        
6360: 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e    memcpy(&aBuf[n
6370: 42 75 66 2d 37 5d 2c 20 22 69 7a 65 22 2c 20 33  Buf-7], "ize", 3
6380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  );.          *pn
6390: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 37 20 2b  Buf = nBuf - 7 +
63a0: 20 33 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   3;.        }.  
63b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42      }else if( nB
63c0: 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  uf>5 && 0==memcm
63d0: 70 28 22 61 74 69 6f 6e 22 2c 20 26 61 42 75 66  p("ation", &aBuf
63e0: 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a  [nBuf-5], 5) ){.
63f0: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
6400: 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66  Porter_MGt0(aBuf
6410: 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20 20 20  , nBuf-5) ){.   
6420: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
6430: 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 22 61 74  Buf[nBuf-5], "at
6440: 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  e", 3);.        
6450: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
6460: 2d 20 35 20 2b 20 33 3b 0a 20 20 20 20 20 20 20  - 5 + 3;.       
6470: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
6480: 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d  f( nBuf>4 && 0==
6490: 6d 65 6d 63 6d 70 28 22 61 74 6f 72 22 2c 20 26  memcmp("ator", &
64a0: 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29  aBuf[nBuf-4], 4)
64b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
64c0: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
64d0: 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b  aBuf, nBuf-4) ){
64e0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
64f0: 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c  y(&aBuf[nBuf-4],
6500: 20 22 61 74 65 22 2c 20 33 29 3b 0a 20 20 20 20   "ate", 3);.    
6510: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
6520: 42 75 66 20 2d 20 34 20 2b 20 33 3b 0a 20 20 20  Buf - 4 + 3;.   
6530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20       break;.  . 
6550: 20 20 20 63 61 73 65 20 27 73 27 3a 20 0a 20 20     case 's': .  
6560: 20 20 20 20 69 66 28 20 6e 42 75 66 3e 35 20 26      if( nBuf>5 &
6570: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 6c 69  & 0==memcmp("ali
6580: 73 6d 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d  sm", &aBuf[nBuf-
6590: 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  5], 5) ){.      
65a0: 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65 72    if( fts5Porter
65b0: 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66  _MGt0(aBuf, nBuf
65c0: 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -5) ){.         
65d0: 20 6d 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42   memcpy(&aBuf[nB
65e0: 75 66 2d 35 5d 2c 20 22 61 6c 22 2c 20 32 29 3b  uf-5], "al", 2);
65f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
6600: 66 20 3d 20 6e 42 75 66 20 2d 20 35 20 2b 20 32  f = nBuf - 5 + 2
6610: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6620: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66    }else if( nBuf
6630: 3e 37 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  >7 && 0==memcmp(
6640: 22 69 76 65 6e 65 73 73 22 2c 20 26 61 42 75 66  "iveness", &aBuf
6650: 5b 6e 42 75 66 2d 37 5d 2c 20 37 29 20 29 7b 0a  [nBuf-7], 7) ){.
6660: 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
6670: 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66  Porter_MGt0(aBuf
6680: 2c 20 6e 42 75 66 2d 37 29 20 29 7b 0a 20 20 20  , nBuf-7) ){.   
6690: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
66a0: 42 75 66 5b 6e 42 75 66 2d 37 5d 2c 20 22 69 76  Buf[nBuf-7], "iv
66b0: 65 22 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20  e", 3);.        
66c0: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
66d0: 2d 20 37 20 2b 20 33 3b 0a 20 20 20 20 20 20 20  - 7 + 3;.       
66e0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
66f0: 66 28 20 6e 42 75 66 3e 37 20 26 26 20 30 3d 3d  f( nBuf>7 && 0==
6700: 6d 65 6d 63 6d 70 28 22 66 75 6c 6e 65 73 73 22  memcmp("fulness"
6710: 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 37 5d 2c  , &aBuf[nBuf-7],
6720: 20 37 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69   7) ){.        i
6730: 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47  f( fts5Porter_MG
6740: 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 37 29  t0(aBuf, nBuf-7)
6750: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
6760: 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d  mcpy(&aBuf[nBuf-
6770: 37 5d 2c 20 22 66 75 6c 22 2c 20 33 29 3b 0a 20  7], "ful", 3);. 
6780: 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20           *pnBuf 
6790: 3d 20 6e 42 75 66 20 2d 20 37 20 2b 20 33 3b 0a  = nBuf - 7 + 3;.
67a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
67b0: 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e 37  }else if( nBuf>7
67c0: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 6f   && 0==memcmp("o
67d0: 75 73 6e 65 73 73 22 2c 20 26 61 42 75 66 5b 6e  usness", &aBuf[n
67e0: 42 75 66 2d 37 5d 2c 20 37 29 20 29 7b 0a 20 20  Buf-7], 7) ){.  
67f0: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
6800: 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20  rter_MGt0(aBuf, 
6810: 6e 42 75 66 2d 37 29 20 29 7b 0a 20 20 20 20 20  nBuf-7) ){.     
6820: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75       memcpy(&aBu
6830: 66 5b 6e 42 75 66 2d 37 5d 2c 20 22 6f 75 73 22  f[nBuf-7], "ous"
6840: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
6850: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
6860: 37 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 7d  7 + 3;.        }
6870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6880: 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73  reak;.  .    cas
6890: 65 20 27 74 27 3a 20 0a 20 20 20 20 20 20 69 66  e 't': .      if
68a0: 28 20 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d  ( nBuf>5 && 0==m
68b0: 65 6d 63 6d 70 28 22 61 6c 69 74 69 22 2c 20 26  emcmp("aliti", &
68c0: 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29  aBuf[nBuf-5], 5)
68d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
68e0: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
68f0: 61 42 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b  aBuf, nBuf-5) ){
6900: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
6910: 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c  y(&aBuf[nBuf-5],
6920: 20 22 61 6c 22 2c 20 32 29 3b 0a 20 20 20 20 20   "al", 2);.     
6930: 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42       *pnBuf = nB
6940: 75 66 20 2d 20 35 20 2b 20 32 3b 0a 20 20 20 20  uf - 5 + 2;.    
6950: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6960: 65 20 69 66 28 20 6e 42 75 66 3e 35 20 26 26 20  e if( nBuf>5 && 
6970: 30 3d 3d 6d 65 6d 63 6d 70 28 22 69 76 69 74 69  0==memcmp("iviti
6980: 22 2c 20 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d  ", &aBuf[nBuf-5]
6990: 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 5) ){.        
69a0: 69 66 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d  if( fts5Porter_M
69b0: 47 74 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 35  Gt0(aBuf, nBuf-5
69c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ) ){.          m
69d0: 65 6d 63 70 79 28 26 61 42 75 66 5b 6e 42 75 66  emcpy(&aBuf[nBuf
69e0: 2d 35 5d 2c 20 22 69 76 65 22 2c 20 33 29 3b 0a  -5], "ive", 3);.
69f0: 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75 66            *pnBuf
6a00: 20 3d 20 6e 42 75 66 20 2d 20 35 20 2b 20 33 3b   = nBuf - 5 + 3;
6a10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6a20: 20 7d 65 6c 73 65 20 69 66 28 20 6e 42 75 66 3e   }else if( nBuf>
6a30: 36 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  6 && 0==memcmp("
6a40: 62 69 6c 69 74 69 22 2c 20 26 61 42 75 66 5b 6e  biliti", &aBuf[n
6a50: 42 75 66 2d 36 5d 2c 20 36 29 20 29 7b 0a 20 20  Buf-6], 6) ){.  
6a60: 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f        if( fts5Po
6a70: 72 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20  rter_MGt0(aBuf, 
6a80: 6e 42 75 66 2d 36 29 20 29 7b 0a 20 20 20 20 20  nBuf-6) ){.     
6a90: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75       memcpy(&aBu
6aa0: 66 5b 6e 42 75 66 2d 36 5d 2c 20 22 62 6c 65 22  f[nBuf-6], "ble"
6ab0: 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 3);.          
6ac0: 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20  *pnBuf = nBuf - 
6ad0: 36 20 2b 20 33 3b 0a 20 20 20 20 20 20 20 20 7d  6 + 3;.        }
6ae0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6af0: 72 65 61 6b 3b 0a 20 20 0a 20 20 7d 0a 20 20 72  reak;.  .  }.  r
6b00: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 20 20 0a  eturn ret;.}.  .
6b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
6b20: 50 6f 72 74 65 72 53 74 65 70 33 28 63 68 61 72  PorterStep3(char
6b30: 20 2a 61 42 75 66 2c 20 69 6e 74 20 2a 70 6e 42   *aBuf, int *pnB
6b40: 75 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d  uf){.  int ret =
6b50: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 75 66 20 3d   0;.  int nBuf =
6b60: 20 2a 70 6e 42 75 66 3b 0a 20 20 73 77 69 74 63   *pnBuf;.  switc
6b70: 68 28 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d 20  h( aBuf[nBuf-2] 
6b80: 29 7b 0a 20 20 20 20 0a 20 20 20 20 63 61 73 65  ){.    .    case
6b90: 20 27 61 27 3a 20 0a 20 20 20 20 20 20 69 66 28   'a': .      if(
6ba0: 20 6e 42 75 66 3e 34 20 26 26 20 30 3d 3d 6d 65   nBuf>4 && 0==me
6bb0: 6d 63 6d 70 28 22 69 63 61 6c 22 2c 20 26 61 42  mcmp("ical", &aB
6bc0: 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 34 29 20 29  uf[nBuf-4], 4) )
6bd0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
6be0: 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42  s5Porter_MGt0(aB
6bf0: 75 66 2c 20 6e 42 75 66 2d 34 29 20 29 7b 0a 20  uf, nBuf-4) ){. 
6c00: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6c10: 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20 22  &aBuf[nBuf-4], "
6c20: 69 63 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  ic", 2);.       
6c30: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
6c40: 20 2d 20 34 20 2b 20 32 3b 0a 20 20 20 20 20 20   - 4 + 2;.      
6c50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6c60: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20    break;.  .    
6c70: 63 61 73 65 20 27 73 27 3a 20 0a 20 20 20 20 20  case 's': .     
6c80: 20 69 66 28 20 6e 42 75 66 3e 34 20 26 26 20 30   if( nBuf>4 && 0
6c90: 3d 3d 6d 65 6d 63 6d 70 28 22 6e 65 73 73 22 2c  ==memcmp("ness",
6ca0: 20 26 61 42 75 66 5b 6e 42 75 66 2d 34 5d 2c 20   &aBuf[nBuf-4], 
6cb0: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  4) ){.        if
6cc0: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74  ( fts5Porter_MGt
6cd0: 30 28 61 42 75 66 2c 20 6e 42 75 66 2d 34 29 20  0(aBuf, nBuf-4) 
6ce0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  ){.          *pn
6cf0: 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 34 3b 0a  Buf = nBuf - 4;.
6d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6d10: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6d20: 20 0a 20 20 20 20 63 61 73 65 20 27 74 27 3a 20   .    case 't': 
6d30: 0a 20 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e  .      if( nBuf>
6d40: 35 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22  5 && 0==memcmp("
6d50: 69 63 61 74 65 22 2c 20 26 61 42 75 66 5b 6e 42  icate", &aBuf[nB
6d60: 75 66 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20  uf-5], 5) ){.   
6d70: 20 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72       if( fts5Por
6d80: 74 65 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e  ter_MGt0(aBuf, n
6d90: 42 75 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20  Buf-5) ){.      
6da0: 20 20 20 20 6d 65 6d 63 70 79 28 26 61 42 75 66      memcpy(&aBuf
6db0: 5b 6e 42 75 66 2d 35 5d 2c 20 22 69 63 22 2c 20  [nBuf-5], "ic", 
6dc0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  2);.          *p
6dd0: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 35 20  nBuf = nBuf - 5 
6de0: 2b 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  + 2;.        }. 
6df0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
6e00: 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>5 && 0==memc
6e10: 6d 70 28 22 69 63 69 74 69 22 2c 20 26 61 42 75  mp("iciti", &aBu
6e20: 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29 7b  f[nBuf-5], 5) ){
6e30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73  .        if( fts
6e40: 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42 75  5Porter_MGt0(aBu
6e50: 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20 20  f, nBuf-5) ){.  
6e60: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
6e70: 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 22 69  aBuf[nBuf-5], "i
6e80: 63 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c", 2);.        
6e90: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
6ea0: 2d 20 35 20 2b 20 32 3b 0a 20 20 20 20 20 20 20  - 5 + 2;.       
6eb0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6ec0: 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 20 20 63   break;.  .    c
6ed0: 61 73 65 20 27 75 27 3a 20 0a 20 20 20 20 20 20  ase 'u': .      
6ee0: 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30 3d  if( nBuf>3 && 0=
6ef0: 3d 6d 65 6d 63 6d 70 28 22 66 75 6c 22 2c 20 26  =memcmp("ful", &
6f00: 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33 29  aBuf[nBuf-3], 3)
6f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
6f20: 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28  fts5Porter_MGt0(
6f30: 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29 7b  aBuf, nBuf-3) ){
6f40: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 42 75  .          *pnBu
6f50: 66 20 3d 20 6e 42 75 66 20 2d 20 33 3b 0a 20 20  f = nBuf - 3;.  
6f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6f70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a        break;.  .
6f80: 20 20 20 20 63 61 73 65 20 27 76 27 3a 20 0a 20      case 'v': . 
6f90: 20 20 20 20 20 69 66 28 20 6e 42 75 66 3e 35 20       if( nBuf>5 
6fa0: 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 61 74  && 0==memcmp("at
6fb0: 69 76 65 22 2c 20 26 61 42 75 66 5b 6e 42 75 66  ive", &aBuf[nBuf
6fc0: 2d 35 5d 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  -5], 5) ){.     
6fd0: 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74 65     if( fts5Porte
6fe0: 72 5f 4d 47 74 30 28 61 42 75 66 2c 20 6e 42 75  r_MGt0(aBuf, nBu
6ff0: 66 2d 35 29 20 29 7b 0a 20 20 20 20 20 20 20 20  f-5) ){.        
7000: 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66 20    *pnBuf = nBuf 
7010: 2d 20 35 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  - 5;.        }. 
7020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7030: 61 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20  ak;.  .    case 
7040: 27 7a 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20  'z': .      if( 
7050: 6e 42 75 66 3e 35 20 26 26 20 30 3d 3d 6d 65 6d  nBuf>5 && 0==mem
7060: 63 6d 70 28 22 61 6c 69 7a 65 22 2c 20 26 61 42  cmp("alize", &aB
7070: 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 35 29 20 29  uf[nBuf-5], 5) )
7080: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 74  {.        if( ft
7090: 73 35 50 6f 72 74 65 72 5f 4d 47 74 30 28 61 42  s5Porter_MGt0(aB
70a0: 75 66 2c 20 6e 42 75 66 2d 35 29 20 29 7b 0a 20  uf, nBuf-5) ){. 
70b0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
70c0: 26 61 42 75 66 5b 6e 42 75 66 2d 35 5d 2c 20 22  &aBuf[nBuf-5], "
70d0: 61 6c 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  al", 2);.       
70e0: 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75 66     *pnBuf = nBuf
70f0: 20 2d 20 35 20 2b 20 32 3b 0a 20 20 20 20 20 20   - 5 + 2;.      
7100: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7110: 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20 20 7d 0a    break;.  .  }.
7120: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
7130: 20 20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66    ..static int f
7140: 74 73 35 50 6f 72 74 65 72 53 74 65 70 31 42 28  ts5PorterStep1B(
7150: 63 68 61 72 20 2a 61 42 75 66 2c 20 69 6e 74 20  char *aBuf, int 
7160: 2a 70 6e 42 75 66 29 7b 0a 20 20 69 6e 74 20 72  *pnBuf){.  int r
7170: 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42  et = 0;.  int nB
7180: 75 66 20 3d 20 2a 70 6e 42 75 66 3b 0a 20 20 73  uf = *pnBuf;.  s
7190: 77 69 74 63 68 28 20 61 42 75 66 5b 6e 42 75 66  witch( aBuf[nBuf
71a0: 2d 32 5d 20 29 7b 0a 20 20 20 20 0a 20 20 20 20  -2] ){.    .    
71b0: 63 61 73 65 20 27 65 27 3a 20 0a 20 20 20 20 20  case 'e': .     
71c0: 20 69 66 28 20 6e 42 75 66 3e 33 20 26 26 20 30   if( nBuf>3 && 0
71d0: 3d 3d 6d 65 6d 63 6d 70 28 22 65 65 64 22 2c 20  ==memcmp("eed", 
71e0: 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d 2c 20 33  &aBuf[nBuf-3], 3
71f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
7200: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 30   fts5Porter_MGt0
7210: 28 61 42 75 66 2c 20 6e 42 75 66 2d 33 29 20 29  (aBuf, nBuf-3) )
7220: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
7230: 70 79 28 26 61 42 75 66 5b 6e 42 75 66 2d 33 5d  py(&aBuf[nBuf-3]
7240: 2c 20 22 65 65 22 2c 20 32 29 3b 0a 20 20 20 20  , "ee", 2);.    
7250: 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e        *pnBuf = n
7260: 42 75 66 20 2d 20 33 20 2b 20 32 3b 0a 20 20 20  Buf - 3 + 2;.   
7270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
7280: 73 65 20 69 66 28 20 6e 42 75 66 3e 32 20 26 26  se if( nBuf>2 &&
7290: 20 30 3d 3d 6d 65 6d 63 6d 70 28 22 65 64 22 2c   0==memcmp("ed",
72a0: 20 26 61 42 75 66 5b 6e 42 75 66 2d 32 5d 2c 20   &aBuf[nBuf-2], 
72b0: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  2) ){.        if
72c0: 28 20 66 74 73 35 50 6f 72 74 65 72 5f 56 6f 77  ( fts5Porter_Vow
72d0: 65 6c 28 61 42 75 66 2c 20 6e 42 75 66 2d 32 29  el(aBuf, nBuf-2)
72e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
72f0: 6e 42 75 66 20 3d 20 6e 42 75 66 20 2d 20 32 3b  nBuf = nBuf - 2;
7300: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 20 3d  .          ret =
7310: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7320: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7330: 6b 3b 0a 20 20 0a 20 20 20 20 63 61 73 65 20 27  k;.  .    case '
7340: 6e 27 3a 20 0a 20 20 20 20 20 20 69 66 28 20 6e  n': .      if( n
7350: 42 75 66 3e 33 20 26 26 20 30 3d 3d 6d 65 6d 63  Buf>3 && 0==memc
7360: 6d 70 28 22 69 6e 67 22 2c 20 26 61 42 75 66 5b  mp("ing", &aBuf[
7370: 6e 42 75 66 2d 33 5d 2c 20 33 29 20 29 7b 0a 20  nBuf-3], 3) ){. 
7380: 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 50         if( fts5P
7390: 6f 72 74 65 72 5f 56 6f 77 65 6c 28 61 42 75 66  orter_Vowel(aBuf
73a0: 2c 20 6e 42 75 66 2d 33 29 20 29 7b 0a 20 20 20  , nBuf-3) ){.   
73b0: 20 20 20 20 20 20 20 2a 70 6e 42 75 66 20 3d 20         *pnBuf = 
73c0: 6e 42 75 66 20 2d 20 33 3b 0a 20 20 20 20 20 20  nBuf - 3;.      
73d0: 20 20 20 20 72 65 74 20 3d 20 31 3b 0a 20 20 20      ret = 1;.   
73e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
73f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 0a 20       break;.  . 
7400: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
7410: 0a 7d 0a 20 20 0a 2f 2a 20 0a 2a 2a 20 47 45 4e  .}.  ./* .** GEN
7420: 45 52 41 54 45 44 20 43 4f 44 45 20 45 4e 44 53  ERATED CODE ENDS
7430: 20 48 45 52 45 20 28 6d 6b 70 6f 72 74 65 72 73   HERE (mkporters
7440: 74 65 70 73 2e 74 63 6c 29 0a 2a 2a 2a 2a 2a 2a  teps.tcl).******
7450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7490: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
74a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  /..static void f
74f0: 74 73 35 50 6f 72 74 65 72 53 74 65 70 31 41 28  ts5PorterStep1A(
7500: 63 68 61 72 20 2a 61 42 75 66 2c 20 69 6e 74 20  char *aBuf, int 
7510: 2a 70 6e 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e  *pnBuf){.  int n
7520: 42 75 66 20 3d 20 2a 70 6e 42 75 66 3b 0a 20 20  Buf = *pnBuf;.  
7530: 69 66 28 20 61 42 75 66 5b 6e 42 75 66 2d 31 5d  if( aBuf[nBuf-1]
7540: 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 69 66 28  =='s' ){.    if(
7550: 20 61 42 75 66 5b 6e 42 75 66 2d 32 5d 3d 3d 27   aBuf[nBuf-2]=='
7560: 65 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  e' ){.      if( 
7570: 28 6e 42 75 66 3e 34 20 26 26 20 61 42 75 66 5b  (nBuf>4 && aBuf[
7580: 6e 42 75 66 2d 34 5d 3d 3d 27 73 27 20 26 26 20  nBuf-4]=='s' && 
7590: 61 42 75 66 5b 6e 42 75 66 2d 33 5d 3d 3d 27 73  aBuf[nBuf-3]=='s
75a0: 27 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 6e  ') .       || (n
75b0: 42 75 66 3e 33 20 26 26 20 61 42 75 66 5b 6e 42  Buf>3 && aBuf[nB
75c0: 75 66 2d 33 5d 3d 3d 27 69 27 20 29 0a 20 20 20  uf-3]=='i' ).   
75d0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70     ){.        *p
75e0: 6e 42 75 66 20 3d 20 6e 42 75 66 2d 32 3b 0a 20  nBuf = nBuf-2;. 
75f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7600: 20 20 20 20 2a 70 6e 42 75 66 20 3d 20 6e 42 75      *pnBuf = nBu
7610: 66 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  f-1;.      }.   
7620: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
7630: 61 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 27 73  aBuf[nBuf-2]!='s
7640: 27 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 42 75  ' ){.      *pnBu
7650: 66 20 3d 20 6e 42 75 66 2d 31 3b 0a 20 20 20 20  f = nBuf-1;.    
7660: 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
7670: 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72 43 62  int fts5PorterCb
7680: 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
7690: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
76a0: 54 6f 6b 65 6e 2c 20 0a 20 20 69 6e 74 20 6e 54  Token, .  int nT
76b0: 6f 6b 65 6e 2c 20 0a 20 20 69 6e 74 20 69 53 74  oken, .  int iSt
76c0: 61 72 74 2c 20 0a 20 20 69 6e 74 20 69 45 6e 64  art, .  int iEnd
76d0: 0a 29 7b 0a 20 20 50 6f 72 74 65 72 43 6f 6e 74  .){.  PorterCont
76e0: 65 78 74 20 2a 70 20 3d 20 28 50 6f 72 74 65 72  ext *p = (Porter
76f0: 43 6f 6e 74 65 78 74 2a 29 70 43 74 78 3b 0a 0a  Context*)pCtx;..
7700: 20 20 63 68 61 72 20 2a 61 42 75 66 3b 0a 20 20    char *aBuf;.  
7710: 69 6e 74 20 6e 42 75 66 3b 0a 0a 20 20 69 66 28  int nBuf;..  if(
7720: 20 6e 54 6f 6b 65 6e 3e 46 54 53 35 5f 50 4f 52   nToken>FTS5_POR
7730: 54 45 52 5f 4d 41 58 5f 54 4f 4b 45 4e 20 7c 7c  TER_MAX_TOKEN ||
7740: 20 6e 54 6f 6b 65 6e 3c 33 20 29 20 67 6f 74 6f   nToken<3 ) goto
7750: 20 70 61 73 73 5f 74 68 72 6f 75 67 68 3b 0a 20   pass_through;. 
7760: 20 61 42 75 66 20 3d 20 70 2d 3e 61 42 75 66 3b   aBuf = p->aBuf;
7770: 0a 20 20 6e 42 75 66 20 3d 20 6e 54 6f 6b 65 6e  .  nBuf = nToken
7780: 3b 0a 20 20 6d 65 6d 63 70 79 28 61 42 75 66 2c  ;.  memcpy(aBuf,
7790: 20 70 54 6f 6b 65 6e 2c 20 6e 42 75 66 29 3b 0a   pToken, nBuf);.
77a0: 0a 20 20 2f 2a 20 53 74 65 70 20 31 2e 20 2a 2f  .  /* Step 1. */
77b0: 0a 20 20 66 74 73 35 50 6f 72 74 65 72 53 74 65  .  fts5PorterSte
77c0: 70 31 41 28 61 42 75 66 2c 20 26 6e 42 75 66 29  p1A(aBuf, &nBuf)
77d0: 3b 0a 20 20 69 66 28 20 66 74 73 35 50 6f 72 74  ;.  if( fts5Port
77e0: 65 72 53 74 65 70 31 42 28 61 42 75 66 2c 20 26  erStep1B(aBuf, &
77f0: 6e 42 75 66 29 20 29 7b 0a 20 20 20 20 69 66 28  nBuf) ){.    if(
7800: 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70 31   fts5PorterStep1
7810: 42 32 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3d  B2(aBuf, &nBuf)=
7820: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
7830: 20 63 20 3d 20 61 42 75 66 5b 6e 42 75 66 2d 31   c = aBuf[nBuf-1
7840: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  ];.      if( fts
7850: 35 50 6f 72 74 65 72 49 73 56 6f 77 65 6c 28 63  5PorterIsVowel(c
7860: 2c 20 30 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  , 0)==0 .       
7870: 26 26 20 63 21 3d 27 6c 27 20 26 26 20 63 21 3d  && c!='l' && c!=
7880: 27 73 27 20 26 26 20 63 21 3d 27 7a 27 20 26 26  's' && c!='z' &&
7890: 20 63 3d 3d 61 42 75 66 5b 6e 42 75 66 2d 32 5d   c==aBuf[nBuf-2]
78a0: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
78b0: 20 20 20 6e 42 75 66 2d 2d 3b 0a 20 20 20 20 20     nBuf--;.     
78c0: 20 7d 65 6c 73 65 20 69 66 28 20 66 74 73 35 50   }else if( fts5P
78d0: 6f 72 74 65 72 5f 4d 45 71 31 28 61 42 75 66 2c  orter_MEq1(aBuf,
78e0: 20 6e 42 75 66 29 20 26 26 20 66 74 73 35 50 6f   nBuf) && fts5Po
78f0: 72 74 65 72 5f 4f 73 74 61 72 28 61 42 75 66 2c  rter_Ostar(aBuf,
7900: 20 6e 42 75 66 29 20 29 7b 0a 20 20 20 20 20 20   nBuf) ){.      
7910: 20 20 61 42 75 66 5b 6e 42 75 66 2b 2b 5d 20 3d    aBuf[nBuf++] =
7920: 20 27 65 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20   'e';.      }.  
7930: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74    }.  }..  /* St
7940: 65 70 20 31 43 2e 20 2a 2f 0a 20 20 69 66 28 20  ep 1C. */.  if( 
7950: 61 42 75 66 5b 6e 42 75 66 2d 31 5d 3d 3d 27 79  aBuf[nBuf-1]=='y
7960: 27 20 26 26 20 66 74 73 35 50 6f 72 74 65 72 5f  ' && fts5Porter_
7970: 56 6f 77 65 6c 28 61 42 75 66 2c 20 6e 42 75 66  Vowel(aBuf, nBuf
7980: 2d 31 29 20 29 7b 0a 20 20 20 20 61 42 75 66 5b  -1) ){.    aBuf[
7990: 6e 42 75 66 2d 31 5d 20 3d 20 27 69 27 3b 0a 20  nBuf-1] = 'i';. 
79a0: 20 7d 0a 0a 20 20 2f 2a 20 53 74 65 70 73 20 32   }..  /* Steps 2
79b0: 20 74 68 72 6f 75 67 68 20 34 2e 20 2a 2f 0a 20   through 4. */. 
79c0: 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70 32   fts5PorterStep2
79d0: 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3b 0a 20  (aBuf, &nBuf);. 
79e0: 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70 33   fts5PorterStep3
79f0: 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3b 0a 20  (aBuf, &nBuf);. 
7a00: 20 66 74 73 35 50 6f 72 74 65 72 53 74 65 70 34   fts5PorterStep4
7a10: 28 61 42 75 66 2c 20 26 6e 42 75 66 29 3b 0a 0a  (aBuf, &nBuf);..
7a20: 20 20 2f 2a 20 53 74 65 70 20 35 61 2e 20 2a 2f    /* Step 5a. */
7a30: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e  .  assert( nBuf>
7a40: 30 20 29 3b 0a 20 20 69 66 28 20 61 42 75 66 5b  0 );.  if( aBuf[
7a50: 6e 42 75 66 2d 31 5d 3d 3d 27 65 27 20 29 7b 0a  nBuf-1]=='e' ){.
7a60: 20 20 20 20 69 66 28 20 66 74 73 35 50 6f 72 74      if( fts5Port
7a70: 65 72 5f 4d 47 74 31 28 61 42 75 66 2c 20 6e 42  er_MGt1(aBuf, nB
7a80: 75 66 2d 31 29 20 0a 20 20 20 20 20 7c 7c 20 28  uf-1) .     || (
7a90: 66 74 73 35 50 6f 72 74 65 72 5f 4d 45 71 31 28  fts5Porter_MEq1(
7aa0: 61 42 75 66 2c 20 6e 42 75 66 2d 31 29 20 26 26  aBuf, nBuf-1) &&
7ab0: 20 21 66 74 73 35 50 6f 72 74 65 72 5f 4f 73 74   !fts5Porter_Ost
7ac0: 61 72 28 61 42 75 66 2c 20 6e 42 75 66 2d 31 29  ar(aBuf, nBuf-1)
7ad0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  ).    ){.      n
7ae0: 42 75 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Buf--;.    }.  }
7af0: 0a 0a 20 20 2f 2a 20 53 74 65 70 20 35 62 2e 20  ..  /* Step 5b. 
7b00: 2a 2f 0a 20 20 69 66 28 20 6e 42 75 66 3e 31 20  */.  if( nBuf>1 
7b10: 26 26 20 61 42 75 66 5b 6e 42 75 66 2d 31 5d 3d  && aBuf[nBuf-1]=
7b20: 3d 27 6c 27 20 0a 20 20 20 26 26 20 61 42 75 66  ='l' .   && aBuf
7b30: 5b 6e 42 75 66 2d 32 5d 3d 3d 27 6c 27 20 26 26  [nBuf-2]=='l' &&
7b40: 20 66 74 73 35 50 6f 72 74 65 72 5f 4d 47 74 31   fts5Porter_MGt1
7b50: 28 61 42 75 66 2c 20 6e 42 75 66 2d 31 29 20 0a  (aBuf, nBuf-1) .
7b60: 20 20 29 7b 0a 20 20 20 20 6e 42 75 66 2d 2d 3b    ){.    nBuf--;
7b70: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
7b80: 2d 3e 78 54 6f 6b 65 6e 28 70 2d 3e 70 43 74 78  ->xToken(p->pCtx
7b90: 2c 20 61 42 75 66 2c 20 6e 42 75 66 2c 20 69 53  , aBuf, nBuf, iS
7ba0: 74 61 72 74 2c 20 69 45 6e 64 29 3b 0a 0a 20 70  tart, iEnd);.. p
7bb0: 61 73 73 5f 74 68 72 6f 75 67 68 3a 0a 20 20 72  ass_through:.  r
7bc0: 65 74 75 72 6e 20 70 2d 3e 78 54 6f 6b 65 6e 28  eturn p->xToken(
7bd0: 70 2d 3e 70 43 74 78 2c 20 70 54 6f 6b 65 6e 2c  p->pCtx, pToken,
7be0: 20 6e 54 6f 6b 65 6e 2c 20 69 53 74 61 72 74 2c   nToken, iStart,
7bf0: 20 69 45 6e 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   iEnd);.}../*.**
7c00: 20 54 6f 6b 65 6e 69 7a 65 20 75 73 69 6e 67 20   Tokenize using 
7c10: 74 68 65 20 70 6f 72 74 65 72 20 74 6f 6b 65 6e  the porter token
7c20: 69 7a 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  izer..*/.static 
7c30: 69 6e 74 20 66 74 73 35 50 6f 72 74 65 72 54 6f  int fts5PorterTo
7c40: 6b 65 6e 69 7a 65 28 0a 20 20 46 74 73 35 54 6f  kenize(.  Fts5To
7c50: 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69  kenizer *pTokeni
7c60: 7a 65 72 2c 0a 20 20 76 6f 69 64 20 2a 70 43 74  zer,.  void *pCt
7c70: 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
7c80: 2a 70 54 65 78 74 2c 20 69 6e 74 20 6e 54 65 78  *pText, int nTex
7c90: 74 2c 0a 20 20 69 6e 74 20 28 2a 78 54 6f 6b 65  t,.  int (*xToke
7ca0: 6e 29 28 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20  n)(void*, const 
7cb0: 63 68 61 72 2a 2c 20 69 6e 74 20 6e 54 6f 6b 65  char*, int nToke
7cc0: 6e 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  n, int iStart, i
7cd0: 6e 74 20 69 45 6e 64 29 0a 29 7b 0a 20 20 50 6f  nt iEnd).){.  Po
7ce0: 72 74 65 72 54 6f 6b 65 6e 69 7a 65 72 20 2a 70  rterTokenizer *p
7cf0: 20 3d 20 28 50 6f 72 74 65 72 54 6f 6b 65 6e 69   = (PorterTokeni
7d00: 7a 65 72 2a 29 70 54 6f 6b 65 6e 69 7a 65 72 3b  zer*)pTokenizer;
7d10: 0a 20 20 50 6f 72 74 65 72 43 6f 6e 74 65 78 74  .  PorterContext
7d20: 20 73 43 74 78 3b 0a 20 20 73 43 74 78 2e 78 54   sCtx;.  sCtx.xT
7d30: 6f 6b 65 6e 20 3d 20 78 54 6f 6b 65 6e 3b 0a 20  oken = xToken;. 
7d40: 20 73 43 74 78 2e 70 43 74 78 20 3d 20 70 43 74   sCtx.pCtx = pCt
7d50: 78 3b 0a 20 20 73 43 74 78 2e 61 42 75 66 20 3d  x;.  sCtx.aBuf =
7d60: 20 70 2d 3e 61 42 75 66 3b 0a 20 20 72 65 74 75   p->aBuf;.  retu
7d70: 72 6e 20 70 2d 3e 74 6f 6b 65 6e 69 7a 65 72 2e  rn p->tokenizer.
7d80: 78 54 6f 6b 65 6e 69 7a 65 28 0a 20 20 20 20 20  xTokenize(.     
7d90: 20 70 2d 3e 70 54 6f 6b 65 6e 69 7a 65 72 2c 20   p->pTokenizer, 
7da0: 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 70 54  (void*)&sCtx, pT
7db0: 65 78 74 2c 20 6e 54 65 78 74 2c 20 66 74 73 35  ext, nText, fts5
7dc0: 50 6f 72 74 65 72 43 62 0a 20 20 29 3b 0a 7d 0a  PorterCb.  );.}.
7dd0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
7de0: 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 74 6f 6b  all built-in tok
7df0: 65 6e 69 7a 65 72 73 20 77 69 74 68 20 46 54 53  enizers with FTS
7e00: 35 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  5..*/.int sqlite
7e10: 33 46 74 73 35 54 6f 6b 65 6e 69 7a 65 72 49 6e  3Fts5TokenizerIn
7e20: 69 74 28 66 74 73 35 5f 61 70 69 20 2a 70 41 70  it(fts5_api *pAp
7e30: 69 29 7b 0a 20 20 73 74 72 75 63 74 20 42 75 69  i){.  struct Bui
7e40: 6c 74 69 6e 54 6f 6b 65 6e 69 7a 65 72 20 7b 0a  ltinTokenizer {.
7e50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7e60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 66 74 73 35 5f  zName;.    fts5_
7e70: 74 6f 6b 65 6e 69 7a 65 72 20 78 3b 0a 20 20 7d  tokenizer x;.  }
7e80: 20 61 42 75 69 6c 74 69 6e 5b 5d 20 3d 20 7b 0a   aBuiltin[] = {.
7e90: 20 20 20 20 7b 20 22 75 6e 69 63 6f 64 65 36 31      { "unicode61
7ea0: 22 2c 20 7b 66 74 73 35 55 6e 69 63 6f 64 65 43  ", {fts5UnicodeC
7eb0: 72 65 61 74 65 2c 20 66 74 73 35 55 6e 69 63 6f  reate, fts5Unico
7ec0: 64 65 44 65 6c 65 74 65 2c 20 66 74 73 35 55 6e  deDelete, fts5Un
7ed0: 69 63 6f 64 65 54 6f 6b 65 6e 69 7a 65 7d 7d 2c  icodeTokenize}},
7ee0: 0a 20 20 20 20 7b 20 22 61 73 63 69 69 22 2c 20  .    { "ascii", 
7ef0: 20 20 20 20 7b 66 74 73 35 41 73 63 69 69 43 72      {fts5AsciiCr
7f00: 65 61 74 65 2c 20 66 74 73 35 41 73 63 69 69 44  eate, fts5AsciiD
7f10: 65 6c 65 74 65 2c 20 66 74 73 35 41 73 63 69 69  elete, fts5Ascii
7f20: 54 6f 6b 65 6e 69 7a 65 20 7d 7d 2c 0a 20 20 20  Tokenize }},.   
7f30: 20 7b 20 22 70 6f 72 74 65 72 22 2c 20 20 20 20   { "porter",    
7f40: 7b 66 74 73 35 50 6f 72 74 65 72 43 72 65 61 74  {fts5PorterCreat
7f50: 65 2c 20 66 74 73 35 50 6f 72 74 65 72 44 65 6c  e, fts5PorterDel
7f60: 65 74 65 2c 20 66 74 73 35 50 6f 72 74 65 72 54  ete, fts5PorterT
7f70: 6f 6b 65 6e 69 7a 65 20 7d 7d 2c 0a 20 20 7d 3b  okenize }},.  };
7f80: 0a 20 20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .  .  int rc = S
7f90: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
7fa0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
7fb0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
7fe0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
7ff0: 62 75 69 6c 74 69 6e 20 66 75 6e 63 74 69 6f 6e  builtin function
8000: 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  s */..  for(i=0;
8010: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
8020: 26 20 69 3c 73 69 7a 65 6f 66 28 61 42 75 69 6c  & i<sizeof(aBuil
8030: 74 69 6e 29 2f 73 69 7a 65 6f 66 28 61 42 75 69  tin)/sizeof(aBui
8040: 6c 74 69 6e 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  ltin[0]); i++){.
8050: 20 20 20 20 72 63 20 3d 20 70 41 70 69 2d 3e 78      rc = pApi->x
8060: 43 72 65 61 74 65 54 6f 6b 65 6e 69 7a 65 72 28  CreateTokenizer(
8070: 70 41 70 69 2c 0a 20 20 20 20 20 20 20 20 61 42  pApi,.        aB
8080: 75 69 6c 74 69 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c  uiltin[i].zName,
8090: 0a 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29  .        (void*)
80a0: 70 41 70 69 2c 0a 20 20 20 20 20 20 20 20 26 61  pApi,.        &a
80b0: 42 75 69 6c 74 69 6e 5b 69 5d 2e 78 2c 0a 20 20  Builtin[i].x,.  
80c0: 20 20 20 20 20 20 30 0a 20 20 20 20 29 3b 0a 20        0.    );. 
80d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
80e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
80f0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
8100: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 29 20  TE_ENABLE_FTS5) 
8110: 2a 2f 0a 0a 0a                                   */...