From: Michael J. Spencer Date: Wed, 5 Jan 2011 16:39:30 +0000 (+0000) Subject: Support/Windows/PathV2: Make directory iteration ignore . and .. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=277fa1047bbf66dc998e20cd2c8a666ce414f6ab;p=oota-llvm.git 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 --- diff --git a/lib/Support/Windows/PathV2.inc b/lib/Support/Windows/PathV2.inc index f3d625797dd..c618dbf5200 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),