text: /*-------------------------------------------------------------------------
   *
   * ts_public.h
   *	  Public interface to various tsearch modules, such as
   *	  parsers and dictionaries.
   *
   * Copyright (c) 1998-2016, PostgreSQL Global Development Group
   *
   * src/include/tsearch/ts_public.h
   *
   *-------------------------------------------------------------------------
   */
  #ifndef _PG_TS_PUBLIC_H_
  #define _PG_TS_PUBLIC_H_
  
  #include "tsearch/ts_type.h"
  
  /*
   * Parser's framework
   */
  
  /*
   * returning type for prslextype method of parser
   */
  typedef struct
  {
  	int			lexid;
  	char	   *alias;
  	char	   *descr;
  } LexDescr;
  
  /*
   * Interface to headline generator
   */
  typedef struct
  {
  	uint32		selected:1,
  				in:1,
  				replace:1,
  				repeated:1,
  				skip:1,
  				unused:3,
  				type:8,
  				len:16;
  	WordEntryPos pos;
  	char	   *word;
  	QueryOperand *item;
  } HeadlineWordEntry;
  
  typedef struct
  {
  	HeadlineWordEntry *words;
  	int32		lenwords;
  	int32		curwords;
  	int32		vectorpos;		/* positions a-la tsvector */
  	char	   *startsel;
  	char	   *stopsel;
  	char	   *fragdelim;
  	int16		startsellen;
  	int16		stopsellen;
  	int16		fragdelimlen;
  } HeadlineParsedText;
  
  /*
   * Common useful things for tsearch subsystem
   */
  extern char *get_tsearch_config_filename(const char *basename,
  							const char *extension);
  
  /*
   * Often useful stopword list management
   */
  typedef struct
  {
  	int			len;
  	char	  **stop;
  } StopList;
  
  extern void readstoplist(const char *fname, StopList *s,
  			 char *(*wordop) (const char *));
  extern bool searchstoplist(StopList *s, char *key);
  
  /*
   * Interface with dictionaries
   */
  
  /* return struct for any lexize function */
  typedef struct
  {
  	/*----------
  	 * Number of current variant of split word.  For example the Norwegian
  	 * word 'fotballklubber' has two variants to split: ( fotball, klubb )
  	 * and ( fot, ball, klubb ). So, dictionary should return:
  	 *
  	 * nvariant    lexeme
  	 *	   1	   fotball
  	 *	   1	   klubb
  	 *	   2	   fot
  	 *	   2	   ball
  	 *	   2	   klubb
  	 *
  	 * In general, a TSLexeme will be considered to belong to the same split
  	 * variant as the previous one if they have the same nvariant value.
  	 * The exact values don't matter, only changes from one lexeme to next.
  	 *----------
  	 */
  	uint16		nvariant;
  
  	uint16		flags;			/* See flag bits below */
  
  	char	   *lexeme;			/* C string */
  } TSLexeme;
  
  /* Flag bits that can appear in TSLexeme.flags */
  #define TSL_ADDPOS		0x01
  #define TSL_PREFIX		0x02
  #define TSL_FILTER		0x04
  
  /*
   * Struct for supporting complex dictionaries like thesaurus.
   * 4th argument for dictlexize method is a pointer to this
   */
  typedef struct
  {
  	bool		isend;			/* in: marks for lexize_info about text end is
  								 * reached */
  	bool		getnext;		/* out: dict wants next lexeme */
  	void	   *private_state;	/* internal dict state between calls with
  								 * getnext == true */
  } DictSubState;
  
  #endif   /* _PG_TS_PUBLIC_H_ */
  