|
|
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 m
Length: 5656 (0x1618)
Types: TextFile
Names: »main.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Trek73/src/main.c«
#ident "@(#) TREK73 $Header: main.c,v 1.1 87/10/09 11:08:01 okamoto Exp $"
/*
* $Source: /ccc/okamoto/src/trek/src/RCS/main.c,v $
*
* $Header: main.c,v 1.1 87/10/09 11:08:01 okamoto Exp $
*
* $Log: main.c,v $
* Revision 1.1 87/10/09 11:08:01 11:08:01 okamoto (Jeff Okamoto)
* Initial revision
*
*/
/*
* TREK73: main.c
*
* Originally written (in HP-2000 BASIC) by
* William K. Char, Perry Lee, and Dan Gee
*
* Rewritten in C by
* Dave Pare (sdcsvax!sdamos!mr-frog)
* (mr-frog@amos.ling.ucsd.edu)
* and
* Christopher Williams (ucbvax!ucbmerlin!williams)
* (williams@merlin.berkeley.edu)
*
* Corrected, Completed, and Enhanced by
* Jeff Okamoto (hpccc!okamoto)
* (hpccc!okamoto@hplabs.hp.com)
* Peter Yee (ucbvax!yee)
* (yee@ucbarpa.berkeley.edu)
* Matt Dillon (ucbvax!dillon)
* (dillon@ucbvax.berkeley.edu)
* Dave Sharnoff (ucbvax!ucbcory!muir)
* (muir@cogsci.berkeley.edu)
* Joel Duisman
* and
* Roger J. Noe (uniq!rjnoe)
* (ihnp4!uniq!rjnoe@berkeley.edu)
*
* Main Loop
*
* main, alarmtrap, quitgame, buffering
*
*/
#include "externs.h"
#include <signal.h>
#include <setjmp.h>
#include <ctype.h>
static jmp_buf jumpbuf;
main(argc, argv, envp)
int argc;
char *argv[];
char *envp[];
{
int alarmtrap();
int quitgame();
if (buffering(stdout) < 0)
perror("cannot fstat stdout");
(void) signal(SIGALRM, alarmtrap);
(void) signal(SIGINT, quitgame);
srandom(time(0));
time_delay = DEFAULT_TIME;
set_save();
options = getenv("TREK73OPTS");
if (options != NULL)
parse_opts(options);
get_comlineopts(argc, argv);
if (restart && savefile[0] != '\0') {
restore(savefile, envp); /* Will not return */
exit(1);
}
name_crew();
init_ships();
(void) mission();
(void) alert();
playit();
/*NOTREACHED*/
}
/*
* Main loop
*/
playit()
{
struct cmd *scancmd();
int alarmtrap();
int quitgame();
register struct ship *sp;
#ifndef PARSER
char buf1[30];
#endif PARSER
struct cmd *cp;
int loop;
char *ch;
(void) setjmp(jumpbuf);
sp = shiplist[0];
if (!(is_dead(sp, S_DEAD))) {
next:
for (loop = 0; loop < HIGHSHUTUP; loop++)
shutup[loop] = 0;
fflush(stdin);
printf("\n%s: Code [1-%d] ", captain, high_command);
fflush(stdout);
(void) alarm((unsigned) time_delay);
#ifdef PARSER
(void) Gets(Input, sizeof(Input));
if (Input[0] != NULL) {
#else
(void) Gets(buf1, sizeof(buf1));
if (buf1[0] != NULL) {
#endif PARSER
(void) alarm(0);
#ifdef PARSER
Inptr = Input;
parsed[0] = '\0';
ch = Inptr;
while (isspace(*ch))
ch++;
if (isalpha(*ch))
yyparse();
else
strcpy(parsed, Input);
#endif PARSER
#ifdef PARSER
cp = scancmd(parsed);
#else
cp = scancmd(buf1);
#endif PARSER
if (cp != NULL) {
(*cp->routine)(sp);
if (cp->turns == FREE)
goto next;
} else
printf("\n%s: %s, I am unable to interpret your last utterance.\n", science, title);
} else
(void) alarm(0);
}
ch = ch; /* LINT */
alarmtrap(0);
/* This point is never reached since alarmtrap() always concludes
with a longjmp() back to the setjmp() above the next: label */
/*NOTREACHED*/
}
alarmtrap(sig)
int sig;
{
register int i;
if (sig) {
puts("\n** TIME **");
(void) signal(sig, alarmtrap);
stdin->_cnt = 0;
}
for (i = 1; i <= shipnum; i++)
shiplist[i]->strategy(shiplist[i]);
if (!(is_dead(shiplist[0], S_DEAD)))
printf("\n");
(void) move_ships();
(void) check_targets();
(void) misc_timers();
(void) disposition();
longjmp(jumpbuf, 1);
}
quitgame()
{
char answer[20];
unsigned timeleft;
timeleft = alarm(0);
(void) signal(SIGINT, SIG_IGN);
puts("\n\nDo you really wish to stop now? Answer yes or no:");
(void) Gets(answer, sizeof(answer));
if(answer[0] == NULL || answer[0] == 'y' || answer[0] == 'Y')
exit(0);
(void) signal(SIGINT, quitgame);
if(timeleft)
(void) alarm((unsigned)timeleft);
return;
}
/* buffering: Determine whether or not stream is to be buffered. If
it's a character-special device, any buffering in effect will remain.
If it's not a character-special device, then stream will be
unbuffered. There are many ways to decide what to do here. One
would have been to make it unbuffered if and only if
!isatty(fileno(stream)). This is usually implemented as a single
ioctl() system call which returns true if the ioctl() succeeds, false
if it fails. But there are ways it could fail and still be a tty.
Then there's also examination of stream->_flag. UNIX is supposed to
make any stream attached to a terminal line-buffered and all others
fully buffered by default. But sometimes even when isatty()
succeeds, stream->_flag indicates _IOFBF, not _IOLBF. And even if it
is determined that the stream should be line buffered, setvbuf(3S)
doesn't work right (in UNIX 5.2) to make it _IOLBF. So about the
only choice is to do a straightforward fstat() and ascertain
definitely to what the stream is attached. Then go with old reliable
setbuf(stream, NULL) to make it _IONBF. The whole reason this is
being done is because the user may be using a pipefitting program to
collect a "transcript" of a session (e.g. tee(1)), or redirecting to
a regular file and then keeping a tail(1) going forever to actually
play the game. This assures that the output will keep pace with the
execution with no sacrifice in efficiency for normal execution. [RJN]
*/
#include <sys/types.h>
#include <sys/stat.h>
int
buffering(stream)
FILE *stream;
{
struct stat st;
if (fstat(fileno(stream), &st) < 0)
return -1;
if ((st.st_mode & S_IFMT) != S_IFCHR)
setbuf(stream, NULL);
return 0;
}