Remove unused FindLibrary function.
[oota-llvm.git] / lib / Support / Path.cpp
1 //===-- Path.cpp - Implement OS Path Concept --------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This header file implements the operating system Path concept.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/Support/Path.h"
15 #include "llvm/Config/config.h"
16 #include "llvm/Support/Endian.h"
17 #include "llvm/Support/FileSystem.h"
18 #include <cassert>
19 #include <cstring>
20 #include <ostream>
21 using namespace llvm;
22 using namespace sys;
23 namespace {
24 using support::ulittle32_t;
25 }
26
27 //===----------------------------------------------------------------------===//
28 //=== WARNING: Implementation here must contain only TRULY operating system
29 //===          independent code.
30 //===----------------------------------------------------------------------===//
31
32 bool Path::operator==(const Path &that) const {
33   return path == that.path;
34 }
35
36 bool Path::operator<(const Path& that) const {
37   return path < that.path;
38 }
39
40 bool
41 Path::isArchive() const {
42   fs::file_magic type;
43   if (fs::identify_magic(str(), type))
44     return false;
45   return type == fs::file_magic::archive;
46 }
47
48 bool
49 Path::isDynamicLibrary() const {
50   fs::file_magic type;
51   if (fs::identify_magic(str(), type))
52     return false;
53   switch (type) {
54     default: return false;
55     case fs::file_magic::macho_fixed_virtual_memory_shared_lib:
56     case fs::file_magic::macho_dynamically_linked_shared_lib:
57     case fs::file_magic::macho_dynamically_linked_shared_lib_stub:
58     case fs::file_magic::elf_shared_object:
59     case fs::file_magic::pecoff_executable:  return true;
60   }
61 }
62
63 bool
64 Path::isObjectFile() const {
65   fs::file_magic type;
66   if (fs::identify_magic(str(), type) || type == fs::file_magic::unknown)
67     return false;
68   return true;
69 }
70
71 StringRef Path::GetDLLSuffix() {
72   return &(LTDL_SHLIB_EXT[1]);
73 }
74
75 void
76 Path::appendSuffix(StringRef suffix) {
77   if (!suffix.empty()) {
78     path.append(".");
79     path.append(suffix);
80   }
81 }
82
83 bool
84 Path::isBitcodeFile() const {
85   fs::file_magic type;
86   if (fs::identify_magic(str(), type))
87     return false;
88   return type == fs::file_magic::bitcode;
89 }
90
91 bool Path::hasMagicNumber(StringRef Magic) const {
92   std::string actualMagic;
93   if (getMagicNumber(actualMagic, static_cast<unsigned>(Magic.size())))
94     return Magic == actualMagic;
95   return false;
96 }
97
98 static void getPathList(const char*path, std::vector<Path>& Paths) {
99   const char* at = path;
100   const char* delim = strchr(at, PathSeparator);
101   Path tmpPath;
102   while (delim != 0) {
103     std::string tmp(at, size_t(delim-at));
104     if (tmpPath.set(tmp))
105       if (tmpPath.canRead())
106         Paths.push_back(tmpPath);
107     at = delim + 1;
108     delim = strchr(at, PathSeparator);
109   }
110
111   if (*at != 0)
112     if (tmpPath.set(std::string(at)))
113       if (tmpPath.canRead())
114         Paths.push_back(tmpPath);
115 }
116
117 static StringRef getDirnameCharSep(StringRef path, const char *Sep) {
118   assert(Sep[0] != '\0' && Sep[1] == '\0' &&
119          "Sep must be a 1-character string literal.");
120   if (path.empty())
121     return ".";
122
123   // If the path is all slashes, return a single slash.
124   // Otherwise, remove all trailing slashes.
125
126   signed pos = static_cast<signed>(path.size()) - 1;
127
128   while (pos >= 0 && path[pos] == Sep[0])
129     --pos;
130
131   if (pos < 0)
132     return path[0] == Sep[0] ? Sep : ".";
133
134   // Any slashes left?
135   signed i = 0;
136
137   while (i < pos && path[i] != Sep[0])
138     ++i;
139
140   if (i == pos) // No slashes?  Return "."
141     return ".";
142
143   // There is at least one slash left.  Remove all trailing non-slashes.
144   while (pos >= 0 && path[pos] != Sep[0])
145     --pos;
146
147   // Remove any trailing slashes.
148   while (pos >= 0 && path[pos] == Sep[0])
149     --pos;
150
151   if (pos < 0)
152     return path[0] == Sep[0] ? Sep : ".";
153
154   return path.substr(0, pos+1);
155 }
156
157 // Include the truly platform-specific parts of this class.
158 #if defined(LLVM_ON_UNIX)
159 #include "Unix/Path.inc"
160 #endif
161 #if defined(LLVM_ON_WIN32)
162 #include "Windows/Path.inc"
163 #endif