Compare commits

..

No commits in common. "master" and "1.17.0" have entirely different histories.

19 changed files with 148 additions and 366 deletions

View File

@ -4,18 +4,6 @@ Change Log
All notable changes to the project are documented in this file.
[1.17.1][] - 2020-02-23
-----------------------
### Fixes
- Fix #38: Fix for multiline representing as one line
- Fix packaging, missing files in libeditline1, regression from 1.16.0
- Fix packaging, update to latest std version
- Fix formatting of function names in man page
- Restore tar.gz distribution, for usability on systems that do not
have xz in their default install
[1.17.0][] - 2020-01-05
-----------------------
@ -249,8 +237,7 @@ Adaptations to Debian editline package.
- First version, forked from Minix current 2008-06-06
[UNRELEASED]: https://github.com/troglobit/finit/compare/1.17.1...HEAD
[1.17.1]: https://github.com/troglobit/finit/compare/1.17.0...1.17.1
[UNRELEASED]: https://github.com/troglobit/finit/compare/1.17.0...HEAD
[1.17.0]: https://github.com/troglobit/finit/compare/1.16.1...1.17.0
[1.16.1]: https://github.com/troglobit/finit/compare/1.16.0...1.16.1
[1.16.0]: https://github.com/troglobit/finit/compare/1.15.3...1.16.0

View File

@ -2,11 +2,11 @@ pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libeditline.pc
doc_DATA = README.md LICENSE
EXTRA_DIST = README.md LICENSE ChangeLog.md INSTALL.md
SUBDIRS = src include man
SUBDIRS = src include man examples
if ENABLE_EXAMPLES
SUBDIRS += examples
endif
## Generate .deb package
package build-deb:
@dpkg-buildpackage -uc -us
## Generate MD5 checksum file
MD5 = md5sum
@ -39,7 +39,7 @@ package:
dpkg-buildpackage -uc -us -B
## Target to run when building a release
release: release-hook distcheck md5-dist package
release: distcheck release-hook md5-dist package
@echo
@echo "Resulting release files:"
@echo "========================================================================="

View File

