summaryrefslogtreecommitdiffstats
path: root/liblinenoise/linenoise.c
diff options
context:
space:
mode:
authorJack Palevich <jackpal@google.com>2010-06-04 14:32:01 +0800
committerJack Palevich <jackpal@google.com>2010-06-04 14:32:01 +0800
commit192a28831520dee50410a17953d87280d0fd8996 (patch)
treea59aea57fc534e809a9fadcefdeb185865a60c72 /liblinenoise/linenoise.c
parentad5431d2ca9c4dd454dfb3bc8e9de3ee0ad28a27 (diff)
downloadcore-192a28831520dee50410a17953d87280d0fd8996.tar.gz
core-192a28831520dee50410a17953d87280d0fd8996.tar.bz2
core-192a28831520dee50410a17953d87280d0fd8996.zip
Improve linenoise.c compatability.
+ Don't flush characters when switching into and out of raw mode. This avoids eating characters that follow '\n'. (Such characters can occur when pasting multiple line input, or when scripts are driving input.) + Try to be slightly cleverer about calculating the length of the prompt, so that prompts with embedded '\n' characters are handled OK. This is an area that really needs to be replaced with a query of the cursor position from the terminal. + As a hack, just assume the screen is very wide if we don't know how wide it is. This allows dexpropt to work correctly. (It was getting confused by the editing commands emitted when the end-of-line was reached.) Change-Id: I988dd0f0bceb22b298e915be0dde085c9358ef66
Diffstat (limited to 'liblinenoise/linenoise.c')
-rw-r--r--liblinenoise/linenoise.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/liblinenoise/linenoise.c b/liblinenoise/linenoise.c
index ab57ae650..4f6775ccf 100644
--- a/liblinenoise/linenoise.c
+++ b/liblinenoise/linenoise.c
@@ -138,8 +138,8 @@ static int enableRawMode(int fd) {
* We want read to return every single byte, without timeout. */
raw.c_cc[VMIN] = 1; raw.c_cc[VTIME] = 0; /* 1 byte, no timer */
- /* put terminal in raw mode after flushing */
- if (tcsetattr(fd,TCSAFLUSH,&raw) < 0) goto fatal;
+ /* put terminal in raw mode */
+ if (tcsetattr(fd,TCSADRAIN,&raw) < 0) goto fatal;
rawmode = 1;
return 0;
@@ -150,7 +150,7 @@ fatal:
static void disableRawMode(int fd) {
/* Don't even check the return value as it's too late. */
- if (rawmode && tcsetattr(fd,TCSAFLUSH,&orig_termios) != -1)
+ if (rawmode && tcsetattr(fd,TCSADRAIN,&orig_termios) != -1)
rawmode = 0;
}
@@ -163,16 +163,30 @@ static void linenoiseAtExit(void) {
static int getColumns(void) {
struct winsize ws;
- if (ioctl(1, TIOCGWINSZ, &ws) == -1) return 80;
+ if (ioctl(1, TIOCGWINSZ, &ws) == -1) return 4096;
if (ws.ws_col == 0) {
- return 80;
+ return 4096;
}
return ws.ws_col;
}
+static int effectiveLen(const char* prompt) {
+ int col = 0;
+ char c;
+ // TODO: Handle escape sequences.
+ while ( (c = *prompt++) != 0 ) {
+ if (c == '\n') {
+ col = 0;
+ } else {
+ col++;
+ }
+ }
+ return col;
+}
+
static void refreshLine(int fd, const char *prompt, char *buf, size_t len, size_t pos, size_t cols) {
char seq[64];
- size_t plen = strlen(prompt);
+ size_t plen = effectiveLen(prompt);
while((plen+pos) >= cols) {
buf++;