Compare commits

...

229 Commits

Author SHA1 Message Date
Joachim Wiberg
9df73e8670
Merge pull request #74 from tgree/macos_prototypes_fix
Fix function prototypes
2025-04-06 13:34:10 +02:00
Terry Greeniaus
f53bebdbe9 Fix function prototypes.
This allows it to compile on macOS 15.3.2 using the default command-line
tools (clang-1600.0.26.6).
2025-04-05 23:17:20 -06:00
Joachim Wiberg
50bde4b5c3 Constify
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-12-08 21:41:48 +01:00
Joachim Wiberg
651c0bf38b examples: update prompt in fileman to show cwd
This shows off the rl_set_prompt() API to provide a more dynamic prompt.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-12-08 21:36:12 +01:00
Joachim Wiberg
d1ea173949 Fix and make sure to use rl_set_prompt() API
Fixes #51

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-12-08 21:34:56 +01:00
Joachim Wiberg
2c0313a3b5 Move forward wordwise should move to end of current word
For a similar feel like GNU Readline we should not skip to the next word
but stop at the end of the current.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-12-08 08:22:27 +01:00
Joachim Wiberg
41d80b5b14 Calling Ctrl-U should delete from cursor to beginning
Fixes #71

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-12-08 08:12:19 +01:00
Joachim Wiberg
c7437c8ce3 Fix doube free in completion
When falling back to rl_filename_completion_fuction as compentry
generator, the complete() function caused double free because the
generator did not return a strdup'ed entry but one of its own that
it freed when done.

