210 #include "ispell_checker.h"
213 int makedent P ((
char * lbuf,
int lbuflen,
struct dent * ent));
226 void toutent P ((FILE * outfile,
struct dent * hent,
232 #ifndef ICHAR_IS_CHAR
233 ichar_t * icharcpy P ((ichar_t * out, ichar_t * in));
234 int icharlen P ((ichar_t * str));
235 int icharcmp P ((ichar_t * s1, ichar_t * s2));
236 int icharncmp P ((ichar_t * s1, ichar_t * s2,
int n));
250 #ifndef NO_CAPITALIZATION_SUPPORT
260 ISpellChecker::whatcap (ichar_t *word)
262 register ichar_t * p;
264 for (p = word; *p; p++)
287 if (myupper (word[0]))
289 for (p = word + 1; *p !=
'\0'; p++)
312 int ISpellChecker::addvheader (
struct dent *dp)
314 register struct dent * tdent;
320 tdent =
static_cast<struct dent *
>(malloc(
sizeof (
struct dent)));
323 fprintf (stderr, MAKEDENT_C_NO_WORD_SPACE, dp->word);
327 if (captype (tdent->flagfield) != FOLLOWCASE)
332 tdent->word =
static_cast<char *
>(malloc (static_cast<unsigned int>(strlen(tdent->word)) + 1));
333 if (tdent->word == NULL)
335 fprintf (stderr, MAKEDENT_C_NO_WORD_SPACE, dp->word);
336 free (reinterpret_cast<char *>(tdent));
339 strcpy (tdent->word, dp->word);
343 dp->flagfield &= ~CAPTYPEMASK;
344 dp->flagfield |= (ALLCAPS | MOREVARIANTS);
426 ISpellChecker::upcase (ichar_t *s)
440 ISpellChecker::lowcase (ichar_t *s)
457 ISpellChecker::chupcase (
char *s)
461 is = strtosichar (s, 1);
463 ichartostr (s, is, strlen (s) + 1, 1);
499 ISpellChecker::stringcharlen (
char *bufp,
int canonical)
502 static char * sp[MAXSTRINGCHARS];
503 static int inited = 0;
505 register char * bufcur;
506 register char * stringcur;
507 register int stringno;
508 register int lowstringno;
509 register int highstringno;
516 for (stringno = 0; stringno < MAXSTRINGCHARS; stringno++)
517 sp[stringno] = &hashheader.stringchars[stringno][0];
521 highstringno = m_hashheader.nstrchars - 1;
522 dupwanted = canonical ? 0 : m_defdupchar;
523 while (lowstringno <= highstringno)
525 stringno = (lowstringno + highstringno) >> 1;
527 stringcur = sp[stringno];
529 stringcur = &m_hashheader.stringchars[stringno][0];
535 if (((*bufcur++ ^ *stringcur) & 0x7F) != 0)
537 if (*bufcur++ != *stringcur)
546 if (*stringcur ==
'\0')
548 if (m_hashheader.dupnos[stringno] == dupwanted)
551 m_laststringch = m_hashheader.stringdups[stringno];
553 return stringcur - sp[stringno];
555 return stringcur - &m_hashheader.stringchars[stringno][0];
563 if ((*--bufcur & 0x7F) < (*stringcur & 0x7F))
564 highstringno = stringno - 1;
565 else if ((*bufcur & 0x7F) > (*stringcur & 0x7F))
566 lowstringno = stringno + 1;
568 if (*--bufcur < *stringcur)
569 highstringno = stringno - 1;
570 else if (*bufcur > *stringcur)
571 lowstringno = stringno + 1;
573 else if (dupwanted < m_hashheader.dupnos[stringno])
574 highstringno = stringno - 1;
576 lowstringno = stringno + 1;
578 m_laststringch =
static_cast<unsigned int>(-1);
596 #define isstringch(ptr, canon) (isstringstart (*(ptr)) \
597 && stringcharlen ((ptr), (canon)) > 0)
604 #define l_isstringch(ptr, len, canon) \
605 (isstringstart (*(ptr)) \
606 && (len = stringcharlen ((ptr), (canon))) \
614 #define l1_isstringch(ptr, len, canon) \
616 isstringstart ((unsigned char)(*(ptr))) \
618 stringcharlen ((ptr), (canon))) \
642 ISpellChecker::strtoichar (ichar_t *out,
char *in,
int outlen,
int canonical)
644 register int len = 1;
646 outlen /=
sizeof (ichar_t);
647 for ( ; --outlen > 0 && *in !=
'\0'; in += len)
649 if (l1_isstringch (in, len , canonical)) {
650 *out++ = SET_SIZE + m_laststringch;
652 *out++ = (
unsigned char)( *in );
675 ISpellChecker::ichartostr (
char *out, ichar_t *in,
int outlen,
int canonical)
679 register char * scharp;
681 while (--outlen > 0 && (ch = *in++) != 0)
684 *out++ =
static_cast<char>(ch);
690 for (i = m_hashheader.nstrchars; --i >= 0; )
692 if (m_hashheader.dupnos[i] == m_defdupchar
693 && (static_cast<int>(m_hashheader.stringdups[i])) == ch)
700 scharp = m_hashheader.stringchars[
static_cast<unsigned>(ch)];
701 while ((*out++ = *scharp++) !=
'\0')
719 ISpellChecker::strtosichar (
char *in,
int canonical)
721 static ichar_t out[STRTOSICHAR_SIZE /
sizeof (ichar_t)];
723 if (strtoichar (out, in,
sizeof out, canonical))
724 fprintf (stderr, WORD_TOO_LONG (in));
737 ISpellChecker::ichartosstr (ichar_t *in,
int canonical)
739 static char out[ICHARTOSSTR_SIZE];
741 if (ichartostr (out, in,
sizeof out, canonical))
742 fprintf (stderr, WORD_TOO_LONG (out));
755 ISpellChecker::printichar (
int in)
757 static char out[MAXSTRINGCHARLEN + 1];
761 out[0] =
static_cast<char>(in);
765 strcpy (out, m_hashheader.stringchars[static_cast<unsigned>(in) - SET_SIZE]);
769 #ifndef ICHAR_IS_CHAR
779 icharcpy (ichar_t *out, ichar_t *in)
784 while ((*out++ = *in++) != 0)
797 icharlen (ichar_t * in)
801 for (len = 0; *in++ != 0; len++)
815 icharcmp (ichar_t * s1, ichar_t * s2)
821 return *--s1 - *--s2;
836 icharncmp (ichar_t *s1, ichar_t *s2,
int n)
839 while (--n >= 0 && *s1 != 0)
842 return *--s1 - *--s2;
861 ISpellChecker::findfiletype (
const char *name,
int searchnames,
int *deformatter)
876 for (i = 0; i < m_hashheader.nstrchartype; i++)
878 if (strcmp (name, m_chartypes[i].name) == 0)
880 if (deformatter != NULL)
882 (strcmp (m_chartypes[i].deformatter,
"tex") == 0);
887 for (i = 0; i < m_hashheader.nstrchartype; i++)
889 for (cp = m_chartypes[i].suffixes; *cp !=
'\0'; cp += cplen + 1)
892 if (len >= cplen && strcmp (&name[len - cplen], cp) == 0)
894 if (deformatter != NULL)
896 (strcmp (m_chartypes[i].deformatter,
"tex") == 0);
912 char ISpellChecker::myupper(ichar_t c)
914 if (c < (SET_SIZE + MAXSTRINGCHARS))
915 return m_hashheader.upperchars[c];
920 char ISpellChecker::mylower(ichar_t c)
922 if (c < (SET_SIZE + MAXSTRINGCHARS))
923 return m_hashheader.lowerchars[c];
928 int myspace(ichar_t c)
930 return ((c > 0) && (c < 0x80) && isspace(static_cast<unsigned char>(c)));
933 char ISpellChecker::iswordch(ichar_t c)
935 if (c < (SET_SIZE + MAXSTRINGCHARS))
936 return m_hashheader.wordchars[c];
941 char ISpellChecker::isboundarych(ichar_t c)
943 if (c < (SET_SIZE + MAXSTRINGCHARS))
944 return m_hashheader.boundarychars[c];
949 char ISpellChecker::isstringstart(ichar_t c)
952 return m_hashheader.stringstarts[
static_cast<unsigned char>(c)];
957 ichar_t ISpellChecker::mytolower(ichar_t c)
959 if (c < (SET_SIZE + MAXSTRINGCHARS))
960 return m_hashheader.lowerconv[c];
965 ichar_t ISpellChecker::mytoupper (ichar_t c)
967 if (c < (SET_SIZE + MAXSTRINGCHARS))
968 return m_hashheader.upperconv[c];