Commit | Line | Data |
---|---|---|
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 | |
8 | static 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 | ||
18 | readline(prompt, msg, maxlen) | |
19 | char *prompt; | |
20 | char *msg; | |
21 | int 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 | } |