/ Hex Artifact Content
Login

Artifact 4c5ffe31d63622869eb6eec1503df7f6996fd1bd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 36 20 4a 75 6c 79 20  /*.** 2006 July 
0010: 31 30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  10.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 0a 2a 2a 0a  source code..**.
0050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 44 65 66  *********.** Def
00a0: 69 6e 65 73 20 74 68 65 20 69 6e 74 65 72 66 61  ines the interfa
00b0: 63 65 20 74 6f 20 74 6f 6b 65 6e 69 7a 65 72 73  ce to tokenizers
00c0: 20 75 73 65 64 20 62 79 20 66 75 6c 6c 74 65 78   used by fulltex
00d0: 74 2d 73 65 61 72 63 68 2e 20 20 54 68 65 72 65  t-search.  There
00e0: 0a 2a 2a 20 61 72 65 20 74 68 72 65 65 20 62 61  .** are three ba
00f0: 73 69 63 20 63 6f 6d 70 6f 6e 65 6e 74 73 3a 0a  sic components:.
0100: 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 6f  **.** sqlite3_to
0110: 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20 69  kenizer_module i
0120: 73 20 61 20 73 69 6e 67 6c 65 74 6f 6e 20 64 65  s a singleton de
0130: 66 69 6e 69 6e 67 20 74 68 65 20 74 6f 6b 65 6e  fining the token
0140: 69 7a 65 72 0a 2a 2a 20 69 6e 74 65 72 66 61 63  izer.** interfac
0150: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68  e functions.  Th
0160: 69 73 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c  is is essentiall
0170: 79 20 74 68 65 20 63 6c 61 73 73 20 73 74 72 75  y the class stru
0180: 63 74 75 72 65 20 66 6f 72 0a 2a 2a 20 74 6f 6b  cture for.** tok
0190: 65 6e 69 7a 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 73  enizers..**.** s
01a0: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
01b0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 66 69   is used to defi
01c0: 6e 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  ne a particular 
01d0: 74 6f 6b 65 6e 69 7a 65 72 2c 20 70 65 72 68 61  tokenizer, perha
01e0: 70 73 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  ps.** including 
01f0: 63 75 73 74 6f 6d 69 7a 61 74 69 6f 6e 20 69 6e  customization in
0200: 66 6f 72 6d 61 74 69 6f 6e 20 64 65 66 69 6e 65  formation define
0210: 64 20 61 74 20 63 72 65 61 74 69 6f 6e 20 74 69  d at creation ti
0220: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65  me..**.** sqlite
0230: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73  3_tokenizer_curs
0240: 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  or is generated 
0250: 62 79 20 61 20 74 6f 6b 65 6e 69 7a 65 72 20 74  by a tokenizer t
0260: 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 74 6f  o generate.** to
0270: 6b 65 6e 73 20 66 72 6f 6d 20 61 20 70 61 72 74  kens from a part
0280: 69 63 75 6c 61 72 20 69 6e 70 75 74 2e 0a 2a 2f  icular input..*/
0290: 0a 23 69 66 6e 64 65 66 20 5f 46 54 53 32 5f 54  .#ifndef _FTS2_T
02a0: 4f 4b 45 4e 49 5a 45 52 5f 48 5f 0a 23 64 65 66  OKENIZER_H_.#def
02b0: 69 6e 65 20 5f 46 54 53 32 5f 54 4f 4b 45 4e 49  ine _FTS2_TOKENI
02c0: 5a 45 52 5f 48 5f 0a 0a 2f 2a 20 54 4f 44 4f 28  ZER_H_../* TODO(
02d0: 73 68 65 73 73 29 20 4f 6e 6c 79 20 75 73 65 64  shess) Only used
02e0: 20 66 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 20 61   for SQLITE_OK a
02f0: 6e 64 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 61  nd SQLITE_DONE a
0300: 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 20  t this time..** 
0310: 49 66 20 74 6f 6b 65 6e 69 7a 65 72 73 20 61 72  If tokenizers ar
0320: 65 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 20  e to be allowed 
0330: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
0340: 2a 28 29 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74  *() functions, t
0350: 68 65 6e 0a 2a 2a 20 77 65 20 77 69 6c 6c 20 6e  hen.** we will n
0360: 65 65 64 20 61 20 77 61 79 20 74 6f 20 72 65 67  eed a way to reg
0370: 69 73 74 65 72 20 74 68 65 20 41 50 49 20 63 6f  ister the API co
0380: 6e 73 69 73 74 65 6e 74 6c 79 2e 0a 2a 2f 0a 23  nsistently..*/.#
0390: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
03a0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .h"../*.** Struc
03b0: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
03c0: 65 20 74 6f 6b 65 6e 69 7a 65 72 20 69 6e 74 65  e tokenizer inte
03d0: 72 66 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  rface..*/.typede
03e0: 66 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  f struct sqlite3
03f0: 5f 74 6f 6b 65 6e 69 7a 65 72 20 73 71 6c 69 74  _tokenizer sqlit
0400: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 3b 0a 74 79  e3_tokenizer;.ty
0410: 70 65 64 65 66 20 73 74 72 75 63 74 20 73 71 6c  pedef struct sql
0420: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63  ite3_tokenizer_c
0430: 75 72 73 6f 72 20 73 71 6c 69 74 65 33 5f 74 6f  ursor sqlite3_to
0440: 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 3b 0a  kenizer_cursor;.
0450: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
0460: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
0470: 5f 6d 6f 64 75 6c 65 20 73 71 6c 69 74 65 33 5f  _module sqlite3_
0480: 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65  tokenizer_module
0490: 3b 0a 0a 73 74 72 75 63 74 20 73 71 6c 69 74 65  ;..struct sqlite
04a0: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
04b0: 6c 65 20 7b 0a 20 20 69 6e 74 20 69 56 65 72 73  le {.  int iVers
04c0: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
04d0: 20 20 20 20 20 20 2f 2a 20 63 75 72 72 65 6e 74        /* current
04e0: 6c 79 20 30 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  ly 0 */..  /*.  
04f0: 2a 2a 20 43 72 65 61 74 65 20 61 6e 64 20 64 65  ** Create and de
0500: 73 74 72 6f 79 20 61 20 74 6f 6b 65 6e 69 7a 65  stroy a tokenize
0510: 72 2e 20 20 61 72 67 63 2f 61 72 67 76 20 61 72  r.  argc/argv ar
0520: 65 20 70 61 73 73 65 64 20 64 6f 77 6e 20 66 72  e passed down fr
0530: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 66 75 6c 6c  om.  ** the full
0540: 74 65 78 74 20 76 69 72 74 75 61 6c 20 74 61 62  text virtual tab
0550: 6c 65 20 63 72 65 61 74 69 6f 6e 20 74 6f 20 61  le creation to a
0560: 6c 6c 6f 77 20 63 75 73 74 6f 6d 69 7a 61 74 69  llow customizati
0570: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 28  on..  */.  int (
0580: 2a 78 43 72 65 61 74 65 29 28 69 6e 74 20 61 72  *xCreate)(int ar
0590: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
05a0: 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 20 20  const*argv,.    
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
05c0: 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a  ite3_tokenizer *
05d0: 2a 70 70 54 6f 6b 65 6e 69 7a 65 72 29 3b 0a 20  *ppTokenizer);. 
05e0: 20 69 6e 74 20 28 2a 78 44 65 73 74 72 6f 79 29   int (*xDestroy)
05f0: 28 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a  (sqlite3_tokeniz
0600: 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 29 3b  er *pTokenizer);
0610: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 6f 6b 65  ..  /*.  ** Toke
0620: 6e 69 7a 65 20 61 20 70 61 72 74 69 63 75 6c 61  nize a particula
0630: 72 20 69 6e 70 75 74 2e 20 20 43 61 6c 6c 20 78  r input.  Call x
0640: 4f 70 65 6e 28 29 20 74 6f 20 70 72 65 70 61 72  Open() to prepar
0650: 65 20 74 6f 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69  e to.  ** tokeni
0660: 7a 65 2c 20 78 4e 65 78 74 28 29 20 72 65 70 65  ze, xNext() repe
0670: 61 74 65 64 6c 79 20 75 6e 74 69 6c 20 69 74 20  atedly until it 
0680: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
0690: 4f 4e 45 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 78  ONE, then.  ** x
06a0: 43 6c 6f 73 65 28 29 20 74 6f 20 66 72 65 65 20  Close() to free 
06b0: 61 6e 79 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  any internal sta
06c0: 74 65 2e 20 20 54 68 65 20 70 49 6e 70 75 74 20  te.  The pInput 
06d0: 70 61 73 73 65 64 20 74 6f 0a 20 20 2a 2a 20 78  passed to.  ** x
06e0: 4f 70 65 6e 28 29 20 6d 75 73 74 20 65 78 69 73  Open() must exis
06f0: 74 20 75 6e 74 69 6c 20 74 68 65 20 63 75 72 73  t until the curs
0700: 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 20 20 54  or is closed.  T
0710: 68 65 20 70 70 54 6f 6b 65 6e 0a 20 20 2a 2a 20  he ppToken.  ** 
0720: 72 65 73 75 6c 74 20 66 72 6f 6d 20 78 4e 65 78  result from xNex
0730: 74 28 29 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69  t() is only vali
0740: 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 74  d until the next
0750: 20 63 61 6c 6c 20 74 6f 20 78 4e 65 78 74 28 29   call to xNext()
0760: 0a 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 78  .  ** or until x
0770: 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
0780: 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  d..  */.  /* TOD
0790: 4f 28 73 68 65 73 73 29 20 63 75 72 72 65 6e 74  O(shess) current
07a0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
07b0: 72 65 71 75 69 72 65 73 20 70 49 6e 70 75 74 20  requires pInput 
07c0: 74 6f 20 62 65 0a 20 20 2a 2a 20 6e 75 6c 2d 74  to be.  ** nul-t
07d0: 65 72 6d 69 6e 61 74 65 64 2e 20 20 54 68 69 73  erminated.  This
07e0: 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 20 62   should either b
07f0: 65 20 66 69 78 65 64 2c 20 6f 72 20 70 49 6e 70  e fixed, or pInp
0800: 75 74 2f 6e 42 79 74 65 73 0a 20 20 2a 2a 20 73  ut/nBytes.  ** s
0810: 68 6f 75 6c 64 20 62 65 20 63 6f 6e 76 65 72 74  hould be convert
0820: 65 64 20 74 6f 20 7a 49 6e 70 75 74 2e 0a 20 20  ed to zInput..  
0830: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 4f 70 65 6e  */.  int (*xOpen
0840: 29 28 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69  )(sqlite3_tokeni
0850: 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72 2c  zer *pTokenizer,
0860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0870: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 70  const char *pInp
0880: 75 74 2c 20 69 6e 74 20 6e 42 79 74 65 73 2c 0a  ut, int nBytes,.
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
08a0: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
08b0: 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
08c0: 6f 72 29 3b 0a 20 20 69 6e 74 20 28 2a 78 43 6c  or);.  int (*xCl
08d0: 6f 73 65 29 28 73 71 6c 69 74 65 33 5f 74 6f 6b  ose)(sqlite3_tok
08e0: 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 2a 70  enizer_cursor *p
08f0: 43 75 72 73 6f 72 29 3b 0a 20 20 69 6e 74 20 28  Cursor);.  int (
0900: 2a 78 4e 65 78 74 29 28 73 71 6c 69 74 65 33 5f  *xNext)(sqlite3_
0910: 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72  tokenizer_cursor
0920: 20 2a 70 43 75 72 73 6f 72 2c 0a 20 20 20 20 20   *pCursor,.     
0930: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
0940: 63 68 61 72 20 2a 2a 70 70 54 6f 6b 65 6e 2c 20  char **ppToken, 
0950: 69 6e 74 20 2a 70 6e 42 79 74 65 73 2c 0a 20 20  int *pnBytes,.  
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
0970: 20 2a 70 69 53 74 61 72 74 4f 66 66 73 65 74 2c   *piStartOffset,
0980: 20 69 6e 74 20 2a 70 69 45 6e 64 4f 66 66 73 65   int *piEndOffse
0990: 74 2c 20 69 6e 74 20 2a 70 69 50 6f 73 69 74 69  t, int *piPositi
09a0: 6f 6e 29 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  on);.};..struct 
09b0: 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65  sqlite3_tokenize
09c0: 72 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  r {.  const sqli
09d0: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f  te3_tokenizer_mo
09e0: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 20 20  dule *pModule;  
09f0: 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 66 6f  /* The module fo
0a00: 72 20 74 68 69 73 20 74 6f 6b 65 6e 69 7a 65 72  r this tokenizer
0a10: 20 2a 2f 0a 20 20 2f 2a 20 54 6f 6b 65 6e 69 7a   */.  /* Tokeniz
0a20: 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  er implementatio
0a30: 6e 73 20 77 69 6c 6c 20 74 79 70 69 63 61 6c 6c  ns will typicall
0a40: 79 20 61 64 64 20 61 64 64 69 74 69 6f 6e 61 6c  y add additional
0a50: 20 66 69 65 6c 64 73 20 2a 2f 0a 7d 3b 0a 0a 73   fields */.};..s
0a60: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 74 6f  truct sqlite3_to
0a70: 6b 65 6e 69 7a 65 72 5f 63 75 72 73 6f 72 20 7b  kenizer_cursor {
0a80: 0a 20 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e  .  sqlite3_token
0a90: 69 7a 65 72 20 2a 70 54 6f 6b 65 6e 69 7a 65 72  izer *pTokenizer
0aa0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ;       /* Token
0ab0: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 63 75  izer for this cu
0ac0: 72 73 6f 72 2e 20 2a 2f 0a 20 20 2f 2a 20 54 6f  rsor. */.  /* To
0ad0: 6b 65 6e 69 7a 65 72 20 69 6d 70 6c 65 6d 65 6e  kenizer implemen
0ae0: 74 61 74 69 6f 6e 73 20 77 69 6c 6c 20 74 79 70  tations will typ
0af0: 69 63 61 6c 6c 79 20 61 64 64 20 61 64 64 69 74  ically add addit
0b00: 69 6f 6e 61 6c 20 66 69 65 6c 64 73 20 2a 2f 0a  ional fields */.
0b10: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68  };../*.** Get th
0b20: 65 20 6d 6f 64 75 6c 65 20 66 6f 72 20 61 20 74  e module for a t
0b30: 6f 6b 65 6e 69 7a 65 72 20 77 68 69 63 68 20 67  okenizer which g
0b40: 65 6e 65 72 61 74 65 73 20 74 6f 6b 65 6e 73 20  enerates tokens 
0b50: 62 61 73 65 64 20 6f 6e 20 61 0a 2a 2a 20 73 65  based on a.** se
0b60: 74 20 6f 66 20 6e 6f 6e 2d 74 6f 6b 65 6e 20 63  t of non-token c
0b70: 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20  haracters.  The 
0b80: 64 65 66 61 75 6c 74 20 69 73 20 74 6f 20 62 72  default is to br
0b90: 65 61 6b 20 74 6f 6b 65 6e 73 20 61 74 20 61 6e  eak tokens at an
0ba0: 79 0a 2a 2a 20 6e 6f 6e 2d 61 6c 6e 75 6d 20 63  y.** non-alnum c
0bb0: 68 61 72 61 63 74 65 72 2c 20 74 68 6f 75 67 68  haracter, though
0bc0: 20 74 68 65 20 73 65 74 20 6f 66 20 64 65 6c 69   the set of deli
0bd0: 6d 69 74 65 72 73 20 63 61 6e 20 61 6c 73 6f 20  miters can also 
0be0: 62 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  be.** specified 
0bf0: 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
0c00: 76 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  v argument to xC
0c10: 72 65 61 74 65 28 29 2e 0a 2a 2f 0a 2f 2a 20 54  reate()..*/./* T
0c20: 4f 44 4f 28 73 68 65 73 73 29 20 54 68 69 73 20  ODO(shess) This 
0c30: 64 6f 65 73 6e 27 74 20 62 65 6c 6f 6e 67 20 68  doesn't belong h
0c40: 65 72 65 2e 20 20 4e 65 65 64 20 73 6f 6d 65 20  ere.  Need some 
0c50: 73 6f 72 74 20 6f 66 0a 2a 2a 20 72 65 67 69 73  sort of.** regis
0c60: 74 72 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e  tration process.
0c70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0c80: 46 74 73 32 53 69 6d 70 6c 65 54 6f 6b 65 6e 69  Fts2SimpleTokeni
0c90: 7a 65 72 4d 6f 64 75 6c 65 28 73 71 6c 69 74 65  zerModule(sqlite
0ca0: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75  3_tokenizer_modu
0cb0: 6c 65 20 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64 75  le const**ppModu
0cc0: 6c 65 29 3b 0a 76 6f 69 64 20 73 71 6c 69 74 65  le);.void sqlite
0cd0: 33 46 74 73 32 50 6f 72 74 65 72 54 6f 6b 65 6e  3Fts2PorterToken
0ce0: 69 7a 65 72 4d 6f 64 75 6c 65 28 73 71 6c 69 74  izerModule(sqlit
0cf0: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64  e3_tokenizer_mod
0d00: 75 6c 65 20 63 6f 6e 73 74 2a 2a 70 70 4d 6f 64  ule const**ppMod
0d10: 75 6c 65 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  ule);..#endif /*
0d20: 20 5f 46 54 53 32 5f 54 4f 4b 45 4e 49 5a 45 52   _FTS2_TOKENIZER
0d30: 5f 48 5f 20 2a 2f 0a                             _H_ */.