Date: Sun, 2 Mar 1997 19:47:59 +1100 (EST) From: Julian Assange <proff@iq.org> To: FreeBSD-gnats-submit@freebsd.org, jkh@freebsd.org, dyson@freebsd.org Subject: bin/2844: libedit sync with NetBSD/OpenBSD Message-ID: <199703020847.TAA06808@profane.iq.org> Resent-Message-ID: <199703020900.BAA29927@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 2844 >Category: bin >Synopsis: libedit sync with NetBSD/OpenBSD >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sun Mar 2 01:00:02 PST 1997 >Last-Modified: >Originator: Julian Assange >Organization: >Release: FreeBSD 3.0-CURRENT i386 >Environment: >Description: new features required for the new NetBSD ftp client (see next patch). Also fixes a number of buffer overflows, a couple of bugs and provides for a decent man page. I'd like to see this commited relatively quickly so the netbsd programs which depend on the extensions can make it into the code base. >How-To-Repeat: >Fix: diff -r -u --new-file src/lib/libedit.old/Makefile src/lib/libedit/Makefile --- src/lib/libedit.old/Makefile Fri Aug 30 11:50:07 1996 +++ src/lib/libedit/Makefile Sun Mar 2 19:28:29 1997 @@ -1,4 +1,6 @@ # @(#)Makefile 8.1 (Berkeley) 6/4/93 +# $OpenBSD: Makefile,v 1.4 1997/01/16 05:18:27 millert Exp $ +# $FreeBSD$ LIB= edit @@ -8,6 +10,16 @@ LDADD+= -ltermcap DPADD+= ${LIBTERMCAP} +MAN3= editline.3 +MAN5= editrc.5 + +MLINKS= editline.3 el_init.3 editline.3 el_end.3 editline.3 el_reset.3 \ + editline.3 el_gets.3 editline.3 el_getc.3 editline.3 el_push.3 \ + editline.3 el_parse.3 editline.3 el_set.3 editline.3 el_source.3 \ + editline.3 el_resize.3 editline.3 el_line.3 \ + editline.3 el_insertstr.3 editline.3 el_deletestr.3 \ + editline.3 history_init.3 editline.3 history_end.3 editline.3 history.3 + # For speed and debugging #SRCS= ${OSRCS} tokenizer.c history.c diff -r -u --new-file src/lib/libedit.old/TEST/test.c src/lib/libedit/TEST/test.c --- src/lib/libedit.old/TEST/test.c Tue May 30 15:43:23 1995 +++ src/lib/libedit/TEST/test.c Sun Mar 2 19:30:36 1997 @@ -1,3 +1,5 @@ +/* $OpenBSD: test.c,v 1.3 1997/01/16 05:18:55 millert Exp $ */ +/* $FreeBSD$ */ /*- * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. @@ -179,11 +181,38 @@ history(hist, continuation ? H_ADD : H_ENTER, buf); continuation = 0; - if (el_parse(el, ac, av) != -1) { - tok_reset(tok); - continue; - } + 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); @@ -202,6 +231,8 @@ (void) fprintf(stderr, "Exit %x\n", num); break; } + } + tok_reset(tok); } diff -r -u --new-file src/lib/libedit.old/chared.c src/lib/libedit/chared.c --- src/lib/libedit.old/chared.c Mon Aug 12 05:20:27 1996 +++ src/lib/libedit/chared.c Sun Mar 2 19:31:34 1997 @@ -1,3 +1,5 @@ +/* $OpenBSD: chared.c,v 1.2 1997/01/16 05:18:28 millert Exp $ */ +/* $FreeBSD$ */ /*- * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. diff -r -u --new-file src/lib/libedit.old/common.c src/lib/libedit/common.c --- src/lib/libedit.old/common.c Mon Aug 12 05:20:28 1996 +++ src/lib/libedit/common.c Sun Mar 2 17:02:19 1997 @@ -651,9 +651,7 @@ EditLine *el; int c; { - re_clear_lines(el); - re_clear_display(el); - return CC_REFRESH; + return CC_REDISPLAY; } @@ -702,7 +700,8 @@ *el->el_line.lastchar = '\0'; /* just in case */ if (el->el_history.eventno == 0) { /* save the current buffer away */ - (void) strncpy(el->el_history.buf, el->el_line.buffer, EL_BUFSIZ); + (void) strncpy(el->el_history.buf, el->el_line.buffer, EL_BUFSIZ - 1); + el->el_history.buf[EL_BUFSIZ - 1] = '\0'; el->el_history.last = el->el_history.buf + (el->el_line.lastchar - el->el_line.buffer); } @@ -773,7 +772,8 @@ } if (el->el_history.eventno == 0) { - (void) strncpy(el->el_history.buf, el->el_line.buffer, EL_BUFSIZ); + (void) strncpy(el->el_history.buf, el->el_line.buffer, EL_BUFSIZ - 1); + el->el_history.buf[EL_BUFSIZ - 1] = '\0'; el->el_history.last = el->el_history.buf + (el->el_line.lastchar - el->el_line.buffer); } diff -r -u --new-file src/lib/libedit.old/editline.3 src/lib/libedit/editline.3 --- src/lib/libedit.old/editline.3 Thu Jan 1 10:00:00 1970 +++ src/lib/libedit/editline.3 Sun Mar 2 16:37:18 1997 @@ -0,0 +1,532 @@ +.\" $OpenBSD: editline.3,v 1.1 1997/01/16 05:20:28 millert Exp $ +.\" +.\" Copyright (c) 1997 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This file was contributed to The NetBSD Foundation by Luke Mewburn. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the NetBSD +.\" Foundation, Inc. and its contributors. +.\" 4. Neither the name of The NetBSD Foundation nor the names of its +.\" contributors may be used to endorse or promote products derived +.\" from this software without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT 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. +.\" +.Dd January 11, 1997 +.Os BSD 4.4 +.Dt EDITLINE 3 +.Sh NAME +.Nm editline , +.Nm el_init , +.Nm el_end , +.Nm el_reset , +.Nm el_gets , +.Nm el_getc , +.Nm el_push , +.Nm el_parse , +.Nm el_set , +.Nm el_source , +.Nm el_resize , +.Nm el_line , +.Nm el_insertstr , +.Nm el_deletestr , +.Nm history_init , +.Nm history_end , +.Nm history +.Nd line editor and history functions +.Sh SYNOPSIS +.Fd #include <histedit.h> +.Ft EditLine * +.Fn el_init "const char *prog" "FILE *fin" "FILE *fout" +.Ft void +.Fn el_end "EditLine *e" +.Ft void +.Fn el_reset "EditLine *e" +.Ft const char * +.Fn el_gets "EditLine *e" "int *count" +.Ft int +.Fn el_getc "EditLine *e" "char *ch" +.Ft void +.Fn el_push "EditLine *e" "const char *str" +.Ft int +.Fn el_parse "EditLine *e" "int argc" "char *argv[]" +.Ft int +.Fn el_set "EditLine *e" "int op" "..." +.Ft int +.Fn el_source "EditLine *e" "const char *file" +.Ft void +.Fn el_resize "EditLine *e" +.Ft const LineInfo * +.Fn el_line "EditLine *e" +.Ft int +.Fn el_insertstr "EditLine *e" "char *str" +.Ft void +.Fn el_deletestr "EditLine *e" "int count" +.Ft History * +.Fn history_init +.Ft void +.Fn history_end "History *h" +.Ft HistEvent * +.Fn history "History h" "int op" "..." +.Sh DESCRIPTION +The +.Nm +library provides generic line editing and history functions, +similar to those found in +.Xr sh 1 . +.Pp +These functions are available in the +.Nm libedit +library (which needs the +.Nm libtermcap +library). +Programs should be linked with +.Fl ledit ltermcap . +.Sh LINE EDITING FUNCTIONS +The line editing functions use a common data structure, +.Fa EditLine , +which is created by +.Fn el_init +and freed by +.Fn el_end . +.Pp +The following functions are available: +.Bl -tag -width 4n +.It Fn el_init +Initialise the line editor, and return a data structure +to be used by all other line editing functions. +.Fa prog +is the name of the invoking program, used when reading the +.Xr editrc 5 +file to determine which settings to use. +.Fa fin +and +.Fa fout +are the input and output streams (respectively) to use. +In this documentation, references to +.Dq the tty +are actually to this input/output stream combination. +.It Fn el_end +Clean up and finish with +.Fa e , +assumed to have been created with +.Fn el_init . +.It Fn el_reset +Reset the tty and the parser. +This should be called after an error which may have upset the tty's +state. +.It Fn el_gets +Read a line from the tty. +.Fa count +is modified to contain the number of characters read. +Returns the line read if successful, or +.Dv NULL +if no characters were read or if an error occurred. +.It Fn el_getc +Read a character from the tty. +.Fa ch +is modified to contain the character read. +Returns the number of characters read if successful, -1 otherwise. +.It Fn el_push +Pushes +.Fa str +back onto the input stream. +This is used by the macro expansion mechanism. +Refer to the description of +.Ic bind +.Fl s +in +.Xr editrc 5 +for more information. +.It Fn el_parse +Parses the +.Fa argv +array (which is +.Fa argc +elements in size) +to execute builtin +.Nm +commands. +If the command is prefixed with +.Dq prog: +then +.Fn el_parse +will only execute the command if +.Dq prog +matches the +.Fa prog +argument supplied to +.Fn el_init . +The return value is +-1 if the command is unknown, +0 if there was no error or +.Dq prog +didn't match, or +1 if the command returned an error. +Refer to +.Xr editrc 5 +for more information. +.Pp +.Em NOTE: +.Va argv[0] +may be modified by +.Fn el_parse . +The colon between +.Dq prog +and the command, +.Ar command , +will be replaced with a NUL +.Po +.Dq \e0 +.Pc . +.It Fn el_set +Set +.Nm +parameters. +.Fa op +determines which parameter to set, and each operation has its +own parameter list. +.Pp +The following values for +.Fa op +are supported, along with the required argument list: +.Bl -tag -width 4n +.It Dv EL_PROMPT , Fa "char *(*f)(EditLine *)" +Define prompt printing function as +.Fa f , +which is to return a string that contains the prompt. +.It Dv EL_TERMINAL , Fa "const char *type" +Define terminal type of the tty to be +.Fa type , +or to +.Ev TERM +if +.Fa type +is +.Dv NULL . +.It Dv EL_EDITOR , Fa "const char *mode" +Set editing mode to +.Fa mode , +which must be one of +.Dq emacs +or +.Dq vi . +.It Dv EL_SIGNAL , Fa "int flag" +If +.Fa flag +is non-zero, +.Nm +will install its own signal handler for the following signals when +reading command input: +.Dv SIGCONT , +.Dv SIGHUP , +.Dv SIGINT , +.Dv SIGQUIT , +.Dv SIGSTOP , +.Dv SIGTERM , +.Dv SIGTSTP , +and +.Dv SIGWINCH . +Otherwise, the current signal handlers will be used. +.It Dv EL_BIND , Xo +.Fa "const char *" , +.Fa "..." , +.Dv NULL +.Xc +Perform the +.Ic bind +builtin command. +Refer to +.Xr editrc 5 +for more information. +.It Dv EL_ECHOTC , Xo +.Fa "const char *" , +.Fa "..." , +.Dv NULL +.Xc +Perform the +.Ic echotc +builtin command. +Refer to +.Xr editrc 5 +for more information. +.It Dv EL_SETTC , Xo +.Fa "const char *" , +.Fa "..." , +.Dv NULL +.Xc +Perform the +.Ic settc +builtin command. +Refer to +.Xr editrc 5 +for more information. +.It Dv EL_SETTY , Xo +.Fa "const char *" , +.Fa "..." , +.Dv NULL +.Xc +Perform the +.Ic setty +builtin command. +Refer to +.Xr editrc 5 +for more information. +.It Dv EL_TELLTC , Xo +.Fa "const char *" , +.Fa "..." , +.Dv NULL +.Xc +Perform the +.Ic telltc +builtin command. +Refer to +.Xr editrc 5 +for more information. +.It Dv EL_ADDFN , Xo +.Fa "const char *name" , +.Fa "const char *help" , +.Fa "unsigned char (*func)(EditLine *e, int ch) +.Xc +Add a user defined function, +.Fn func , +referred to as +.Fa name +which is invoked when a key which is bound to +.Fa name +is entered. +.Fa help +is a description of +.Fa name . +At invocation time, +.Fa ch +is the key which caused the invocation. +The return value of +.Fn func +should be one of: +.Bl -tag -width "CC_REDISPLAY" +.It Dv CC_NORM +Add a normal character. +.It Dv CC_NEWLINE +End of line was entered. +.It Dv CC_EOF +EOF was entered. +.It Dv CC_ARGHACK +Expecting further command input as arguments, do nothing visually. +.It Dv CC_REFRESH +Refresh display. +.It Dv CC_CURSOR +Cursor moved, so update and perform +.Dv CC_REFRESH. +.It Dv CC_REDISPLAY +Redisplay entire input line. +This is useful if a key binding outputs extra information. +.It Dv CC_ERROR +An error occurred. +Beep, and flush tty. +.It Dv CC_FATAL +Fatal error, reset tty to known state. +.El +.It Dv EL_HIST , Xo +.Fa "History *(*func)(History *, int op, ...)" , +.Fa "const char *ptr" +.Xc +Defines which history function to use, which is usually +.Fn history . +.Fa ptr +should be the value returned by +.Fn history_init . +.El +.It Fn el_source +Initialise +.Nm +by reading the contents of +.Fa file . +.Fn el_parse +is called for each line in +.Fa file . +If +.Fa file +is +.Dv NULL , +try +.Pa $PWD/.editrc +then +.Pa $HOME/.editrc . +Refer to +.Xr editrc 5 +for details on the format of +.Fa file . +.It Fn el_resize +Must be called if the terminal size changes. +If +.Dv EL_SIGNAL +has been set with +.Fn el_set , +then this is done automatically. +Otherwise, it's the responsibility of the application to call +.Fn el_resize +on the appropriate occasions. +.It Fn el_line +Return the editing information for the current line in a +.Fa LineInfo +structure, which is defined as follows: +.Bd -literal +typedef struct lineinfo { + const char *buffer; /* address of buffer */ + const char *cursor; /* address of cursor */ + const char *lastchar; /* address of last character */ +} LineInfo; +.Ed +.It Fn el_insertstr +Insert +.Fa str +into the line at the cursor. +Returns -1 if +.Fa str +is empty or won't fit, and 0 otherwise. +.It Fn el_deletestr +Delete +.Fa num +characters before the cursor. +.El +.Sh HISTORY LIST FUNCTIONS +The history functions use a common data structure, +.Fa History , +which is created by +.Fn history_init +and freed by +.Fn history_end . +.Pp +The following functions are available: +.Bl -tag -width 4n +.It Fn history_init +Initialise the history list, and return a data structure +to be used by all other history list functions. +.It Fn history_end +Clean up and finish with +.Fa h , +assumed to have been created with +.Fn history_init . +.It Fn history +Perform operation +.Fa op +on the history list, with optional arguments as needed by the +operation. +The following values for +.Fa op +are supported, along with the required argument list: +.Bl -tag -width 4n +.It Dv H_EVENT , Fa "int size" +Set size of history to +.Fa size +elements. +.It Dv H_END +Cleans up and finishes with +.Fa h , +assumed to be created with +.Fn history_init . +.It Dv H_CLEAR +Clear the history. +.It Dv H_FUNC , Xo +.Fa "void *ptr" , +.Fa "history_gfun_t first" , +.Fa "history_gfun_t next" , +.Fa "history_gfun_t last" , +.Fa "history_gfun_t prev" , +.Fa "history_gfun_t curr" , +.Fa "history_vfun_t clear" , +.Fa "history_efun_t enter" , +.Fa "history_efun_t add" +.Xc +Define functions to perform various history operations. +.Fa ptr +is the argument given to a function when it's invoked. +.It Dv H_FIRST +Return the first element in the history. +.It Dv H_LAST +Return the last element in the history. +.It Dv H_PREV +Return the previous element in the history. +.It Dv H_NEXT +Return the next element in the history. +.It Dv H_CURR +Return the current element in the history. +.It Dv H_ADD , Fa "const char *str" +Append +.Fa str +to the current element of the history, or create an element with +.Dv H_ENTER +if there isn't one. +.It Dv H_ENTER , Fa "const char *str" +Add +.Fa str +as a new element to the history, and, if necessary, +removing the oldest entry to keep the list to the created size. +.It Dv H_PREV_STR , Fa "const char *str" +Return the closest previous event that starts with +.Fa str . +.It Dv H_NEXT_STR , Fa "const char *str" +Return the closest next event that starts with +.Fa str . +.It Dv H_PREV_EVENT , Fa "int e" +Return the previous event numbered +.Fa e . +.It Dv H_NEXT_EVENT , Fa "int e" +Return the next event numbered +.Fa e . +.It Dv H_LOAD , Fa "const char *file" +Load the history list stored in +.Fa file . +.It Dv H_SAVE , Fa "const char *file" +Save the history list to +.Fa file . +.El +.El +.\"XXX.Sh EXAMPLES +.\"XXX: provide some examples +.Sh SEE ALSO +.Xr editrc 5 , +.Xr sh 1 , +.Xr signal 3 , +.Xr termcap 3 +.Sh HISTORY +The +.Nm +library first appeared in +.Bx 4.4 . +.Sh AUTHORS +The +.Nm +library was written by Christos Zoulas, +and this manual was written by Luke Mewburn. +.Sh BUGS +This documentation is probably incomplete. +.Pp +.Fn el_parse +should not modify the supplied +.Va argv[0] . +.Pp +The tokenization functions are not publically defined in +.Fd <histedit.h> diff -r -u --new-file src/lib/libedit.old/editrc.5 src/lib/libedit/editrc.5 --- src/lib/libedit.old/editrc.5 Thu Jan 1 10:00:00 1970 +++ src/lib/libedit/editrc.5 Sun Mar 2 16:37:29 1997 @@ -0,0 +1,292 @@ +.\" $OpenBSD: editrc.5,v 1.1 1997/01/16 05:20:29 millert Exp $ +.\" +.\" Copyright (c) 1997 The NetBSD Foundation, Inc. +.\" All rights reserved. +.\" +.\" This file was contributed to The NetBSD Foundation by Luke Mewburn. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the NetBSD +.\" Foundation, Inc. and its contributors. +.\" 4. Neither the name of The NetBSD Foundation nor the names of its +.\" contributors may be used to endorse or promote products derived +.\" from this software without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE +.\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +.\" CONTRACT, STRICT 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. +.\" +.Dd January 11, 1997 +.Os BSD 4.4 +.Dt EDITRC 5 +.Sh NAME +.Nm editrc +.Nd configuration file for editline library +.Sh SYNOPSIS +.Nm +.Sh DESCRIPTION +The +.Nm +file defines various settings to be used by the +.Xr editline 3 +library. +.Pp +The format of each line is either: +.Dl prog:command [arg [...]] +or +.Dl command [arg [...]] +.Pp +.Ar command +is one of the +.Xr editline 3 +builtin commands. +Refer to +.Sx BUILTIN COMMANDS +for more information. +.Pp +.Ar prog +is the program name string that a program defines when it calls +.Xr el_init 3 +to setup +.Xr editline 3 , +which is usually +.Va argv[0] . +.Ar command +will be executed for any program which matches +.Ar prog . +.Pp +.Ar prog +may also be a +.Xr regex 3 +style +regular expression, in which case +.Ar command +will be executed for any program that matches the regular expression. +.Sh BUILTIN COMMANDS +The +.Nm editline +library has some builtin commands, which affect the way +that the line editing and history functions operate. +These are based on similar named builtins present in the +.Xr tcsh 1 +shell. +.Pp +The following builtin commands are available: +.Bl -tag -width 4n +.It Ic bind Xo +.Op Fl a +.Op Fl e +.Op Fl k +.Op Fl l +.Op Fl r +.Op Fl s +.Op Fl v +.Op Ar key Op Ar command +.Xc +Without options, list all bound keys, and the editor command to which +each is bound. +If +.Ar key +is supplied, show the bindings for +.Ar key . +If +.Ar key command +is supplied, bind +.Ar command +to +.Ar key . +Options include: +.Bl -tag -width 4n +.It Fl e +Bind all keys to the standard GNU Emacs-like bindings. +.It Fl v +Bind all keys to the standard +.Xr vi 1 -like +bindings. +.It Fl a +List or change key bindings in the +.Xr vi 1 +mode alternate (command mode) key map. +.It Fl k +.Ar key +is interpreted as a symbolic arrow key name, which may be one of +.Sq up , +.Sq down , +.Sq left +or +.Sq right . +.It Fl l +List all editor commands and a short description of each. +.It Fl r +Remove a key's binding. +.It Fl s +.Ar command +is taken as a literal string and treated as terminal input when +.Ar key +is typed. +Bound keys in +.Ar command +are themselves reinterpreted, and this continues for ten levels of +interpretation. +.El +.Pp +.Ar key +and +.Ar command +can contain control characters of the form +.Sm off +.Sq No ^ Ar character +.Sm on +.Po +e.g. +.Sq ^A +.Pc , +and the following backslashed escape sequences: +.Pp +.Bl -tag -compact -offset indent -width 4n +.It Ic \ea +Bell +.It Ic \eb +Backspace +.It Ic \ee +Escape +.It Ic \ef +Formfeed +.It Ic \en +Newline +.It Ic \er +Carriage return +.It Ic \et +Horizontal tab +.It Ic \ev +Vertical tab +.Sm off +.It Sy \e Ar nnn +.Sm on +The ASCII character corresponding to the octal number +.Ar nnn . +.El +.Pp +.Sq \e +nullifies the special meaning of the following character, +if it has any, notably +.Sq \e +and +.Sq ^ . +.It Ic echotc Xo +.Op Fl sv +.Ar arg +.Ar ... +.Xc +Exercise terminal capabilities given in +.Ar arg Ar ... . +If +.Ar arg +is +.Sq baud , +.Sq cols , +.Sq lines , +.Sq rows , +.Sq meta or +.Sq tabs , +the value of that capability is printed, with +.Dq yes +or +.Dq no +indicating that the terminal does or does not have that capability. +.Pp +.Fl s +returns an emptry string for non-existant capabilities, rather than +causing an error. +.Fl v +causes messages to be verbose. +.It Ic history +List the history. +.It Ic telltc +List the values of all the terminal capabilities (see +.Xr termcap 5 ). +.It Ic settc Ar cap Ar val +Set the terminal capability +.Ar cap +to +.Ar val , +as defined in +.Xr termcap 5 . +No sanity checking is done. +.It Ic setty Xo +.Op Fl a +.Op Fl d +.Op Fl q +.Op Fl x +.Op Ar +mode +.Op Ar -mode +.Op Ar mode +.Xc +Control which tty modes that +.Nm +won't allow the user to change. +.Fl d , +.Fl q +or +.Fl x +tells +.Ic setty +to act on the +.Sq edit , +.Sq quote +or +.Sq execute +set of tty modes respectively; defaulting to +.Fl x . +.Pp +Without other arguments, +.Ic setty +lists the modes in the chosen set which are fixed on +.Po +.Sq +mode +.Pc +or off +.Po +.Sq -mode +.Pc . +.Fl a +lists all tty modes in the chosen set regardless of the setting. +With +.Ar +mode , +.Ar -mode +or +.Ar mode , +fixes +.Ar mode +on or off or removes control of +.Ar mode +in the chosen set. +.El +.Sh SEE ALSO +.Xr editline 3 , +.Xr regex 3 , +.Xr termcap 5 +.Sh AUTHORS +The +.Nm +library was written by Christos Zoulas, +and this manual was written by Luke Mewburn, +with some sections inspired by +.Xr tcsh 1 . diff -r -u --new-file src/lib/libedit.old/el.c src/lib/libedit/el.c --- src/lib/libedit.old/el.c Tue May 30 15:42:57 1995 +++ src/lib/libedit/el.c Sun Mar 2 19:12:44 1997 @@ -47,6 +47,7 @@ #include <sys/param.h> #include <string.h> #include <stdlib.h> +#include <unistd.h> #if __STDC__ # include <stdarg.h> #else @@ -291,11 +292,12 @@ if (fname == NULL) { fname = &elpath[1]; if ((fp = fopen(fname, "r")) == NULL) { - if ((ptr = getenv("HOME")) == NULL) + if (geteuid() != getuid() || (ptr = getenv("HOME")) == NULL) return -1; - fname = strncpy(path, ptr, MAXPATHLEN); - (void) strncat(path, elpath, MAXPATHLEN); - path[MAXPATHLEN-1] = '\0'; + fname = strncpy(path, ptr, sizeof(path) - 1); + path[sizeof(path)-1] = '\0'; + (void) strncat(path, elpath, sizeof(path) - 1); + path[sizeof(path)-1] = '\0'; } } diff -r -u --new-file src/lib/libedit.old/hist.c src/lib/libedit/hist.c --- src/lib/libedit.old/hist.c Tue May 30 15:42:59 1995 +++ src/lib/libedit/hist.c Sun Mar 2 17:08:17 1997 @@ -100,7 +100,8 @@ int h; if (el->el_history.eventno == 0) { /* if really the current line */ - (void) strncpy(el->el_line.buffer, el->el_history.buf, EL_BUFSIZ); + (void) strncpy(el->el_line.buffer, el->el_history.buf, EL_BUFSIZ - 1); + el->el_line.buffer[EL_BUFSIZ - 1] = '\0'; el->el_line.lastchar = el->el_line.buffer + (el->el_history.last - el->el_history.buf); @@ -128,7 +129,8 @@ return CC_ERROR; } - (void) strncpy(el->el_line.buffer, hp, EL_BUFSIZ); + (void) strncpy(el->el_line.buffer, hp, EL_BUFSIZ - 1); + el->el_line.buffer[EL_BUFSIZ - 1] = '\0'; el->el_line.lastchar = el->el_line.buffer + strlen(el->el_line.buffer); if (el->el_line.lastchar > el->el_line.buffer) { diff -r -u --new-file src/lib/libedit.old/hist.h src/lib/libedit/hist.h --- src/lib/libedit.old/hist.h Fri May 27 14:58:49 1994 +++ src/lib/libedit/hist.h Sun Mar 2 17:08:35 1997 @@ -65,6 +65,8 @@ #define HIST_LAST(el) HIST_FUN(el, H_LAST, NULL) #define HIST_PREV(el) HIST_FUN(el, H_PREV, NULL) #define HIST_EVENT(el, num) HIST_FUN(el, H_EVENT, num) +#define HIST_LOAD(el, fname) HIST_FUN(el, H_LOAD fname) +#define HIST_SAVE(el, fname) HIST_FUN(el, H_SAVE fname) protected int hist_init __P((EditLine *)); protected void hist_end __P((EditLine *)); diff -r -u --new-file src/lib/libedit.old/history.c src/lib/libedit/history.c --- src/lib/libedit.old/history.c Tue May 30 15:43:00 1995 +++ src/lib/libedit/history.c Sun Mar 2 17:21:54 1997 @@ -51,10 +51,13 @@ #include <varargs.h> #endif +static const char hist_cookie[] = "_HiStOrY_V1_\n"; + #include "histedit.h" typedef const HistEvent * (*history_gfun_t) __P((ptr_t)); typedef const HistEvent * (*history_efun_t) __P((ptr_t, const char *)); +typedef void (*history_vfun_t) __P((ptr_t)); struct history { ptr_t h_ref; /* Argument for history fcns */ @@ -63,6 +66,7 @@ history_gfun_t h_last; /* Get the last element */ history_gfun_t h_prev; /* Get the previous element */ history_gfun_t h_curr; /* Get the current element */ + history_vfun_t h_clear; /* Clear the history list */ history_efun_t h_enter; /* Add an element */ history_efun_t h_add; /* Append to an element */ }; @@ -72,6 +76,7 @@ #define HPREV(h) (*(h)->h_prev)((h)->h_ref) #define HLAST(h) (*(h)->h_last)((h)->h_ref) #define HCURR(h) (*(h)->h_curr)((h)->h_ref) +#define HCLEAR(h) (*(h)->h_clear)((h)->h_ref) #define HENTER(h, str) (*(h)->h_enter)((h)->h_ref, str) #define HADD(h, str) (*(h)->h_add)((h)->h_ref, str) @@ -80,13 +85,9 @@ private int history_set_num __P((History *, int)); -private int history_set_fun __P((History *, history_gfun_t, - history_gfun_t, - history_gfun_t, - history_gfun_t, - history_gfun_t, - history_efun_t, - history_efun_t, ptr_t)); +private int history_set_fun __P((History *, History *)); +private int history_load __P((History *, const char *)); +private int history_save __P((History *, const char *)); private const HistEvent *history_prev_event __P((History *, int)); private const HistEvent *history_next_event __P((History *, int)); private const HistEvent *history_next_string __P((History *, const char *)); @@ -120,7 +121,7 @@ private const HistEvent *history_def_enter __P((ptr_t, const char *)); private const HistEvent *history_def_add __P((ptr_t, const char *)); private void history_def_init __P((ptr_t *, int)); -private void history_def_end __P((ptr_t)); +private void history_def_clear __P((ptr_t)); private const HistEvent *history_def_insert __P((history_t *, const char *)); private void history_def_delete __P((history_t *, hentry_t *)); @@ -324,17 +325,19 @@ } -/* history_def_end(): +/* history_def_clear(): * Default history cleanup function */ private void -history_def_end(p) +history_def_clear(p) ptr_t p; { history_t *h = (history_t *) p; while (h->list.prev != &h->list) history_def_delete(h, h->list.prev); + h->eventno = 0; + h->cur = 0; } /************************************************************************/ @@ -354,6 +357,7 @@ h->h_last = history_def_last; h->h_prev = history_def_prev; h->h_curr = history_def_curr; + h->h_clear = history_def_clear; h->h_enter = history_def_enter; h->h_add = history_def_add; @@ -369,7 +373,7 @@ History *h; { if (h->h_next == history_def_next) - history_def_end(h->h_ref); + history_def_clear(h->h_ref); } @@ -393,16 +397,13 @@ * Set history functions */ private int -history_set_fun(h, first, next, last, prev, curr, enter, add, ptr) - History *h; - history_gfun_t first, next, last, prev, curr; - history_efun_t enter, add; - ptr_t ptr; -{ - if (first == NULL || next == NULL || - last == NULL || prev == NULL || curr == NULL || - enter == NULL || add == NULL || - ptr == NULL ) { +history_set_fun(h, nh) + History *h, *nh; +{ + if (nh->h_first == NULL || nh->h_next == NULL || + nh->h_last == NULL || nh->h_prev == NULL || nh->h_curr == NULL || + nh->h_enter == NULL || nh->h_add == NULL || nh->h_clear == NULL || + nh->h_ref == NULL) { if (h->h_next != history_def_next) { history_def_init(&h->h_ref, 0); h->h_first = history_def_first; @@ -410,6 +411,7 @@ h->h_last = history_def_last; h->h_prev = history_def_prev; h->h_curr = history_def_curr; + h->h_clear = history_def_clear; h->h_enter = history_def_enter; h->h_add = history_def_add; } @@ -417,15 +419,75 @@ } if (h->h_next == history_def_next) - history_def_end(h->h_ref); + history_def_clear(h->h_ref); + + h->h_first = nh->h_first; + h->h_next = nh->h_next; + h->h_last = nh->h_last; + h->h_prev = nh->h_prev; + h->h_curr = nh->h_curr; + h->h_clear = nh->h_clear; + h->h_enter = nh->h_enter; + h->h_add = nh->h_add; - h->h_next = next; - h->h_first = first; - h->h_enter = enter; - h->h_add = add; return 0; } +/* history_load(): + * History load function + */ +private int +history_load(h, fname) + History *h; + const char *fname; +{ + FILE *fp; + char *line; + size_t sz; + int i = -1; + + if ((fp = fopen(fname, "r")) == NULL) + return i; + + if ((line = fgetln(fp, &sz)) == NULL) + goto done; + + if (strncmp(line, hist_cookie, sz) != 0) + goto done; + + for (i = 0; (line = fgetln(fp, &sz)) != NULL; i++) { + char c = line[sz]; + line[sz] = '\0'; + HENTER(h, line); + line[sz] = c; + } + +done: + (void) fclose(fp); + return i; +} + + +/* history_save(): + * History save function + */ +private int +history_save(h, fname) + History *h; + const char *fname; +{ + FILE *fp; + const HistEvent *ev; + int i = 0; + + if ((fp = fopen(fname, "w")) == NULL) + return -1; + (void) fputs(hist_cookie, fp); + for (ev = HLAST(h); ev != NULL; ev = HPREV(h), i++) + (void) fprintf(fp, "%s", ev->str); + (void) fclose(fp); + return i; +} /* history_prev_event(): * Find the previous event, with number given @@ -509,7 +571,7 @@ va_list va; const HistEvent *ev = NULL; const char *str; - static const HistEvent sev = { 0, "" }; + static HistEvent sev = { 0, "" }; #if __STDC__ va_start(va, fun); @@ -552,6 +614,20 @@ ev = HCURR(h); break; + case H_CLEAR: + HCLEAR(h); + break; + + case H_LOAD: + sev.num = history_load(h, va_arg(va, const char *)); + ev = &sev; + break; + + case H_SAVE: + sev.num = history_save(h, va_arg(va, const char *)); + ev = &sev; + break; + case H_PREV_EVENT: ev = history_prev_event(h, va_arg(va, int)); break; @@ -569,24 +645,29 @@ break; case H_EVENT: - if (history_set_num(h, va_arg(va, int)) == 0) + if (history_set_num(h, va_arg(va, int)) == 0) { + sev.num = -1; ev = &sev; + } break; case H_FUNC: { - history_gfun_t first = va_arg(va, history_gfun_t); - history_gfun_t next = va_arg(va, history_gfun_t); - history_gfun_t last = va_arg(va, history_gfun_t); - history_gfun_t prev = va_arg(va, history_gfun_t); - history_gfun_t curr = va_arg(va, history_gfun_t); - history_efun_t enter = va_arg(va, history_efun_t); - history_efun_t add = va_arg(va, history_efun_t); - ptr_t ptr = va_arg(va, ptr_t); - - if (history_set_fun(h, first, next, last, prev, - curr, enter, add, ptr) == 0) - ev = &sev; + History hf; + hf.h_ref = va_arg(va, ptr_t); + hf.h_first = va_arg(va, history_gfun_t); + hf.h_next = va_arg(va, history_gfun_t); + hf.h_last = va_arg(va, history_gfun_t); + hf.h_prev = va_arg(va, history_gfun_t); + hf.h_curr = va_arg(va, history_gfun_t); + hf.h_clear = va_arg(va, history_vfun_t); + hf.h_enter = va_arg(va, history_efun_t); + hf.h_add = va_arg(va, history_efun_t); + + if (history_set_fun(h, &hf) == 0) { + sev.num = -1; + ev = &sev; + } } break; diff -r -u --new-file src/lib/libedit.old/parse.c src/lib/libedit/parse.c --- src/lib/libedit.old/parse.c Thu Aug 31 03:59:59 1995 +++ src/lib/libedit/parse.c Sun Mar 2 17:41:45 1997 @@ -45,8 +45,10 @@ * * bind * echotc - * settc * gettc + * history + * settc + * setty */ #include "sys.h" #include "el.h" @@ -98,14 +100,11 @@ int i; if (argc < 1) - return 0; - - for (ptr = argv[0]; *ptr && *ptr != ':'; ptr++) - continue; - - if (*ptr == ':') { - *ptr = '\0'; - if (el_match(el->el_prog, ptr)) + return -1; + ptr = strchr(argv[0], ':'); + if (ptr != NULL) { + *ptr++ = '\0'; + if (! el_match(el->el_prog, argv[0])) return 0; } else @@ -193,7 +192,7 @@ break; } } - else if (*p == '^' && isalpha((unsigned char) *p)) { + else if (*p == '^' && isalpha((unsigned char) p[1])) { p++; c = (*p == '?') ? '\177' : (*p & 0237); } diff -r -u --new-file src/lib/libedit.old/read.c src/lib/libedit/read.c --- src/lib/libedit.old/read.c Tue May 30 15:43:09 1995 +++ src/lib/libedit/read.c Sun Mar 2 17:42:28 1997 @@ -379,6 +379,12 @@ re_refresh_cursor(el); break; + case CC_REDISPLAY: + re_clear_lines(el); + re_clear_display(el); + /* FALLTHROUGH */ + + case CC_REFRESH: el->el_state.argument = 1; el->el_state.doingarg = 0; diff -r -u --new-file src/lib/libedit.old/search.c src/lib/libedit/search.c --- src/lib/libedit.old/search.c Tue May 30 15:43:11 1995 +++ src/lib/libedit/search.c Sun Mar 2 19:23:47 1997 @@ -462,10 +462,12 @@ } #ifdef ANCHOR if (el->el_search.patbuf[0] != '.' && el->el_search.patbuf[0] != '*') { - (void) strcpy(tmpbuf, el->el_search.patbuf); + (void) strncpy(tmpbuf, el->el_search.patbuf, tmplen-1); + tmpbuf[tmplen-1] = '\0'; el->el_search.patbuf[0] = '.'; el->el_search.patbuf[1] = '*'; - (void) strcpy(&el->el_search.patbuf[2], tmpbuf); + (void) strncpy(&el->el_search.patbuf[2], tmpbuf, EL_BUFSIZ - 3); + el->el_search.patbuf[EL_BUFSIZ - 1] = '\0'; el->el_search.patlen++; el->el_search.patbuf[el->el_search.patlen++] = '.'; el->el_search.patbuf[el->el_search.patlen++] = '*'; --- src/include/histedit.h.orig Sun Mar 2 19:09:50 1997 +++ src/include/histedit.h Sun Mar 2 19:11:20 1997 @@ -72,6 +72,7 @@ #define CC_CURSOR 5 #define CC_ERROR 6 #define CC_FATAL 7 +#define CC_REDISPLAY 8 /* * Initialization, cleanup, and resetting @@ -168,5 +169,8 @@ #define H_PREV_STR 11 /* , const char*); */ #define H_NEXT_EVENT 12 /* , const int); */ #define H_PREV_EVENT 13 /* , const int); */ +#define H_LOAD 14 /* , const char *); */ +#define H_SAVE 15 /* , const char *); */ +#define H_CLEAR 16 /* , void); */ #endif /* _h_editline */ >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199703020847.TAA06808>