X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSystem%2FPath.cpp;h=9ee0a3e852785261a93bd63b40f86ac2f6e2a90d;hb=48fdf91d0f17b19bb7345156b928689df94d0c6c;hp=93c1e0a7100718b4b73e5e30875e7a964f1b0670;hpb=8e66595512b065b69d595bae665b6ad665eca6d0;p=oota-llvm.git diff --git a/lib/System/Path.cpp b/lib/System/Path.cpp index 93c1e0a7100..9ee0a3e8527 100644 --- a/lib/System/Path.cpp +++ b/lib/System/Path.cpp @@ -1,10 +1,10 @@ //===-- Path.cpp - Implement OS Path Concept --------------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// 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. @@ -12,28 +12,98 @@ //===----------------------------------------------------------------------===// #include "llvm/System/Path.h" +#include "llvm/Config/config.h" +#include namespace llvm { using namespace sys; //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only TRULY operating system -//=== independent code. +//=== 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,"!\n",8) == 0) + return ArchiveFileType; + } + break; + + default: + break; + } + return UnknownFileType; +} + bool -Path::is_file() const { - return (is_valid() && path[path.length()-1] != '/'); +Path::isArchive() const { + if (canRead()) + return hasMagicNumber("!\012"); + return false; } bool -Path::is_directory() const { - return (is_valid() && path[path.length()-1] == '/'); +Path::isDynamicLibrary() const { + if (canRead()) + return hasMagicNumber("\177ELF"); + return false; +} + +Path +Path::FindLibrary(std::string& name) { + std::vector 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. -#include "platform/Path.cpp" -// vim: sw=2 +#if defined(LLVM_ON_UNIX) +#include "Unix/Path.inc" +#endif +#if defined(LLVM_ON_WIN32) +#include "Win32/Path.inc" +#endif +