aboutsummaryrefslogtreecommitdiff
path: root/lib/Support/Windows/PathV2.inc
diff options
context:
space:
mode:
authorMichael J. Spencer <bigcheesegs@gmail.com>2011-01-05 16:39:30 +0000
committerMichael J. Spencer <bigcheesegs@gmail.com>2011-01-05 16:39:30 +0000
commit277fa1047bbf66dc998e20cd2c8a666ce414f6ab (patch)
treefdfa5ee2bdd1689d5cb05052a794c929d03869a7 /lib/Support/Windows/PathV2.inc
parentabce07328c246136f6220fde07192dc739319c43 (diff)
Support/Windows/PathV2: Make directory iteration ignore . and ..
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122883 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/Windows/PathV2.inc')
-rw-r--r--lib/Support/Windows/PathV2.inc28
1 files changed, 24 insertions, 4 deletions
diff --git a/lib/Support/Windows/PathV2.inc b/lib/Support/Windows/PathV2.inc
index f3d625797d..c618dbf520 100644
--- a/lib/Support/Windows/PathV2.inc
+++ b/lib/Support/Windows/PathV2.inc
@@ -639,16 +639,30 @@ error_code directory_iterator_construct(directory_iterator &it, StringRef path){
if (!FindHandle)
return windows_error(::GetLastError());
+ size_t FilenameLen = ::wcslen(FirstFind.cFileName);
+ while ((FilenameLen == 1 && FirstFind.cFileName[0] == L'.') ||
+ (FilenameLen == 2 && FirstFind.cFileName[0] == L'.' &&
+ FirstFind.cFileName[1] == L'.'))
+ if (!::FindNextFileW(FindHandle, &FirstFind)) {
+ error_code ec = windows_error(::GetLastError());
+ // Check for end.
+ if (ec == windows_error::no_more_files)
+ return directory_iterator_destruct(it);
+ return ec;
+ } else
+ FilenameLen = ::wcslen(FirstFind.cFileName);
+
// Construct the current directory entry.
- SmallString<128> directory_entry_path_utf8;
+ SmallString<128> directory_entry_name_utf8;
if (error_code ec = UTF16ToUTF8(FirstFind.cFileName,
::wcslen(FirstFind.cFileName),
- directory_entry_path_utf8))
+ directory_entry_name_utf8))
return ec;
it.IterationHandle = intptr_t(FindHandle.take());
- it.CurrentEntry = directory_entry(path);
- it.CurrentEntry.replace_filename(Twine(directory_entry_path_utf8));
+ SmallString<128> directory_entry_path(path);
+ path::append(directory_entry_path, directory_entry_name_utf8.str());
+ it.CurrentEntry = directory_entry(directory_entry_path.str());
return success;
}
@@ -672,6 +686,12 @@ error_code directory_iterator_increment(directory_iterator& it) {
return ec;
}
+ size_t FilenameLen = ::wcslen(FindData.cFileName);
+ if ((FilenameLen == 1 && FindData.cFileName[0] == L'.') ||
+ (FilenameLen == 2 && FindData.cFileName[0] == L'.' &&
+ FindData.cFileName[1] == L'.'))
+ return directory_iterator_increment(it);
+
SmallString<128> directory_entry_path_utf8;
if (error_code ec = UTF16ToUTF8(FindData.cFileName,
::wcslen(FindData.cFileName),