xref: /csrg-svn/games/cribbage/io.c (revision 52540)
121505Smckusick /*
221505Smckusick  * Copyright (c) 1980 Regents of the University of California.
333707Sbostic  * All rights reserved.
433707Sbostic  *
542576Sbostic  * %sccs.include.redist.c%
621505Smckusick  */
712572Sarnold 
821505Smckusick #ifndef lint
9*52540Storek static char sccsid[] = "@(#)io.c	5.9 (Berkeley) 02/16/92";
1033707Sbostic #endif /* not lint */
1121505Smckusick 
127872Sarnold # include	<curses.h>
137872Sarnold # include	<ctype.h>
1414910Sarnold # include	<signal.h>
15*52540Storek # if __STDC__
1646264Sbostic # include	<stdarg.h>
17*52540Storek # else
18*52540Storek # include	<varargs.h>
19*52540Storek # endif
207872Sarnold # include	"deck.h"
217872Sarnold # include	"cribbage.h"
2212163Sarnold # include	"cribcur.h"
237709Sarnold 
247872Sarnold # define	LINESIZE		128
257709Sarnold 
2612163Sarnold # ifdef CTRL
2712163Sarnold # undef CTRL
2812163Sarnold # endif
297872Sarnold # define	CTRL(X)			('X' - 'A' + 1)
307709Sarnold 
3132355Sbostic # ifdef	notdef				/* defined in curses.h */
327872Sarnold #	define	erasechar()	_tty.sg_erase
337872Sarnold #	define	killchar()	_tty.sg_kill
3432355Sbostic # endif
357872Sarnold 
367709Sarnold char		linebuf[ LINESIZE ];
377709Sarnold 
387709Sarnold char		*rankname[ RANKS ]	= { "ACE", "TWO", "THREE", "FOUR",
397872Sarnold 					    "FIVE", "SIX", "SEVEN", "EIGHT",
407872Sarnold 					    "NINE", "TEN", "JACK", "QUEEN",
417872Sarnold 					    "KING" };
427709Sarnold 
437709Sarnold char            *rankchar[ RANKS ]      = { "A", "2", "3", "4", "5", "6", "7",
447872Sarnold 					    "8", "9", "T", "J", "Q", "K" };
457709Sarnold 
467709Sarnold char            *suitname[ SUITS ]      = { "SPADES", "HEARTS", "DIAMONDS",
477872Sarnold 					    "CLUBS" };
487709Sarnold 
497709Sarnold char            *suitchar[ SUITS ]      = { "S", "H", "D", "C" };
507709Sarnold 
517709Sarnold 
527709Sarnold 
537709Sarnold /*
547872Sarnold  * msgcard:
557872Sarnold  *	Call msgcrd in one of two forms
567709Sarnold  */
577872Sarnold msgcard(c, brief)
587872Sarnold CARD		c;
597872Sarnold BOOLEAN		brief;
607709Sarnold {
617872Sarnold 	if (brief)
627872Sarnold 		return msgcrd(c, TRUE, (char *) NULL, TRUE);
637872Sarnold 	else
647872Sarnold 		return msgcrd(c, FALSE, " of ", FALSE);
657709Sarnold }
667709Sarnold 
677709Sarnold 
687709Sarnold 
697709Sarnold /*
707872Sarnold  * msgcrd:
717872Sarnold  *	Print the value of a card in ascii
727709Sarnold  */
737872Sarnold msgcrd(c, brfrank, mid, brfsuit)
747872Sarnold CARD		c;
757872Sarnold char		*mid;
767872Sarnold BOOLEAN		brfrank,  brfsuit;
777872Sarnold {
787872Sarnold 	if (c.rank == EMPTY || c.suit == EMPTY)
797872Sarnold 	    return FALSE;
807872Sarnold 	if (brfrank)
817872Sarnold 	    addmsg("%1.1s", rankchar[c.rank]);
827872Sarnold 	else
837872Sarnold 	    addmsg(rankname[c.rank]);
847872Sarnold 	if (mid != NULL)
857872Sarnold 	    addmsg(mid);
867872Sarnold 	if (brfsuit)
877872Sarnold 	    addmsg("%1.1s", suitchar[c.suit]);
887872Sarnold 	else
897872Sarnold 	    addmsg(suitname[c.suit]);
907872Sarnold 	return TRUE;
917872Sarnold }
927709Sarnold 
937872Sarnold /*
947872Sarnold  * printcard:
957872Sarnold  *	Print out a card.
967872Sarnold  */
978073Sarnold printcard(win, cardno, c, blank)
987872Sarnold WINDOW		*win;
997872Sarnold int		cardno;
1007872Sarnold CARD		c;
1018073Sarnold BOOLEAN		blank;
1027872Sarnold {
1038073Sarnold 	prcard(win, cardno * 2, cardno, c, blank);
1047872Sarnold }
1057709Sarnold 
1067872Sarnold /*
1077872Sarnold  * prcard:
1087872Sarnold  *	Print out a card on the window at the specified location
1097872Sarnold  */
1107946Sarnold prcard(win, y, x, c, blank)
1117872Sarnold WINDOW		*win;
1127872Sarnold int		y, x;
1137872Sarnold CARD		c;
1147946Sarnold BOOLEAN		blank;
1157709Sarnold {
1167872Sarnold 	if (c.rank == EMPTY)
1177872Sarnold 	    return;
1187872Sarnold 	mvwaddstr(win, y + 0, x, "+-----+");
1197872Sarnold 	mvwaddstr(win, y + 1, x, "|     |");
1207872Sarnold 	mvwaddstr(win, y + 2, x, "|     |");
1217872Sarnold 	mvwaddstr(win, y + 3, x, "|     |");
1227872Sarnold 	mvwaddstr(win, y + 4, x, "+-----+");
1237946Sarnold 	if (!blank) {
1247946Sarnold 		mvwaddch(win, y + 1, x + 1, rankchar[c.rank][0]);
1257946Sarnold 		waddch(win, suitchar[c.suit][0]);
1267946Sarnold 		mvwaddch(win, y + 3, x + 4, rankchar[c.rank][0]);
1277946Sarnold 		waddch(win, suitchar[c.suit][0]);
1287946Sarnold 	}
1297709Sarnold }
1307709Sarnold 
1317709Sarnold /*
1327872Sarnold  * prhand:
1337872Sarnold  *	Print a hand of n cards
1347709Sarnold  */
1358073Sarnold prhand(h, n, win, blank)
1367872Sarnold CARD		h[];
1377872Sarnold int		n;
1387872Sarnold WINDOW		*win;
1398073Sarnold BOOLEAN		blank;
1407709Sarnold {
1417872Sarnold 	register int	i;
1427709Sarnold 
1437872Sarnold 	werase(win);
1447872Sarnold 	for (i = 0; i < n; i++)
1458073Sarnold 	    printcard(win, i, *h++, blank);
1467872Sarnold 	wrefresh(win);
1477709Sarnold }
1487709Sarnold 
1497709Sarnold 
1507709Sarnold 
1517709Sarnold /*
1527872Sarnold  * infrom:
1537872Sarnold  *	reads a card, supposedly in hand, accepting unambigous brief
1547872Sarnold  *	input, returns the index of the card found...
1557709Sarnold  */
1567872Sarnold infrom(hand, n, prompt)
1577872Sarnold CARD		hand[];
1587872Sarnold int		n;
1597872Sarnold char		*prompt;
1607709Sarnold {
1617872Sarnold 	register int           i, j;
1627872Sarnold 	CARD                    crd;
1637709Sarnold 
1647872Sarnold 	if (n < 1) {
1657872Sarnold 	    printf("\nINFROM: %d = n < 1!!\n", n);
1667872Sarnold 	    exit(74);
1677872Sarnold 	}
1687872Sarnold 	for (;;) {
1697947Sarnold 	    msg(prompt);
1707872Sarnold 	    if (incard(&crd)) {			/* if card is full card */
1717872Sarnold 		if (!isone(crd, hand, n))
1727872Sarnold 		    msg("That's not in your hand");
1737872Sarnold 		else {
1747872Sarnold 		    for (i = 0; i < n; i++)
1757872Sarnold 			if (hand[i].rank == crd.rank &&
1767872Sarnold 			    hand[i].suit == crd.suit)
1777872Sarnold 				break;
1787872Sarnold 		    if (i >= n) {
1797872Sarnold 			printf("\nINFROM: isone or something messed up\n");
1807872Sarnold 			exit(77);
1817872Sarnold 		    }
1827872Sarnold 		    return i;
1837872Sarnold 		}
1847872Sarnold 	    }
1857872Sarnold 	    else				/* if not full card... */
1867872Sarnold 		if (crd.rank != EMPTY) {
1877872Sarnold 		    for (i = 0; i < n; i++)
1887872Sarnold 			if (hand[i].rank == crd.rank)
1897872Sarnold 				break;
1907872Sarnold 		    if (i >= n)
1917872Sarnold 			msg("No such rank in your hand");
1927872Sarnold 		    else {
1937872Sarnold 			for (j = i + 1; j < n; j++)
1947872Sarnold 			    if (hand[j].rank == crd.rank)
1957872Sarnold 				break;
1967872Sarnold 			if (j < n)
1977872Sarnold 			    msg("Ambiguous rank");
1987872Sarnold 			else
1997872Sarnold 			    return i;
2007872Sarnold 		    }
2017872Sarnold 		}
2027872Sarnold 		else
2037872Sarnold 		    msg("Sorry, I missed that");
2047872Sarnold 	}
2057872Sarnold 	/* NOTREACHED */
2067709Sarnold }
2077709Sarnold 
2087709Sarnold 
2097709Sarnold 
2107709Sarnold /*
2117872Sarnold  * incard:
2127872Sarnold  *	Inputs a card in any format.  It reads a line ending with a CR
2137872Sarnold  *	and then parses it.
2147709Sarnold  */
2157872Sarnold incard(crd)
2167872Sarnold CARD		*crd;
2177709Sarnold {
2187872Sarnold 	char		*getline();
2197872Sarnold 	register int	i;
2207872Sarnold 	int		rnk, sut;
2217872Sarnold 	char		*line, *p, *p1;
2227872Sarnold 	BOOLEAN		retval;
2237709Sarnold 
2247872Sarnold 	retval = FALSE;
2257872Sarnold 	rnk = sut = EMPTY;
2267872Sarnold 	if (!(line = getline()))
2277872Sarnold 		goto gotit;
2287872Sarnold 	p = p1 = line;
2297872Sarnold 	while(  *p1 != ' '  &&  *p1 != NULL  )  ++p1;
2307872Sarnold 	*p1++ = NULL;
2317872Sarnold 	if(  *p == NULL  )  goto  gotit;
2327872Sarnold 			/* IMPORTANT: no real card has 2 char first name */
2337872Sarnold 	if(  strlen(p) == 2  )  {               /* check for short form */
2347872Sarnold 	    rnk = EMPTY;
2357872Sarnold 	    for( i = 0; i < RANKS; i++ )  {
2367872Sarnold 		if(  *p == *rankchar[i]  )  {
2377872Sarnold 		    rnk = i;
2387872Sarnold 		    break;
2397872Sarnold 		}
2407872Sarnold 	    }
2417872Sarnold 	    if(  rnk == EMPTY  )  goto  gotit;     /* it's nothing... */
2427872Sarnold 	    ++p;                                /* advance to next char */
2437872Sarnold 	    sut = EMPTY;
2447872Sarnold 	    for( i = 0; i < SUITS; i++ )  {
2457872Sarnold 		if(  *p == *suitchar[i]  )  {
2467872Sarnold 		    sut = i;
2477872Sarnold 		    break;
2487872Sarnold 		}
2497872Sarnold 	    }
2507872Sarnold 	    if(  sut != EMPTY  )  retval = TRUE;
2517872Sarnold 	    goto  gotit;
2527872Sarnold 	}
2537872Sarnold 	rnk = EMPTY;
2547872Sarnold 	for( i = 0; i < RANKS; i++ )  {
2557872Sarnold 	    if(  !strcmp( p, rankname[i] )  ||  !strcmp( p, rankchar[i] )  )  {
2567872Sarnold 		rnk = i;
2577872Sarnold 		break;
2587872Sarnold 	    }
2597872Sarnold 	}
2607872Sarnold 	if(  rnk == EMPTY  )  goto  gotit;
2617872Sarnold 	p = p1;
2627872Sarnold 	while(  *p1 != ' '  &&  *p1 != NULL  )  ++p1;
2637872Sarnold 	*p1++ = NULL;
2647872Sarnold 	if(  *p == NULL  )  goto  gotit;
2657872Sarnold 	if(  !strcmp( "OF", p )  )  {
2667872Sarnold 	    p = p1;
2677872Sarnold 	    while(  *p1 != ' '  &&  *p1 != NULL  )  ++p1;
2687872Sarnold 	    *p1++ = NULL;
2697872Sarnold 	    if(  *p == NULL  )  goto  gotit;
2707872Sarnold 	}
2717872Sarnold 	sut = EMPTY;
2727872Sarnold 	for( i = 0; i < SUITS; i++ )  {
2737872Sarnold 	    if(  !strcmp( p, suitname[i] )  ||  !strcmp( p, suitchar[i] )  )  {
2747872Sarnold 		sut = i;
2757872Sarnold 		break;
2767872Sarnold 	    }
2777872Sarnold 	}
2787872Sarnold 	if(  sut != EMPTY  )  retval = TRUE;
2797709Sarnold gotit:
2807872Sarnold 	(*crd).rank = rnk;
2817872Sarnold 	(*crd).suit = sut;
2827872Sarnold 	return( retval );
2837709Sarnold }
2847709Sarnold 
2857709Sarnold 
2867709Sarnold 
2877709Sarnold /*
2887872Sarnold  * getuchar:
2897872Sarnold  *	Reads and converts to upper case
2907709Sarnold  */
2917709Sarnold getuchar()
2927709Sarnold {
2937872Sarnold 	register int		c;
2947709Sarnold 
2957872Sarnold 	c = readchar();
2967872Sarnold 	if (islower(c))
2977872Sarnold 	    c = toupper(c);
29812163Sarnold 	waddch(Msgwin, c);
2997872Sarnold 	return c;
3007709Sarnold }
3017709Sarnold 
3027709Sarnold /*
3037934Sarnold  * number:
3047934Sarnold  *	Reads in a decimal number and makes sure it is between "lo" and
3057934Sarnold  *	"hi" inclusive.
3067709Sarnold  */
3077934Sarnold number(lo, hi, prompt)
3087934Sarnold int		lo, hi;
3097934Sarnold char		*prompt;
3107709Sarnold {
3117934Sarnold 	char			*getline();
3127934Sarnold 	register char		*p;
3137934Sarnold 	register int		sum;
3147709Sarnold 
3157872Sarnold 	sum = 0;
3167934Sarnold 	for (;;) {
3177934Sarnold 	    msg(prompt);
3187934Sarnold 	    if(!(p = getline()) || *p == NULL) {
3197934Sarnold 		msg(quiet ? "Not a number" : "That doesn't look like a number");
3207934Sarnold 		continue;
3217934Sarnold 	    }
3227872Sarnold 	    sum = 0;
3237934Sarnold 
3247934Sarnold 	    if (!isdigit(*p))
3257872Sarnold 		sum = lo - 1;
3267934Sarnold 	    else
3277934Sarnold 		while (isdigit(*p)) {
3287934Sarnold 		    sum = 10 * sum + (*p - '0');
3297872Sarnold 		    ++p;
3307934Sarnold 		}
3317934Sarnold 
3327934Sarnold 	    if (*p != ' ' && *p != '\t' && *p != NULL)
3337934Sarnold 		sum = lo - 1;
3347934Sarnold 	    if (sum >= lo && sum <= hi)
3357934Sarnold 		return sum;
3367934Sarnold 	    if (sum == lo - 1)
3377934Sarnold 		msg("that doesn't look like a number, try again --> ");
3387934Sarnold 	    else
3397934Sarnold 		msg("%d is not between %d and %d inclusive, try again --> ",
3407934Sarnold 								sum, lo, hi);
3417934Sarnold 	}
3427709Sarnold }
3437709Sarnold 
3447872Sarnold /*
3457872Sarnold  * msg:
3467872Sarnold  *	Display a message at the top of the screen.
3477872Sarnold  */
34812157Sarnold char		Msgbuf[BUFSIZ] = { '\0' };
3497709Sarnold 
3507872Sarnold int		Mpos = 0;
3517709Sarnold 
3527872Sarnold static int	Newpos = 0;
3537872Sarnold 
3547872Sarnold /* VARARGS1 */
355*52540Storek #if __STDC__
356*52540Storek msg(char *fmt, ...)
357*52540Storek #else
358*52540Storek msg(fmt, va_alist)
35946264Sbostic 	char *fmt;
360*52540Storek 	va_dcl
361*52540Storek #endif
3627872Sarnold {
36346264Sbostic 	va_list ap;
36446264Sbostic 
365*52540Storek #if __STDC__
36646264Sbostic 	va_start(ap, fmt);
367*52540Storek #else
368*52540Storek 	va_start(ap);
369*52540Storek #endif
37046743Sbostic 	(void)vsprintf(&Msgbuf[Newpos], fmt, ap);
37146264Sbostic 	va_end(ap);
37246264Sbostic 	endmsg();
3737872Sarnold }
3747872Sarnold 
3757709Sarnold /*
3767872Sarnold  * addmsg:
3777872Sarnold  *	Add things to the current message
3787709Sarnold  */
3797872Sarnold /* VARARGS1 */
380*52540Storek #if __STDC__
381*52540Storek addmsg(char *fmt, ...)
382*52540Storek #else
383*52540Storek addmsg(fmt, va_alist)
38446264Sbostic 	char *fmt;
385*52540Storek 	va_dcl
386*52540Storek #endif
3877872Sarnold {
38846264Sbostic 	va_list ap;
38946264Sbostic 
390*52540Storek #if __STDC__
39146264Sbostic 	va_start(ap, fmt);
392*52540Storek #else
393*52540Storek 	va_start(ap);
394*52540Storek #endif
39546743Sbostic 	(void)vsprintf(&Msgbuf[Newpos], fmt, ap);
39646264Sbostic 	va_end(ap);
3977872Sarnold }
3987709Sarnold 
3997872Sarnold /*
4007872Sarnold  * endmsg:
40112163Sarnold  *	Display a new msg.
4027872Sarnold  */
40312316Sarnold 
40412316Sarnold int	Lineno = 0;
40512316Sarnold 
4067872Sarnold endmsg()
4077709Sarnold {
40812163Sarnold     register int	len;
40912163Sarnold     register char	*mp, *omp;
41012316Sarnold     static int		lastline = 0;
41112163Sarnold 
4127872Sarnold     /*
41312316Sarnold      * All messages should start with uppercase
4147872Sarnold      */
41512316Sarnold     mvaddch(lastline + Y_MSG_START, SCORE_X, ' ');
4167872Sarnold     if (islower(Msgbuf[0]) && Msgbuf[1] != ')')
4177872Sarnold 	Msgbuf[0] = toupper(Msgbuf[0]);
41812163Sarnold     mp = Msgbuf;
41912163Sarnold     len = strlen(mp);
42012330Sarnold     if (len / MSG_X + Lineno >= MSG_Y) {
42112330Sarnold 	while (Lineno < MSG_Y) {
42212330Sarnold 	    wmove(Msgwin, Lineno++, 0);
42312330Sarnold 	    wclrtoeol(Msgwin);
42412330Sarnold 	}
42512316Sarnold 	Lineno = 0;
42612330Sarnold     }
42712316Sarnold     mvaddch(Lineno + Y_MSG_START, SCORE_X, '*');
42812316Sarnold     lastline = Lineno;
42912163Sarnold     do {
43012316Sarnold 	mvwaddstr(Msgwin, Lineno, 0, mp);
43112163Sarnold 	if ((len = strlen(mp)) > MSG_X) {
43212163Sarnold 	    omp = mp;
43312163Sarnold 	    for (mp = &mp[MSG_X-1]; *mp != ' '; mp--)
43412163Sarnold 	    	continue;
43512163Sarnold 	    while (*mp == ' ')
43612163Sarnold 		mp--;
43712163Sarnold 	    mp++;
43812316Sarnold 	    wmove(Msgwin, Lineno, mp - omp);
43912163Sarnold 	    wclrtoeol(Msgwin);
44012163Sarnold 	}
44112316Sarnold 	if (++Lineno >= MSG_Y)
44212316Sarnold 	    Lineno = 0;
44312163Sarnold     } while (len > MSG_X);
44412163Sarnold     wclrtoeol(Msgwin);
44512330Sarnold     Mpos = len;
4467872Sarnold     Newpos = 0;
44712163Sarnold     wrefresh(Msgwin);
4487872Sarnold     refresh();
44912163Sarnold     wrefresh(Msgwin);
4507872Sarnold }
4517709Sarnold 
45246264Sbostic #ifdef notdef
4537872Sarnold /*
4547872Sarnold  * doadd:
4557872Sarnold  *	Perform an add onto the message buffer
4567872Sarnold  */
4577872Sarnold doadd(fmt, args)
4587872Sarnold char	*fmt;
4597872Sarnold int	*args;
4607872Sarnold {
4617872Sarnold     static FILE	junk;
4627872Sarnold 
4637872Sarnold     /*
4647872Sarnold      * Do the printf into Msgbuf
4657872Sarnold      */
4667872Sarnold     junk._flag = _IOWRT + _IOSTRG;
4677872Sarnold     junk._ptr = &Msgbuf[Newpos];
4687872Sarnold     junk._cnt = 32767;
4697872Sarnold     _doprnt(fmt, args, &junk);
4707872Sarnold     putc('\0', &junk);
4717872Sarnold     Newpos = strlen(Msgbuf);
4727709Sarnold }
47346264Sbostic #endif
4747709Sarnold 
4757872Sarnold /*
47612316Sarnold  * do_wait:
47712316Sarnold  *	Wait for the user to type ' ' before doing anything else
47812316Sarnold  */
47912316Sarnold do_wait()
48012316Sarnold {
48112316Sarnold     register int line;
48212316Sarnold     static char prompt[] = { '-', '-', 'M', 'o', 'r', 'e', '-', '-', '\0' };
48312316Sarnold 
48412316Sarnold     if (Mpos + sizeof prompt < MSG_X)
48512316Sarnold 	wmove(Msgwin, Lineno > 0 ? Lineno - 1 : MSG_Y - 1, Mpos);
48612316Sarnold     else {
48712316Sarnold 	mvwaddch(Msgwin, Lineno, 0, ' ');
48812316Sarnold 	wclrtoeol(Msgwin);
48912316Sarnold 	if (++Lineno >= MSG_Y)
49012316Sarnold 	    Lineno = 0;
49112316Sarnold     }
49212316Sarnold     waddstr(Msgwin, prompt);
49312316Sarnold     wrefresh(Msgwin);
49412316Sarnold     wait_for(' ');
49512316Sarnold }
49612316Sarnold 
49712316Sarnold /*
4987872Sarnold  * wait_for
4997872Sarnold  *	Sit around until the guy types the right key
5007872Sarnold  */
5017872Sarnold wait_for(ch)
5027872Sarnold register char	ch;
5037872Sarnold {
5047872Sarnold     register char	c;
5057709Sarnold 
5067872Sarnold     if (ch == '\n')
5077872Sarnold 	while ((c = readchar()) != '\n')
5087872Sarnold 	    continue;
5097872Sarnold     else
5107872Sarnold 	while (readchar() != ch)
5117872Sarnold 	    continue;
5127872Sarnold }
5137709Sarnold 
5147872Sarnold /*
5157872Sarnold  * readchar:
5167872Sarnold  *	Reads and returns a character, checking for gross input errors
5177872Sarnold  */
5187872Sarnold readchar()
5197872Sarnold {
5207872Sarnold     register int	cnt, y, x;
5217872Sarnold     auto char		c;
5227709Sarnold 
5237872Sarnold over:
5247872Sarnold     cnt = 0;
5257872Sarnold     while (read(0, &c, 1) <= 0)
52641186Sbostic 	if (cnt++ > 100) {	/* if we are getting infinite EOFs */
52741186Sbostic 		bye();		/* quit the game */
52841186Sbostic 		exit(1);
52941186Sbostic 	}
5307872Sarnold     if (c == CTRL(L)) {
5317872Sarnold 	wrefresh(curscr);
5327872Sarnold 	goto over;
5337872Sarnold     }
5347872Sarnold     if (c == '\r')
5357872Sarnold 	return '\n';
5367872Sarnold     else
5377872Sarnold 	return c;
5387872Sarnold }
5397872Sarnold 
5407872Sarnold /*
5417872Sarnold  * getline:
5427872Sarnold  *      Reads the next line up to '\n' or EOF.  Multiple spaces are
5437872Sarnold  *	compressed to one space; a space is inserted before a ','
5447872Sarnold  */
5457872Sarnold char *
5467872Sarnold getline()
5477872Sarnold {
5487872Sarnold     register char	*sp;
5497872Sarnold     register int	c, oy, ox;
55012163Sarnold     register WINDOW	*oscr;
5517872Sarnold 
55212163Sarnold     oscr = stdscr;
55312163Sarnold     stdscr = Msgwin;
5547872Sarnold     getyx(stdscr, oy, ox);
5557872Sarnold     refresh();
5567872Sarnold     /*
5577872Sarnold      * loop reading in the string, and put it in a temporary buffer
5587872Sarnold      */
5597872Sarnold     for (sp = linebuf; (c = readchar()) != '\n'; clrtoeol(), refresh()) {
5607872Sarnold 	if (c == -1)
5617872Sarnold 	    continue;
5627872Sarnold 	else if (c == erasechar()) {	/* process erase character */
5637872Sarnold 	    if (sp > linebuf) {
5647872Sarnold 		register int i;
5657872Sarnold 
5667872Sarnold 		sp--;
5677872Sarnold 		for (i = strlen(unctrl(*sp)); i; i--)
5687872Sarnold 		    addch('\b');
5697872Sarnold 	    }
5707872Sarnold 	    continue;
5717872Sarnold 	}
5727872Sarnold 	else if (c == killchar()) {	/* process kill character */
5737872Sarnold 	    sp = linebuf;
5747872Sarnold 	    move(oy, ox);
5757872Sarnold 	    continue;
5767872Sarnold 	}
5777872Sarnold 	else if (sp == linebuf && c == ' ')
5787872Sarnold 	    continue;
5797872Sarnold 	if (sp >= &linebuf[LINESIZE-1] || !(isprint(c) || c == ' '))
5807872Sarnold 	    putchar(CTRL(G));
5817872Sarnold 	else {
5827872Sarnold 	    if (islower(c))
5837872Sarnold 		c = toupper(c);
5847872Sarnold 	    *sp++ = c;
5857872Sarnold 	    addstr(unctrl(c));
5867872Sarnold 	    Mpos++;
5877872Sarnold 	}
5887872Sarnold     }
5897872Sarnold     *sp = '\0';
59012163Sarnold     stdscr = oscr;
5917872Sarnold     return linebuf;
5927872Sarnold }
59314910Sarnold 
59441186Sbostic rint()
59541186Sbostic {
59641186Sbostic 	bye();
59741186Sbostic 	exit(1);
59841186Sbostic }
59941186Sbostic 
60014910Sarnold /*
60114910Sarnold  * bye:
60214910Sarnold  *	Leave the program, cleaning things up as we go.
60314910Sarnold  */
60414910Sarnold bye()
60514910Sarnold {
60614910Sarnold 	signal(SIGINT, SIG_IGN);
60714910Sarnold 	mvcur(0, COLS - 1, LINES - 1, 0);
60814910Sarnold 	fflush(stdout);
60914910Sarnold 	endwin();
61014910Sarnold 	putchar('\n');
61114910Sarnold }
612