summaryrefslogtreecommitdiffstats
path: root/linenoise
diff options
context:
space:
mode:
Diffstat (limited to 'linenoise')
-rw-r--r--linenoise/linenoise.c21
-rw-r--r--linenoise/linenoise.h3
2 files changed, 23 insertions, 1 deletions
diff --git a/linenoise/linenoise.c b/linenoise/linenoise.c
index ba56b35d..48d7e0b7 100644
--- a/linenoise/linenoise.c
+++ b/linenoise/linenoise.c
@@ -89,6 +89,8 @@ struct lino_state {
void *cb_ctx; /* User context for completion callback */
lino_atom_cb_t *atom_callback;
void *ca_ctx; /* User context for atom callback */
+ lino_enter_cb_t *enter_callback;
+ void *ce_ctx; /* User context for enter callback */
struct termios orig_termios; /* In order to restore at exit.*/
int rawmode; /* For atexit() function to check if restore is needed*/
int mlmode; /* Multi line mode. Default is single line. */
@@ -191,6 +193,12 @@ void lino_set_atom_cb(lino_t *l, lino_atom_cb_t *cb, void *ctx)
l->ca_ctx = ctx;
}
+void lino_set_enter_cb(lino_t *l, lino_enter_cb_t *cb, void *ctx)
+{
+ l->enter_callback = cb;
+ l->ce_ctx = ctx;
+}
+
static void atexit_handler(void);
/* Raw mode: 1960 magic shit. */
@@ -1996,6 +2004,15 @@ static int edit(lino_t *l, const char *prompt)
}
break;
case ENTER:
+ if (l->mlmode && l->enter_callback &&
+ !l->enter_callback(l->data, l->ce_ctx))
+ {
+ if (edit_insert(l,c)) {
+ l->error = lino_ioerr;
+ goto out;
+ }
+ break;
+ }
if (l->mlmode)
edit_move_end(l);
if (l->need_refresh)
@@ -2050,7 +2067,9 @@ static int edit(lino_t *l, const char *prompt)
switch(c) {
case ENTER:
- if (paste) {
+ if (paste || (l->mlmode && l->enter_callback &&
+ !l->enter_callback(l->data, l->ce_ctx)))
+ {
if (edit_insert(l,c)) {
l->error = lino_ioerr;
goto out;
diff --git a/linenoise/linenoise.h b/linenoise/linenoise.h
index 28b304a4..b07b15ea 100644
--- a/linenoise/linenoise.h
+++ b/linenoise/linenoise.h
@@ -80,3 +80,6 @@ int lino_get_noninteractive(lino_t *);
typedef char *lino_atom_cb_t(lino_t *, const char *line, int n, void *ctx);
void lino_set_atom_cb(lino_t *, lino_atom_cb_t *, void *ctx);
+
+typedef int lino_enter_cb_t(const char *line, void *ctx);
+void lino_set_enter_cb(lino_t *, lino_enter_cb_t *, void *ctx);