Fixes #56

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-12-07 10:38:57 +01:00
Joachim Wiberg
22bdb0478c Minor, update maintainer last name
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-12-07 08:33:54 +01:00
Joachim Wiberg
fb4d7268de
Merge pull request #70 from 9999years/recognize-meta-arrows
Recognize `Meta+Left` and `Meta+Right` for word navigation
2024-12-07 08:32:55 +01:00
Rebecca Turner
4c4455353a
Add support for \e[1;3C and \e[1;3D 2024-09-09 09:44:44 -07:00
Rebecca Turner
d0f2a5bc23
Recognize Meta+Left and Meta+Right
I'm not sure exactly where to find canonical documentation for these
codes, but this seems to match what my terminal produces (macOS + iTerm2
+ Fish + Tmux).

It might also be nice to have some more support for editing the bindings
for these characters; sequences of more than one character are not
supported by `el_bind_key` and similar.
2024-09-08 19:32:28 -07:00
Joachim Wiberg
ac81ca6d4b
Merge pull request #69 from vikrrrr/missing-global
Add rl_attempted_completion_over global to header

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2024-09-07 11:02:46 +02:00
Arthur Michas
93d952291f
Add rl_attempted_completion_over global to header
Signed-off-by: Arthur Michas <vikr@protonmail.com>
2024-09-07 02:53:08 +02:00
Joachim Wiberg
caf4b3c0ce
Merge pull request #67 from Feoramund/respect-hist-size 2024-05-27 17:44:43 +02:00
Joachim Wiberg
6207edfe95
Merge pull request #68 from Feoramund/respect-default-prompt 2024-05-27 17:44:05 +02:00
Feoramund
e0f686506a
Respect default prompt
A prompt `"? "` is set in `rl_initialize`, but it is never seen, because
this line was replacing it with `NILSTR`.
2024-05-26 04:13:29 -04:00
Feoramund
aefda06a0c
Respect el_hist_size
It was previously subject to a sort of off-by-one error, because of the
addition of `NILSTR` in `el_prep`. This should allow a history size of 1
to function correctly now.
2024-05-26 03:38:04 -04:00
Joachim Wiberg
425584840c
Merge pull request #64 from trofi/autoconf-2.72-fix 2023-12-24 03:45:37 +01:00
Sergei Trofimovich
2b788be1c8 configure.ac: add second parameter quoting around the rest of AS_IF for consistency 2023-12-23 19:17:19 +00:00
Sergei Trofimovich
f444a316f5 configure.ac: fix autoconf-2.72 compatibility
`autoconf-2.72` slightly changed `AS_IF`/`AC_CHECL_LIB` definitions and
exposed the bug of missng quoting around the arguments:

    editline> ./configure: line 13944: syntax error near unexpected token `;;'
    editline> ./configure: line 13944: ` ;;'

The change adds quoting as suggested by https://savannah.gnu.org/support/index.php?110990
2023-12-23 19:13:52 +00:00
Joachim Wiberg
7633fbceee
Merge pull request #63 from nobody5050/patch-1
fix filename inaccuracy

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2023-01-29 06:47:11 +01:00
nobody5050
d903a940a5
fix filename inaccuracy 2023-01-28 12:44:44 -06:00
Joachim Wiberg
3ccc3a5120
Merge pull request #62 from al20878/master
Fix #61: gcc sign extension warnings

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-10-23 15:14:18 +02:00
Tony Lawrence
c50d4c34d8 Avoid using (char) in <ctype.h> macros (#61) 2022-10-22 20:02:23 -04:00
Tony Lawrence
70c80ac22e Mention autoconf.sh in build instructions (#61) 2022-10-22 20:02:16 -04:00
Joachim Wiberg
9fa05ba384 Add early notice on Windows not being supported
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-02-19 22:41:32 +01:00
Joachim Wiberg
9d4c6f7042 Drop orig. effort to support WIN32
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2022-02-19 22:38:55 +01:00
Joachim Wiberg
fc866f60d6
Merge pull request #57 from rcombs/patch-1
Include stdio.h from editline.h
2022-02-19 22:09:15 +01:00
rcombs
f7b58d3c0d
Include stdio.h from editline.h
Fixes `#include <editline.h>` without first including `<stdio.h>`, which previously errored at the missing typedef for `FILE`.
2022-02-17 17:59:40 -06:00
Joachim Wiberg
36e0921c71
Merge pull request #54 from tejing1/master
handle home and end keys in urxvt
2021-07-06 08:23:08 +02:00
Jeff Huffman
ec62e11a72
handle home and end keys in urxvt 2021-06-27 22:44:30 -04:00
Joachim Wiberg
0f4f5b0228
Merge pull request #53 from oxalica/fix/tmux-home-end
Fix Home (\e[1~) and End (\e[4~) in tmux
2021-05-29 15:22:18 +02:00
oxalica
265c1fb6a0
Fix Home (\e[1~) and End (\e[4~) in tmux 2021-05-29 14:30:05 +08:00
Joachim Wiberg
69c7e86967 Merge branch 'mlundh-bufferOverrunFix'
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
2021-02-25 10:51:58 +01:00
Martin Lundh
3acd6a8b60 Fixed buffer overrun issue detected by address sanitizer. 2021-02-25 10:22:50 +01:00
Joachim Nilsson
62bba78258 Fix #41: add missing include in example
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-08-02 02:15:37 +02:00
Joachim Nilsson
63b94d2089 configure: Add --enable-examples option to build examples/
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-06-08 18:47:17 +02:00
Joachim Nilsson
2ebe9058a1
Merge pull request #40 from gh-fork-dump/master
POSIX recommends <sys/select.h> for select()
2020-06-08 18:43:27 +02:00
Stephen Gregoratto
d4b25ca85e include <sys/select.h> in excallback
Fixes an build issue when cross-compiling for SerenityOS[1]

[1] https://github.com/SerenityOS/serenity
2020-06-09 00:21:11 +10:00
Joachim Nilsson
ecabef273e debian: Upload to stable
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 19:07:45 +01:00
Joachim Nilsson
751c8ac7d1 Check for release tag before calling distcheck
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:46:59 +01:00
Joachim Nilsson
70d190340a Update changelogs and bump version for v1.17.1 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:46:48 +01:00
Joachim Nilsson
db318fd765 Drop duplicate package: rule
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
d2fa0e4c6e Put auxillary files generated by autotools in aux/
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
3e40e24e11 Reintroduce .tar.gz for distribution archives
For systems that don't have xz in the base install.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
322055b89a debian: Ship upstream ChangeLog in .deb
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
e1981428e7 debian: Add hardening, recommended by lintian
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
d65245abbd debian: .so symlinks should be in -dev package, found by lintian
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
45c9b94e11 debian: Update to Standards-Version 4.3.0 and fix shlib deps
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
bfcf222bdc debian: Add symbols file, found by lintian
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
49c466a23d man: Update mdoc markup of functions
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
6702d3262d debian: Update to copyright format 1.0
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
d8f3759367 debian: Fix missing content in libedtline1, introduced in 1.16.0
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-02-23 18:43:52 +01:00
Joachim Nilsson
8d5d04f667
Merge pull request #38 from echoprotocol/ECHO-732
added fix for multiline representing as one line
2020-01-13 19:04:28 +01:00
dvolynets
ceee039cfc added fix for multiline representing as one line 2020-01-13 12:15:27 +03:00
Joachim Nilsson
02cccd1e87 Update ChangeLog and bump version for v1.17.0
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 09:53:19 +01:00
Joachim Nilsson
01dd4045b4 Bump ABI revision, v1.0.1 --> v1.0.2
Most notably, changes in behavior in history functions.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 09:49:47 +01:00
Joachim Nilsson
99ae6b86cb Revert "Travis-CI: Disable clang temporarily for Coverity Scan run"
This reverts commit d9f725f20a.
2020-01-05 08:29:58 +01:00
Joachim Nilsson
1305d05b75 examples: Refactor CLI unlock gimmick to fix possible Coverity issue
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 08:21:36 +01:00
Joachim Nilsson
d9f725f20a Travis-CI: Disable clang temporarily for Coverity Scan run
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 07:58:33 +01:00
Joachim Nilsson
7278fd8581 Travis-CI: Clean build between different phases
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 07:58:13 +01:00
Joachim Nilsson
f619d9d788 Follow-up to d310910, use EOF instead of -1 in calls to reposition()
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 07:52:31 +01:00
Joachim Nilsson
6c74203cbd Update ChangeLog with latest fixes
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 07:52:31 +01:00
Joachim Nilsson
b44335f413 Defensive programming, check within boundaries before deref
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 07:52:31 +01:00
Joachim Nilsson
e36aae07f8 Refactor move_cursor_forward() into tty_forwardn()
- Use same namespace like other tty movement functions
- Replace globally exposed itoa() and dangerous strcpy() with snprintf()

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 07:52:31 +01:00
Joachim Nilsson
cf8f962e4f Handle realloc() failures better
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 07:52:31 +01:00
Joachim Nilsson
deb2884310 Fix error return value from read_history() and write_history()
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2020-01-05 07:52:31 +01:00
Joachim Nilsson
81840c0f84 Update ChangeLog to reflect latest changes
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-11-28 07:03:44 +01:00
Joachim Nilsson
0b295197f6 Merge branch 'echoprotocol-simple_multiline' 2019-11-28 07:01:48 +01:00
Joachim Nilsson
1802e086e0 Bump version for v1.17.0 release cycle
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-11-28 07:01:13 +01:00
Joachim Nilsson
12d5584721 Fix for() loop; "statement with no effect" warning from GCC
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-11-28 06:59:53 +01:00
Joachim Nilsson
35506cd22e Minor, coding style fixups
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-11-28 06:58:37 +01:00
Joachim Nilsson
f35af9f20d Merge branch 'simple_multiline' of https://github.com/echoprotocol/editline into echoprotocol-simple_multiline 2019-11-28 06:41:43 +01:00
dvolynets
498b041a35 fixed indentations 2019-11-20 15:14:21 +03:00
dvolynets
d3109109c4 added simple multiline support 2019-11-20 15:14:02 +03:00
Joachim Nilsson
7355f56d25 Update ChangeLog(s) and bump version for v1.16.1 release
New ABI version 1.0.1

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-06-07 12:04:01 +02:00
Joachim Nilsson
5496152d51 Rephrase section introducing Jush, the stupid UNIX shell
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-06-01 17:24:59 +02:00
Joachim Nilsson
13f8d5f69c
Merge pull request #32 from abitmore/search-end-cleanup
Cleanup el_intr_pending in h_search_end()
2019-05-08 17:11:02 +02:00
Joachim Nilsson
c2b65646ea Revert "Fi #31: Aborting i-search with Ctrl-C should not generate signal"
This reverts commit e2c3b41d9a.
2019-05-08 17:10:21 +02:00
Joachim Nilsson
e2c3b41d9a Fi #31: Aborting i-search with Ctrl-C should not generate signal
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-05-08 17:04:15 +02:00
Joachim Nilsson
4a17180d37 Add SIGINT notification to cli example, for debugging
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-05-08 17:03:49 +02:00
Joachim Nilsson
3e046cafd2 Clear line on failed Ctrl-R operation
The Ctrl-R search prompt and failed search text may be longer than
the regular CLI prompt.  This patch clears the line to remove any
lingering artefacts.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-05-08 16:57:40 +02:00
Joachim Nilsson
0e493addab Fix #30: Ctrl-R with empty search string clears screen
The screen should only be cleared on Ctrl-L *and* empty regular line,
not when searching with an empty string.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-05-08 16:55:33 +02:00
abitmore
842bd67dd4 Cleanup el_intr_pending in h_search_end()
Fixes an issue when user pressed Ctrl+C when searching.
2019-05-08 07:51:13 -04:00
Joachim Nilsson
0eb8f228f7
Merge pull request #29 from abitmore/rl_set_getc_func
Add rl_set_getc_func()
2019-05-08 10:48:39 +02:00
abitmore
8f6d724e30 Add rl_set_getc_func()
So it's possible to install another implementation of rl_getc() function.
2019-05-07 17:58:06 -04:00
Joachim Nilsson
ee176c80d7 Only display return from readline() when there's something to show.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-05-06 01:20:46 +02:00
Joachim Nilsson
979f05a5eb Follow-up to a4b67d2: Ctrl-L redisplay line when not on empty line
Like Ctrl-D, when on an empty line we clear the screen, when editing a
garbled line we refresh the line.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-05-06 00:54:57 +02:00
Joachim Nilsson
c95d25731d Always use enums for el_status_t return values
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-05-06 00:54:17 +02:00
Joachim Nilsson
61d40f406f examples: Catch SIGINT instead of mapping Ctrl-C, use default Ctrl-D
We want Ctrl-C to work as in Bash, so let's just catch SIGINT (and do
nothing).  Also, the default Ctrl-D handler does what we want, i.e.
exit the CLI when we're on an empty line.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-05-06 00:52:13 +02:00
Joachim Nilsson
385cd77e9b Merge branch 'abitmore-patch-1' 2019-05-03 17:13:39 +02:00
Abit
448a3dac08
Avoid continuously duplicate commands in history
When adding a command to history, if CONFIG_UNIQUE_HISTORY is defined, always compare current command with the last entry in history.
2019-05-03 16:54:25 +02:00
Joachim Nilsson
7506826ac7 debian: libeditline1 does not have any shlib deps.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-04-27 15:44:30 +02:00
Joachim Nilsson
ec7f752095 debian: Add missing pkg-cconfig .pc file to -dev package
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-04-27 15:43:56 +02:00
Joachim Nilsson
959a9e7199 Prepare for debian v1.16.1 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-04-27 15:01:28 +02:00
Joachim Nilsson
397ac9dd56 Update ChangeLog with latest fixes
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-04-27 12:47:20 +02:00
Joachim Nilsson
e58868bec1 Mention jush as another example of Editline
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-04-27 12:46:59 +02:00
Joachim Nilsson
650d0f15c6 Correction, this version of the library stems from Minix 2
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-04-27 12:46:31 +02:00
Joachim Nilsson
2aee394b44 Major update of man page, exand on APIs and history of library
- Convert from obtruse troff syntax to simpler mdoc format
- Add history APIs, most relevant extra APIs available
- Expand on the history of the library
- Rewrite some sections for accessiblilty

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-04-27 12:32:58 +02:00
Joachim Nilsson
dd1af360c3 Merge branch 'dtzWill-fix/narrow-terms' 2019-04-27 09:11:19 +02:00
Will Dietz
8660aef4b7 editline: fix behavior when tty is narrower than column width
Fixes crash when dividing by the number of columns,
which was computed as zero in this situation.

Instead, always have at least one "column" even if it wraps.
2019-04-26 13:30:15 -05:00
Joachim Nilsson
6a4d77ca69 Update ChangeLog with latest fixes
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-04-07 12:46:23 +02:00
Joachim Nilsson
0b554cf8c8 Bump version for v1.16.1 release cycle
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2019-04-07 12:46:01 +02:00
Joachim Nilsson
8f5a5da754 examples/fileman.c: Further code cleanup and simplification
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-12-31 22:51:39 +01:00
Joachim Nilsson
a237e39181 examples/fileman.c: Refactor and cleanup
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-12-31 22:49:28 +01:00
Joachim Nilsson
3cb74b6d87 examples/fileman.c: Remove unnecessary code
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-12-31 22:41:15 +01:00
Joachim Nilsson
5c8429dcee examples/fileman.c: Deregister
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-12-31 22:39:20 +01:00
Joachim Nilsson
8566eb8384 examples/fileman.c: Reindent to project coding style
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-12-31 22:30:45 +01:00
Joachim Nilsson
8e34e4e417
Merge pull request #23 from LnL7/redisplay-clear
make Ctrl-L clear the screen instead of just starting a new line
2018-12-24 08:27:50 +01:00
Daiderd Jordan
a4b67d2268
make Ctrl-L clear the screen instead of just starting a new line 2018-12-23 20:49:25 +01:00
Joachim Nilsson
0b7142eb8e examples: cli: Add password prompt (hidden input) example
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-11-17 11:50:26 +01:00
Joachim Nilsson
2137b9df9f Revert "Merge pull request #21 from cogutvalera/issue_1171"
This reverts commit cddd8d8de0, reversing
changes made to 4ec7d26a9d.
2018-11-15 10:27:22 +01:00
Joachim Nilsson
66d8ae84e2 Revert "Coding style and const fixes to last PR"
This reverts commit fbb1f8800a.
2018-11-15 10:26:03 +01:00
Joachim Nilsson
fbb1f8800a Coding style and const fixes to last PR
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-10-24 08:28:34 +02:00
Joachim Nilsson
cddd8d8de0
Merge pull request #21 from cogutvalera/issue_1171
Hide secret information
2018-10-24 08:00:54 +02:00
Valera Cogut
1db83fe6c6 Fixed inconsistent indentation 2018-10-18 16:54:16 +03:00
Valera Cogut
3cd9894747 Added example for hiding secret information 2018-10-18 12:58:14 +03:00
Valera Cogut
4784fe2491 Hide secret information 2018-10-18 11:15:35 +03:00
Joachim Nilsson
4ec7d26a9d Fix #20: configure --disable-eof does not bite
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-21 07:17:19 +02:00
Joachim Nilsson
ebefa8b890 Refactor, simplify helper macro
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-21 07:12:24 +02:00
Joachim Nilsson
59fa265d91 Update ChangeLog and bump version for v1.16.0 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 10:10:03 +02:00
Joachim Nilsson
5f86c20c87 debian/control: Bump .so/ABI version
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 10:10:03 +02:00
Joachim Nilsson
237014f7d9 Bump ABI version
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 10:10:03 +02:00
Joachim Nilsson
bbd0621da8 debian/control: Set upstream author as maintainer
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 10:10:03 +02:00
Joachim Nilsson
1a5541256b debian/source/format: Add missing file
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 10:10:03 +02:00
Joachim Nilsson
d4bef671b6 Minor, update .gitignore files
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 10:10:03 +02:00
Joachim Nilsson
054891f032 Add .deb package to official release target
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 10:10:03 +02:00
Joachim Nilsson
6fb3365893 docs/HACKING.md: Add release checklist and maintenance doc
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 09:35:27 +02:00
Joachim Nilsson
14b6dd37d6 Fix off-by-one in forward kill word
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 09:29:48 +02:00
Joachim Nilsson
89d2fefbc6 Skip leading whitespace when skipping or killing forwards
When the point is on whitespace between two words skipping forward, or
killing forward, should result in the new point being moved to the next
word:

     foo    bar fox gnu
         ^
=>
     foo    bar fox gnu
                ^

Before this patch the point moved to 'b'.  After this patch the point
moves to the first letter of the next word, 'f'.  Kill forward word now
properly kills 'bar' and moves to the first whitespace letter after
'bar'.  Both are now behaving like FSF Readline.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 09:29:48 +02:00
Joachim Nilsson
ac522cd749 Fix potential memory leak, found by Coverity Scan
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-16 08:29:01 +02:00
Joachim Nilsson
9a16999f0e Remove GNU Readline rl_complete() prototype, for now
We should add a configure option --enable-readline-compat, or sth, so
rl_complete2() (removed in this commit) becomes the new rl_complete(),
and the current rl_complete() becomes el_complete().

The current implementation of rl_complete2() was is incomplete and also
not working properly.  To eliminate any confusion on the matter this
patch removes it.  To restore functionality we should, at the very
least, merge with complete() and possibly also refactor rl_find_token()
to share code with the legacy el_find_word().

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-13 19:06:05 +02:00
Joachim Nilsson
e962b9582a Update ChangeLog, mention new fileman.c from GNU Readline
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-12 17:12:40 +02:00
Joachim Nilsson
29b24dcf83 Clarify comment about future --enable-readline-compat interface
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-12 17:12:19 +02:00
Joachim Nilsson
097fde5267 Merge branch 'master' of github.com:troglobit/editline 2018-09-11 19:57:25 +02:00
Joachim Nilsson
05ed94047b Update ChangeLog and fix description of bug #7 in earlier entry
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-11 19:56:05 +02:00
Joachim Nilsson
77d531f5b5 Refactor completion handling and add FSF Readline callbacks
Still a bit raw, but the basic building blocks are there, waiting to be
cleaned up and released.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-09-11 19:55:43 +02:00
Joachim Nilsson
405f091888
Merge pull request #19 from jmjatlanta/jmj_sigsev
Fix sementation violation when displaying options
2018-07-12 10:50:04 +02:00
jmjatlanta
d2418161ad Fix sementation violation when displaying options 2018-07-11 18:01:48 -05:00
Joachim Nilsson
b2f1cfbbcc fileman: New example, from libedit, and from GNU Readline originally
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-06-17 21:13:02 +02:00
Joachim Nilsson
76039b458b Fix #17: Fix off-by-one problem with strdup() replacement
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-06-14 21:59:18 +02:00
Joachim Nilsson
a5aaf51530 Minor, update project description
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-06-11 22:32:36 +02:00
Joachim Nilsson
bd5ae42b4b Remove configure option --disable-default-complete
The filename completion handler fallback will now be enabled by default.
To disable it a new GNU Readline function pointer will be added.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-04-02 22:08:43 +02:00
Joachim Nilsson
41bbb304b1 Export internal el_next_hist() and el_prev_hist()
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-04-01 16:10:10 +02:00
Joachim Nilsson
f40a2a6a2c TODO: custom completion handlers verified in examples/cli.c
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-31 14:42:10 +02:00
Joachim Nilsson
534b3897b8 Minor update
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-31 01:23:41 +02:00
Joachim Nilsson
b4cf343342 Unify on docs/ directory, which is de facto standard on GitHub
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-31 01:21:12 +02:00
Joachim Nilsson
4c55280864 Update ChangeLog for upcoming v1.16.0 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-29 21:17:20 +02:00
Joachim Nilsson
78eabbde39 man: Minor update
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-24 19:35:16 +01:00
Joachim Nilsson
bc510b320e Follow-up #15: Clean up TODO, event loop callback now supported
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-24 19:34:19 +01:00
Joachim Nilsson
3cf0e89a68 Merge branch 'dev' 2018-03-22 16:06:19 +01:00
Joachim Nilsson
5b43c028c9 Revert "Travis-CI: Disable CLANG temporarily for Coverity Scan"
This reverts commit 6a7483532c.
2018-03-22 16:06:04 +01:00
Joachim Nilsson
1657da4f2e README: Minor whitespace changes
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-22 13:16:07 +01:00
Joachim Nilsson
fdda4f5cae README: Add license badge and add Wikipedia link to C News
The C News sources are referenced in the Wikipedia article, which is
useful to follow-up the license origins.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-22 10:49:49 +01:00
Joachim Nilsson
f8c6b7f208 Update .gitignore
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-22 10:49:39 +01:00
Joachim Nilsson
9e9f8b03d8 Fix Coverity Scan findings, missing return and bad strcpy()
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-22 10:31:50 +01:00
Joachim Nilsson
0bfaf351aa Add support for Ctrl+Right and Ctrl+Left, forward/back word
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-22 08:42:32 +01:00
Joachim Nilsson
2ce0be942e Minor, reorder functions
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-22 08:38:04 +01:00
Joachim Nilsson
6a7483532c Travis-CI: Disable CLANG temporarily for Coverity Scan
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-22 08:17:03 +01:00
Joachim Nilsson
ad3b1c8a07 ChangeLog: Fix missing Markdown link to v1.15.3
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2018-03-09 20:29:52 +01:00
Joachim Nilsson
5be965deec Simplify and clarify example
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-27 14:01:54 +01:00
Joachim Nilsson
791508a3a1 Minor fix, whitespace
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-27 13:27:59 +01:00
Joachim Nilsson
6de69a406b Update example with build instructions, put it before API listing
This update should help with issues like that described in #16, "how do
I use this library?"

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-27 13:15:52 +01:00
Joachim Nilsson
197f3e1c32 Minor fixes, grammar + whitespace
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-27 13:15:02 +01:00
Joachim Nilsson
6adf0e98bb README: Add alternate interface docu
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-11 08:55:12 +01:00
Joachim Nilsson
bc7fc7e5c0 Fix #15: Alternate interface to plain readline(), for event loops
This rather big patch adds support for the GNU Readline alternate
interface, for use with event loops:

    void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler);
    void rl_callback_read_char       (void);
    void rl_callback_handler_remove  (void);

The code has been tested using the testit and excallback examples.
Both regular editing and searching works as intended.

Also, the problem with lingering artefacts on screen when scrolling
through the history has been fixed.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-11 08:43:43 +01:00
Joachim Nilsson
935895bbf1 testit: Don't add history, readline() already does this
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-11 08:43:03 +01:00
Joachim Nilsson
2ec55cc9f1 Minor, simplify
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-11 08:42:33 +01:00
Joachim Nilsson
7f7bb5b45c Minor, use NULL not 0, and -1 not NULL
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-11 01:45:25 +01:00
Joachim Nilsson
9b7b3121c5 configure: Check for unistd.h
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-02 21:15:17 +01:00
Joachim Nilsson
53b160f6a1 examples: Define EDITLINE_LIBRARY when building locally
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-02 21:14:49 +01:00
Joachim Nilsson
779db8817e rl_refresh_line(): new (undocumented) readline compat fn
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-02 21:14:14 +01:00
Joachim Nilsson
29a71a53d0 rl_insert_text(): new readline compat fn
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-02 21:13:39 +01:00
Joachim Nilsson
a9824655ee excallback.c: Fix compilation errors against readline
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-02 18:54:29 +01:00
Joachim Nilsson
69d9e549a0 examples/excallback.c: Jeff Solomon's alternate interface example
This patch adds the unmodified excallback.c from readline.  It was
originally contributed by Jeff Solomon as an example of the alternate
interface to readline.

The following set of patches modify it to work with editline.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-02 18:46:48 +01:00
Joachim Nilsson
94b1a78444 src/Makefile: Add -Wextra to CFLAGS
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-12-02 18:25:49 +01:00
Joachim Nilsson
a9d4247c09 Minor, header cleanup, whitespace fixes, comments
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-30 18:20:29 +01:00
Joachim Nilsson
a1f0a81a31 Add documentation for rl_deprep_term*() function and callback
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-30 07:45:38 +01:00
Joachim Nilsson
ea79fe70f9 write_history(), read_history(): Check fclose() return value
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 21:40:38 +01:00
Joachim Nilsson
621f126128 Reflow paragraphs, add link to original comp.sources.unix posting
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 17:58:42 +01:00
Joachim Nilsson
6137feacdf Add new rl_uninitialize() function to README
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 17:58:09 +01:00
Joachim Nilsson
2075dedc80 Remove leading (superfluous) comment
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 17:22:08 +01:00
Joachim Nilsson
54714631e2 Move All rights reserved to next line
All BSD style licenses put this text on a separate line, immediately
following the Copyright line.  The C-News license is confusing enough
to most people, so let's align at least a bit with the norm.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 17:20:21 +01:00
Joachim Nilsson
a70a933698 Modify header guards, __FILE_H__ is reserved for system headers
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 17:17:50 +01:00
Joachim Nilsson
b613db2afb Whitespace + coding style cleanup
- Use Emacs K&R style
- Add missing braces to for() loops
- Fix coding style issues in cli.c example
- Add empty lines to separate sections
- Simplify and de-indent code, check error case first + continue

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 16:40:10 +01:00
Joachim Nilsson
6021e54dbc Bump version for v1.16.0 relese cycle
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 15:34:30 +01:00
Joachim Nilsson
1ace811722 rl_uninitialize(): also free old_search from previous i-search
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 15:32:59 +01:00
Claus Fischer
4b8333ad39 Remove duplicate unique history check
Signed-off-by: Claus Fischer <claus.fischer@clausfischer.com>
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 15:03:01 +01:00
Joachim Nilsson
ed37cef412 Minor whitespace fixes/cleanup
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 15:01:22 +01:00
Joachim Nilsson
2a3b422137 Fix negative array index triggered by i-search
This is a fix to a bug reported by Claus Fischer.  When doing a reversed
i-search on the history, clear_line() sets rl_point to a negative value,
which is later used by ceol().  The intention is to clear the whole line
for the new Search: prompt, but indexing an array with a negative value
is strongly discouraged.

To prevent this negative indexing from happening we check in ceol() for
rl_point < 0, but we quickly notice another side effect: one lingering
character at the end of line when returning from i-search.  The problem
manifests itself more cleary when having a looooo000ooonong prompt.

The fix is to rub out the extra space, insert the i-search string, and
*then* call ceol() again.

Thanks to Claus for pointing this out!

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 14:53:14 +01:00
Claus Fischer
91937d970d testit: Test new rl_uninitialize() and load/store history
Signed-off-by: Claus Fischer <claus.fischer@clausfischer.com>
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 14:51:29 +01:00
Claus Fischer
317b43e488 rl_unintialize(): New function, free all memory after use
Free all allocated internal memory and reset variables so
rl_initialize() or readline() may be called again later.

Signed-off-by: Claus Fischer <claus.fischer@clausfischer.com>
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 14:44:24 +01:00
Claus Fischer
ed87f37409 Initialize global variables and reset to NULL on free()
Signed-off-by: Claus Fischer <claus.fischer@clausfischer.com>
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-11-29 14:41:50 +01:00
Joachim Nilsson
b30c3479f5 Minor, spellcheck
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-09-07 01:32:17 +02:00
Joachim Nilsson
119db55bf2 Bump version for v1.15.3 bug fix release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-09-07 01:26:31 +02:00
Joachim Nilsson
2542f21ff1 Add support for building .deb packages
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-09-07 01:25:47 +02:00
Joachim Nilsson
36663d6acf Run distcheck in release target, verifies distribution files
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-09-07 01:25:25 +02:00
Joachim Nilsson
866f25ce10 Update ChangeLog(s) for v1.15.3 bug fix release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-09-07 01:25:01 +02:00
Joachim Nilsson
01f684ea19 debian/changelog: Add missing releases
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-09-07 01:24:38 +02:00
Joachim Nilsson
dd0c1dc2a4 debian/: Simplify rules file, greatly, add multi-arch support
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-09-07 01:22:46 +02:00
Joachim Nilsson
30e33b74fb Remove old compat symlinks, keep new Markdown versions
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-09-07 01:22:31 +02:00
Joachim Nilsson
b8c6a5b1e2 configure: Refactor other enable/disable checks like --enable-termcap
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-03-30 00:36:21 +02:00
Joachim Nilsson
ee70c8339c Followup to #7: Check also for terminfo, requested by @rofl0r
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-03-30 00:35:13 +02:00
Joachim Nilsson
16c96eda10 Fix #7: Fix configure --enable-termcap
Improper handling of AC_ARG_ENABLE() causes the configure script to
always enable CONFIG_USE_TERMCAP.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-03-29 22:06:56 +02:00
Joachim Nilsson
0d76f006b5 TODO: Ideas for how to use editline in an event loop
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-03-02 23:36:40 +01:00
Joachim Nilsson
4d93e85af7 debian/.gitignore: New file, ignore built files
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-01-21 19:37:13 +01:00
Joachim Nilsson
387a8b31ba .gitignore: Update, add *.pc file
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2017-01-21 19:36:44 +01:00
Joachim Nilsson
2a3575495a Add make release target for simplified maintenance
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-06-06 20:09:47 +02:00
Joachim Nilsson
8aa36184e6 Update ChangeLog and bump version for v1.15.2 release
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-06-06 20:04:35 +02:00
Joachim Nilsson
0a8f2ef420 Add pkg-config libeditline.pc file
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-06-06 19:56:48 +02:00
Joachim Nilsson
8078ff69cc Add ABI version info for libtool, start with 0.0.0
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-06-06 19:56:08 +02:00
Joachim Nilsson
6db7c7d440 Minor cleanup and simplification of build system
- Move 'foreign' declaration from Makefile.am's to configure script
- Move CFLAGS from configure script to src/Makefile.am
- Remove faltering license blurb at top of configure script, no need
  for this since we a) do not care, b) falls under project license

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-06-01 07:26:16 +02:00
Joachim Nilsson
e02339c3ae Do not assume -ltermcap, check for tgetent() instead
This is a followup patch for issue #8.  When the user elects
to enable Termcap checks for window resizing we need to check
what library on the system provides this functionality.  Do
not assume -ltermcap, but instead check for tgetent() in all
possible libraries.

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-06-01 07:26:09 +02:00
Joachim Nilsson
f66e8cc151 Merge pull request #10 from rofl0r/patch-1
README.md: libedit depends on libtermcap
2016-05-31 23:27:53 +02:00
rofl0r
782ce4a7a9 README.md: libedit depends on libtermcap
netbsd's libedit only relies on functions offered by the traditional
libtermcap (such as tgetent()), which are *usually* (i.e. on the
majority of modern UNIX systems) supplied by ncurses, but there
exist standalone versions as well which can be used instead.
2016-05-31 13:42:10 +01:00
Joachim Nilsson
059d97d7a9 Remove Emacs version-control handling
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-05-07 22:42:24 +02:00
Jakub Pawlowski
edc38768ff Add tty_flush() to rl_forced_update_display()
Forcing update should flush, otherwise weird stuff happen when writing
to console asynchronously (cursor is moved, text is not displayed).

Signed-off-by: Jakub Pawlowski <jakubpawlo@gmail.com>
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-28 19:46:53 +01:00
Joachim Nilsson
59a2db7217 Test build with both GCC and Clang (LLVM)
- Test build with both GCC and Clang (LLVM)
- Only run Coverity Scan on dev branch, not master

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-27 10:12:25 +01:00
Joachim Nilsson
ba005dc0d0 Update ChangeLog, give Jakub proper credit with correct last name
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-27 09:49:33 +01:00
Joachim Nilsson
a1002f6984 Update .gitignore with generated files
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-27 09:32:19 +01:00
Joachim Nilsson
7a0c292a82 Bump version for v1.15.2 release cycle
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-27 09:24:23 +01:00
Jakub Pawlo
91398ceb34 Prevent mangling of symbols when linking with C++
Signed-off-by: Jakub Pawlo <jakubpawlo@gmail.com>
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2016-01-27 09:23:14 +01:00
Joachim Nilsson
3dbeaa0637 Fix link to version
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-11-16 21:21:44 +01:00
Joachim Nilsson
2f08585884 Fix heading
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-11-16 21:21:00 +01:00
Joachim Nilsson
8a40df481b Update ChangeLog and bump version for v1.15.1 release.
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-11-16 21:17:17 +01:00
Joachim Nilsson
8439f426fc Fix examples FTBFS for --enable-termcap builds
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-10-27 19:50:01 +01:00
Joachim Nilsson
cbb5dd037e Update origin section upon questions from Peter Rosin
Thank you Peter for reminding me to update this!

Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-10-22 01:02:25 +02:00
Joachim Nilsson
7a9e467251 Don't force automake v1.11, require at least v1.11
Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
2015-09-25 15:10:46 +02:00
47 changed files with 2847 additions and 979 deletions

50
.gitignore vendored
View File

@ -1,25 +1,29 @@
Makefile
archive
autom4te.cache
config.h
config.log
config.status
libtool
examples/.deps
examples/Makefile
examples/cli
examples/cli.o
examples/testit
examples/testit.o
include/Makefile
man/Makefile
man/Makefile
src/.deps
src/Makefile
src/*.o
src/*.lo
src/libeditline.a
src/libeditline.la
stamp-h1
*~
*/.libs/
*.lo
*.o
*.pc
.deps
.testit_history
GPATH
GRTAGS
GTAGS
Makefile
Makefile.in
aclocal.m4
archive
autom4te.cache
compile
config.guess
config.h
config.h.in
config.log
config.status
config.sub
configure
depcomp
install-sh
libtool
ltmain.sh
missing
stamp-h1

View File

@ -5,6 +5,11 @@ language: c
# We don't need to install packages, use dockerized build, quicker
sudo: false
# Test build with both GCC and Clang (LLVM)
compiler:
- gcc
- clang
env:
global:
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
@ -15,15 +20,15 @@ addons:
coverity_scan:
project:
name: "troglobit/editline"
description: "Minix editline"
description: "A small line editing library"
notification_email: troglobit@gmail.com
build_command_prepend: "./autogen.sh && ./configure --enable-sigstop --enable-terminal-bell"
build_command: "make -j5"
branch_pattern: master
build_command: "make clean all"
branch_pattern: dev
# We don't store generated files (configure and Makefile) in GIT,
# so we must customize the default build script to run ./autogen.sh
script:
- ./autogen.sh
- ./configure --enable-sigstop --enable-terminal-bell
- make -j5
- make clean all

View File

@ -1 +0,0 @@
ChangeLog.md

View File

@ -3,6 +3,132 @@ 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
-----------------------
### Changes
- Simple multi-line support by Dima Volynets, @dvolynets
### Fixes
- Fix return value from `read_history()` and `write_history()`, could
return `errno` instead of `EOF` to indicate error. Now both functions
have uniform return values on error
- Handle internal `realloc()` errors better. Now memory is not leaked
if `realloc()` fails
- Fix possible NULL pointer dereference in key binding lookup function
[1.16.1][] - 2019-06-07
-----------------------
### Changes
- Major updates to the `editline.3` man page
- Cleanup of examples `cli.c` and `fileman.c`
- Add example of hidden input prompt to `cli.c`
### Fixes
- Fix #20: `configure --disable-eof` does not bite
- Fix #23: Make Ctrl-L clear the screan instead of starting a new line
Like Ctrl-D, which exits, Ctrl-L only clears the screen when the line
is empty and the cursor is at the start of the line, otherwise Ctrl-L
will redraw/refresh the current line.
- Fix #24: Fix behavior when TTY is narrower than column width, by Will Dietz
- Fix #25: Avoid continuously duplicate commands in history
- Fix #31: Aborting i-search with Ctrl-C should not generate signal
[1.16.0][] - 2018-09-16
-----------------------
Event loop callback support.
### Changes
- `rl_unintialize()`, new function to free all memory, by Claus Fischer
- `rl_insert_text()`, new GNU Readline compat function
- `rl_refresh_line()`, new GNU Readline compat function
- `rl_callback_*()`, alternate interface to plain `readline()` for event
loops. Modeled after the GNU Readline API
- `rl_completion_entry_function`, and `rl_attempted_completion_function`
are two new GNU Readline compat user hooks for the completion framework
- `rl_completion_matches()` and `rl_filename_completion_function()`
are two new GNU Readline compat functions
- Add new example: `fileman.c` from GNU Readline to demonstrate the
level of compatibility of the revamped completion framework
- Add support for Ctrl-Right and Ctrl-Left, forward/backward word
- Add .deb package to official release target
### Fixes
- Fixed header guards, avoid using leading `__`
- Spell check fixes
- Remove duplicate code in history check
- Use `NULL` instead of `0`, and `-1` instead of `NULL`, where applicable
- Misc. minor Coverity Scan fixes
- Misc. minor fixes to `testit.c` example code
- Add `-Wextra` to std `CFLAGS`
- Check `fclose()` return value in in `write_history()` and `read_history()`
- Initialize global variables and reset to `NULL` on `free()`
- Fix off-by-one in forward kill word, avoid deleting too much
- Skip (or kill) leading whitespace when skipping (or killing) forwards
[1.15.3][] - 2017-09-07
-----------------------
Bug fix release.
### Changes
- Refactor all enable/disable configure options, same problem as in #7
### Fixes
- Fix #7: `--enable-termcap` configure option does not work. The script
enabled termcap by default rather than the other way around.
Also, check for terminfo as well, when `--enable-termcap` is selected.
[1.15.2][] - 2016-06-06
-----------------------
Bug fixes and minor feature creep in `pkg-config` support.
### Changes
- Prevent mangling of symbols when linking with C++. Patch courtesy of
Jakub Pawlowski
- Add `libeditline.pc` for `pkg-config`
### Fixes
- Do not assume a termcap library exists, check for `tgetent()` in
curses, ncurses, tinfo and termcap libraries
- Call `tty_flush()` when user calls `rl_forced_update_display()`
to prevent screen becoming garbled. Patch by Jakub Pawlowski
[1.15.1][] - 2015-11-16
-----------------------
Bug fixes only.
### Changes
- Update README with origin of this version of editline
### Fixes
- Fix build system, don't force automake v1.11, require at least v1.11
- Fix build problem with examples using `--enable-termcap`
[1.15.0][] - 2015-09-10
-----------------------
@ -123,7 +249,14 @@ Adaptations to Debian editline package.
- First version, forked from Minix current 2008-06-06
[UNRELEASED]: https://github.com/troglobit/finit/compare/1.15.0...HEAD
[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
[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
[1.15.3]: https://github.com/troglobit/finit/compare/1.15.2...1.15.3
[1.15.2]: https://github.com/troglobit/finit/compare/1.15.1...1.15.2
[1.15.1]: https://github.com/troglobit/finit/compare/1.15.0...1.15.1
[1.15.0]: https://github.com/troglobit/finit/compare/1.14.2...1.15.0
[1.14.2]: https://github.com/troglobit/finit/compare/1.14.1...1.14.2
[1.14.1]: https://github.com/troglobit/finit/compare/1.14.0...1.14.1
@ -136,9 +269,3 @@ Adaptations to Debian editline package.
[Travis-CI]: https://travis-ci.org/troglobit/uftpd
[Coverity Scan]: https://scan.coverity.com/projects/2947
[README.md]: https://github.com/troglobit/editline/blob/master/README.md
<!--
-- Local Variables:
-- mode: markdown
-- End:
-->

View File

View File

@ -1,4 +1,5 @@
Copyright 1992,1993 Simmule Turner and Rich Salz. All rights reserved.
Copyright 1992,1993 Simmule Turner and Rich Salz
All rights reserved.
This software is not subject to any license of the American Telephone
and Telegraph Company or of the Regents of the University of California.

View File

@ -1,4 +1,52 @@
AUTOMAKE_OPTIONS = foreign
doc_DATA = README LICENSE CHANGELOG
EXTRA_DIST = LICENSE CHANGELOG INSTALL
SUBDIRS = src include man examples
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
if ENABLE_EXAMPLES
SUBDIRS += examples
endif
## Generate MD5 checksum file
MD5 = md5sum
md5-dist:
@for file in $(DIST_ARCHIVES); do \
$(MD5) $$file > ../$$file.md5; \
mv $$file ../; \
done
## Check if tagged in git
release-hook:
if [ ! `git tag | grep $(PACKAGE_VERSION)` ]; then \
echo; \
printf "\e[1m\e[41mCannot find release tag $(PACKAGE_VERSION)\e[0m\n"; \
printf "\e[1m\e[5mDo release anyway?\e[0m "; read yorn; \
if [ "$$yorn" != "y" -a "$$yorn" != "Y" ]; then \
printf "OK, aborting release.\n"; \
exit 1; \
fi; \
echo; \
else \
echo; \
printf "\e[1m\e[42mFound GIT release tag $(PACKAGE_VERSION)\e[0m\n"; \
printf "\e[1m\e[44m>>Remember to push tags!\e[0m\n"; \
echo; \
fi
# lintian --profile debian -i -I --show-overrides ../$PKG.changes
package:
dpkg-buildpackage -uc -us -B
## Target to run when building a release
release: release-hook distcheck md5-dist package
@echo
@echo "Resulting release files:"
@echo "========================================================================="
@for file in $(DIST_ARCHIVES); do \
printf "%-40s Distribution tarball\n" $$file; \
printf "%-40s " $$file.md5; cat ../$$file.md5 | cut -f1 -d' '; \
done
@for file in `cd ..; ls *$(PACKAGE)*_$(subst _,.,$(VERSION))*`; do \
printf "%-40s Debian/Ubuntu package file\n" $$file; \
done

1
README
View File

@ -1 +0,0 @@
README.md

290
README.md
View File

@ -1,6 +1,6 @@
Editline
========
[![Travis Status]][Travis] [![Coverity Status]][Coverity Scan]
[![License Badge][]][License] [![Travis Status]][Travis] [![Coverity Status]][Coverity Scan]
Table of Contents
@ -16,96 +16,53 @@ Table of Contents
Introduction
------------
This is a small [line editing][] library. It can be linked into almost
any program to provide command line editing and history functions. It
This is a small [line editing][] library. It can be linked into almost
any program to provide command line editing and history functions. It
is call compatible with the [FSF readline][] library, but at a fraction
of the size, and as a result fewer features. It is also distributed
under a much more liberal [LICENSE][].
of the size, and as a result fewer features. It is also distributed
under a much more liberal [License][].
The small size (<30k), lack of dependencies (no ncurses needed!), and
the free license should make this library interesting to many embedded
The small size (<30k), lack of dependencies (ncurses not needed!), and
the free license should make this library interesting to many embedded
developers.
Editline has several optional build-time features that can be enabled by
by supplying different options to the GNU configure script. See the
output from <kbd>configure --help</kbd> for details. In the `examples/`
directory you can find some small code snippets used for testing.
supplying different options to the GNU configure script. See the output
from <kbd>configure --help</kbd> for details. Some useful hints on how
to use the library is available in the `examples/` directory.
Editline is maintained collaboratively at [GitHub][].
API
---
Here is the interface to editline. It has a small compatibility layer
to [FSF readline][], which may not be entirely up-to-date.
```C
/* Editline specific global variables. */
int el_no_echo; /* Do not echo input characters */
int el_no_hist; /* Disable auto-save of and access to history,
* e.g. for password prompts or wizards */
int el_hist_size; /* Size of history scrollback buffer, default: 15 */
/* Editline specific functions. */
char * el_find_word(void);
void el_print_columns(int ac, char **av);
el_status_t el_ring_bell(void);
el_status_t el_del_char(void);
/* Callback function for key binding */
typedef el_status_t el_keymap_func_t(void);
/* Bind key to a callback, use CTL('f') to change Ctrl-F, for example */
el_status_t el_bind_key(int key, el_keymap_func_t function);
el_status_t el_bind_key_in_metamap(int key, el_keymap_func_t function);
/* For compatibility with FSF readline. */
int rl_point;
int rl_mark;
int rl_end;
int rl_inhibit_complete;
char *rl_line_buffer;
const char *rl_readline_name;
void rl_initialize(void);
void rl_reset_terminal(const char *terminal_name);
void rl_save_prompt(void);
void rl_restore_prompt(void);
void rl_set_prompt(const char *prompt);
void rl_clear_message(void);
void rl_forced_update_display(void);
/* Main function to use, saves history by default */
char *readline(const char *prompt);
/* Use to save a read line to history, when el_no_hist is set */
void add_history(const char *line);
/* Load and save editline history from/to a file. */
int read_history(const char *filename);
int write_history(const char *filename);
/* Magic completion API, see examples/cli.c for more info */
rl_complete_func_t *rl_set_complete_func(rl_complete_func_t *func);
rl_list_possib_func_t *rl_set_list_possib_func(rl_list_possib_func_t *func);
```
> **Note:** Windows is not a supported target for editline.
Example
-------
Here is a very brief example to illustrate how one can use Editline to
create a simple CLI. More examples are availble in the source tree.
Below is a very brief example to illustrate how one can use Editline to
create a simple CLI, Ctrl-D exits the program. A slightly more advanced
example is Jush, <https://github.com/troglobit/jush/>, a small and very
simplistic UNIX shell. The Editline sources also include an `examples/`
sub-directory.
1. Build and install the library, preferably using a [release tarball][]
The configure script defaults to a `/usr/local` prefix.
tar xf editline-1.15.3.tar.xz
cd editline-1.15.3/
./configure --prefix=/usr
make all
sudo make install
2. Place the below source code in a separate project directory,
e.g. `~/src/example.c`
```C
#include <stdio.h>
#include <stdlib.h>
#include <editline.h>
extern char *readline(char *prompt);
int main (void)
int main(void)
{
char *p;
@ -118,67 +75,202 @@ create a simple CLI. More examples are availble in the source tree.
}
```
3. Compile the example:
cd ~/src/
make LDLIBS=-leditline example
Here I use `make` and rely on its implicit (built-in) rules to handle
all the compiler magic, but you may want to create your own Makefile for
the project. In particular if you don't change the default prefix
(above), because then you need to specify the search path for the
include file(s) and the library manually.
A simple `~/src/Makefile` could look like this:
CFLAGS = -I/usr/local/include
LDFLAGS = -L/usr/local/lib
LDLIBS = -leditline
EXEC = example
OBJS = example.o
all: $(EXEC)
$(EXEC): $(OBJS)
clean:
$(RM) $(OBJS) $(EXEC)
distclean: clean
$(RM) *.o *~ *.bak
Then simply type `make` from your `~/src/` directory. You can also use
`pkg-config` for your `~/src/Makefile`, replace the following lines:
CFLAGS = $(shell pkg-config --cflags libeditline)
LDFLAGS = $(shell pkg-config --libs-only-L libeditline)
LDLIBS = $(shell pkg-config --libs-only-l libeditline)
Then simply type <kbd>make</kbd>, like above.
However, most `.rpm` based distributions `pkg-config` doesn't search in
`/usr/local` anymore, so you need to call make like this:
PKG_CONFIG_LIBDIR=/usr/local/lib/pkgconfig make
Debian/Ubuntu based systems do not have this problem.
API
---
Here is the libeditline interfaces. It has a small compatibility layer
to [FSF readline][], which may not be entirely up-to-date.
```C
/* Editline specific global variables. */
int el_no_echo; /* Do not echo input characters */
int el_no_hist; /* Disable auto-save of and access to history,
* e.g. for password prompts or wizards */
int el_hist_size; /* Size of history scrollback buffer, default: 15 */
/* Editline specific functions. */
char * el_find_word (void);
void el_print_columns (int ac, char **av);
el_status_t el_ring_bell (void);
el_status_t el_del_char (void);
/* Callback function for key binding */
typedef el_status_t el_keymap_func_t(void);
/* Bind key to a callback, use CTL('f') to change Ctrl-F, for example */
el_status_t el_bind_key (int key, el_keymap_func_t function);
el_status_t el_bind_key_in_metamap (int key, el_keymap_func_t function);
/* For compatibility with FSF readline. */
int rl_point;
int rl_mark;
int rl_end;
int rl_inhibit_complete;
char *rl_line_buffer;
const char *rl_readline_name;
void (*rl_deprep_term_function)(void);
void rl_deprep_terminal (void);
void rl_reset_terminal (const char *terminal_name);
void rl_initialize (void);
void rl_uninitialize (void); /* Free all internal memory */
void rl_save_prompt (void);
void rl_restore_prompt (void);
void rl_set_prompt (const char *prompt);
void rl_clear_message (void);
void rl_forced_update_display (void);
/* Main function to use, saves history by default */
char *readline (const char *prompt);
/* Use to save a read line to history, when el_no_hist is set */
void add_history (const char *line);
/* Load and save editline history from/to a file. */
int read_history (const char *filename);
int write_history (const char *filename);
/* Magic completion API, see examples/cli.c for more info */
rl_complete_func_t *rl_set_complete_func (rl_complete_func_t *func);
rl_list_possib_func_t *rl_set_list_possib_func (rl_list_possib_func_t *func);
/* Alternate interface to plain readline(), for event loops */
void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler);
void rl_callback_read_char (void);
void rl_callback_handler_remove (void);
```
Build & Install
---------------
Editline was originally designed for older UNIX systems and Plan 9. The
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
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>
The `$DESTDIR` environment variable is honored at install. See
<kbd>./configure --help</kbd> for more options.
The `$DESTDIR` environment variable is honored at install. For more
options, see <kbd>./configure --help</kbd>
Remember to run `ldconfig` after install to update the linker cache. If
you've installed to a non-standard location (`--prefix`) you may also
have to update your `/etc/ld.so.conf`, or use `pkg-confg` to build your
application (above).
**NOTE:** RedHat/Fedora/CentOS and other `.rpm`-based distributions do
not consider `/usr/local` as standard path anymore. So make sure to
`./configure --prefix=/usr`, otherwise the build system use the GNU
default, which is `/usr/local`. The Debian based distributions, like
Ubuntu, do not have this problem.
Origin & References
--------------------
This [line editing][] library was created by Simmule Turner and Rich Salz
in in 1992. It is distributed under a “C News-like” license, similar to
the [BSD license][]. For details, see the file [LICENSE][].
This [line editing][] library was created by [Rich Salz][] and Simmule
Turner and in 1992. It is distributed with a “[C News][]-like” license,
similar to the [BSD license][]. Rich's current version is however under
the Apache license. For details on the licensing terms of this version
of the software, see [License][].
This version of the editline library is forked from the [Minix 3][] source
tree. Patches and bug fixes from the following forks, all based on the
original comp.sources.unix posting, have been merged:
This version of the editline library was forked from the [Minix 2][]
source tree and is *not* related to the similarily named NetBSD version
that [Jess Thrysøe][jess] disitributes to the world outside *BSD. The
libraries have much in common, but the latter is heavily refactored and
also relies on libtermcap (usually supplied by ncurses), whereas this
library only uses termios from the standard C library.
Patches and bug fixes from the following forks, based on the original
[comp.sources.unix][] posting, have been merged:
* Debian [libeditline][]
* [Heimdal][]
* [Festival][] speech-tools
* [Steve Tell][]'s editline patches
The version numbering scheme today follows that of the Debian version,
which can be seen in the [ChangeLog.md][]. The Debian version was
unknown to the current [maintainer][] for quite some time, so a
different name and different versioning scheme was used. In June 2009
this was changed to line up alongside Debian, with the intent is to
eventually merge the efforts.
The version numbering scheme today follows that of the Debian version,
details available in the [ChangeLog.md][]. The current [maintainer][]
was unaware of the Debian version for quite some time, so a different
name and versioning scheme was used. In June 2009 this was changed to
line up alongside Debian, with the intent is to eventually merge the
efforts.
Outstanding issues are listed in the [TODO.md][] file.
[GitHub]: https://github.com/troglobit/editline
[line editing]: https://github.com/troglobit/editline/blob/master/doc/README
[line editing]: https://github.com/troglobit/editline/blob/master/docs/README
[release tarball]: https://github.com/troglobit/editline/releases
[maintainer]: http://troglobit.com
[LICENSE]: https://github.com/troglobit/editline/blob/master/LICENSE
[TODO.md]: https://github.com/troglobit/editline/blob/master/TODO.md
[C News]: https://en.wikipedia.org/wiki/C_News
[TODO.md]: https://github.com/troglobit/editline/blob/master/docs/TODO.md
[ChangeLog.md]: https://github.com/troglobit/editline/blob/master/ChangeLog.md
[FSF readline]: http://www.gnu.org/software/readline/
[Minix 3]: http://www.minix3.org/
[Rich Salz]: https://github.com/richsalz/editline/
[comp.sources.unix]: http://ftp.cs.toronto.edu/pub/white/pub/rc/editline.shar
[Minix 2]: http://www.cise.ufl.edu/~cop4600/cgi-bin/lxr/http/source.cgi/lib/editline/
[jess]: http://thrysoee.dk/editline/
[BSD license]: http://en.wikipedia.org/wiki/BSD_licenses
[libeditline]: http://packages.qa.debian.org/e/editline.html
[Heimdal]: http://www.h5l.org
[Festival]: http://festvox.org/festival/
[Steve Tell]: http://www.cs.unc.edu/~tell/dist.html
[License]: https://github.com/troglobit/editline/blob/master/LICENSE
[License Badge]: https://img.shields.io/badge/License-C%20News-orange.svg
[Travis]: https://travis-ci.org/troglobit/editline
[Travis Status]: https://travis-ci.org/troglobit/editline.png?branch=master
[Coverity Scan]: https://scan.coverity.com/projects/2982
[Coverity Status]: https://scan.coverity.com/projects/2982/badge.svg
<!--
-- Local Variables:
-- mode: markdown
-- End:
-->

1
TODO
View File

@ -1 +0,0 @@
TODO.md

View File

@ -1,7 +1,3 @@
#!/bin/sh
# Use v1.11 for backwards compat with Ubuntu 12.04 LTS
export ACLOCAL=aclocal-1.11
export AUTOMAKE=automake-1.11
autoreconf -W portability -visfm

View File

@ -1,26 +1,12 @@
# Minix libeditline -*- Autoconf -*-
#
# Copyright (c) 2008-2013 Joachim Nilsson <troglobit()gmail!com>
#
# Process this file with autoconf to produce a configure script.
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
AC_PREREQ(2.61)
AC_INIT(editline, 1.15.0, https://github.com/troglobit/editline/issues)
AM_INIT_AUTOMAKE([no-dist-gzip dist-xz])
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])
AM_SILENT_RULES([yes])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR([src/editline.c])
AC_CONFIG_HEADER([config.h])
AC_CONFIG_FILES([Makefile src/Makefile include/Makefile man/Makefile examples/Makefile])
AC_CONFIG_FILES([Makefile libeditline.pc src/Makefile include/Makefile man/Makefile examples/Makefile])
# Checks for programs.
AC_PROG_CC
@ -35,7 +21,7 @@ AC_HEADER_STAT
AC_HEADER_STDC
# Check for malloc.h instead of AC_FUNC_MALLOC/REALLOC AIX and others
# mess up the traditional malloc check.
AC_CHECK_HEADERS([malloc.h signal.h stdlib.h string.h termcap.h termio.h termios.h sgtty.h])
AC_CHECK_HEADERS([malloc.h signal.h stdlib.h string.h termcap.h termio.h termios.h sgtty.h unistd.h])
# In termios.h or in sys/ioctl.g?
AC_HEADER_TIOCGWINSZ
@ -50,40 +36,71 @@ AC_PROG_GCC_TRADITIONAL
AC_FUNC_STAT
AC_CHECK_FUNCS([strchr strdup strrchr tcgetattr perror])
#
# Available features
#
AC_ARG_ENABLE(unique-history,
[AS_HELP_STRING([--disable-unique-history],
[Disable uniqify of scrollback. Default: duplicate entries are ignored. Use this to save dupes.])],
, AC_DEFINE(CONFIG_UNIQUE_HISTORY, 1, [Define to skip duplicate lines in the scrollback history.]))
AC_ARG_ENABLE(default-complete,
[AS_HELP_STRING([--disable-default-complete], [Disable default (filename) completion handler.])],
, AC_DEFINE(CONFIG_DEFAULT_COMPLETE, 1, [Define to enable the default completion handler.]))
[Disable uniqify of scrollback. Default: duplicate entries are ignored. Use this to save dupes.])])
AC_ARG_ENABLE(arrow-keys,
[AS_HELP_STRING([--disable-arrow-keys], [Disable ANSI arrow keys.])],
, AC_DEFINE(CONFIG_ANSI_ARROWS, 1, [Define to include ANSI arrow keys support.]))
[AS_HELP_STRING([--disable-arrow-keys], [Disable ANSI arrow keys.])])
AC_ARG_ENABLE(eof,
[AS_HELP_STRING([--disable-eof], [Disable default EOF (Ctrl-D) behavior.])],
, AC_DEFINE([CONFIG_EOF], 1, [Define to enable EOF (Ctrl-C) key.]))
[AS_HELP_STRING([--disable-eof], [Disable default EOF (Ctrl-D) behavior.])])
AC_ARG_ENABLE(sigint,
[AS_HELP_STRING([--disable-sigint], [Disable default SIGINT (Ctrl-C) behavior.])],
, AC_DEFINE([CONFIG_SIGINT], 1, [Define to enable SIGINT (Ctrl-C) key.]))
[AS_HELP_STRING([--disable-sigint], [Disable default SIGINT (Ctrl-C) behavior.])])
AC_ARG_ENABLE(sigstop,
[AS_HELP_STRING([--enable-sigstop], [Enable SIGSTOP (Ctrl-Z) behavior.])],
AC_DEFINE([CONFIG_SIGSTOP], 1, [Define to enable SIGSTOP (Ctrl-Z) key.]))
[AS_HELP_STRING([--enable-sigstop], [Enable SIGSTOP (Ctrl-Z) behavior.])])
AC_ARG_ENABLE(terminal-bell,
[AS_HELP_STRING([--enable-terminal-bell], [Enable terminal bell on completion.])],
AC_DEFINE([CONFIG_TERMINAL_BELL], 1, [Define to enable terminal bell on completion.]))
[AS_HELP_STRING([--enable-terminal-bell], [Enable terminal bell on completion.])])
AC_ARG_ENABLE(termcap,
[AS_HELP_STRING([--enable-termcap], [Use termcap library to query terminal size.])],
AC_DEFINE([CONFIG_USE_TERMCAP], 1, [Define to use the termcap library for terminal size.]))
AS_HELP_STRING([--enable-termcap], [Use termcap library to query terminal size.]))
AM_CFLAGS="-std=gnu99 $inline_cflags -W -Wall -Wundef -Wunused -Wstrict-prototypes -Werror-implicit-function-declaration $nopointersign_cflags -Wshadow -Wcast-qual"
AC_SUBST(AM_CFLAGS)
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_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_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_terminal_bell" = "xyes"], [
AC_DEFINE(CONFIG_TERMINAL_BELL, 1, [Define to enable terminal bell on completion.])])
AM_CONDITIONAL([ENABLE_EXAMPLES], [test "$enable_examples" = yes])
# Check for a termcap compatible library if enabled
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, , [
AC_CHECK_LIB(tinfo, tgetent, , [
AC_CHECK_LIB(curses, tgetent, , [
AC_CHECK_LIB(ncurses, tgetent, , [
AC_MSG_ERROR([Cannot find a termcap capable library, try installing Ncurses.])])
])
])
])
])])
# Generate all files
AC_OUTPUT

