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