4 Commits
0.2.1 ... 0.2.2

Author SHA1 Message Date
Joachim Nilsson
62e900a061 Change rl_complete() and rl_list_possib() to be function pointers instead.
This is a much cleaner design and also works with or without the configure
--enable-default-complete option.

See the examples for details.
2008-10-02 09:09:09 +02:00
Joachim Nilsson
5c9f0047bb Basic support for custom completion handlers with the two "standard"
rl_complete() and rl_list_possib().  Simply leave out complete.o from
the default build and in all programs require these two functions to
be supplied.

A better alternative would be to use function pointers and check those
for NULL in the running code.  With this code, and no completion handler
the editline code will die.
2008-10-02 01:52:40 +02:00
Joachim Nilsson
4a3fbd9187 Add note on custom completion support. 2008-08-10 21:50:00 +02:00
Joachim Nilsson
05f4234310 Update reminder of adding support for escape sequences. 2008-06-10 07:29:06 +02:00
12 changed files with 236 additions and 35 deletions

8
TODO
View File

@@ -4,3 +4,11 @@ TODO
* Add --enable-FEATURE for features defined in Makefile-minix.in * Add --enable-FEATURE for features defined in Makefile-minix.in
* Add support for custom completion, rl_attempted_completion_function.
* Add support for inhibiting completion: rl_inhibit_completion
* Add support for arrow keys, home, end, etc. See the following URL
for how to catch complex key strokes such as escape sequences:
http://www.unixwiz.net/techtips/termios-vmin-vtime.html

63
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # 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 <joachim@vmlinux.org>. # Report bugs to <joachim@vmlinux.org>.
# #
@@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package. # Identity of this package.
PACKAGE_NAME='Minix editline' PACKAGE_NAME='Minix editline'
PACKAGE_TARNAME='minix-editline' PACKAGE_TARNAME='minix-editline'
PACKAGE_VERSION='0.2.1' PACKAGE_VERSION='0.2.2'
PACKAGE_STRING='Minix editline 0.2.1' PACKAGE_STRING='Minix editline 0.2.2'
PACKAGE_BUGREPORT='joachim@vmlinux.org' PACKAGE_BUGREPORT='joachim@vmlinux.org'
ac_unique_file="src/editline.c" ac_unique_file="src/editline.c"
@@ -695,6 +695,8 @@ CPP
GREP GREP
EGREP EGREP
LIBOBJS LIBOBJS
COMPLETE_TRUE
COMPLETE_FALSE
LTLIBOBJS' LTLIBOBJS'
ac_subst_files='' ac_subst_files=''
ac_precious_vars='build_alias ac_precious_vars='build_alias
@@ -1208,7 +1210,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # 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. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF 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]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1274,7 +1276,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in 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 esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1283,6 +1285,7 @@ Optional Features:
--enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--disable-dependency-tracking speeds up one-time build --disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors --enable-dependency-tracking do not reject slow dependency extractors
--enable-default-complete Enable default completion handler.
Some influential environment variables: Some influential environment variables:
CC C compiler command CC C compiler command
@@ -1358,7 +1361,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
Minix editline configure 0.2.1 Minix editline configure 0.2.2
generated by GNU Autoconf 2.61 generated by GNU Autoconf 2.61
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1372,7 +1375,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. 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 generated by GNU Autoconf 2.61. Invocation command line was
$ $0 $@ $ $0 $@
@@ -2067,7 +2070,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='minix-editline' PACKAGE='minix-editline'
VERSION='0.2.1' VERSION='0.2.2'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@@ -4970,6 +4973,35 @@ fi
done done
# 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
;;
no)
complete=false
;;
*)
{ { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-default-complete" >&5
echo "$as_me: error: bad value ${enableval} for --enable-default-complete" >&2;}
{ (exit 1); exit 1; }; }
;;
esac
else
complete=false
fi
if test x$complete = xtrue; then
COMPLETE_TRUE=
COMPLETE_FALSE='#'
else
COMPLETE_TRUE='#'
COMPLETE_FALSE=
fi
ac_config_files="$ac_config_files Makefile src/Makefile include/Makefile man/Makefile examples/Makefile" ac_config_files="$ac_config_files Makefile src/Makefile include/Makefile man/Makefile examples/Makefile"
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
@@ -5082,6 +5114,13 @@ echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
Usually this means the macro was only invoked conditionally." >&2;} Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; } { (exit 1); exit 1; }; }
fi fi
if test -z "${COMPLETE_TRUE}" && test -z "${COMPLETE_FALSE}"; then
{ { echo "$as_me:$LINENO: error: conditional \"COMPLETE\" was never defined.
Usually this means the macro was only invoked conditionally." >&5
echo "$as_me: error: conditional \"COMPLETE\" was never defined.
Usually this means the macro was only invoked conditionally." >&2;}
{ (exit 1); exit 1; }; }
fi
: ${CONFIG_STATUS=./config.status} : ${CONFIG_STATUS=./config.status}
ac_clean_files_save=$ac_clean_files ac_clean_files_save=$ac_clean_files
@@ -5382,7 +5421,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" 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 generated by GNU Autoconf 2.61. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -5435,7 +5474,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\ 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, configured by $0, generated by GNU Autoconf 2.61,
with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
@@ -5698,10 +5737,12 @@ CPP!$CPP$ac_delim
GREP!$GREP$ac_delim GREP!$GREP$ac_delim
EGREP!$EGREP$ac_delim EGREP!$EGREP$ac_delim
LIBOBJS!$LIBOBJS$ac_delim LIBOBJS!$LIBOBJS$ac_delim
COMPLETE_TRUE!$COMPLETE_TRUE$ac_delim
COMPLETE_FALSE!$COMPLETE_FALSE$ac_delim
LTLIBOBJS!$LTLIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim
_ACEOF _ACEOF
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 81; then if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 83; then
break break
elif $ac_last_try; then elif $ac_last_try; then
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5

View File

@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script. # Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61) 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_SRCDIR([src/editline.c])
AC_CONFIG_HEADER([config.h]) AC_CONFIG_HEADER([config.h])
@@ -40,4 +40,19 @@ AC_PROG_GCC_TRADITIONAL
AC_FUNC_STAT AC_FUNC_STAT
AC_CHECK_FUNCS([strchr strdup strrchr tcgetattr]) AC_CHECK_FUNCS([strchr strdup strrchr tcgetattr])
AC_ARG_ENABLE([default-complete],
[ --enable-default-complete Enable default completion handler.],[
case "${enableval}" in
yes)
complete=true
;;
no)
complete=false
;;
*)
AC_MSG_ERROR([bad value ${enableval} for --enable-default-complete])
;;
esac],[complete=false])
AM_CONDITIONAL([COMPLETE], [test x$complete = xtrue])
AC_OUTPUT(Makefile src/Makefile include/Makefile man/Makefile examples/Makefile) AC_OUTPUT(Makefile src/Makefile include/Makefile man/Makefile examples/Makefile)

