xref: /csrg-svn/old/lib2648/readline.c (revision 11491)
1*11491Sralph /*	readline.c	4.1	83/03/09	*/
2*11491Sralph /*
3*11491Sralph  * Read a line from the keyboard in the message line.  The line
4*11491Sralph  * goes into caller provided buffer msg, whos size is maxlen bytes.
5*11491Sralph  */
6*11491Sralph 
7*11491Sralph #include "2648.h"
8*11491Sralph 
9*11491Sralph readline(prompt, msg, maxlen)
10*11491Sralph char *prompt;
11*11491Sralph char *msg;
12*11491Sralph int maxlen;
13*11491Sralph {
14*11491Sralph 	register char c;
15*11491Sralph 	register char *cp;
16*11491Sralph 	int oldx, oldy;
17*11491Sralph 	int oldcuron;
18*11491Sralph 	int oldquiet;
19*11491Sralph 	extern int QUIET;
20*11491Sralph 
21*11491Sralph 	oldx = _curx; oldy = _cury;
22*11491Sralph 	oldcuron = _cursoron;
23*11491Sralph 	areaclear(4, 4, 4+8, 719);
24*11491Sralph 	setset();
25*11491Sralph 	zoomout();
26*11491Sralph 	curon();
27*11491Sralph 	movecurs(4, 4);
28*11491Sralph 	texton();
29*11491Sralph 
30*11491Sralph 	oldquiet = QUIET;
31*11491Sralph 	QUIET = 0;
32*11491Sralph 	outstr(prompt);
33*11491Sralph 	if (oldquiet)
34*11491Sralph 		outstr("\r\n");
35*11491Sralph 	QUIET = oldquiet;
36*11491Sralph 
37*11491Sralph 	for (cp=msg; ; cp) {
38*11491Sralph 		fflush(stdout);
39*11491Sralph 		c = getchar();
40*11491Sralph 		switch (c) {
41*11491Sralph 		case '\n':
42*11491Sralph 		case '\r':
43*11491Sralph 		case ESC:
44*11491Sralph 			*cp++ = 0;
45*11491Sralph 			textoff();
46*11491Sralph 			movecurs(oldx, oldy);
47*11491Sralph 			if (oldcuron == 0)
48*11491Sralph 				curoff();
49*11491Sralph 			return;
50*11491Sralph 		case '\b':
51*11491Sralph 			if (--cp >= msg)
52*11491Sralph 				outchar(c);
53*11491Sralph 			else
54*11491Sralph 				cp = msg;
55*11491Sralph 			break;
56*11491Sralph 		default:
57*11491Sralph 			*cp++ = c;
58*11491Sralph 			outstr(rdchar(c));
59*11491Sralph 			if (cp-msg >= maxlen)
60*11491Sralph 				error("line too long");
61*11491Sralph 		}
62*11491Sralph 	}
63*11491Sralph }
64