aboutsummaryrefslogtreecommitdiff
path: root/linenoise.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2018-01-01 13:42:35 +1000
committerSteve Bennett <steveb@workware.net.au>2018-01-01 13:42:52 +1000
commit88c5e1f7e0341d4f16dbe54a8f94293a641a7850 (patch)
tree7aca809b56e283dad2dd4a28a8ec9712c9e82415 /linenoise.c
parentc445502bd5b3dcafb4f01988e61eb2904ae1573b (diff)
downloadjimtcl-88c5e1f7e0341d4f16dbe54a8f94293a641a7850.zip
jimtcl-88c5e1f7e0341d4f16dbe54a8f94293a641a7850.tar.gz
jimtcl-88c5e1f7e0341d4f16dbe54a8f94293a641a7850.tar.bz2
linenoise: Add ^Z (SUSP) support
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'linenoise.c')
-rw-r--r--linenoise.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/linenoise.c b/linenoise.c
index f65d383..f6b9442 100644
--- a/linenoise.c
+++ b/linenoise.c
@@ -127,8 +127,10 @@
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
+#include <assert.h>
#include <errno.h>
#include <string.h>
+#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
@@ -289,6 +291,8 @@ static void fd_printf(int fd, const char *format, ...)
va_start(args, format);
n = vsnprintf(buf, sizeof(buf), format, args);
+ /* This will never happen because we are sure to use fd_printf() for short sequences */
+ assert(n < sizeof(buf));
va_end(args);
IGNORE_RC(write(fd, buf, n));
}
@@ -1230,6 +1234,16 @@ process_char:
case ctrl('C'): /* ctrl-c */
errno = EAGAIN;
return -1;
+ case ctrl('Z'): /* ctrl-z */
+#ifdef SIGTSTP
+ /* send ourselves SIGSUSP */
+ disableRawMode(current);
+ raise(SIGTSTP);
+ /* and resume */
+ enableRawMode(current);
+ refreshLine(current->prompt, current);
+#endif
+ continue;
case 127: /* backspace */
case ctrl('H'):
if (remove_char(current, current->pos - 1) == 1) {