|
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: 3949 (0xf6d) Types: TextFile Names: »parser.c.orig«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Tess/parser.c.orig«
/*------------------------------------------------------------*/ /* 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); } /*----------------------- END of additions for portable version. */ #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 */ strncat( verb, cm, min(p-cm, max_word_len) ); if (*p) /* if >1 word */ { while (*p && *p==' ') p++; /* skip lead blanks */ 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,i; v_word sh_word; 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 ); gets( noun ); 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 ); strlwr( cmd->verb ); strlwr( cmd->noun ); cmd->vn = GetVerbNum( cmd->verb ); cmd->nn = GetNounNum( cmd->noun ); strcpy( cmd->sh_verb, cmd->verb ); resize_word( cmd->sh_verb ); strcpy( cmd->sh_noun, cmd->noun ); resize_word( cmd->sh_noun ); }