]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
auto remove spaces from tab completion
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 17 Dec 2009 17:43:40 +0000 (17:43 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 17 Dec 2009 17:43:40 +0000 (17:43 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@15986 d0543943-73ff-0310-b7d9-9358b9ac24b2

libs/esl/fs_cli.c
src/switch_console.c

index 41ac4f4c99d4e71f3a98e72076c333fd07f2bd85..ea1b7e396aec2ee61c4db4e10808b5a9da521c20 100644 (file)
@@ -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
index 5c306fd9442a42a6b31b4179f35fea33d0c1b38a..af24b44a6cfbcab6b0c6d13bca1e7cf1bdd8d9ba 100644 (file)
@@ -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)) {