Support/PathV2: Implement has_magic in terms of get_magic.
[oota-llvm.git] / lib / Support / PathV2.cpp
index e2565d55f06f6deacd91f96c1f64a60a3916bfa9..2e818a5a89d39ae807ed3b2df8ed0c606ead11d6 100644 (file)
@@ -686,38 +686,20 @@ void directory_entry::replace_filename(const Twine &filename, file_status st,
 }
 
 error_code has_magic(const Twine &path, const Twine &magic, bool &result) {
-  SmallString<128> PathStorage;
   SmallString<32>  MagicStorage;
-  StringRef Path  = path.toNullTerminatedStringRef(PathStorage);
-  StringRef Magic = magic.toNullTerminatedStringRef(MagicStorage);
-
-  assert(Magic.size() > 0 && "magic must be non-empty!");
-
-  SmallString<32> BufferStorage;
-  BufferStorage.reserve(Magic.size());
-
-  // Open file.
-  std::FILE *file = std::fopen(Path.data(), "rb");
-  if (file == 0)
-    return error_code(errno, posix_category());
-  size_t size = ::fread(BufferStorage.data(), 1, Magic.size(), file);
-  if (size != Magic.size()) {
-    int error = errno;
-    bool eof = std::feof(file) != 0;
-    std::fclose(file);
-    if (eof) {
-      // EOF, return false.
+  StringRef Magic = magic.toStringRef(MagicStorage);
+  SmallString<32> Buffer;
+
+  if (error_code ec = get_magic(path, Magic.size(), Buffer)) {
+    if (ec == errc::value_too_large) {
+      // Magic.size() > file_size(Path).
       result = false;
       return success;
     }
-    return error_code(error, posix_category());
+    return ec;
   }
-  std::fclose(file);
 
-  if (std::memcmp(BufferStorage.data(), Magic.data(), Magic.size()) != 0)
-    result = false;
-  else
-    result = true;
+  result = Magic == Buffer;
   return success;
 }