summaryrefslogtreecommitdiff
path: root/contrib/tsearch/morph.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tsearch/morph.c')
-rw-r--r--contrib/tsearch/morph.c214
1 files changed, 0 insertions, 214 deletions
diff --git a/contrib/tsearch/morph.c b/contrib/tsearch/morph.c
deleted file mode 100644
index b827fd652d..0000000000
--- a/contrib/tsearch/morph.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * morphology module
- * New dictionary is include in dict.h. For languages which
- * use latin charset it may be need to modify mapdict table.
- * Teodor Sigaev <teodor@stack.net>
- */
-#include "postgres.h"
-
-#include <locale.h>
-
-#include "utils/builtins.h"
-
-#include "morph.h"
-#include "deflex.h"
-
-/*
- * Struct for calling dictionaries
- * All of this methods are optional, but
- * if all methods are NULL, then dictionary does nothing :)
- * Return value of lemmatize must be palloced or the same.
- * Return value of init must be malloced in other case
- * it will be free in end of transaction!
- */
-typedef struct
-{
- char localename[NAMEDATALEN];
- /* init dictionary */
- void *(*init) (void);
- /* close dictionary */
- void (*close) (void *);
- /* find in dictionary */
- char *(*lemmatize) (void *, char *, int *);
- int (*is_stoplemm) (void *, char *, int);
- int (*is_stemstoplemm) (void *, char *, int);
-} DICT;
-
-/* insert all dictionaries */
-#define DICT_BODY
-#include "dict.h"
-#undef DICT_BODY
-
-/* fill dictionary's structure */
-#define DICT_TABLE
-DICT dicts[] = {
- {
- "C", NULL, NULL, NULL, NULL, NULL /* fake dictionary */
- }
-#include "dict.h"
-};
-
-#undef DICT_TABLE
-
-/* array for storing dictionary's objects (if needed) */
-void *dictobjs[
- lengthof(dicts)];
-
-#define STOPLEXEM -2
-#define BYLOCALE -1
-#define NODICT 0
-#define DEFAULTDICT 1
-
-#define MAXNDICT 2
-typedef int2 MAPDICT[MAXNDICT];
-
-#define GETDICT(x,i) *( ((int2*)(x)) + (i) )
-
-/* map dictionaries for lexem type */
-static MAPDICT mapdict[] = {
- {NODICT, NODICT}, /* not used */
- {DEFAULTDICT, NODICT}, /* LATWORD */
- {BYLOCALE, NODICT}, /* NONLATINWORD */
- {BYLOCALE, DEFAULTDICT}, /* UWORD */
- {NODICT, NODICT}, /* EMAIL */
- {NODICT, NODICT}, /* FURL */
- {NODICT, NODICT}, /* HOST */
- {NODICT, NODICT}, /* SCIENTIFIC */
- {NODICT, NODICT}, /* VERSIONNUMBER */
- {BYLOCALE, DEFAULTDICT}, /* PARTHYPHENWORD */
- {BYLOCALE, NODICT}, /* CYRPARTHYPHENWORD */
- {DEFAULTDICT, NODICT}, /* LATPARTHYPHENWORD */
- {STOPLEXEM, NODICT}, /* SPACE */
- {STOPLEXEM, NODICT}, /* TAG */
- {STOPLEXEM, NODICT}, /* HTTP */
- {BYLOCALE, DEFAULTDICT}, /* HYPHENWORD */
- {DEFAULTDICT, NODICT}, /* LATHYPHENWORD */
- {BYLOCALE, NODICT}, /* CYRHYPHENWORD */
- {NODICT, NODICT}, /* URI */
- {NODICT, NODICT}, /* FILEPATH */
- {NODICT, NODICT}, /* DECIMAL */
- {NODICT, NODICT}, /* SIGNEDINT */
- {NODICT, NODICT}, /* UNSIGNEDINT */
- {STOPLEXEM, NODICT} /* HTMLENTITY */
-};
-
-static bool inited = false;
-
-void
-initmorph(void)
-{
- int i,
- j,
- k;
- MAPDICT *md;
- bool needinit[lengthof(dicts)];
- const char *curlocale;
- int bylocaledict = NODICT;
-
- if (inited)
- return;
- for (i = 1; i < lengthof(dicts); i++)
- needinit[i] = false;
-
- curlocale = setlocale(LC_CTYPE, NULL);
- if (curlocale)
- {
- for (i = 1; i < lengthof(dicts); i++)
- if (strcmp(dicts[i].localename, curlocale) == 0)
- {
- bylocaledict = i;
- break;
- }
- }
-
- for (i = 1; i < lengthof(mapdict); i++)
- {
- k = 0;
- md = &mapdict[i];
- for (j = 0; j < MAXNDICT; j++)
- {
- GETDICT(md, k) = GETDICT(md, j);
- if (GETDICT(md, k) == NODICT)
- break;
- else if (GETDICT(md, k) == BYLOCALE)
- {
- if (bylocaledict == NODICT)
- continue;
- GETDICT(md, k) = bylocaledict;
- }
- if (GETDICT(md, k) >= (int2) lengthof(dicts))
- continue;
- needinit[GETDICT(md, k)] = true;
- k++;
- }
- for (; k < MAXNDICT; k++)
- if (GETDICT(md, k) != STOPLEXEM)
- GETDICT(md, k) = NODICT;
- }
-
- for (i = 1; i < lengthof(dicts); i++)
- if (needinit[i] && dicts[i].init)
- dictobjs[i] = (*(dicts[i].init)) ();
-
- inited = true;
- return;
-}
-
-char *
-lemmatize(char *word, int *len, int type)
-{
- int2 nd;
- int i;
- DICT *dict;
-
- for (i = 0; i < MAXNDICT; i++)
- {
- nd = GETDICT(&mapdict[type], i);
- if (nd == NODICT)
- {
- /* there is no dictionary */
- return word;
- }
- else if (nd == STOPLEXEM)
- {
- /* word is stopword */
- return NULL;
- }
- else if (nd == BYLOCALE)
- {
- continue; /* no dict for current locale */
- }
- else
- {
- dict = &dicts[nd];
- if (dict->is_stoplemm && (*(dict->is_stoplemm)) (dictobjs[nd], word, *len))
- return NULL;
- if (dict->lemmatize)
- {
- int oldlen = *len;
- char *newword = (*(dict->lemmatize)) (dictobjs[nd], word, len);
-
- /* word is recognized by dictionary */
- if (newword != word || *len != oldlen)
- {
- if (dict->is_stemstoplemm &&
- (*(dict->is_stemstoplemm)) (dictobjs[nd], word, *len))
- {
- if (newword != word && newword)
- pfree(newword);
- return NULL;
- }
- return newword;
- }
- }
- }
- }
-
- return word;
-}
-
-bool
-is_stoptype(int type)
-{
- return (GETDICT(&mapdict[type], 0) == STOPLEXEM) ? true : false;
-}