@ -33,8 +33,6 @@ to use the library is available in the `examples/` directory.
Editline is maintained collaboratively at [GitHub][].
> **Note:** Windows is not a supported target for editline.
Example
-------
@ -58,7 +56,6 @@ sub-directory.
e.g. `~/src/example.c`
```C
#include <stdio.h>
#include <stdlib.h>
#include <editline.h>
@ -198,7 +195,6 @@ current maintainer works exclusively on GNU/Linux systems, so it may use
GCC and GNU Make specific extensions here and there. This is not on
purpose and patches or pull requests to correct this are most welcome!
0. Call <kbd>./autogen.sh</kbd> if you build from git
1. Configure editline with default features: <kbd>./configure</kbd>
2. Build the library and examples: <kbd>make all</kbd>
3. Install using <kbd>make install</kbd>

View File

@ -1,6 +1,5 @@
AC_INIT(editline, 1.17.1, https://github.com/troglobit/editline/issues)
AC_CONFIG_AUX_DIR(aux)
AM_INIT_AUTOMAKE([1.11 foreign dist-xz])
AC_INIT(editline, 1.17.0, https://github.com/troglobit/editline/issues)
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
AM_SILENT_RULES([yes])
AC_CONFIG_MACRO_DIR([m4])
@ -61,35 +60,29 @@ AC_ARG_ENABLE(terminal-bell,
AC_ARG_ENABLE(termcap,
AS_HELP_STRING([--enable-termcap], [Use termcap library to query terminal size.]))
AC_ARG_ENABLE([examples],
[AC_HELP_STRING([--enable-examples], [Build examples/ directory])],
[], [enable_examples=no])
#
# Check what features have been enabled
#
AS_IF([test "x$enable_unique_history" != "xno"], [
AC_DEFINE(CONFIG_UNIQUE_HISTORY, 1, [Define to skip duplicate lines in the scrollback history.])])
AS_IF([test "x$enable_unique_history" != "xno"],
AC_DEFINE(CONFIG_UNIQUE_HISTORY, 1, [Define to skip duplicate lines in the scrollback history.]))
AS_IF([test "x$enable_terminal_bell" != "xno"], [
AC_DEFINE(CONFIG_ANSI_ARROWS, 1, [Define to include ANSI arrow keys support.])])
AS_IF([test "x$enable_terminal_bell" != "xno"],
AC_DEFINE(CONFIG_ANSI_ARROWS, 1, [Define to include ANSI arrow keys support.]))
AS_IF([test "x$enable_eof" != "xno"], [
AC_DEFINE(CONFIG_EOF, 1, [Define to enable EOF (Ctrl-D) key.])])
AS_IF([test "x$enable_eof" != "xno"],
AC_DEFINE(CONFIG_EOF, 1, [Define to enable EOF (Ctrl-D) key.]))
AS_IF([test "x$enable_sigint" != "xno"], [
AC_DEFINE(CONFIG_SIGINT, 1, [Define to enable SIGINT (Ctrl-C) key.])])
AS_IF([test "x$enable_sigint" != "xno"],
AC_DEFINE(CONFIG_SIGINT, 1, [Define to enable SIGINT (Ctrl-C) key.]))
AS_IF([test "x$enable_sigstop" = "xyes"], [
AC_DEFINE(CONFIG_SIGSTOP, 1, [Define to enable SIGSTOP (Ctrl-Z) key.])])
AS_IF([test "x$enable_sigstop" = "xyes"],
AC_DEFINE(CONFIG_SIGSTOP, 1, [Define to enable SIGSTOP (Ctrl-Z) key.]))
AS_IF([test "x$enable_terminal_bell" = "xyes"], [
AC_DEFINE(CONFIG_TERMINAL_BELL, 1, [Define to enable terminal bell on completion.])])
AM_CONDITIONAL([ENABLE_EXAMPLES], [test "$enable_examples" = yes])
AS_IF([test "x$enable_terminal_bell" = "xyes"],
AC_DEFINE(CONFIG_TERMINAL_BELL, 1, [Define to enable terminal bell on completion.]))
# Check for a termcap compatible library if enabled
AS_IF([test "x$enable_termcap" = "xyes"], [
AS_IF([test "x$enable_termcap" = "xyes"],
AC_DEFINE(CONFIG_USE_TERMCAP, 1, [Define to use the termcap library for terminal size.])
AC_CHECK_LIB(terminfo, tgetent, , [
AC_CHECK_LIB(termcap, tgetent, , [
@ -100,7 +93,7 @@ AS_IF([test "x$enable_termcap" = "xyes"], [
])
])
])
])])
]))
# Generate all files
AC_OUTPUT

8
debian/changelog vendored
View File

@ -1,11 +1,3 @@
editline (1.17.1) stable; urgency=medium
* Fix multiline representing as one line
* Fix missing content in libedtline1, introduced in 1.16.0
* Update packaging to latest std version
-- Joachim Nilsson <troglobit@gmail.com> Sun, 23 Feb 2020 18:46:41 +0100
editline (1.17.0) unstable; urgency=medium
* Simple multi-line support

2
debian/compat vendored
View File

@ -1 +1 @@
10
9

8
debian/control vendored
View File

@ -1,9 +1,9 @@
Source: editline
Section: devel
Priority: optional
Build-Depends: debhelper (>= 10), libtool
Maintainer: Joachim Wiberg <troglobit@gmail.com>
Standards-Version: 4.3.0
Build-Depends: debhelper (>= 5.0), libtool
Maintainer: Joachim Nilsson <troglobit@gmail.com>
Standards-Version: 3.8.3
Package: libeditline-dev
Architecture: any
@ -21,7 +21,7 @@ Description: development files for libeditline
Package: libeditline1
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, ${misc:Depends}
Depends: ${misc:Depends}
Description: line editing library similar to readline
This is a line-editing library. It can be linked into almost any program
to provide command-line editing and recall. It is call-compatible with a

25
debian/copyright vendored
View File

@ -1,23 +1,17 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: editline
Upstream-Contact: Joachim Wiberg <troglobit@gmail.com>
Source: http://github.com/troglobit/editline
Comment: This package was originally debianized by Jim Studt <jim@federated.com>
on Fri, 5 May 2000 13:25:51 -0500. It was received from, then upstream
author, Rich Salz <rsalz@shore.net>
This package was debianized by Jim Studt <jim@federated.com> on
Fri, 5 May 2000 13:25:51 -0500.
Files: *
Copyright: 1992,1993 Simmule Turner and Rich Salz.
License: C-News
It was received from Rich Salz rsalz@shore.net
Files: debian/*
Copyright: 2010-2020 Joachim Wiberg <troglobit@gmail.com>
License: BSD-2-clause
Upstream Author: Rich Salz rsalz@shore.net
Copyright:
Copyright 1992,1993 Simmule Turner and Rich Salz. All rights reserved.
License: C-News
This software is not subject to any license of the American Telephone
and Telegraph Company or of the Regents of the University of California.
.
Permission is granted to anyone to use this software for any purpose on
any computer system, and to alter it and redistribute it freely, subject
to the following restrictions:
@ -30,3 +24,4 @@ License: C-News
misrepresented as being the original software. Since few users
ever read sources, credits must appear in the documentation.
4. This notice may not be removed or altered.

View File

@ -1,5 +1,4 @@
usr/include/*.h
usr/lib/*/libeditline*.*a
usr/lib/*/libeditline.so
usr/lib/*/pkgconfig/*
usr/share/man/man3/*

1
debian/libeditline0.install vendored Normal file
View File

@ -0,0 +1 @@
usr/lib/*/libeditline*.so*

View File

@ -1 +0,0 @@
usr/lib/*/libeditline.so.*

View File

@ -1,67 +0,0 @@
libeditline.so.1 libeditline1 #MINVER#
* Build-Depends-Package: libeditline-dev
add_history@Base 1.17.1
el_bind_key@Base 1.17.1
el_bind_key_in_metamap@Base 1.17.1
el_del_char@Base 1.17.1
el_filename_complete@Base 1.17.1
el_filename_list_possib@Base 1.17.1
el_find_word@Base 1.17.1
el_hist_size@Base 1.17.1
el_next_hist@Base 1.17.1
el_no_echo@Base 1.17.1
el_no_hist@Base 1.17.1
el_prev_hist@Base 1.17.1
el_print_columns@Base 1.17.1
el_ring_bell@Base 1.17.1
prompt_len@Base 1.17.1
read_history@Base 1.17.1
readline@Base 1.17.1
rl_add_slash@Base 1.17.1
rl_attempted_completion_function@Base 1.17.1
rl_attempted_completion_over@Base 1.17.1
rl_callback_handler_install@Base 1.17.1
rl_callback_handler_remove@Base 1.17.1
rl_callback_read_char@Base 1.17.1
rl_clear_message@Base 1.17.1
rl_complete@Base 1.17.1
rl_completion_entry_function@Base 1.17.1
rl_completion_matches@Base 1.17.1
rl_deprep_term_function@Base 1.17.1
rl_deprep_terminal@Base 1.17.1
rl_end@Base 1.17.1
rl_eof@Base 1.17.1
rl_erase@Base 1.17.1
rl_event_hook@Base 1.17.1
rl_filename_completion_function@Base 1.17.1
rl_forced_update_display@Base 1.17.1
rl_getc@Base 1.17.1
rl_getc_function@Base 1.17.1
rl_inhibit_complete@Base 1.17.1
rl_initialize@Base 1.17.1
rl_insert_text@Base 1.17.1
rl_instream@Base 1.17.1
rl_intr@Base 1.17.1
rl_kill@Base 1.17.1
rl_line_buffer@Base 1.17.1
rl_list_possib@Base 1.17.1
rl_mark@Base 1.17.1
rl_meta_chars@Base 1.17.1
rl_outstream@Base 1.17.1
rl_point@Base 1.17.1
rl_prep_term_function@Base 1.17.1
rl_prep_terminal@Base 1.17.1
rl_prompt@Base 1.17.1
rl_quit@Base 1.17.1
rl_readline_name@Base 1.17.1
rl_refresh_line@Base 1.17.1
rl_reset_terminal@Base 1.17.1
rl_restore_prompt@Base 1.17.1
rl_save_prompt@Base 1.17.1
rl_set_complete_func@Base 1.17.1
rl_set_getc_func@Base 1.17.1
rl_set_list_possib_func@Base 1.17.1
rl_set_prompt@Base 1.17.1
rl_ttyset@Base 1.17.1
rl_uninitialize@Base 1.17.1
write_history@Base 1.17.1

12
debian/rules vendored
View File

@ -1,16 +1,8 @@
#!/usr/bin/make -f
# export DH_VERBOSE=1
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
export DEB_CFLAGS_MAINT_APPEND = -W -Wall -Wextra -O3
export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
include /usr/share/dpkg/default.mk # provides DEB_VERSION
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
%:
dh $@ --with autoreconf
override_dh_installchangelogs:
dh_installchangelogs ChangeLog.md

View File

@ -39,7 +39,6 @@ Jeff
#include <stdio.h>
#include <sys/types.h>
#include <sys/select.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>

View File

@ -7,7 +7,6 @@
*/
#include <assert.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/file.h>
@ -23,7 +22,7 @@
#include "editline.h"
void too_dangerous(char *caller);
void initialize_readline(const char *prompt);
void initialize_readline();
int execute_line(char *line);
int valid_argument(char *caller, char *arg);
@ -62,15 +61,8 @@ struct cmd commands[] = {
};
/* Forward declarations. */
char *stripwhite(char *string);
struct cmd *find_command(char *name);
/* ~/.fileman_history */
char *fileman_history;
/* Prompt base and current */
const char *prompt_init;
char *prompt_curr;
char *stripwhite();
struct cmd *find_command();
/* When non-zero, this means the user is done using this program. */
int done;
@ -80,11 +72,12 @@ int main(int argc, char **argv)
char *line, *s;
setlocale(LC_CTYPE, "");
initialize_readline("(FileMan)");
initialize_readline(); /* Bind our completer. */
/* Loop reading and executing lines until the user quits. */
for (; done == 0;) {
line = readline(NULL);
line = readline("FileMan: ");
if (!line)
break;
@ -114,10 +107,6 @@ int main(int argc, char **argv)
free(line);
}
puts("");
write_history(fileman_history);
free(fileman_history);
return 0;
}
@ -199,58 +188,19 @@ char *stripwhite(char *string)
char *command_generator(const char *, int);
char **fileman_completion(const char *, int, int);
void fileman_prompt(void);
/*
* Tell the GNU Readline library how to complete. We want to try to
* complete on command names if this is the first word in the line, or
* on filenames if not.
*/
void initialize_readline(const char *prompt)
void initialize_readline(void)
{
const char *home;
size_t len;
/* Allow conditional parsing of the ~/.inputrc file. */
rl_readline_name = "FileMan";
/* Tell the completer that we want a crack first. */
rl_attempted_completion_function = fileman_completion;
/* Restore command history */
home = getenv("HOME");
len = (home ? strlen(home) : 0) + 14;
fileman_history = malloc(len);
assert(fileman_history);
snprintf(fileman_history, len, "%s/.fileman_history", home ? home : ".");
read_history(fileman_history);
/* Prompt is updated when moving around in the tree */
prompt_init = prompt;
fileman_prompt();
}
/*
* Update prompt when changing directory. Use an allocated string to
* show off the rl_set_prompt() API for issue #51.
*/
void fileman_prompt(void)
{
char cwd[1024];
size_t len;
if (prompt_curr)
free(prompt_curr);
assert(getcwd(cwd, sizeof(cwd)));
len = strlen(prompt_init) + strlen(cwd) + 10;
prompt_curr = malloc(len);
assert(prompt_curr);
snprintf(prompt_curr, len, "%s %s/> ", prompt_init, cwd);
rl_set_prompt(prompt_curr);
}
/*
@ -427,8 +377,7 @@ int com_cd(char *arg)
return 1;
}
//com_pwd("");
fileman_prompt();
com_pwd("");
return 0;
}

View File

@ -21,8 +21,6 @@
#ifndef EDITLINE_H_
#define EDITLINE_H_
#include <stdio.h>
/* Handy macros when binding keys. */
#define CTL(x) ((x) & 0x1F)
#define ISCTL(x) ((x) && (x) < ' ')
@ -84,7 +82,6 @@ extern int rl_point;
extern int rl_mark;
extern int rl_end;
extern int rl_inhibit_complete;
extern int rl_attempted_completion_over;
extern char *rl_line_buffer;
extern const char *rl_readline_name;
extern FILE *rl_instream; /* The stdio stream from which input is read. Defaults to stdin if NULL - Not supported yet! */

View File

@ -1,4 +1,4 @@
.Dd February 23, 2020
.Dd April 27, 2019
.Dt EDITLINE 3
.Os
.Sh NAME
@ -8,22 +8,10 @@
.Lb libeditline
.Sh SYNOPSIS
.In editline.h
.Ft char *
.Fo readline
.Fa const char *prompt
.Fc
.Ft void
.Fo add_history
.Fa const char *line
.Fc
.Ft int
.Fo read_history
.Fa const char *filename
.Fc
.Ft int
.Fo write_history
.Fa const char *filename
.Fc
.Fn "char *readline" "const char *prompt"
.Fn "void add_history" "const char *line"
.Fn "int read_history" "const char *filename"
.Fn "int write_history" "const char *filename"
.Sh DESCRIPTION
.Nm
is a library that provides n line-editing interface with history. It
@ -275,13 +263,12 @@ int main(void)
The original editline library was posted to comp.sources.unix newsgroup
by created by Simmule R. Turner and Rich Salz in 1992. It now exists in
several forks: Debian, Minix, Heimdal, Festival speech tools, Mozilla,
Google Gadgets for Linux, and many others. The original manual page was
made by David W. Sanderson.
Google Gadgets for Linux, and many other places. The original manual
page was made by David W. Sanderson.
.Pp
This version stems from the Minix 2 sources, but has since evolved to
include patches from all relevant forks. It is currently maintained by
.An Joachim Wiberg
at
.Lk https://github.com/troglobit/editline "GitHub" .
This version was originally based on the Minix 2 sources, but has since
evolved to include patches from all relevant forks. It is currently
maintained by Joachim Nilsson at GitHub,
.Aq http://github.com/troglobit/editline
.Sh BUGS
Does not handle multiple lines or unicode characters well.

View File

@ -40,7 +40,7 @@ static int compare(const void *p1, const void *p2)
/* Fill in *avp with an array of names that match file, up to its length.
* Ignore . and .. . */
static int FindMatches(const char *dir, const char *file, char ***avp)
static int FindMatches(char *dir, char *file, char ***avp)
{
char **av;
char **word;
@ -128,7 +128,7 @@ static int FindMatches(const char *dir, const char *file, char ***avp)
/* Split a pathname into allocated directory and trailing filename parts. */
static int SplitPath(const char *path, char **dirpart, char **filepart)
{
static const char DOT[] = ".";
static char DOT[] = ".";
char *dpart;
char *fpart;
@ -197,14 +197,14 @@ char *el_filename_complete(char *pathname, int *match)
if (ac == 1) {
/* Exactly one match -- finish it off. */
*match = 1;
j = strlen(av[0]) - len + 1;
p = malloc(sizeof(char) * (j + 1));
j = strlen(av[0]) - len + 2;
p = malloc(sizeof(char) * (j + 1));
if (p) {
memcpy(p, av[0] + len, j);
len = strlen(dir) + strlen(av[0]) + 2;
path = malloc(sizeof(char) * len);
len = strlen(dir) + strlen(av[0]) + 2;
path = malloc(sizeof(char) * len);
if (path) {
snprintf(path, len, "%s/%s", dir, av[0]);
snprintf(path, len, "%s/%s", dir, av[0]);
rl_add_slash(path, p);
free(path);
}
@ -243,7 +243,9 @@ char *el_filename_complete(char *pathname, int *match)
char *rl_filename_completion_function(const char *text, int state)
{
static char **av, *dir, *file;
char *dir;
char *file;
static char **av;
static size_t i, ac;
if (!state) {
@ -251,47 +253,32 @@ char *rl_filename_completion_function(const char *text, int state)
return NULL;
ac = FindMatches(dir, file, &av);
if (!ac) {
free(dir);
free(file);
free(dir);
free(file);
if (!ac)
return NULL;
}
i = 0;
}
if (i < ac) {
size_t len = (dir ? strlen(dir) : 0) + strlen(av[i]) + 3;
char *ptr = malloc(len);
if (ptr) {
snprintf(ptr, len, "%s%s", dir, av[i++]);
if (ac == 1)
rl_add_slash(ptr, ptr);
return ptr;
}
}
if (i < ac)
return av[i++];
do {
free(av[--i]);
} while (i > 0);
free(av);
free(dir);
free(file);
return NULL;
}
/* Similar to el_find_word(), but used by GNU Readline API */
static char *rl_find_token(size_t *len)
{
const char *ptr;
char *ptr;
int pos;
for (pos = rl_point; pos < rl_end; pos++) {
if (isspace((unsigned char) rl_line_buffer[pos])) {
if (isspace(rl_line_buffer[pos])) {
if (pos > 0)
pos--;
break;
@ -299,7 +286,7 @@ static char *rl_find_token(size_t *len)
}
ptr = &rl_line_buffer[pos];
while (pos >= 0 && !isspace((unsigned char) rl_line_buffer[pos])) {
while (pos >= 0 && !isspace(rl_line_buffer[pos])) {
if (pos == 0)
break;
@ -380,12 +367,8 @@ static char *complete(char *token, int *match)
free(word);
word = NULL;
/* Exactly one match -- finish it off. */
if (words[0] && !words[1]) {
*match = 1;
if (words[0])
word = strdup(words[0] + len);
}
while (words[i])
free(words[i++]);
@ -395,9 +378,6 @@ static char *complete(char *token, int *match)
return word;
}
if (word)
free(word);
fallback:
return el_filename_complete(token, match);
}

View File

@ -115,7 +115,7 @@ static const char *old_prompt = NULL;
static rl_vcpfunc_t *line_handler = NULL;
static char *line_up = "\x1b[A";
static char *line_down = "\x1b[B";
static int prompt_len = 0;
int prompt_len = 0;
int el_no_echo = 0; /* e.g., under Emacs */
int el_no_hist = 0;
@ -125,7 +125,6 @@ int rl_end;
int rl_meta_chars = 0; /* Display 8-bit chars as the actual char(0) or as `M-x'(1)? */
int rl_inhibit_complete = 0;
char *rl_line_buffer = NULL;
static const char *rl_saved_prompt = NULL;
const char *rl_prompt = NULL;
const char *rl_readline_name = NULL; /* Set by calling program, for conditional parsing of ~/.inputrc - Not supported yet! */
FILE *rl_instream = NULL; /* The stdio stream from which input is read. Defaults to stdin if NULL */
@ -211,16 +210,14 @@ static void tty_show(unsigned char c)
}
}
static void tty_string(const char *p)
static void tty_string(char *p)
{
int i = rl_point + prompt_len + 1;
while (*p) {
tty_show(*p++);
if ((i++) % tty_cols == 0) {
tty_put(' ');
tty_put('\b');
}
if ((i++) % tty_cols == 0)
tty_put('\n');
}
}
@ -464,6 +461,12 @@ static el_status_t do_forward(el_status_t move)
right(CSstay);
}
/* Skip to next word, or skip leading white space if outside a word. */
for ( ; rl_point < rl_end && (p[0] == ' ' || !is_alpha_num(p[0])); rl_point++, p++) {
if (move == CSmove)
right(CSstay);
}
if (rl_point == rl_end)
break;
} while (++i < Repeat);
@ -489,10 +492,10 @@ static el_status_t do_case(el_case_t type)
for (i = rl_point, p = &rl_line_buffer[i]; rl_point < end; p++) {
if ((type == TOupper) || (type == TOcapitalize && rl_point == i)) {
if (islower((unsigned char)(*p)))
*p = toupper((unsigned char)(*p));
} else if (isupper((unsigned char)(*p))) {
*p = tolower((unsigned char)(*p));
if (islower(*p))
*p = toupper(*p);
} else if (isupper(*p)) {
*p = tolower(*p);
}
right(CSmove);
}
@ -773,7 +776,7 @@ static const char *search_hist(const char *search, const char *(*move)(void))
static el_status_t h_search_end(const char *p)
{
rl_set_prompt(old_prompt);
rl_prompt = old_prompt;
Searching = 0;
if (el_intr_pending > 0) {
@ -800,8 +803,8 @@ static el_status_t h_search(void)
clear_line();
old_prompt = rl_prompt;
rl_set_prompt("Search: ");
reposition(EOF);
rl_prompt = "Search: ";
tty_puts(rl_prompt);
search_move = Repeat == NO_ARG ? el_prev_hist : el_next_hist;
if (line_handler) {
@ -1029,30 +1032,6 @@ static el_status_t meta(void)
return CSeof;
#ifdef CONFIG_ANSI_ARROWS
/* See: https://en.wikipedia.org/wiki/ANSI_escape_code */
/* Recognize ANSI escapes for `Meta+Left` and `Meta+Right`. */
if (c == '\e') {
switch (tty_get()) {
case '[':
{
switch (tty_get()) {
/* \e\e[C = Meta+Left */
case 'C': return fd_word();
/* \e\e[D = Meta+Right */
case 'D': return bk_word();
default:
break;
}
return el_ring_bell();
}
default:
break;
}
return el_ring_bell();
}
/* Also include VT-100 arrows. */
if (c == '[' || c == 'O') {
switch (tty_get()) {
@ -1060,31 +1039,21 @@ static el_status_t meta(void)
case '1':
{
char seq[4] = { 0 };
seq[0] = tty_get();
/* \e[1~ */
if (seq[0] == '~')
return beg_line(); /* Home */
for (c = 1; c < 3; c++)
for (c = 0; c < 3; c++)
seq[c] = tty_get();
if (!strncmp(seq, ";5C", 3)
|| !strncmp(seq, ";3C", 3))
return fd_word(); /* \e[1;5C = Ctrl+Right */
if (!strncmp(seq, ";5D", 3)
|| !strncmp(seq, ";3D", 3))
return bk_word(); /* \e[1;5D = Ctrl+Left */
if (!strncmp(seq, ";5C", 3))
return fd_word(); /* Ctrl+Right */
if (!strncmp(seq, ";5D", 3))
return bk_word(); /* Ctrl+Left */
break;
}
case '2': tty_get(); return CSstay; /* Insert */
case '3': tty_get(); return del_char(); /* Delete */
case '4': tty_get(); return end_line(); /* End */
case '5': tty_get(); return CSstay; /* PgUp */
case '6': tty_get(); return CSstay; /* PgDn */
case '7': tty_get(); return beg_line(); /* Home (urxvt) */
case '8': tty_get(); return end_line(); /* End (urxvt) */
case 'A': return h_prev(); /* Up */
case 'B': return h_next(); /* Down */
case 'C': return fd_char(); /* Left */
@ -1154,8 +1123,6 @@ static el_status_t emacs(int c)
static el_status_t tty_special(int c)
{
el_status_t rc;
#ifdef CONFIG_SIGINT
if (c == rl_intr) {
el_intr_pending = SIGINT;
@ -1180,10 +1147,14 @@ static el_status_t tty_special(int c)
return bk_del_char();
if (c == rl_kill) {
Repeat = rl_point;
rc = bk_del_char();
Repeat = NO_ARG;
return rc;
if (rl_point != 0) {
old_point = rl_point;
rl_point = 0;
reposition(c);
}
Repeat = NO_ARG;
return kill_line();
}
#ifdef CONFIG_EOF
@ -1249,7 +1220,7 @@ static char *editinput(int complete)
static void hist_alloc(void)
{
if (!H.Lines)
H.Lines = calloc(1 + el_hist_size, sizeof(char *));
H.Lines = calloc(el_hist_size, sizeof(char *));
}
static void hist_add(const char *p)
@ -1266,11 +1237,11 @@ static void hist_add(const char *p)
if (s == NULL)
return;
if (H.Size <= el_hist_size) {
if (H.Size < el_hist_size) {
H.Lines[H.Size++] = s;
} else {
free(H.Lines[0]);
for (i = 0; i < el_hist_size; i++)
for (i = 0; i < el_hist_size - 1; i++)
H.Lines[i] = H.Lines[i + 1];
H.Lines[i] = s;
}
@ -1282,7 +1253,7 @@ static char *read_redirected(void)
int size = MEM_INC;
char *p;
char *line;
const char *end;
char *end;
p = line = malloc(sizeof(char) * size);
if (!p)
@ -1364,28 +1335,10 @@ void rl_reset_terminal(const char *terminal_name)
}
}
void rl_set_prompt(const char *prompt)
{
if (prompt)
rl_prompt = prompt;
prompt_len = strlen(rl_prompt);
}
void rl_save_prompt(void)
{
rl_saved_prompt = rl_prompt;
}
void rl_restore_prompt(void)
{
if (rl_saved_prompt)
rl_set_prompt(rl_saved_prompt);
}
void rl_initialize(void)
{
if (!rl_prompt)
rl_set_prompt("? ");
rl_prompt = "? ";
hist_alloc();
@ -1404,7 +1357,7 @@ void rl_uninitialize(void)
/* Uninitialize the history */
if (H.Lines) {
for (i = 0; i <= el_hist_size; i++) {
for (i = 0; i < el_hist_size; i++) {
if (H.Lines[i])
free(H.Lines[i]);
H.Lines[i] = NULL;
@ -1426,12 +1379,29 @@ void rl_uninitialize(void)
Length = 0;
}
static const char *rl_saved_prompt = NULL;
void rl_save_prompt(void)
{
rl_saved_prompt = rl_prompt;
}
void rl_restore_prompt(void)
{
if (rl_saved_prompt)
rl_prompt = rl_saved_prompt;
}
void rl_set_prompt(const char *prompt)
{
rl_prompt = prompt;
}
void rl_clear_message(void)
{
/* Nothing to do atm. */
}
void rl_forced_update_display(void)
void rl_forced_update_display()
{
redisplay(0);
tty_flush();
@ -1456,7 +1426,8 @@ static int el_prep(const char *prompt)
if (!Screen)
return -1;
rl_set_prompt(prompt);
rl_prompt = prompt ? prompt : NILSTR;
prompt_len = strlen(rl_prompt);
if (el_no_echo) {
int old = el_no_echo;
@ -1773,6 +1744,14 @@ static el_status_t accept_line(void)
return CSdone;
}
#ifdef SYSTEM_IS_WIN32
static el_status_t end_of_input(void)
{
rl_line_buffer[rl_end] = '\0';
return CSeof;
}
#endif
static el_status_t transpose(void)
{
char c;
@ -1895,14 +1874,14 @@ static int argify(char *line, char ***avp)
if (!p)
return 0;
for (c = line; isspace((unsigned char)(*c)); c++)
for (c = line; isspace(*c); c++)
continue;
if (*c == '\n' || *c == '\0')
return 0;
for (ac = 0, p[ac++] = c; *c && *c != '\n'; ) {
if (!isspace((unsigned char)(*c))) {
if (!isspace(*c)) {
c++;
continue;
}
@ -1984,7 +1963,11 @@ static el_keymap_t Map[64] = {
{ CTL('W'), bk_kill_word },
{ CTL('X'), exchange },
{ CTL('Y'), yank },
#ifdef SYSTEM_IS_WIN32
{ CTL('Z'), end_of_input },
#else
{ CTL('Z'), el_ring_bell },
#endif
{ CTL('['), meta },
{ CTL(']'), move_to_char },
{ CTL('^'), el_ring_bell },