/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- backsp
- kgets
1 /*
2 * Copyright (c) 2001
3 * The President and Fellows of Harvard College.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the University nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30
31 #include <types.h>
32 #include <lib.h>
33
34 /*
35 * Do a backspace in typed input.
36 * We overwrite the current character with a space in case we're on
37 * a terminal where backspace is nondestructive.
38 */
39 static
40 void
41 backsp(void)
42 {
43 putch('\b');
44 putch(' ');
45 putch('\b');
46 }
47
48 /*
49 * Read a string off the console. Support a few of the more useful
50 * common control characters. Do not include the terminating newline
51 * in the buffer passed back.
52 */
53 void
54 kgets(char *buf, size_t maxlen)
55 {
56 size_t pos = 0;
57 int ch;
58
59 while (1) {
60 ch = getch();
61 if (ch=='\n' || ch=='\r') {
62 putch('\n');
63 break;
64 }
65
66 /* Only allow the normal 7-bit ascii */
67 if (ch>=32 && ch<127 && pos < maxlen-1) {
68 putch(ch);
69 buf[pos++] = ch;
70 }
71 else if ((ch=='\b' || ch==127) && pos>0) {
72 /* backspace */
73 backsp();
74 pos--;
75 }
76 else if (ch==3) {
77 /* ^C - return empty string */
78 putch('^');
79 putch('C');
80 putch('\n');
81 pos = 0;
82 break;
83 }
84 else if (ch==18) {
85 /* ^R - reprint input */
86 buf[pos] = 0;
87 kprintf("^R\n%s", buf);
88 }
89 else if (ch==21) {
90 /* ^U - erase line */
91 while (pos > 0) {
92 backsp();
93 pos--;
94 }
95 }
96 else if (ch==23) {
97 /* ^W - erase word */
98 while (pos > 0 && buf[pos-1]==' ') {
99 backsp();
100 pos--;
101 }
102 while (pos > 0 && buf[pos-1]!=' ') {
103 backsp();
104 pos--;
105 }
106 }
107 else {
108 beep();
109 }
110 }
111
112 buf[pos] = 0;
113 }