10
debian/.gitignore vendored Normal file
View File

@ -0,0 +1,10 @@
*.log
*.debhelper
*.substvars
autoreconf.*
debhelper-build-stamp
files
tmp/*
libeditline-dev/*
libeditline0/*
libeditline1/*

59
debian/changelog vendored
View File

@ -1,3 +1,62 @@
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
* Handle internal realloc() errors better
* Fix return value from read_history() and write_history()
* Fix potential NULL pointer dereference in key binging lookup
-- Joachim Nilsson <troglobit@gmail.com> Sun, 05 Jan 2020 09:47:34 +0100
editline (1.16.1) unstable; urgency=medium
* Minor bug fix and documentation update release.
* Add missing pkg-config .pc file to -dev package
-- Joachim Nilsson <troglobit@gmail.com> Fri, 07 Jun 2019 11:45:50 +0200
editline (1.16.0) unstable; urgency=medium
* New upstream release, v1.60.0
+ Event loop support
+ New GNU Readline compat functions and callbacks
+ Minor compat fixes for movement and deletion
* Bump .so/ABI version => libeditline1
* New maintainer, upstream author
-- Joachim Nilsson <troglobit@gmail.com> Sun, 16 Sep 2018 09:45:53 +0200
editline (1.15.3-1) unstable; urgency=medium
* New upstream bug fix release, v1.15.3
-- Joachim Nilsson <troglobit@gmail.com> Thu, 07 Sep 2017 01:24:19 +0200
editline (1.15.2-1) unstable; urgency=medium
* New upstream bug fix release, v1.15.2
-- Joachim Nilsson <troglobit@gmail.com> Wed, 06 Jun 2016 20:04:35 +0200
editline (1.15.1-1) unstable; urgency=medium
* New upstream bug fix release, v1.15.1
-- Joachim Nilsson <troglobit@gmail.com> Wed, 16 Nov 2015 21:17:17 +0200
editline (1.15.0-1) unstable; urgency=medium
* New upstream release, v1.15.0
-- Joachim Nilsson <troglobit@gmail.com> Wed, 10 Sep 2015 13:26:03 +0200
editline (1.14.2-1) unstable; urgency=low
* Minor bugfix release:

2
debian/compat vendored
View File

@ -1 +1 @@
5
10

10
debian/control vendored
View File

@ -1,14 +1,14 @@
Source: editline
Section: devel
Priority: optional
Build-Depends: debhelper (>= 5.0), libtool
Maintainer: Sam Hocevar <sho@debian.org>
Standards-Version: 3.8.3
Build-Depends: debhelper (>= 10), libtool
Maintainer: Joachim Wiberg <troglobit@gmail.com>
Standards-Version: 4.3.0
Package: libeditline-dev
Architecture: any
Section: libdevel
Depends: libeditline0 (= ${binary:Version}), ${misc:Depends}
Depends: libeditline1 (= ${binary:Version}), ${misc:Depends}
Description: development files for libeditline
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
@ -18,7 +18,7 @@ Description: development files for libeditline
This package contains the developer files: static libraries, headers,
manpages.
Package: libeditline0
Package: libeditline1
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, ${misc:Depends}

25
debian/copyright vendored
View File

@ -1,17 +1,23 @@
This package was debianized by Jim Studt <jim@federated.com> on
Fri, 5 May 2000 13:25:51 -0500.
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>
It was received from Rich Salz rsalz@shore.net
Files: *
Copyright: 1992,1993 Simmule Turner and Rich Salz.
License: C-News
Upstream Author: Rich Salz rsalz@shore.net
Copyright:
Copyright 1992,1993 Simmule Turner and Rich Salz. All rights reserved.
Files: debian/*
Copyright: 2010-2020 Joachim Wiberg <troglobit@gmail.com>
License: BSD-2-clause
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:
@ -24,4 +30,3 @@ Copyright:
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.

2
debian/docs vendored
View File

@ -1 +1 @@
README
README.md

View File

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

View File

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

1
debian/libeditline1.install vendored Normal file
View File

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

67
debian/libeditline1.symbols vendored Normal file
View File

@ -0,0 +1,67 @@
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

65
debian/rules vendored
View File

@ -1,59 +1,16 @@
#!/usr/bin/make -f
# debian/rules for libeditline
# GNU copyright 1997 to 1999 by Joey Hess.
#!/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
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
# shared library versions, option 1
version=0.0.0
major=0
include /usr/share/dpkg/default.mk # provides DEB_VERSION
configure: configure-stamp
configure-stamp:
dh_testdir
dh_auto_configure
touch configure-stamp
%:
dh $@ --with autoreconf
build: build-stamp
build-stamp:
dh_testdir
dh_auto_configure
dh_auto_build
touch $@
override_dh_installchangelogs:
dh_installchangelogs ChangeLog.md
clean:
dh_testdir
dh_auto_clean
dh_clean
@rm -f build-stamp configure-stamp
install: build
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
dh_auto_install
binary-indep: install
# build libeditline${major} package by moving files from editline-dev
binary-arch: install
dh_testdir
dh_testroot
dh_auto_install
dh_install --sourcedir=debian/tmp
dh_installdocs
dh_installchangelogs
dh_strip
dh_compress
dh_fixperms
dh_makeshlibs
dh_installdeb
dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install

1
debian/source/format vendored Normal file
View File

@ -0,0 +1 @@
3.0 (native)

106
docs/HACKING.md Normal file
View File

@ -0,0 +1,106 @@
Maintenance and Release Checklist
=================================
Maintenance
-----------
* Encourage contributors to write tests, in particular for new features
* Run tests regularly, use Travis-CI to do this automatically
* Leverage GitHub issues for milestone planning
* Reference issues from GitHub pull requests to alert issue subscribers
* Bump library ABI version just before release!
Release Checklist
-----------------
* Update ChangeLog, follow http://keepachangelog.com/ loosely
- Inform users in a plain language of changes and bug fixes
- Do *not* copy-paste GIT commit logs!
- Order entries according to importance, most relevant first
* Run unit tests: `make check`
* Make at least one `-rcN` release and test it in an actual real project
* **REMEMBER:** bump ABI version according to below rules
* Tag
* Push last commit(s) *and* tags to GitHub
* Make release
make distclean
./autogen.sh
./configure
make release
* Create new release in GitHub releases page
* Copy and paste ChangeLog entry, check any stale links!
* Upload release tarball and MD5 files
Library Versioning
------------------
Editline relies on GNU Libtool for building the library. For a user of
the library it is important to maintain a clear ABI versioning scheme.
This is not the same as the Editline version, but rather the library
"compatibility level".
The Editline ABI version is specified in `src/Makefile.am` and looks
like this:
libeditline_la_LDFLAGS = -version-info 0:0:0
\ \ `-- age
\ `--- revision
`---- current
It must be updated according to the [GNU Libtool recommendations][1]:
1. Start with version information of `0:0:0` for each libtool library.
2. Update the version information only immediately before a public
release of your software. More frequent updates are unnecessary, and
only guarantee that the current interface number gets larger faster.
3. If the library *source code has changed at all* since the last update,
then increment revision (`c:r:a` becomes `c:r+1:a`).
4. If any *interfaces have been added, removed, or changed* since the
last update, increment current, and set revision to 0.
5. If any *interfaces have been added* since the last public release,
then increment age.
6. If any *interfaces have been removed or changed* since the last
public release, then set age to 0.
The libtool ABI versioning logic is very confusing but works if you just
disable your brain and follow the rules, one by one.
**Example #1:** a new function has been added, none of the existing ones
have changed. The initial version is 1:0:0, we follow the rules above to
the letter: increase revision, increase current and set revision to zero,
and finally increase age. This, rather confusingly, gives us 2:0:1 which
libtool then translates to `libeditline.so.1.1.0`.
**Example #2:** some existing functions are changed, they now return an
`int` instead of `void`. The initial version is 0:0:0, and we follow the
rules again: increment revision, increment current and set revision to
zero, set age to zero. This gives us 1:0:0, which is then translated to
`libeditline.so.1.0.0`.
### Note
Usually, non-developers have no interest in running development versions
(releases are frequent enough), and developers are expected to know how
to juggle versions. In such an ideal world, it is good enough to bump
the library version just prior to a release, point 2.
However, if releases are few and far between, distributors may start to
use snapshots. When a distributor uses a snapshot, the distributor has
to handle the library version manually. Things can get ugly when the
distributor has released an intermediate version with a bumped library
version, and when the official release is bumped to that version, the
distributor will then have to bump the library version for the official
release, and it can be confusing if someone reports bugs on versions
that you didn't even know existed.
The problem with bumping the version with every change is that if your
interface is not finished, the version number might run away, and it
looks pretty bad if a library is at version 262. It kind of tells the
user that the library interface is volatile, which is not good for
business.
[1]: https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html

View File

@ -1,21 +1,11 @@
TODO
====
Issues in need of work. Mostly compatibility with GNU readline, BSD
[libedit], and usability improvements.
Issues in need of work. Mostly compatibility with GNU readline,
BSD [libedit][], and usability improvements.
Remember, the general idea is to keep this library editline small with
no external dependencies, except a C library.
Verify custom completion handlers
---------------------------------
Verify for v1.14.0 that custom completion handlers still work After
reverting a "fix" in v0.2.2 that made `rl_complete()` a function pointer
we need to make sure the same functionality is still available with the
new infrastructure. Which is more inspired by BSD libedit and GNU
readline.
Remember, the general idea is to keep this library small with no
external dependencies, except for a generic C library.
Check what's needed to run the fileman example
@ -46,4 +36,6 @@ Other minor TODO's
http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
[gnu]: http://www.delorie.com/gnu/docs/readline/rlman_41.html#IDX288
[libuEv]: https://github.com/troglobit/libuev/
[libedit]: http://www.thrysoee.dk/editline/

5
examples/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
*.o
cli
testit
excallback
fileman

View File

@ -1,6 +1,5 @@
AUTOMAKE_OPTIONS = foreign
noinst_PROGRAMS = testit cli
LDADD = $(top_builddir)/src/libeditline.la $(TERMLIBS)
noinst_PROGRAMS = testit cli excallback fileman
LDADD = $(top_builddir)/src/libeditline.la
AM_CPPFLAGS = -DEDITLINE_LIBRARY
AM_CFLAGS = -I$(top_srcdir)/src -I$(top_srcdir)/include
AM_LDFLAGS = -static

View File

@ -25,59 +25,58 @@
#define HISTORY "/tmp/.cli-history"
static char *list[] = {
"foo ", "bar ", "bsd ", "cli ", "ls ", "cd ", "malloc ", "tee ", NULL
"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. */
static char *my_rl_complete(char *token, int *match)
{
int i;
int index = -1;
int matchlen = 0;
int count = 0;
int i;
int index = -1;
int matchlen = 0;
int count = 0;
for (i = 0; list[i]; i++)
{
int partlen = strlen (token); /* Part of token */
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 (!strncmp(list[i], token, partlen)) {
index = i;
matchlen = partlen;
count ++;
}
}
if (count == 1)
{
*match = 1;
return strdup (list[index] + matchlen);
}
if (count == 1) {
*match = 1;
return strdup(list[index] + matchlen);
}
return NULL;
return NULL;
}
/* Return all possible completions. */
static 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;
int i, num, total = 0;
char **copy;
return total;
for (num = 0; list[num]; num++)
;
if (!num)
return 0;
copy = 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;
}
el_status_t list_possible(void)
@ -102,44 +101,80 @@ el_status_t list_possible(void)
return el_ring_bell();
}
el_status_t do_break(void)
{
puts("Breakout!");
return CSeof;
}
el_status_t do_exit(void)
{
puts("Bye bye!");
return CSeof;
}
el_status_t do_suspend(void)
{
puts("Abort!");
return CSstay;
puts("Abort!");
return CSstay;
}
int main(int ac __attribute__ ((unused)), char *av[] __attribute__ ((unused)))
static void breakit(int signo)
{
char *line;
char *prompt = "cli> ";
/* Setup callbacks */
rl_set_complete_func(&my_rl_complete);
rl_set_list_possib_func(&my_rl_list_possib);
el_bind_key('?', list_possible);
el_bind_key(CTL('C'), do_break);
el_bind_key(CTL('D'), do_exit);
el_bind_key(CTL('Z'), do_suspend);
read_history(HISTORY);
while ((line = readline(prompt)) != NULL) {
printf("\t\t\t|%s|\n", line);
free(line);
}
write_history(HISTORY);
return 0;
(void)signo;
puts("Got SIGINT");
}
/* Use el_no_echo when reading passwords and similar */
static int unlock(const char *passwd)
{
char *prompt = "Enter password: ";
char *line;
int rc = 1;
el_no_echo = 1;
while ((line = readline(prompt))) {
rc = strncmp(line, passwd, strlen(passwd));
free(line);
if (rc) {
printf("\nWrong password, please try again, it's secret.\n");
continue;
}
printf("\nAchievement unlocked!\n");
break;
}
el_no_echo = 0;
return rc;
}
int main(void)
{
char *line;
char *prompt = "cli> ";
signal(SIGINT, breakit);
/* Setup callbacks */
rl_set_complete_func(&my_rl_complete);
rl_set_list_possib_func(&my_rl_list_possib);
el_bind_key('?', list_possible);
el_bind_key(CTL('Z'), do_suspend);
read_history(HISTORY);
while ((line = readline(prompt))) {
if (!strncmp(line, "unlock", 6) && unlock("secret")) {
free(line);
fprintf(stderr, "\nSecurity breach, user logged out!\n");
break;
}
if (*line != '\0')
printf("\t\t\t|%s|\n", line);
free(line);
}
write_history(HISTORY);
return 0;
}
/**
* Local Variables:
* c-file-style: "k&r"
* c-basic-offset: 4
* End:
*/