View File

@@ -1,10 +1,7 @@
AUTOMAKE_OPTIONS = foreign AUTOMAKE_OPTIONS = foreign
LDADD = $(top_builddir)/src/libedit.a LDADD = $(top_builddir)/src/libedit.a
AM_CFLAGS = -I$(top_srcdir)/src AM_CFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include
# TODO: Port "fileman" example from BSD editline # TODO: Port "fileman" example from BSD editline
noinst_PROGRAMS = testit noinst_PROGRAMS = testit cli
testit_SOURCES = testit.c
#fileman_SOURCES = fileman.c

View File

@@ -30,7 +30,7 @@ POST_INSTALL = :
NORMAL_UNINSTALL = : NORMAL_UNINSTALL = :
PRE_UNINSTALL = : PRE_UNINSTALL = :
POST_UNINSTALL = : POST_UNINSTALL = :
noinst_PROGRAMS = testit$(EXEEXT) noinst_PROGRAMS = testit$(EXEEXT) cli$(EXEEXT)
subdir = examples subdir = examples
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -41,8 +41,12 @@ mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES = CONFIG_CLEAN_FILES =
PROGRAMS = $(noinst_PROGRAMS) PROGRAMS = $(noinst_PROGRAMS)
am_testit_OBJECTS = testit.$(OBJEXT) cli_SOURCES = cli.c
testit_OBJECTS = $(am_testit_OBJECTS) cli_OBJECTS = cli.$(OBJEXT)
cli_LDADD = $(LDADD)
cli_DEPENDENCIES = $(top_builddir)/src/libedit.a
testit_SOURCES = testit.c
testit_OBJECTS = testit.$(OBJEXT)
testit_LDADD = $(LDADD) testit_LDADD = $(LDADD)
testit_DEPENDENCIES = $(top_builddir)/src/libedit.a testit_DEPENDENCIES = $(top_builddir)/src/libedit.a
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
@@ -52,8 +56,8 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC) CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(testit_SOURCES) SOURCES = cli.c testit.c
DIST_SOURCES = $(testit_SOURCES) DIST_SOURCES = cli.c testit.c
ETAGS = etags ETAGS = etags
CTAGS = ctags CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -144,8 +148,7 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign AUTOMAKE_OPTIONS = foreign
LDADD = $(top_builddir)/src/libedit.a LDADD = $(top_builddir)/src/libedit.a
AM_CFLAGS = -I$(top_srcdir)/src AM_CFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include
testit_SOURCES = testit.c
all: all-am all: all-am
.SUFFIXES: .SUFFIXES:
@@ -182,6 +185,9 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps)
clean-noinstPROGRAMS: clean-noinstPROGRAMS:
-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
cli$(EXEEXT): $(cli_OBJECTS) $(cli_DEPENDENCIES)
@rm -f cli$(EXEEXT)
$(LINK) $(cli_OBJECTS) $(cli_LDADD) $(LIBS)
testit$(EXEEXT): $(testit_OBJECTS) $(testit_DEPENDENCIES) testit$(EXEEXT): $(testit_OBJECTS) $(testit_DEPENDENCIES)
@rm -f testit$(EXEEXT) @rm -f testit$(EXEEXT)
$(LINK) $(testit_OBJECTS) $(testit_LDADD) $(LIBS) $(LINK) $(testit_OBJECTS) $(testit_LDADD) $(LIBS)
@@ -192,6 +198,7 @@ mostlyclean-compile:
distclean-compile: distclean-compile:
-rm -f *.tab.c -rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cli.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testit.Po@am__quote@
.c.o: .c.o:
@@ -381,7 +388,6 @@ uninstall-am:
mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
uninstall-am uninstall-am
#fileman_SOURCES = fileman.c
# Tell versions [3.59,3.63) of GNU make to not export all variables. # 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. # Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT: .NOEXPORT:

