summaryrefslogtreecommitdiff
path: root/edit-gnu.c
diff options
context:
space:
mode:
authortjg <tjg>2003-09-25 09:17:46 +0000
committerToby Goodwin <toby@paccrat.org>2015-05-16 21:23:23 +0100
commitd000dc89db8f65db051a3d870bbc8f4d4edefd8d (patch)
tree490c7e418bd7cd99096be207a393eeaaa35cfd44 /edit-gnu.c
parent70a21186f92ee19a995080744ce9a320345c05cb (diff)
Initial revision
Diffstat (limited to 'edit-gnu.c')
-rw-r--r--edit-gnu.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/edit-gnu.c b/edit-gnu.c
new file mode 100644
index 0000000..4b5d2b6
--- /dev/null
+++ b/edit-gnu.c
@@ -0,0 +1,38 @@
+#include "rc.h"
+
+#include <stdio.h>
+#include <readline/readline.h>
+
+#include "jbwrap.h"
+
+struct Jbwrap rl_buf;
+volatile sig_atomic_t rl_active;
+
+void edit_init(void *ignored) {
+ rl_catch_signals = 0;
+}
+
+char *edit_getline(void *ignored, char *prompt) {
+ char *r = NULL;
+ int s;
+
+ if ((s = sigsetjmp(rl_buf.j, 1)) == 0) {
+ rl_active = TRUE;
+ r = readline(prompt);
+ } else {
+ rl_free_line_state();
+ rl_cleanup_after_signal();
+ rl_active = FALSE;
+ rc_raise(eError);
+ }
+
+ if (r) {
+ r = erealloc(r, strlen(r) + 2); /* 1 for \n + 1 for \0 */
+ strcat(r, "\n");
+ }
+ return r;
+}
+
+void edit_free(void *ignored, void *buffer) {
+ efree(buffer);
+}