196
examples/excallback.c Normal file
View File

@ -0,0 +1,196 @@
/*
From: Jeff Solomon <jsolomon@stanford.edu>
Date: Fri, 9 Apr 1999 10:13:27 -0700 (PDT)
To: chet@po.cwru.edu
Subject: new readline example
Message-ID: <14094.12094.527305.199695@mrclean.Stanford.EDU>
Chet,
I've been using readline 4.0. Specifically, I've been using the perl
version Term::ReadLine::Gnu. It works great.
Anyway, I've been playing around the alternate interface and I wanted
to contribute a little C program, callback.c, to you that you could
use as an example of the alternate interface in the /examples
directory of the readline distribution.
My example shows how, using the alternate interface, you can
interactively change the prompt (which is very nice imo). Also, I
point out that you must roll your own terminal setting when using the
alternate interface because readline depreps (using your parlance) the
terminal while in the user callback. I try to demostrate what I mean
with an example. I've included the program below.
To compile, I just put the program in the examples directory and made
the appropriate changes to the EXECUTABLES and OBJECTS line and added
an additional target 'callback'.
I compiled on my Sun Solaris2.6 box using Sun's cc.
Let me know what you think.
Jeff
*/
#if defined (HAVE_CONFIG_H)
#include <config.h>
#endif
#include <stdio.h>
#include <sys/types.h>
#include <sys/select.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <termios.h> /* xxx - should make this more general */
#ifdef EDITLINE_LIBRARY
# include "editline.h"
#else
# include <readline/readline.h>
#endif
/* This little examples demonstrates the alternate interface to using readline.
* In the alternate interface, the user maintains control over program flow and
* only calls readline when STDIN is readable. Using the alternate interface,
* you can do anything else while still using readline (like talking to a
* network or another program) without blocking.
*
* Specifically, this program highlights two importants features of the
* alternate interface. The first is the ability to interactively change the
* prompt, which can't be done using the regular interface since rl_prompt is
* read-only.
*
* The second feature really highlights a subtle point when using the alternate
* interface. That is, readline will not alter the terminal when inside your
* callback handler. So let's so, your callback executes a user command that
* takes a non-trivial amount of time to complete (seconds). While your
* executing the command, the user continues to type keystrokes and expects them
* to be re-echoed on the new prompt when it returns. Unfortunately, the default
* terminal configuration doesn't do this. After the prompt returns, the user
* must hit one additional keystroke and then will see all of his previous
* keystrokes. To illustrate this, compile and run this program. Type "sleep" at
* the prompt and then type "bar" before the prompt returns (you have 3
* seconds). Notice how "bar" is re-echoed on the prompt after the prompt
* returns? This is what you expect to happen. Now comment out the 4 lines below
* the line that says COMMENT LINE BELOW. Recompile and rerun the program and do
* the same thing. When the prompt returns, you should not see "bar". Now type
* "f", see how "barf" magically appears? This behavior is un-expected and not
* desired.
*/
void process_line(char *line);
int change_prompt(void);
char *get_prompt(void);
int prompt = 1;
char prompt_buf[40], line_buf[256];
tcflag_t old_lflag;
cc_t old_vtime;
struct termios term;
int
main()
{
fd_set fds;
/* Adjust the terminal slightly before the handler is installed. Disable
* canonical mode processing and set the input character time flag to be
* non-blocking.
*/
if( tcgetattr(STDIN_FILENO, &term) < 0 ) {
perror("tcgetattr");
exit(1);
}
old_lflag = term.c_lflag;
old_vtime = term.c_cc[VTIME];
term.c_lflag &= ~ICANON;
term.c_cc[VTIME] = 1;
/* COMMENT LINE BELOW - see above */
if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) {
perror("tcsetattr");
exit(1);
}
// rl_add_defun("change-prompt", change_prompt, CTRL('t'));
rl_callback_handler_install(get_prompt(), process_line);
while(1) {
FD_ZERO(&fds);
FD_SET(fileno(stdin), &fds);
if( select(FD_SETSIZE, &fds, NULL, NULL, NULL) < 0) {
perror("select");
exit(1);
}
if( FD_ISSET(fileno(stdin), &fds) ) {
rl_callback_read_char();
}
}
return 0;
}
void
process_line(char *line)
{
if( line == NULL ) {
fprintf(stderr, "\n");
/* reset the old terminal setting before exiting */
term.c_lflag = old_lflag;
term.c_cc[VTIME] = old_vtime;
if( tcsetattr(STDIN_FILENO, TCSANOW, &term) < 0 ) {
perror("tcsetattr");
exit(1);
}
exit(0);
}
if( strcmp(line, "sleep") == 0 ) {
sleep(3);
} else {
fprintf(stderr, "|%s|\n", line);
}
free (line);
}
int
change_prompt(void)
{
/* toggle the prompt variable */
prompt = !prompt;
/* save away the current contents of the line */
strncpy(line_buf, rl_line_buffer, sizeof(line_buf));
line_buf[sizeof(line_buf) - 1] = 0;
/* install a new handler which will change the prompt and erase the current line */
rl_callback_handler_install(get_prompt(), process_line);
/* insert the old text on the new line */
rl_insert_text(line_buf);
/* redraw the current line - this is an undocumented function. It invokes the
* redraw-current-line command.
*/
return rl_refresh_line(0, 0);
}
char *
get_prompt(void)
{
/* The prompts can even be different lengths! */
sprintf(prompt_buf, "%s",
prompt ? "Hit ctrl-t to toggle prompt> " : "Pretty cool huh?> ");
return prompt_buf;
}

