8 Commits
0.2.2 ... 0.3.0

Author SHA1 Message Date
Joachim Nilsson
5b27b6ce4f src/editline.c:
tty_flush(): Silence compiler warning.

        meta(): Extend to support Home, End and Del keys, in addition to
        the arrow keys. Also capturing PgUp, PgDn and Ins to prevent
        them from generating odd ~ characters in input.

        Also rearranged a couple of callback functions so they could be
        reached by the meta() function without forward declaring them.
        This is also better placement, together with other similar fns.
2009-02-08 22:09:02 +01:00
Joachim Nilsson
e828182cb0 Bump version to 0.3.0, ANSI arrow keys support
feels like a big deal.
2009-02-08 21:21:08 +01:00
Joachim Nilsson
c1b3d17926 Update TODO and add a NEWS file. 2009-02-08 21:19:38 +01:00
Joachim Nilsson
69e01d11d4 config.h.in, configure, configure.ac:
Add configure support for ANSI arrow keys.
        Tested OK with gnome-terminal.

src/complete.c:
	Remove usage of CONST and refactor compare() to use standard
        C syntax instead of old K&R.
2009-02-08 21:13:54 +01:00
Joachim Nilsson
4898413730 Fix GCC warning 's might possibly be used uninitialized" 2009-02-08 20:19:58 +01:00
Joachim Nilsson
b1e74f3de2 Updated ignored files. 2008-12-02 22:06:58 +01:00
Joachim Nilsson
6d8d857dd4 More build fixes, some code cleanup and untabify. 2008-12-02 21:58:55 +01:00
Joachim Nilsson
77d483da02 Build fixes when building with GCC v4.3.2 and -W -Wall -Werror 2008-12-02 19:09:17 +01:00
14 changed files with 1060 additions and 1110 deletions

16
.bzrignore Normal file
View File

@@ -0,0 +1,16 @@
Makefile
archive
autom4te.cache
config.h
config.log
config.status
stamp-h1
examples/.deps
examples/Makefile
examples/cli
examples/testit
man/Makefile
man/Makefile
include/Makefile
src/.deps
src/Makefile

View File

@@ -32,7 +32,7 @@ POST_UNINSTALL = :
subdir = . subdir = .
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \
$(top_srcdir)/configure TODO depcomp install-sh missing $(top_srcdir)/configure NEWS TODO depcomp install-sh missing
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__aclocal_m4_deps = $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \

9
NEWS Normal file
View File

@@ -0,0 +1,9 @@
Notable Changes
* v0.3.0
** Support for ANSI arrow keys using --enable-arrow-keys
* v0.2.x
** Patches from Debian package merged.
** Support for custom command completion.

9
TODO
View File

@@ -1,14 +1,5 @@
TODO TODO
* Merge in useful patches from Debian package
* 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 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

View File

@@ -1,5 +1,8 @@
/* config.h.in. Generated from configure.ac by autoheader. */ /* config.h.in. Generated from configure.ac by autoheader. */
/* Define to include ANSI arrow keys support in minix-editline */
#undef ANSI_ARROWS
/* Define to 1 if the `closedir' function returns void instead of `int'. */ /* Define to 1 if the `closedir' function returns void instead of `int'. */
#undef CLOSEDIR_VOID #undef CLOSEDIR_VOID
@@ -19,6 +22,9 @@
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */ /* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
#undef HAVE_NDIR_H #undef HAVE_NDIR_H
/* Define to 1 if you have the `perror' function. */
#undef HAVE_PERROR
/* Define to 1 if you have the <sgtty.h> header file. */ /* Define to 1 if you have the <sgtty.h> header file. */
#undef HAVE_SGTTY_H #undef HAVE_SGTTY_H

