/ Hex Artifact Content
Login

Artifact 1ea9993a39c9783c2e2d7446d055e9d64411dda0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 37 20 4a 75 6e 65 20  /*.** 2007 June 
0010: 32 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74  22.**.** 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 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 74 6f 6b 65  mplements a toke
0190: 6e 69 7a 65 72 20 66 6f 72 20 66 74 73 32 20 62  nizer for fts2 b
01a0: 61 73 65 64 20 6f 6e 20 74 68 65 20 49 43 55 20  ased on the ICU 
01b0: 6c 69 62 72 61 72 79 2e 0a 2a 2a 20 0a 2a 2a 20  library..** .** 
01c0: 24 49 64 3a 20 66 74 73 32 5f 69 63 75 2e 63 2c  $Id: fts2_icu.c,
01d0: 76 20 31 2e 33 20 32 30 30 38 2f 31 32 2f 31 38  v 1.3 2008/12/18
01e0: 20 30 35 3a 33 30 3a 32 36 20 64 61 6e 69 65 6c   05:30:26 daniel
01f0: 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 0a  k1977 Exp $.*/..
0200: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
0210: 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66  ITE_CORE) || def
0220: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0230: 4c 45 5f 46 54 53 32 29 0a 23 69 66 64 65 66 20  LE_FTS2).#ifdef 
0240: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
0250: 55 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  U..#include <ass
0260: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
0270: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
0280: 75 64 65 20 22 66 74 73 32 5f 74 6f 6b 65 6e 69  ude "fts2_tokeni
0290: 7a 65 72 2e 68 22 0a 0a 23 69 6e 63 6c 75 64 65  zer.h"..#include
02a0: 20 3c 75 6e 69 63 6f 64 65 2f 75 62 72 6b 2e 68   <unicode/ubrk.h
02b0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 63  >.#include <unic
02c0: 6f 64 65 2f 75 63 6f 6c 2e 68 3e 0a 23 69 6e 63  ode/ucol.h>.#inc
02d0: 6c 75 64 65 20 3c 75 6e 69 63 6f 64 65 2f 75 73  lude <unicode/us
02e0: 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64  tring.h>.#includ
02f0: 65 20 3c 75 6e 69 63 6f 64 65 2f 75 74 66 31 36  e <unicode/utf16
0300: 2e 68 3e 0a 0a 74 79 70 65 64 65 66 20 73 74 72  .h>..typedef str
0310: 75 63 74 20 49 63 75 54 6f 6b 65 6e 69 7a 65 72  uct IcuTokenizer
0320: 20 49 63 75 54 6f 6b 65 6e 69 7a 65 72 3b 0a 74   IcuTokenizer;.t
0330: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49 63  ypedef struct Ic
0340: 75 43 75 72 73 6f 72 20 49 63 75 43 75 72 73 6f  uCursor IcuCurso
0350: 72 3b 0a 0a 73 74 72 75 63 74 20 49 63 75 54 6f  r;..struct IcuTo
0360: 6b 65 6e 69 7a 65 72 20 7b 0a 20 20 73 71 6c 69  kenizer {.  sqli
0370: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 62 61  te3_tokenizer ba
0380: 73 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  se;.  char *zLoc
0390: 61 6c 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ale;.};..struct 
03a0: 49 63 75 43 75 72 73 6f 72 20 7b 0a 20 20 73 71  IcuCursor {.  sq
03b0: 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f  lite3_tokenizer_
03c0: 63 75 72 73 6f 72 20 62 61 73 65 3b 0a 0a 20 20  cursor base;..  
03d0: 55 42 72 65 61 6b 49 74 65 72 61 74 6f 72 20 2a  UBreakIterator *
03e0: 70 49 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 49  pIter;      /* I
03f0: 43 55 20 62 72 65 61 6b 2d 69 74 65 72 61 74 6f  CU break-iterato
0400: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
0410: 74 20 6e 43 68 61 72 3b 20 20 20 20 20 20 20 20  t nChar;        
0420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0430: 62 65 72 20 6f 66 20 55 43 68 61 72 20 65 6c 65  ber of UChar ele
0440: 6d 65 6e 74 73 20 69 6e 20 70 49 6e 70 75 74 20  ments in pInput 
0450: 2a 2f 0a 20 20 55 43 68 61 72 20 2a 61 43 68 61  */.  UChar *aCha
0460: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
0470: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 6e 70 75   /* Copy of inpu
0480: 74 20 75 73 69 6e 67 20 75 74 66 2d 31 36 20 65  t using utf-16 e
0490: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
04a0: 20 2a 61 4f 66 66 73 65 74 3b 20 20 20 20 20 20   *aOffset;      
04b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
04c0: 65 74 73 20 6f 66 20 65 61 63 68 20 63 68 61 72  ets of each char
04d0: 61 63 74 65 72 20 69 6e 20 75 74 66 2d 38 20 69  acter in utf-8 i
04e0: 6e 70 75 74 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  nput */..  int n
04f0: 42 75 66 66 65 72 3b 0a 20 20 63 68 61 72 20 2a  Buffer;.  char *
0500: 7a 42 75 66 66 65 72 3b 0a 0a 20 20 69 6e 74 20  zBuffer;..  int 
0510: 69 54 6f 6b 65 6e 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  iToken;.};../*.*
0520: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74  * Create a new t
0530: 6f 6b 65 6e 69 7a 65 72 20 69 6e 73 74 61 6e 63  okenizer instanc
0540: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
0550: 20 69 63 75 43 72 65 61 74 65 28 0a 20 20 69 6e   icuCreate(.  in
0560: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0580: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0590: 65 6e 74 72 69 65 73 20 69 6e 20 61 72 67 76 5b  entries in argv[
05a0: 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ] */.  const cha
05b0: 72 20 2a 20 63 6f 6e 73 74 20 2a 61 72 67 76 2c  r * const *argv,
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
05d0: 6f 6b 65 6e 69 7a 65 72 20 63 72 65 61 74 69 6f  okenizer creatio
05e0: 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  n arguments */. 
05f0: 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
0600: 65 72 20 2a 2a 70 70 54 6f 6b 65 6e 69 7a 65 72  er **ppTokenizer
0610: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 72        /* OUT: Cr
0620: 65 61 74 65 64 20 74 6f 6b 65 6e 69 7a 65 72 20  eated tokenizer 
0630: 2a 2f 0a 29 7b 0a 20 20 49 63 75 54 6f 6b 65 6e  */.){.  IcuToken
0640: 69 7a 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  izer *p;.  int n
0650: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
0660: 63 3e 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73  c>0 ){.    n = s
0670: 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 2b 31  trlen(argv[0])+1
0680: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 49 63 75  ;.  }.  p = (Icu
0690: 54 6f 6b 65 6e 69 7a 65 72 20 2a 29 73 71 6c 69  Tokenizer *)sqli
06a0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
06b0: 66 28 49 63 75 54 6f 6b 65 6e 69 7a 65 72 29 2b  f(IcuTokenizer)+
06c0: 6e 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  n);.  if( !p ){.
06d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
06e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
06f0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
0700: 6f 66 28 49 63 75 54 6f 6b 65 6e 69 7a 65 72 29  of(IcuTokenizer)
0710: 29 3b 0a 0a 20 20 69 66 28 20 6e 20 29 7b 0a 20  );..  if( n ){. 
0720: 20 20 20 70 2d 3e 7a 4c 6f 63 61 6c 65 20 3d 20     p->zLocale = 
0730: 28 63 68 61 72 20 2a 29 26 70 5b 31 5d 3b 0a 20  (char *)&p[1];. 
0740: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 4c 6f     memcpy(p->zLo
0750: 63 61 6c 65 2c 20 61 72 67 76 5b 30 5d 2c 20 6e  cale, argv[0], n
0760: 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 54 6f 6b  );.  }..  *ppTok
0770: 65 6e 69 7a 65 72 20 3d 20 28 73 71 6c 69 74 65  enizer = (sqlite
0780: 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 29 70 3b  3_tokenizer *)p;
0790: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
07a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
07b0: 65 73 74 72 6f 79 20 61 20 74 6f 6b 65 6e 69 7a  estroy a tokeniz
07c0: 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  er.*/.static int
07d0: 20 69 63 75 44 65 73 74 72 6f 79 28 73 71 6c 69   icuDestroy(sqli
07e0: 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70  te3_tokenizer *p
07f0: 54 6f 6b 65 6e 69 7a 65 72 29 7b 0a 20 20 49 63  Tokenizer){.  Ic
0800: 75 54 6f 6b 65 6e 69 7a 65 72 20 2a 70 20 3d 20  uTokenizer *p = 
0810: 28 49 63 75 54 6f 6b 65 6e 69 7a 65 72 20 2a 29  (IcuTokenizer *)
0820: 70 54 6f 6b 65 6e 69 7a 65 72 3b 0a 20 20 73 71  pTokenizer;.  sq
0830: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
0840: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
0850: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  K;.}../*.** Prep
0860: 61 72 65 20 74 6f 20 62 65 67 69 6e 20 74 6f 6b  are to begin tok
0870: 65 6e 69 7a 69 6e 67 20 61 20 70 61 72 74 69 63  enizing a partic
0880: 75 6c 61 72 20 73 74 72 69 6e 67 2e 20 20 54 68  ular string.  Th
0890: 65 20 69 6e 70 75 74 0a 2a 2a 20 73 74 72 69 6e  e input.** strin
08a0: 67 20 74 6f 20 62 65 20 74 6f 6b 65 6e 69 7a 65  g to be tokenize
08b0: 64 20 69 73 20 70 49 6e 70 75 74 5b 30 2e 2e 6e  d is pInput[0..n
08c0: 42 79 74 65 73 2d 31 5d 2e 20 20 41 20 63 75 72  Bytes-1].  A cur
08d0: 73 6f 72 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69  sor.** used to i
08e0: 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 74 6f 6b  ncrementally tok
08f0: 65 6e 69 7a 65 20 74 68 69 73 20 73 74 72 69 6e  enize this strin
0900: 67 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  g is returned in
0910: 20 0a 2a 2a 20 2a 70 70 43 75 72 73 6f 72 2e 0a   .** *ppCursor..
0920: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 63  */.static int ic
0930: 75 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  uOpen(.  sqlite3
0940: 5f 74 6f 6b 65 6e 69 7a 65 72 20 2a 70 54 6f 6b  _tokenizer *pTok
0950: 65 6e 69 7a 65 72 2c 20 20 20 20 20 20 20 20 20  enizer,         
0960: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 69 7a 65 72  /* The tokenizer
0970: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0980: 20 2a 7a 49 6e 70 75 74 2c 20 20 20 20 20 20 20   *zInput,       
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
09a0: 49 6e 70 75 74 20 73 74 72 69 6e 67 20 2a 2f 0a  Input string */.
09b0: 20 20 69 6e 74 20 6e 49 6e 70 75 74 2c 20 20 20    int nInput,   
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
09e0: 74 68 20 6f 66 20 7a 49 6e 70 75 74 20 69 6e 20  th of zInput in 
09f0: 62 79 74 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  bytes */.  sqlit
0a00: 65 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72  e3_tokenizer_cur
0a10: 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 20 20  sor **ppCursor  
0a20: 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 6b 65 6e 69    /* OUT: Tokeni
0a30: 7a 61 74 69 6f 6e 20 63 75 72 73 6f 72 20 2a 2f  zation cursor */
0a40: 0a 29 7b 0a 20 20 49 63 75 54 6f 6b 65 6e 69 7a  .){.  IcuTokeniz
0a50: 65 72 20 2a 70 20 3d 20 28 49 63 75 54 6f 6b 65  er *p = (IcuToke
0a60: 6e 69 7a 65 72 20 2a 29 70 54 6f 6b 65 6e 69 7a  nizer *)pTokeniz
0a70: 65 72 3b 0a 20 20 49 63 75 43 75 72 73 6f 72 20  er;.  IcuCursor 
0a80: 2a 70 43 73 72 3b 0a 0a 20 20 63 6f 6e 73 74 20  *pCsr;..  const 
0a90: 69 6e 74 33 32 5f 74 20 6f 70 74 20 3d 20 55 5f  int32_t opt = U_
0aa0: 46 4f 4c 44 5f 43 41 53 45 5f 44 45 46 41 55 4c  FOLD_CASE_DEFAUL
0ab0: 54 3b 0a 20 20 55 45 72 72 6f 72 43 6f 64 65 20  T;.  UErrorCode 
0ac0: 73 74 61 74 75 73 20 3d 20 55 5f 5a 45 52 4f 5f  status = U_ZERO_
0ad0: 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 6e 43 68  ERROR;.  int nCh
0ae0: 61 72 3b 0a 0a 20 20 55 43 68 61 72 33 32 20 63  ar;..  UChar32 c
0af0: 3b 0a 20 20 69 6e 74 20 69 49 6e 70 75 74 20 3d  ;.  int iInput =
0b00: 20 30 3b 0a 20 20 69 6e 74 20 69 4f 75 74 20 3d   0;.  int iOut =
0b10: 20 30 3b 0a 0a 20 20 2a 70 70 43 75 72 73 6f 72   0;..  *ppCursor
0b20: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 49 6e   = 0;..  if( nIn
0b30: 70 75 74 3c 30 20 29 7b 0a 20 20 20 20 6e 49 6e  put<0 ){.    nIn
0b40: 70 75 74 20 3d 20 73 74 72 6c 65 6e 28 7a 49 6e  put = strlen(zIn
0b50: 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 68 61  put);.  }.  nCha
0b60: 72 20 3d 20 6e 49 6e 70 75 74 2b 31 3b 0a 20 20  r = nInput+1;.  
0b70: 70 43 73 72 20 3d 20 28 49 63 75 43 75 72 73 6f  pCsr = (IcuCurso
0b80: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
0b90: 6f 63 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  oc(.      sizeof
0ba0: 28 49 63 75 43 75 72 73 6f 72 29 20 2b 20 20 20  (IcuCursor) +   
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0bc0: 49 63 75 43 75 72 73 6f 72 20 2a 2f 0a 20 20 20  IcuCursor */.   
0bd0: 20 20 20 6e 43 68 61 72 20 2a 20 73 69 7a 65 6f     nChar * sizeo
0be0: 66 28 55 43 68 61 72 29 20 2b 20 20 20 20 20 20  f(UChar) +      
0bf0: 20 20 20 20 20 20 2f 2a 20 49 63 75 43 75 72 73        /* IcuCurs
0c00: 6f 72 2e 61 43 68 61 72 5b 5d 20 2a 2f 0a 20 20  or.aChar[] */.  
0c10: 20 20 20 20 28 6e 43 68 61 72 2b 31 29 20 2a 20      (nChar+1) * 
0c20: 73 69 7a 65 6f 66 28 69 6e 74 29 20 20 20 20 20  sizeof(int)     
0c30: 20 20 20 20 20 20 20 2f 2a 20 49 63 75 43 75 72         /* IcuCur
0c40: 73 6f 72 2e 61 4f 66 66 73 65 74 5b 5d 20 2a 2f  sor.aOffset[] */
0c50: 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70 43 73  .  );.  if( !pCs
0c60: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
0c70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
0c80: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 43 73 72 2c  }.  memset(pCsr,
0c90: 20 30 2c 20 73 69 7a 65 6f 66 28 49 63 75 43 75   0, sizeof(IcuCu
0ca0: 72 73 6f 72 29 29 3b 0a 20 20 70 43 73 72 2d 3e  rsor));.  pCsr->
0cb0: 61 43 68 61 72 20 3d 20 28 55 43 68 61 72 20 2a  aChar = (UChar *
0cc0: 29 26 70 43 73 72 5b 31 5d 3b 0a 20 20 70 43 73  )&pCsr[1];.  pCs
0cd0: 72 2d 3e 61 4f 66 66 73 65 74 20 3d 20 28 69 6e  r->aOffset = (in
0ce0: 74 20 2a 29 26 70 43 73 72 2d 3e 61 43 68 61 72  t *)&pCsr->aChar
0cf0: 5b 6e 43 68 61 72 5d 3b 0a 0a 20 20 70 43 73 72  [nChar];..  pCsr
0d00: 2d 3e 61 4f 66 66 73 65 74 5b 69 4f 75 74 5d 20  ->aOffset[iOut] 
0d10: 3d 20 69 49 6e 70 75 74 3b 0a 20 20 55 38 5f 4e  = iInput;.  U8_N
0d20: 45 58 54 28 7a 49 6e 70 75 74 2c 20 69 49 6e 70  EXT(zInput, iInp
0d30: 75 74 2c 20 6e 49 6e 70 75 74 2c 20 63 29 3b 20  ut, nInput, c); 
0d40: 0a 20 20 77 68 69 6c 65 28 20 63 3e 30 20 29 7b  .  while( c>0 ){
0d50: 0a 20 20 20 20 69 6e 74 20 69 73 45 72 72 6f 72  .    int isError
0d60: 20 3d 20 30 3b 0a 20 20 20 20 63 20 3d 20 75 5f   = 0;.    c = u_
0d70: 66 6f 6c 64 43 61 73 65 28 63 2c 20 6f 70 74 29  foldCase(c, opt)
0d80: 3b 0a 20 20 20 20 55 31 36 5f 41 50 50 45 4e 44  ;.    U16_APPEND
0d90: 28 70 43 73 72 2d 3e 61 43 68 61 72 2c 20 69 4f  (pCsr->aChar, iO
0da0: 75 74 2c 20 6e 43 68 61 72 2c 20 63 2c 20 69 73  ut, nChar, c, is
0db0: 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
0dc0: 69 73 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  isError ){.     
0dd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
0de0: 73 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  sr);.      retur
0df0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
0e00: 20 20 20 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e      }.    pCsr->
0e10: 61 4f 66 66 73 65 74 5b 69 4f 75 74 5d 20 3d 20  aOffset[iOut] = 
0e20: 69 49 6e 70 75 74 3b 0a 0a 20 20 20 20 69 66 28  iInput;..    if(
0e30: 20 69 49 6e 70 75 74 3c 6e 49 6e 70 75 74 20 29   iInput<nInput )
0e40: 7b 0a 20 20 20 20 20 20 55 38 5f 4e 45 58 54 28  {.      U8_NEXT(
0e50: 7a 49 6e 70 75 74 2c 20 69 49 6e 70 75 74 2c 20  zInput, iInput, 
0e60: 6e 49 6e 70 75 74 2c 20 63 29 3b 0a 20 20 20 20  nInput, c);.    
0e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 20 3d  }else{.      c =
0e80: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
0e90: 20 70 43 73 72 2d 3e 70 49 74 65 72 20 3d 20 75   pCsr->pIter = u
0ea0: 62 72 6b 5f 6f 70 65 6e 28 55 42 52 4b 5f 57 4f  brk_open(UBRK_WO
0eb0: 52 44 2c 20 70 2d 3e 7a 4c 6f 63 61 6c 65 2c 20  RD, p->zLocale, 
0ec0: 70 43 73 72 2d 3e 61 43 68 61 72 2c 20 69 4f 75  pCsr->aChar, iOu
0ed0: 74 2c 20 26 73 74 61 74 75 73 29 3b 0a 20 20 69  t, &status);.  i
0ee0: 66 28 20 21 55 5f 53 55 43 43 45 53 53 28 73 74  f( !U_SUCCESS(st
0ef0: 61 74 75 73 29 20 29 7b 0a 20 20 20 20 73 71 6c  atus) ){.    sql
0f00: 69 74 65 33 5f 66 72 65 65 28 70 43 73 72 29 3b  ite3_free(pCsr);
0f10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0f20: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
0f30: 70 43 73 72 2d 3e 6e 43 68 61 72 20 3d 20 69 4f  pCsr->nChar = iO
0f40: 75 74 3b 0a 0a 20 20 75 62 72 6b 5f 66 69 72 73  ut;..  ubrk_firs
0f50: 74 28 70 43 73 72 2d 3e 70 49 74 65 72 29 3b 0a  t(pCsr->pIter);.
0f60: 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 28 73    *ppCursor = (s
0f70: 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a 65 72  qlite3_tokenizer
0f80: 5f 63 75 72 73 6f 72 20 2a 29 70 43 73 72 3b 0a  _cursor *)pCsr;.
0f90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0fa0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
0fb0: 73 65 20 61 20 74 6f 6b 65 6e 69 7a 61 74 69 6f  se a tokenizatio
0fc0: 6e 20 63 75 72 73 6f 72 20 70 72 65 76 69 6f 75  n cursor previou
0fd0: 73 6c 79 20 6f 70 65 6e 65 64 20 62 79 20 61 20  sly opened by a 
0fe0: 63 61 6c 6c 20 74 6f 20 69 63 75 4f 70 65 6e 28  call to icuOpen(
0ff0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1000: 20 69 63 75 43 6c 6f 73 65 28 73 71 6c 69 74 65   icuClose(sqlite
1010: 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 63 75 72 73  3_tokenizer_curs
1020: 6f 72 20 2a 70 43 75 72 73 6f 72 29 7b 0a 20 20  or *pCursor){.  
1030: 49 63 75 43 75 72 73 6f 72 20 2a 70 43 73 72 20  IcuCursor *pCsr 
1040: 3d 20 28 49 63 75 43 75 72 73 6f 72 20 2a 29 70  = (IcuCursor *)p
1050: 43 75 72 73 6f 72 3b 0a 20 20 75 62 72 6b 5f 63  Cursor;.  ubrk_c
1060: 6c 6f 73 65 28 70 43 73 72 2d 3e 70 49 74 65 72  lose(pCsr->pIter
1070: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1080: 65 28 70 43 73 72 2d 3e 7a 42 75 66 66 65 72 29  e(pCsr->zBuffer)
1090: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
10a0: 28 70 43 73 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCsr);.  return
10b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10c0: 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20 74 68 65  *.** Extract the
10d0: 20 6e 65 78 74 20 74 6f 6b 65 6e 20 66 72 6f 6d   next token from
10e0: 20 61 20 74 6f 6b 65 6e 69 7a 61 74 69 6f 6e 20   a tokenization 
10f0: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  cursor..*/.stati
1100: 63 20 69 6e 74 20 69 63 75 4e 65 78 74 28 0a 20  c int icuNext(. 
1110: 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
1120: 65 72 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 73  er_cursor *pCurs
1130: 6f 72 2c 20 20 2f 2a 20 43 75 72 73 6f 72 20 72  or,  /* Cursor r
1140: 65 74 75 72 6e 65 64 20 62 79 20 73 69 6d 70 6c  eturned by simpl
1150: 65 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  eOpen */.  const
1160: 20 63 68 61 72 20 2a 2a 70 70 54 6f 6b 65 6e 2c   char **ppToken,
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1180: 2a 20 4f 55 54 3a 20 2a 70 70 54 6f 6b 65 6e 20  * OUT: *ppToken 
1190: 69 73 20 74 68 65 20 74 6f 6b 65 6e 20 74 65 78  is the token tex
11a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79  t */.  int *pnBy
11b0: 74 65 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  tes,            
11c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
11d0: 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  T: Number of byt
11e0: 65 73 20 69 6e 20 74 6f 6b 65 6e 20 2a 2f 0a 20  es in token */. 
11f0: 20 69 6e 74 20 2a 70 69 53 74 61 72 74 4f 66 66   int *piStartOff
1200: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
1210: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 74 61       /* OUT: Sta
1220: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6f 66 20  rting offset of 
1230: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  token */.  int *
1240: 70 69 45 6e 64 4f 66 66 73 65 74 2c 20 20 20 20  piEndOffset,    
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1260: 2a 20 4f 55 54 3a 20 45 6e 64 69 6e 67 20 6f 66  * OUT: Ending of
1270: 66 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 2a 2f  fset of token */
1280: 0a 20 20 69 6e 74 20 2a 70 69 50 6f 73 69 74 69  .  int *piPositi
1290: 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
12a0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
12b0: 6f 73 69 74 69 6f 6e 20 69 6e 74 65 67 65 72 20  osition integer 
12c0: 6f 66 20 74 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20  of token */.){. 
12d0: 20 49 63 75 43 75 72 73 6f 72 20 2a 70 43 73 72   IcuCursor *pCsr
12e0: 20 3d 20 28 49 63 75 43 75 72 73 6f 72 20 2a 29   = (IcuCursor *)
12f0: 70 43 75 72 73 6f 72 3b 0a 0a 20 20 69 6e 74 20  pCursor;..  int 
1300: 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e  iStart = 0;.  in
1310: 74 20 69 45 6e 64 20 3d 20 30 3b 0a 20 20 69 6e  t iEnd = 0;.  in
1320: 74 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20  t nByte = 0;..  
1330: 77 68 69 6c 65 28 20 69 53 74 61 72 74 3d 3d 69  while( iStart==i
1340: 45 6e 64 20 29 7b 0a 20 20 20 20 55 43 68 61 72  End ){.    UChar
1350: 33 32 20 63 3b 0a 0a 20 20 20 20 69 53 74 61 72  32 c;..    iStar
1360: 74 20 3d 20 75 62 72 6b 5f 63 75 72 72 65 6e 74  t = ubrk_current
1370: 28 70 43 73 72 2d 3e 70 49 74 65 72 29 3b 0a 20  (pCsr->pIter);. 
1380: 20 20 20 69 45 6e 64 20 3d 20 75 62 72 6b 5f 6e     iEnd = ubrk_n
1390: 65 78 74 28 70 43 73 72 2d 3e 70 49 74 65 72 29  ext(pCsr->pIter)
13a0: 3b 0a 20 20 20 20 69 66 28 20 69 45 6e 64 3d 3d  ;.    if( iEnd==
13b0: 55 42 52 4b 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  UBRK_DONE ){.   
13c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13d0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
13e0: 20 20 77 68 69 6c 65 28 20 69 53 74 61 72 74 3c    while( iStart<
13f0: 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  iEnd ){.      in
1400: 74 20 69 57 68 69 74 65 20 3d 20 69 53 74 61 72  t iWhite = iStar
1410: 74 3b 0a 20 20 20 20 20 20 55 38 5f 4e 45 58 54  t;.      U8_NEXT
1420: 28 70 43 73 72 2d 3e 61 43 68 61 72 2c 20 69 57  (pCsr->aChar, iW
1430: 68 69 74 65 2c 20 70 43 73 72 2d 3e 6e 43 68 61  hite, pCsr->nCha
1440: 72 2c 20 63 29 3b 0a 20 20 20 20 20 20 69 66 28  r, c);.      if(
1450: 20 75 5f 69 73 73 70 61 63 65 28 63 29 20 29 7b   u_isspace(c) ){
1460: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
1470: 3d 20 69 57 68 69 74 65 3b 0a 20 20 20 20 20 20  = iWhite;.      
1480: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
1490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14a0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 69    }.    assert(i
14b0: 53 74 61 72 74 3c 3d 69 45 6e 64 29 3b 0a 20 20  Start<=iEnd);.  
14c0: 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 55 45  }..  do {.    UE
14d0: 72 72 6f 72 43 6f 64 65 20 73 74 61 74 75 73 20  rrorCode status 
14e0: 3d 20 55 5f 5a 45 52 4f 5f 45 52 52 4f 52 3b 0a  = U_ZERO_ERROR;.
14f0: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
1500: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  .      char *zNe
1510: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
1520: 6c 6f 63 28 70 43 73 72 2d 3e 7a 42 75 66 66 65  loc(pCsr->zBuffe
1530: 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  r, nByte);.     
1540: 20 69 66 28 20 21 7a 4e 65 77 20 29 7b 0a 20 20   if( !zNew ){.  
1550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1560: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1570: 20 7d 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 7a   }.      pCsr->z
1580: 42 75 66 66 65 72 20 3d 20 7a 4e 65 77 3b 0a 20  Buffer = zNew;. 
1590: 20 20 20 20 20 70 43 73 72 2d 3e 6e 42 75 66 66       pCsr->nBuff
15a0: 65 72 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  er = nByte;.    
15b0: 7d 0a 0a 20 20 20 20 75 5f 73 74 72 54 6f 55 54  }..    u_strToUT
15c0: 46 38 28 0a 20 20 20 20 20 20 20 20 70 43 73 72  F8(.        pCsr
15d0: 2d 3e 7a 42 75 66 66 65 72 2c 20 70 43 73 72 2d  ->zBuffer, pCsr-
15e0: 3e 6e 42 75 66 66 65 72 2c 20 26 6e 42 79 74 65  >nBuffer, &nByte
15f0: 2c 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 76  ,    /* Output v
1600: 61 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  ars */.        &
1610: 70 43 73 72 2d 3e 61 43 68 61 72 5b 69 53 74 61  pCsr->aChar[iSta
1620: 72 74 5d 2c 20 69 45 6e 64 2d 69 53 74 61 72 74  rt], iEnd-iStart
1630: 2c 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74  ,       /* Input
1640: 20 76 61 72 73 20 2a 2f 0a 20 20 20 20 20 20 20   vars */.       
1650: 20 26 73 74 61 74 75 73 20 20 20 20 20 20 20 20   &status        
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
1680: 70 75 74 20 73 75 63 63 65 73 73 2f 66 61 69 6c  put success/fail
1690: 75 72 65 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20  ure */.    );.  
16a0: 7d 20 77 68 69 6c 65 28 20 6e 42 79 74 65 3e 70  } while( nByte>p
16b0: 43 73 72 2d 3e 6e 42 75 66 66 65 72 20 29 3b 0a  Csr->nBuffer );.
16c0: 0a 20 20 2a 70 70 54 6f 6b 65 6e 20 3d 20 70 43  .  *ppToken = pC
16d0: 73 72 2d 3e 7a 42 75 66 66 65 72 3b 0a 20 20 2a  sr->zBuffer;.  *
16e0: 70 6e 42 79 74 65 73 20 3d 20 6e 42 79 74 65 3b  pnBytes = nByte;
16f0: 0a 20 20 2a 70 69 53 74 61 72 74 4f 66 66 73 65  .  *piStartOffse
1700: 74 20 3d 20 70 43 73 72 2d 3e 61 4f 66 66 73 65  t = pCsr->aOffse
1710: 74 5b 69 53 74 61 72 74 5d 3b 0a 20 20 2a 70 69  t[iStart];.  *pi
1720: 45 6e 64 4f 66 66 73 65 74 20 3d 20 70 43 73 72  EndOffset = pCsr
1730: 2d 3e 61 4f 66 66 73 65 74 5b 69 45 6e 64 5d 3b  ->aOffset[iEnd];
1740: 0a 20 20 2a 70 69 50 6f 73 69 74 69 6f 6e 20 3d  .  *piPosition =
1750: 20 70 43 73 72 2d 3e 69 54 6f 6b 65 6e 2b 2b 3b   pCsr->iToken++;
1760: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1770: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1780: 68 65 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  he set of routin
1790: 65 73 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  es that implemen
17a0: 74 20 74 68 65 20 73 69 6d 70 6c 65 20 74 6f 6b  t the simple tok
17b0: 65 6e 69 7a 65 72 0a 2a 2f 0a 73 74 61 74 69 63  enizer.*/.static
17c0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 74   const sqlite3_t
17d0: 6f 6b 65 6e 69 7a 65 72 5f 6d 6f 64 75 6c 65 20  okenizer_module 
17e0: 69 63 75 54 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75  icuTokenizerModu
17f0: 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1820: 6e 20 2a 2f 0a 20 20 69 63 75 43 72 65 61 74 65  n */.  icuCreate
1830: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1840: 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 20      /* xCreate  
1850: 2a 2f 0a 20 20 69 63 75 44 65 73 74 72 6f 79 2c  */.  icuDestroy,
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 2f 2a 20 78 43 72 65 61 74 65 20 20 2a 2f    /* xCreate  */
1880: 0a 20 20 69 63 75 4f 70 65 6e 2c 20 20 20 20 20  .  icuOpen,     
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 2f 2a 20 78 4f 70 65 6e 20 20 20 20 2a 2f 0a 20  /* xOpen    */. 
18b0: 20 69 63 75 43 6c 6f 73 65 2c 20 20 20 20 20 20   icuClose,      
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d0: 20 78 43 6c 6f 73 65 20 20 20 2a 2f 0a 20 20 69   xClose   */.  i
18e0: 63 75 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  cuNext,         
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1900: 4e 65 78 74 20 20 20 20 2a 2f 0a 7d 3b 0a 0a 2f  Next    */.};../
1910: 2a 0a 2a 2a 20 53 65 74 20 2a 70 70 4d 6f 64 75  *.** Set *ppModu
1920: 6c 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  le to point at t
1930: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1940: 6e 20 6f 66 20 74 68 65 20 49 43 55 20 74 6f 6b  n of the ICU tok
1950: 65 6e 69 7a 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  enizer..*/.void 
1960: 73 71 6c 69 74 65 33 46 74 73 32 49 63 75 54 6f  sqlite3Fts2IcuTo
1970: 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 28 0a 20  kenizerModule(. 
1980: 20 73 71 6c 69 74 65 33 5f 74 6f 6b 65 6e 69 7a   sqlite3_tokeniz
1990: 65 72 5f 6d 6f 64 75 6c 65 20 63 6f 6e 73 74 2a  er_module const*
19a0: 2a 70 70 4d 6f 64 75 6c 65 0a 29 7b 0a 20 20 2a  *ppModule.){.  *
19b0: 70 70 4d 6f 64 75 6c 65 20 3d 20 26 69 63 75 54  ppModule = &icuT
19c0: 6f 6b 65 6e 69 7a 65 72 4d 6f 64 75 6c 65 3b 0a  okenizerModule;.
19d0: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
19e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
19f0: 4c 45 5f 49 43 55 29 20 2a 2f 0a 23 65 6e 64 69  LE_ICU) */.#endi
1a00: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
1a10: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
1a20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1a30: 42 4c 45 5f 46 54 53 32 29 20 2a 2f 0a           BLE_FTS2) */.