diff --git a/lib/libedit/Makefile b/lib/libedit/Makefile index 8863e80..179b6c9 100644 --- a/lib/libedit/Makefile +++ b/lib/libedit/Makefile @@ -1,11 +1,23 @@ # @(#)Makefile 8.1 (Berkeley) 6/4/93 -LIB= edit +LIB= libedit.a +AHDR = vi.h emacs.h common.h +ASRC = vi.c emacs.c common.c +GENSRCS = $(AHDR) fcns.h fcns.c help.c help.h editline.c +SH = /bin/sh OSRCS= chared.c common.c el.c emacs.c hist.c key.c map.c parse.c \ prompt.c read.c refresh.c search.c sig.c term.c tty.c vi.c \ help.c fcns.c help.h +SYS_ELL_H = sys.h el.h $(AHDR) fcns.h help.h + +GENOBJS = help.o fcns.o +OBJS = chared.o common.o el.o emacs.o hist.o key.o map.o parse.o \ + prompt.o read.o refresh.o search.o sig.o term.o tty.o vi.o \ + history.o tokenizer.o \ + $(GENOBJS) + LDADD+= -ltermcap # For speed and debugging @@ -14,41 +26,66 @@ LDADD+= -ltermcap SRCS= editline.c tokenizer.c history.c CLEANFILES+=common.h emacs.h fcns.h help.h vi.h help.c fcns.c editline.c -CFLAGS+=-I. -I${.CURDIR} +DEFINES = -Dlint +#CFLAGS += $(DEFINES) -I../../include -I. +CFLAGS += $(DEFINES) -I. CFLAGS+=#-DDEBUG_TTY -DDEBUG_KEY -DDEBUG_READ -DDEBUG -DDEBUG_REFRESH CFLAGS+=#-DDEBUG_PASTE +CFLAGS += -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror \ + -Wshadow -Wmissing-declarations -Wnested-externs # -W -AHDR=vi.h emacs.h common.h -ASRC=${.CURDIR}/vi.c ${.CURDIR}/emacs.c ${.CURDIR}/common.c +build: $(LIB) + +$(LIB): $(GENSRCS) $(OBJS) + $(AR) -rcv $(LIB) $(OBJS) + +clobber: + $(RM) -f $(GENSRCS) $(OBJS) $(LIB) vi.h: vi.c makelist - sh ${.CURDIR}/makelist -h ${.CURDIR}/vi.c > ${.TARGET} + $(SH) makelist -h vi.c > $@ emacs.h: emacs.c makelist - sh ${.CURDIR}/makelist -h ${.CURDIR}/emacs.c > ${.TARGET} + $(SH) makelist -h emacs.c > $@ common.h: common.c makelist - sh ${.CURDIR}/makelist -h ${.CURDIR}/common.c > ${.TARGET} + $(SH) makelist -h common.c > $@ fcns.h: ${AHDR} makelist - sh ${.CURDIR}/makelist -fh ${AHDR} > ${.TARGET} + $(SH) makelist -fh ${AHDR} > $@ fcns.c: ${AHDR} fcns.h makelist - sh ${.CURDIR}/makelist -fc ${AHDR} > ${.TARGET} + $(SH) makelist -fc ${AHDR} > $@ help.c: ${ASRC} makelist - sh ${.CURDIR}/makelist -bc ${ASRC} > ${.TARGET} + $(SH) makelist -bc ${ASRC} > $@ help.h: ${ASRC} makelist - sh ${.CURDIR}/makelist -bh ${ASRC} > ${.TARGET} + $(SH) makelist -bh ${ASRC} > $@ editline.c: ${OSRCS} - sh ${.CURDIR}/makelist -e ${.ALLSRC:T} > ${.TARGET} + $(SH) makelist -e ${OSRCS} > $@ -.depend: vi.h emacs.h common.h fcns.h help.h help.c +chared.o:: $(SYS_ELL_H) +common.o:: $(SYS_ELL_H) +el.o:: $(SYS_ELL_H) +emacs.o:: $(SYS_ELL_H) +hist.o:: $(SYS_ELL_H) +key.o:: $(SYS_ELL_H) +map.o:: $(SYS_ELL_H) +parse.o:: $(SYS_ELL_H) tokenizer.h +prompt.o:: $(SYS_ELL_H) +read.o:: $(SYS_ELL_H) +refresh.o:: $(SYS_ELL_H) +search.o:: $(SYS_ELL_H) +sig.o:: $(SYS_ELL_H) +term.o:: $(SYS_ELL_H) +tty.o:: $(SYS_ELL_H) tty.h +vi.o:: $(SYS_ELL_H) +# .depend: vi.h emacs.h common.h fcns.h help.h help.c -test: test.o libedit.a ${DPADD} ${LIBTERMCAP} - ${CC} ${CFLAGS} ${.ALLSRC} -o ${.TARGET} libedit.a ${LDADD} -ltermcap +testit: TEST/test.o libedit.a ${DPADD} ${LIBTERMCAP} + ${CC} ${CFLAGS} TEST/test.o ${DPADD} -o $@ libedit.a ${LDADD} -ltermcap -.include +# .include diff --git a/lib/libedit/chared.h b/lib/libedit/chared.h index 22d07f0..79504b3 100644 --- a/lib/libedit/chared.h +++ b/lib/libedit/chared.h @@ -45,7 +45,11 @@ #include #include +#ifdef linux +#include "../../include/histedit.h" +#else #include "histedit.h" +#endif #define EL_MAXMACRO 10 diff --git a/lib/libedit/el.c b/lib/libedit/el.c index 075a053..fc71b63 100644 --- a/lib/libedit/el.c +++ b/lib/libedit/el.c @@ -54,6 +54,10 @@ static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94"; #endif #include "el.h" +#ifdef linux +extern char *fgetln __P((FILE *, size_t *)); +#endif + /* el_init(): * Initialize editline and set default parameters. */ diff --git a/lib/libedit/hist.h b/lib/libedit/hist.h index 90c0569..983bd35 100644 --- a/lib/libedit/hist.h +++ b/lib/libedit/hist.h @@ -42,7 +42,11 @@ #ifndef _h_el_hist #define _h_el_hist +#ifdef linux +#include "../../include/histedit.h" +#else #include "histedit.h" +#endif typedef const HistEvent * (*hist_fun_t) __P((ptr_t, int, ...)); diff --git a/lib/libedit/history.c b/lib/libedit/history.c index d60a7a9..0548d93 100644 --- a/lib/libedit/history.c +++ b/lib/libedit/history.c @@ -51,7 +51,11 @@ static char sccsid[] = "@(#)history.c 8.1 (Berkeley) 6/4/93"; #include #endif +#ifdef linux +#include "unix/histedit.h" +#else #include "histedit.h" +#endif typedef const HistEvent * (*history_gfun_t) __P((ptr_t)); typedef const HistEvent * (*history_efun_t) __P((ptr_t, const char *)); diff --git a/lib/libedit/makelist b/lib/libedit/makelist index 0b2e7a0..1b1a752 100644 --- a/lib/libedit/makelist +++ b/lib/libedit/makelist @@ -56,7 +56,7 @@ case $FLAG in -h) OIFS="$IFS" IFS=".$IFS" - set - $FILES + set -- $FILES IFS="$OIFS" hdr="_h_`basename $1`_$2" cat $FILES | $AWK ' diff --git a/lib/libedit/map.c b/lib/libedit/map.c index 5f91c75..55d8aa1 100644 --- a/lib/libedit/map.c +++ b/lib/libedit/map.c @@ -1213,6 +1213,10 @@ map_print_all_keys(el) /* map_bind(): * Add/remove/change bindings */ + +/* don't shadow stdlib.h decl */ +#define REMOVE localRemove + protected int map_bind(el, argc, argv) EditLine *el; @@ -1220,7 +1224,7 @@ map_bind(el, argc, argv) char **argv; { el_action_t *map; - int ntype, remove; + int ntype, REMOVE; char *p; char inbuf[EL_BUFSIZ]; char outbuf[EL_BUFSIZ]; @@ -1235,7 +1239,7 @@ map_bind(el, argc, argv) map = el->el_map.key; ntype = XK_CMD; - key = remove = 0; + key = REMOVE = 0; for (argc = 1; (p = argv[argc]) != NULL; argc++) if (p[0] == '-') switch (p[1]) { @@ -1256,7 +1260,7 @@ map_bind(el, argc, argv) break; case 'r': - remove = 1; + REMOVE = 1; break; case 'v': @@ -1293,7 +1297,7 @@ map_bind(el, argc, argv) return -1; } - if (remove) { + if (REMOVE) { if (key) { (void) term_clear_arrow(el, in); return -1; diff --git a/lib/libedit/prompt.h b/lib/libedit/prompt.h index a624fc0..91756a5 100644 --- a/lib/libedit/prompt.h +++ b/lib/libedit/prompt.h @@ -42,7 +42,11 @@ #ifndef _h_el_prompt #define _h_el_prompt +#ifdef linux +#include "../../include/histedit.h" +#else #include "histedit.h" +#endif typedef char * (*el_pfunc_t) __P((EditLine*)); diff --git a/lib/libedit/read.c b/lib/libedit/read.c index 05049e8..312f0c7 100644 --- a/lib/libedit/read.c +++ b/lib/libedit/read.c @@ -46,11 +46,16 @@ static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93"; #include #include #include +#include extern int errno; #include "el.h" #define OKCMD -1 +#ifndef MIN +#define MIN(a,b) ((a)<(b) ? (a) : (b)) +#endif + private int read__fixio __P((int, int)); private int read_preread __P((EditLine *)); private int read_getcmd __P((EditLine *, el_action_t *, char *)); @@ -131,8 +136,7 @@ read__fixio(fd, e) * Try to read the stuff in the input queue; */ private int -read_preread(el) - EditLine *el; +read_preread(EditLine *el) { int chrs = 0; @@ -153,7 +157,12 @@ read_preread(el) if (chrs > 0) { buf[chrs] = '\0'; el->el_chared.c_macro.nline = strdup(buf); +#if 0 + /* gdr: original version */ el_push(el->el_chared.c_macro.nline); +#else + el_push(el, el->el_chared.c_macro.nline); +#endif } } #endif /* FIONREAD */ @@ -245,9 +254,7 @@ read_getcmd(el, cmdnum, ch) * Read a character */ public int -el_getc(el, cp) - EditLine *el; - char *cp; +el_getc(EditLine *el, char *cp) { int num_read; unsigned char tcp; @@ -301,14 +308,16 @@ el_getc(el, cp) public const char * -el_gets(el, nread) - EditLine *el; - int *nread; +el_gets(EditLine *el, int *nread) { int retval; el_action_t cmdnum = 0; int num; /* how many chars we have read at NL */ char ch; +#if 1 + /* gdr: this wasn't here in the original. cut&paste from above */ + c_macro_t *ma = &el->el_chared.c_macro; +#endif if (el->el_flags & HANDLE_SIGNALS) sig_set(el); @@ -316,6 +325,7 @@ el_gets(el, nread) re_clear_display(el); /* reset the display stuff */ ch_reset(el); + #ifdef FIONREAD if (el->el_tty.t_mode == EX_IO && ma->level < 0) { long chrs = 0; diff --git a/lib/libedit/refresh.h b/lib/libedit/refresh.h index 4fe50bc..4b26f2a 100644 --- a/lib/libedit/refresh.h +++ b/lib/libedit/refresh.h @@ -42,7 +42,11 @@ #ifndef _h_el_refresh #define _h_el_refresh +#ifdef linux +#include "../../include/histedit.h" +#else #include "histedit.h" +#endif typedef struct { coord_t r_cursor; /* Refresh cursor position */ diff --git a/lib/libedit/search.h b/lib/libedit/search.h index 346b38c..9da0c0c 100644 --- a/lib/libedit/search.h +++ b/lib/libedit/search.h @@ -42,7 +42,11 @@ #ifndef _h_el_search #define _h_el_search +#ifdef linux +#include "../../include/histedit.h" +#else #include "histedit.h" +#endif typedef struct el_search_t { char *patbuf; /* The pattern buffer */ diff --git a/lib/libedit/sig.h b/lib/libedit/sig.h index 98da74f..a407146 100644 --- a/lib/libedit/sig.h +++ b/lib/libedit/sig.h @@ -44,7 +44,11 @@ #include +#ifdef linux +#include "../../include/histedit.h" +#else #include "histedit.h" +#endif /* * Define here all the signals we are going to handle @@ -60,6 +64,10 @@ _DO(SIGCONT) \ _DO(SIGWINCH) +#ifdef linux +typedef void (*sig_t) __P((int)); +#endif + typedef sig_t *el_signal_t; protected void sig_end __P((EditLine*)); diff --git a/lib/libedit/term.c b/lib/libedit/term.c index f98d02f..695e158 100644 --- a/lib/libedit/term.c +++ b/lib/libedit/term.c @@ -51,8 +51,10 @@ static char sccsid[] = "@(#)term.c 8.2 (Berkeley) 4/30/95"; #include #include #include +#include #include "el.h" +#include "term.h" /* * IMPORTANT NOTE: these routines are allowed to look at the current screen @@ -187,8 +189,7 @@ private FILE *term_outfile = NULL; /* XXX: How do we fix that? */ * Set the terminal capability flags */ private void -term_setflags(el) - EditLine *el; +term_setflags(EditLine *el) { EL_FLAGS = 0; if (el->el_tty.t_tabs) @@ -1249,7 +1250,13 @@ term_echotc(el, argc, argv) } #endif else if (strcmp(*argv, "baud") == 0) { - (void) fprintf(el->el_outfile, "%ld\n", el->el_tty.t_speed); + (void) fprintf(el->el_outfile, +#if defined(linux) || defined(__GNO__) + "%d\n", +#else + "%ld\n", +#endif + el->el_tty.t_speed); return 0; } else if (strcmp(*argv, "rows") == 0 || strcmp(*argv, "lines") == 0) { diff --git a/lib/libedit/term.h b/lib/libedit/term.h index f9de221..982d779 100644 --- a/lib/libedit/term.h +++ b/lib/libedit/term.h @@ -42,7 +42,11 @@ #ifndef _h_el_term #define _h_el_term +#ifdef linux +#include "../../include/histedit.h" +#else #include "histedit.h" +#endif typedef struct { /* Symbolic function key bindings */ char *name; /* name of the key */ diff --git a/lib/libedit/termcap.h b/lib/libedit/termcap.h index 4fd2cab..f465a94 100644 --- a/lib/libedit/termcap.h +++ b/lib/libedit/termcap.h @@ -47,6 +47,10 @@ char *tgetstr __P((char *, char **)); int tgetflag __P((char *)); int tgetnum __P((char *)); char *tgoto __P((char *, int, int)); -char *tputs __P((char *, int, void (*)(int))); +#if 0 +char *tputs __P((char *, int, void (*)(int))); /* original */ +#else +char *tputs __P((char *, int, int (*)(int))); +#endif #endif /* _h_termcap */ diff --git a/lib/libedit/tty.h b/lib/libedit/tty.h index 14ba109..736da1a 100644 --- a/lib/libedit/tty.h +++ b/lib/libedit/tty.h @@ -42,7 +42,11 @@ #ifndef _h_el_tty #define _h_el_tty +#ifdef linux +#include "../../include/histedit.h" +#else #include "histedit.h" +#endif #include /* Define our own since everyone gets it wrong! */ diff --git a/lib/libedit/unix/histedit.h b/lib/libedit/unix/histedit.h new file mode 100644 index 0000000..a65a60d --- /dev/null +++ b/lib/libedit/unix/histedit.h @@ -0,0 +1,172 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * 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 University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University 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 REGENTS 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. + * + * @(#)histedit.h 8.2 (Berkeley) 1/3/94 + */ + +/* + * histedit.h: Line editor and history interface. + */ +#ifndef _h_editline +#define _h_editline + +#include +#include + +/* + * ==== Editing ==== + */ +typedef struct editline EditLine; + +/* + * For user-defined function interface + */ +typedef struct lineinfo { + __const char *buffer; + __const char *cursor; + __const char *lastchar; +} LineInfo; + + +/* + * EditLine editor function return codes. + * For user-defined function interface + */ +#define CC_NORM 0 +#define CC_NEWLINE 1 +#define CC_EOF 2 +#define CC_ARGHACK 3 +#define CC_REFRESH 4 +#define CC_CURSOR 5 +#define CC_ERROR 6 +#define CC_FATAL 7 + +/* + * Initialization, cleanup, and resetting + */ +EditLine *el_init __P((const char *, FILE *, FILE *)); +void el_reset __P((EditLine *)); +void el_end __P((EditLine *)); + + +/* + * Get a line, a character or push a string back in the input queue + */ +__const char *el_gets __P((EditLine *, int *)); +int el_getc __P((EditLine *, char *)); +void el_push __P((EditLine *, const char *)); + +/* + * High level function internals control + * Parses argc, argv array and executes builtin editline commands + */ +int el_parse __P((EditLine *, int, char **)); + +/* + * Low level editline access function + */ +int el_set __P((EditLine *, int, ...)); + +/* + * el_set/el_get parameters + */ +#define EL_PROMPT 0 /* , el_pfunc_t); */ +#define EL_TERMINAL 1 /* , const char *); */ +#define EL_EDITOR 2 /* , const char *); */ +#define EL_SIGNAL 3 /* , int); */ +#define EL_BIND 4 /* , const char *, ..., NULL); */ +#define EL_TELLTC 5 /* , const char *, ..., NULL); */ +#define EL_SETTC 6 /* , const char *, ..., NULL); */ +#define EL_ECHOTC 7 /* , const char *, ..., NULL); */ +#define EL_SETTY 8 /* , const char *, ..., NULL); */ +#define EL_ADDFN 9 /* , const char *, const char * */ + /* , el_func_t); */ +#define EL_HIST 10 /* , hist_fun_t, const char *); */ + +/* + * Source named file or $PWD/.editrc or $HOME/.editrc + */ +int el_source __P((EditLine *, const char *)); + +/* + * Must be called when the terminal changes size; If EL_SIGNAL + * is set this is done automatically otherwise it is the responsibility + * of the application + */ +void el_resize __P((EditLine *)); + + +/* + * User-defined function interface. + */ +__const LineInfo *el_line __P((EditLine *)); +int el_insertstr __P((EditLine *, char *)); +void el_deletestr __P((EditLine *, int)); + +/* + * ==== History ==== + */ + +typedef struct history History; + +typedef struct HistEvent { + int num; + __const char *str; +} HistEvent; + +/* + * History access functions. + */ +History * history_init __P((void)); +void history_end __P((History *)); + +__const HistEvent * history __P((History *, int, ...)); + +#define H_FUNC 0 /* , UTSL */ +#define H_EVENT 1 /* , const int); */ +#define H_FIRST 2 /* , void); */ +#define H_LAST 3 /* , void); */ +#define H_PREV 4 /* , void); */ +#define H_NEXT 5 /* , void); */ +#define H_CURR 6 /* , void); */ +#define H_ADD 7 /* , const char*); */ +#define H_ENTER 8 /* , const char*); */ +#define H_END 9 /* , void); */ +#define H_NEXT_STR 10 /* , const char*); */ +#define H_PREV_STR 11 /* , const char*); */ +#define H_NEXT_EVENT 12 /* , const int); */ +#define H_PREV_EVENT 13 /* , const int); */ + +#endif /* _h_editline */ diff --git a/lib/libedit/vi.c b/lib/libedit/vi.c index 1a46780..a07820f 100644 --- a/lib/libedit/vi.c +++ b/lib/libedit/vi.c @@ -45,6 +45,7 @@ static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93"; #include "el.h" private el_action_t cv_action __P((EditLine *, int)); +protected el_action_t cv_paste __P((EditLine *el, int c)); /* cv_action(): * Handle vi actions. @@ -104,9 +105,7 @@ cv_action(el, c) * Paste previous deletion before or after the cursor */ protected el_action_t -cv_paste(el, c) - EditLine *el; - int c; +cv_paste(EditLine *el, int c) { char *ptr; c_undo_t *un = &el->el_chared.c_undo;