42
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.2. # Generated by GNU Autoconf 2.61 for Minix editline 0.3.0.
# #
# 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.2' PACKAGE_VERSION='0.3.0'
PACKAGE_STRING='Minix editline 0.2.2' PACKAGE_STRING='Minix editline 0.3.0'
PACKAGE_BUGREPORT='joachim@vmlinux.org' PACKAGE_BUGREPORT='joachim@vmlinux.org'
ac_unique_file="src/editline.c" 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. # 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.2 to adapt to many kinds of systems. \`configure' configures Minix editline 0.3.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1276,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.2:";; short | recursive ) echo "Configuration of Minix editline 0.3.0:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1286,6 +1286,7 @@ Optional Features:
--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. --enable-default-complete Enable default completion handler.
--enable-arrow-keys Enable ANSI arrow keys.
Some influential environment variables: Some influential environment variables:
CC C compiler command CC C compiler command
@@ -1361,7 +1362,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.2 Minix editline configure 0.3.0
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,
@@ -1375,7 +1376,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.2, which was It was created by Minix editline $as_me 0.3.0, which was
generated by GNU Autoconf 2.61. Invocation command line was generated by GNU Autoconf 2.61. Invocation command line was
$ $0 $@ $ $0 $@
@@ -2070,7 +2071,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='minix-editline' PACKAGE='minix-editline'
VERSION='0.2.2' VERSION='0.3.0'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@@ -4879,7 +4880,8 @@ fi
for ac_func in strchr strdup strrchr tcgetattr
for ac_func in strchr strdup strrchr tcgetattr perror
do do
as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ echo "$as_me:$LINENO: checking for $ac_func" >&5 { echo "$as_me:$LINENO: checking for $ac_func" >&5
@@ -5002,6 +5004,23 @@ else
fi fi
ac_enable_arrow_keys=no
# Check whether --enable-arrow-keys was given.
if test "${enable_arrow_keys+set}" = set; then
enableval=$enable_arrow_keys; ac_enable_arrow_keys=$enableval
else
ac_enable_arrow_keys=no
fi
if test "x${ac_enable_arrow_keys}" = xyes ; then
cat >>confdefs.h <<\_ACEOF
#define ANSI_ARROWS
_ACEOF
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
@@ -5421,7 +5440,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.2, which was This file was extended by Minix editline $as_me 0.3.0, 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
@@ -5474,7 +5493,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.2 Minix editline config.status 0.3.0
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'`\\"
@@ -6341,3 +6360,4 @@ if test "$no_create" != yes; then
$ac_cs_success || { (exit 1); exit 1; } $ac_cs_success || { (exit 1); exit 1; }
fi fi

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.2, joachim@vmlinux.org) AC_INIT(Minix editline, 0.3.0, 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])
@@ -38,7 +38,7 @@ AC_PROG_GCC_TRADITIONAL
#AC_FUNC_MALLOC #AC_FUNC_MALLOC
#AC_FUNC_REALLOC #AC_FUNC_REALLOC
AC_FUNC_STAT AC_FUNC_STAT
AC_CHECK_FUNCS([strchr strdup strrchr tcgetattr]) AC_CHECK_FUNCS([strchr strdup strrchr tcgetattr perror])
AC_ARG_ENABLE([default-complete], AC_ARG_ENABLE([default-complete],
[ --enable-default-complete Enable default completion handler.],[ [ --enable-default-complete Enable default completion handler.],[
@@ -55,4 +55,15 @@ AC_ARG_ENABLE([default-complete],
esac],[complete=false]) esac],[complete=false])
AM_CONDITIONAL([COMPLETE], [test x$complete = xtrue]) AM_CONDITIONAL([COMPLETE], [test x$complete = xtrue])
ac_enable_arrow_keys=no
AC_ARG_ENABLE(arrow-keys,
[ --enable-arrow-keys Enable ANSI arrow keys.],
[ ac_enable_arrow_keys=$enableval ], [ ac_enable_arrow_keys=no])
if test "x${ac_enable_arrow_keys}" = xyes ; then
AC_DEFINE([ANSI_ARROWS], [],
[Define to include ANSI arrow keys support in minix-editline])
fi
AC_OUTPUT(Makefile src/Makefile include/Makefile man/Makefile examples/Makefile) AC_OUTPUT(Makefile src/Makefile include/Makefile man/Makefile examples/Makefile)

View File

@@ -62,7 +62,7 @@ int my_rl_list_possib(char *token, char ***av)
return total; return total;
} }
int main(int ac, char *av[]) int main(int ac __attribute__ ((unused)), char *av[] __attribute__ ((unused)))
{ {
char *line; char *line;
char *prompt = "cli> "; char *prompt = "cli> ";

View File

@@ -3,25 +3,35 @@
** A "micro-shell" to test editline library. ** A "micro-shell" to test editline library.
** If given any arguments, commands aren't executed. ** If given any arguments, commands aren't executed.
*/ */
#include <config.h>
#include <stdio.h> #include <stdio.h>
#if defined(HAVE_STDLIB) #if defined(HAVE_STDLIB_H)
#include <stdlib.h> #include <stdlib.h>
#endif /* defined(HAVE_STDLIB) */ #endif
#if defined(HAVE_STRING_H)
#include <string.h>
#endif
#if defined(HAVE_UNISTD_H)
#include <unistd.h>
#endif
extern char *readline(); extern char *readline();
extern void add_history(); extern void add_history();
#if !defined(HAVE_STDLIB) #if !defined(HAVE_STDLIB_H)
extern int chdir();
extern int free(); extern int free();
extern int strncmp();
extern int system(); extern int system();
extern void exit(); extern void exit();
extern char *getenv(); extern char *getenv();
#endif /* !defined(HAVE_STDLIB) */ #endif /* !defined(HAVE_STDLIB) */
#if !defined(HAVE_STRING_H)
extern int strncmp();
#endif
#if !defined(HAVE_UNISTD_H)
extern int chdir();
#endif
#if !defined(HAVE_PERROR)
#if defined(NEED_PERROR)
void void
perror(s) perror(s)
char *s; char *s;
@@ -37,7 +47,7 @@ perror(s)
int int
main(ac, av) main(ac, av)
int ac; int ac;
char *av[]; char *av[] __attribute__ ((unused));
{ {
char *prompt; char *prompt;
char *p; char *p;
@@ -45,7 +55,7 @@ main(ac, av)
doit = ac == 1; doit = ac == 1;
if ((prompt = getenv("TESTPROMPT")) == NULL) if ((prompt = getenv("TESTPROMPT")) == NULL)
prompt = "testit> "; prompt = "testit> ";
while ((p = readline(prompt)) != NULL) { while ((p = readline(prompt)) != NULL) {
(void)printf("\t\t\t|%s|\n", p); (void)printf("\t\t\t|%s|\n", p);

View File

@@ -4,8 +4,8 @@
/* Assign these to get command completion, see cli.c for /* Assign these to get command completion, see cli.c for
* example usage. */ * example usage. */
char *(*rl_complete)(char *token, int *match); extern char *(*rl_complete)(char *token, int *match);
int (*rl_list_possib)(char *token, char ***av); extern int (*rl_list_possib)(char *token, char ***av);
/* /*
** For compatibility with FSF readline. ** For compatibility with FSF readline.

View File

@@ -5,35 +5,31 @@
#include "editline.h" #include "editline.h"
#if defined(NEED_STRDUP) #if defined(NEED_STRDUP)
/* /*
** Return an allocated copy of a string. ** Return an allocated copy of a string.
*/ */
char * char *
strdup(p) strdup(p)
char *p; char *p;
{ {
char *new; char *new;
if ((new = NEW(char, strlen(p) + 1)) != NULL) if ((new = NEW(char, strlen(p) + 1)) != NULL)
(void)strcpy(new, p); (void)strcpy(new, p);
return new; return new;
} }
#endif /* defined(NEED_STRDUP) */ #endif /* defined(NEED_STRDUP) */
/* /*
** strcmp-like sorting predicate for qsort. ** strcmp-like sorting predicate for qsort.
*/ */
STATIC int static int
compare(p1, p2) compare(void *p1, void *p2)
CONST void *p1;
CONST void *p2;
{ {
CONST char **v1; char **v1 = (char **)p1;
CONST char **v2; char **v2 = (char **)p2;
v1 = (CONST char **)p1;
v2 = (CONST char **)p2;
return strcmp(*v1, *v2); return strcmp(*v1, *v2);
} }
@@ -41,25 +37,25 @@ compare(p1, p2)
** Fill in *avp with an array of names that match file, up to its length. ** Fill in *avp with an array of names that match file, up to its length.
** Ignore . and .. . ** Ignore . and .. .
*/ */
STATIC int static int
FindMatches(dir, file, avp) FindMatches(dir, file, avp)
char *dir; char *dir;
char *file; char *file;
char ***avp; char ***avp;
{ {
char **av; char **av;
char **new; char **new;
char *p; char *p;
DIR *dp; DIR *dp;
DIRENTRY *ep; DIRENTRY *ep;
SIZE_T ac; SIZE_T ac;
SIZE_T len; SIZE_T len;
SIZE_T choices; SIZE_T choices;
SIZE_T total; SIZE_T total;
#define MAX_TOTAL (256 << sizeof(char *)) #define MAX_TOTAL (256 << sizeof(char *))
if ((dp = opendir(dir)) == NULL) if ((dp = opendir(dir)) == NULL)
return 0; return 0;
av = NULL; av = NULL;
ac = 0; ac = 0;
@@ -67,56 +63,56 @@ FindMatches(dir, file, avp)
choices = 0; choices = 0;
total = 0; total = 0;
while ((ep = readdir(dp)) != NULL) { while ((ep = readdir(dp)) != NULL) {
p = ep->d_name; p = ep->d_name;
if (p[0] == '.' && (p[1] == '\0' || (p[1] == '.' && p[2] == '\0'))) if (p[0] == '.' && (p[1] == '\0' || (p[1] == '.' && p[2] == '\0')))
continue; continue;
if (len && strncmp(p, file, len) != 0) if (len && strncmp(p, file, len) != 0)
continue; continue;
choices++; choices++;
if ((total += strlen(p)) > MAX_TOTAL) { if ((total += strlen(p)) > MAX_TOTAL) {
/* This is a bit too much. */ /* This is a bit too much. */
while (ac > 0) DISPOSE(av[--ac]); while (ac > 0) DISPOSE(av[--ac]);
continue; continue;
} }
if ((ac % MEM_INC) == 0) { if ((ac % MEM_INC) == 0) {
if ((new = NEW(char*, ac + MEM_INC)) == NULL) { if ((new = NEW(char*, ac + MEM_INC)) == NULL) {
total = 0; total = 0;
break; break;
} }
if (ac) { if (ac) {
COPYFROMTO(new, av, ac * sizeof (char **)); COPYFROMTO(new, av, ac * sizeof (char **));
DISPOSE(av); DISPOSE(av);
} }
*avp = av = new; *avp = av = new;
} }
if ((av[ac] = strdup(p)) == NULL) { if ((av[ac] = strdup(p)) == NULL) {
if (ac == 0) if (ac == 0)
DISPOSE(av); DISPOSE(av);
total = 0; total = 0;
break; break;
} }
ac++; ac++;
} }
/* Clean up and return. */ /* Clean up and return. */
(void)closedir(dp); (void)closedir(dp);
if (total > MAX_TOTAL) { if (total > MAX_TOTAL) {
char many[sizeof(total) * 3]; char many[sizeof(total) * 3];
p = many + sizeof(many); p = many + sizeof(many);
*--p = '\0'; *--p = '\0';
while (choices > 0) { while (choices > 0) {
*--p = '0' + choices % 10; *--p = '0' + choices % 10;
choices /= 10; choices /= 10;
} }
while (p > many + sizeof(many) - 8) *--p = ' '; while (p > many + sizeof(many) - 8) *--p = ' ';
if ((p = strdup(p)) != NULL) av[ac++] = p; if ((p = strdup(p)) != NULL) av[ac++] = p;
if ((p = strdup("choices")) != NULL) av[ac++] = p; if ((p = strdup("choices")) != NULL) av[ac++] = p;
} else { } else {
if (ac) if (ac)
qsort(av, ac, sizeof (char **), compare); qsort(av, ac, sizeof (char **), compare);
} }
return ac; return ac;
} }
@@ -124,32 +120,32 @@ FindMatches(dir, file, avp)
/* /*
** Split a pathname into allocated directory and trailing filename parts. ** Split a pathname into allocated directory and trailing filename parts.
*/ */
STATIC int static int
SplitPath(path, dirpart, filepart) SplitPath(path, dirpart, filepart)
char *path; char *path;
char **dirpart; char **dirpart;
char **filepart; char **filepart;
{ {
static char DOT[] = "."; static char DOT[] = ".";
char *dpart; char *dpart;
char *fpart; char *fpart;
if ((fpart = strrchr(path, '/')) == NULL) { if ((fpart = strrchr(path, '/')) == NULL) {
if ((dpart = strdup(DOT)) == NULL) if ((dpart = strdup(DOT)) == NULL)
return -1; return -1;
if ((fpart = strdup(path)) == NULL) { if ((fpart = strdup(path)) == NULL) {
DISPOSE(dpart); DISPOSE(dpart);
return -1; return -1;
} }
} }
else { else {
if ((dpart = strdup(path)) == NULL) if ((dpart = strdup(path)) == NULL)
return -1; return -1;
dpart[fpart - path + 1] = '\0'; dpart[fpart - path + 1] = '\0';
if ((fpart = strdup(++fpart)) == NULL) { if ((fpart = strdup(++fpart)) == NULL) {
DISPOSE(dpart); DISPOSE(dpart);
return -1; return -1;
} }
} }
*dirpart = dpart; *dirpart = dpart;
*filepart = fpart; *filepart = fpart;
@@ -162,69 +158,69 @@ SplitPath(path, dirpart, filepart)
*/ */
char * char *
default_rl_complete(pathname, unique) default_rl_complete(pathname, unique)
char *pathname; char *pathname;
int *unique; int *unique;
{ {
char **av; char **av;
char *dir; char *dir;
char *file; char *file;
char *new; char *new;
char *p; char *p;
SIZE_T ac; SIZE_T ac;
SIZE_T end; SIZE_T end;
SIZE_T i; SIZE_T i;
SIZE_T j; SIZE_T j;
SIZE_T len; SIZE_T len;
if (SplitPath(pathname, &dir, &file) < 0) if (SplitPath(pathname, &dir, &file) < 0)
return NULL; return NULL;
if ((ac = FindMatches(dir, file, &av)) == 0) { if ((ac = FindMatches(dir, file, &av)) == 0) {
DISPOSE(dir); DISPOSE(dir);
DISPOSE(file); DISPOSE(file);
return NULL; return NULL;
} }
p = NULL; p = NULL;
len = strlen(file); len = strlen(file);
if (ac == 1) { if (ac == 1) {
/* Exactly one match -- finish it off. */ /* Exactly one match -- finish it off. */
*unique = 1; *unique = 1;
j = strlen(av[0]) - len + 2; j = strlen(av[0]) - len + 2;
if ((p = NEW(char, j + 1)) != NULL) { if ((p = NEW(char, j + 1)) != NULL) {
COPYFROMTO(p, av[0] + len, j); COPYFROMTO(p, av[0] + len, j);
if ((new = NEW(char, strlen(dir) + strlen(av[0]) + 2)) != NULL) { if ((new = NEW(char, strlen(dir) + strlen(av[0]) + 2)) != NULL) {
(void)strcpy(new, dir); (void)strcpy(new, dir);
(void)strcat(new, "/"); (void)strcat(new, "/");
(void)strcat(new, av[0]); (void)strcat(new, av[0]);
rl_add_slash(new, p); rl_add_slash(new, p);
DISPOSE(new); DISPOSE(new);
} }
} }
} }
else { else {
*unique = 0; *unique = 0;
if (len) { if (len) {
/* Find largest matching substring. */ /* Find largest matching substring. */
for (i = len, end = strlen(av[0]); i < end; i++) for (i = len, end = strlen(av[0]); i < end; i++)
for (j = 1; j < ac; j++) for (j = 1; j < ac; j++)
if (av[0][i] != av[j][i]) if (av[0][i] != av[j][i])
goto breakout; goto breakout;
breakout: breakout:
if (i > len) { if (i > len) {
j = i - len + 1; j = i - len + 1;
if ((p = NEW(char, j)) != NULL) { if ((p = NEW(char, j)) != NULL) {
COPYFROMTO(p, av[0] + len, j); COPYFROMTO(p, av[0] + len, j);
p[j - 1] = '\0'; p[j - 1] = '\0';
} }
} }
} }
} }
/* Clean up and return. */ /* Clean up and return. */
DISPOSE(dir); DISPOSE(dir);
DISPOSE(file); DISPOSE(file);
for (i = 0; i < ac; i++) for (i = 0; i < ac; i++)
DISPOSE(av[i]); DISPOSE(av[i]);
DISPOSE(av); DISPOSE(av);
return p; return p;
} }
@@ -234,15 +230,15 @@ default_rl_complete(pathname, unique)
*/ */
int int
default_rl_list_possib(pathname, avp) default_rl_list_possib(pathname, avp)
char *pathname; char *pathname;
char ***avp; char ***avp;
{ {
char *dir; char *dir;
char *file; char *file;
int ac; int ac;
if (SplitPath(pathname, &dir, &file) < 0) if (SplitPath(pathname, &dir, &file) < 0)
return 0; return 0;
ac = FindMatches(dir, file, avp); ac = FindMatches(dir, file, avp);
DISPOSE(dir); DISPOSE(dir);
DISPOSE(file); DISPOSE(file);

File diff suppressed because it is too large Load Diff

View File

@@ -35,21 +35,6 @@
typedef unsigned char CHAR; typedef unsigned char CHAR;
#if defined(HIDE)
#define STATIC static
#else
#define STATIC /* NULL */
#endif /* !defined(HIDE) */
#if !defined(CONST)
#if defined(__STDC__)
#define CONST const
#else
#define CONST
#endif /* defined(__STDC__) */
#endif /* !defined(CONST) */
#define MEM_INC 64 #define MEM_INC 64
#define SCREEN_INC 256 #define SCREEN_INC 256

View File

@@ -4,69 +4,69 @@
*/ */
#include "editline.h" #include "editline.h"
#if defined(HAVE_TCGETATTR) #if defined(HAVE_TCGETATTR)
#include <termios.h> #include <termios.h>
void void
rl_ttyset(Reset) rl_ttyset(Reset)
int Reset; int Reset;
{ {
static struct termios old; static struct termios old;
struct termios new; struct termios new;
if (Reset == 0) { if (Reset == 0) {
if (tcgetattr(0, &old) < 0) perror("tcgetattr"); if (tcgetattr(0, &old) < 0) perror("tcgetattr");
rl_erase = old.c_cc[VERASE]; rl_erase = old.c_cc[VERASE];
rl_kill = old.c_cc[VKILL]; rl_kill = old.c_cc[VKILL];
rl_eof = old.c_cc[VEOF]; rl_eof = old.c_cc[VEOF];
rl_intr = old.c_cc[VINTR]; rl_intr = old.c_cc[VINTR];
rl_quit = old.c_cc[VQUIT]; rl_quit = old.c_cc[VQUIT];
#if defined(DO_SIGTSTP) #if defined(DO_SIGTSTP)
rl_susp = old.c_cc[VSUSP]; rl_susp = old.c_cc[VSUSP];
#endif /* defined(DO_SIGTSTP) */ #endif /* defined(DO_SIGTSTP) */
new = old; new = old;
new.c_lflag &= ~(ECHO | ICANON | ISIG); new.c_lflag &= ~(ECHO | ICANON | ISIG);
new.c_iflag &= ~(ISTRIP | INPCK); new.c_iflag &= ~(ISTRIP | INPCK);
new.c_cc[VMIN] = 1; new.c_cc[VMIN] = 1;
new.c_cc[VTIME] = 0; new.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSADRAIN, &new) < 0) perror("tcsetattr"); if (tcsetattr(0, TCSADRAIN, &new) < 0) perror("tcsetattr");
} }
else else
(void)tcsetattr(0, TCSADRAIN, &old); (void)tcsetattr(0, TCSADRAIN, &old);
} }
#else #else
#if defined(HAVE_TERMIO_H) #if defined(HAVE_TERMIO_H)
#include <termio.h> #include <termio.h>
void void
rl_ttyset(Reset) rl_ttyset(Reset)
int Reset; int Reset;
{ {
static struct termio old; static struct termio old;
struct termio new; struct termio new;
if (Reset == 0) { if (Reset == 0) {
(void)ioctl(0, TCGETA, &old); (void)ioctl(0, TCGETA, &old);
rl_erase = old.c_cc[VERASE]; rl_erase = old.c_cc[VERASE];
rl_kill = old.c_cc[VKILL]; rl_kill = old.c_cc[VKILL];
rl_eof = old.c_cc[VEOF]; rl_eof = old.c_cc[VEOF];
rl_intr = old.c_cc[VINTR]; rl_intr = old.c_cc[VINTR];
rl_quit = old.c_cc[VQUIT]; rl_quit = old.c_cc[VQUIT];
#if defined(DO_SIGTSTP) #if defined(DO_SIGTSTP)
rl_susp = old.c_cc[VSUSP]; rl_susp = old.c_cc[VSUSP];
#endif /* defined(DO_SIGTSTP) */ #endif /* defined(DO_SIGTSTP) */
new = old; new = old;
new.c_lflag &= ~(ECHO | ICANON | ISIG); new.c_lflag &= ~(ECHO | ICANON | ISIG);
new.c_iflag &= ~(ISTRIP | INPCK); new.c_iflag &= ~(ISTRIP | INPCK);
new.c_cc[VMIN] = 1; new.c_cc[VMIN] = 1;
new.c_cc[VTIME] = 0; new.c_cc[VTIME] = 0;
(void)ioctl(0, TCSETAW, &new); (void)ioctl(0, TCSETAW, &new);
} }
else else
(void)ioctl(0, TCSETAW, &old); (void)ioctl(0, TCSETAW, &old);
} }
#else #else
@@ -74,61 +74,61 @@ rl_ttyset(Reset)
void void
rl_ttyset(Reset) rl_ttyset(Reset)
int Reset; int Reset;
{ {
static struct sgttyb old_sgttyb; static struct sgttyb old_sgttyb;
static struct tchars old_tchars; static struct tchars old_tchars;
struct sgttyb new_sgttyb; struct sgttyb new_sgttyb;
struct tchars new_tchars; struct tchars new_tchars;
#if defined(DO_SIGTSTP) #if defined(DO_SIGTSTP)
struct ltchars old_ltchars; struct ltchars old_ltchars;
#endif /* defined(DO_SIGTSTP) */ #endif /* defined(DO_SIGTSTP) */
if (Reset == 0) { if (Reset == 0) {
(void)ioctl(0, TIOCGETP, &old_sgttyb); (void)ioctl(0, TIOCGETP, &old_sgttyb);
rl_erase = old_sgttyb.sg_erase; rl_erase = old_sgttyb.sg_erase;
rl_kill = old_sgttyb.sg_kill; rl_kill = old_sgttyb.sg_kill;
(void)ioctl(0, TIOCGETC, &old_tchars); (void)ioctl(0, TIOCGETC, &old_tchars);
rl_eof = old_tchars.t_eofc; rl_eof = old_tchars.t_eofc;
rl_intr = old_tchars.t_intrc; rl_intr = old_tchars.t_intrc;
rl_quit = old_tchars.t_quitc; rl_quit = old_tchars.t_quitc;
#if defined(DO_SIGTSTP) #if defined(DO_SIGTSTP)
(void)ioctl(0, TIOCGLTC, &old_ltchars); (void)ioctl(0, TIOCGLTC, &old_ltchars);
rl_susp = old_ltchars.t_suspc; rl_susp = old_ltchars.t_suspc;
#endif /* defined(DO_SIGTSTP) */ #endif /* defined(DO_SIGTSTP) */
new_sgttyb = old_sgttyb; new_sgttyb = old_sgttyb;
new_sgttyb.sg_flags &= ~ECHO; new_sgttyb.sg_flags &= ~ECHO;
new_sgttyb.sg_flags |= RAW; new_sgttyb.sg_flags |= RAW;
#if defined(PASS8) #if defined(PASS8)
new_sgttyb.sg_flags |= PASS8; new_sgttyb.sg_flags |= PASS8;
#endif /* defined(PASS8) */ #endif /* defined(PASS8) */
(void)ioctl(0, TIOCSETP, &new_sgttyb); (void)ioctl(0, TIOCSETP, &new_sgttyb);
new_tchars = old_tchars; new_tchars = old_tchars;
new_tchars.t_intrc = -1; new_tchars.t_intrc = -1;
new_tchars.t_quitc = -1; new_tchars.t_quitc = -1;
(void)ioctl(0, TIOCSETC, &new_tchars); (void)ioctl(0, TIOCSETC, &new_tchars);
} }
else { else {
(void)ioctl(0, TIOCSETP, &old_sgttyb); (void)ioctl(0, TIOCSETP, &old_sgttyb);
(void)ioctl(0, TIOCSETC, &old_tchars); (void)ioctl(0, TIOCSETC, &old_tchars);
} }
} }
#endif /* defined(HAVE_TERMIO_H) */ #endif /* defined(HAVE_TERMIO_H) */
#endif /* defined(HAVE_TCGETATTR) */ #endif /* defined(HAVE_TCGETATTR) */
void void
rl_add_slash(path, p) rl_add_slash(path, p)
char *path; char *path;
char *p; char *p;
{ {
struct stat Sb; struct stat Sb;
if (stat(path, &Sb) >= 0) if (stat(path, &Sb) >= 0)
(void)strcat(p, S_ISDIR(Sb.st_mode) ? "/" : " "); (void)strcat(p, S_ISDIR(Sb.st_mode) ? "/" : " ");
} }
/* /*