Optimize. Improve ispell support for compound words. This work was sponsored by ABC Startsiden AS.

This commit is contained in:
Teodor Sigaev 2003-11-17 17:34:35 +00:00
parent 6a04c571d4
commit c63c1946a2
3 changed files with 718 additions and 306 deletions

View File

@ -27,7 +27,7 @@ Datum spell_lexize(PG_FUNCTION_ARGS);
static void
freeDictISpell(DictISpell * d)
{
FreeIspell(&(d->obj));
NIFree(&(d->obj));
freestoplist(&(d->stoplist));
free(d);
}
@ -71,7 +71,7 @@ spell_init(PG_FUNCTION_ARGS)
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("dictionary already loaded")));
}
if (ImportDictionary(&(d->obj), pcfg->value))
if (NIImportDictionary(&(d->obj), pcfg->value))
{
freeDictISpell(d);
ereport(ERROR,
@ -90,7 +90,7 @@ spell_init(PG_FUNCTION_ARGS)
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("affixes already loaded")));
}
if (ImportAffixes(&(d->obj), pcfg->value))
if (NIImportAffixes(&(d->obj), pcfg->value))
{
freeDictISpell(d);
ereport(ERROR,
@ -132,8 +132,8 @@ spell_init(PG_FUNCTION_ARGS)
if (affloaded && dictloaded)
{
SortDictionary(&(d->obj));
SortAffixes(&(d->obj));
NISortDictionary(&(d->obj));
NISortAffixes(&(d->obj));
}
else if (!affloaded)
{
@ -168,7 +168,7 @@ spell_lexize(PG_FUNCTION_ARGS)
res = palloc(sizeof(char *) * 2);
txt = pnstrdup(in, PG_GETARG_INT32(2));
res = NormalizeWord(&(d->obj), txt);
res = NINormalizeWord(&(d->obj), txt);
pfree(txt);
if (res == NULL)

File diff suppressed because it is too large Load Diff

View File

@ -4,15 +4,43 @@
#include <sys/types.h>
#include <regex.h>
struct SPNode;
typedef struct {
u_int32_t
val:8,
isword:1,
compoundallow:1,
affix:22;
struct SPNode *node;
} SPNodeData;
typedef struct SPNode {
u_int32_t length;
SPNodeData data[1];
} SPNode;
#define SPNHRDSZ (sizeof(u_int32_t))
typedef struct spell_struct
{
char *word;
char flag[10];
union {
char flag[16];
struct {
int affix;
int len;
} d;
} p;
} SPELL;
typedef struct aff_struct
{
char flag;
char flagflags;
char type;
char mask[33];
char find[16];
@ -22,35 +50,66 @@ typedef struct aff_struct
char compile;
} AFFIX;
#define FF_CROSSPRODUCT 0x01
#define FF_COMPOUNDWORD 0x02
#define FF_COMPOUNDONLYAFX 0x04
struct AffixNode;
typedef struct {
u_int32_t
val:8,
naff:24;
AFFIX **aff;
struct AffixNode *node;
} AffixNodeData;
typedef struct AffixNode {
u_int32_t length;
AffixNodeData data[1];
} AffixNode;
#define ANHRDSZ (sizeof(u_int32_t))
typedef struct Tree_struct
{
int Left[256],
Right[256];
} Tree_struct;
typedef struct {
char *affix;
int len;
} CMPDAffix;
typedef struct
{
int maffixes;
int naffixes;
AFFIX *Affix;
char compoundcontrol;
int nspell;
int mspell;
SPELL *Spell;
Tree_struct SpellTree;
Tree_struct PrefixTree;
Tree_struct SuffixTree;
AffixNode *Suffix;
AffixNode *Prefix;
SPNode *Dictionary;
char **AffixData;
CMPDAffix *CompoundAffix;
} IspellDict;
char **NormalizeWord(IspellDict * Conf, char *word);
int ImportAffixes(IspellDict * Conf, const char *filename);
int ImportDictionary(IspellDict * Conf, const char *filename);
char **NINormalizeWord(IspellDict * Conf, char *word);
int NIImportAffixes(IspellDict * Conf, const char *filename);
int NIImportDictionary(IspellDict * Conf, const char *filename);
int AddSpell(IspellDict * Conf, const char *word, const char *flag);
int AddAffix(IspellDict * Conf, int flag, const char *mask, const char *find, const char *repl, int type);
void SortDictionary(IspellDict * Conf);
void SortAffixes(IspellDict * Conf);
void FreeIspell(IspellDict * Conf);
int NIAddSpell(IspellDict * Conf, const char *word, const char *flag);
int NIAddAffix(IspellDict * Conf, int flag, char flagflags, const char *mask, const char *find, const char *repl, int type);
void NISortDictionary(IspellDict * Conf);
void NISortAffixes(IspellDict * Conf);
void NIFree(IspellDict * Conf);
#endif