diff options
author | Michael J. Spencer <bigcheesegs@gmail.com> | 2011-01-05 16:39:30 +0000 |
---|---|---|
committer | Michael J. Spencer <bigcheesegs@gmail.com> | 2011-01-05 16:39:30 +0000 |
commit | 277fa1047bbf66dc998e20cd2c8a666ce414f6ab (patch) | |
tree | fdfa5ee2bdd1689d5cb05052a794c929d03869a7 /lib/Support/Windows/PathV2.inc | |
parent | abce07328c246136f6220fde07192dc739319c43 (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.inc | 28 |
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), |