From 4942f22b2617f73c655d9f83f25a847c1a137684 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 Dec 2009 17:43:40 +0000 Subject: [PATCH] auto remove spaces from tab completion git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15986 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- libs/esl/fs_cli.c | 46 ++++++++++++++++++++++++++++++++++++++++++-- src/switch_console.c | 35 ++++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/libs/esl/fs_cli.c b/libs/esl/fs_cli.c index 41ac4f4c99..ea1b7e396a 100644 --- a/libs/esl/fs_cli.c +++ b/libs/esl/fs_cli.c @@ -429,17 +429,57 @@ static void set_fn_keys(cli_profile_t *profile) #ifdef HAVE_EDITLINE +#define end_of_p(_s) (*_s == '\0' ? _s : _s + strlen(_s) - 1) static unsigned char complete(EditLine * el, int ch) { const LineInfo *lf = el_line(el); char cmd_str[2048] = ""; unsigned char ret = CC_REDISPLAY; + char *dup = strdup(lf->buffer); + char *buf = dup; + int pos = 0, sc = 0; + char *p; + + if (!esl_strlen_zero(lf->cursor) && !esl_strlen_zero(lf->buffer)) { + pos = (lf->cursor - lf->buffer); + } + if (pos > 0) { + *(buf + pos) = '\0'; + } + + if ((p = strchr(buf, '\r')) || (p = strchr(buf, '\n'))) { + *p = '\0'; + } + + while (*buf == ' ') { + buf++; + sc++; + } + + if (!*buf && sc) { + el_deletestr(el, sc); + } + + sc = 0; + + p = end_of_p(buf); + while(p >= buf && *p == ' ') { + sc++; + p--; + } + + if (sc > 1) { + el_deletestr(el, sc - 1); + *(p + 2) = '\0'; + } + + if (*lf->cursor) { - snprintf(cmd_str, sizeof(cmd_str), "api console_complete c=%ld;%s\n\n", (long int)(lf->cursor - lf->buffer), lf->buffer); + snprintf(cmd_str, sizeof(cmd_str), "api console_complete c=%ld;%s\n\n", (long)pos, buf); } else { - snprintf(cmd_str, sizeof(cmd_str), "api console_complete %s\n\n", lf->buffer); + snprintf(cmd_str, sizeof(cmd_str), "api console_complete %s\n\n", buf); } esl_send_recv(global_handle, cmd_str); @@ -474,6 +514,8 @@ static unsigned char complete(EditLine * el, int ch) fflush(stdout); } + esl_safe_free(dup); + return ret; } #endif diff --git a/src/switch_console.c b/src/switch_console.c index 5c306fd944..af24b44a6c 100644 --- a/src/switch_console.c +++ b/src/switch_console.c @@ -540,7 +540,8 @@ SWITCH_DECLARE(unsigned char) switch_console_complete(const char *line, const ch struct helper h = { 0 }; unsigned char ret = CC_REDISPLAY; int pos = 0; - + int sc = 0; + #ifndef SWITCH_HAVE_LIBEDIT if (!stream) { return CC_ERROR; @@ -566,17 +567,43 @@ SWITCH_DECLARE(unsigned char) switch_console_complete(const char *line, const ch } while (*buf == ' ') { + sc++; buf++; } + if (!*buf) { +#ifdef SWITCH_HAVE_LIBEDIT + if (h.out && sc) { + el_deletestr(el, sc); + } +#endif + } + + sc = 0; + p = end_of_p(buf); + while(p >= buf && *p == ' ') { + sc++; + p--; + } + + if (sc > 1) { +#ifdef SWITCH_HAVE_LIBEDIT + if (h.out) { + el_deletestr(el, sc - 1); + } +#endif + *(p + 2) = '\0'; + } + for (p = buf; p && *p; p++) { if (*p == ' ') { lp = p; h.words++; while(*p == ' ') p++; + if (!*p) break; } } - + if (lp) { buf = lp + 1; } @@ -591,6 +618,8 @@ SWITCH_DECLARE(unsigned char) switch_console_complete(const char *line, const ch h.stream->write_function(h.stream, "\n\n"); } + + if (h.words == 0) { sql = switch_mprintf("select distinct name from interfaces where type='api' and name like '%q%%' and hostname='%q' order by name", buf, switch_core_get_variable("hostname")); @@ -670,7 +699,7 @@ SWITCH_DECLARE(unsigned char) switch_console_complete(const char *line, const ch if (h.out) { fprintf(h.out, "\n\n"); } - + if (h.stream) { h.stream->write_function(h.stream, "\n\n"); if (h.hits == 1 && !zstr(h.last)) {