Support/Windows/PathV2: Make directory iteration ignore . and ..
authorMichael J. Spencer <bigcheesegs@gmail.com>
Wed, 5 Jan 2011 16:39:30 +0000 (16:39 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Wed, 5 Jan 2011 16:39:30 +0000 (16:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122883 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/Windows/PathV2.inc

index f3d625797dd9d4e560e0608bd87e0ea0a8a55f61..c618dbf520084f853bb6fa5fe1190744ad441a4c 100644 (file)
@@ -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),