123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- /* supp.c -- support routines for dungeon */
- #include <stdio.h>
- #ifdef unix
- #include <sys/types.h>
- #endif
- #ifdef BSD4_2
- #include <sys/time.h>
- #else /* ! BSD4_2 */
- #include <time.h>
- #endif /* ! BSD4_2 */
- #include "funcs.h"
- /* Define these here to avoid using <stdlib.h> */
- extern void exit P((int));
- extern int rand P((void));
- /* We should have a definition for time_t and struct tm by now. Make
- * sure we have definitions for the functions we want to call.
- * The argument to localtime should be P((const time_t *)), but Ultrix
- * 4.0 leaves out the const in their prototype. Damn them.
- */
- extern time_t time P((time_t *));
- extern struct tm *localtime ();
- /* Terminate the game */
- void exit_()
- {
- fprintf(stderr, "The game is over.\n");
- exit(0);
- }
- /* Get time in hours, minutes and seconds */
- void itime_(hrptr, minptr, secptr)
- integer *hrptr;
- integer *minptr;
- integer *secptr;
- {
- time_t timebuf;
- struct tm *tmptr;
- time(&timebuf);
- tmptr = localtime(&timebuf);
-
- *hrptr = tmptr->tm_hour;
- *minptr = tmptr->tm_min;
- *secptr = tmptr->tm_sec;
- }
- /* Random number generator */
- integer rnd_(maxval)
- integer maxval;
- {
- return rand() % maxval;
- }
- /* Terminal support routines for dungeon */
- /* By Ian Lance Taylor ian@airs.com or uunet!airs!ian */
- /* The dungeon game can often output long strings, more than enough
- * to overwhelm a typical 24 row terminal (I assume that back when
- * dungeon was written people generally used paper terminals (I know
- * I did) so this was not a problem). The functions in this file
- * provide a very simplistic ``more'' facility. They are necessarily
- * somewhat operating system dependent, although I have tried to
- * minimize it as much as I could.
- */
- /* The following macro definitions may be used to control how these
- * functions work:
- *
- * MORE_NONE Don't use the more facility at all
- * MORE_24 Always assume a 24 row terminal
- * MORE_TERMCAP Use termcap routines to get rows of terminal
- * MORE_TERMINFO Use terminfo routines to get rows of terminal
- * MORE_AMOS Use AMOS monitor calls to get rows of terminal
- *
- * If none of these are defined then this will use termcap routines on
- * unix and AMOS routines on AMOS.
- */
- #ifndef MORE_NONE
- #ifndef MORE_24
- #ifndef MORE_TERMCAP
- #ifndef MORE_TERMINFO
- #ifndef MORE_AMOS
- #ifdef __AMOS__
- #define MORE_AMOS
- #else /* ! __AMOS__ */
- #ifdef unix
- #define MORE_TERMCAP
- #else /* ! unix */
- #define MORE_NONE
- #endif /* ! unix */
- #endif /* ! __AMOS__ */
- #endif /* ! MORE_AMOS */
- #endif /* ! MORE_TERMINFO */
- #endif /* ! MORE_TERMCAP */
- #endif /* ! MORE_24 */
- #endif /* ! MORE_NONE */
- #ifdef MORE_TERMCAP
- extern char *getenv P((const char *));
- extern void tgetent P((char *, const char *));
- extern int tgetnum P((const char *));
- #else /* ! MORE_TERMCAP */
- #ifdef MORE_TERMINFO
- #include <cursesX.h>
- #include <term.h>
- extern void setupterm P((const char *, int, int));
- #else /* ! MORE_TERMINFO */
- #ifdef MORE_AMOS
- #include <moncal.h>
- #include <unistd.h>
- #endif /* MORE_AMOS */
- #endif /* ! MORE_TERMINFO */
- #endif /* ! MORE_TERMCAP */
- /* Initialize the more waiting facility (determine how many rows the
- * terminal has).
- */
- static integer crows;
- static integer coutput;
- void more_init()
- {
- #ifdef MORE_NONE
- crows = 0;
- #else /* ! MORE_NONE */
- #ifdef MORE_24
- crows = 24;
- #else /* ! MORE_24 */
- #ifdef MORE_TERMCAP
- char buf[2048];
- char *term;
- term = getenv("TERM");
- if (term == NULL)
- crows = 0;
- else {
- tgetent(buf, term);
- crows = tgetnum("li");
- }
- #else /* ! MORE_TERMCAP */
- #ifdef MORE_TERMINFO
- int i;
- setupterm(NULL, 1, &i);
- if (i != 1)
- crows = 0;
- else
- crows = lines;
- #else /* ! MORE_TERMINFO */
- #ifdef MORE_AMOS
- trm_char st;
- if (isatty(fileno(stdin)) == 0)
- crows = 0;
- else {
- trmchr(&st, 0);
- crows = st.row;
- }
- #else /* ! MORE_AMOS */
- This should be impossible
- #endif /* ! MORE_AMOS */
- #endif /* ! MORE_TERMINFO */
- #endif /* ! MORE_TERMCAP */
- #endif /* ! MORE_24 */
- #endif /* ! MORE_NONE */
- }
- /* The program wants to output a line to the terminal. If z is not
- * NULL it is a simple string which is output here; otherwise it
- * needs some sort of formatting, and is output after this function
- * returns (if all computers had vprintf I would just it, but they
- * probably don't).
- */
- void more_output(z)
- const char *z;
- {
- /* pager code remarked out to allow streamed input and output */
- /*
- if (crows > 0 && coutput > crows - 2) {
- printf("Press return to continue: ");
- (void) fflush(stdout);
- while (getchar() != '\n')
- ;
- coutput = 0;
- }
- */
- if (z != NULL)
- printf("%s\n", z);
- coutput++;
- }
- /* The terminal is waiting for input (clear the number of output lines) */
- void more_input()
- {
- coutput = 0;
- }
|