commit dc80ccac672785085df2fe20cd3a2a2198f6decb
parent d2a398257626faf73fd7a5326b31bbc3f613e3da
Author: Toby Goodwin <toby@paccrat.org>
Date: Fri, 23 Jun 2017 23:10:35 +0100
fix for github #32 readline loses track of term size
Diffstat:
2 files changed, 2 insertions(+), 87 deletions(-)
diff --git a/edit-gnu.c b/edit-gnu.c
@@ -1,87 +0,0 @@
-#include "rc.h"
-
-#include <errno.h>
-#include <stdio.h>
-#include <readline/readline.h>
-#include <readline/history.h>
-#include <readline/rltypedefs.h>
-
-#include "edit.h"
-
-bool editing = 1;
-
-struct cookie {
- char *buffer;
-};
-
-void *edit_begin(int fd) {
- List *hist;
- struct cookie *c;
-
- rl_catch_signals = 0;
- rl_completer_quote_characters = "'";
- rl_filename_quote_characters = "\t\n !#$&'()*;<=>?@[\\]^`{|}~";
-
- hist = varlookup("history");
- if (hist != NULL)
- if (read_history(hist->w) != 0 && errno != ENOENT) /* ignore if missing */
- uerror(hist->w);
-
- c = ealloc(sizeof *c);
- c->buffer = NULL;
- return c;
-}
-
-static void edit_catcher(int sig) {
- write(2, "\n", 1);
- rc_raise(eError);
-}
-
-static char *prompt;
-
-char *edit_alloc(void *cookie, size_t *count) {
- struct cookie *c = cookie;
- void (*oldint)(int), (*oldquit)(int);
-
- oldint = sys_signal(SIGINT, edit_catcher);
- oldquit = sys_signal(SIGQUIT, edit_catcher);
-
- c->buffer = readline(prompt);
-
- sys_signal(SIGINT, oldint);
- sys_signal(SIGQUIT, oldquit);
-
- if (c->buffer) {
- *count = strlen(c->buffer);
- if (*count)
- add_history(c->buffer);
- c->buffer[*count] = '\n';
- ++*count; /* include the \n */
- }
- return c->buffer;
-}
-
-void edit_prompt(void *cookie, char *pr) {
- prompt = pr;
-}
-
-void edit_free(void *cookie) {
- struct cookie *c = cookie;
-
- efree(c->buffer);
- /* Set c->buffer to NULL, allowing us to "overfree" it. This
- is a bit of a kludge, but it's otherwise hard to deal with
- the case where a signal causes an early return from
- readline. */
- c->buffer = NULL;
-}
-
-void edit_end(void *cookie) {
- struct cookie *c = cookie;
-
- efree(c);
-}
-
-void edit_reset(void *cookie) {
- rl_reset_terminal(NULL);
-}
diff --git a/edit-readline.c b/edit-readline.c
@@ -18,6 +18,7 @@ void *edit_begin(int fd) {
List *hist;
struct cookie *c;
+ rl_initialize();
rl_catch_signals = 0;
rl_completer_quote_characters = "'";
rl_filename_quote_characters = "\t\n !#$&'()*;<=>?@[\\]^`{|}~";
@@ -49,6 +50,7 @@ char *edit_alloc(void *cookie, size_t *count) {
oldint = sys_signal(SIGINT, edit_catcher);
oldquit = sys_signal(SIGQUIT, edit_catcher);
+ rl_reset_screen_size();
c->buffer = readline(prompt);
sys_signal(SIGINT, oldint);