{
char_u *helper;
void *ptr;
+ size_t len;
helper = walker;
ptr = vim_realloc(search_ctx->ffsc_stopdirs_v,
// ignore, keep what we have and continue
break;
walker = vim_strchr(walker, ';');
- if (walker)
+ len = walker ? (size_t)(walker - helper) : STRLEN(helper);
+ // "" means ascent till top of directory tree.
+ if (*helper != NUL && !vim_isAbsName(helper)
+ && len + 1 < MAXPATHL)
{
+ // Make the stop dir an absolute path name.
+ vim_strncpy(ff_expand_buffer, helper, len);
search_ctx->ffsc_stopdirs_v[dircount-1] =
- vim_strnsave(helper, walker - helper);
- walker++;
+ FullName_save(ff_expand_buffer, FALSE);
}
else
- // this might be "", which means ascent till top
- // of directory tree.
search_ctx->ffsc_stopdirs_v[dircount-1] =
- vim_strsave(helper);
-
+ vim_strnsave(helper, len);
+ if (walker)
+ walker++;
dircount++;
} while (walker != NULL);
" Test upwards search with stop-directory.
cd Xdir2
+ let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/Xdir3/', -1)
+ call assert_equal(1, len(l))
+ call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
+ let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/Xdir3', -1)
+ call assert_equal(1, len(l))
+ call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
+ let l = findfile('bar', ';../', -1)
+ call assert_equal(1, len(l))
+ call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
+
let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2/', -1)
call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
let l = findfile('bar', ';' . save_dir . '/Xfinddir1/Xdir2', -1)
call assert_equal(1, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
+ let l = findfile('bar', ';../../', -1)
+ call assert_equal(1, len(l))
+ call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
let l = findfile('bar', ';' . save_dir . '/Xfinddir1/', -1)
call assert_equal(2, len(l))
call assert_equal(2, len(l))
call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
call assert_match('.*/Xfinddir1/bar', l[1])
+ let l = findfile('bar', ';../../../', -1)
+ call assert_equal(2, len(l))
+ call assert_match('.*/Xfinddir1/Xdir2/Xdir3/bar', l[0])
+ call assert_match('.*/Xfinddir1/bar', l[1])
" Test combined downwards and upwards search from Xdir2/.
cd ../..