summaryrefslogtreecommitdiffstats
path: root/lib/libedit/parse.c
diff options
context:
space:
mode:
authorotto <otto@openbsd.org>2003-10-31 08:42:23 +0000
committerotto <otto@openbsd.org>2003-10-31 08:42:23 +0000
commitd484b7d03ace7dfad66bf1845501ed21cdb16b83 (patch)
tree7217919f9a70564b29131d02c66a64d9abcfe577 /lib/libedit/parse.c
parentregen. (diff)
downloadwireguard-openbsd-d484b7d03ace7dfad66bf1845501ed21cdb16b83.tar.xz
wireguard-openbsd-d484b7d03ace7dfad66bf1845501ed21cdb16b83.zip
Update to NetBSD libedit (from Oct 1, 2003), adding some string
cleaning and history bug fixes. The code includes GNU libreadline functionality, but the corresponding header files are not installed, since some libreadline functions are missing. There are some minor API changes, notably: old: EditLine *el_init(const char *, FILE *, FILE *); new: EditLine *el_init(const char *, FILE *, FILE *, FILE *); old: HistEvent *history(History *h, int op, ...); new: int history(History *h, HistEvent *ev, int op, ...); plus some changes in operation names. See editline(3) for details. Tested by djm@, mouring@, jmc@. ok deraadt@
Diffstat (limited to 'lib/libedit/parse.c')
-rw-r--r--lib/libedit/parse.c312
1 files changed, 158 insertions, 154 deletions
diff --git a/lib/libedit/parse.c b/lib/libedit/parse.c
index 3720b9a46be..a884e8bc866 100644
--- a/lib/libedit/parse.c
+++ b/lib/libedit/parse.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: parse.c,v 1.6 2003/06/02 20:18:40 millert Exp $ */
-/* $NetBSD: parse.c,v 1.5 1997/01/11 09:57:08 lukem Exp $ */
+/* $OpenBSD: parse.c,v 1.7 2003/10/31 08:42:24 otto Exp $ */
+/* $NetBSD: parse.c,v 1.17 2003/08/07 16:44:32 agc Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -33,11 +33,12 @@
* SUCH DAMAGE.
*/
+#include "config.h"
#if !defined(lint) && !defined(SCCSID)
#if 0
static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/4/93";
#else
-static const char rcsid[] = "$OpenBSD: parse.c,v 1.6 2003/06/02 20:18:40 millert Exp $";
+static const char rcsid[] = "$OpenBSD: parse.c,v 1.7 2003/10/31 08:42:24 otto Exp $";
#endif
#endif /* not lint && not SCCSID */
@@ -48,26 +49,28 @@ static const char rcsid[] = "$OpenBSD: parse.c,v 1.6 2003/06/02 20:18:40 millert
*
* bind
* echotc
+ * edit
* gettc
* history
* settc
* setty
*/
-#include "sys.h"
#include "el.h"
#include "tokenizer.h"
+#include <stdlib.h>
-private struct {
- char *name;
- int (*func)(EditLine *, int, char **);
+private const struct {
+ const char *name;
+ int (*func)(EditLine *, int, const char **);
} cmds[] = {
- { "bind", map_bind },
- { "echotc", term_echotc },
- { "history", hist_list },
- { "telltc", term_telltc },
- { "settc", term_settc },
- { "setty", tty_stty },
- { NULL, NULL }
+ { "bind", map_bind },
+ { "echotc", term_echotc },
+ { "edit", el_editmode },
+ { "history", hist_command },
+ { "telltc", term_telltc },
+ { "settc", term_settc },
+ { "setty", tty_stty },
+ { NULL, NULL }
};
@@ -75,51 +78,58 @@ private struct {
* Parse a line and dispatch it
*/
protected int
-parse_line(el, line)
- EditLine *el;
- const char *line;
+parse_line(EditLine *el, const char *line)
{
- char **argv;
- int argc;
- Tokenizer *tok;
-
- tok = tok_init(NULL);
- tok_line(tok, line, &argc, &argv);
- argc = el_parse(el, argc, argv);
- tok_end(tok);
- return argc;
+ const char **argv;
+ int argc;
+ Tokenizer *tok;
+
+ tok = tok_init(NULL);
+ tok_line(tok, line, &argc, &argv);
+ argc = el_parse(el, argc, argv);
+ tok_end(tok);
+ return (argc);
}
+
/* el_parse():
* Command dispatcher
*/
public int
-el_parse(el, argc, argv)
- EditLine *el;
- int argc;
- char *argv[];
+el_parse(EditLine *el, int argc, const char *argv[])
{
- char *ptr;
- int i;
-
- if (argc < 1)
- return -1;
- ptr = strchr(argv[0], ':');
- if (ptr != NULL) {
- *ptr++ = '\0';
- if (! el_match(el->el_prog, argv[0]))
- return 0;
- }
- else
- ptr = argv[0];
-
- for (i = 0; cmds[i].name != NULL; i++)
- if (strcmp(cmds[i].name, ptr) == 0) {
- i = (*cmds[i].func)(el, argc, argv);
- return -i;
- }
-
- return -1;
+ const char *ptr;
+ int i;
+
+ if (argc < 1)
+ return (-1);
+ ptr = strchr(argv[0], ':');
+ if (ptr != NULL) {
+ char *tprog;
+ size_t l;
+
+ if (ptr == argv[0])
+ return (0);
+ l = ptr - argv[0] - 1;
+ tprog = (char *) el_malloc(l + 1);
+ if (tprog == NULL)
+ return (0);
+ (void) strncpy(tprog, argv[0], l);
+ tprog[l] = '\0';
+ ptr++;
+ l = el_match(el->el_prog, tprog);
+ el_free(tprog);
+ if (!l)
+ return (0);
+ } else
+ ptr = argv[0];
+
+ for (i = 0; cmds[i].name != NULL; i++)
+ if (strcmp(cmds[i].name, ptr) == 0) {
+ i = (*cmds[i].func) (el, argc, argv);
+ return (-i);
+ }
+ return (-1);
}
@@ -128,125 +138,119 @@ el_parse(el, argc, argv)
* the appropriate character or -1 if the escape is not valid
*/
protected int
-parse__escape(ptr)
- const char ** const ptr;
+parse__escape(const char **const ptr)
{
- const char *p;
- int c;
-
- p = *ptr;
-
- if (p[1] == 0)
- return -1;
-
- if (*p == '\\') {
- p++;
- switch (*p) {
- case 'a':
- c = '\007'; /* Bell */
- break;
- case 'b':
- c = '\010'; /* Backspace */
- break;
- case 't':
- c = '\011'; /* Horizontal Tab */
- break;
- case 'n':
- c = '\012'; /* New Line */
- break;
- case 'v':
- c = '\013'; /* Vertical Tab */
- break;
- case 'f':
- c = '\014'; /* Form Feed */
- break;
- case 'r':
- c = '\015'; /* Carriage Return */
- break;
- case 'e':
- c = '\033'; /* Escape */
- break;
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- {
- int cnt, ch;
-
- for (cnt = 0, c = 0; cnt < 3; cnt++) {
- ch = *p++;
- if (ch < '0' || ch > '7') {
- p--;
+ const char *p;
+ int c;
+
+ p = *ptr;
+
+ if (p[1] == 0)
+ return (-1);
+
+ if (*p == '\\') {
+ p++;
+ switch (*p) {
+ case 'a':
+ c = '\007'; /* Bell */
+ break;
+ case 'b':
+ c = '\010'; /* Backspace */
+ break;
+ case 't':
+ c = '\011'; /* Horizontal Tab */
+ break;
+ case 'n':
+ c = '\012'; /* New Line */
+ break;
+ case 'v':
+ c = '\013'; /* Vertical Tab */
+ break;
+ case 'f':
+ c = '\014'; /* Form Feed */
+ break;
+ case 'r':
+ c = '\015'; /* Carriage Return */
+ break;
+ case 'e':
+ c = '\033'; /* Escape */
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ {
+ int cnt, ch;
+
+ for (cnt = 0, c = 0; cnt < 3; cnt++) {
+ ch = *p++;
+ if (ch < '0' || ch > '7') {
+ p--;
+ break;
+ }
+ c = (c << 3) | (ch - '0');
+ }
+ if ((c & 0xffffff00) != 0)
+ return (-1);
+ --p;
break;
- }
- c = (c << 3) | (ch - '0');
}
- if ((c & 0xffffff00) != 0)
- return -1;
- --p;
- }
- break;
- default:
- c = *p;
- break;
- }
- }
- else if (*p == '^' && isalpha((unsigned char) p[1])) {
- p++;
- c = (*p == '?') ? '\177' : (*p & 0237);
- }
- else
- c = *p;
- *ptr = ++p;
- return c;
+ default:
+ c = *p;
+ break;
+ }
+ } else if (*p == '^' && isalpha((unsigned char) p[1])) {
+ p++;
+ c = (*p == '?') ? '\177' : (*p & 0237);
+ } else
+ c = *p;
+ *ptr = ++p;
+ return (c);
}
-
/* parse__string():
* Parse the escapes from in and put the raw string out
*/
protected char *
-parse__string(out, in)
- char *out;
- const char *in;
+parse__string(char *out, const char *in)
{
- char *rv = out;
- int n;
- for (;;)
- switch (*in) {
- case '\0':
- *out = '\0';
- return rv;
-
- case '\\':
- case '^':
- if ((n = parse__escape(&in)) == -1)
- return NULL;
- *out++ = n;
- break;
-
- default:
- *out++ = *in++;
- break;
- }
+ char *rv = out;
+ int n;
+
+ for (;;)
+ switch (*in) {
+ case '\0':
+ *out = '\0';
+ return (rv);
+
+ case '\\':
+ case '^':
+ if ((n = parse__escape(&in)) == -1)
+ return (NULL);
+ *out++ = n;
+ break;
+
+ default:
+ *out++ = *in++;
+ break;
+ }
}
+
/* parse_cmd():
* Return the command number for the command string given
* or -1 if one is not found
*/
protected int
-parse_cmd(el, cmd)
- EditLine *el;
- const char *cmd;
+parse_cmd(EditLine *el, const char *cmd)
{
- el_bindings_t *b;
+ el_bindings_t *b;
- for (b = el->el_map.help; b->name != NULL; b++)
- if (strcmp(b->name, cmd) == 0)
- return b->func;
- return -1;
+ for (b = el->el_map.help; b->name != NULL; b++)
+ if (strcmp(b->name, cmd) == 0)
+ return (b->func);
+ return (-1);
}