482
examples/fileman.c Normal file
View File

@ -0,0 +1,482 @@
/* fileman.c -- A tiny application which demonstrates how to use the
GNU Readline library. This application interactively allows users
to manipulate files and their modes.
NOTE: this was taken from the GNU Readline documentation and ported
to libedit. A command to output the history list was added.
*/
#include <assert.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <locale.h>
#include <time.h>
#include "editline.h"
void too_dangerous(char *caller);
void initialize_readline(const char *prompt);
int execute_line(char *line);
int valid_argument(char *caller, char *arg);
/* The names of functions that actually do the manipulation. */
int com_list(char *);
int com_view(char *);
int com_history(char *);
int com_rename(char *);
int com_stat(char *);
int com_pwd(char *);
int com_delete(char *);
int com_help(char *);
int com_cd(char *);
int com_quit(char *);
struct cmd {
char *name; /* User printable name of the function. */
int (*func)(char *); /* Function to call to do the job. */
char *doc; /* Documentation for this function. */
};
struct cmd commands[] = {
{ "cd", com_cd, "Change to directory DIR"},
{ "delete", com_delete, "Delete FILE"},
{ "help", com_help, "Display this text"},
{ "?", com_help, "Synonym for `help'"},
{ "list", com_list, "List files in DIR"},
{ "ls", com_list, "Synonym for `list'"},
{ "pwd", com_pwd, "Print the current working directory"},
{ "quit", com_quit, "Quit using Fileman"},
{ "rename", com_rename, "Rename FILE to NEWNAME"},
{ "stat", com_stat, "Print out statistics on FILE"},
{ "view", com_view, "View the contents of FILE"},
{ "history", com_history, "List editline history"},
{ NULL, NULL, NULL },
};
/* 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;
/* When non-zero, this means the user is done using this program. */
int done;
int main(int argc, char **argv)
{
char *line, *s;
setlocale(LC_CTYPE, "");
initialize_readline("(FileMan)");
/* Loop reading and executing lines until the user quits. */
for (; done == 0;) {
line = readline(NULL);
if (!line)
break;
/* Remove leading and trailing whitespace from the line.
Then, if there is anything left, add it to the history list
and execute it. */
s = stripwhite(line);
#if 0
if (*s) {
char *expansion;
int result;
result = history_expand(s, &expansion);
if (result < 0 || result == 2) {
fprintf(stderr, "%s\n", expansion);
} else {
add_history(expansion);
execute_line(expansion);
}
free(expansion);
}
#else
execute_line(s);
#endif
free(line);
}
puts("");
write_history(fileman_history);
free(fileman_history);
return 0;
}
/* Execute a command line. */
int execute_line(char *line)
{
int i;
struct cmd *command;
char *word;
/* Isolate the command word. */
i = 0;
while (line[i] && isspace(line[i]))
i++;
word = line + i;
while (line[i] && !isspace(line[i]))
i++;
if (line[i])
line[i++] = '\0';
command = find_command(word);
if (!command) {
fprintf(stderr, "%s: No such command for FileMan.\n", word);
return -1;
}
/* Get argument to command, if any. */
while (isspace(line[i]))
i++;
word = line + i;
/* Call the function. */
return command->func(word);
}
/* Look up NAME as the name of a command, and return a pointer to that
command. Return a NULL pointer if NAME isn't a command name. */
struct cmd *find_command(char *name)
{
int i;
for (i = 0; commands[i].name; i++)
if (strcmp(name, commands[i].name) == 0)
return &commands[i];
return NULL;
}
/*
* Strip whitespace from the start and end of STRING. Return a pointer
* into STRING.
*/
char *stripwhite(char *string)
{
char *s, *t;
for (s = string; isspace(*s); s++) ;
if (*s == 0)
return s;
t = s + strlen(s) - 1;
while (t > s && isspace(*t))
t--;
*++t = '\0';
return s;
}
/* **************************************************************** */
/* */
/* Interface to Readline Completion */
/* */
/* **************************************************************** */
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)
{
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);
}
/*
* Attempt to complete on the contents of TEXT. START and END
* bound the region of rl_line_buffer that contains the word to
* complete. TEXT is the word to complete. We can use the entire
* contents of rl_line_buffer in case we want to do some simple
* parsing. Returnthe array of matches, or NULL if there aren't any.
*/
char **fileman_completion(const char *text, int start, int end)
{
char **matches = NULL;
/* If this word is at the start of the line, then it is a command
to complete. Otherwise it is the name of a file in the current
directory. */
if (start == 0)
matches = rl_completion_matches(text, command_generator);
return matches;
}
/* Generator function for command completion. STATE lets us
know whether to start from scratch; without any state
(i.e. STATE == 0), then we start at the top of the list. */
char *command_generator(const char *text, int state)
{
static int list_index, len;
char *name;
/* If this is a new word to complete, initialize now. This
includes saving the length of TEXT for efficiency, and
initializing the index variable to 0. */
if (!state) {
list_index = 0;
len = strlen(text);
}
/* Return the next name which partially matches from the
command list. */
while ((name = commands[list_index].name)) {
list_index++;
if (strncmp(name, text, len) == 0)
return strdup(name);
}
/* If no names matched, then return NULL. */
return NULL;
}
/* **************************************************************** */
/* */
/* FileMan Commands */
/* */
/* **************************************************************** */
/* String to pass to system (). This is for the LIST, VIEW and RENAME
commands. */
static char syscom[1024];
/* List the file(s) named in arg. */
int com_list(char *arg)
{
if (!arg)
arg = "";
sprintf(syscom, "ls -FClg %s", arg);
return system(syscom);
}
int com_view(char *arg)
{
if (!valid_argument("view", arg))
return 1;
sprintf(syscom, "more %s", arg);
return system(syscom);
}
int com_history(char *arg)
{
const char *he;
/* rewind history */
while (el_prev_hist()) ;
for (he = el_next_hist(); he != NULL; he = el_next_hist())
printf("%s\n", he);
return 0;
}
int com_rename(char *arg)
{
too_dangerous("rename");
return 1;
}
int com_stat(char *arg)
{
struct stat finfo;
if (!valid_argument("stat", arg))
return 1;
if (stat(arg, &finfo) == -1) {
perror(arg);
return 1;
}
printf("Statistics for `%s':\n", arg);
printf("%s has %ld link%s, and is %lld byte%s in length.\n", arg,
(long)finfo.st_nlink,
(finfo.st_nlink == 1) ? "" : "s",
(long long)finfo.st_size, (finfo.st_size == 1) ? "" : "s");
printf("Inode Last Change at: %s", ctime(&finfo.st_ctime));
printf(" Last access at: %s", ctime(&finfo.st_atime));
printf(" Last modified at: %s", ctime(&finfo.st_mtime));
return 0;
}
int com_delete(char *arg)
{
too_dangerous("delete");
return 1;
}
/* Print out help for ARG, or for all of the commands if ARG is
not present. */
int com_help(char *arg)
{
int i;
int printed = 0;
for (i = 0; commands[i].name; i++) {
if (!*arg || (strcmp(arg, commands[i].name) == 0)) {
printf("%s\t\t%s.\n", commands[i].name,
commands[i].doc);
printed++;
}
}
if (!printed) {
printf("No commands match `%s'. Possibilties are:\n", arg);
for (i = 0; commands[i].name; i++) {
/* Print in six columns. */
if (printed == 6) {
printed = 0;
printf("\n");
}
printf("%s\t", commands[i].name);
printed++;
}
if (printed)
printf("\n");
}
return 0;
}
/* Change to the directory ARG. */
int com_cd(char *arg)
{
if (chdir(arg) == -1) {
perror(arg);
return 1;
}
//com_pwd("");
fileman_prompt();
return 0;
}
/* Print out the current working directory. */
int com_pwd(char *ignore)
{
char dir[1024], *s;
s = getcwd(dir, sizeof(dir) - 1);
if (!s) {
printf("Error getting pwd: %s\n", dir);
return 1;
}
printf("Current directory is %s\n", dir);
return 0;
}
/* The user wishes to quit using this program. Just set DONE
non-zero. */
int com_quit(char *arg)
{
done = 1;
return 0;
}
/* Function which tells you that you can't do this. */
void too_dangerous(char *caller)
{
fprintf(stderr, "%s: Too dangerous for me to distribute.\n", caller);
fprintf(stderr, "Write it yourself.\n");
}
/* Return non-zero if ARG is a valid argument for CALLER,
else print an error message and return zero. */
int valid_argument(char *caller, char *arg)
{
if (!arg || !*arg) {
fprintf(stderr, "%s: Argument required.\n", caller);
return 0;
}
return 1;
}
/**
* Local Variables:
* c-file-style: "k&r"
* c-basic-offset: 4
* End:
*/

