diff --git a/configure b/configure index ce5b211..443d934 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61 for Minix editline 0.2.1. +# Generated by GNU Autoconf 2.61 for Minix editline 0.2.2. # # Report bugs to . # @@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Minix editline' PACKAGE_TARNAME='minix-editline' -PACKAGE_VERSION='0.2.1' -PACKAGE_STRING='Minix editline 0.2.1' +PACKAGE_VERSION='0.2.2' +PACKAGE_STRING='Minix editline 0.2.2' PACKAGE_BUGREPORT='joachim@vmlinux.org' ac_unique_file="src/editline.c" @@ -1210,7 +1210,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Minix editline 0.2.1 to adapt to many kinds of systems. +\`configure' configures Minix editline 0.2.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1276,7 +1276,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Minix editline 0.2.1:";; + short | recursive ) echo "Configuration of Minix editline 0.2.2:";; esac cat <<\_ACEOF @@ -1361,7 +1361,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Minix editline configure 0.2.1 +Minix editline configure 0.2.2 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1375,7 +1375,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Minix editline $as_me 0.2.1, which was +It was created by Minix editline $as_me 0.2.2, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -2070,7 +2070,7 @@ fi # Define the identity of the package. PACKAGE='minix-editline' - VERSION='0.2.1' + VERSION='0.2.2' cat >>confdefs.h <<_ACEOF @@ -4973,9 +4973,9 @@ fi done -# Check whether --enable-complete was given. -if test "${enable_complete+set}" = set; then - enableval=$enable_complete; +# Check whether --enable-default-complete was given. +if test "${enable_default_complete+set}" = set; then + enableval=$enable_default_complete; case "${enableval}" in yes) complete=true @@ -5421,7 +5421,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Minix editline $as_me 0.2.1, which was +This file was extended by Minix editline $as_me 0.2.2, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -5474,7 +5474,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -Minix editline config.status 0.2.1 +Minix editline config.status 0.2.2 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.ac b/configure.ac index 3764fdd..baab55d 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.61) -AC_INIT(Minix editline, 0.2.1, joachim@vmlinux.org) +AC_INIT(Minix editline, 0.2.2, joachim@vmlinux.org) AC_CONFIG_SRCDIR([src/editline.c]) AC_CONFIG_HEADER([config.h]) @@ -40,7 +40,7 @@ AC_PROG_GCC_TRADITIONAL AC_FUNC_STAT AC_CHECK_FUNCS([strchr strdup strrchr tcgetattr]) -AC_ARG_ENABLE([complete], +AC_ARG_ENABLE([default-complete], [ --enable-default-complete Enable default completion handler.],[ case "${enableval}" in yes) diff --git a/examples/Makefile.am b/examples/Makefile.am index f3bb128..d5f2f6f 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -5,6 +5,3 @@ AM_CFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include # TODO: Port "fileman" example from BSD editline noinst_PROGRAMS = testit cli - -testit_SOURCES = testit.c -#fileman_SOURCES = fileman.c diff --git a/examples/Makefile.in b/examples/Makefile.in index 70c362d..05a3445 100644 --- a/examples/Makefile.in +++ b/examples/Makefile.in @@ -45,8 +45,8 @@ cli_SOURCES = cli.c cli_OBJECTS = cli.$(OBJEXT) cli_LDADD = $(LDADD) cli_DEPENDENCIES = $(top_builddir)/src/libedit.a -am_testit_OBJECTS = testit.$(OBJEXT) -testit_OBJECTS = $(am_testit_OBJECTS) +testit_SOURCES = testit.c +testit_OBJECTS = testit.$(OBJEXT) testit_LDADD = $(LDADD) testit_DEPENDENCIES = $(top_builddir)/src/libedit.a DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) @@ -56,8 +56,8 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -SOURCES = cli.c $(testit_SOURCES) -DIST_SOURCES = cli.c $(testit_SOURCES) +SOURCES = cli.c testit.c +DIST_SOURCES = cli.c testit.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -149,7 +149,6 @@ top_srcdir = @top_srcdir@ AUTOMAKE_OPTIONS = foreign LDADD = $(top_builddir)/src/libedit.a AM_CFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include -testit_SOURCES = testit.c all: all-am .SUFFIXES: @@ -389,7 +388,6 @@ uninstall-am: mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am -#fileman_SOURCES = fileman.c # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/examples/cli.c b/examples/cli.c index 9566667..4726696 100644 --- a/examples/cli.c +++ b/examples/cli.c @@ -1,6 +1,4 @@ -/* The "testit" micro shell, now with command completion. - * To be able to run, don't "--enable-default-complete". - */ +/* Custom CLI command completion. */ #include "editline.h" #include @@ -12,7 +10,7 @@ char *list[] = { ** Attempt to complete the pathname, returning an allocated copy. ** Fill in *unique if we completed it, or set it to 0 if ambiguous. */ -char *rl_complete(char *token, int *match) +char *my_rl_complete(char *token, int *match) { int i; int index = -1; @@ -43,7 +41,7 @@ char *rl_complete(char *token, int *match) /* ** Return all possible completions. */ -int rl_list_possib(char *token, char ***av) +int my_rl_list_possib(char *token, char ***av) { int i, num, total = 0; char **copy; @@ -69,6 +67,10 @@ int main(int ac, char *av[]) char *line; char *prompt = "cli> "; + /* Setup callbacks */ + rl_complete = &my_rl_complete; + rl_list_possib = &my_rl_list_possib; + while ((line = readline(prompt)) != NULL) { (void)printf("\t\t\t|%s|\n", line); free(line); diff --git a/include/editline.h b/include/editline.h index fa846ab..3ba0e2b 100644 --- a/include/editline.h +++ b/include/editline.h @@ -2,6 +2,11 @@ #ifndef __EDITLINE_H__ #define __EDITLINE_H__ +/* Assign these to get command completion, see cli.c for + * example usage. */ +char *(*rl_complete)(char *token, int *match); +int (*rl_list_possib)(char *token, char ***av); + /* ** For compatibility with FSF readline. */ diff --git a/src/Makefile.am b/src/Makefile.am index f3a02ff..45920d4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,4 +6,5 @@ libedit_a_SOURCES = editline.c editline.h sysunix.c unix.h if COMPLETE # Built-in completion handler. libedit_a_SOURCES += complete.c +AM_CPPFLAGS = -DCOMPLETE endif diff --git a/src/Makefile.in b/src/Makefile.in index f4cf1b0..13802c6 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -161,6 +161,7 @@ AUTOMAKE_OPTIONS = foreign lib_LIBRARIES = libedit.a libedit_a_SOURCES = editline.c editline.h sysunix.c unix.h \ $(am__append_1) +@COMPLETE_TRUE@AM_CPPFLAGS = -DCOMPLETE all: all-am .SUFFIXES: diff --git a/src/complete.c b/src/complete.c index 34c35f4..bfc516f 100755 --- a/src/complete.c +++ b/src/complete.c @@ -161,7 +161,7 @@ SplitPath(path, dirpart, filepart) ** Fill in *unique if we completed it, or set it to 0 if ambiguous. */ char * -rl_complete(pathname, unique) +default_rl_complete(pathname, unique) char *pathname; int *unique; { @@ -233,7 +233,7 @@ rl_complete(pathname, unique) ** Return all possible completions. */ int -rl_list_possib(pathname, avp) +default_rl_list_possib(pathname, avp) char *pathname; char ***avp; { diff --git a/src/editline.c b/src/editline.c index 7cc413a..f700389 100755 --- a/src/editline.c +++ b/src/editline.c @@ -97,6 +97,11 @@ STATIC int TTYrows; /* Display print 8-bit chars as `M-x' or as the actual 8-bit char? */ int rl_meta_chars = 1; +/* User definable callbacks. */ +char *(*rl_complete)(char *token, int *match); +int (*rl_list_possib)(char *token, char ***av); + + /* ** Declarations. */ @@ -1033,6 +1038,20 @@ rl_reset_terminal(p) void rl_initialize(void) { +#ifdef COMPLETE + int done = 0; + + if (!done) + { + if (!rl_complete) + rl_complete = &default_rl_complete; + + if (!rl_list_possib) + rl_list_possib = &default_rl_list_possib; + + done = 1; + } +#endif } char * @@ -1042,6 +1061,9 @@ readline(prompt) CHAR *line; int s; + /* Unless called by the user already. */ + rl_initialize (); + if (!isatty(0)) { TTYflush(); return read_redirected(); @@ -1177,6 +1199,10 @@ c_possible(void) CHAR *word; int ac; + if (!rl_list_possib) { + return ring_bell(); + } + word = find_word(); ac = rl_list_possib((char *)word, (char ***)&av); if (word) @@ -1200,6 +1226,10 @@ c_complete(void) int unique; STATUS s; + if (!rl_complete) { + return ring_bell(); + } + word = find_word(); p = (CHAR *)rl_complete((char *)word, &unique); if (word) diff --git a/src/editline.h b/src/editline.h index f0d8847..2a43ac9 100755 --- a/src/editline.h +++ b/src/editline.h @@ -2,6 +2,9 @@ ** ** Internal header file for editline library. */ +#ifndef __PRIVATE_EDITLINE_H__ +#define __PRIVATE_EDITLINE_H__ + #include #include #ifdef HAVE_MALLOC_H @@ -70,8 +73,10 @@ extern int rl_quit; #if defined(DO_SIGTSTP) extern int rl_susp; #endif /* defined(DO_SIGTSTP) */ -extern char *rl_complete(); -extern int rl_list_possib(char *pathname, char ***avp); +#ifdef COMPLETE +extern char *default_rl_complete(); +extern int default_rl_list_possib(char *pathname, char ***avp); +#endif extern void rl_ttyset(); extern void rl_add_slash(); @@ -93,3 +98,6 @@ extern int strncmp(); #if defined(NEED_STRDUP) extern char *strdup(); #endif + +#include "../include/editline.h" +#endif /* __PRIVATE_EDITLINE_H__ */