PostgreSQL Source Code  git master
dict_ispell.c File Reference
#include "postgres.h"
#include "commands/defrem.h"
#include "tsearch/dicts/spell.h"
#include "tsearch/ts_locale.h"
#include "tsearch/ts_public.h"
#include "utils/fmgrprotos.h"
Include dependency graph for dict_ispell.c:

Go to the source code of this file.

Data Structures

struct  DictISpell
 

Functions

Datum dispell_init (PG_FUNCTION_ARGS)
 
Datum dispell_lexize (PG_FUNCTION_ARGS)
 

Function Documentation

◆ dispell_init()

Datum dispell_init ( PG_FUNCTION_ARGS  )

Definition at line 30 of file dict_ispell.c.

31 {
32  List *dictoptions = (List *) PG_GETARG_POINTER(0);
33  DictISpell *d;
34  bool affloaded = false,
35  dictloaded = false,
36  stoploaded = false;
37  ListCell *l;
38 
39  d = (DictISpell *) palloc0(sizeof(DictISpell));
40 
41  NIStartBuild(&(d->obj));
42 
43  foreach(l, dictoptions)
44  {
45  DefElem *defel = (DefElem *) lfirst(l);
46 
47  if (strcmp(defel->defname, "dictfile") == 0)
48  {
49  if (dictloaded)
50  ereport(ERROR,
51  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
52  errmsg("multiple DictFile parameters")));
53  NIImportDictionary(&(d->obj),
55  "dict"));
56  dictloaded = true;
57  }
58  else if (strcmp(defel->defname, "afffile") == 0)
59  {
60  if (affloaded)
61  ereport(ERROR,
62  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
63  errmsg("multiple AffFile parameters")));
64  NIImportAffixes(&(d->obj),
66  "affix"));
67  affloaded = true;
68  }
69  else if (strcmp(defel->defname, "stopwords") == 0)
70  {
71  if (stoploaded)
72  ereport(ERROR,
73  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
74  errmsg("multiple StopWords parameters")));
76  stoploaded = true;
77  }
78  else
79  {
80  ereport(ERROR,
81  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
82  errmsg("unrecognized Ispell parameter: \"%s\"",
83  defel->defname)));
84  }
85  }
86 
87  if (affloaded && dictloaded)
88  {
89  NISortDictionary(&(d->obj));
90  NISortAffixes(&(d->obj));
91  }
92  else if (!affloaded)
93  {
94  ereport(ERROR,
95  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
96  errmsg("missing AffFile parameter")));
97  }
98  else
99  {
100  ereport(ERROR,
101  (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
102  errmsg("missing DictFile parameter")));
103  }
104 
105  NIFinishBuild(&(d->obj));
106 
108 }
char * defGetString(DefElem *def)
Definition: define.c:48
int errcode(int sqlerrcode)
Definition: elog.c:853
int errmsg(const char *fmt,...)
Definition: elog.c:1070
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:149
#define PG_GETARG_POINTER(n)
Definition: fmgr.h:276
#define PG_RETURN_POINTER(x)
Definition: fmgr.h:361
void * palloc0(Size size)
Definition: mcxt.c:1347
#define lfirst(lc)
Definition: pg_list.h:172
void NIStartBuild(IspellDict *Conf)
Definition: spell.c:88
void NIFinishBuild(IspellDict *Conf)
Definition: spell.c:103
void NIImportAffixes(IspellDict *Conf, const char *filename)
Definition: spell.c:1425
void NISortDictionary(IspellDict *Conf)
Definition: spell.c:1722
void NISortAffixes(IspellDict *Conf)
Definition: spell.c:1976
void NIImportDictionary(IspellDict *Conf, const char *filename)
Definition: spell.c:517
char * defname
Definition: parsenodes.h:817
StopList stoplist
Definition: dict_ispell.c:25
IspellDict obj
Definition: dict_ispell.c:26
Definition: pg_list.h:54
char * lowerstr(const char *str)
Definition: ts_locale.c:253
void readstoplist(const char *fname, StopList *s, char *(*wordop)(const char *))
Definition: ts_utils.c:68
char * get_tsearch_config_filename(const char *basename, const char *extension)
Definition: ts_utils.c:33

References defGetString(), DefElem::defname, ereport, errcode(), errmsg(), ERROR, get_tsearch_config_filename(), lfirst, lowerstr(), NIFinishBuild(), NIImportAffixes(), NIImportDictionary(), NISortAffixes(), NISortDictionary(), NIStartBuild(), DictISpell::obj, palloc0(), PG_GETARG_POINTER, PG_RETURN_POINTER, readstoplist(), and DictISpell::stoplist.

◆ dispell_lexize()

Datum dispell_lexize ( PG_FUNCTION_ARGS  )

Definition at line 111 of file dict_ispell.c.

112 {
114  char *in = (char *) PG_GETARG_POINTER(1);
116  char *txt;
117  TSLexeme *res;
118  TSLexeme *ptr,
119  *cptr;
120 
121  if (len <= 0)
122  PG_RETURN_POINTER(NULL);
123 
124  txt = lowerstr_with_len(in, len);
125  res = NINormalizeWord(&(d->obj), txt);
126 
127  if (res == NULL)
128  PG_RETURN_POINTER(NULL);
129 
130  cptr = res;
131  for (ptr = cptr; ptr->lexeme; ptr++)
132  {
133  if (searchstoplist(&(d->stoplist), ptr->lexeme))
134  {
135  pfree(ptr->lexeme);
136  ptr->lexeme = NULL;
137  }
138  else
139  {
140  if (cptr != ptr)
141  memcpy(cptr, ptr, sizeof(TSLexeme));
142  cptr++;
143  }
144  }
145  cptr->lexeme = NULL;
146 
148 }
signed int int32
Definition: c.h:497
#define PG_GETARG_INT32(n)
Definition: fmgr.h:269
void pfree(void *pointer)
Definition: mcxt.c:1521
const void size_t len
TSLexeme * NINormalizeWord(IspellDict *Conf, const char *word)
Definition: spell.c:2540
char * lexeme
Definition: ts_public.h:138
char * lowerstr_with_len(const char *str, int len)
Definition: ts_locale.c:266
bool searchstoplist(StopList *s, char *key)
Definition: ts_utils.c:140

References len, TSLexeme::lexeme, lowerstr_with_len(), NINormalizeWord(), DictISpell::obj, pfree(), PG_GETARG_INT32, PG_GETARG_POINTER, PG_RETURN_POINTER, res, searchstoplist(), and DictISpell::stoplist.