Implemented support for detecting file types by magic number, stripping
authorReid Spencer <rspencer@reidspencer.com>
Sat, 11 Sep 2004 04:55:08 +0000 (04:55 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Sat, 11 Sep 2004 04:55:08 +0000 (04:55 +0000)
path and suffix to leave basename, and getting the DLL suffix.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16289 91177308-0d34-0410-b5e6-96231b3b80d8

lib/System/Unix/Path.cpp
lib/System/Unix/Path.inc

index 49b2bf4afe1c0fab320761314e0fe839cb60bd9b..23b938b9019fceb42d06656d6d78bf004c8c18b4 100644 (file)
@@ -20,6 +20,7 @@
 #include "Unix.h"
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <fstream>
 
 namespace llvm {
 using namespace sys;
@@ -77,6 +78,53 @@ Path::GetUserHomeDirectory() {
   return GetRootDirectory();
 }
 
+bool
+Path::is_file() const {
+  return (is_valid() && path[path.length()-1] != '/');
+}
+
+bool
+Path::is_directory() const {
+  return (is_valid() && path[path.length()-1] == '/');
+}
+
+std::string
+Path::get_basename() const {
+  // Find the last slash
+  size_t slash = path.rfind('/');
+  if (slash == std::string::npos)
+    slash = 0;
+  else
+    slash++;
+
+  return path.substr(slash, path.rfind('.'));
+}
+
+bool Path::has_magic_number(const std::string &Magic) const {
+  size_t len = Magic.size();
+  char buf[ 1 + len];
+  std::ifstream f(path.c_str());
+  f.read(buf, len);
+  buf[len] = '\0';
+  return Magic == buf;
+}
+
+bool 
+Path::is_bytecode_file() const {
+  if (readable()) {
+    return has_magic_number("llvm");
+  }
+  return false;
+}
+
+bool
+Path::is_archive() const {
+  if (readable()) {
+    return has_magic_number("!<arch>\012");
+  }
+  return false;
+}
+
 bool
 Path::exists() const {
   return 0 == access(path.c_str(), F_OK );
index 49b2bf4afe1c0fab320761314e0fe839cb60bd9b..23b938b9019fceb42d06656d6d78bf004c8c18b4 100644 (file)
@@ -20,6 +20,7 @@
 #include "Unix.h"
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <fstream>
 
 namespace llvm {
 using namespace sys;
@@ -77,6 +78,53 @@ Path::GetUserHomeDirectory() {
   return GetRootDirectory();
 }
 
+bool
+Path::is_file() const {
+  return (is_valid() && path[path.length()-1] != '/');
+}
+
+bool
+Path::is_directory() const {
+  return (is_valid() && path[path.length()-1] == '/');
+}
+
+std::string
+Path::get_basename() const {
+  // Find the last slash
+  size_t slash = path.rfind('/');
+  if (slash == std::string::npos)
+    slash = 0;
+  else
+    slash++;
+
+  return path.substr(slash, path.rfind('.'));
+}
+
+bool Path::has_magic_number(const std::string &Magic) const {
+  size_t len = Magic.size();
+  char buf[ 1 + len];
+  std::ifstream f(path.c_str());
+  f.read(buf, len);
+  buf[len] = '\0';
+  return Magic == buf;
+}
+
+bool 
+Path::is_bytecode_file() const {
+  if (readable()) {
+    return has_magic_number("llvm");
+  }
+  return false;
+}
+
+bool
+Path::is_archive() const {
+  if (readable()) {
+    return has_magic_number("!<arch>\012");
+  }
+  return false;
+}
+
 bool
 Path::exists() const {
   return 0 == access(path.c_str(), F_OK );