cmdedit: fix my bug, improve code a bit
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 19 Dec 2006 19:30:37 +0000 (19:30 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 19 Dec 2006 19:30:37 +0000 (19:30 -0000)
shell/cmdedit.c

index 187aa545bd01e1d62d6af9142424469443ae74e0..944be00ab19c86c6cfee5691fdfa70c98654e3f3 100644 (file)
@@ -989,18 +989,19 @@ static void showfiles(void)
                for(nc = 1; nc < ncols && n+nrows < nfiles; n += nrows, nc++) {
                        str_add_chr[0] = add_char_to_match[n];
                        acol = str_add_chr[0] ? column_width - 1 : column_width;
-                       printf("%s%s", matches[n], str_add_chr);
-                       l = strlen(matches[n]);
-                       while (l < acol) {
-                               putchar(' ');
-                               l++;
-                       }
+                       printf("%s%s%-*s", matches[n], str_add_chr,
+                                       acol - strlen(matches[n]), "");
                }
                str_add_chr[0] = add_char_to_match[n];
                printf("%s%s\n", matches[n], str_add_chr);
        }
 }
 
+static int match_compare(const void *a, const void *b)
+{
+       return strcmp(*(char**)a, *(char**)b);
+}
+
 static void input_tab(int *lastWasTab)
 {
        /* Do TAB completion */
@@ -1016,7 +1017,6 @@ static void input_tab(int *lastWasTab)
                return;
        }
        if (! *lastWasTab) {
-
                char *tmp, *tmp1;
                int len_found;
                char matchBuf[BUFSIZ];
@@ -1046,38 +1046,27 @@ static void input_tab(int *lastWasTab)
                /* Try to match any executable in our path and everything
                 * in the current working directory that matches.  */
                        exe_n_cwd_tab_completion(matchBuf, find_type);
-               /* Remove duplicate found and sort */
+               /* Sort, then remove any duplicates found */
                if (matches) {
-                       int i, n;
-                       /* strcmp is int(*f)(const char*, const char*) */
-                       /* qsort wants int(*f)(const void*, const void*) */
-                       /* We cheat here :) */
-                       qsort(matches, num_matches, sizeof(char*), (void*)strcmp);
-                       i = 0;
-                       while (i < num_matches - 1) {
-                               n = i + 1;
-                               if (matches[i] && matches[n]) {
-                                       while (n < num_matches
-                                        && !strcmp(matches[i], matches[n])) {
-                                               free(matches[n]);
-                                               matches[n] = 0;
-                                               n++;
+                       int i, n = 0;
+                       qsort(matches, num_matches, sizeof(char*), match_compare);
+                       for (i = 0; i < num_matches - 1; ++i) {
+                               if (matches[i] && matches[i+1]) {
+                                       if (strcmp(matches[i], matches[i+1]) == 0) {
+                                               free(matches[i]);
+                                               matches[i] = 0;
+                                       } else {
+                                               add_char_to_match[n] = add_char_to_match[i];
+                                               matches[n++] = matches[i];
                                        }
                                }
-                               i = n;
                        }
-                       n = 0;
-                       for(i = 0; i < num_matches; i++)
-                               if (matches[i]) {
-                                       matches[n] = matches[i];
-                                       add_char_to_match[n] = add_char_to_match[i];
-                                       n++;
-                               }
+                       add_char_to_match[n] = add_char_to_match[num_matches-1];
+                       matches[n++] = matches[num_matches-1];
                        num_matches = n;
                }
                /* Did we find exactly one match? */
                if (!matches || num_matches > 1) {
-
                        beep();
                        if (!matches)
                                return;         /* not found */