diff options
Diffstat (limited to 'lib/libedit/TEST/test.c')
-rw-r--r-- | lib/libedit/TEST/test.c | 337 |
1 files changed, 180 insertions, 157 deletions
diff --git a/lib/libedit/TEST/test.c b/lib/libedit/TEST/test.c index 097055a742c0..d7b4df52336f 100644 --- a/lib/libedit/TEST/test.c +++ b/lib/libedit/TEST/test.c @@ -34,15 +34,17 @@ * SUCH DAMAGE. */ +#include <sys/cdefs.h> #ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1992, 1993\n\ - The Regents of the University of California. All rights reserved.\n"; +__COPYRIGHT("@(#) Copyright (c) 1992, 1993\n\ + The Regents of the University of California. All rights reserved.\n"); #endif /* not lint */ #if !defined(lint) && !defined(SCCSID) static char sccsid[] = "@(#)test.c 8.1 (Berkeley) 6/4/93"; #endif /* not lint && not SCCSID */ +__RCSID("$NetBSD: test.c,v 1.8 1999/09/21 00:07:03 lukem Exp $"); +__FBSDID("$FreeBSD$"); /* * test.c: A little test program @@ -63,179 +65,200 @@ static char sccsid[] = "@(#)test.c 8.1 (Berkeley) 6/4/93"; static int continuation = 0; static EditLine *el = NULL; +static u_char complete(EditLine *, int); + int main(int, char **); +static char *prompt(EditLine *); +static void sig(int); + static char * -/*ARGSUSED*/ -prompt(el) - EditLine *el; +prompt(EditLine *el) { - static char a[] = "Edit$"; - static char b[] = "Edit>"; - return continuation ? b : a; + static char a[] = "Edit$"; + static char b[] = "Edit>"; + + return (continuation ? b : a); } static void -sig(i) - int i; +sig(int i) { - (void) fprintf(stderr, "Got signal %d.\n", i); - el_reset(el); + + (void) fprintf(stderr, "Got signal %d.\n", i); + el_reset(el); } static unsigned char -/*ARGSUSED*/ -complete(el, ch) - EditLine *el; - int ch; +complete(EditLine *el, int ch) { - DIR *dd = opendir("."); - struct dirent *dp; - const char* ptr; - const LineInfo *lf = el_line(el); - int len; - - /* - * Find the last word - */ - for (ptr = lf->cursor - 1; !isspace(*ptr) && ptr > lf->buffer; ptr--) - continue; - len = lf->cursor - ++ptr; - - for (dp = readdir(dd); dp != NULL; dp = readdir(dd)) { - if (len > strlen(dp->d_name)) - continue; - if (strncmp(dp->d_name, ptr, len) == 0) { - closedir(dd); - if (el_insertstr(el, &dp->d_name[len]) == -1) - return CC_ERROR; - else - return CC_REFRESH; + DIR *dd = opendir("."); + struct dirent *dp; + const char* ptr; + const LineInfo *lf = el_line(el); + int len; + + /* + * Find the last word + */ + for (ptr = lf->cursor - 1; !isspace(*ptr) && ptr > lf->buffer; ptr--) + continue; + len = lf->cursor - ++ptr; + + for (dp = readdir(dd); dp != NULL; dp = readdir(dd)) { + if (len > strlen(dp->d_name)) + continue; + if (strncmp(dp->d_name, ptr, len) == 0) { + closedir(dd); + if (el_insertstr(el, &dp->d_name[len]) == -1) + return (CC_ERROR); + else + return (CC_REFRESH); + } } - } - closedir(dd); - return CC_ERROR; + closedir(dd); + return (CC_ERROR); } int -/*ARGSUSED*/ -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { - int num; - const char *buf; - Tokenizer *tok; - History *hist; - - (void) signal(SIGINT, sig); - (void) signal(SIGQUIT, sig); - (void) signal(SIGHUP, sig); - (void) signal(SIGTERM, sig); - - hist = history_init(); /* Init the builtin history */ - history(hist, H_EVENT, 100); /* Remember 100 events */ - - tok = tok_init(NULL); /* Initialize the tokenizer */ - - el = el_init(*argv, stdin, stdout); /* Initialize editline */ - - el_set(el, EL_EDITOR, "vi"); /* Default editor is vi */ - el_set(el, EL_SIGNAL, 1); /* Handle signals gracefully */ - el_set(el, EL_PROMPT, prompt); /* Set the prompt function */ - - /* Tell editline to use this history interface */ - el_set(el, EL_HIST, history, hist); - - /* Add a user-defined function */ - el_set(el, EL_ADDFN, "ed-complete", "Complete argument", complete); - - el_set(el, EL_BIND, "^I", "ed-complete", NULL);/* Bind tab to it */ - - /* - * Bind j, k in vi command mode to previous and next line, instead - * of previous and next history. - */ - el_set(el, EL_BIND, "-a", "k", "ed-prev-line", NULL); - el_set(el, EL_BIND, "-a", "j", "ed-next-line", NULL); - - /* - * Source the user's defaults file. - */ - el_source(el, NULL); - - while ((buf = el_gets(el, &num)) != NULL && num != 0) { - int ac; - char **av; + int num; + const char *buf; + Tokenizer *tok; + int lastevent = 0, ncontinuation; + History *hist; + HistEvent ev; + + (void) signal(SIGINT, sig); + (void) signal(SIGQUIT, sig); + (void) signal(SIGHUP, sig); + (void) signal(SIGTERM, sig); + + hist = history_init(); /* Init the builtin history */ + /* Remember 100 events */ + history(hist, &ev, H_SETSIZE, 100); + + tok = tok_init(NULL); /* Initialize the tokenizer */ + + /* Initialize editline */ + el = el_init(*argv, stdin, stdout, stderr); + + el_set(el, EL_EDITOR, "vi"); /* Default editor is vi */ + el_set(el, EL_SIGNAL, 1); /* Handle signals gracefully */ + el_set(el, EL_PROMPT, prompt); /* Set the prompt function */ + + /* Tell editline to use this history interface */ + el_set(el, EL_HIST, history, hist); + + /* Add a user-defined function */ + el_set(el, EL_ADDFN, "ed-complete", "Complete argument", complete); + + /* Bind tab to it */ + el_set(el, EL_BIND, "^I", "ed-complete", NULL); + + /* + * Bind j, k in vi command mode to previous and next line, instead + * of previous and next history. + */ + el_set(el, EL_BIND, "-a", "k", "ed-prev-line", NULL); + el_set(el, EL_BIND, "-a", "j", "ed-next-line", NULL); + + /* + * Source the user's defaults file. + */ + el_source(el, NULL); + + while ((buf = el_gets(el, &num)) != NULL && num != 0) { + int ac; + char **av; #ifdef DEBUG - (void) fprintf(stderr, "got %d %s", num, buf); + (void) fprintf(stderr, "got %d %s", num, buf); #endif - if (!continuation && num == 1) - continue; - if (tok_line(tok, buf, &ac, &av) > 0) { - history(hist, continuation ? H_ADD : H_ENTER, buf); - continuation = 1; - continue; - } - history(hist, continuation ? H_ADD : H_ENTER, buf); - - continuation = 0; - - if (strcmp(av[0], "history") == 0) { - const struct HistEvent *he; - - switch (ac) { - case 1: - for (he = history(hist, H_LAST); he; - he = history(hist, H_PREV)) - (void) fprintf(stdout, "%4d %s", he->num, he->str); - break; - - case 2: - if (strcmp(av[1], "clear") == 0) - history(hist, H_CLEAR); - else - goto badhist; - break; - - case 3: - if (strcmp(av[1], "load") == 0) - history(hist, H_LOAD, av[2]); - else if (strcmp(av[1], "save") == 0) - history(hist, H_SAVE, av[2]); - break; - - badhist: - default: - (void) fprintf(stderr, "Bad history arguments\n"); - break; - } - } - else if (el_parse(el, ac, av) == -1) { - switch (fork()) { - case 0: - execvp(av[0], av); - perror(av[0]); - _exit(1); - /*NOTREACHED*/ - break; - - case -1: - perror("fork"); - break; - - default: - if (wait(&num) == -1) - perror("wait"); - (void) fprintf(stderr, "Exit %x\n", num); - break; - } + if (!continuation && num == 1) + continue; + + if (tok_line(tok, buf, &ac, &av) > 0) + ncontinuation = 1; + +#if 0 + if (continuation) { + /* + * Append to the right event in case the user + * moved around in history. + */ + if (history(hist, &ev, H_SET, lastevent) == -1) + err(1, "%d: %s\n", lastevent, ev.str); + history(hist, &ev, H_ADD , buf); + } else { + history(hist, &ev, H_ENTER, buf); + lastevent = ev.num; + } +#else + /* Simpler */ + history(hist, &ev, continuation ? H_APPEND : H_ENTER, buf); +#endif + + continuation = ncontinuation; + ncontinuation = 0; + + if (strcmp(av[0], "history") == 0) { + int rv; + + switch (ac) { + case 1: + for (rv = history(hist, &ev, H_LAST); rv != -1; + rv = history(hist, &ev, H_PREV)) + (void) fprintf(stdout, "%4d %s", + ev.num, ev.str); + break; + + case 2: + if (strcmp(av[1], "clear") == 0) + history(hist, &ev, H_CLEAR); + else + goto badhist; + break; + + case 3: + if (strcmp(av[1], "load") == 0) + history(hist, &ev, H_LOAD, av[2]); + else if (strcmp(av[1], "save") == 0) + history(hist, &ev, H_SAVE, av[2]); + break; + + badhist: + default: + (void) fprintf(stderr, + "Bad history arguments\n"); + break; + } + } else if (el_parse(el, ac, av) == -1) { + switch (fork()) { + case 0: + execvp(av[0], av); + perror(av[0]); + _exit(1); + /*NOTREACHED*/ + break; + + case -1: + perror("fork"); + break; + + default: + if (wait(&num) == -1) + perror("wait"); + (void) fprintf(stderr, "Exit %x\n", num); + break; + } + } + + tok_reset(tok); } - tok_reset(tok); - } - el_end(el); - tok_end(tok); - history_end(hist); + el_end(el); + tok_end(tok); + history_end(hist); - return 0; + return (0); } |