antoine-source/appleworksgs/Spell/Src/DISPUNF.C
2023-03-04 03:45:20 +01:00

1 line
3.8 KiB
C
Executable File

/***********************************************************************\
Filename: dispunf.c
\***********************************************************************/
#include <string.h>
#include "thes.h"
#include "thesmisc.h"
#define SCR_LM 13
/* strings to indicate part of speech */
char *Posstr[] =
{
"adj",
"adj",
"adv",
"conj",
"interj",
"noun",
"noun",
"noun",
"prep",
"pron",
"verb",
"verb",
"verb",
};
int Nposstr = sizeof(Posstr) / sizeof(Posstr[0]);
static char *Relstr[32] =
{
NULL, "past/past participle",
NULL, "past",
NULL, "past participle",
NULL, "plural",
NULL, "adjective",
"verb", "comparative",
NULL, "superlative",
NULL, "noun",
"verb", "adverb",
"adjective","noun",
"adjective","present 3rd person sing.",
NULL, "present participle",
NULL, "past/past participle",
NULL, "plural",
NULL, "plural or second person singular",
NULL, "first person singular",
};
/* This function will translate an encoded meaning string to a string
that displays details of unflection (if any) along with the meaning
cores. */
dispunf(query, unfstr, meanno, def)
char *query;
char *unfstr;
int meanno;
char *def;
{
char *printpos();
char *unfstrptr;
int rel;
int pos;
int poschange;
char *unfquery;
unfstrptr = unfstr;
pos = (int) *def++ - 1;
/* rel indexes into the array Relstr[] to return the string
that is descriptive of the unflection. */
if (!(rel = (int) *def++))
{
unfstrptr = printpos(unfstrptr,pos);
while (unfstrptr - unfstr < SCR_LM)
*unfstrptr++ = ' ';
strecpy(unfstrptr, def);
return;
}
def = strchr(unfquery = def, 0) + 1;
poschange = FALSE;
/* Determine if the unflection involved a change in the part of
speech. */
switch (pos)
{
case NOUN:
case SPNOUN:
poschange = (rel != SI_PL && rel != SP_PL);
break;
case VERB:
case VERBSP:
poschange = (rel == VB_NN || rel == VB_AJ);
break;
case ADJ:
case ADJSP:
poschange = !(rel == RE_CM || rel == RE_SU);
break;
default:
break;
}
if (!poschange)
{
unfstrptr = printpos(unfstrptr, pos);
while (unfstrptr - unfstr < SCR_LM)
*unfstrptr++ = ' ';
if (rel == SI_PL && (pos == VERB || pos == VERBSP))
{
unfstrptr = strecpy(unfstrptr, (char *) Relstr[TP_SI]);
unfstrptr = strecpy(unfstrptr, " of ");
unfstrptr = strecpy(unfstrptr, unfquery);
}
else
{
unfstrptr = strecpy(unfstrptr, (char *) Relstr[rel]);
if (strcmp(query, unfquery) != 0 || rel != SI_PL && rel != SP_PL)
{
unfstrptr = strecpy(unfstrptr, " of ");
unfstrptr = strecpy(unfstrptr, unfquery);
}
}
}
else
{
unfstrptr = strecpy(unfstrptr, (char *)Relstr[rel]);
while (unfstrptr - unfstr < SCR_LM)
*unfstrptr++ = ' ';
unfstrptr = strecpy(unfstrptr, "of ");
unfstrptr = strecpy(unfstrptr, unfquery);
unfstrptr = strecpy(unfstrptr, ", (");
unfstrptr = strecpy(unfstrptr,(char *) Posstr[pos]);
*unfstrptr++ = ')';
*unfstrptr++ = ' ';
}
*unfstrptr++ = ':';
*unfstrptr++ = ' ';
unfstrptr = strecpy(unfstrptr, def);
}
/* Return the string that describes the part of speech corresponding to
pos. */
static char *printpos(str, pos)
char *str;
int pos;
{
if (pos < 0 || pos >= Nposstr)
return (strecpy(str, "unknown part of speech "));
else
return (strecpy(str, (char *)Posstr[pos]));
}