aboutsummaryrefslogtreecommitdiffstats
path: root/lib/System/Unix/Path.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2004-09-11 04:55:08 +0000
committerReid Spencer <rspencer@reidspencer.com>2004-09-11 04:55:08 +0000
commit1b554b4583044050109f8b70929d6777ec073188 (patch)
treeea71b0e6b06ef9abf42ea650adb2afed0f880fc9 /lib/System/Unix/Path.cpp
parent4429b2c7fc3dd32e608c58b1d3fe931e39f3ec34 (diff)
downloadexternal_llvm-1b554b4583044050109f8b70929d6777ec073188.zip
external_llvm-1b554b4583044050109f8b70929d6777ec073188.tar.gz
external_llvm-1b554b4583044050109f8b70929d6777ec073188.tar.bz2
Implemented support for detecting file types by magic number, stripping
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
Diffstat (limited to 'lib/System/Unix/Path.cpp')
-rw-r--r--lib/System/Unix/Path.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/System/Unix/Path.cpp b/lib/System/Unix/Path.cpp
index 49b2bf4..23b938b 100644
--- a/lib/System/Unix/Path.cpp
+++ b/lib/System/Unix/Path.cpp
@@ -20,6 +20,7 @@
#include "Unix.h"
#include <sys/stat.h>
#include <fcntl.h>
+#include <fstream>
namespace llvm {
using namespace sys;
@@ -78,6 +79,53 @@ Path::GetUserHomeDirectory() {
}
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 );
}