251 #include "ispell_checker.h"
255 static void dumpindex P ((
struct flagptr * indexp,
int depth));
265 int ISpellChecker::linit (
char *hashname)
270 register struct dent * dp;
271 struct flagent * entry;
272 struct flagptr * ind;
275 register ichar_t * cp;
277 if ((fpHash = fopen (hashname,
"rb")) == NULL)
282 m_hashsize = fread (reinterpret_cast<char *>(&m_hashheader), 1,
sizeof m_hashheader, fpHash);
283 if (m_hashsize < static_cast<int>(
sizeof(m_hashheader)))
286 fprintf (stderr, LOOKUP_C_CANT_READ, hashname);
287 else if (m_hashsize == 0)
288 fprintf (stderr, LOOKUP_C_NULL_HASH, hashname);
291 LOOKUP_C_SHORT_HASH (m_hashname, m_hashsize,
292 static_cast<int>(
sizeof m_hashheader)));
295 else if (m_hashheader.magic != MAGIC)
298 LOOKUP_C_BAD_MAGIC (hashname, static_cast<unsigned int>(MAGIC),
299 static_cast<unsigned int>(m_hashheader.magic)));
302 else if (m_hashheader.magic2 != MAGIC)
305 LOOKUP_C_BAD_MAGIC2 (hashname, static_cast<unsigned int>(MAGIC),
306 static_cast<unsigned int>(m_hashheader.magic2)));
311 || m_hashheader.maxstringchars != MAXSTRINGCHARS
312 || m_hashheader.maxstringcharlen != MAXSTRINGCHARLEN)
315 LOOKUP_C_BAD_OPTIONS (static_cast<unsigned int>(m_hashheader.compileoptions),
316 m_hashheader.maxstringchars, m_hashheader.maxstringcharlen,
317 static_cast<unsigned int>(COMPILEOPTIONS), MAXSTRINGCHARS, MAXSTRINGCHARLEN));
324 calloc (static_cast<unsigned>(m_hashheader.tblsize),
sizeof (
struct dent));
325 m_hashsize = m_hashheader.tblsize;
326 m_hashstrings =
static_cast<char *
>(malloc(static_cast<unsigned>(m_hashheader.stringsize)));
328 m_numsflags = m_hashheader.stblsize;
329 m_numpflags = m_hashheader.ptblsize;
330 m_sflaglist = (
struct flagent *)
331 malloc ((m_numsflags + m_numpflags) *
sizeof (
struct flagent));
332 if (m_hashtbl == NULL || m_hashstrings == NULL || m_sflaglist == NULL)
334 fprintf (stderr, LOOKUP_C_NO_HASH_SPACE);
337 m_pflaglist = m_sflaglist + m_numsflags;
340 if( fread ( m_hashstrings, 1, static_cast<unsigned>(m_hashheader.stringsize), fpHash)
341 != static_cast<size_t>(m_hashheader.stringsize) )
343 fprintf (stderr, LOOKUP_C_BAD_FORMAT);
344 fprintf (stderr,
"stringsize err\n" );
347 if ( m_hashheader.compileoptions & 0x04 )
349 if( fread (reinterpret_cast<char *>(m_hashtbl), 1, static_cast<unsigned>(m_hashheader.tblsize) *
sizeof(
struct dent), fpHash)
350 != (static_cast<size_t>(m_hashheader.tblsize * sizeof (
struct dent))))
352 fprintf (stderr, LOOKUP_C_BAD_FORMAT);
358 for( x=0; x<m_hashheader.tblsize; x++ )
360 if( fread ( reinterpret_cast<char*>(m_hashtbl+x),
sizeof(
struct dent)-
sizeof( MASKTYPE ), 1, fpHash)
363 fprintf (stderr, LOOKUP_C_BAD_FORMAT);
369 if (fread (reinterpret_cast<char *>(m_sflaglist), 1,
370 static_cast<unsigned>(m_numsflags+ m_numpflags) *
sizeof (
struct flagent), fpHash)
371 != (m_numsflags + m_numpflags) *
sizeof (
struct flagent))
373 fprintf (stderr, LOOKUP_C_BAD_FORMAT);
379 for (i = m_hashsize, dp = m_hashtbl; --i >= 0; dp++)
381 if (dp->word == (
char *) -1)
384 dp->word = &m_hashstrings [
reinterpret_cast<size_t>(dp->word) ];
385 if (dp->next == (
struct dent *) -1)
388 dp->next = &m_hashtbl [ reinterpret_cast<size_t>(dp->next) ];
392 for (i = m_numsflags + m_numpflags, entry = m_sflaglist; --i >= 0; entry++)
395 entry->strip =
reinterpret_cast<ichar_t *
>(&m_hashstrings[
reinterpret_cast<size_t>(entry->strip)]);
399 entry->affix =
reinterpret_cast<ichar_t *
>(&m_hashstrings[
reinterpret_cast<size_t>(entry->affix)]);
408 for (i = m_numsflags, entry = m_sflaglist; i > 0; i--, entry++)
410 if (entry->affl == 0)
413 ind = &m_sflagindex[0];
418 cp = entry->affix + entry->affl - 1;
419 ind = &m_sflagindex[*cp];
421 while (ind->numents == 0 && ind->pu.fp != NULL)
423 if (cp == entry->affix)
425 ind = &ind->pu.fp[0];
430 ind = &ind->pu.fp[*--cp];
435 if (ind->numents == 0)
448 if (!viazero && ind->numents >= MAXSEARCH
449 && icharcmp (entry->affix, ind->pu.ent->affix) != 0)
452 entry = ind->pu.ent - 1;
453 i = m_numsflags - (entry - m_sflaglist);
456 calloc (static_cast<unsigned>(SET_SIZE + m_hashheader.nstrchars),
457 sizeof (
struct flagptr));
458 if (ind->pu.fp == NULL)
460 fprintf (stderr, LOOKUP_C_NO_LANG_SPACE);
471 for (i = m_numpflags, entry = m_pflaglist; i > 0; i--, entry++)
473 if (entry->affl == 0)
476 ind = &m_pflagindex[0];
482 ind = &m_pflagindex[*cp++];
484 while (ind->numents == 0 && ind->pu.fp != NULL)
488 ind = &ind->pu.fp[0];
493 ind = &ind->pu.fp[*cp++];
498 if (ind->numents == 0)
511 if (!viazero && ind->numents >= MAXSEARCH
512 && icharcmp (entry->affix, ind->pu.ent->affix) != 0)
515 entry = ind->pu.ent - 1;
516 i = m_numpflags - (entry - m_pflaglist);
518 static_cast<struct flagptr *
>(calloc(SET_SIZE + m_hashheader.nstrchars,
519 sizeof (
struct flagptr)));
520 if (ind->pu.fp == NULL)
522 fprintf (stderr, LOOKUP_C_NO_LANG_SPACE);
529 fprintf (stderr,
"Prefix index table:\n");
530 dumpindex (m_pflagindex, 0);
531 fprintf (stderr,
"Suffix index table:\n");
532 dumpindex (m_sflagindex, 0);
534 if (m_hashheader.nstrchartype == 0)
538 m_chartypes = (
struct strchartype *)
539 malloc (m_hashheader.nstrchartype * sizeof (
struct strchartype));
540 if (m_chartypes == NULL)
542 fprintf (stderr, LOOKUP_C_NO_LANG_SPACE);
545 for (i = 0, nextchar = m_hashheader.strtypestart;
546 i < m_hashheader.nstrchartype;
549 m_chartypes[i].name = &m_hashstrings[nextchar];
550 nextchar += strlen (m_chartypes[i].name) + 1;
551 m_chartypes[i].deformatter = &m_hashstrings[nextchar];
552 nextchar += strlen (m_chartypes[i].deformatter) + 1;
553 m_chartypes[i].suffixes = &m_hashstrings[nextchar];
554 while (m_hashstrings[nextchar] !=
'\0')
555 nextchar += strlen (&m_hashstrings[nextchar]) + 1;
566 #define FREEP(p) do { if (p) free(p); } while (0)
572 void ISpellChecker::initckch (
char *wchars)
577 for (c = 0; c < static_cast<ichar_t>(SET_SIZE+ m_hashheader.nstrchars); ++c)
587 else if (isboundarych (c))
595 while (m_Trynum < SET_SIZE && *wchars !=
'\0')
597 if (*wchars !=
'n' && *wchars !=
'\\')
609 if (isdigit (wchars[0]))
612 if (isdigit (wchars[1]))
615 if (isdigit (wchars[2]))
619 if (wchars[-1] ==
'n')
621 wchars += strlen (num);
626 wchars += strlen (num);
643 if (!m_hashheader.wordchars[c])
645 m_hashheader.wordchars[c] = 1;
646 m_hashheader.sortorder[c] = m_hashheader.sortval++;
657 void ISpellChecker::clearindex (
struct flagptr *indexp)
660 for (i = 0; i < SET_SIZE + m_hashheader.nstrchars; i++, indexp++)
662 if (indexp->numents == 0 && indexp->pu.fp != NULL)
664 clearindex(indexp->pu.fp);
671 static void dumpindex (indexp, depth)
672 register struct flagptr * indexp;
678 char stripbuf[INPUTWORDLEN + 4 * MAXAFFIXLEN + 4];
680 for (i = 0; i < SET_SIZE + hashheader.nstrchars; i++, indexp++)
682 if (indexp->numents == 0 && indexp->pu.fp != NULL)
684 for (j = depth; --j >= 0; )
686 if (i >=
' ' && i <=
'~')
689 fprintf (stderr,
"0x%x", i);
691 dumpindex (indexp->pu.fp, depth + 1);
693 else if (indexp->numents)
695 for (j = depth; --j >= 0; )
697 if (i >=
' ' && i <=
'~')
700 fprintf (stderr,
"0x%x", i);
701 fprintf (stderr,
" -> %d entries\n", indexp->numents);
702 for (k = 0; k < indexp->numents; k++)
704 for (j = depth; --j >= 0; )
706 if (indexp->pu.ent[k].stripl)
708 ichartostr (stripbuf, indexp->pu.ent[k].strip,
710 fprintf (stderr,
" entry %d (-%s,%s)\n",
711 &indexp->pu.ent[k] - sflaglist,
713 indexp->pu.ent[k].affl
714 ? ichartosstr (indexp->pu.ent[k].affix, 1) :
"-");
717 fprintf (stderr,
" entry %d (%s)\n",
718 &indexp->pu.ent[k] - sflaglist,
719 ichartosstr (indexp->pu.ent[k].affix, 1));
734 struct dent * ISpellChecker::ispell_lookup (ichar_t *s,
int dotree)
736 register struct dent * dp;
738 char schar[INPUTWORDLEN + MAXAFFIXLEN];
740 dp = &m_hashtbl[hash (s, m_hashsize)];
741 if (ichartostr (schar, s,
sizeof schar, 1))
742 fprintf (stderr, WORD_TOO_LONG (schar));
743 for ( ; dp != NULL; dp = dp->next)
747 if (s1 && s1[0] == schar[0] && strcmp (s1 + 1, schar + 1) == 0)
749 #ifndef NO_CAPITALIZATION_SUPPORT
750 while (dp->flagfield & MOREVARIANTS)
757 void ISpellChecker::alloc_ispell_struct()
762 void ISpellChecker::free_ispell_struct()