From: Bram Moolenaar Date: Tue, 20 Jul 2010 16:10:15 +0000 (+0200) Subject: Fix some duplicates in ":find" completion. (Nazri Ramliy) X-Git-Tag: v7.3~211 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cb9d45cb847845a9f8b90da3e55b68b8e461f496;p=vim Fix some duplicates in ":find" completion. (Nazri Ramliy) --- diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index 1dabb75f0..a77f68490 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -32,8 +32,6 @@ be worked on, but only if you sponsor Vim development. See |sponsor|. GTK: torn-off menu doesn't work. -:find completion has duplicates. (Bjorn Winckler, 2010 Jul 18) - Cursor positioning wrong with 0x200e character. (John Becket, 2010 May 6) Test 69 breaks on MS-Windows, both 32 and 64 builds. (George Reilly, 2010 Feb diff --git a/src/misc1.c b/src/misc1.c index cd5ae4b2f..8e2c656e2 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -9236,6 +9236,7 @@ unix_expandpath(gap, path, wildoff, flags, didstar) #if defined(FEAT_SEARCHPATH) static int find_previous_pathsep __ARGS((char_u *path, char_u **psep)); static int is_unique __ARGS((char_u *maybe_unique, garray_T *gap, int i)); +static void remove_duplicates __ARGS((garray_T *gap)); static void uniquefy_paths __ARGS((garray_T *gap, char_u *pattern)); static int expand_in_path __ARGS((garray_T *gap, char_u *pattern, int flags)); @@ -9305,38 +9306,50 @@ is_unique(maybe_unique, gap, i) } /* - * Sorts, removes duplicates and modifies all the fullpath names in gap so that - * they are unique with respect to each other while conserving the part that - * matches the pattern. Beware, this is at least O(n^2) wrt gap->ga_len. + * Remove adjecent duplicate entries from "gap", which is a list of file names + * in allocated memory. */ static void -uniquefy_paths(gap, pattern) +remove_duplicates(gap) garray_T *gap; - char_u *pattern; { int i; int j; - int len; - char_u *pathsep_p; - char_u *path; - char_u **fnames = (char_u **) gap->ga_data; + char_u **fnames = (char_u **)gap->ga_data; + + for (i = 1; i < gap->ga_len; ++i) + if (fnamecmp(fnames[i - 1], fnames[i]) == 0) + { + vim_free(fnames[i]); + for (j = i + 1; j < gap->ga_len; ++j) + fnames[j - 1] = fnames[j]; + --gap->ga_len; + --i; + } +} +/* + * Sorts, removes duplicates and modifies all the fullpath names in gap so that + * they are unique with respect to each other while conserving the part that + * matches the pattern. Beware, this is at least O(n^2) wrt gap->ga_len. + */ + static void +uniquefy_paths(gap, pattern) + garray_T *gap; + char_u *pattern; +{ + int i; + int len; + char_u *pathsep_p; + char_u *path; + char_u **fnames = (char_u **) gap->ga_data; int sort_again = 0; char_u *pat; char_u *file_pattern; regmatch_T regmatch; - /* Remove duplicate entries */ sort_strings(fnames, gap->ga_len); - for (i = 0; i < gap->ga_len - 1; i++) - if (fnamecmp(fnames[i], fnames[i+1]) == 0) - { - vim_free(fnames[i]); - for (j = i+1; j < gap->ga_len; j++) - fnames[j-1] = fnames[j]; - gap->ga_len--; - i--; - } + remove_duplicates(gap); /* * We need to prepend a '*' at the beginning of file_pattern so that the @@ -9379,7 +9392,10 @@ uniquefy_paths(gap, pattern) } if (sort_again) + { sort_strings(fnames, gap->ga_len); + remove_duplicates(gap); + } } /*