1 /* supp.c -- support routines for dungeon */
2 
3 #include <stdio.h>
4 
5 #ifdef unix
6 #include <sys/types.h>
7 #endif
8 
9 #ifdef BSD4_2
10 #include <sys/time.h>
11 #else /* ! BSD4_2 */
12 #include <time.h>
13 #endif /* ! BSD4_2 */
14 
15 #include "funcs.h"
16 
17 /* Define these here to avoid using <stdlib.h> */
18 
19 extern void exit P((int));
20 extern int rand P((void));
21 
22 /* We should have a definition for time_t and struct tm by now.  Make
23  * sure we have definitions for the functions we want to call.
24  * The argument to localtime should be P((const time_t *)), but Ultrix
25  * 4.0 leaves out the const in their prototype.  Damn them.
26  */
27 
28 extern time_t time P((time_t *));
29 extern struct tm *localtime ();
30 
31 /* Terminate the game */
32 
exit_()33 void exit_()
34 {
35     fprintf(stderr, "The game is over.\n");
36     exit(0);
37 }
38 
39 /* Get time in hours, minutes and seconds */
40 
itime_(hrptr,minptr,secptr)41 void itime_(hrptr, minptr, secptr)
42 integer *hrptr;
43 integer *minptr;
44 integer *secptr;
45 {
46 	time_t timebuf;
47 	struct tm *tmptr;
48 
49 	time(&timebuf);
50 	tmptr = localtime(&timebuf);
51 
52 	*hrptr  = tmptr->tm_hour;
53 	*minptr = tmptr->tm_min;
54 	*secptr = tmptr->tm_sec;
55 }
56 
57 /* Random number generator */
58 
rnd_(maxval)59 integer rnd_(maxval)
60 integer maxval;
61 {
62 	return rand() % maxval;
63 }
64 
65 /* Terminal support routines for dungeon */
66 /* By Ian Lance Taylor ian@airs.com or uunet!airs!ian */
67 
68 /* The dungeon game can often output long strings, more than enough
69  * to overwhelm a typical 24 row terminal (I assume that back when
70  * dungeon was written people generally used paper terminals (I know
71  * I did) so this was not a problem).  The functions in this file
72  * provide a very simplistic ``more'' facility.  They are necessarily
73  * somewhat operating system dependent, although I have tried to
74  * minimize it as much as I could.
75  */
76 
77 /* The following macro definitions may be used to control how these
78  * functions work:
79  *
80  *	MORE_NONE	Don't use the more facility at all
81  *	MORE_24		Always assume a 24 row terminal
82  *	MORE_TERMCAP	Use termcap routines to get rows of terminal
83  *	MORE_TERMINFO	Use terminfo routines to get rows of terminal
84  *	MORE_AMOS	Use AMOS monitor calls to get rows of terminal
85  *
86  * If none of these are defined then this will use termcap routines on
87  * unix and AMOS routines on AMOS.
88  */
89 
90 #ifndef MORE_NONE
91 #ifndef MORE_24
92 #ifndef MORE_TERMCAP
93 #ifndef MORE_TERMINFO
94 #ifndef MORE_AMOS
95 #ifdef __AMOS__
96 #define MORE_AMOS
97 #else /* ! __AMOS__ */
98 #ifdef unix
99 #define MORE_TERMCAP
100 #else /* ! unix */
101 #define MORE_NONE
102 #endif /* ! unix */
103 #endif /* ! __AMOS__ */
104 #endif /* ! MORE_AMOS */
105 #endif /* ! MORE_TERMINFO */
106 #endif /* ! MORE_TERMCAP */
107 #endif /* ! MORE_24 */
108 #endif /* ! MORE_NONE */
109 
110 #ifdef MORE_TERMCAP
111 
112 extern char *getenv P((const char *));
113 extern void tgetent P((char *, const char *));
114 extern int tgetnum P((const char *));
115 
116 #else /* ! MORE_TERMCAP */
117 
118 #ifdef MORE_TERMINFO
119 
120 #include <cursesX.h>
121 #include <term.h>
122 extern void setupterm P((const char *, int, int));
123 
124 #else /* ! MORE_TERMINFO */
125 
126 #ifdef MORE_AMOS
127 
128 #include <moncal.h>
129 #include <unistd.h>
130 
131 #endif /* MORE_AMOS */
132 #endif /* ! MORE_TERMINFO */
133 #endif /* ! MORE_TERMCAP */
134 
135 /* Initialize the more waiting facility (determine how many rows the
136  * terminal has).
137  */
138 
139 static integer crows;
140 static integer coutput;
141 
more_init()142 void more_init()
143 {
144 #ifdef MORE_NONE
145 
146     crows = 0;
147 
148 #else /* ! MORE_NONE */
149 #ifdef MORE_24
150 
151     crows = 24;
152 
153 #else /* ! MORE_24 */
154 #ifdef MORE_TERMCAP
155 
156     char buf[2048];
157     char *term;
158 
159     term = getenv("TERM");
160     if (term == NULL)
161 	crows = 0;
162     else {
163 	tgetent(buf, term);
164 	crows = tgetnum("li");
165     }
166 
167 #else /* ! MORE_TERMCAP */
168 #ifdef MORE_TERMINFO
169 
170     int i;
171 
172     setupterm(NULL, 1, &i);
173     if (i != 1)
174         crows = 0;
175     else
176 	crows = lines;
177 
178 #else /* ! MORE_TERMINFO */
179 #ifdef MORE_AMOS
180 
181     trm_char st;
182 
183     if (isatty(fileno(stdin)) == 0)
184 	crows = 0;
185     else {
186 	    trmchr(&st, 0);
187 	    crows = st.row;
188     }
189 
190 #else /* ! MORE_AMOS */
191 
192     This should be impossible
193 
194 #endif /* ! MORE_AMOS */
195 #endif /* ! MORE_TERMINFO */
196 #endif /* ! MORE_TERMCAP */
197 #endif /* ! MORE_24 */
198 #endif /* ! MORE_NONE */
199 }
200 
201 /* The program wants to output a line to the terminal.  If z is not
202  * NULL it is a simple string which is output here; otherwise it
203  * needs some sort of formatting, and is output after this function
204  * returns (if all computers had vprintf I would just it, but they
205  * probably don't).
206  */
207 
more_output(z)208 void more_output(z)
209 const char *z;
210 {
211     if (crows > 0  &&  coutput > crows - 2) {
212 	printf("Press return to continue: ");
213 	(void) fflush(stdout);
214 	while (getchar() != '\n')
215 	    ;
216 	coutput = 0;
217     }
218 
219     if (z != NULL)
220 	printf("%s\n", z);
221 
222     coutput++;
223 }
224 
225 /* The terminal is waiting for input (clear the number of output lines) */
226 
more_input()227 void more_input()
228 {
229     coutput = 0;
230 }
231