Implement get_magic with generic tools and inline it.
[oota-llvm.git] / lib / Support / Windows / Path.inc
index a8191568719dbf567726b687e0d8cfce0381733f..6a5792e70c13b060213e873bbbaef1f1c415b3c4 100644 (file)
@@ -17,6 +17,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/WindowsError.h"
 #include <fcntl.h>
 #include <io.h>
 #include <sys/stat.h>
@@ -45,7 +46,7 @@ using llvm::sys::windows::UTF8ToUTF16;
 using llvm::sys::windows::UTF16ToUTF8;
 
 static error_code windows_error(DWORD E) {
-  return error_code(E, system_category());
+  return mapWindowsError(E);
 }
 
 static error_code TempDir(SmallVectorImpl<char> &Result) {
@@ -193,7 +194,7 @@ error_code remove(const Twine &path, bool IgnoreNonExisting) {
 
   file_status ST;
   if (error_code EC = status(path, ST)) {
-    if (EC != errc::no_such_file_or_directory || !IgnoreNonExisting)
+    if (EC != std::errc::no_such_file_or_directory || !IgnoreNonExisting)
       return EC;
     return error_code();
   }
@@ -205,14 +206,14 @@ error_code remove(const Twine &path, bool IgnoreNonExisting) {
   if (ST.type() == file_type::directory_file) {
     if (!::RemoveDirectoryW(c_str(path_utf16))) {
       error_code EC = windows_error(::GetLastError());
-      if (EC != errc::no_such_file_or_directory || !IgnoreNonExisting)
+      if (EC != std::errc::no_such_file_or_directory || !IgnoreNonExisting)
         return EC;
     }
     return error_code();
   }
   if (!::DeleteFileW(c_str(path_utf16))) {
     error_code EC = windows_error(::GetLastError());
-    if (EC != errc::no_such_file_or_directory || !IgnoreNonExisting)
+    if (EC != std::errc::no_such_file_or_directory || !IgnoreNonExisting)
       return EC;
   }
   return error_code();
@@ -465,48 +466,6 @@ error_code setLastModificationAndAccessTime(int FD, TimeValue Time) {
   return error_code();
 }
 
-error_code get_magic(const Twine &path, uint32_t len,
-                     SmallVectorImpl<char> &result) {
-  SmallString<128> path_storage;
-  SmallVector<wchar_t, 128> path_utf16;
-  result.set_size(0);
-
-  // Convert path to UTF-16.
-  if (error_code ec = UTF8ToUTF16(path.toStringRef(path_storage),
-                                  path_utf16))
-    return ec;
-
-  // Open file.
-  HANDLE file = ::CreateFileW(c_str(path_utf16),
-                              GENERIC_READ,
-                              FILE_SHARE_READ,
-                              NULL,
-                              OPEN_EXISTING,
-                              FILE_ATTRIBUTE_READONLY,
-                              NULL);
-  if (file == INVALID_HANDLE_VALUE)
-    return windows_error(::GetLastError());
-
-  // Allocate buffer.
-  result.reserve(len);
-
-  // Get magic!
-  DWORD bytes_read = 0;
-  BOOL read_success = ::ReadFile(file, result.data(), len, &bytes_read, NULL);
-  error_code ec = windows_error(::GetLastError());
-  ::CloseHandle(file);
-  if (!read_success || (bytes_read != len)) {
-    // Set result size to the number of bytes read if it's valid.
-    if (bytes_read <= len)
-      result.set_size(bytes_read);
-    // ERROR_HANDLE_EOF is mapped to errc::value_too_large.
-    return ec;
-  }
-
-  result.set_size(len);
-  return error_code();
-}
-
 error_code mapped_file_region::init(int FD, bool CloseFD, uint64_t Offset) {
   FileDescriptor = FD;
   // Make sure that the requested size fits within SIZE_T.
@@ -516,7 +475,7 @@ error_code mapped_file_region::init(int FD, bool CloseFD, uint64_t Offset) {
         _close(FileDescriptor);
     } else
       ::CloseHandle(FileHandle);
-    return make_error_code(errc::invalid_argument);
+    return make_error_code(std::errc::invalid_argument);
   }
 
   DWORD flprotect;
@@ -652,7 +611,7 @@ mapped_file_region::mapped_file_region(int fd,
     if (closefd)
       _close(FileDescriptor);
     FileDescriptor = 0;
-    ec = make_error_code(errc::bad_file_descriptor);
+    ec = make_error_code(std::errc::bad_file_descriptor);
     return;
   }
 
@@ -815,7 +774,7 @@ error_code openFileForRead(const Twine &Name, int &ResultFD) {
     if (LastError != ERROR_ACCESS_DENIED)
       return EC;
     if (is_directory(Name))
-      return make_error_code(errc::is_a_directory);
+      return make_error_code(std::errc::is_a_directory);
     return EC;
   }
 
@@ -867,7 +826,7 @@ error_code openFileForWrite(const Twine &Name, int &ResultFD,
     if (LastError != ERROR_ACCESS_DENIED)
       return EC;
     if (is_directory(Name))
-      return make_error_code(errc::is_a_directory);
+      return make_error_code(std::errc::is_a_directory);
     return EC;
   }