80
examples/cli.c Normal file
View File

@@ -0,0 +1,80 @@
/* Custom CLI command completion. */
#include "editline.h"
#include <string.h>
char *list[] = {
"foo ", "bar ", "bsd ", "cli ", "ls ", "cd ", "malloc ", "tee ", NULL
};
/*
** Attempt to complete the pathname, returning an allocated copy.
** Fill in *unique if we completed it, or set it to 0 if ambiguous.
*/
char *my_rl_complete(char *token, int *match)
{
int i;
int index = -1;
int matchlen = 0;
int count = 0;
for (i = 0; list[i]; i++)
{
int partlen = strlen (token); /* Part of token */
if (!strncmp (list[i], token, partlen))
{
index = i;
matchlen = partlen;
count ++;
}
}
if (count == 1)
{
*match = 1;
return strdup (list[index] + matchlen);
}
return NULL;
}
/*
** Return all possible completions.
*/
int my_rl_list_possib(char *token, char ***av)
{
int i, num, total = 0;
char **copy;
for (num = 0; list[num]; num++)
;
copy = (char **) malloc (num * sizeof(char *));
for (i = 0; i < num; i++)
{
if (!strncmp (list[i], token, strlen (token)))
{
copy[total] = strdup (list[i]);
total ++;
}
}
*av = copy;
return total;
}
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);
}
return 0;
}

View File

@@ -2,6 +2,11 @@
#ifndef __EDITLINE_H__ #ifndef __EDITLINE_H__
#define __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. ** For compatibility with FSF readline.
*/ */

View File

@@ -2,5 +2,9 @@ AUTOMAKE_OPTIONS = foreign
lib_LIBRARIES = libedit.a lib_LIBRARIES = libedit.a
libedit_a_SOURCES = editline.c editline.h complete.c sysunix.c unix.h 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

View File

@@ -30,6 +30,8 @@ POST_INSTALL = :
NORMAL_UNINSTALL = : NORMAL_UNINSTALL = :
PRE_UNINSTALL = : PRE_UNINSTALL = :
POST_UNINSTALL = : POST_UNINSTALL = :
# Built-in completion handler.
@COMPLETE_TRUE@am__append_1 = complete.c
subdir = src subdir = src
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -52,8 +54,11 @@ AR = ar
ARFLAGS = cru ARFLAGS = cru
libedit_a_AR = $(AR) $(ARFLAGS) libedit_a_AR = $(AR) $(ARFLAGS)
libedit_a_LIBADD = libedit_a_LIBADD =
am_libedit_a_OBJECTS = editline.$(OBJEXT) complete.$(OBJEXT) \ am__libedit_a_SOURCES_DIST = editline.c editline.h sysunix.c unix.h \
sysunix.$(OBJEXT) complete.c
@COMPLETE_TRUE@am__objects_1 = complete.$(OBJEXT)
am_libedit_a_OBJECTS = editline.$(OBJEXT) sysunix.$(OBJEXT) \
$(am__objects_1)
libedit_a_OBJECTS = $(am_libedit_a_OBJECTS) libedit_a_OBJECTS = $(am_libedit_a_OBJECTS)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -63,7 +68,7 @@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
CCLD = $(CC) CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(libedit_a_SOURCES) SOURCES = $(libedit_a_SOURCES)
DIST_SOURCES = $(libedit_a_SOURCES) DIST_SOURCES = $(am__libedit_a_SOURCES_DIST)
ETAGS = etags ETAGS = etags
CTAGS = ctags CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -154,7 +159,9 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
AUTOMAKE_OPTIONS = foreign AUTOMAKE_OPTIONS = foreign
lib_LIBRARIES = libedit.a lib_LIBRARIES = libedit.a
libedit_a_SOURCES = editline.c editline.h complete.c sysunix.c unix.h libedit_a_SOURCES = editline.c editline.h sysunix.c unix.h \
$(am__append_1)
@COMPLETE_TRUE@AM_CPPFLAGS = -DCOMPLETE
all: all-am all: all-am
.SUFFIXES: .SUFFIXES:

