lineedit: on tab completion, show filenames obly in all cases (bash compat)
authorDenys Vlasenko <dvlasenk@redhat.com>
Fri, 3 Sep 2010 12:11:08 +0000 (14:11 +0200)
committerDenys Vlasenko <dvlasenk@redhat.com>
Fri, 3 Sep 2010 12:11:08 +0000 (14:11 +0200)
function                                             old     new   delta
complete_cmd_dir_file                                731     730      -1

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
libbb/lineedit.c

index a917c5f..d2b808a 100644 (file)
@@ -751,6 +751,7 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
                        continue; /* don't print an error */
 
                while ((next = readdir(dir)) != NULL) {
+                       unsigned len;
                        const char *name_found = next->d_name;
 
                        /* .../<tab>: bash 3.2.0 shows dotfiles, but not . and .. */
@@ -767,18 +768,15 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
                        if (stat(found, &st) && lstat(found, &st))
                                goto cont; /* hmm, remove in progress? */
 
-                       /* save only name if we scan PATH */
-                       if (paths[i] != dirbuf)
-                               strcpy(found, name_found);
+                       /* Save only name */
+                       len = strlen(name_found);
+                       found = xrealloc(found, len + 2); /* +2: for slash and NUL */
+                       strcpy(found, name_found);
 
                        if (S_ISDIR(st.st_mode)) {
-                               unsigned len1 = strlen(found);
-                               /* name is a directory */
-                               if (found[len1-1] != '/') {
-                                       found = xrealloc(found, len1 + 2);
-                                       found[len1] = '/';
-                                       found[len1 + 1] = '\0';
-                               }
+                               /* name is a directory, add slash */
+                               found[len] = '/';
+                               found[len + 1] = '\0';
                        } else {
                                /* skip files if looking for dirs only (example: cd) */
                                if (type == FIND_DIR_ONLY)
@@ -796,10 +794,8 @@ static NOINLINE unsigned complete_cmd_dir_file(const char *command, int type)
        if (paths != path1) {
                free(paths[0]); /* allocated memory is only in first member */
                free(paths);
-       } else if (dirbuf) {
-               pf_len += strlen(dirbuf);
-               free(dirbuf);
        }
+       free(dirbuf);
 
        return pf_len;
 }