1 /* $NetBSD: menuutils.c,v 1.4 2014/04/06 19:11:26 jakllsch Exp $ */
4 * Copyright (c) 1996, 1997
5 * Matthias Drochner. All rights reserved.
6 * Copyright (c) 1996, 1997
7 * Perry E. Metzger. All rights reserved.
9 * Jason R. Thorpe. All rights reserved
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. All advertising materials mentioning features or use of this software
20 * must display the following acknowledgements:
21 * This product includes software developed for the NetBSD Project
22 * by Matthias Drochner.
23 * This product includes software developed for the NetBSD Project
24 * by Perry E. Metzger.
25 * 4. The names of the authors may not be used to endorse or promote products
26 * derived from this software without specific prior written permission.
28 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
29 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
30 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
31 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
33 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
37 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 #include <lib/libkern/libkern.h>
41 #include <lib/libsa/stand.h>
51 options
= gettrailer(arg
);
53 for (i
= 0; commands
[i
].c_name
!= NULL
; i
++) {
54 if (strcmp(arg
, commands
[i
].c_name
) == 0) {
55 (*commands
[i
].c_fn
)(options
);
60 printf("unknown command\n");
69 while(1); /* This should never return. */
72 /* Derived from libsa gets(). */
74 editline(char *buf
, size_t size
, char *input
)
76 int c
, i
, pos
, len
= 0;
78 /* If an initial input has been given, copy and print this first. */
80 while (*input
&& len
< size
- 1)
81 putchar(buf
[len
++] = *input
++);
90 case 0x4b00: /* Left arrow: move cursor to left. */
96 case 0x4d00: /* Right arrow: move cursor to right. */
97 if (pos
< len
) putchar(buf
[pos
++]);
101 case 'b' & 037: /* Ctrl+B: move cursor to left. */
107 case 'f' & 037: /* Ctrl+F: move cursor to right. */
108 if (pos
< len
) putchar(buf
[pos
++]);
110 case 'a' & 037: /* Ctrl+A: move cursor to start of line. */
111 for ( ; pos
> 0; pos
--) putchar('\b');
113 case 'e' & 037: /* Ctrl+E: move cursor to end of line. */
114 for ( ; pos
< len
; pos
++) putchar(buf
[pos
]);
116 case '\n': /* Enter: return line. */
118 for ( ; pos
< len
; pos
++) putchar(buf
[pos
]);
125 case '\b': /* Backspace: erase character before cursor. */
131 for (i
= pos
; i
< len
; i
++)
132 putchar(buf
[i
] = buf
[i
+ 1]);
134 for (i
= pos
; i
< len
; i
++) putchar('\b');
138 case 'r' & 037: /* Ctrl+R: reprint line. */
140 for (i
= 0; i
< len
; i
++) putchar(buf
[i
]);
141 for (i
= len
; i
> pos
; i
--) putchar('\b');
146 case 'u' & 037: /* Ctrl+U: clear entire line. */
148 for ( ; pos
> 0; pos
--) putchar('\b');
149 for ( ; pos
< len
; pos
++) putchar(' ');
150 for ( ; pos
> 0; pos
--) putchar('\b');
153 case '\a': /* Ctrl+G: sound bell but do not store character. */
156 case '\t': /* Tab: convert to single space. */
159 default: /* Insert character at cursor position. */
160 if (len
< size
- 1) {
161 for (i
= len
; i
> pos
; i
--)
167 for (i
= pos
; i
< len
; i
++) putchar(buf
[i
]);
168 for (i
= pos
; i
< len
; i
++) putchar('\b');
179 prompt(int allowreturn
)
180 #endif /* defined(__minix) */
189 #if !defined(__minix)
192 editline(input
, sizeof(input
), NULL
);
193 #endif /* !defined(__minix) */
196 * Skip leading whitespace.
201 if (allowreturn
&& !strcmp(c
, "menu"))
203 #endif /* defined(__minix) */