minor cleanups
[unix-history] / usr / src / old / lib2648 / readline.c
CommitLineData
97e3edfb
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
7#ifndef lint
8static char sccsid[] = "@(#)readline.c 5.1 (Berkeley) %G%";
9#endif not lint
10
b61b76c5
RC
11/*
12 * Read a line from the keyboard in the message line. The line
13 * goes into caller provided buffer msg, whos size is maxlen bytes.
14 */
15
16#include "2648.h"
17
18readline(prompt, msg, maxlen)
19char *prompt;
20char *msg;
21int maxlen;
22{
23 register char c;
24 register char *cp;
25 int oldx, oldy;
26 int oldcuron;
27 int oldquiet;
28 extern int QUIET;
29
30 oldx = _curx; oldy = _cury;
31 oldcuron = _cursoron;
32 areaclear(4, 4, 4+8, 719);
33 setset();
34 zoomout();
35 curon();
36 movecurs(4, 4);
37 texton();
38
39 oldquiet = QUIET;
40 QUIET = 0;
41 outstr(prompt);
42 if (oldquiet)
43 outstr("\r\n");
44 QUIET = oldquiet;
45
46 for (cp=msg; ; cp) {
47 fflush(stdout);
48 c = getchar();
49 switch (c) {
50 case '\n':
51 case '\r':
52 case ESC:
53 *cp++ = 0;
54 textoff();
55 movecurs(oldx, oldy);
56 if (oldcuron == 0)
57 curoff();
58 return;
59 case '\b':
60 if (--cp >= msg)
61 outchar(c);
62 else
63 cp = msg;
64 break;
65 default:
66 *cp++ = c;
67 outstr(rdchar(c));
68 if (cp-msg >= maxlen)
69 error("line too long");
70 }
71 }
72}