View File

@@ -161,7 +161,7 @@ SplitPath(path, dirpart, filepart)
** Fill in *unique if we completed it, or set it to 0 if ambiguous. ** Fill in *unique if we completed it, or set it to 0 if ambiguous.
*/ */
char * char *
rl_complete(pathname, unique) default_rl_complete(pathname, unique)
char *pathname; char *pathname;
int *unique; int *unique;
{ {
@@ -233,7 +233,7 @@ rl_complete(pathname, unique)
** Return all possible completions. ** Return all possible completions.
*/ */
int int
rl_list_possib(pathname, avp) default_rl_list_possib(pathname, avp)
char *pathname; char *pathname;
char ***avp; char ***avp;
{ {

View File

@@ -97,6 +97,11 @@ STATIC int TTYrows;
/* Display print 8-bit chars as `M-x' or as the actual 8-bit char? */ /* Display print 8-bit chars as `M-x' or as the actual 8-bit char? */
int rl_meta_chars = 1; int rl_meta_chars = 1;
/* User definable callbacks. */
char *(*rl_complete)(char *token, int *match);
int (*rl_list_possib)(char *token, char ***av);
/* /*
** Declarations. ** Declarations.
*/ */
@@ -1033,6 +1038,20 @@ rl_reset_terminal(p)
void void
rl_initialize(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 * char *
@@ -1042,6 +1061,9 @@ readline(prompt)
CHAR *line; CHAR *line;
int s; int s;
/* Unless called by the user already. */
rl_initialize ();
if (!isatty(0)) { if (!isatty(0)) {
TTYflush(); TTYflush();
return read_redirected(); return read_redirected();
@@ -1177,6 +1199,10 @@ c_possible(void)
CHAR *word; CHAR *word;
int ac; int ac;
if (!rl_list_possib) {
return ring_bell();
}
word = find_word(); word = find_word();
ac = rl_list_possib((char *)word, (char ***)&av); ac = rl_list_possib((char *)word, (char ***)&av);
if (word) if (word)
@@ -1200,6 +1226,10 @@ c_complete(void)
int unique; int unique;
STATUS s; STATUS s;
if (!rl_complete) {
return ring_bell();
}
word = find_word(); word = find_word();
p = (CHAR *)rl_complete((char *)word, &unique); p = (CHAR *)rl_complete((char *)word, &unique);
if (word) if (word)

View File

@@ -2,6 +2,9 @@
** **
** Internal header file for editline library. ** Internal header file for editline library.
*/ */
#ifndef __PRIVATE_EDITLINE_H__
#define __PRIVATE_EDITLINE_H__
#include <config.h> #include <config.h>
#include <stdio.h> #include <stdio.h>
#ifdef HAVE_MALLOC_H #ifdef HAVE_MALLOC_H
@@ -70,8 +73,10 @@ extern int rl_quit;
#if defined(DO_SIGTSTP) #if defined(DO_SIGTSTP)
extern int rl_susp; extern int rl_susp;
#endif /* defined(DO_SIGTSTP) */ #endif /* defined(DO_SIGTSTP) */
extern char *rl_complete(); #ifdef COMPLETE
extern int rl_list_possib(char *pathname, char ***avp); extern char *default_rl_complete();
extern int default_rl_list_possib(char *pathname, char ***avp);
#endif
extern void rl_ttyset(); extern void rl_ttyset();
extern void rl_add_slash(); extern void rl_add_slash();
@@ -93,3 +98,6 @@ extern int strncmp();
#if defined(NEED_STRDUP) #if defined(NEED_STRDUP)
extern char *strdup(); extern char *strdup();
#endif #endif
#include "../include/editline.h"
#endif /* __PRIVATE_EDITLINE_H__ */