xref: /csrg-svn/games/cribbage/io.c (revision 41186)
121505Smckusick /*
221505Smckusick  * Copyright (c) 1980 Regents of the University of California.
333707Sbostic  * All rights reserved.
433707Sbostic  *
533707Sbostic  * Redistribution and use in source and binary forms are permitted
634779Sbostic  * provided that the above copyright notice and this paragraph are
734779Sbostic  * duplicated in all such forms and that any documentation,
834779Sbostic  * advertising materials, and other materials related to such
934779Sbostic  * distribution and use acknowledge that the software was developed
1034779Sbostic  * by the University of California, Berkeley.  The name of the
1134779Sbostic  * University may not be used to endorse or promote products derived
1234779Sbostic  * from this software without specific prior written permission.
1334779Sbostic  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1434779Sbostic  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
1534779Sbostic  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1621505Smckusick  */
1712572Sarnold 
1821505Smckusick #ifndef lint
19*41186Sbostic static char sccsid[] = "@(#)io.c	5.5 (Berkeley) 05/01/90";
2033707Sbostic #endif /* not lint */
2121505Smckusick 
227872Sarnold # include	<curses.h>
237872Sarnold # include	<ctype.h>
2414910Sarnold # include	<signal.h>
257872Sarnold # include	"deck.h"
267872Sarnold # include	"cribbage.h"
2712163Sarnold # include	"cribcur.h"
287709Sarnold 
297872Sarnold # define	LINESIZE		128
307709Sarnold 
3112163Sarnold # ifdef CTRL
3212163Sarnold # undef CTRL
3312163Sarnold # endif
347872Sarnold # define	CTRL(X)			('X' - 'A' + 1)
357709Sarnold 
3632355Sbostic # ifdef	notdef				/* defined in curses.h */
377872Sarnold #	define	erasechar()	_tty.sg_erase
387872Sarnold #	define	killchar()	_tty.sg_kill
3932355Sbostic # endif
407872Sarnold 
417709Sarnold char		linebuf[ LINESIZE ];
427709Sarnold 
437709Sarnold char		*rankname[ RANKS ]	= { "ACE", "TWO", "THREE", "FOUR",
447872Sarnold 					    "FIVE", "SIX", "SEVEN", "EIGHT",
457872Sarnold 					    "NINE", "TEN", "JACK", "QUEEN",
467872Sarnold 					    "KING" };
477709Sarnold 
487709Sarnold char            *rankchar[ RANKS ]      = { "A", "2", "3", "4", "5", "6", "7",
497872Sarnold 					    "8", "9", "T", "J", "Q", "K" };
507709Sarnold 
517709Sarnold char            *suitname[ SUITS ]      = { "SPADES", "HEARTS", "DIAMONDS",
527872Sarnold 					    "CLUBS" };
537709Sarnold 
547709Sarnold char            *suitchar[ SUITS ]      = { "S", "H", "D", "C" };
557709Sarnold 
567709Sarnold 
577709Sarnold 
587709Sarnold /*
597872Sarnold  * msgcard:
607872Sarnold  *	Call msgcrd in one of two forms
617709Sarnold  */
627872Sarnold msgcard(c, brief)
637872Sarnold CARD		c;
647872Sarnold BOOLEAN		brief;
657709Sarnold {
667872Sarnold 	if (brief)
677872Sarnold 		return msgcrd(c, TRUE, (char *) NULL, TRUE);
687872Sarnold 	else
697872Sarnold 		return msgcrd(c, FALSE, " of ", FALSE);
707709Sarnold }
717709Sarnold 
727709Sarnold 
737709Sarnold 
747709Sarnold /*
757872Sarnold  * msgcrd:
767872Sarnold  *	Print the value of a card in ascii
777709Sarnold  */
787872Sarnold msgcrd(c, brfrank, mid, brfsuit)
797872Sarnold CARD		c;
807872Sarnold char		*mid;
817872Sarnold BOOLEAN		brfrank,  brfsuit;
827872Sarnold {
837872Sarnold 	if (c.rank == EMPTY || c.suit == EMPTY)
847872Sarnold 	    return FALSE;
857872Sarnold 	if (brfrank)
867872Sarnold 	    addmsg("%1.1s", rankchar[c.rank]);
877872Sarnold 	else
887872Sarnold 	    addmsg(rankname[c.rank]);
897872Sarnold 	if (mid != NULL)
907872Sarnold 	    addmsg(mid);
917872Sarnold 	if (brfsuit)
927872Sarnold 	    addmsg("%1.1s", suitchar[c.suit]);
937872Sarnold 	else
947872Sarnold 	    addmsg(suitname[c.suit]);
957872Sarnold 	return TRUE;
967872Sarnold }
977709Sarnold 
987872Sarnold /*
997872Sarnold  * printcard:
1007872Sarnold  *	Print out a card.
1017872Sarnold  */
1028073Sarnold printcard(win, cardno, c, blank)
1037872Sarnold WINDOW		*win;
1047872Sarnold int		cardno;
1057872Sarnold CARD		c;
1068073Sarnold BOOLEAN		blank;
1077872Sarnold {
1088073Sarnold 	prcard(win, cardno * 2, cardno, c, blank);
1097872Sarnold }
1107709Sarnold 
1117872Sarnold /*
1127872Sarnold  * prcard:
1137872Sarnold  *	Print out a card on the window at the specified location
1147872Sarnold  */
1157946Sarnold prcard(win, y, x, c, blank)
1167872Sarnold WINDOW		*win;
1177872Sarnold int		y, x;
1187872Sarnold CARD		c;
1197946Sarnold BOOLEAN		blank;
1207709Sarnold {
1217872Sarnold 	if (c.rank == EMPTY)
1227872Sarnold 	    return;
1237872Sarnold 	mvwaddstr(win, y + 0, x, "+-----+");
1247872Sarnold 	mvwaddstr(win, y + 1, x, "|     |");
1257872Sarnold 	mvwaddstr(win, y + 2, x, "|     |");
1267872Sarnold 	mvwaddstr(win, y + 3, x, "|     |");
1277872Sarnold 	mvwaddstr(win, y + 4, x, "+-----+");
1287946Sarnold 	if (!blank) {
1297946Sarnold 		mvwaddch(win, y + 1, x + 1, rankchar[c.rank][0]);
1307946Sarnold 		waddch(win, suitchar[c.suit][0]);
1317946Sarnold 		mvwaddch(win, y + 3, x + 4, rankchar[c.rank][0]);
1327946Sarnold 		waddch(win, suitchar[c.suit][0]);
1337946Sarnold 	}
1347709Sarnold }
1357709Sarnold 
1367709Sarnold /*
1377872Sarnold  * prhand:
1387872Sarnold  *	Print a hand of n cards
1397709Sarnold  */
1408073Sarnold prhand(h, n, win, blank)
1417872Sarnold CARD		h[];
1427872Sarnold int		n;
1437872Sarnold WINDOW		*win;
1448073Sarnold BOOLEAN		blank;
1457709Sarnold {
1467872Sarnold 	register int	i;
1477709Sarnold 
1487872Sarnold 	werase(win);
1497872Sarnold 	for (i = 0; i < n; i++)
1508073Sarnold 	    printcard(win, i, *h++, blank);
1517872Sarnold 	wrefresh(win);
1527709Sarnold }
1537709Sarnold 
1547709Sarnold 
1557709Sarnold 
1567709Sarnold /*
1577872Sarnold  * infrom:
1587872Sarnold  *	reads a card, supposedly in hand, accepting unambigous brief
1597872Sarnold  *	input, returns the index of the card found...
1607709Sarnold  */
1617872Sarnold infrom(hand, n, prompt)
1627872Sarnold CARD		hand[];
1637872Sarnold int		n;
1647872Sarnold char		*prompt;
1657709Sarnold {
1667872Sarnold 	register int           i, j;
1677872Sarnold 	CARD                    crd;
1687709Sarnold 
1697872Sarnold 	if (n < 1) {
1707872Sarnold 	    printf("\nINFROM: %d = n < 1!!\n", n);
1717872Sarnold 	    exit(74);
1727872Sarnold 	}
1737872Sarnold 	for (;;) {
1747947Sarnold 	    msg(prompt);
1757872Sarnold 	    if (incard(&crd)) {			/* if card is full card */
1767872Sarnold 		if (!isone(crd, hand, n))
1777872Sarnold 		    msg("That's not in your hand");
1787872Sarnold 		else {
1797872Sarnold 		    for (i = 0; i < n; i++)
1807872Sarnold 			if (hand[i].rank == crd.rank &&
1817872Sarnold 			    hand[i].suit == crd.suit)
1827872Sarnold 				break;
1837872Sarnold 		    if (i >= n) {
1847872Sarnold 			printf("\nINFROM: isone or something messed up\n");
1857872Sarnold 			exit(77);
1867872Sarnold 		    }
1877872Sarnold 		    return i;
1887872Sarnold 		}
1897872Sarnold 	    }
1907872Sarnold 	    else				/* if not full card... */
1917872Sarnold 		if (crd.rank != EMPTY) {
1927872Sarnold 		    for (i = 0; i < n; i++)
1937872Sarnold 			if (hand[i].rank == crd.rank)
1947872Sarnold 				break;
1957872Sarnold 		    if (i >= n)
1967872Sarnold 			msg("No such rank in your hand");
1977872Sarnold 		    else {
1987872Sarnold 			for (j = i + 1; j < n; j++)
1997872Sarnold 			    if (hand[j].rank == crd.rank)
2007872Sarnold 				break;
2017872Sarnold 			if (j < n)
2027872Sarnold 			    msg("Ambiguous rank");
2037872Sarnold 			else
2047872Sarnold 			    return i;
2057872Sarnold 		    }
2067872Sarnold 		}
2077872Sarnold 		else
2087872Sarnold 		    msg("Sorry, I missed that");
2097872Sarnold 	}
2107872Sarnold 	/* NOTREACHED */
2117709Sarnold }
2127709Sarnold 
2137709Sarnold 
2147709Sarnold 
2157709Sarnold /*
2167872Sarnold  * incard:
2177872Sarnold  *	Inputs a card in any format.  It reads a line ending with a CR
2187872Sarnold  *	and then parses it.
2197709Sarnold  */
2207872Sarnold incard(crd)
2217872Sarnold CARD		*crd;
2227709Sarnold {
2237872Sarnold 	char		*getline();
2247872Sarnold 	register int	i;
2257872Sarnold 	int		rnk, sut;
2267872Sarnold 	char		*line, *p, *p1;
2277872Sarnold 	BOOLEAN		retval;
2287709Sarnold 
2297872Sarnold 	retval = FALSE;
2307872Sarnold 	rnk = sut = EMPTY;
2317872Sarnold 	if (!(line = getline()))
2327872Sarnold 		goto gotit;
2337872Sarnold 	p = p1 = line;
2347872Sarnold 	while(  *p1 != ' '  &&  *p1 != NULL  )  ++p1;
2357872Sarnold 	*p1++ = NULL;
2367872Sarnold 	if(  *p == NULL  )  goto  gotit;
2377872Sarnold 			/* IMPORTANT: no real card has 2 char first name */
2387872Sarnold 	if(  strlen(p) == 2  )  {               /* check for short form */
2397872Sarnold 	    rnk = EMPTY;
2407872Sarnold 	    for( i = 0; i < RANKS; i++ )  {
2417872Sarnold 		if(  *p == *rankchar[i]  )  {
2427872Sarnold 		    rnk = i;
2437872Sarnold 		    break;
2447872Sarnold 		}
2457872Sarnold 	    }
2467872Sarnold 	    if(  rnk == EMPTY  )  goto  gotit;     /* it's nothing... */
2477872Sarnold 	    ++p;                                /* advance to next char */
2487872Sarnold 	    sut = EMPTY;
2497872Sarnold 	    for( i = 0; i < SUITS; i++ )  {
2507872Sarnold 		if(  *p == *suitchar[i]  )  {
2517872Sarnold 		    sut = i;
2527872Sarnold 		    break;
2537872Sarnold 		}
2547872Sarnold 	    }
2557872Sarnold 	    if(  sut != EMPTY  )  retval = TRUE;
2567872Sarnold 	    goto  gotit;
2577872Sarnold 	}
2587872Sarnold 	rnk = EMPTY;
2597872Sarnold 	for( i = 0; i < RANKS; i++ )  {
2607872Sarnold 	    if(  !strcmp( p, rankname[i] )  ||  !strcmp( p, rankchar[i] )  )  {
2617872Sarnold 		rnk = i;
2627872Sarnold 		break;
2637872Sarnold 	    }
2647872Sarnold 	}
2657872Sarnold 	if(  rnk == EMPTY  )  goto  gotit;
2667872Sarnold 	p = p1;
2677872Sarnold 	while(  *p1 != ' '  &&  *p1 != NULL  )  ++p1;
2687872Sarnold 	*p1++ = NULL;
2697872Sarnold 	if(  *p == NULL  )  goto  gotit;
2707872Sarnold 	if(  !strcmp( "OF", p )  )  {
2717872Sarnold 	    p = p1;
2727872Sarnold 	    while(  *p1 != ' '  &&  *p1 != NULL  )  ++p1;
2737872Sarnold 	    *p1++ = NULL;
2747872Sarnold 	    if(  *p == NULL  )  goto  gotit;
2757872Sarnold 	}
2767872Sarnold 	sut = EMPTY;
2777872Sarnold 	for( i = 0; i < SUITS; i++ )  {
2787872Sarnold 	    if(  !strcmp( p, suitname[i] )  ||  !strcmp( p, suitchar[i] )  )  {
2797872Sarnold 		sut = i;
2807872Sarnold 		break;
2817872Sarnold 	    }
2827872Sarnold 	}
2837872Sarnold 	if(  sut != EMPTY  )  retval = TRUE;
2847709Sarnold gotit:
2857872Sarnold 	(*crd).rank = rnk;
2867872Sarnold 	(*crd).suit = sut;
2877872Sarnold 	return( retval );
2887709Sarnold }
2897709Sarnold 
2907709Sarnold 
2917709Sarnold 
2927709Sarnold /*
2937872Sarnold  * getuchar:
2947872Sarnold  *	Reads and converts to upper case
2957709Sarnold  */
2967709Sarnold getuchar()
2977709Sarnold {
2987872Sarnold 	register int		c;
2997709Sarnold 
3007872Sarnold 	c = readchar();
3017872Sarnold 	if (islower(c))
3027872Sarnold 	    c = toupper(c);
30312163Sarnold 	waddch(Msgwin, c);
3047872Sarnold 	return c;
3057709Sarnold }
3067709Sarnold 
3077709Sarnold /*
3087934Sarnold  * number:
3097934Sarnold  *	Reads in a decimal number and makes sure it is between "lo" and
3107934Sarnold  *	"hi" inclusive.
3117709Sarnold  */
3127934Sarnold number(lo, hi, prompt)
3137934Sarnold int		lo, hi;
3147934Sarnold char		*prompt;
3157709Sarnold {
3167934Sarnold 	char			*getline();
3177934Sarnold 	register char		*p;
3187934Sarnold 	register int		sum;
3197709Sarnold 
3207872Sarnold 	sum = 0;
3217934Sarnold 	for (;;) {
3227934Sarnold 	    msg(prompt);
3237934Sarnold 	    if(!(p = getline()) || *p == NULL) {
3247934Sarnold 		msg(quiet ? "Not a number" : "That doesn't look like a number");
3257934Sarnold 		continue;
3267934Sarnold 	    }
3277872Sarnold 	    sum = 0;
3287934Sarnold 
3297934Sarnold 	    if (!isdigit(*p))
3307872Sarnold 		sum = lo - 1;
3317934Sarnold 	    else
3327934Sarnold 		while (isdigit(*p)) {
3337934Sarnold 		    sum = 10 * sum + (*p - '0');
3347872Sarnold 		    ++p;
3357934Sarnold 		}
3367934Sarnold 
3377934Sarnold 	    if (*p != ' ' && *p != '\t' && *p != NULL)
3387934Sarnold 		sum = lo - 1;
3397934Sarnold 	    if (sum >= lo && sum <= hi)
3407934Sarnold 		return sum;
3417934Sarnold 	    if (sum == lo - 1)
3427934Sarnold 		msg("that doesn't look like a number, try again --> ");
3437934Sarnold 	    else
3447934Sarnold 		msg("%d is not between %d and %d inclusive, try again --> ",
3457934Sarnold 								sum, lo, hi);
3467934Sarnold 	}
3477709Sarnold }
3487709Sarnold 
3497872Sarnold /*
3507872Sarnold  * msg:
3517872Sarnold  *	Display a message at the top of the screen.
3527872Sarnold  */
35312157Sarnold char		Msgbuf[BUFSIZ] = { '\0' };
3547709Sarnold 
3557872Sarnold int		Mpos = 0;
3567709Sarnold 
3577872Sarnold static int	Newpos = 0;
3587872Sarnold 
3597872Sarnold /* VARARGS1 */
3607872Sarnold msg(fmt, args)
3617872Sarnold char	*fmt;
3627872Sarnold int	args;
3637872Sarnold {
3647872Sarnold     doadd(fmt, &args);
3657872Sarnold     endmsg();
3667872Sarnold }
3677872Sarnold 
3687709Sarnold /*
3697872Sarnold  * addmsg:
3707872Sarnold  *	Add things to the current message
3717709Sarnold  */
3727872Sarnold /* VARARGS1 */
3737872Sarnold addmsg(fmt, args)
3747872Sarnold char	*fmt;
3757872Sarnold int	args;
3767872Sarnold {
3777872Sarnold     doadd(fmt, &args);
3787872Sarnold }
3797709Sarnold 
3807872Sarnold /*
3817872Sarnold  * endmsg:
38212163Sarnold  *	Display a new msg.
3837872Sarnold  */
38412316Sarnold 
38512316Sarnold int	Lineno = 0;
38612316Sarnold 
3877872Sarnold endmsg()
3887709Sarnold {
38912163Sarnold     register int	len;
39012163Sarnold     register char	*mp, *omp;
39112316Sarnold     static int		lastline = 0;
39212163Sarnold 
3937872Sarnold     /*
39412316Sarnold      * All messages should start with uppercase
3957872Sarnold      */
39612316Sarnold     mvaddch(lastline + Y_MSG_START, SCORE_X, ' ');
3977872Sarnold     if (islower(Msgbuf[0]) && Msgbuf[1] != ')')
3987872Sarnold 	Msgbuf[0] = toupper(Msgbuf[0]);
39912163Sarnold     mp = Msgbuf;
40012163Sarnold     len = strlen(mp);
40112330Sarnold     if (len / MSG_X + Lineno >= MSG_Y) {
40212330Sarnold 	while (Lineno < MSG_Y) {
40312330Sarnold 	    wmove(Msgwin, Lineno++, 0);
40412330Sarnold 	    wclrtoeol(Msgwin);
40512330Sarnold 	}
40612316Sarnold 	Lineno = 0;
40712330Sarnold     }
40812316Sarnold     mvaddch(Lineno + Y_MSG_START, SCORE_X, '*');
40912316Sarnold     lastline = Lineno;
41012163Sarnold     do {
41112316Sarnold 	mvwaddstr(Msgwin, Lineno, 0, mp);
41212163Sarnold 	if ((len = strlen(mp)) > MSG_X) {
41312163Sarnold 	    omp = mp;
41412163Sarnold 	    for (mp = &mp[MSG_X-1]; *mp != ' '; mp--)
41512163Sarnold 	    	continue;
41612163Sarnold 	    while (*mp == ' ')
41712163Sarnold 		mp--;
41812163Sarnold 	    mp++;
41912316Sarnold 	    wmove(Msgwin, Lineno, mp - omp);
42012163Sarnold 	    wclrtoeol(Msgwin);
42112163Sarnold 	}
42212316Sarnold 	if (++Lineno >= MSG_Y)
42312316Sarnold 	    Lineno = 0;
42412163Sarnold     } while (len > MSG_X);
42512163Sarnold     wclrtoeol(Msgwin);
42612330Sarnold     Mpos = len;
4277872Sarnold     Newpos = 0;
42812163Sarnold     wrefresh(Msgwin);
4297872Sarnold     refresh();
43012163Sarnold     wrefresh(Msgwin);
4317872Sarnold }
4327709Sarnold 
4337872Sarnold /*
4347872Sarnold  * doadd:
4357872Sarnold  *	Perform an add onto the message buffer
4367872Sarnold  */
4377872Sarnold doadd(fmt, args)
4387872Sarnold char	*fmt;
4397872Sarnold int	*args;
4407872Sarnold {
4417872Sarnold     static FILE	junk;
4427872Sarnold 
4437872Sarnold     /*
4447872Sarnold      * Do the printf into Msgbuf
4457872Sarnold      */
4467872Sarnold     junk._flag = _IOWRT + _IOSTRG;
4477872Sarnold     junk._ptr = &Msgbuf[Newpos];
4487872Sarnold     junk._cnt = 32767;
4497872Sarnold     _doprnt(fmt, args, &junk);
4507872Sarnold     putc('\0', &junk);
4517872Sarnold     Newpos = strlen(Msgbuf);
4527709Sarnold }
4537709Sarnold 
4547872Sarnold /*
45512316Sarnold  * do_wait:
45612316Sarnold  *	Wait for the user to type ' ' before doing anything else
45712316Sarnold  */
45812316Sarnold do_wait()
45912316Sarnold {
46012316Sarnold     register int line;
46112316Sarnold     static char prompt[] = { '-', '-', 'M', 'o', 'r', 'e', '-', '-', '\0' };
46212316Sarnold 
46312316Sarnold     if (Mpos + sizeof prompt < MSG_X)
46412316Sarnold 	wmove(Msgwin, Lineno > 0 ? Lineno - 1 : MSG_Y - 1, Mpos);
46512316Sarnold     else {
46612316Sarnold 	mvwaddch(Msgwin, Lineno, 0, ' ');
46712316Sarnold 	wclrtoeol(Msgwin);
46812316Sarnold 	if (++Lineno >= MSG_Y)
46912316Sarnold 	    Lineno = 0;
47012316Sarnold     }
47112316Sarnold     waddstr(Msgwin, prompt);
47212316Sarnold     wrefresh(Msgwin);
47312316Sarnold     wait_for(' ');
47412316Sarnold }
47512316Sarnold 
47612316Sarnold /*
4777872Sarnold  * wait_for
4787872Sarnold  *	Sit around until the guy types the right key
4797872Sarnold  */
4807872Sarnold wait_for(ch)
4817872Sarnold register char	ch;
4827872Sarnold {
4837872Sarnold     register char	c;
4847709Sarnold 
4857872Sarnold     if (ch == '\n')
4867872Sarnold 	while ((c = readchar()) != '\n')
4877872Sarnold 	    continue;
4887872Sarnold     else
4897872Sarnold 	while (readchar() != ch)
4907872Sarnold 	    continue;
4917872Sarnold }
4927709Sarnold 
4937872Sarnold /*
4947872Sarnold  * readchar:
4957872Sarnold  *	Reads and returns a character, checking for gross input errors
4967872Sarnold  */
4977872Sarnold readchar()
4987872Sarnold {
4997872Sarnold     register int	cnt, y, x;
5007872Sarnold     auto char		c;
5017709Sarnold 
5027872Sarnold over:
5037872Sarnold     cnt = 0;
5047872Sarnold     while (read(0, &c, 1) <= 0)
505*41186Sbostic 	if (cnt++ > 100) {	/* if we are getting infinite EOFs */
506*41186Sbostic 		bye();		/* quit the game */
507*41186Sbostic 		exit(1);
508*41186Sbostic 	}
5097872Sarnold     if (c == CTRL(L)) {
5107872Sarnold 	wrefresh(curscr);
5117872Sarnold 	goto over;
5127872Sarnold     }
5137872Sarnold     if (c == '\r')
5147872Sarnold 	return '\n';
5157872Sarnold     else
5167872Sarnold 	return c;
5177872Sarnold }
5187872Sarnold 
5197872Sarnold /*
5207872Sarnold  * getline:
5217872Sarnold  *      Reads the next line up to '\n' or EOF.  Multiple spaces are
5227872Sarnold  *	compressed to one space; a space is inserted before a ','
5237872Sarnold  */
5247872Sarnold char *
5257872Sarnold getline()
5267872Sarnold {
5277872Sarnold     register char	*sp;
5287872Sarnold     register int	c, oy, ox;
52912163Sarnold     register WINDOW	*oscr;
5307872Sarnold 
53112163Sarnold     oscr = stdscr;
53212163Sarnold     stdscr = Msgwin;
5337872Sarnold     getyx(stdscr, oy, ox);
5347872Sarnold     refresh();
5357872Sarnold     /*
5367872Sarnold      * loop reading in the string, and put it in a temporary buffer
5377872Sarnold      */
5387872Sarnold     for (sp = linebuf; (c = readchar()) != '\n'; clrtoeol(), refresh()) {
5397872Sarnold 	if (c == -1)
5407872Sarnold 	    continue;
5417872Sarnold 	else if (c == erasechar()) {	/* process erase character */
5427872Sarnold 	    if (sp > linebuf) {
5437872Sarnold 		register int i;
5447872Sarnold 
5457872Sarnold 		sp--;
5467872Sarnold 		for (i = strlen(unctrl(*sp)); i; i--)
5477872Sarnold 		    addch('\b');
5487872Sarnold 	    }
5497872Sarnold 	    continue;
5507872Sarnold 	}
5517872Sarnold 	else if (c == killchar()) {	/* process kill character */
5527872Sarnold 	    sp = linebuf;
5537872Sarnold 	    move(oy, ox);
5547872Sarnold 	    continue;
5557872Sarnold 	}
5567872Sarnold 	else if (sp == linebuf && c == ' ')
5577872Sarnold 	    continue;
5587872Sarnold 	if (sp >= &linebuf[LINESIZE-1] || !(isprint(c) || c == ' '))
5597872Sarnold 	    putchar(CTRL(G));
5607872Sarnold 	else {
5617872Sarnold 	    if (islower(c))
5627872Sarnold 		c = toupper(c);
5637872Sarnold 	    *sp++ = c;
5647872Sarnold 	    addstr(unctrl(c));
5657872Sarnold 	    Mpos++;
5667872Sarnold 	}
5677872Sarnold     }
5687872Sarnold     *sp = '\0';
56912163Sarnold     stdscr = oscr;
5707872Sarnold     return linebuf;
5717872Sarnold }
57214910Sarnold 
573*41186Sbostic rint()
574*41186Sbostic {
575*41186Sbostic 	bye();
576*41186Sbostic 	exit(1);
577*41186Sbostic }
578*41186Sbostic 
57914910Sarnold /*
58014910Sarnold  * bye:
58114910Sarnold  *	Leave the program, cleaning things up as we go.
58214910Sarnold  */
58314910Sarnold bye()
58414910Sarnold {
58514910Sarnold 	signal(SIGINT, SIG_IGN);
58614910Sarnold 	mvcur(0, COLS - 1, LINES - 1, 0);
58714910Sarnold 	fflush(stdout);
58814910Sarnold 	endwin();
58914910Sarnold 	putchar('\n');
59014910Sarnold }
591