View File

@ -45,9 +45,11 @@ int main(int argc, char *argv[] __attribute__ ((unused)))
int doit;
char *prompt, *p;
read_history(".testit_history");
doit = argc == 1;
if ((prompt = getenv("TESTPROMPT")) == NULL)
prompt = "testit> ";
prompt = "testit> ";
while ((p = readline(prompt)) != NULL) {
printf("\t\t\t|%s|\n", p);
@ -59,18 +61,18 @@ int main(int argc, char *argv[] __attribute__ ((unused)))
perror(p);
}
}
add_history(p);
free(p);
}
write_history(".testit_history");
rl_uninitialize();
return 0;
}
/**
* Local Variables:
* version-control: t
* indent-tabs-mode: t
* c-file-style: "ellemtel"
* c-file-style: "k&r"
* c-basic-offset: 4
* End:
*/

View File

@ -1,4 +1,2 @@
AUTOMAKE_OPTIONS = foreign
library_includedir=$(includedir)
library_includedir = $(includedir)
library_include_HEADERS = editline.h

View File

@ -1,6 +1,6 @@
/* Minix editline
*
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz. All rights reserved.
/*
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz
* All rights reserved.
*
* This software is not subject to any license of the American Telephone
* and Telegraph Company or of the Regents of the University of California.
@ -18,8 +18,10 @@
* ever read sources, credits must appear in the documentation.
* 4. This notice may not be removed or altered.
*/
#ifndef __EDITLINE_H__
#define __EDITLINE_H__
#ifndef EDITLINE_H_
#define EDITLINE_H_
#include <stdio.h>
/* Handy macros when binding keys. */
#define CTL(x) ((x) & 0x1F)
@ -29,6 +31,10 @@
#define ISMETA(x) ((x) & 0x80)
#define UNMETA(x) ((x) & 0x7F)
#ifdef __cplusplus
extern "C" {
#endif
/* Command status codes. */
typedef enum {
CSdone = 0, /* OK */
@ -40,13 +46,18 @@ typedef enum {
} el_status_t;
/* Editline specific types, despite rl_ prefix. From Heimdal project. */
typedef char* rl_complete_func_t(char*, int*);
typedef int rl_list_possib_func_t(char*, char***);
typedef el_status_t el_keymap_func_t(void);
typedef int rl_hook_func_t(void);
typedef int rl_getc_func_t(void);
typedef void rl_voidfunc_t(void);
typedef void rl_vintfunc_t(int);
typedef void rl_vcpfunc_t(char *);
/* FSF Readline compat tupes */
typedef char *rl_complete_func_t (char *, int*);
typedef char *rl_compentry_func_t (const char *, int);
typedef char **rl_completion_func_t (const char *, int, int);
/* Display 8-bit chars "as-is" or as `M-x'? Toggle with M-m. (Default:0 - "as-is") */
extern int rl_meta_chars;
@ -60,14 +71,20 @@ extern el_status_t el_del_char(void);
extern el_status_t el_bind_key(int key, el_keymap_func_t function);
extern el_status_t el_bind_key_in_metamap(int key, el_keymap_func_t function);
extern const char *el_next_hist(void);
extern const char *el_prev_hist(void);
extern char *rl_complete(char *token, int *match);
extern int rl_list_possib(char *token, char ***av);
extern char **rl_completion_matches(const char *token, rl_compentry_func_t *generator);
extern char *rl_filename_completion_function(const char *text, int state);
/* For compatibility with FSF readline. */
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! */
@ -76,28 +93,43 @@ extern int el_no_echo; /* E.g under emacs, don't echo except prompt */
extern int el_no_hist; /* Disable auto-save of and access to history -- e.g. for password prompts or wizards */
extern int el_hist_size; /* size of history scrollback buffer, default: 15 */
extern void rl_initialize(void);
extern void rl_reset_terminal(const char *terminal_name);
extern void rl_initialize (void);
extern void rl_reset_terminal (const char *terminal_name);
extern void rl_uninitialize (void);
void rl_save_prompt(void);
void rl_restore_prompt(void);
void rl_set_prompt(const char *prompt);
extern void rl_save_prompt (void);
extern void rl_restore_prompt (void);
extern void rl_set_prompt (const char *prompt);
void rl_clear_message(void);
void rl_forced_update_display(void);
extern void rl_clear_message (void);
extern void rl_forced_update_display(void);
extern char *readline(const char *prompt);
extern void add_history(const char *line);
extern void rl_prep_terminal (int meta_flag);
extern void rl_deprep_terminal (void);
extern int read_history(const char *filename);
extern int write_history(const char *filename);
extern int rl_getc(void);
extern int rl_insert_text (const char *text);
extern int rl_refresh_line (int ignore1, int ignore2);
rl_complete_func_t *rl_set_complete_func(rl_complete_func_t *func);
rl_list_possib_func_t *rl_set_list_possib_func(rl_list_possib_func_t *func);
extern char *readline (const char *prompt);
void rl_prep_terminal(int meta_flag);
void rl_deprep_terminal(void);
extern void add_history (const char *line);
extern int read_history (const char *filename);
extern int write_history (const char *filename);
int rl_getc(void);
extern rl_getc_func_t *rl_set_getc_func(rl_getc_func_t *func);
#endif /* __EDITLINE_H__ */
extern rl_completion_func_t *rl_attempted_completion_function;
extern rl_complete_func_t *rl_set_complete_func (rl_complete_func_t *func);
extern rl_list_possib_func_t *rl_set_list_possib_func (rl_list_possib_func_t *func);
/* Alternate interface to plain readline(), for event loops */
extern void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler);
extern void rl_callback_read_char (void);
extern void rl_callback_handler_remove (void);
#ifdef __cplusplus
}
#endif
#endif /* EDITLINE_H_ */

