|
|
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 c
Length: 4709 (0x1265)
Types: TextFile
Names: »cvspk.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Crystal/cvspk.c«
/* cvspk.c
*************************************************************************/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "cvmsg.h"
#include "cvobj.h"
#include "cvlocs.h"
#include "cvocab.h"
#define TRUE (1)
#define FALSE (0)
extern struct hint hints[];
extern struct cvocab vtab[];
extern char *rmsg[] ;
extern char *mmsg[] ;
extern struct cmsg ctext[] ;
extern int blklin, mltcmd, samvrb ;
extern void bug();
extern void exit();
char code[] = { 'B'|0x80, 'a'|0x80, 'r'|0x80, 'n'|0x80};
void
encode(msg) register char *msg;
{ register int i;
for (i=0; msg[i]; i++) {
msg[i] ^= code[i & 3];
}
}
void
putcode(msg) register char *msg;
{ register int i;
register char c;
if (*msg & 0x80) {
for (i=0; c=msg[i]; i++) {
putchar(c ^ (code[i & 3]));
}
} else {
(void) fputs(msg,stdout);
}
}
void
rspeak(num) register int num;
{ register char *msg ;
msg = rmsg[num] ;
if (num == 54) blklin = FALSE ;
if (*msg == '*') {
++msg ;
mltcmd = FALSE ;
}
putcode(msg);
}
void
mspeak(num) register int num;
{ (void) fputs(mmsg[num],stdout);
}
void
pspeak(obj,prop)
register struct cvobj *obj;
register int prop;
{ register char *msg;
register int i;
msg = obj->props;
for (i=0; i<prop; ++i) {
while (*(msg++)) {;}
}
putcode(msg);
}
\f
int
yes(quest,agree,refuse) register int quest, agree, refuse;
{
auto char answer[8] ;
int i;
for (;;)
{
if (quest) rspeak(quest);
if (fgets(answer,6,stdin) == NULL) { *answer = '\0'; }
if (!strlen(answer) || answer[strlen(answer)-1] != '\n') {
while (getchar() != '\n')
;
answer[0] = '\n'; /* these are error cases */
}
for (i=0;i<5;++i) {
if (answer[i] == '\n') {answer[i] = '\0'; break;}
else answer[i] = tolower(answer[i]);
}
if (!strcmp("y",answer) || !strcmp("yes",answer))
{ if (agree) rspeak(agree);
return(TRUE);
}
if (!strcmp("no",answer) || !strcmp("n",answer))
{ if (refuse) rspeak(refuse);
return(FALSE);
}
(void) fputs("\nPlease answer the question.\n",stdout);
}
}
\f
static char cchar = '\0';
static char *tmpchr;
/* routine to get the character pointed-to by tmpchr.
* result to cchar
* and mltcmd turned off if space-comma or space-period.
*/
static void
gchar()
{ static char lchar;
lchar = cchar;
cchar = *(tmpchr++) ;
if ((lchar == ' ')
&& ((cchar == '.') || (cchar == ','))
)
{ mltcmd = FALSE ;
cchar = '\0' ;
}
}
/* gather a word, put terminator in cchar. */
static char *
gather()
{ register char *r;
do {gchar();} while (cchar == ' ') ;
if ((cchar == '\0') || (cchar == '.') || (cchar == ',')) return (NULL) ;
r = tmpchr;
for (;;)
{ gchar();
if ((cchar == '\0')
||(cchar == '.')
||(cchar == ',')
||(cchar == ' ') )
{ *(tmpchr-1) = '\0' ;
return(--r);
}
}
}
\f
void
getin()
{ extern char *word1, *word2;
static char ca1[81], ca2[81];
register char *cp2, *cp1;
for (;;mltcmd = FALSE)
{ word1 = word2 = NULL ;
if (mltcmd) {
if ((cchar != '.') && (cchar != ',')) continue ;
samvrb = (cchar == ',') ;
} else {
if (blklin) fputs("\n",stdout);
if (fgets(ca1,81,stdin) == NULL)
{ fputs("\nBut, but, ... okay, goodbye.\n",stdout);
exit(1);
}
for (cp1=ca1; *cp1 != '\0'; ++cp1)
*cp1 = (char) tolower((int)*cp1) ;
if (*(cp1-1) != '\n')
{ puts("\nThat input was too long... no more than 80\
characters, please!");
while (getchar() !='\n')
;
continue; /* this will get us a new input */
}
*(cp1-1) = '\0' ; /* alter the final newline */
mltcmd = TRUE ;
if ( strcmp(ca1,"again")
&& strcmp(ca1,"repeat")
&& strcmp(ca1,"ditto")
&& strcmp(ca1,"\"")
&& strcmp(ca1,"''") )
{ cp1=ca1, cp2=ca2; /* set to preserve new command */
} else {
cp1=ca2, cp2=ca1; /* set to repeat old command */
}
while ((*(cp2++) = *(cp1++)) != '\0'); /* end AFTER the null */
tmpchr = ca1 ;
samvrb = FALSE ;
}
/* now have the input in 'ca1' */
/* and tmpchr points to the next char to see */
if ((word1 = gather()) == NULL) continue ;
if (cchar == ' ') word2 = gather();
return ;
} /* end of for (implied mltcmd = FALSE) */
}
\f
int
vocab(word,sect) register char *word;
int sect;
{ register int matched = 0, len;
register struct cvocab *curv = vtab, *likely = NULL ;
len = strlen(word);
if (sect >= 0)
{ for ( ; curv->cvcode != 0; ++curv)
{ if (curv->cvcode / 1000 == sect) break ;
}
}
for ( ; curv->cvcode != 0; ++curv)
{ if ((sect >= 0) && ((curv->cvcode / 1000) > sect)) break ;
;
if (!strncmp(word, curv->cvword, len))
{ ++matched;
likely = curv ;
if (strlen(curv->cvword) == len) return(curv->cvcode) ;
}
}
if (matched == 1) return(likely->cvcode) ;
else return(-1);
}