xref: /minix3/games/rogue/message.c (revision e3b78ef14fd58bd4477a5899732f50e4798b9dff)
1*e3b78ef1SRobin Karlsson /*	$NetBSD: message.c,v 1.14 2009/08/12 08:44:45 dholland Exp $	*/
2*e3b78ef1SRobin Karlsson 
3*e3b78ef1SRobin Karlsson /*
4*e3b78ef1SRobin Karlsson  * Copyright (c) 1988, 1993
5*e3b78ef1SRobin Karlsson  *	The Regents of the University of California.  All rights reserved.
6*e3b78ef1SRobin Karlsson  *
7*e3b78ef1SRobin Karlsson  * This code is derived from software contributed to Berkeley by
8*e3b78ef1SRobin Karlsson  * Timothy C. Stoehr.
9*e3b78ef1SRobin Karlsson  *
10*e3b78ef1SRobin Karlsson  * Redistribution and use in source and binary forms, with or without
11*e3b78ef1SRobin Karlsson  * modification, are permitted provided that the following conditions
12*e3b78ef1SRobin Karlsson  * are met:
13*e3b78ef1SRobin Karlsson  * 1. Redistributions of source code must retain the above copyright
14*e3b78ef1SRobin Karlsson  *    notice, this list of conditions and the following disclaimer.
15*e3b78ef1SRobin Karlsson  * 2. Redistributions in binary form must reproduce the above copyright
16*e3b78ef1SRobin Karlsson  *    notice, this list of conditions and the following disclaimer in the
17*e3b78ef1SRobin Karlsson  *    documentation and/or other materials provided with the distribution.
18*e3b78ef1SRobin Karlsson  * 3. Neither the name of the University nor the names of its contributors
19*e3b78ef1SRobin Karlsson  *    may be used to endorse or promote products derived from this software
20*e3b78ef1SRobin Karlsson  *    without specific prior written permission.
21*e3b78ef1SRobin Karlsson  *
22*e3b78ef1SRobin Karlsson  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23*e3b78ef1SRobin Karlsson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24*e3b78ef1SRobin Karlsson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25*e3b78ef1SRobin Karlsson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26*e3b78ef1SRobin Karlsson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27*e3b78ef1SRobin Karlsson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28*e3b78ef1SRobin Karlsson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29*e3b78ef1SRobin Karlsson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30*e3b78ef1SRobin Karlsson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31*e3b78ef1SRobin Karlsson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32*e3b78ef1SRobin Karlsson  * SUCH DAMAGE.
33*e3b78ef1SRobin Karlsson  */
34*e3b78ef1SRobin Karlsson 
35*e3b78ef1SRobin Karlsson #include <sys/cdefs.h>
36*e3b78ef1SRobin Karlsson #ifndef lint
37*e3b78ef1SRobin Karlsson #if 0
38*e3b78ef1SRobin Karlsson static char sccsid[] = "@(#)message.c	8.1 (Berkeley) 5/31/93";
39*e3b78ef1SRobin Karlsson #else
40*e3b78ef1SRobin Karlsson __RCSID("$NetBSD: message.c,v 1.14 2009/08/12 08:44:45 dholland Exp $");
41*e3b78ef1SRobin Karlsson #endif
42*e3b78ef1SRobin Karlsson #endif /* not lint */
43*e3b78ef1SRobin Karlsson 
44*e3b78ef1SRobin Karlsson /*
45*e3b78ef1SRobin Karlsson  * message.c
46*e3b78ef1SRobin Karlsson  *
47*e3b78ef1SRobin Karlsson  * This source herein may be modified and/or distributed by anybody who
48*e3b78ef1SRobin Karlsson  * so desires, with the following restrictions:
49*e3b78ef1SRobin Karlsson  *    1.)  No portion of this notice shall be removed.
50*e3b78ef1SRobin Karlsson  *    2.)  Credit shall not be taken for the creation of this source.
51*e3b78ef1SRobin Karlsson  *    3.)  This code is not to be traded, sold, or used for personal
52*e3b78ef1SRobin Karlsson  *         gain or profit.
53*e3b78ef1SRobin Karlsson  *
54*e3b78ef1SRobin Karlsson  */
55*e3b78ef1SRobin Karlsson 
56*e3b78ef1SRobin Karlsson #include <signal.h>
57*e3b78ef1SRobin Karlsson #include <termios.h>
58*e3b78ef1SRobin Karlsson #include <stdarg.h>
59*e3b78ef1SRobin Karlsson #include "rogue.h"
60*e3b78ef1SRobin Karlsson #include "pathnames.h"
61*e3b78ef1SRobin Karlsson 
62*e3b78ef1SRobin Karlsson static char msgs[NMESSAGES][DCOLS] = {"", "", "", "", ""};
63*e3b78ef1SRobin Karlsson static short msg_col = 0, imsg = -1;
64*e3b78ef1SRobin Karlsson static boolean rmsg = 0;
65*e3b78ef1SRobin Karlsson 
66*e3b78ef1SRobin Karlsson boolean msg_cleared = 1;
67*e3b78ef1SRobin Karlsson char hunger_str[HUNGER_STR_LEN] = "";
68*e3b78ef1SRobin Karlsson const char *more = "-more-";
69*e3b78ef1SRobin Karlsson 
70*e3b78ef1SRobin Karlsson static void save_screen(void);
71*e3b78ef1SRobin Karlsson 
72*e3b78ef1SRobin Karlsson static
73*e3b78ef1SRobin Karlsson void
message(const char * msg,boolean intrpt)74*e3b78ef1SRobin Karlsson message(const char *msg, boolean intrpt)
75*e3b78ef1SRobin Karlsson {
76*e3b78ef1SRobin Karlsson 	cant_int = 1;
77*e3b78ef1SRobin Karlsson 
78*e3b78ef1SRobin Karlsson 	if (!save_is_interactive) {
79*e3b78ef1SRobin Karlsson 		return;
80*e3b78ef1SRobin Karlsson 	}
81*e3b78ef1SRobin Karlsson 	if (intrpt) {
82*e3b78ef1SRobin Karlsson 		interrupted = 1;
83*e3b78ef1SRobin Karlsson 		md_slurp();
84*e3b78ef1SRobin Karlsson 	}
85*e3b78ef1SRobin Karlsson 
86*e3b78ef1SRobin Karlsson 	if (!msg_cleared) {
87*e3b78ef1SRobin Karlsson 		mvaddstr(MIN_ROW-1, msg_col, more);
88*e3b78ef1SRobin Karlsson 		refresh();
89*e3b78ef1SRobin Karlsson 		wait_for_ack();
90*e3b78ef1SRobin Karlsson 		check_message();
91*e3b78ef1SRobin Karlsson 	}
92*e3b78ef1SRobin Karlsson 	if (!rmsg) {
93*e3b78ef1SRobin Karlsson 		imsg = (imsg + 1) % NMESSAGES;
94*e3b78ef1SRobin Karlsson 		(void)strlcpy(msgs[imsg], msg, sizeof(msgs[imsg]));
95*e3b78ef1SRobin Karlsson 	}
96*e3b78ef1SRobin Karlsson 	mvaddstr(MIN_ROW-1, 0, msg);
97*e3b78ef1SRobin Karlsson 	addch(' ');
98*e3b78ef1SRobin Karlsson 	refresh();
99*e3b78ef1SRobin Karlsson 	msg_cleared = 0;
100*e3b78ef1SRobin Karlsson 	msg_col = strlen(msg);
101*e3b78ef1SRobin Karlsson 
102*e3b78ef1SRobin Karlsson 	cant_int = 0;
103*e3b78ef1SRobin Karlsson 
104*e3b78ef1SRobin Karlsson 	if (did_int) {
105*e3b78ef1SRobin Karlsson 		did_int = 0;
106*e3b78ef1SRobin Karlsson 		onintr(0);
107*e3b78ef1SRobin Karlsson 	}
108*e3b78ef1SRobin Karlsson }
109*e3b78ef1SRobin Karlsson 
110*e3b78ef1SRobin Karlsson void
messagef(boolean intrpt,const char * fmt,...)111*e3b78ef1SRobin Karlsson messagef(boolean intrpt, const char *fmt, ...)
112*e3b78ef1SRobin Karlsson {
113*e3b78ef1SRobin Karlsson 	va_list ap;
114*e3b78ef1SRobin Karlsson 	char buf[DCOLS];
115*e3b78ef1SRobin Karlsson 
116*e3b78ef1SRobin Karlsson 	va_start(ap, fmt);
117*e3b78ef1SRobin Karlsson 	vsnprintf(buf, sizeof(buf), fmt, ap);
118*e3b78ef1SRobin Karlsson 	va_end(ap);
119*e3b78ef1SRobin Karlsson 
120*e3b78ef1SRobin Karlsson 	message(buf, intrpt);
121*e3b78ef1SRobin Karlsson }
122*e3b78ef1SRobin Karlsson 
123*e3b78ef1SRobin Karlsson void
remessage(short c)124*e3b78ef1SRobin Karlsson remessage(short c)
125*e3b78ef1SRobin Karlsson {
126*e3b78ef1SRobin Karlsson 	if (imsg != -1) {
127*e3b78ef1SRobin Karlsson 		check_message();
128*e3b78ef1SRobin Karlsson 		rmsg = 1;
129*e3b78ef1SRobin Karlsson 		while (c > imsg) {
130*e3b78ef1SRobin Karlsson 			c -= NMESSAGES;
131*e3b78ef1SRobin Karlsson 		}
132*e3b78ef1SRobin Karlsson 		message(msgs[((imsg - c) % NMESSAGES)], 0);
133*e3b78ef1SRobin Karlsson 		rmsg = 0;
134*e3b78ef1SRobin Karlsson 		move(rogue.row, rogue.col);
135*e3b78ef1SRobin Karlsson 		refresh();
136*e3b78ef1SRobin Karlsson 	}
137*e3b78ef1SRobin Karlsson }
138*e3b78ef1SRobin Karlsson 
139*e3b78ef1SRobin Karlsson void
check_message(void)140*e3b78ef1SRobin Karlsson check_message(void)
141*e3b78ef1SRobin Karlsson {
142*e3b78ef1SRobin Karlsson 	if (msg_cleared) {
143*e3b78ef1SRobin Karlsson 		return;
144*e3b78ef1SRobin Karlsson 	}
145*e3b78ef1SRobin Karlsson 	move(MIN_ROW-1, 0);
146*e3b78ef1SRobin Karlsson 	clrtoeol();
147*e3b78ef1SRobin Karlsson 	refresh();
148*e3b78ef1SRobin Karlsson 	msg_cleared = 1;
149*e3b78ef1SRobin Karlsson }
150*e3b78ef1SRobin Karlsson 
151*e3b78ef1SRobin Karlsson int
get_input_line(const char * prompt,const char * insert,char * buf,size_t buflen,const char * if_cancelled,boolean add_blank,boolean do_echo)152*e3b78ef1SRobin Karlsson get_input_line(const char *prompt, const char *insert,
153*e3b78ef1SRobin Karlsson 	       char *buf, size_t buflen,
154*e3b78ef1SRobin Karlsson 	       const char *if_cancelled,
155*e3b78ef1SRobin Karlsson 	       boolean add_blank, boolean do_echo)
156*e3b78ef1SRobin Karlsson {
157*e3b78ef1SRobin Karlsson 	short ch;
158*e3b78ef1SRobin Karlsson 	size_t i = 0, n;
159*e3b78ef1SRobin Karlsson 
160*e3b78ef1SRobin Karlsson 	message(prompt, 0);
161*e3b78ef1SRobin Karlsson 	n = strlen(prompt);
162*e3b78ef1SRobin Karlsson 
163*e3b78ef1SRobin Karlsson 	if (insert[0]) {
164*e3b78ef1SRobin Karlsson 		mvaddstr(0, n + 1, insert);
165*e3b78ef1SRobin Karlsson 		(void)strlcpy(buf, insert, buflen);
166*e3b78ef1SRobin Karlsson 		i = strlen(buf);
167*e3b78ef1SRobin Karlsson 		move(0, (n + i + 1));
168*e3b78ef1SRobin Karlsson 		refresh();
169*e3b78ef1SRobin Karlsson 	}
170*e3b78ef1SRobin Karlsson 
171*e3b78ef1SRobin Karlsson 	while (((ch = rgetchar()) != '\r') && (ch != '\n') && (ch != CANCEL)) {
172*e3b78ef1SRobin Karlsson 		if ((ch >= ' ') && (ch <= '~') && (i < buflen-2)) {
173*e3b78ef1SRobin Karlsson 			if ((ch != ' ') || (i > 0)) {
174*e3b78ef1SRobin Karlsson 				buf[i++] = ch;
175*e3b78ef1SRobin Karlsson 				if (do_echo) {
176*e3b78ef1SRobin Karlsson 					addch(ch);
177*e3b78ef1SRobin Karlsson 				}
178*e3b78ef1SRobin Karlsson 			}
179*e3b78ef1SRobin Karlsson 		}
180*e3b78ef1SRobin Karlsson 		if ((ch == '\b') && (i > 0)) {
181*e3b78ef1SRobin Karlsson 			if (do_echo) {
182*e3b78ef1SRobin Karlsson 				mvaddch(0, i + n, ' ');
183*e3b78ef1SRobin Karlsson 				move(MIN_ROW-1, i+n);
184*e3b78ef1SRobin Karlsson 			}
185*e3b78ef1SRobin Karlsson 			i--;
186*e3b78ef1SRobin Karlsson 		}
187*e3b78ef1SRobin Karlsson 		refresh();
188*e3b78ef1SRobin Karlsson 	}
189*e3b78ef1SRobin Karlsson 	check_message();
190*e3b78ef1SRobin Karlsson 	if (add_blank) {
191*e3b78ef1SRobin Karlsson 		buf[i++] = ' ';
192*e3b78ef1SRobin Karlsson 	} else {
193*e3b78ef1SRobin Karlsson 		while ((i > 0) && (buf[i-1] == ' ')) {
194*e3b78ef1SRobin Karlsson 			i--;
195*e3b78ef1SRobin Karlsson 		}
196*e3b78ef1SRobin Karlsson 	}
197*e3b78ef1SRobin Karlsson 
198*e3b78ef1SRobin Karlsson 	buf[i] = 0;
199*e3b78ef1SRobin Karlsson 
200*e3b78ef1SRobin Karlsson 	if ((ch == CANCEL) || (i == 0) || ((i == 1) && add_blank)) {
201*e3b78ef1SRobin Karlsson 		if (if_cancelled) {
202*e3b78ef1SRobin Karlsson 			message(if_cancelled, 0);
203*e3b78ef1SRobin Karlsson 		}
204*e3b78ef1SRobin Karlsson 		return(0);
205*e3b78ef1SRobin Karlsson 	}
206*e3b78ef1SRobin Karlsson 	return(i);
207*e3b78ef1SRobin Karlsson }
208*e3b78ef1SRobin Karlsson 
209*e3b78ef1SRobin Karlsson int
rgetchar(void)210*e3b78ef1SRobin Karlsson rgetchar(void)
211*e3b78ef1SRobin Karlsson {
212*e3b78ef1SRobin Karlsson 	int ch;
213*e3b78ef1SRobin Karlsson 
214*e3b78ef1SRobin Karlsson 	for(;;) {
215*e3b78ef1SRobin Karlsson 		ch = getchar();
216*e3b78ef1SRobin Karlsson 
217*e3b78ef1SRobin Karlsson 		switch(ch) {
218*e3b78ef1SRobin Karlsson 		case '\022': /* ^R */
219*e3b78ef1SRobin Karlsson 			wrefresh(curscr);
220*e3b78ef1SRobin Karlsson 			break;
221*e3b78ef1SRobin Karlsson #ifdef UNIX_BSD4_2
222*e3b78ef1SRobin Karlsson 		case '\032': /* ^Z */
223*e3b78ef1SRobin Karlsson 			printf("%s", CL);
224*e3b78ef1SRobin Karlsson 			fflush(stdout);
225*e3b78ef1SRobin Karlsson 			tstp();
226*e3b78ef1SRobin Karlsson 			break;
227*e3b78ef1SRobin Karlsson #endif
228*e3b78ef1SRobin Karlsson 		case '&':
229*e3b78ef1SRobin Karlsson 			save_screen();
230*e3b78ef1SRobin Karlsson 			break;
231*e3b78ef1SRobin Karlsson 		default:
232*e3b78ef1SRobin Karlsson 			return(ch);
233*e3b78ef1SRobin Karlsson 		}
234*e3b78ef1SRobin Karlsson 	}
235*e3b78ef1SRobin Karlsson }
236*e3b78ef1SRobin Karlsson 
237*e3b78ef1SRobin Karlsson /*
238*e3b78ef1SRobin Karlsson Level: 99 Gold: 999999 Hp: 999(999) Str: 99(99) Arm: 99 Exp: 21/10000000 Hungry
239*e3b78ef1SRobin Karlsson 0    5    1    5    2    5    3    5    4    5    5    5    6    5    7    5
240*e3b78ef1SRobin Karlsson */
241*e3b78ef1SRobin Karlsson 
242*e3b78ef1SRobin Karlsson void
print_stats(int stat_mask)243*e3b78ef1SRobin Karlsson print_stats(int stat_mask)
244*e3b78ef1SRobin Karlsson {
245*e3b78ef1SRobin Karlsson 	char buf[16];
246*e3b78ef1SRobin Karlsson 	boolean label;
247*e3b78ef1SRobin Karlsson 	int row = DROWS - 1;
248*e3b78ef1SRobin Karlsson 
249*e3b78ef1SRobin Karlsson 	label = (stat_mask & STAT_LABEL) ? 1 : 0;
250*e3b78ef1SRobin Karlsson 
251*e3b78ef1SRobin Karlsson 	if (stat_mask & STAT_LEVEL) {
252*e3b78ef1SRobin Karlsson 		if (label) {
253*e3b78ef1SRobin Karlsson 			mvaddstr(row, 0, "Level: ");
254*e3b78ef1SRobin Karlsson 		}
255*e3b78ef1SRobin Karlsson 		/* max level taken care of in make_level() */
256*e3b78ef1SRobin Karlsson 		mvprintw(row, 7, "%-2d", cur_level);
257*e3b78ef1SRobin Karlsson 	}
258*e3b78ef1SRobin Karlsson 	if (stat_mask & STAT_GOLD) {
259*e3b78ef1SRobin Karlsson 		if (label) {
260*e3b78ef1SRobin Karlsson 			mvaddstr(row, 10, "Gold: ");
261*e3b78ef1SRobin Karlsson 		}
262*e3b78ef1SRobin Karlsson 		if (rogue.gold > MAX_GOLD) {
263*e3b78ef1SRobin Karlsson 			rogue.gold = MAX_GOLD;
264*e3b78ef1SRobin Karlsson 		}
265*e3b78ef1SRobin Karlsson 		mvprintw(row, 16, "%-6ld", rogue.gold);
266*e3b78ef1SRobin Karlsson 	}
267*e3b78ef1SRobin Karlsson 	if (stat_mask & STAT_HP) {
268*e3b78ef1SRobin Karlsson 		if (label) {
269*e3b78ef1SRobin Karlsson 			mvaddstr(row, 23, "Hp: ");
270*e3b78ef1SRobin Karlsson 		}
271*e3b78ef1SRobin Karlsson 		if (rogue.hp_max > MAX_HP) {
272*e3b78ef1SRobin Karlsson 			rogue.hp_current -= (rogue.hp_max - MAX_HP);
273*e3b78ef1SRobin Karlsson 			rogue.hp_max = MAX_HP;
274*e3b78ef1SRobin Karlsson 		}
275*e3b78ef1SRobin Karlsson 		snprintf(buf, sizeof(buf), "%d(%d)",
276*e3b78ef1SRobin Karlsson 			rogue.hp_current, rogue.hp_max);
277*e3b78ef1SRobin Karlsson 		mvprintw(row, 27, "%-8s", buf);
278*e3b78ef1SRobin Karlsson 	}
279*e3b78ef1SRobin Karlsson 	if (stat_mask & STAT_STRENGTH) {
280*e3b78ef1SRobin Karlsson 		if (label) {
281*e3b78ef1SRobin Karlsson 			mvaddstr(row, 36, "Str: ");
282*e3b78ef1SRobin Karlsson 		}
283*e3b78ef1SRobin Karlsson 		if (rogue.str_max > MAX_STRENGTH) {
284*e3b78ef1SRobin Karlsson 			rogue.str_current -= (rogue.str_max - MAX_STRENGTH);
285*e3b78ef1SRobin Karlsson 			rogue.str_max = MAX_STRENGTH;
286*e3b78ef1SRobin Karlsson 		}
287*e3b78ef1SRobin Karlsson 		snprintf(buf, sizeof(buf), "%d(%d)",
288*e3b78ef1SRobin Karlsson 			(rogue.str_current + add_strength), rogue.str_max);
289*e3b78ef1SRobin Karlsson 		mvprintw(row, 41, "%-6s", buf);
290*e3b78ef1SRobin Karlsson 	}
291*e3b78ef1SRobin Karlsson 	if (stat_mask & STAT_ARMOR) {
292*e3b78ef1SRobin Karlsson 		if (label) {
293*e3b78ef1SRobin Karlsson 			mvaddstr(row, 48, "Arm: ");
294*e3b78ef1SRobin Karlsson 		}
295*e3b78ef1SRobin Karlsson 		if (rogue.armor && (rogue.armor->d_enchant > MAX_ARMOR)) {
296*e3b78ef1SRobin Karlsson 			rogue.armor->d_enchant = MAX_ARMOR;
297*e3b78ef1SRobin Karlsson 		}
298*e3b78ef1SRobin Karlsson 		mvprintw(row, 53, "%-2d", get_armor_class(rogue.armor));
299*e3b78ef1SRobin Karlsson 	}
300*e3b78ef1SRobin Karlsson 	if (stat_mask & STAT_EXP) {
301*e3b78ef1SRobin Karlsson 		if (label) {
302*e3b78ef1SRobin Karlsson 			mvaddstr(row, 56, "Exp: ");
303*e3b78ef1SRobin Karlsson 		}
304*e3b78ef1SRobin Karlsson 		if (rogue.exp_points > MAX_EXP) {
305*e3b78ef1SRobin Karlsson 			rogue.exp_points = MAX_EXP;
306*e3b78ef1SRobin Karlsson 		}
307*e3b78ef1SRobin Karlsson 		if (rogue.exp > MAX_EXP_LEVEL) {
308*e3b78ef1SRobin Karlsson 			rogue.exp = MAX_EXP_LEVEL;
309*e3b78ef1SRobin Karlsson 		}
310*e3b78ef1SRobin Karlsson 		snprintf(buf, sizeof(buf), "%d/%ld",
311*e3b78ef1SRobin Karlsson 			rogue.exp, rogue.exp_points);
312*e3b78ef1SRobin Karlsson 		mvprintw(row, 61, "%-11s", buf);
313*e3b78ef1SRobin Karlsson 	}
314*e3b78ef1SRobin Karlsson 	if (stat_mask & STAT_HUNGER) {
315*e3b78ef1SRobin Karlsson 		mvaddstr(row, 73, hunger_str);
316*e3b78ef1SRobin Karlsson 		clrtoeol();
317*e3b78ef1SRobin Karlsson 	}
318*e3b78ef1SRobin Karlsson 	refresh();
319*e3b78ef1SRobin Karlsson }
320*e3b78ef1SRobin Karlsson 
321*e3b78ef1SRobin Karlsson static void
save_screen(void)322*e3b78ef1SRobin Karlsson save_screen(void)
323*e3b78ef1SRobin Karlsson {
324*e3b78ef1SRobin Karlsson 	FILE *fp;
325*e3b78ef1SRobin Karlsson 	short i, j;
326*e3b78ef1SRobin Karlsson 	char buf[DCOLS+2];
327*e3b78ef1SRobin Karlsson 
328*e3b78ef1SRobin Karlsson 	if ((fp = fopen(_PATH_SCREENDUMP, "w")) != NULL) {
329*e3b78ef1SRobin Karlsson 		for (i = 0; i < DROWS; i++) {
330*e3b78ef1SRobin Karlsson 			for (j=0; j<DCOLS; j++) {
331*e3b78ef1SRobin Karlsson 				buf[j] = mvinch(i, j);
332*e3b78ef1SRobin Karlsson 			}
333*e3b78ef1SRobin Karlsson 			/*buf[DCOLS] = 0; -- redundant */
334*e3b78ef1SRobin Karlsson 			for (j=DCOLS; j>0 && buf[j-1]==' '; j--);
335*e3b78ef1SRobin Karlsson 			buf[j] = 0;
336*e3b78ef1SRobin Karlsson 
337*e3b78ef1SRobin Karlsson 			fputs(buf, fp);
338*e3b78ef1SRobin Karlsson 			putc('\n', fp);
339*e3b78ef1SRobin Karlsson 		}
340*e3b78ef1SRobin Karlsson 		fclose(fp);
341*e3b78ef1SRobin Karlsson 	} else {
342*e3b78ef1SRobin Karlsson 		sound_bell();
343*e3b78ef1SRobin Karlsson 	}
344*e3b78ef1SRobin Karlsson }
345*e3b78ef1SRobin Karlsson 
346*e3b78ef1SRobin Karlsson void
sound_bell(void)347*e3b78ef1SRobin Karlsson sound_bell(void)
348*e3b78ef1SRobin Karlsson {
349*e3b78ef1SRobin Karlsson 	putchar(7);
350*e3b78ef1SRobin Karlsson 	fflush(stdout);
351*e3b78ef1SRobin Karlsson }
352*e3b78ef1SRobin Karlsson 
353*e3b78ef1SRobin Karlsson boolean
is_digit(int ch)354*e3b78ef1SRobin Karlsson is_digit(int ch)
355*e3b78ef1SRobin Karlsson {
356*e3b78ef1SRobin Karlsson 	return((ch >= '0') && (ch <= '9'));
357*e3b78ef1SRobin Karlsson }
358*e3b78ef1SRobin Karlsson 
359*e3b78ef1SRobin Karlsson int
r_index(const char * str,int ch,boolean last)360*e3b78ef1SRobin Karlsson r_index(const char *str, int ch, boolean last)
361*e3b78ef1SRobin Karlsson {
362*e3b78ef1SRobin Karlsson 	int i = 0;
363*e3b78ef1SRobin Karlsson 
364*e3b78ef1SRobin Karlsson 	if (last) {
365*e3b78ef1SRobin Karlsson 		for (i = strlen(str) - 1; i >= 0; i--) {
366*e3b78ef1SRobin Karlsson 			if (str[i] == ch) {
367*e3b78ef1SRobin Karlsson 				return(i);
368*e3b78ef1SRobin Karlsson 			}
369*e3b78ef1SRobin Karlsson 		}
370*e3b78ef1SRobin Karlsson 	} else {
371*e3b78ef1SRobin Karlsson 		for (i = 0; str[i]; i++) {
372*e3b78ef1SRobin Karlsson 			if (str[i] == ch) {
373*e3b78ef1SRobin Karlsson 				return(i);
374*e3b78ef1SRobin Karlsson 			}
375*e3b78ef1SRobin Karlsson 		}
376*e3b78ef1SRobin Karlsson 	}
377*e3b78ef1SRobin Karlsson 	return(-1);
378*e3b78ef1SRobin Karlsson }
379