12
libeditline.pc.in Normal file
View File

@ -0,0 +1,12 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: @PACKAGE@
Description: A small line editing library without termcap/curses
Version: @VERSION@
Requires:
Libs: -L${libdir} -leditline
Cflags: -I${includedir}

1
m4/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.m4

View File

@ -1,200 +1,287 @@
.TH EDITLINE 3
.SH NAME
editline \- command-line editing library with history
.SH SYNOPSIS
.nf
.B "char *readline(char *prompt);"
.fi
.SH DESCRIPTION
.I Editline
is a library that provides an line-editing interface with history.
It is intended to be functionally equivalent with the
.I readline
library provided by the Free Software Foundation, but much smaller.
The bulk of this manual page describes the user interface.
.PP
.Dd February 23, 2020
.Dt EDITLINE 3
.Os
.Sh NAME
.Nm editline
.Nd command-line editing library with history
.Sh LIBRARY
.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
.Sh DESCRIPTION
.Nm
is a library that provides n line-editing interface with history. It
is intended to be functionally equivalent with the
.Nm readline
library provided by the Free Software Foundation, but much smaller. The
bulk of this manual page describes the basic user interface. More APIs,
both native and for
.Nm readline
compatibility ,
are also available. See the
.Cm editline.h
header file for details.
.Pp
The
.I readline()
.Fn readline
function displays the given
.I prompt
on stdout, waits for user input on stdin and then
returns a line of text with the trailing newline removed. The data is returned in a
buffer allocated with
.IR malloc (3),
.Fa prompt
on stdout, waits for user input on stdin and then returns a line of text
with the trailing newline removed. The data is returned in a buffer
allocated with
.Xr malloc 3 ,
so the space should be released with
.IR free (3)
.Xr free 3
when the calling program is done with it.
.PP
Each line returned is copied to the internal history list, unless it happens
to be equal to the previous line. This is configurable if you are building editline
from source.
.SS User Interface
A program that uses this library provides a simple emacs-like editing interface to
its users. A line may be edited before it is sent to the calling program by typing
either control characters or escape sequences. A control character, shown as a caret
followed by a letter, is typed by holding down the ``control'' key while the letter
is typed. For example, ``^A'' is a control-A. An escape sequence is entered by
typing the ``escape'' key followed by one or more characters. The escape key is
abbreviated as ``ESC''. Note that unlike control keys, case matters in escape
sequences; ``ESC\ F'' is not the same as ``ESC\ f''.
.PP
An editing command may be typed anywhere on the line, not just at the beginning. In
addition, a return may also be typed anywhere on the line, not just at the end.
.PP
.Pp
Each line returned is automatically saved in the internal history list,
unless it happens to be equal to the previous line. This is
configurable if you are building editline from source, i.e. if you would
rather like to call
.Fn add_history
manually.
.Pp
The
.Fn read_history
and
.Fn write_history
functions can be used to load and store the history of your application.
.Em Note:
these APIs do not do any tilde or environment variable expansion of the
given filename.
.Ss User Interface
A program that uses this library provides a simple emacs-like editing
interface to its users. A line may be edited before it is sent to the
calling program by typing either control characters or escape sequences.
A control character, shown as a caret followed by a letter, is typed by
holding down the control key while the letter is typed. For example,
.Cm ^A
is a control-A. An escape sequence is entered by typing the escape key
followed by one or more characters. The escape key is abbreviated as
.Cm ESC .
Note that unlike control keys, case matters in escape sequences;
.Cm ESC F
is not the same as
.Cm ESC f .
.Pp
An editing command may be typed anywhere on the line, not just at the
beginning. In addition, a return may also be typed anywhere on the
line, not just at the end.
.Pp
Most editing commands may be given a repeat count,
.IR n ,
.Ar n ,
where
.I n
is a number.
To enter a repeat count, type the escape key, the number, and then
the command to execute.
For example, ``ESC\ 4\ ^f'' moves forward four characters.
If a command may be given a repeat count then the text ``[n]'' is given at the
end of its description.
.PP
.Ar n
is a number. To enter a repeat count, type the escape key, the number,
and then the command to execute. For example,
.Cm ESC 4 ^f
moves forward four characters. If a command may be given a repeat count
then the text
.Cm [n]
is given at the end of its description.
.Pp
The following control characters are accepted:
.RS
.nf
.ta \w'ESC DEL 'u
^A Move to the beginning of the line
^B Move left (backwards) [n]
^D Delete character [n]
^E Move to end of line
^F Move right (forwards) [n]
^G Ring the bell
^H Delete character before cursor (backspace key) [n]
^I Complete filename (tab key); see below
^J Done with line (return key)
^K Kill to end of line (or column [n])
^L Redisplay line
^M Done with line (alternate return key)
^N Get next line from history [n]
^P Get previous line from history [n]
^R Search backward (forward if [n]) through history for
\& text; must start line if text begins with an uparrow
^T Transpose characters
^V Insert next character, even if it is an edit command
^W Wipe to the mark
^X^X Exchange current location and mark
^Y Yank back last killed text
^[ Start an escape sequence (escape key)
^]c Move forward to next character ``c''
^? Delete character before cursor (delete key) [n]
.fi
.RE
.PP
The following escape sequences are provided.
.RS
.nf
.ta \w'ESC DEL 'u
ESC\ ^H Delete previous word (backspace key) [n]
ESC\ DEL Delete previous word (delete key) [n]
ESC\ SP Set the mark (space key); see ^X^X and ^Y above
ESC\ \. Get the last (or [n]'th) word from previous line
ESC\ ? Show possible completions; see below
ESC\ < Move to start of history
ESC\ > Move to end of history
ESC\ b Move backward a word [n]
ESC\ d Delete word under cursor [n]
ESC\ f Move forward a word [n]
ESC\ l Make word lowercase [n]
ESC\ m Toggle if 8bit chars display normally or with an
\& ``M\-'' prefix
ESC\ u Make word uppercase [n]
ESC\ y Yank back last killed text
ESC\ v Show library version
ESC\ w Make area up to mark yankable
ESC\ nn Set repeat count to the number nn
ESC\ C Read from environment variable ``_C_'', where C is
\& an uppercase letter
.fi
.RE
.PP
.Pp
.Bl -tag -width "ESC DEL " -compact
.It ^A
Move to the beginning of the line
.It ^B
Move left (backwards) [n]
.It ^D
Delete character [n]
.It ^E
Move to end of line
.It ^F
Move right (forwards) [n]
.It ^G
Ring the bell
.It ^H
Delete character before cursor (backspace key) [n]
.It ^I
Complete filename (tab key); see below
.It ^J
Done with line (return key)
.It ^K
Kill to end of line (or column [n])
.It ^L
Redisplay line
.It ^M
Done with line (alternate return key)
.It ^N
Get next line from history [n]
.It ^P
Get previous line from history [n]
.It ^R
Search backward (forward if [n]) through history for text; prefixing the
string with a caret (^) forces it to match only at the beginning of a
history line
.It ^T
Transpose characters
.It ^V
Insert next character, even if it is an edit command
.It ^W
Wipe to the mark
.It ^X^X
Exchange current location and mark
.It ^Y
Yank back last killed text
.It ^[
Start an escape sequence (escape key)
.It ^]c
Move forward to next character
.Cm c
.It ^?
Delete character before cursor (delete key) [n]
.El
.Pp
The following escape sequences are provided:
.Pp
.Bl -tag -width "ESC DEL " -compact
.It ESC ^H
Delete previous word (backspace key) [n]
.It ESC DEL
Delete previous word (delete key) [n]
.It ESC SP
Set the mark (space key); see ^X^X and ^Y above
.It ESC\ .
Get the last (or [n]'th) word from previous line
.It ESC\ ?
Show possible completions; see below
.It ESC <
Move to start of history
.It ESC >
Move to end of history
.It ESC b
Move backward a word [n]
.It ESC d
Delete word under cursor [n]
.It ESC f
Move forward a word [n]
.It ESC l
Make word lowercase [n]
.It ESC m
Toggle if 8bit chars display normally or with an
.Ar M-
prefix
.It ESC u
Make word uppercase [n]
.It ESC y
Yank back last killed text
.It ESC v
Show library version
.It ESC w
Make area up to mark yankable
.It ESC nn
Set repeat count to the number nn
.It ESC C
Read from environment variable
.Ar $C ,
where
.Ar C
is an uppercase letter
.El
.Pp
The
.I editline
library has a small macro facility.
If you type the escape key followed by an uppercase letter,
.IR C ,
.Nm
library has a small macro facility. If you type the escape key followed
by an uppercase letter,
.Ar C ,
then the contents of the environment variable
.I _C_
are read in as if you had typed them at the keyboard.
For example, if the variable
.I _L_
.Ar $C
are read in as if you had typed them at the keyboard. For example, if
the variable
.Ar $L
contains the following:
.PP
.RS
^A^Kecho '^V^[[H^V^[[2J'^M
.RE
.PP
Then typing ``ESC L'' will move to the beginning of the line, kill the
entire line, enter the echo command needed to clear the terminal (if your
terminal is like a VT-100), and send the line back to the shell.
.PP
.Pp
.Dl ^A^Kecho '^V^[[H^V^[[2J'^M
.Pp
Then typing
.Cm ESC L
will move to the beginning of the line, kill the entire line, enter the
echo command needed to clear the terminal (if your terminal is like a
VT-100), and send the line back to the shell.
.Pp
The
.I editline
library also does filename completion.
Suppose the root directory has the following files in it:
.PP
.RS
.nf
.ta \w'core 'u
bin vmunix
core vmunix.old
.fi
.RE
.PP
If you type ``rm\ /v'' and then the tab key.
.I Editline
will then finish off as much of the name as possible by adding ``munix''.
Because the name is not unique, it will then beep.
If you type the escape key and a question mark, it will display the
two choices.
If you then type a period and a tab, the library will finish off the filename
.Nm
library also does filename completion. Suppose the root directory has
the following files in it:
.Pp
.Dl bin vmunix
.Dl core vmunix.old
.Pp
If you type
.Cm rm /v
and then the tab key,
.Nm
will then finish off as much of the name as possible by adding
.Ar munix .
Because the name is not unique, it will then beep. If you type the
escape key and a question mark, it will display the two choices. If you
then type a period and a tab, the library will finish off the filename
for you:
.PP
.RS
.nf
.RI "rm /v[TAB]" munix ".[TAB]" old
.fi
.RE
.PP
The tab key is shown by ``[TAB]'' and the automatically-entered text
is shown in italics.
.SH USAGE
.Pp
.Bd -ragged -offset indent
rm /v[TAB]
.Em munix
\&.[TAB]
.Em old
.Ed
.Pp
The tab key is shown by [TAB] and the automatically-entered text
is shown in italics, or underline.
.Sh USAGE
To include
.I readline()
in your program, simply call it as you do any other function. Just make sure to link
your program with libeditline.
.SS Example
.Nm
in your program, call it as you do any other function and link your
program with
.Ar -leditline .
.Ss Example
The following brief example lets you enter a line and edit it, then displays it.
.nf
.B ""
.B #include <stdlib.h>
.B ""
.B extern char *readline(char *prompt);
.B ""
.B int main (void)
.B {
.RS
.B char *p;
.B ""
.B while ((p = readline("CLI>"))) {
.RS
.B puts(p);
.B free(p);
.RE
.B }
.B ""
.B return 0;
.RE
.B }
.fi
.SH BUGS AND LIMITATIONS
Does not handle multiple lines or unicode characters well. See the TODO
file in the distribution if you want to help out.
.SH AUTHORS
The original editline library was created by Simmule R. Turner and Rich
$alz. It now exists in several forks: Heimdal, Festival speech tools,
Mozilla, Google Gadgets for Linux, and many other places. The original
manual page was made by David W. Sanderson. Currently maintained by
Joachim Nilsson at http://github.com/troglobit/editline
.Pp
.Bd -literal -offset indent
#include <stdio.h>
#include <stdlib.h>
#include <editline.h>
int main(void)
{
char *p;
while ((p = readline("CLI> "))) {
puts(p);
free(p);
}
return 0;
}
.El
.Sh AUTHORS
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.
.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" .
.Sh BUGS
Does not handle multiple lines or unicode characters well.

2
src/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
libeditline.a
libeditline.la

View File

@ -1,3 +1,6 @@
AUTOMAKE_OPTIONS = foreign
lib_LTLIBRARIES = libeditline.la
libeditline_la_SOURCES = editline.c editline.h complete.c sysunix.c unix.h
libeditline_la_CFLAGS = -std=gnu99
libeditline_la_CFLAGS += -W -Wall -Wextra -Wundef -Wunused -Wstrict-prototypes
libeditline_la_CFLAGS += -Werror-implicit-function-declaration -Wshadow -Wcast-qual
libeditline_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:2:0

View File

@ -1,6 +1,7 @@
/* History and file completion functions for editline library.
*
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz. All rights reserved.
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz
* All rights reserved.
*
* This software is not subject to any license of the American Telephone
* and Telegraph Company or of the Regents of the University of California.
@ -19,10 +20,15 @@
* 4. This notice may not be removed or altered.
*/
#include <ctype.h>
#include "editline.h"
#define MAX_TOTAL_MATCHES (256 << sizeof(char *))
int rl_attempted_completion_over = 0;
rl_completion_func_t *rl_attempted_completion_function = NULL;
rl_compentry_func_t *rl_completion_entry_function = NULL;
/* Wrap strcmp() for qsort() -- weird construct to pass -Wcast-qual */
static int compare(const void *p1, const void *p2)
{
@ -34,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(char *dir, char *file, char ***avp)
static int FindMatches(const char *dir, const char *file, char ***avp)
{
char **av;
char **word;
@ -74,6 +80,7 @@ static int FindMatches(char *dir, char *file, char ***avp)
total = 0;
break;
}
if (ac) {
memcpy(word, av, ac * sizeof(char *));
free(av);
@ -94,15 +101,22 @@ static int FindMatches(char *dir, char *file, char ***avp)
closedir(dp);
if (total > MAX_TOTAL_MATCHES) {
char many[sizeof(total) * 3];
p = many + sizeof(many);
*--p = '\0';
while (choices > 0) {
*--p = '0' + choices % 10;
choices /= 10;
*--p = '0' + choices % 10;
choices /= 10;
}
while (p > many + sizeof(many) - 8) *--p = ' ';
if ((p = strdup(p)) != NULL) av[ac++] = p;
if ((p = strdup("choices")) != NULL) av[ac++] = p;
while (p > many + sizeof(many) - 8)
*--p = ' ';
if ((p = strdup(p)) != NULL)
av[ac++] = p;
if ((p = strdup("choices")) != NULL)
av[ac++] = p;
} else {
if (ac)
qsort(av, ac, sizeof(char *), compare);
@ -112,15 +126,16 @@ static int FindMatches(char *dir, char *file, char ***avp)
}
/* Split a pathname into allocated directory and trailing filename parts. */
static int SplitPath(char *path, char **dirpart, char **filepart)
static int SplitPath(const char *path, char **dirpart, char **filepart)
{
static char DOT[] = ".";
static const char DOT[] = ".";
char *dpart;
char *fpart;
if ((fpart = strrchr(path, '/')) == NULL) {
if ((dpart = strdup(DOT)) == NULL)
return -1;
if ((fpart = strdup(path)) == NULL) {
free(dpart);
return -1;
@ -128,6 +143,7 @@ static int SplitPath(char *path, char **dirpart, char **filepart)
} else {
if ((dpart = strdup(path)) == NULL)
return -1;
dpart[fpart - path + 1] = '\0';
if ((fpart = strdup(fpart + 1)) == NULL) {
free(dpart);
@ -147,6 +163,7 @@ rl_complete_func_t *rl_set_complete_func(rl_complete_func_t *func)
{
rl_complete_func_t *old = el_complete_func;
el_complete_func = func;
return old;
}
@ -165,7 +182,7 @@ char *el_filename_complete(char *pathname, int *match)
size_t j;
size_t len;
if (SplitPath(pathname, &dir, &file) < 0)
if (SplitPath((const char *)pathname, &dir, &file) < 0)
return NULL;
if ((ac = FindMatches(dir, file, &av)) == 0) {
@ -180,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 + 2;
p = malloc(sizeof(char) * (j + 1));
j = strlen(av[0]) - len + 1;
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);
}
@ -196,11 +213,13 @@ char *el_filename_complete(char *pathname, int *match)
*match = 0;
if (len) {
/* Find largest matching substring. */
for (i = len, end = strlen(av[0]); i < end; i++)
for (j = 1; j < ac; j++)
for (i = len, end = strlen(av[0]); i < end; i++) {
for (j = 1; j < ac; j++) {
if (av[0][i] != av[j][i])
goto breakout;
breakout:
}
}
breakout:
if (i > len) {
j = i - len + 1;
p = malloc(sizeof(char) * j);
@ -222,16 +241,180 @@ char *el_filename_complete(char *pathname, int *match)
return p;
}
char *rl_filename_completion_function(const char *text, int state)
{
static char **av, *dir, *file;
static size_t i, ac;
if (!state) {
if (SplitPath(text, &dir, &file) < 0)
return NULL;
ac = FindMatches(dir, file, &av);
if (!ac) {
free(dir);
free(file);
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;
}
}
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;
int pos;
for (pos = rl_point; pos < rl_end; pos++) {
if (isspace((unsigned char) rl_line_buffer[pos])) {
if (pos > 0)
pos--;
break;
}
}
ptr = &rl_line_buffer[pos];
while (pos >= 0 && !isspace((unsigned char) rl_line_buffer[pos])) {
if (pos == 0)
break;
pos--;
}
if (ptr != &rl_line_buffer[pos]) {
*len = (size_t)(ptr - &rl_line_buffer[pos]);
return &rl_line_buffer[pos];
}
return NULL;
}
/*
* "uses an application-supplied generator function to generate the list
* of possible matches, and then returns the array of these matches. The
* caller should place the address of its generator function in
* rl_completion_entry_function"
*/
char **rl_completion_matches(const char *token, rl_compentry_func_t *generator)
{
int state = 0, num = 0;
char **array, *entry;
if (!generator) {
generator = rl_completion_entry_function;
if (!generator)
generator = rl_filename_completion_function;
}
if (!generator)
return NULL;
array = malloc(512 * sizeof(char *));
if (!array)
return NULL;
while (num < 511 && (entry = generator(token, state))) {
state = 1;
array[num++] = entry;
}
array[num] = NULL;
if (!num) {
free(array);
return NULL;
}
return array;
}
static char *complete(char *token, int *match)
{
size_t len = 0;
char *word, **words = NULL;
int start, end;
word = rl_find_token(&len);
if (!word)
goto fallback;
start = word - rl_line_buffer;
end = start + len;
word = strndup(word, len);
if (!word)
goto fallback;
rl_attempted_completion_over = 0;
words = rl_attempted_completion_function(word, start, end);
if (!rl_attempted_completion_over && !words)
words = rl_completion_matches(word, NULL);
if (words) {
int i = 0;
free(word);
word = NULL;
/* Exactly one match -- finish it off. */
if (words[0] && !words[1]) {
*match = 1;
word = strdup(words[0] + len);
}
while (words[i])
free(words[i++]);
free(words);
if (word)
return word;
}
if (word)
free(word);
fallback:
return el_filename_complete(token, match);
}
/*
* First check for editline specific custom completion function, then
* for any GNU Readline compat, then fallback to filename completion.
*/
char *rl_complete(char *token, int *match)
{
if (el_complete_func)
return el_complete_func(token, match);
#ifdef CONFIG_DEFAULT_COMPLETE
if (rl_attempted_completion_function)
return complete(token, match);
return el_filename_complete(token, match);
#else
return NULL;
#endif
}
static rl_list_possib_func_t *el_list_possib_func = NULL;
@ -267,19 +450,13 @@ int rl_list_possib(char *token, char ***av)
if (el_list_possib_func)
return el_list_possib_func(token, av);
#ifdef CONFIG_DEFAULT_COMPLETE
return el_filename_list_possib(token, av);
#else
return 0;
#endif
}
/**
* Local Variables:
* version-control: t
* indent-tabs-mode: t
* c-file-style: "ellemtel"
* c-file-style: "k&r"
* c-basic-offset: 4
* End:
*/

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
/* Internal header file for editline library.
*
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz. All rights reserved.
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz
* All rights reserved.
*
* This software is not subject to any license of the American Telephone
* and Telegraph Company or of the Regents of the University of California.
@ -19,8 +20,8 @@
* 4. This notice may not be removed or altered.
*/
#ifndef __PRIVATE_EDITLINE_H__
#define __PRIVATE_EDITLINE_H__
#ifndef EDITLINE_PRIVATE_H_
#define EDITLINE_PRIVATE_H_
#include <config.h>
#include <stdio.h>
@ -56,8 +57,10 @@
#define MEM_INC 64
#define SCREEN_INC 256
/* http://stackoverflow.com/questions/1598773/is-there-a-standard-function-in-c-that-would-return-the-length-of-an-array/1598827#1598827 */
#define ARRAY_ELEMENTS(arr) ((sizeof(arr)/sizeof(0[arr])) / ((size_t)(!(sizeof(arr) % sizeof(0[arr])))))
/* From The Practice of Programming, by Kernighan and Pike */
#ifndef NELEMS
#define NELEMS(array) (sizeof(array) / sizeof(array[0]))
#endif
/*
** Variables and routines internal to this package.
@ -95,4 +98,4 @@ extern char *strdup(const char *s);
#endif
#include "../include/editline.h"
#endif /* __PRIVATE_EDITLINE_H__ */
#endif /* EDITLINE_PRIVATE_H_ */

View File

@ -1,6 +1,7 @@
/* Editline system header file for OS-9 (on 68k).
*
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz. All rights reserved.
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz
* All rights reserved.
*
* This software is not subject to any license of the American Telephone
* and Telegraph Company or of the Regents of the University of California.

View File

@ -1,6 +1,7 @@
/* OS-9 (on 68k) system-dependant routines for editline library.
*
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz. All rights reserved.
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz
* All rights reserved.
*
* This software is not subject to any license of the American Telephone
* and Telegraph Company or of the Regents of the University of California.
@ -57,9 +58,7 @@ void rl_add_slash(char *path, char *p)
/**
* Local Variables:
* version-control: t
* indent-tabs-mode: t
* c-file-style: "ellemtel"
* c-file-style: "k&r"
* c-basic-offset: 4
* End:
*/

View File

@ -1,6 +1,7 @@
/* Unix system-dependant routines for editline library.
*
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz. All rights reserved.
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz
* All rights reserved.
*
* This software is not subject to any license of the American Telephone
* and Telegraph Company or of the Regents of the University of California.
@ -87,6 +88,7 @@ void rl_ttyset(int Reset)
if (!Reset) {
if (-1 == getattr(0, &old))
perror("Failed tcgetattr()");
rl_erase = old.c_cc[VERASE];
rl_kill = old.c_cc[VKILL];
rl_eof = old.c_cc[VEOF];
@ -124,6 +126,7 @@ void rl_ttyset(int Reset)
if (!Reset) {
if (-1 == ioctl_wrap(0, TCGETA, &old))
perror("Failed ioctl(TCGETA)");
rl_erase = old.c_cc[VERASE];
rl_kill = old.c_cc[VKILL];
rl_eof = old.c_cc[VEOF];
@ -167,19 +170,22 @@ void rl_ttyset(int Reset)
if (!Reset) {
if (-1 == ioctl_wrap(0, TIOCGETP, &old_sgttyb))
perror("Failed TIOCGETP");
rl_erase = old_sgttyb.sg_erase;
rl_kill = old_sgttyb.sg_kill;
if (-1 == ioctl_wrap(0, TIOCGETC, &old_tchars))
perror("Failed TIOCGETC");
rl_eof = old_tchars.t_eofc;
rl_eof = old_tchars.t_eofc;
rl_intr = old_tchars.t_intrc;
rl_quit = old_tchars.t_quitc;
#ifdef CONFIG_SIGSTOP
if (-1 == ioctl_wrap(0, TIOCGLTC, &old_ltchars))
perror("Failed TIOCGLTC");
rl_susp = old_ltchars.t_suspc;
rl_susp = old_ltchars.t_suspc;
#endif
new_sgttyb = old_sgttyb;
@ -189,9 +195,11 @@ void rl_ttyset(int Reset)
new_sgttyb.sg_flags &= ~PASS8;
else
new_sgttyb.sg_flags |= PASS8;
if (-1 == ioctl_wrap(0, TIOCSETP, &new_sgttyb))
if (-1 == ioctl_wrap(0, TIOCSETP, &new_sgttyb))
perror("Failed TIOCSETP");
new_tchars = old_tchars;
new_tchars = old_tchars;
new_tchars.t_intrc = -1;
new_tchars.t_quitc = -1;
if (-1 == ioctl_wrap(0, TIOCSETC, &new_tchars))
@ -199,7 +207,8 @@ void rl_ttyset(int Reset)
} else {
if (-1 == ioctl_wrap(0, TIOCSETP, &old_sgttyb))
perror("Failed TIOCSETP");
if (-1 == ioctl_wrap(0, TIOCSETC, &old_tchars))
if (-1 == ioctl_wrap(0, TIOCSETC, &old_tchars))
perror("Failed TIOCSETC");
}
}
@ -209,14 +218,18 @@ void rl_ttyset(int Reset)
#ifndef HAVE_STRDUP
/* Return an allocated copy of a string. */
char *strdup(const char *p)
char *strdup(const char *s)
{
char *new = malloc(sizeof(char) * strlen(p));
size_t len;
char *ptr;
if (new) {
strcpy(new, p);
return new;
}
if (!s)
return NULL;
len = strlen(s) + 1;
ptr = malloc(len);
if (ptr)
return memcpy(ptr, s, len);
return NULL;
}
@ -232,9 +245,7 @@ void rl_add_slash(char *path, char *p)
/**
* Local Variables:
* version-control: t
* indent-tabs-mode: t
* c-file-style: "ellemtel"
* c-file-style: "k&r"
* c-basic-offset: 4
* End:
*/

View File

@ -1,6 +1,7 @@
/* Editline system header file for Unix.
*
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz. All rights reserved.
* Copyright (c) 1992, 1993 Simmule Turner and Rich Salz
* All rights reserved.
*
* This software is not subject to any license of the American Telephone
* and Telegraph Company or of the Regents of the University of California.
@ -19,8 +20,8 @@
* 4. This notice may not be removed or altered.
*/
#ifndef __EDITLINE_UNIX_H__
#define __EDITLINE_UNIX_H__
#ifndef EDITLINE_UNIX_H_
#define EDITLINE_UNIX_H_
#define CRLF "\r\n"
#define FORWARD STATIC
@ -32,4 +33,4 @@
#include <dirent.h>
typedef struct dirent DIRENTRY;
#endif /* __EDITLINE_UNIX_H__ */
#endif /* EDITLINE_UNIX_H_ */