llvm/lib/System/Path.cpp
Reid Spencer dd04df0ec3 For PR495:
Get rid of the difference between file paths and directory paths. The Path
class now simply stores a path that can refer to either a file or a
directory. This required various changes in the implementation and interface
of the class with the corresponding impact to its users. Doxygen comments were
also updated to reflect these changes. Interface changes are:

appendDirectory -> appendComponent
appendFile -> appendComponent
elideDirectory -> eraseComponent
elideFile -> eraseComponent
elideSuffix -> eraseSuffix
renameFile -> rename
setDirectory -> set
setFile -> set

Changes pass Dejagnu and llvm-test/SingleSource tests.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22349 91177308-0d34-0410-b5e6-96231b3b80d8
2005-07-07 23:21:43 +00:00

110 lines
2.6 KiB
C++

//===-- Path.cpp - Implement OS Path Concept --------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by Reid Spencer and is distributed under the
// University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This header file implements the operating system Path concept.
//
//===----------------------------------------------------------------------===//
#include "llvm/System/Path.h"
#include "llvm/Config/config.h"
#include <cassert>
namespace llvm {
using namespace sys;
//===----------------------------------------------------------------------===//
//=== WARNING: Implementation here must contain only TRULY operating system
//=== independent code.
//===----------------------------------------------------------------------===//
Path
Path::GetLLVMConfigDir() {
Path result;
#ifdef LLVM_ETCDIR
if (result.set(LLVM_ETCDIR))
return result;
#endif
return GetLLVMDefaultConfigDir();
}
LLVMFileType
sys::IdentifyFileType(const char*magic, unsigned length) {
assert(magic && "Invalid magic number string");
assert(length >=4 && "Invalid magic number length");
switch (magic[0]) {
case 'l':
if (magic[1] == 'l' && magic[2] == 'v') {
if (magic[3] == 'c')
return CompressedBytecodeFileType;
else if (magic[3] == 'm')
return BytecodeFileType;
}
break;
case '!':
if (length >= 8) {
if (memcmp(magic,"!<arch>\n",8) == 0)
return ArchiveFileType;
}
break;
default:
break;
}
return UnknownFileType;
}
bool
Path::isArchive() const {
if (canRead())
return hasMagicNumber("!<arch>\012");
return false;
}
bool
Path::isDynamicLibrary() const {
if (canRead())
return hasMagicNumber("\177ELF");
return false;
}
Path
Path::FindLibrary(std::string& name) {
std::vector<sys::Path> LibPaths;
GetSystemLibraryPaths(LibPaths);
for (unsigned i = 0; i < LibPaths.size(); ++i) {
sys::Path FullPath(LibPaths[i]);
FullPath.appendComponent("lib" + name + LTDL_SHLIB_EXT);
if (FullPath.isDynamicLibrary())
return FullPath;
FullPath.eraseSuffix();
FullPath.appendSuffix("a");
if (FullPath.isArchive())
return FullPath;
}
return sys::Path();
}
std::string
Path::GetDLLSuffix() {
return LTDL_SHLIB_EXT;
}
}
// Include the truly platform-specific parts of this class.
#if defined(LLVM_ON_UNIX)
#include "Unix/Path.inc"
#endif
#if defined(LLVM_ON_WIN32)
#include "Win32/Path.inc"
#endif