From 27b9eb00def167339ae68fae6d49515fedcf9be1 Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Mon, 19 May 2014 20:32:28 +1000 Subject: [PATCH] linenoise: Allow a completion callback user parameter Signed-off-by: Steve Bennett --- example.c | 4 ++-- linenoise.c | 6 ++++-- linenoise.h | 6 +++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/example.c b/example.c index b436ed3..f6ce462 100644 --- a/example.c +++ b/example.c @@ -4,7 +4,7 @@ #include "linenoise.h" #ifndef NO_COMPLETION -void completion(const char *buf, linenoiseCompletions *lc) { +void completion(const char *buf, linenoiseCompletions *lc, void *userdata) { if (buf[0] == 'h') { linenoiseAddCompletion(lc,"hello"); linenoiseAddCompletion(lc,"hello there"); @@ -35,7 +35,7 @@ int main(int argc, char *argv[]) { #ifndef NO_COMPLETION /* Set the completion callback. This will be called every time the * user uses the key. */ - linenoiseSetCompletionCallback(completion); + linenoiseSetCompletionCallback(completion, NULL); #endif /* Load history from file. The history file is just a plain text file diff --git a/linenoise.c b/linenoise.c index e6f01bc..de4f58d 100644 --- a/linenoise.c +++ b/linenoise.c @@ -1063,6 +1063,7 @@ static int insert_chars(struct current *current, int pos, const char *chars) #ifndef NO_COMPLETION static linenoiseCompletionCallback *completionCallback = NULL; +static void *completionUserdata = NULL; static void beep() { #ifdef USE_TERMIOS @@ -1082,7 +1083,7 @@ static int completeLine(struct current *current) { linenoiseCompletions lc = { 0, NULL }; int c = 0; - completionCallback(current->buf,&lc); + completionCallback(current->buf,&lc,completionUserdata); if (lc.len == 0) { beep(); } else { @@ -1135,9 +1136,10 @@ static int completeLine(struct current *current) { /* Register a callback function to be called for tab-completion. Returns the prior callback so that the caller may (if needed) restore it when done. */ -linenoiseCompletionCallback * linenoiseSetCompletionCallback(linenoiseCompletionCallback *fn) { +linenoiseCompletionCallback * linenoiseSetCompletionCallback(linenoiseCompletionCallback *fn, void *userdata) { linenoiseCompletionCallback * old = completionCallback; completionCallback = fn; + completionUserdata = userdata; return old; } diff --git a/linenoise.h b/linenoise.h index ed5d81f..ba1b041 100644 --- a/linenoise.h +++ b/linenoise.h @@ -46,19 +46,19 @@ typedef struct linenoiseCompletions { /* * The callback type for tab completion handlers. */ -typedef void(linenoiseCompletionCallback)(const char *, linenoiseCompletions *); +typedef void(linenoiseCompletionCallback)(const char *prefix, linenoiseCompletions *comp, void *userdata); /* * Sets the current tab completion handler and returns the previous one, or NULL * if no prior one has been set. */ -linenoiseCompletionCallback * linenoiseSetCompletionCallback(linenoiseCompletionCallback *); +linenoiseCompletionCallback * linenoiseSetCompletionCallback(linenoiseCompletionCallback *comp, void *userdata); /* * Adds a copy of the given string to the given completion list. The copy is owned * by the linenoiseCompletions object. */ -void linenoiseAddCompletion(linenoiseCompletions *, const char *); +void linenoiseAddCompletion(linenoiseCompletions *comp, const char *str); #endif /* -- 2.44.0