Path.cpp revision 5460a1f25d9ddecb5c70667267d66d51af177a99
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- Path.cpp -----------------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/Support/FileSystem.h" 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/Support/Path.h" 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/StringRef.h> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <locale> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <stdio.h> 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <iostream> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld::sys::fs; 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===--------------------------------------------------------------------===// 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Path 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath::Path() 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_PathName() { 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath::Path(const Path::ValueType* s ) 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_PathName(s) { 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath::Path(const Path::StringType &s ) 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_PathName(s) { 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath::Path(const Path& pCopy) 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao : m_PathName(pCopy.m_PathName) { 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath::~Path() 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool Path::isFromRoot() const 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (m_PathName.empty()) 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (separator == m_PathName[0]); 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool Path::isFromPWD() const 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (2 > m_PathName.size()) 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return false; 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return ('.' == m_PathName[0] && separator == m_PathName[1]); 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath& Path::assign(const Path::StringType &s) 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.assign(s); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath& Path::assign(const Path::ValueType* s, unsigned int length) 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (0 == s || 0 == length) 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(0 && "assign a null or empty string to Path"); 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.assign(s, length); 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//a,/b a/,b a/,b/ a,b is a/b 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath& Path::append(const Path& pPath) 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao //first path is a/,second path is /b 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if(m_PathName[m_PathName.length()-1] == separator && 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pPath.native()[0] == separator) { 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int old_size = m_PathName.size()-1; 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int new_size = old_size + pPath.native().size(); 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.resize(new_size); 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao strcpy(const_cast<char*>(m_PathName.data()+old_size), pPath.native().data()); 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao //first path is a,second path is b 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else if(this->string()[this->native().size()-1] != separator && 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pPath.string()[0] != separator) { 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.append("/"); 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.append(pPath.native()); 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // a/,b or a,/b just append 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao else { 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.append(pPath.native()); 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return *this; 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool Path::empty() const 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_PathName.empty(); 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostd::string Path::string() const 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_PathName; 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath::StringType Path::generic_string() const 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::string result = m_PathName; 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao detail::canonicalize(result); 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return result; 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool Path::canonicalize() 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return detail::canonicalize(m_PathName); 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath::StringType::size_type Path::m_append_separator_if_needed() 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!m_PathName.empty() && 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef LLVM_ON_WIN32 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *(m_PathName.end()-1) != colon && 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao !is_separator(*(m_PathName.end()-1))) { 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StringType::size_type tmp(m_PathName.size()); 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName += preferred_separator; 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return tmp; 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return 0; 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid Path::m_erase_redundant_separator(Path::StringType::size_type pSepPos) 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t begin=pSepPos; 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // skip '/' 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao while(separator == m_PathName[pSepPos]) 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ++pSepPos; 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if(begin!=pSepPos) 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_PathName.erase(begin+1,pSepPos-begin-1); 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath Path::stem() const 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t begin_pos = m_PathName.find_last_of(separator)+1; 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t end_pos = m_PathName.find_first_of(".", begin_pos); 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path result_path(m_PathName.substr(begin_pos, end_pos - begin_pos)); 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return result_path; 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoPath Path::extension() const 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_t begin_pos = m_PathName.find_last_of('.'); 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path result_path(m_PathName.substr(begin_pos)); 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return result_path; 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===--------------------------------------------------------------------===// 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// non-member functions 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool mcld::sys::fs::operator==(const Path& pLHS,const Path& pRHS) 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (pLHS.generic_string()==pRHS.generic_string()); 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool mcld::sys::fs::operator!=(const Path& pLHS,const Path& pRHS) 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return !(pLHS==pRHS); 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool mcld::sys::fs::is_separator(char value) 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return (value == separator 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef LLVM_ON_WIN32 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao || value == preferred_separator 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ); 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool mcld::sys::fs::exists(const Path &pPath) 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao FileStatus pFileStatus; 1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao detail::status(pPath, pFileStatus); 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return exists(pFileStatus); 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool mcld::sys::fs::is_directory(const Path &pPath) 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao FileStatus pFileStatus; 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao detail::status(pPath, pFileStatus); 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return is_directory(pFileStatus); 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostd::ostream &mcld::sys::fs::operator<<(std::ostream& pOS, 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const Path& pPath) 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return pOS << pPath.native(); 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostd::istream &mcld::sys::fs::operator>>(std::istream& pOS, 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path& pPath) 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return pOS >> pPath.native(); 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaollvm::raw_ostream &mcld::sys::fs::operator<<(llvm::raw_ostream &pOS, 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const Path &pPath) 2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return pOS << pPath.native(); 2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 212