Whitespace.
[oota-llvm.git] / lib / Support / Windows / Path.inc
index 99363431676e050b935807bee432443c74ee9c02..95caaa58d7a1e8389c051c61e8f4923505fe4cd2 100644 (file)
 typedef int errno_t;
 #endif
 
+#ifdef _MSC_VER
+# pragma comment(lib, "advapi32.lib")  // This provides CryptAcquireContextW.
+#endif
+
 using namespace llvm;
 
 namespace {
@@ -269,6 +273,14 @@ std::string getMainExecutable(const char *argv0, void *MainExecAddr) {
   return ret != MAX_PATH ? pathname : "";
 }
 
+UniqueID file_status::getUniqueID() const {
+  // The file is uniquely identified by the volume serial number along
+  // with the 64-bit file identifier.
+  uint64_t FileID = (static_cast<uint64_t>(FileIndexHigh) << 32ULL) |
+                    static_cast<uint64_t>(FileIndexLow);
+
+  return UniqueID(VolumeSerialNumber, FileID);
+}
 
 TimeValue file_status::getLastModificationTime() const {
   ULARGE_INTEGER UI;
@@ -298,30 +310,7 @@ retry_cur_dir:
   }
 
   cur_path.set_size(len);
-  // cur_path now holds the current directory in utf-16. Convert to utf-8.
-
-  // Find out how much space we need. Sadly, this function doesn't return the
-  // size needed unless you tell it the result size is 0, which means you
-  // _always_ have to call it twice.
-  len = ::WideCharToMultiByte(CP_UTF8, 0,
-                              cur_path.data(), cur_path.size(),
-                              result.data(), 0,
-                              NULL, NULL);
-
-  if (len == 0)
-    return make_error_code(windows_error(::GetLastError()));
-
-  result.reserve(len);
-  result.set_size(len);
-  // Now do the actual conversion.
-  len = ::WideCharToMultiByte(CP_UTF8, 0,
-                              cur_path.data(), cur_path.size(),
-                              result.data(), result.size(),
-                              NULL, NULL);
-  if (len == 0)
-    return windows_error(::GetLastError());
-
-  return error_code::success();
+  return UTF16ToUTF8(cur_path.begin(), cur_path.size(), result);
 }
 
 error_code create_directory(const Twine &path, bool &existed) {
@@ -391,8 +380,15 @@ error_code remove(const Twine &path, bool &existed) {
   SmallVector<wchar_t, 128> path_utf16;
 
   file_status st;
-  if (error_code ec = status(path, st))
-    return ec;
+  error_code EC = status(path, st);
+  if (EC) {
+    if (EC == windows_error::file_not_found ||
+        EC == windows_error::path_not_found) {
+      existed = false;
+      return error_code::success();
+    }
+    return EC;
+  }
 
   if (error_code ec = UTF8ToUTF16(path.toStringRef(path_storage),
                                   path_utf16))
@@ -533,25 +529,6 @@ error_code equivalent(const Twine &A, const Twine &B, bool &result) {
   return error_code::success();
 }
 
-error_code getUniqueID(const Twine Path, uint64_t &Result) {
-  file_status Status;
-  if (error_code E = status(Path, Status))
-    return E;
-
-  // The file is uniquely identified by the volume serial number along
-  // with the 64-bit file identifier.
-  Result = (static_cast<uint64_t>(Status.FileIndexHigh) << 32ULL) |
-           static_cast<uint64_t>(Status.FileIndexLow);
-  
-  // Because the serial number is 32-bits, but we've already used up all 64
-  // bits for the file index, XOR the serial number into the high 32 bits of
-  // the resulting value.  We could potentially get collisons from this, but
-  // the likelihood is low.
-  Result ^= (static_cast<uint64_t>(Status.VolumeSerialNumber) << 32ULL);
-
-  return error_code::success();
-}
-
 static bool isReservedName(StringRef path) {
   // This list of reserved names comes from MSDN, at:
   // http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx
@@ -603,12 +580,17 @@ static error_code getStatus(HANDLE FileHandle, file_status &Result) {
   if (!::GetFileInformationByHandle(FileHandle, &Info))
     goto handle_status_error;
 
-  Result = file_status(
-        file_type::regular_file, Info.ftLastWriteTime.dwHighDateTime,
-        Info.ftLastWriteTime.dwLowDateTime, Info.dwVolumeSerialNumber,
-        Info.nFileSizeHigh, Info.nFileSizeLow, Info.nFileIndexHigh,
-        Info.nFileIndexLow);
-  return error_code::success();
+  {
+    file_type Type = (Info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+                         ? file_type::directory_file
+                         : file_type::regular_file;
+    Result =
+        file_status(Type, Info.ftLastWriteTime.dwHighDateTime,
+                    Info.ftLastWriteTime.dwLowDateTime,
+                    Info.dwVolumeSerialNumber, Info.nFileSizeHigh,
+                    Info.nFileSizeLow, Info.nFileIndexHigh, Info.nFileIndexLow);
+    return error_code::success();
+  }
 
 handle_status_error:
   error_code EC = windows_error(::GetLastError());
@@ -617,11 +599,9 @@ handle_status_error:
     Result = file_status(file_type::file_not_found);
   else if (EC == windows_error::sharing_violation)
     Result = file_status(file_type::type_unknown);
-  else {
+  else
     Result = file_status(file_type::status_error);
-    return EC;
-  }
-  return error_code::success();
+  return EC;
 }
 
 error_code status(const Twine &path, file_status &result) {
@@ -655,26 +635,14 @@ error_code status(const Twine &path, file_status &result) {
       return getStatus(INVALID_HANDLE_VALUE, result);
   }
 
-  if (attr & FILE_ATTRIBUTE_DIRECTORY)
-    result = file_status(file_type::directory_file);
-  else {
-    ScopedFileHandle h(
-      ::CreateFileW(path_utf16.begin(),
-                    0, // Attributes only.
+  ScopedFileHandle h(
+      ::CreateFileW(path_utf16.begin(), 0, // Attributes only.
                     FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
-                    NULL,
-                    OPEN_EXISTING,
-                    FILE_FLAG_BACKUP_SEMANTICS,
-                    0));
+                    NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0));
     if (!h)
       return getStatus(INVALID_HANDLE_VALUE, result);
-    BY_HANDLE_FILE_INFORMATION Info;
-    if (!::GetFileInformationByHandle(h, &Info))
-      return getStatus(INVALID_HANDLE_VALUE, result);
 
     return getStatus(h, result);
-  }
-  return error_code::success();
 }
 
 error_code status(int FD, file_status &Result) {
@@ -825,7 +793,7 @@ mapped_file_region::mapped_file_region(const Twine &path,
                                        mapmode mode,
                                        uint64_t length,
                                        uint64_t offset,
-                                       error_code &ec) 
+                                       error_code &ec)
   : Mode(mode)
   , Size(length)
   , Mapping()
@@ -1027,7 +995,7 @@ error_code detail::directory_iterator_increment(detail::DirIterState &it) {
   return error_code::success();
 }
 
-error_code map_file_pages(const Twine &path, off_t file_offset, size_t size,  
+error_code map_file_pages(const Twine &path, off_t file_offset, size_t size,
                                             bool map_writable, void *&result) {
   assert(0 && "NOT IMPLEMENTED");
   return windows_error::invalid_function;
@@ -1087,7 +1055,7 @@ error_code openFileForWrite(const Twine &Name, int &ResultFD,
   DWORD CreationDisposition;
   if (Flags & F_Excl)
     CreationDisposition = CREATE_NEW;
-  else if (Flags & F_Append) 
+  else if (Flags & F_Append)
     CreationDisposition = OPEN_ALWAYS;
   else
     CreationDisposition = CREATE_ALWAYS;