am 0659dd56: am c8c8c050: merge from open-source master
diff --git a/liblinenoise/linenoise.c b/liblinenoise/linenoise.c
index ab57ae6..4f6775c 100644
--- a/liblinenoise/linenoise.c
+++ b/liblinenoise/linenoise.c
@@ -138,8 +138,8 @@
* 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 @@
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 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++;