|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 4491 (0x118b)
Types: TextFile
Names: »parser.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Tess/parser.c«
/*------------------------------------------------------------*/
/* Adventure Parser
Need to include the adv-world definition file before including this one.
This is because the vocabulary definitions depend on the adventure-world
objects.
*/
/*-------------------BEGIN Added by Dennis Lo 88/10/30 for portable version */
char *strchr (str, ch)
char *str;
char ch;
{
int l = strlen (str);
while (l-- >= 0)
{
if (*str == ch)
return (str);
str++;
}
return ( (char *) 0);
}
char *strlwr (str)
char *str;
{
char *orig = str;
for ( ; *str; str++)
if (*str >= 'A' && *str <= 'Z')
*str = tolower (*str);
return (orig);
}
int intlwr(c)
int c;
{
return (c = (isupper(c)) ? tolower(c) : c);
}
/*----------------------- END of additions for portable version. */
char *trapEOF(s,stream)
char *s;
FILE *stream;
{
if (s == NULL) {
if (feof(stream)) {
prints("(EOF)");
exit(1);
} else {
perror("fgets: ");
exit(1);
}
}
return(s);
}
strip_nl(s)
char *s;
{
auto int i;
i = strlen(s);
if (*(s+i-1)=='\n') *(s+i-1) = '\0'; /* fgets is safer, but imbeds \n */
}
#define eofgets(st, nu, fi) trapEOF(fgets(st,nu,fi), fi)
#define v_sig 4 /* 1st 4 letters of vocab words significant */
#define max_cmd_size 64 /* at most 63 chars per command */
#define max_cmd_len max_cmd_size-1
#define max_word_size 16 /* at most 15 chars per word in input */
#define max_word_len max_word_size-1
typedef char v_cmd [max_cmd_size ];
typedef char v_word [max_word_size ]; /* a vocabulary (normal) word */
typedef struct /* a command */
{
v_cmd
cm; /* command entered */
v_word
verb, /* verb part */
noun, /* noun part */
sh_verb, /* short form of verb and noun for comparison */
sh_noun;
int
vn, /* verb # in vocab */
nn; /* noun # in vocab */
}
CmdRec;
CmdRec cmd; /* global command structure */
/*----------------------------*/
/* Get the verb and the noun from a command of the form "verb noun".
If noun is omitted, a null string returned.
Will handle leading blanks, and too long strings.
*/
ParseCommand( cm, verb, noun )
char *cm;
char *verb;
char *noun;
{
char *p,*q;
*verb='\0'; *noun='\0';
while (*cm && *cm==' ') cm++; /* skip leading blanks in command */
p = strchr( cm, ' ' ); /* find space delimiting verb */
q = strchr( cm, '\0'); /* get last char */
if (!p) p = q; /* if 1 word, set ptr */
(void)strncat( verb, cm, min(p-cm, max_word_len) );
if (*p) /* if >1 word */
{
while (*p && *p==' ') p++; /* skip lead blanks */
(void)strncat( noun, p, min(q-p, max_word_len) );
}
}
/*----------------------------*/
/* Make a string exactly v_sig characters long (plus null), truncating or
blank-padding if necessary
*/
resize_word( s )
char *s;
{
int i;
for (i = strlen(s); i<v_sig; i++ )
*(s+i) = ' ';
*(s+v_sig)='\0';
}
/*----------------------------*/
/* Return a word's vocabulary #, given the vocab array and it's size
*/
int GetWordNum( w, voc )
char *w;
vocab_type *voc;
{
int wn;
v_word sh_word;
(void)strcpy( sh_word, w );
resize_word( sh_word );
for ( wn=0; *voc->name; voc++ )
{
if (!strcmp( sh_word, voc->name ))
{
wn = voc->num;
break;
}
}
return( wn );
}
/*----------------------------*/
/*
*/
int GetVerbNum( verb )
char *verb;
{
return( GetWordNum( verb, v_verb ));
}
int GetNounNum( noun )
char *noun;
{
return( GetWordNum( noun, v_noun ));
}
/*----------------------------*/
/* enter aux. object (e.g. Give XXX to AUX)
*/
int InputNoun( prompt, noun )
char *prompt;
char *noun;
{
int nn;
cprintf( prompt );
strip_nl(eofgets(noun,max_word_size,stdin));
nn = GetNounNum( noun );
resize_word( noun );
return( nn );
}
/*----------------------------*/
/* Parse the command into the verb and noun, then find out the verb & noun #'s
*/
AnalyseCommand( cmd )
CmdRec *cmd;
{
ParseCommand( cmd->cm, cmd->verb, cmd->noun );
(void)strlwr( cmd->verb );
(void)strlwr( cmd->noun );
cmd->vn = GetVerbNum( cmd->verb );
cmd->nn = GetNounNum( cmd->noun );
(void)strcpy(cmd->sh_verb, cmd->verb);
resize_word(cmd->sh_verb);
(void)strcpy(cmd->sh_noun, cmd->noun);
resize_word(cmd->sh_noun);
}