123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- #include "config.h"
- #if !defined(lint) && !defined(SCCSID)
- #if 0
- static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/4/93";
- #else
- __RCSID("$NetBSD: parse.c,v 1.15 2002/03/18 16:00:56 christos Exp $");
- #endif
- #endif
- #include "el.h"
- #include "tokenizer.h"
- #include <stdlib.h>
- private const struct {
- const char *name;
- int (*func)(EditLine *, int, const char **);
- } cmds[] = {
- { "bind", map_bind },
- { "echotc", term_echotc },
- { "edit", el_editmode },
- { "history", hist_list },
- { "telltc", term_telltc },
- { "settc", term_settc },
- { "setty", tty_stty },
- { NULL, NULL }
- };
- protected int
- parse_line(EditLine *el, const char *line)
- {
- 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);
- }
- public int
- el_parse(EditLine *el, int argc, const char *argv[])
- {
- 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);
- }
- protected int
- 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';
- break;
- case 'b':
- c = '\010';
- break;
- case 't':
- c = '\011';
- break;
- case 'n':
- c = '\012';
- break;
- case 'v':
- c = '\013';
- break;
- case 'f':
- c = '\014';
- break;
- case 'r':
- c = '\015';
- break;
- case 'e':
- c = '\033';
- 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;
- }
- 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);
- }
- protected char *
- 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;
- }
- }
- protected int
- parse_cmd(EditLine *el, const char *cmd)
- {
- 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);
- }
|