summaryrefslogtreecommitdiffstats
path: root/lib/libedit/el.c
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>2001-10-01 08:41:27 +0000
committerobrien <obrien@FreeBSD.org>2001-10-01 08:41:27 +0000
commit90300f853673b3879ab4d6a60683ff69b564c58b (patch)
treef9436ba88ca8f8420af319b0a12dd175381b507b /lib/libedit/el.c
parentf805e363ed51ace3356b37eb173c3d6435c35022 (diff)
downloadFreeBSD-src-90300f853673b3879ab4d6a60683ff69b564c58b.zip
FreeBSD-src-90300f853673b3879ab4d6a60683ff69b564c58b.tar.gz
+ Sync with NetBSD, bringing in feature enhancements.
+ Convert to ANSI-C function definitions + style(9) Submitted by: kris
Diffstat (limited to 'lib/libedit/el.c')
-rw-r--r--lib/libedit/el.c563
1 files changed, 348 insertions, 215 deletions
diff --git a/lib/libedit/el.c b/lib/libedit/el.c
index 8dfc215..0d28e03 100644
--- a/lib/libedit/el.c
+++ b/lib/libedit/el.c
@@ -32,15 +32,15 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $NetBSD: el.c,v 1.20 2000/11/11 22:18:57 christos Exp $
*/
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
#if !defined(lint) && !defined(SCCSID)
-#if 0
static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94";
-#endif
#endif /* not lint && not SCCSID */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
/*
* el.c: EditLine interface functions
@@ -49,106 +49,90 @@ static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94";
#include <sys/types.h>
#include <sys/param.h>
-#include <errno.h>
#include <string.h>
#include <stdlib.h>
-#if __STDC__
-# include <stdarg.h>
-#else
-# include <varargs.h>
-#endif
+#include <stdarg.h>
#include "el.h"
/* el_init():
* Initialize editline and set default parameters.
*/
public EditLine *
-el_init(prog, fin, fout)
- const char *prog;
- FILE *fin, *fout;
+el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr)
{
- EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
-#ifdef DEBUG
- char *tty;
-#endif
-
- if (el == NULL)
- return NULL;
-
- memset(el, 0, sizeof(EditLine));
-
- el->el_infd = fileno(fin);
- el->el_outfile = fout;
- el->el_prog = strdup(prog);
+ EditLine *el = (EditLine *) el_malloc(sizeof(EditLine));
#ifdef DEBUG
- if (issetugid() == 0 && (tty = getenv("DEBUGTTY")) != NULL) {
- el->el_errfile = fopen(tty, "w");
- if (el->el_errfile == NULL) {
- (void) fprintf(stderr, "Cannot open %s (%s).\n",
- tty, strerror(errno));
- return NULL;
- }
- }
- else
+ char *tty;
#endif
- el->el_errfile = stderr;
-
- /*
- * Initialize all the modules. Order is important!!!
- */
- (void) term_init(el);
- (void) tty_init(el);
- (void) key_init(el);
- (void) map_init(el);
- (void) ch_init(el);
- (void) search_init(el);
- (void) hist_init(el);
- (void) prompt_init(el);
- (void) sig_init(el);
- el->el_flags = 0;
- el->data = NULL;
-
- return el;
-} /* end el_init */
+
+ if (el == NULL)
+ return (NULL);
+
+ memset(el, 0, sizeof(EditLine));
+
+ el->el_infd = fileno(fin);
+ el->el_outfile = fout;
+ el->el_errfile = ferr;
+ el->el_prog = strdup(prog);
+
+ /*
+ * Initialize all the modules. Order is important!!!
+ */
+ el->el_flags = 0;
+
+ (void) term_init(el);
+ (void) key_init(el);
+ (void) map_init(el);
+ if (tty_init(el) == -1)
+ el->el_flags |= NO_TTY;
+ (void) ch_init(el);
+ (void) search_init(el);
+ (void) hist_init(el);
+ (void) prompt_init(el);
+ (void) sig_init(el);
+ el->data = NULL;
+
+ return (el);
+}
/* el_end():
* Clean up.
*/
public void
-el_end(el)
- EditLine *el;
+el_end(EditLine *el)
{
- if (el == NULL)
- return;
- el_reset(el);
+ if (el == NULL)
+ return;
- term_end(el);
- tty_end(el);
- key_end(el);
- map_end(el);
- ch_end(el);
- search_end(el);
- hist_end(el);
- prompt_end(el);
- sig_end(el);
+ el_reset(el);
- el_free((ptr_t) el->el_prog);
- el_free((ptr_t) el);
-} /* end el_end */
+ term_end(el);
+ key_end(el);
+ map_end(el);
+ tty_end(el);
+ ch_end(el);
+ search_end(el);
+ hist_end(el);
+ prompt_end(el);
+ sig_end(el);
+
+ el_free((ptr_t) el->el_prog);
+ el_free((ptr_t) el);
+}
/* el_reset():
* Reset the tty and the parser
*/
public void
-el_reset(el)
- EditLine *el;
+el_reset(EditLine *el)
{
- tty_cookedmode(el);
- ch_reset(el); /* XXX: Do we want that? */
+
+ tty_cookedmode(el);
+ ch_reset(el); /* XXX: Do we want that? */
}
@@ -156,127 +140,255 @@ el_reset(el)
* set the editline parameters
*/
public int
-#if __STDC__
el_set(EditLine *el, int op, ...)
-#else
-el_set(va_alist)
- va_dcl
-#endif
{
- va_list va;
- int rv;
-#if __STDC__
- va_start(va, op);
-#else
- EditLine *el;
- int op;
+ va_list va;
+ int rv;
+ va_start(va, op);
+
+ if (el == NULL)
+ return (-1);
+ switch (op) {
+ case EL_PROMPT:
+ case EL_RPROMPT:
+ rv = prompt_set(el, va_arg(va, el_pfunc_t), op);
+ break;
- va_start(va);
- el = va_arg(va, EditLine *);
- op = va_arg(va, int);
-#endif
+ case EL_TERMINAL:
+ rv = term_set(el, va_arg(va, char *));
+ break;
- switch (op) {
- case EL_PROMPT:
- rv = prompt_set(el, va_arg(va, el_pfunc_t));
- break;
-
- case EL_TERMINAL:
- rv = term_set(el, va_arg(va, char *));
- break;
-
- case EL_EDITOR:
- rv = map_set_editor(el, va_arg(va, char *));
- break;
-
- case EL_SIGNAL:
- if (va_arg(va, int))
- el->el_flags |= HANDLE_SIGNALS;
- else
- el->el_flags &= ~HANDLE_SIGNALS;
- rv = 0;
- break;
-
- case EL_BIND:
- case EL_TELLTC:
- case EL_SETTC:
- case EL_ECHOTC:
- case EL_SETTY:
- {
- char *argv[20];
- int i;
- for (i = 1; i < 20; i++)
- if ((argv[i] = va_arg(va, char *)) == NULL)
- break;
-
- switch (op) {
- case EL_BIND:
- argv[0] = "bind";
- rv = map_bind(el, i, argv);
+ case EL_EDITOR:
+ rv = map_set_editor(el, va_arg(va, char *));
break;
- case EL_TELLTC:
- argv[0] = "telltc";
- rv = term_telltc(el, i, argv);
+ case EL_SIGNAL:
+ if (va_arg(va, int))
+ el->el_flags |= HANDLE_SIGNALS;
+ else
+ el->el_flags &= ~HANDLE_SIGNALS;
+ rv = 0;
break;
- case EL_SETTC:
- argv[0] = "settc";
- rv = term_settc(el, i, argv);
+ case EL_BIND:
+ case EL_TELLTC:
+ case EL_SETTC:
+ case EL_ECHOTC:
+ case EL_SETTY:
+ {
+ char *argv[20];
+ int i;
+
+ for (i = 1; i < 20; i++)
+ if ((argv[i] = va_arg(va, char *)) == NULL)
+ break;
+
+ switch (op) {
+ case EL_BIND:
+ argv[0] = "bind";
+ rv = map_bind(el, i, argv);
+ break;
+
+ case EL_TELLTC:
+ argv[0] = "telltc";
+ rv = term_telltc(el, i, argv);
+ break;
+
+ case EL_SETTC:
+ argv[0] = "settc";
+ rv = term_settc(el, i, argv);
+ break;
+
+ case EL_ECHOTC:
+ argv[0] = "echotc";
+ rv = term_echotc(el, i, argv);
+ break;
+
+ case EL_SETTY:
+ argv[0] = "setty";
+ rv = tty_stty(el, i, argv);
+ break;
+
+ default:
+ rv = -1;
+ EL_ABORT((el->el_errfile, "Bad op %d\n", op));
+ break;
+ }
break;
+ }
+
+ case EL_ADDFN:
+ {
+ char *name = va_arg(va, char *);
+ char *help = va_arg(va, char *);
+ el_func_t func = va_arg(va, el_func_t);
- case EL_ECHOTC:
- argv[0] = "echotc";
- rv = term_echotc(el, i, argv);
+ rv = map_addfunc(el, name, help, func);
break;
+ }
+
+ case EL_HIST:
+ {
+ hist_fun_t func = va_arg(va, hist_fun_t);
+ ptr_t ptr = va_arg(va, char *);
- case EL_SETTY:
- argv[0] = "setty";
- rv = tty_stty(el, i, argv);
+ rv = hist_set(el, func, ptr);
break;
+ }
- default:
- rv = -1;
- abort();
+ case EL_EDITMODE:
+ if (va_arg(va, int))
+ el->el_flags &= ~EDIT_DISABLED;
+ else
+ el->el_flags |= EDIT_DISABLED;
+ rv = 0;
break;
- }
+
+ default:
+ rv = -1;
}
- break;
- case EL_ADDFN:
+ va_end(va);
+ return (rv);
+}
+
+
+/* el_get():
+ * retrieve the editline parameters
+ */
+public int
+el_get(EditLine *el, int op, void *ret)
+{
+ int rv;
+
+ if (el == NULL || ret == NULL)
+ return (-1);
+ switch (op) {
+ case EL_PROMPT:
+ case EL_RPROMPT:
+ rv = prompt_get(el, (el_pfunc_t *) & ret, op);
+ break;
+
+ case EL_EDITOR:
+ rv = map_get_editor(el, (const char **) &ret);
+ break;
+
+ case EL_SIGNAL:
+ *((int *) ret) = (el->el_flags & HANDLE_SIGNALS);
+ rv = 0;
+ break;
+
+ case EL_EDITMODE:
+ *((int *) ret) = (!(el->el_flags & EDIT_DISABLED));
+ rv = 0;
+ break;
+
+#if 0 /* XXX */
+ case EL_TERMINAL:
+ rv = term_get(el, (const char *) &ret);
+ break;
+
+ case EL_BIND:
+ case EL_TELLTC:
+ case EL_SETTC:
+ case EL_ECHOTC:
+ case EL_SETTY:
{
- char *name = va_arg(va, char *);
- char *help = va_arg(va, char *);
- el_func_t func = va_arg(va, el_func_t);
- rv = map_addfunc(el, name, help, func);
+ char *argv[20];
+ int i;
+
+ for (i = 1; i < 20; i++)
+ if ((argv[i] = va_arg(va, char *)) == NULL)
+ break;
+
+ switch (op) {
+ case EL_BIND:
+ argv[0] = "bind";
+ rv = map_bind(el, i, argv);
+ break;
+
+ case EL_TELLTC:
+ argv[0] = "telltc";
+ rv = term_telltc(el, i, argv);
+ break;
+
+ case EL_SETTC:
+ argv[0] = "settc";
+ rv = term_settc(el, i, argv);
+ break;
+
+ case EL_ECHOTC:
+ argv[0] = "echotc";
+ rv = term_echotc(el, i, argv);
+ break;
+
+ case EL_SETTY:
+ argv[0] = "setty";
+ rv = tty_stty(el, i, argv);
+ break;
+
+ default:
+ rv = -1;
+ EL_ABORT((el->errfile, "Bad op %d\n", op));
+ break;
+ }
+ break;
+}
+
+public void
+el_data_set (el, data)
+ EditLine *el;
+ void *data;
+{
+ el->data = data;
+
+ return;
+}
+
+public void *
+el_data_get (el)
+ EditLine *el;
+{
+ if (el->data)
+ return (el->data);
+ return (NULL);
}
- break;
- case EL_HIST:
+ case EL_ADDFN:
{
- hist_fun_t func = va_arg(va, hist_fun_t);
- ptr_t ptr = va_arg(va, char *);
- rv = hist_set(el, func, ptr);
+ char *name = va_arg(va, char *);
+ char *help = va_arg(va, char *);
+ el_func_t func = va_arg(va, el_func_t);
+
+ rv = map_addfunc(el, name, help, func);
+ break;
}
- break;
- default:
- rv = -1;
- }
+ case EL_HIST:
+ {
+ hist_fun_t func = va_arg(va, hist_fun_t);
+ ptr_t ptr = va_arg(va, char *);
+ rv = hist_set(el, func, ptr);
+ }
+ break;
+#endif /* XXX */
- va_end(va);
- return rv;
-} /* end el_set */
+ default:
+ rv = -1;
+ }
+
+ return (rv);
+}
/* el_line():
* Return editing info
*/
public const LineInfo *
-el_line(el)
- EditLine *el;
+el_line(EditLine *el)
{
- return (const LineInfo *) &el->el_line;
+
+ return (const LineInfo *) (void *) &el->el_line;
}
static const char elpath[] = "/.editrc";
@@ -285,37 +397,41 @@ static const char elpath[] = "/.editrc";
* Source a file
*/
public int
-el_source(el, fname)
- EditLine *el;
- const char *fname;
+el_source(EditLine *el, const char *fname)
{
- FILE *fp;
- size_t len;
- char *ptr, path[MAXPATHLEN];
-
- if (fname == NULL) {
- if (issetugid() != 0 || (ptr = getenv("HOME")) == NULL)
- return -1;
- (void) snprintf(path, sizeof(path), "%s%s", ptr, elpath);
- fname = path;
- }
-
- if ((fp = fopen(fname, "r")) == NULL)
- return -1;
-
- while ((ptr = fgetln(fp, &len)) != NULL) {
- if (ptr[len - 1] == '\n')
- --len;
- ptr[len] = '\0';
-
- if (parse_line(el, ptr) == -1) {
- (void) fclose(fp);
- return -1;
+ FILE *fp;
+ size_t len;
+ char *ptr, path[MAXPATHLEN];
+
+ fp = NULL;
+ if (fname == NULL) {
+ if (issetugid())
+ return (-1);
+ if ((ptr = getenv("HOME")) == NULL)
+ return (-1);
+ if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path))
+ return (-1);
+ if (strlcat(path, elpath, sizeof(path)) >= sizeof(path))
+ return (-1);
+ fname = path;
+ }
+ if (fp == NULL)
+ fp = fopen(fname, "r");
+ if (fp == NULL)
+ return (-1);
+
+ while ((ptr = fgetln(fp, &len)) != NULL) {
+ if (len > 0 && ptr[len - 1] == '\n')
+ --len;
+ ptr[len] = '\0';
+ if (parse_line(el, ptr) == -1) {
+ (void) fclose(fp);
+ return (-1);
+ }
}
- }
- (void) fclose(fp);
- return 0;
+ (void) fclose(fp);
+ return (0);
}
@@ -323,37 +439,54 @@ el_source(el, fname)
* Called from program when terminal is resized
*/
public void
-el_resize(el)
- EditLine *el;
+el_resize(EditLine *el)
{
- int lins, cols;
- sigset_t oset, nset;
- (void) sigemptyset(&nset);
- (void) sigaddset(&nset, SIGWINCH);
- (void) sigprocmask(SIG_BLOCK, &nset, &oset);
+ int lins, cols;
+ sigset_t oset, nset;
+
+ (void) sigemptyset(&nset);
+ (void) sigaddset(&nset, SIGWINCH);
+ (void) sigprocmask(SIG_BLOCK, &nset, &oset);
- /* get the correct window size */
- if (term_get_size(el, &lins, &cols))
- term_change_size(el, lins, cols);
+ /* get the correct window size */
+ if (term_get_size(el, &lins, &cols))
+ term_change_size(el, lins, cols);
- (void) sigprocmask(SIG_SETMASK, &oset, NULL);
+ (void) sigprocmask(SIG_SETMASK, &oset, NULL);
}
+
+/* el_beep():
+ * Called from the program to beep
+ */
public void
-el_data_set (el, data)
- EditLine *el;
- void *data;
+el_beep(EditLine *el)
{
- el->data = data;
- return;
+ term_beep(el);
}
-public void *
-el_data_get (el)
- EditLine *el;
+
+/* el_editmode()
+ * Set the state of EDIT_DISABLED from the `edit' command.
+ */
+protected int
+/*ARGSUSED*/
+el_editmode(EditLine *el, int argc, char **argv)
{
- if (el->data)
- return (el->data);
- return (NULL);
+ const char *how;
+
+ if (argv == NULL || argc != 2 || argv[1] == NULL)
+ return (-1);
+
+ how = argv[1];
+ if (strcmp(how, "on") == 0)
+ el->el_flags &= ~EDIT_DISABLED;
+ else if (strcmp(how, "off") == 0)
+ el->el_flags |= EDIT_DISABLED;
+ else {
+ (void) fprintf(el->el_errfile, "edit: Bad value `%s'.\n", how);
+ return (-1);
+ }
+ return (0);
}
OpenPOWER on IntegriCloud